aa
TypeFunPtr.java
Go to the documentation of this file.
1 package com.cliffc.aa.type;
2 
3 import com.cliffc.aa.node.FunNode;
4 import com.cliffc.aa.util.SB;
5 import com.cliffc.aa.util.VBitSet;
6 import static com.cliffc.aa.AA.unimpl;
7 
8 import java.util.function.Predicate;
9 
10 
11 // Function indices or function pointers; a single instance can include all
12 // possible aliased function pointers. Function pointers can be executed, are
13 // not GC'd, and cannot be Loaded or Stored through (although they can be
14 // loaded & stored).
15 //
16 // A TypeFunPtr includes a set of function indices and the display and NOT
17 // e.g. the function arguments nor formals. Formals are stored in the FunNode.
18 //
19 // Each function index (or fidx) is a constant value, a classic code pointer.
20 // Cloning the code immediately also splits the fidx with a new fidx bit for
21 // both the original and the new code.
22 //
23 public final class TypeFunPtr extends Type<TypeFunPtr> {
24  // List of known functions in set, or 'flip' for choice-of-functions.
25  // A single bit is a classic code pointer.
26  public BitsFun _fidxs; // Known function bits
27  public int _nargs; // Number of formals, including the display
28  public Type _disp; // Display; is_display_ptr
29 
30  private TypeFunPtr init(BitsFun fidxs, int nargs, Type disp ) {
31  super.init(TFUNPTR,"");
32  _fidxs = fidxs; _nargs=nargs; _disp=disp;
33  return this;
34  }
35  @Override int compute_hash() {
36  assert _disp._hash != 0; // Part of a cyclic hash
37  return (TFUNPTR + _fidxs._hash + _nargs + _disp._hash)|256;
38  }
39 
40  @Override public boolean equals( Object o ) {
41  if( this==o ) return true;
42  if( !(o instanceof TypeFunPtr) ) return false;
43  TypeFunPtr tf = (TypeFunPtr)o;
44  return _fidxs==tf._fidxs && _nargs == tf._nargs && _disp==tf._disp;
45  }
46  // Structs can contain TFPs in fields, and TFPs contain a Struct, but never
47  // in a cycle.
48  @Override public boolean cycle_equals( Type o ) {
49  if( this==o ) return true;
50  if( !(o instanceof TypeFunPtr) ) return false;
51  TypeFunPtr tf = (TypeFunPtr)o;
52  if( _fidxs!=tf._fidxs || _nargs != tf._nargs ) return false;
53  return _disp==tf._disp || _disp.cycle_equals(tf._disp);
54  }
55 
56  @Override public SB str( SB sb, VBitSet dups, TypeMem mem, boolean debug ) {
57  if( dups.tset(_uid) ) return sb.p('$'); // Break recursive printing cycle
58  _fidxs.str(sb);
59  sb.p('{'); // Collection (even of 1) start
60  if( debug ) _disp.str(sb,dups,mem,debug).p(' ');
61  return sb.p('}');
62  }
63 
64  public String names(boolean debug) { return FunNode.names(_fidxs,new SB(),debug).toString(); }
65 
66  static { new Pool(TFUNPTR,new TypeFunPtr()); }
67  public static TypeFunPtr make( BitsFun fidxs, int nargs, Type disp ) {
68  assert disp.is_display_ptr(); // Simple display ptr. Just the alias.
69  TypeFunPtr t1 = POOLS[TFUNPTR].malloc();
70  return t1.init(fidxs,nargs,disp).hashcons_free();
71  }
72 
73  public static TypeFunPtr make( int fidx, int nargs, Type disp ) { return make(BitsFun.make0(fidx),nargs,disp); }
74  public static TypeFunPtr make_new_fidx( int parent, int nargs, Type disp ) { return make(BitsFun.make_new_fidx(parent),nargs,disp); }
75  public TypeFunPtr make_from( TypeMemPtr disp ) { return make(_fidxs,_nargs,disp); }
78  public static TypeMemPtr DISP = TypeMemPtr.DISPLAY_PTR; // Open display, allows more fields
79 
80  public static final TypeFunPtr GENERIC_FUNPTR = make(BitsFun.FULL,1,Type.ALL);
81  public static final TypeFunPtr EMPTY = make(BitsFun.EMPTY,0,TypeMemPtr.NO_DISP);
82  static final TypeFunPtr[] TYPES = new TypeFunPtr[]{GENERIC_FUNPTR,EMPTY.dual()};
83 
84  @Override protected TypeFunPtr xdual() {
85  return new TypeFunPtr().init(_fidxs.dual(),_nargs,_disp.dual());
86  }
87  @Override protected TypeFunPtr rdual() {
88  if( _dual != null ) return _dual;
90  if( _hash != 0 ) {
91  assert _hash == compute_hash();
92  dual._hash = dual.compute_hash(); // Compute hash before recursion
93  }
94  dual._dual = this;
95  return dual;
96  }
97  @Override protected Type xmeet( Type t ) {
98  switch( t._type ) {
99  case TFUNPTR:break;
100  case TFUNSIG: return t.xmeet(this);
101  case TFLT:
102  case TINT:
103  case TMEMPTR:
104  case TRPC: return cross_nil(t);
105  case TARY:
106  case TLIVE:
107  case TOBJ:
108  case TSTR:
109  case TSTRUCT:
110  case TTUPLE:
111  case TMEM: return ALL;
112  default: throw typerr(t); // All else should not happen
113  }
114  TypeFunPtr tf = (TypeFunPtr)t;
116  // Recursive but not cyclic; since at least one of these types is
117  // non-cyclic normal recursion will bottom-out.
118 
119  // If unequal length; then if short is low it "wins" (result is short) else
120  // short is high and it "loses" (result is long).
121  TypeFunPtr min_nargs = _nargs < tf._nargs ? this : tf;
122  TypeFunPtr max_nargs = _nargs < tf._nargs ? tf : this;
123  int nargs = min_nargs.above_center() ? max_nargs._nargs : min_nargs._nargs;
124  return make(fidxs,nargs,_disp.meet(tf._disp));
125  }
126 
127  public BitsFun fidxs() { return _fidxs; }
128  public int fidx() { return _fidxs.getbit(); } // Asserts internally single-bit
129 
130  @Override public boolean above_center() { return _fidxs.above_center() || (_fidxs.is_con() && _disp.above_center()); }
131  @Override public boolean may_be_con() {
132  return _disp.may_be_con() &&
133  _fidxs.abit() != -1 &&
134  !is_forward_ref();
135  }
136  @Override public boolean is_con() {
137  return _disp==TypeMemPtr.NO_DISP && // No display (could be constant display?)
138  // Single bit covers all functions (no new children added, but new splits
139  // can appear). Currently not tracking this at the top-level, so instead
140  // just triggering off of a simple heuristic: a single bit above BitsFun.FULL.
141  _fidxs.abit() > 1 &&
142  !is_forward_ref();
143  }
144  @Override public boolean must_nil() { return _fidxs.test(0) && !_fidxs.above_center(); }
145  @Override public boolean may_nil() { return _fidxs.may_nil(); }
146  @Override Type not_nil() {
147  BitsFun bits = _fidxs.not_nil();
148  return bits==_fidxs ? this : make(bits,_nargs,_disp);
149  }
150  @Override public Type meet_nil(Type nil) {
151  assert nil==NIL || nil==XNIL;
152  // See testLattice15. The UNSIGNED NIL tests as a lattice:
153  // [~0]->~obj ==> NIL ==> [0]-> obj
154  // But loses the pointed-at type down to OBJ.
155  // So using SIGNED NIL, which also tests as a lattice:
156  // [~0]->~obj ==> XNIL ==> [0]->~obj
157  // [~0]-> obj ==> NIL ==> [0]-> obj
158 
159  if( _fidxs.isa(BitsFun.NIL.dual()) ) {
160  if( _disp==DISP.dual() && nil==XNIL ) return XNIL;
161  if( nil==NIL ) return NIL;
162  }
164  }
165  // Used during approximations, with a not-interned 'this'.
166  // Updates-in-place.
167  public Type ax_meet_nil(Type nil) {
168  throw com.cliffc.aa.AA.unimpl();
169  }
170 
171  // Lattice of conversions:
172  // -1 unknown; top; might fail, might be free (Scalar->Int); Scalar might lift
173  // to e.g. Float and require a user-provided rounding conversion from F64->Int.
174  // 0 requires no/free conversion (Int8->Int64, F32->F64)
175  // +1 requires a bit-changing conversion (Int->Flt)
176  // 99 Bottom; No free converts; e.g. Flt->Int requires explicit rounding
177  @Override public byte isBitShape(Type t) {
178  if( t._type == TNIL ) return 0; // Dead arg is free
179  if( t._type == TSCALAR ) return 0; // Scalar is OK
180  return (byte)(t instanceof TypeFunPtr ? 0 : 99); // Mixing TFP and a non-ptr
181  }
182  @SuppressWarnings("unchecked")
183  @Override public void walk( Predicate<Type> p ) { if( p.test(this) ) { _disp.walk(p); } }
184 
185  // Generic functions
186  public boolean is_forward_ref() {
187  if( _fidxs.abit() <= 1 ) return false; // Multiple fidxs, or generic fcn ptr
188  FunNode fun = FunNode.find_fidx(Math.abs(fidx()));
189  return fun != null && fun.is_forward_ref();
190  }
192  TypeFunPtr tf = (TypeFunPtr)clone();
193  tf._disp = disp;
194  tf._hash = tf.compute_hash();
195  return tf;
196  }
197  @Override public TypeFunPtr widen() { return GENERIC_FUNPTR; }
198 
199  @Override public Type make_from(Type head, TypeMem map, VBitSet visit) {
200  throw unimpl();
201  }
202 
203 }
com.cliffc.aa.type.Bits.dual
B dual()
Definition: Bits.java:368
com.cliffc.aa.type.BitsFun.make_new_fidx
static BitsFun make_new_fidx(int parent_fidx)
Definition: BitsFun.java:43
com.cliffc.aa.type.Type< TypeFunPtr >::TLIVE
static final byte TLIVE
Definition: Type.java:276
com.cliffc.aa.type.TypeFunPtr.DISP
static TypeMemPtr DISP
Definition: TypeFunPtr.java:78
com.cliffc.aa.type.TypeMemPtr.NO_DISP
static final Type NO_DISP
Definition: TypeMemPtr.java:80
com.cliffc.aa.type.BitsFun.NIL
static final BitsFun NIL
Definition: BitsFun.java:35
com.cliffc.aa.type.Bits.str
SB str(SB sb)
Definition: Bits.java:134
com.cliffc.aa.type.Type< TypeFunPtr >::TMEMPTR
static final byte TMEMPTR
Definition: Type.java:273
com.cliffc.aa.type.BitsFun.EMPTY
static final BitsFun EMPTY
Definition: BitsFun.java:37
com.cliffc.aa.type.TypeFunPtr
Definition: TypeFunPtr.java:23
com.cliffc.aa.type.Type< TypeFunPtr >::clone
Type clone()
Definition: Type.java:304
com.cliffc.aa.type.TypeFunPtr._nargs
int _nargs
Definition: TypeFunPtr.java:27
com.cliffc.aa.type.TypeMemPtr.DISPLAY_PTR
static final TypeMemPtr DISPLAY_PTR
Definition: TypeMemPtr.java:79
com.cliffc.aa.type.BitsFun.make0
static BitsFun make0(int bit)
Definition: BitsFun.java:44
com.cliffc.aa.type.TypeFunPtr.widen
TypeFunPtr widen()
Definition: TypeFunPtr.java:197
com.cliffc.aa.type.Type< TypeFunPtr >::typerr
RuntimeException typerr(Type t)
Definition: Type.java:947
com.cliffc.aa.type.TypeFunPtr.cycle_equals
boolean cycle_equals(Type o)
Definition: TypeFunPtr.java:48
com.cliffc.aa.type.TypeMem
Memory type; the state of all of memory; memory edges order memory ops.
Definition: TypeMem.java:53
com.cliffc
com.cliffc.aa.type.Type._hash
int _hash
Definition: Type.java:97
com.cliffc.aa.type.TypeFunPtr.walk
void walk(Predicate< Type > p)
Definition: TypeFunPtr.java:183
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.TypeFunPtr.not_nil
Type not_nil()
Definition: TypeFunPtr.java:146
com.cliffc.aa.type.TypeFunPtr.GENERIC_FUNPTR
static final TypeFunPtr GENERIC_FUNPTR
Definition: TypeFunPtr.java:80
com.cliffc.aa.type.TypeFunPtr.xmeet
Type xmeet(Type t)
Definition: TypeFunPtr.java:97
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.FunNode.names
static SB names(BitsFun fidxs, SB sb, boolean debug)
Definition: FunNode.java:131
com.cliffc.aa.type.Type< TypeFunPtr >::TSTR
static final byte TSTR
Definition: Type.java:270
com.cliffc.aa.type.BitsFun.FULL
static final BitsFun FULL
Definition: BitsFun.java:33
com.cliffc.aa.type.Type._type
byte _type
Definition: Type.java:98
com.cliffc.aa.type.TypeFunPtr._fidxs
BitsFun _fidxs
Definition: TypeFunPtr.java:26
com.cliffc.aa.type.TypeFunPtr.fidxs
BitsFun fidxs()
Definition: TypeFunPtr.java:127
com.cliffc.aa.type.TypeFunPtr.make_new_fidx
static TypeFunPtr make_new_fidx(int parent, int nargs, Type disp)
Definition: TypeFunPtr.java:74
com.cliffc.aa.type.TypeFunPtr.TYPES
static final TypeFunPtr[] TYPES
Definition: TypeFunPtr.java:82
com.cliffc.aa.type.TypeFunPtr.rdual
TypeFunPtr rdual()
Definition: TypeFunPtr.java:87
com.cliffc.aa.type.Type.meet
final Type meet(Type t)
Definition: Type.java:412
com.cliffc.aa.AA.unimpl
static RuntimeException unimpl()
Definition: AA.java:10
com.cliffc.aa.type.Bits.test
static boolean test(long[] bits, int i)
Definition: Bits.java:224
com.cliffc.aa.type.Type.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: Type.java:131
com.cliffc.aa.type.TypeFunPtr.isBitShape
byte isBitShape(Type t)
Definition: TypeFunPtr.java:177
com.cliffc.aa.type.Type< TypeFunPtr >::TFUNPTR
static final byte TFUNPTR
Definition: Type.java:274
com.cliffc.aa.type.Type< TypeFunPtr >::TINT
static final byte TINT
Definition: Type.java:263
com.cliffc.aa.type.TypeFunPtr.may_be_con
boolean may_be_con()
Definition: TypeFunPtr.java:131
com.cliffc.aa.type.TypeFunPtr.must_nil
boolean must_nil()
Definition: TypeFunPtr.java:144
com.cliffc.aa.type.Type.ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.type.Type.cycle_equals
boolean cycle_equals(Type t)
Definition: Type.java:118
com.cliffc.aa.type.Type< TypeFunPtr >::TMEM
static final byte TMEM
Definition: Type.java:272
com.cliffc.aa.type.Bits.may_nil
boolean may_nil()
Definition: Bits.java:209
com.cliffc.aa.util.VBitSet.tset
boolean tset(int idx)
Definition: VBitSet.java:7
com.cliffc.aa.type.TypeFunPtr.is_forward_ref
boolean is_forward_ref()
Definition: TypeFunPtr.java:186
com.cliffc.aa.type.Bits.above_center
boolean above_center()
Definition: Bits.java:204
com.cliffc.aa.type.Type< TypeFunPtr >::TTUPLE
static final byte TTUPLE
Definition: Type.java:266
com.cliffc.aa.type.Type.rdual
T rdual()
Definition: Type.java:366
com.cliffc.aa.type.TypeMemPtr.DISP_SIMPLE
static final TypeMemPtr DISP_SIMPLE
Definition: TypeMemPtr.java:105
com.cliffc.aa.type.TypeFunPtr.make_from
Type make_from(Type head, TypeMem map, VBitSet visit)
Definition: TypeFunPtr.java:199
com.cliffc.aa.type.TypeFunPtr.equals
boolean equals(Object o)
Definition: TypeFunPtr.java:40
com.cliffc.aa.type.Type< TypeFunPtr >::_dual
T _dual
Definition: Type.java:100
com.cliffc.aa.type.Type.above_center
boolean above_center()
Definition: Type.java:741
com.cliffc.aa.type.Type< TypeFunPtr >::TSTRUCT
static final byte TSTRUCT
Definition: Type.java:268
com.cliffc.aa.type.TypeFunPtr.fidx
int fidx()
Definition: TypeFunPtr.java:128
com.cliffc.aa.type.TypeFunPtr.xdual
TypeFunPtr xdual()
Definition: TypeFunPtr.java:84
com.cliffc.aa.type.TypeFunPtr._disp
Type _disp
Definition: TypeFunPtr.java:28
com.cliffc.aa.type.Bits._hash
int _hash
Definition: Bits.java:70
com.cliffc.aa.type.Type< TypeFunPtr >::cross_nil
final Type cross_nil(Type t)
Definition: Type.java:865
com.cliffc.aa.node.FunNode.find_fidx
static FunNode find_fidx(int fidx)
Definition: FunNode.java:101
com.cliffc.aa.type.Type.xmeet
Type xmeet(Type t)
Definition: Type.java:461
com.cliffc.aa.type.TypeFunPtr.compute_hash
int compute_hash()
Definition: TypeFunPtr.java:35
com.cliffc.aa.type.Type.may_be_con
boolean may_be_con()
Definition: Type.java:759
com.cliffc.aa.type.TypeFunPtr.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: TypeFunPtr.java:56
com.cliffc.aa.type.TypeFunPtr.make
static TypeFunPtr make(BitsFun fidxs, int nargs, Type disp)
Definition: TypeFunPtr.java:67
com.cliffc.aa.type.TypeFunPtr.make_no_disp
TypeFunPtr make_no_disp()
Definition: TypeFunPtr.java:77
com.cliffc.aa.type.Type< TypeFunPtr >::TSCALAR
static final byte TSCALAR
Definition: Type.java:246
com.cliffc.aa.type.Bits.getbit
int getbit()
Definition: Bits.java:202
com.cliffc.aa.type.Type< TypeFunPtr >::TNIL
static final byte TNIL
Definition: Type.java:259
com.cliffc.aa.type.Type< TypeFunPtr >::TRPC
static final byte TRPC
Definition: Type.java:265
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.type.TypeFunPtr._sharpen_clone
TypeFunPtr _sharpen_clone(TypeMemPtr disp)
Definition: TypeFunPtr.java:191
com.cliffc.aa.type.BitsFun
Definition: BitsFun.java:7
com.cliffc.aa.type.Type.hashcons_free
final T hashcons_free()
Definition: Type.java:153
com.cliffc.aa.util.SB
Tight/tiny StringBuilder wrapper.
Definition: SB.java:8
com.cliffc.aa.type.Type< TypeFunPtr >::NIL
static final Type NIL
Definition: Type.java:332
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.type.Bits.isa
boolean isa(B bs)
Definition: Bits.java:372
com.cliffc.aa.type.Type.is_display_ptr
boolean is_display_ptr()
Definition: Type.java:941
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.type.Bits.is_con
boolean is_con()
Definition: Bits.java:206
com.cliffc.aa.type.Type< TypeFunPtr >::_uid
int _uid
Definition: Type.java:96
com.cliffc.aa.type.TypeFunPtr.above_center
boolean above_center()
Definition: TypeFunPtr.java:130
com.cliffc.aa.type.TypeFunPtr.init
TypeFunPtr init(BitsFun fidxs, int nargs, Type disp)
Definition: TypeFunPtr.java:30
com.cliffc.aa.type.Bits.abit
int abit()
Definition: Bits.java:203
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.type.TypeFunPtr.make_from
TypeFunPtr make_from(BitsFun fidxs)
Definition: TypeFunPtr.java:76
com.cliffc.aa.type.TypeFunPtr.make
static TypeFunPtr make(int fidx, int nargs, Type disp)
Definition: TypeFunPtr.java:73
com.cliffc.aa.type.Type.walk
void walk(Predicate< Type > p)
Definition: Type.java:936
com.cliffc.aa.type.Type.dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.type.TypeFunPtr.ax_meet_nil
Type ax_meet_nil(Type nil)
Definition: TypeFunPtr.java:167
com.cliffc.aa.type.Type< TypeFunPtr >::XNIL
static final Type XNIL
Definition: Type.java:333
com.cliffc.aa.type.TypeFunPtr.names
String names(boolean debug)
Definition: TypeFunPtr.java:64
com.cliffc.aa.type.Type< TypeFunPtr >::POOLS
static final Pool[] POOLS
Definition: Type.java:281
com.cliffc.aa.type.Type< TypeFunPtr >::TOBJ
static final byte TOBJ
Definition: Type.java:267
com.cliffc.aa.type.TypeFunPtr.EMPTY
static final TypeFunPtr EMPTY
Definition: TypeFunPtr.java:81
com.cliffc.aa.type.Bits.not_nil
B not_nil()
Definition: Bits.java:246
com.cliffc.aa.type.TypeFunPtr.meet_nil
Type meet_nil(Type nil)
Definition: TypeFunPtr.java:150
com.cliffc.aa.node.FunNode
Definition: FunNode.java:58
com.cliffc.aa.type.Bits.meet
B meet(final B bs)
Definition: Bits.java:298
com
com.cliffc.aa.type.TypeFunPtr.is_con
boolean is_con()
Definition: TypeFunPtr.java:136
com.cliffc.aa.node.FunNode.is_forward_ref
boolean is_forward_ref()
Definition: FunNode.java:886
com.cliffc.aa.util.SB.toString
String toString()
Definition: SB.java:62
com.cliffc.aa.type.TypeFunPtr.may_nil
boolean may_nil()
Definition: TypeFunPtr.java:145
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.type.Type< TypeFunPtr >::TFUNSIG
static final byte TFUNSIG
Definition: Type.java:275
com.cliffc.aa.node
Definition: AssertNode.java:1
com.cliffc.aa.type.Type< TypeFunPtr >::TARY
static final byte TARY
Definition: Type.java:269
com.cliffc.aa.type.Type< TypeFunPtr >::TFLT
static final byte TFLT
Definition: Type.java:264
com.cliffc.aa.type.TypeFunPtr.make_from
TypeFunPtr make_from(TypeMemPtr disp)
Definition: TypeFunPtr.java:75