aa
TypeMem.java
Go to the documentation of this file.
1 package com.cliffc.aa.type;
2 
3 import com.cliffc.aa.util.*;
4 
5 import java.util.Arrays;
6 import java.util.BitSet;
7 import java.util.HashMap;
8 
9 import static com.cliffc.aa.type.TypeFld.Access;
10 
53 public class TypeMem extends Type<TypeMem> {
54  // Mapping from alias#s to the current known alias state. Slot#0 is reserved
55  // for memory liveness; TypeMem is never a nil. Slot#1 is the Parent-Of-All
56  // aliases and is the default value. Default values are replaced with null
57  // during canonicalization.
58  private TypeObj[] _pubs;
59 
60  // A cache of sharpened pointers. Pointers get sharpened by looking up their
61  // aliases in this memory (perhaps merging several aliases). The process is
62  // recursive and "deeply" sharpens pointers, and is somewhat expensive.
63  // Maintain a cache of prior results. Not related to the objects Type, so
64  // not part of the hash/equals checks. Optional. Lazily filled in.
65  private HashMap<TypeMemPtr,TypeMemPtr> _sharp_cache;
66 
67  private TypeMem init(TypeObj[] pubs) {
68  super.init(TMEM,"");
69  assert check(pubs); // Caller has canonicalized arrays already
70  _pubs = pubs;
71  return this;
72  }
73  // False if not 'tight' (no trailing null pairs) or any matching pairs (should
74  // collapse to their parent) or any mixed parent/child.
75  private static boolean check(TypeObj[] as) {
76  if( !(as[0] instanceof TypeLive) ) return false; // Slot 0 reserved for live-ness
77  if( as.length == 1 ) return true;
78  if( as[1]!=TypeObj.OBJ && as[1]!=TypeObj.XOBJ &&
79  as[1]!=TypeObj.ISUSED && as[1]!=TypeObj.UNUSED &&
80  !(as[1] instanceof TypeLive) &&
81  as[1] != null )
82  return false; // Only 2 choices
83  if( as[0].above_center()!=as[1].above_center() ) return false;
84  if( as.length==2 ) return true; // Trivial all of memory
85  // "tight" - something in the last slot
86  if( as[as.length-1] == null ) return false;
87  // No dups of any parent
88  for( int i=2; i<as.length; i++ )
89  if( as[i] != null )
90  for( int par = BitsAlias.TREE.parent(i); par!=0; par = BitsAlias.TREE.parent(par) )
91  if( as[par] != null ) {
92  if( as[par] == as[i] ) return false; // Dup of a parent
93  break;
94  }
95  return true;
96  }
97  @Override int compute_hash() {
98  int sum=TMEM;
99  for( TypeObj obj : _pubs ) sum += obj==null ? 0 : obj._hash;
100  return sum;
101  }
102  @Override public boolean equals( Object o ) {
103  if( this==o ) return true;
104  if( !(o instanceof TypeMem) ) return false;
105  TypeMem tf = (TypeMem)o;
106  if( _pubs .length != tf._pubs .length ) return false;
107  for( int i = 0; i< _pubs.length; i++ )
108  if( _pubs[i] != tf._pubs[i] ) // note '==' and NOT '.equals()'
109  return false;
110  return true;
111  }
112  // Never part of a cycle, so the normal check works
113  @Override public boolean cycle_equals( Type o ) { return equals(o); }
114  private static final char[] LIVEC = new char[]{' ','#','R','3'};
115  @Override public SB str( SB sb, VBitSet dups, TypeMem mem, boolean debug ) {
116  if( this==FULL ) return sb.p("[ all ]");
117  if( this==EMPTY) return sb.p("[_____]");
118  if( this== MEM ) return sb.p("[ mem ]");
119  if( this==XMEM ) return sb.p("[~mem ]");
120 
121  if( _pubs.length==1 )
122  return _pubs[0].str(sb.p('['),dups,mem,debug).p(']');
123 
124  if( _pubs[0]==TypeLive.DEAD ) sb.p('!');
125  else _pubs[0].str(sb,dups,mem,debug);
126 
127  sb.p('[');
128  for( int i = 1; i< _pubs.length; i++ )
129  if( _pubs[i] != null )
130  _pubs[i].str(sb.p(i).p(':'),dups,mem,debug).p(",");
131  return sb.unchar().p(']');
132  }
133 
134  // Alias-at. Out of bounds or null uses the parent value.
135  public TypeObj at (int alias) { return at(_pubs ,alias); }
136  static TypeObj at(TypeObj[] tos, int alias) { return tos.length==1 ? tos[0].oob(TypeObj.ISUSED): tos[at_idx(tos,alias)]; }
137  // Alias-at index
138  static int at_idx(TypeObj[]tos, int alias) {
139  if( alias==0 ) return 1; // Either base memory, or assert
140  while( true ) {
141  if( alias < tos.length && tos[alias] != null )
142  return alias;
143  alias = BitsAlias.TREE.parent(alias);
144  assert alias!=0;
145  }
146  }
147  //
148  public TypeObj[] alias2objs() { return _pubs; }
149  public int len() { return _pubs.length; }
150 
151  // Return set of aliases. Not even sure if this is well-defined.
152  public BitsAlias aliases() {
153  if( this== FULL ) return BitsAlias.NZERO;
154  if( this==EMPTY ) return BitsAlias.EMPTY;
155  BitsAlias bas = BitsAlias.EMPTY;
156  for( int i = 0; i< _pubs.length; i++ )
157  if( _pubs[i]!=null && !_pubs[i].above_center() )
158  bas = bas.set(i);
159  return bas;
160  }
161 
162  static { new Pool(TMEM,new TypeMem()); }
163  private static TypeMem make(TypeObj[] pubs) {
164  Pool P = POOLS[TMEM];
165  TypeMem t1 = P.malloc();
166  return t1.init(pubs).hashcons_free();
167  }
168 
169  // Canonicalize memory before making. Unless specified, the default memory is "do not care"
170  public static TypeMem make0( TypeObj[] as ) {
171  assert as.length==1 || as[0]==null;
172  if( as.length> 1 ) as[0] = as[1].oob(TypeLive.LIVE);
173  TypeObj[] tos = _make1(as);
174  if( tos==null ) return DEAD; // All things are dead, so dead
175  return make(tos);
176  }
177 
178  // Canonicalize memory before making. Unless specified, the default memory is "do not care"
179  private static TypeObj[] _make1( TypeObj[] as ) {
180  int len = as.length;
181  if( len > 1 && as[1]==null ) {
182  int i; for( i=2; i<len; i++ )
183  if( as[i]!=null && as[i] != TypeObj.XOBJ )
184  break;
185  if( i==len ) return null; // All things are dead, so dead
186  as[1] = TypeObj.XOBJ; // Default memory is "do not care"
187  }
188  if( len <= 2 ) return as;
189  // No dups of a parent
190  for( int i=1; i<as.length; i++ )
191  if( as[i] != null )
192  for( int par = BitsAlias.TREE.parent(i); par!=0; par = BitsAlias.TREE.parent(par) )
193  if( as[par] != null ) {
194  if( as[par] == as[i] ) as[i] = null;
195  break;
196  }
197  // Remove trailing nulls; make the array "tight"
198  while( as[len-1] == null ) len--;
199  if( as.length!=len ) as = Arrays.copyOf(as,len);
200  return as;
201  }
202 
203  // Precise single alias. Other aliases are "do not care". Nil not allowed.
204  // Both "do not care" and this alias are exact.
205  public static TypeMem make(int alias, TypeObj oop ) {
206  TypeObj[] as = new TypeObj[alias+1];
207  as[1] = TypeObj.UNUSED;
208  as[alias] = oop;
209  return make0(as);
210  }
211  public static TypeMem make(BitsAlias aliases, TypeObj oop ) {
212  TypeObj[] as = new TypeObj[aliases.max()+1];
213  as[1] = TypeObj.UNUSED;
214  for( int alias : aliases )
215  if( alias != 0 )
216  as[alias] = oop;
217  return make0(as);
218  }
219 
220  public static TypeMem make_live(TypeLive live) { return make0(new TypeObj[]{live}); }
221 
222  public static final TypeMem FULL; // Every alias filled with something
223  public static final TypeMem EMPTY;// Every alias filled with anything
224  public static final TypeMem MEM; // FULL, except lifts REC, arrays, STR
225  public static final TypeMem XMEM; //
226  public static final TypeMem DEAD, ALIVE, LNO_DISP, LESC_NO_DISP, LIVE_BOT; // Sentinel for liveness flow; not part of lattice
227  public static final TypeMem ESCAPE; // Sentinel for liveness, where the value "escapes" the local scope
228  public static final TypeMem ANYMEM,ALLMEM; // Every alias is unused (so above XOBJ or below OBJ)
229  public static final TypeMem MEM_ABC, MEM_STR;
230  static {
231  // Every alias is unused
232  ANYMEM = make0(new TypeObj[]{null,TypeObj.UNUSED});
233  ALLMEM = ANYMEM.dual();
234  // All memory, all aliases, holding anything.
235  FULL = make0(new TypeObj[]{null,TypeObj.OBJ});
236  EMPTY= FULL.dual();
237 
238  // All memory. Includes breakouts for all structs and all strings.
239  // Triggers BitsAlias.<clinit> which makes all the initial alias splits.
240  // Not currently including closures
241  TypeObj[] tos = new TypeObj[Math.max(BitsAlias.REC,BitsAlias.AARY)+1];
242  tos[BitsAlias.ALL] = TypeObj.ISUSED;
244  tos[BitsAlias.STR] = TypeStr.STR; //
245  tos[BitsAlias.ABC] = TypeStr.ABC; //
246  tos[BitsAlias.AARY]= TypeAry.ARY; //
247  MEM = make0(tos);
248  XMEM = MEM.dual();
249 
250  MEM_STR = make(BitsAlias.STR,TypeStr.STR.dual()).dual(); // [1:use,4:str]
251  MEM_ABC = make(BitsAlias.ABC,TypeStr.ABC.dual());
252 
253  // Sentinel for liveness flow; not part of lattice
255  ALIVE = make_live(TypeLive.LIVE ); // Basic alive for all time
256  LNO_DISP = make_live(TypeLive.NO_DISP); // Basic alive, no display pointers
257  LESC_NO_DISP = make_live(TypeLive.ESC_DISP); // Basic alive, no display pointers, and escapes.
258  ESCAPE = make_live(TypeLive.ESCAPE ); // Alive, plus escapes some call/memory
260  }
261  static final TypeMem[] TYPES = new TypeMem[]{FULL,MEM,MEM_ABC.dual(),ALLMEM,ESCAPE};
262 
263  // All mapped memories remain, but each memory flips internally.
264  @Override protected TypeMem xdual() {
265  TypeObj[] pubs = new TypeObj[_pubs.length];
266  for( int i = 0; i< _pubs.length; i++ )
267  if( _pubs[i] != null )
268  pubs[i] = (TypeObj) _pubs[i].dual();
269  return new TypeMem().init(pubs);
270  }
271  @Override protected Type xmeet( Type t ) {
272  if( t._type != TMEM ) return ALL;
273  TypeMem tf = (TypeMem)t;
274  // Meet of default values, meet of element-by-element.
275  TypeObj[] as = _meet(_pubs,tf._pubs,false);
276  TypeObj[] tos = _make1(as);
277  return tos==null ? DEAD : make(tos); // All things are dead, so dead
278  }
279 
280  private static TypeObj[] _meet(TypeObj[] as, TypeObj[] bs, boolean is_loop) {
281  TypeObj mt_live = (TypeObj)as[0].meet(bs[0]);
282  int len = Math.max(as.length,bs.length);
283  int mlen = Math.min(as.length,bs.length);
284  if( mlen==1 ) { // At least 1 is short
285  // Short & low "wins": result is short.
286  if( (!as[0].above_center() && as.length==1) ||
287  (!bs[0].above_center() && bs.length==1) )
288  return new TypeObj[]{mt_live};
289  }
290  TypeObj[] objs = new TypeObj[len];
291  objs[0] = mt_live;
292  for( int i=1; i<len; i++ )
293  objs[i] = i<mlen && as[i]==null && bs[i]==null // Shortcut null-vs-null
294  ? null : _meet(at(as,i),at(bs,i),is_loop); // meet element-by-element
295  return objs;
296  }
297  private static TypeObj _meet(TypeObj a, TypeObj b, boolean is_loop) {
298  return (TypeObj)(is_loop ? a.meet_loop(b) : a.meet(b));
299  }
300 
301  // MEET at a Loop; optimize no-final-updates on backedges.
302  @Override public Type meet_loop(Type t2) {
303  if( t2._type != TMEM ) return ALL;
304  TypeMem tf = (TypeMem)t2;
305  // Meet of default values, meet of element-by-element.
306  TypeObj[] as = _meet(_pubs,tf._pubs,true);
307  TypeObj[] tos = _make1(as);
308  return tos==null ? DEAD : make(tos); // All things are dead, so dead
309  }
310 
311  // Any alias is not UNUSED?
312  public boolean has_used(BitSet aliases) {
313  for( int alias = aliases.nextSetBit(0); alias != -1; alias = aliases.nextSetBit(alias + 1))
314  if( at(alias)!= TypeObj.UNUSED )
315  return true; // Has a not-unused (some used) type
316  return false;
317  }
318 
319  // True if this is a liveness value that is NO_DISP, ESC_NO_DISP or DEAD
320  public boolean live_no_disp() {
321  return this==TypeMem.LNO_DISP || this==TypeMem.LESC_NO_DISP || this==TypeMem.DEAD;
322  }
323 
324  // Shallow meet of all possible loadable values. Used in Node.value calls, so must be monotonic.
325  public TypeObj ld( TypeMemPtr ptr ) {
326  if( ptr._aliases == BitsAlias.NIL.dual() || ptr._aliases == BitsAlias.NIL )
327  return TypeObj.XOBJ;
328  if( ptr._aliases == BitsAlias.EMPTY )
329  return oob(TypeObj.OBJ);
330  if( this== FULL ) return TypeObj. OBJ;
331  if( this==EMPTY ) return TypeObj.XOBJ;
332  return ld(_pubs,ptr._aliases);
333  }
334  private static TypeObj ld( TypeObj[] tos, BitsAlias aliases ) {
335  boolean any = aliases.above_center();
336  // Any alias, plus all of its children, are meet/joined. This does a
337  // tree-based scan on the inner loop.
338  TypeObj obj1 = any ? TypeObj.ISUSED : TypeObj.UNUSED;
339  for( int alias : aliases )
340  for( int kid=alias; kid!=0; kid=BitsAlias.next_kid(alias,kid) ) {
341  TypeObj x = at(tos,kid);
342  obj1 = (TypeObj)(any ? obj1.join(x) : obj1.meet(x));
343  }
344  return obj1;
345  }
346 
347  // Transitively walk all reachable aliases from this set of aliases, and
348  // return the complete set.
351  if( aliases==BitsAlias.FULL ) return aliases;
352  AryInt work = new AryInt();
353  VBitSet visit = new VBitSet();
354  for( int alias : aliases )
355  for( int kid=alias; kid!=0; kid = BitsAlias.next_kid(alias,kid) )
356  { work.push(kid); visit.set(kid); }
357 
358  while( !work.isEmpty() ) {
359  int alias=work.pop();
360  if( alias==0 ) continue;
361  TypeObj to = at(alias);
362  if( to==TypeObj.OBJ || to==TypeObj.ISUSED )
363  return BitsAlias.FULL; // All structs with all possible pointers
364  if( !(to instanceof TypeStruct) ) continue;
365  TypeStruct ts = (TypeStruct)to;
366  // Incomplete struct? This is an early escapee from Parse times; more
367  // fields may be added which we assume is a pointer to all.
368  if( ts._open )
369  return BitsAlias.FULL; // Generic open struct points to all
370  for( TypeFld tfld : ts.flds() ) {
371  Type fld = tfld._t;
372  if( TypeMemPtr.OOP.isa(fld) )
373  fld = TypeMemPtr.OOP; // All possible pointers
374  if( fld instanceof TypeFunPtr ) fld = ((TypeFunPtr)fld)._disp;
375  if( !(fld instanceof TypeMemPtr) ) continue; // Not a pointer, no more aliases
376  if( ((TypeMemPtr)fld)._aliases.test(1) )
377  return BitsAlias.FULL; // All possible pointers
378  // Walk the possible pointers, and include them in the slice
379  for( int ptralias : ((TypeMemPtr)fld)._aliases )
380  for( int kid=ptralias; kid!=0; kid = BitsAlias.next_kid(ptralias,kid) )
381  if( !visit.tset(kid) ) {
382  work.push(kid);
383  aliases = aliases.set(kid);
384  }
385  }
386  }
387  assert !aliases.may_nil();
388  return aliases;
389  }
390 
391  // Slice memory by aliases; unnamed aliases are replaced with ~use.
393  if( aliases==BitsAlias.FULL ) return this;
394  TypeObj[] tos = new TypeObj[Math.max(_pubs.length,aliases.max()+1)];
395  tos[1] = at(1);
396  for( int i=2; i<tos.length; i++ )
397  tos[i] = aliases.test_recur(i) ? at(i) : TypeObj.UNUSED;
398  return make0(tos);
399  }
400 
401  // Sharpen a dull pointer against this memory.
402  public TypeMemPtr sharpen( TypeMemPtr dull ) {
403  assert dull==dull.simple_ptr();
404  if( _sharp_cache != null ) { // Check the cache first
405  TypeMemPtr sharp = _sharp_cache.get(dull);
406  if( sharp != null ) return sharp;
407  }
408  // Switch to TypeStruct for building recursive structures.
409  return TypeStruct.sharpen(this,dull);
410  }
411  TypeMemPtr sharp_get( TypeMemPtr tmp ) { return _sharp_cache==null ? null : _sharp_cache.get(tmp); }
413  assert dull.interned() && sharp.interned();
414  if( _sharp_cache==null ) _sharp_cache = new HashMap<>();
415  _sharp_cache.put(dull,sharp);
416  return sharp; // return new not old
417  }
418  // Sharpen if a maybe-pointer
419  @Override public Type sharptr( Type ptr ) {
420  return ptr instanceof TypeMemPtr ? sharpen((TypeMemPtr)ptr) :
421  (ptr instanceof TypeTuple ? ((TypeTuple)ptr).sharptr(this) : ptr);
422  }
423 
424  // Widen (lose info), to make it suitable as the default memory.
425  public TypeMem crush() {
426  TypeObj[] oops = _pubs.clone();
427  oops[0] = null;
428  for( int i=1; i<oops.length; i++ )
429  if( oops[i]!=null ) oops[i] = oops[i].crush();
430  return TypeMem.make0(oops);
431  }
432 
433  // Whole object Set at an alias.
434  public TypeMem set( int alias, TypeObj obj ) {
435  if( at(alias)==obj ) return this; // Shortcut
436  int max = Math.max(_pubs.length,alias+1);
437  TypeObj[] tos = Arrays.copyOf(_pubs,max);
438  tos[0] = null;
439  tos[alias] = obj;
440  return make0(tos);
441  }
442 
443  // Whole object Store of a New at an alias.
444  // Sets the private type.
445  // Lifts/sets the public type, and meets fields.
446  public TypeMem st_new( int alias, TypeObj obj ) {
447  TypeObj[] pubs = _pubs ;
448  TypeObj pub = at(pubs ,alias); // Current value for alias
449  if( pub==obj ) return this; // Shortcut
450  (pubs = _st_new(_pubs,pubs,alias))[alias] = (TypeObj)pub.meet(obj);
451  pubs[0] = null;
452  return make0(pubs);
453  }
454  private static TypeObj[] _st_new( TypeObj[] base, TypeObj[] as, int alias ) {
455  return base==as ? Arrays.copyOf(base,Math.max(base.length,alias+1)) : as;
456  }
457 
458  // Field store into a conservative set of aliases.
459  public TypeMem update( BitsAlias aliases, Access fin, String fld, Type val ) {
460  Ary<TypeObj> pubs = new Ary<>(_pubs .clone());
461  for( int alias : aliases )
462  if( alias != 0 )
463  for( int kid=alias; kid != 0; kid=BitsAlias.next_kid(alias,kid) )
464  pubs.setX(kid,at(_pubs,kid).update(fin,fld,val)); // imprecise
465  return make(_make1(pubs.asAry()));
466  }
467 
468  // Array store into a conservative set of aliases.
469  public TypeMem update( BitsAlias aliases, TypeInt idx, Type val ) {
470  Ary<TypeObj> pubs = new Ary<>(_pubs .clone());
471  for( int alias : aliases )
472  if( alias != 0 )
473  for( int kid=alias; kid != 0; kid=BitsAlias.next_kid(alias,kid) )
474  pubs.setX(kid,at(_pubs,kid).update(idx,val)); // imprecise
475  return make(_make1(pubs.asAry()));
476  }
477 
478  // Everything NOT in the 'escs' is flattened to UNUSED.
479  public TypeMem remove_no_escapes( BitsAlias escs, String fld, Type live ) {
480  TypeObj[] tos = new TypeObj[Math.max(_pubs.length,escs.max()+1)];
481  for( int i=1; i<tos.length; i++ )
482  tos[i] = escs.test_recur(i) ? at(i).remove_other_flds(fld,live) : TypeObj.UNUSED;
483  return make0(tos);
484  }
485 
486  // Everything in the 'escs' set is flattened to UNUSED.
487  public TypeMem remove(BitsAlias escs) {
488  if( escs==BitsAlias.EMPTY ) return this;
489  if( escs==BitsAlias.FULL ) throw com.cliffc.aa.AA.unimpl(); // Shortcut
490  TypeObj[] tos = _pubs.clone();
491  for( int i = 1; i< _pubs.length; i++ )
492  if( escs.test(i) )
493  tos[i] = TypeObj.UNUSED;
494  return make0(tos);
495  }
496 
497  // Report back only those aliases that are also UNUSED
499  int len = Math.max(_pubs.length,escs.max()+1);
501  for( int i=1; i<len; i++ )
502  if( at(i)==TypeObj.UNUSED && escs.test_recur(i) )
503  bs = bs.set(i);
504  return bs;
505  }
506 
507  // True if field is modifiable across any alias
508  public boolean fld_is_mod( BitsAlias aliases, String fld) {
509  for( int alias : aliases ) {
510  if( alias != 0 ) {
511  TypeObj to = at(alias);
512  if( !(to instanceof TypeStruct) ) return true;
513  TypeStruct ts = (TypeStruct)to;
514  int idx = ts.fld_find(fld);
515  if( idx == -1 || ts.fld(idx)._access != Access.Final )
516  return true; // Cannot check for R/O here, because R/O can lift to R/W
517  }
518  }
519  return false;
520  }
521 
523  TypeObj to, tof=null;
524  int i; for( i=1; i< _pubs.length; i++ ) {
525  if( (to = _pubs[i]) != null && (tof = to.flatten_fields())!=to )
526  break;
527  }
528  if( i== _pubs.length ) return this;
529 
530  TypeObj[] tos = _pubs.clone();
531  tos[0] = null;
532  tos[i++] = tof;
533  for( ; i< _pubs.length; i++ )
534  if( tos[i] != null )
535  tos[i] = tos[i].flatten_fields();
536  return make0(tos);
537  }
538 
539  @Override public TypeMem widen() {
540  TypeObj[] tos = _pubs.clone();
541  tos[0] = null;
542  for( int i=1; i<tos.length; i++ )
543  if( tos[i]!=null )
544  tos[i] = tos[i].widen();
545  return make0(tos);
546  }
547 
548  @Override public boolean above_center() {
549  for( TypeObj alias : _pubs )
550  if( alias != null && !alias.above_center() && !alias.is_con() )
551  return false;
552  return true;
553  }
554  @Override public boolean may_be_con() { return false;}
555  @Override public boolean is_con() { return false;}
556  @Override public boolean must_nil() { return false; } // never a nil
557  @Override Type not_nil() { return this; }
558 
559  public TypeLive live() { return (TypeLive)_pubs[0]; }
560  public boolean is_live() { return _pubs.length>1 || (live()!=TypeLive.DEAD && live()!=TypeLive.LIVE.dual()); }
561  public boolean basic_live() { return _pubs.length==1; }
562 
563 }
com.cliffc.aa.type.Bits.dual
B dual()
Definition: Bits.java:368
com.cliffc.aa.type.BitsAlias.FULL
static BitsAlias FULL
Definition: BitsAlias.java:27
com.cliffc.aa.type.TypeStruct._open
boolean _open
Definition: TypeStruct.java:52
com.cliffc.aa.type.TypeMem.check
static boolean check(TypeObj[] as)
Definition: TypeMem.java:75
com.cliffc.aa.type.TypeFld.Access.Final
Final
Definition: TypeFld.java:112
com.cliffc.aa.type.TypeStruct.sharpen
static TypeMemPtr sharpen(TypeMem mem, TypeMemPtr dull)
Definition: TypeStruct.java:875
com.cliffc.aa.type.TypeMem._meet
static TypeObj[] _meet(TypeObj[] as, TypeObj[] bs, boolean is_loop)
Definition: TypeMem.java:280
com.cliffc.aa.type.TypeMem.make
static TypeMem make(TypeObj[] pubs)
Definition: TypeMem.java:163
com.cliffc.aa.type.TypeObj.above_center
boolean above_center()
Definition: TypeObj.java:77
com.cliffc.aa.type.TypeMem.ld
TypeObj ld(TypeMemPtr ptr)
Definition: TypeMem.java:325
com.cliffc.aa.util.AryInt.isEmpty
boolean isEmpty()
Definition: AryInt.java:16
com.cliffc.aa.type.TypeMem.DEAD
static final TypeMem DEAD
Definition: TypeMem.java:226
com.cliffc.aa.type.TypeFunPtr
Definition: TypeFunPtr.java:23
com.cliffc.aa.type.Type.clone
Type clone()
Definition: Type.java:304
com.cliffc.aa.type.TypeMem.at_idx
static int at_idx(TypeObj[]tos, int alias)
Definition: TypeMem.java:138
com.cliffc.aa.type.TypeMem.sharp_get
TypeMemPtr sharp_get(TypeMemPtr tmp)
Definition: TypeMem.java:411
com.cliffc.aa.type.TypeMem.not_nil
Type not_nil()
Definition: TypeMem.java:557
com.cliffc.aa.type.Type.isa
boolean isa(Type t)
Definition: Type.java:623
com.cliffc.aa.type.TypeMem._sharp_cache
HashMap< TypeMemPtr, TypeMemPtr > _sharp_cache
Definition: TypeMem.java:65
com.cliffc.aa.type.TypeMem.live_no_disp
boolean live_no_disp()
Definition: TypeMem.java:320
com.cliffc.aa.type.TypeMem.update
TypeMem update(BitsAlias aliases, Access fin, String fld, Type val)
Definition: TypeMem.java:459
com.cliffc.aa.type.TypeMem
Memory type; the state of all of memory; memory edges order memory ops.
Definition: TypeMem.java:53
com.cliffc.aa.type.Type.join
Type join(Type t)
Definition: Type.java:619
com.cliffc.aa.type.TypeMem.XMEM
static final TypeMem XMEM
Definition: TypeMem.java:225
com.cliffc.aa.type.Type.interned
boolean interned()
Definition: Type.java:209
com.cliffc.aa.type.TypeMemPtr.OOP
static final TypeMemPtr OOP
Definition: TypeMemPtr.java:94
com.cliffc
com.cliffc.aa.type.TypeObj.crush
TypeObj crush()
Definition: TypeObj.java:85
com.cliffc.aa.type.BitsAlias.AARY
static final int AARY
Definition: BitsAlias.java:25
com.cliffc.aa.type.TypeMem.MEM_STR
static final TypeMem MEM_STR
Definition: TypeMem.java:229
com.cliffc.aa.type.TypeMem.is_con
boolean is_con()
Definition: TypeMem.java:555
com.cliffc.aa.type.TypeMem.at
static TypeObj at(TypeObj[] tos, int alias)
Definition: TypeMem.java:136
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
com.cliffc.aa.type.TypeMem.LIVE_BOT
static final TypeMem LIVE_BOT
Definition: TypeMem.java:226
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.TypeInt
Definition: TypeInt.java:9
com.cliffc.aa.type.TypeMem.is_live
boolean is_live()
Definition: TypeMem.java:560
com.cliffc.aa.type.TypeMem.ESCAPE
static final TypeMem ESCAPE
Definition: TypeMem.java:227
com.cliffc.aa.type.TypeMem.widen
TypeMem widen()
Definition: TypeMem.java:539
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
Arrays
com.cliffc.aa.type.TypeStruct.ALLSTRUCT
static final TypeStruct ALLSTRUCT
Definition: TypeStruct.java:228
com.cliffc.aa.util.Ary
Definition: Ary.java:11
com.cliffc.aa.type.BitsAlias
Definition: BitsAlias.java:8
com.cliffc.aa.type.TypeLive.LIVE_BOT
static final TypeLive LIVE_BOT
Definition: TypeLive.java:58
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
com.cliffc.aa.type.Type._type
byte _type
Definition: Type.java:98
com.cliffc.aa.type.TypeMem.has_used
boolean has_used(BitSet aliases)
Definition: TypeMem.java:312
com.cliffc.aa.type.TypeMem._make1
static TypeObj[] _make1(TypeObj[] as)
Definition: TypeMem.java:179
com.cliffc.aa.type.TypeTuple.sharptr
TypeTuple sharptr(TypeMem mem)
Definition: TypeTuple.java:208
com.cliffc.aa.type.TypeMem.meet_loop
Type meet_loop(Type t2)
Definition: TypeMem.java:302
com.cliffc.aa.type.TypeMem.ALLMEM
static final TypeMem ALLMEM
Definition: TypeMem.java:228
com.cliffc.aa.type.BitsAlias.TREE
static final Bits.Tree< BitsAlias > TREE
Definition: BitsAlias.java:23
com.cliffc.aa.type.TypeMem.equals
boolean equals(Object o)
Definition: TypeMem.java:102
com.cliffc.aa.type.TypeMem._pubs
TypeObj[] _pubs
Definition: TypeMem.java:58
com.cliffc.aa.type.Type< TypeMem >::meet
final Type meet(Type t)
Definition: Type.java:412
com.cliffc.aa.type.TypeAry
Definition: TypeAry.java:7
com.cliffc.aa.type.TypeStruct
A memory-based collection of optionally named fields.
Definition: TypeStruct.java:50
com.cliffc.aa.type.Bits.test_recur
boolean test_recur(int i)
Definition: Bits.java:232
com.cliffc.aa.AA.unimpl
static RuntimeException unimpl()
Definition: AA.java:10
com.cliffc.aa.type.TypeMem.cycle_equals
boolean cycle_equals(Type o)
Definition: TypeMem.java:113
com.cliffc.aa.type.TypeMem.crush
TypeMem crush()
Definition: TypeMem.java:425
com.cliffc.aa.type.TypeMem.ANYMEM
static final TypeMem ANYMEM
Definition: TypeMem.java:228
com.cliffc.aa.type.TypeLive.DEAD
static final TypeLive DEAD
Definition: TypeLive.java:59
com.cliffc.aa.type.TypeMem.above_center
boolean above_center()
Definition: TypeMem.java:548
com.cliffc.aa.type.TypeMem.flatten_fields
TypeMem flatten_fields()
Definition: TypeMem.java:522
com.cliffc.aa.util.SB.unchar
SB unchar()
Definition: SB.java:58
com.cliffc.aa.type.Type< TypeMem >::ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.type.Type< TypeMem >::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.type.BitsAlias.REC
static final int REC
Definition: BitsAlias.java:25
com.cliffc.aa.type.TypeMem.xmeet
Type xmeet(Type t)
Definition: TypeMem.java:271
com.cliffc.aa.util.Ary.asAry
E[] asAry()
Definition: Ary.java:172
com.cliffc.aa.util.VBitSet.tset
boolean tset(int idx)
Definition: VBitSet.java:7
com.cliffc.aa.type.BitsAlias.next_kid
static int next_kid(int alias, int kid)
Definition: BitsAlias.java:66
com.cliffc.aa.type.Bits.above_center
boolean above_center()
Definition: Bits.java:204
com.cliffc.aa.type.TypeMem.make0
static TypeMem make0(TypeObj[] as)
Definition: TypeMem.java:170
com.cliffc.aa.type.TypeMem.LNO_DISP
static final TypeMem LNO_DISP
Definition: TypeMem.java:226
com.cliffc.aa.type.TypeMem.update
TypeMem update(BitsAlias aliases, TypeInt idx, Type val)
Definition: TypeMem.java:469
com.cliffc.aa.type.TypeObj.OBJ
static final TypeObj OBJ
Definition: TypeObj.java:44
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.type.TypeFld._access
Access _access
Definition: TypeFld.java:17
com.cliffc.aa.type.TypeMem.and_unused
BitsAlias and_unused(BitsAlias escs)
Definition: TypeMem.java:498
com.cliffc.aa.type.TypeAry.ARY
static final TypeAry ARY
Definition: TypeAry.java:44
com.cliffc.aa.type.TypeMem.len
int len()
Definition: TypeMem.java:149
com.cliffc.aa.type.TypeMem.live
TypeLive live()
Definition: TypeMem.java:559
com.cliffc.aa.type.Type.meet_loop
Type meet_loop(Type t2)
Definition: Type.java:628
com.cliffc.aa.type.BitsAlias.NIL
static BitsAlias NIL
Definition: BitsAlias.java:27
com.cliffc.aa.type.TypeObj.flatten_fields
TypeObj flatten_fields()
Definition: TypeObj.java:74
com.cliffc.aa.type.TypeObj.XOBJ
static final TypeObj XOBJ
Definition: TypeObj.java:47
com.cliffc.aa.util.Ary.setX
E setX(int i, E e)
Definition: Ary.java:115
com.cliffc.aa.type.TypeMem.MEM_ABC
static final TypeMem MEM_ABC
Definition: TypeMem.java:229
com.cliffc.aa.type.TypeMem.FULL
static final TypeMem FULL
Definition: TypeMem.java:222
com.cliffc.aa.type.TypeStr.ABC
static final TypeStr ABC
Definition: TypeStr.java:47
com.cliffc.aa.type.BitsAlias.ALL
static final int ALL
Definition: BitsAlias.java:25
com.cliffc.aa.type.TypeLive.NO_DISP
static final TypeLive NO_DISP
Definition: TypeLive.java:53
com.cliffc.aa.type.TypeMem.fld_is_mod
boolean fld_is_mod(BitsAlias aliases, String fld)
Definition: TypeMem.java:508
com.cliffc.aa.type.TypeMem.xdual
TypeMem xdual()
Definition: TypeMem.java:264
com.cliffc.aa.type.TypeObj.UNUSED
static final TypeObj UNUSED
Definition: TypeObj.java:46
com.cliffc.aa.type.TypeMem.compute_hash
int compute_hash()
Definition: TypeMem.java:97
com.cliffc.aa.type.TypeObj.remove_other_flds
TypeObj remove_other_flds(String fld, Type live)
Definition: TypeObj.java:75
com.cliffc.aa.type.TypeMem.basic_live
boolean basic_live()
Definition: TypeMem.java:561
com.cliffc.aa.type.TypeObj.ISUSED
static final TypeObj ISUSED
Definition: TypeObj.java:45
com.cliffc.aa.type.TypeLive.ESCAPE
static final TypeLive ESCAPE
Definition: TypeLive.java:56
com.cliffc.aa.type.TypeMem.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: TypeMem.java:115
com.cliffc.aa.type.TypeMem.ALIVE
static final TypeMem ALIVE
Definition: TypeMem.java:226
com.cliffc.aa.type.TypeMem.sharptr
Type sharptr(Type ptr)
Definition: TypeMem.java:419
com.cliffc.aa.type.BitsAlias.ABC
static final int ABC
Definition: BitsAlias.java:25
com.cliffc.aa.type.TypeMem._st_new
static TypeObj[] _st_new(TypeObj[] base, TypeObj[] as, int alias)
Definition: TypeMem.java:454
com.cliffc.aa.util.AryInt.pop
int pop()
Definition: AryInt.java:37
com.cliffc.aa.type.TypeStruct.flds
static TypeFld[] flds(Type t1)
Definition: TypeStruct.java:184
com.cliffc.aa.util.AryInt.push
AryInt push(int e)
Add element in amortized constant time.
Definition: AryInt.java:45
com.cliffc.aa.type.TypeStr
Definition: TypeStr.java:14
com.cliffc.aa.type.BitsAlias.EMPTY
static BitsAlias EMPTY
Definition: BitsAlias.java:27
com.cliffc.aa.type.TypeLive.LIVE
static final TypeLive LIVE
Definition: TypeLive.java:55
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.type.TypeMem.must_nil
boolean must_nil()
Definition: TypeMem.java:556
com.cliffc.aa.type.TypeObj.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: TypeObj.java:34
com.cliffc.aa.type.TypeMem.alias2objs
TypeObj[] alias2objs()
Definition: TypeMem.java:148
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.TypeMem.remove_no_escapes
TypeMem remove_no_escapes(BitsAlias escs, String fld, Type live)
Definition: TypeMem.java:479
com.cliffc.aa.type.TypeMem.aliases
BitsAlias aliases()
Definition: TypeMem.java:152
com.cliffc.aa.type.Bits.max
int max()
Definition: Bits.java:284
com.cliffc.aa.type.TypeMemPtr.simple_ptr
Type simple_ptr()
Definition: TypeMemPtr.java:160
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.type.TypeMem.may_be_con
boolean may_be_con()
Definition: TypeMem.java:554
com.cliffc.aa.type.TypeMem.LIVEC
static final char[] LIVEC
Definition: TypeMem.java:114
com.cliffc.aa.type.TypeStruct.fld_find
int fld_find(String fld)
Definition: TypeStruct.java:1038
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.type.TypeLive
Definition: TypeLive.java:19
com.cliffc.aa.type.TypeStruct.fld
TypeFld fld(int idx)
Definition: TypeStruct.java:1012
com.cliffc.aa.type.TypeMem.init
TypeMem init(TypeObj[] pubs)
Definition: TypeMem.java:67
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.type.TypeMemPtr._aliases
BitsAlias _aliases
Definition: TypeMemPtr.java:16
com.cliffc.aa.type.TypeMem._meet
static TypeObj _meet(TypeObj a, TypeObj b, boolean is_loop)
Definition: TypeMem.java:297
com.cliffc.aa.type.TypeLive.ESC_DISP
static final TypeLive ESC_DISP
Definition: TypeLive.java:54
com.cliffc.aa.type.TypeMem.LESC_NO_DISP
static final TypeMem LESC_NO_DISP
Definition: TypeMem.java:226
com.cliffc.aa.type.TypeMem.make
static TypeMem make(BitsAlias aliases, TypeObj oop)
Definition: TypeMem.java:211
com.cliffc.aa.type.TypeMem.ld
static TypeObj ld(TypeObj[] tos, BitsAlias aliases)
Definition: TypeMem.java:334
com.cliffc.aa.type.Type.dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.type.TypeMem.sharput
TypeMemPtr sharput(TypeMemPtr dull, TypeMemPtr sharp)
Definition: TypeMem.java:412
com.cliffc.aa.type.TypeMem.st_new
TypeMem st_new(int alias, TypeObj obj)
Definition: TypeMem.java:446
com.cliffc.aa.type.Type.oob
Type oob()
Definition: Type.java:635
com.cliffc.aa.type.TypeMem.all_reaching_aliases
BitsAlias all_reaching_aliases(BitsAlias aliases)
Definition: TypeMem.java:349
com.cliffc.aa.type.TypeMem.sharpen
TypeMemPtr sharpen(TypeMemPtr dull)
Definition: TypeMem.java:402
com.cliffc.aa.type.Type< TypeMem >::POOLS
static final Pool[] POOLS
Definition: Type.java:281
com.cliffc.aa.type.TypeStr.STR
static final TypeStr STR
Definition: TypeStr.java:45
com.cliffc.aa.type.TypeFld.Access
Definition: TypeFld.java:109
com.cliffc.aa.type.BitsAlias.NZERO
static BitsAlias NZERO
Definition: BitsAlias.java:27
com.cliffc.aa.type.TypeMem.TYPES
static final TypeMem[] TYPES
Definition: TypeMem.java:261
com.cliffc.aa.util.AryInt
Definition: AryInt.java:8
com
com.cliffc.aa.type.Bits.set
B set(int bit)
Definition: Bits.java:264
com.cliffc.aa.type.TypeMem.make
static TypeMem make(int alias, TypeObj oop)
Definition: TypeMem.java:205
com.cliffc.aa.type.TypeMem.make_live
static TypeMem make_live(TypeLive live)
Definition: TypeMem.java:220
com.cliffc.aa.type.TypeMem.MEM
static final TypeMem MEM
Definition: TypeMem.java:224
com.cliffc.aa.type.TypeMem.at
TypeObj at(int alias)
Definition: TypeMem.java:135
com.cliffc.aa.type.BitsAlias.STR
static final int STR
Definition: BitsAlias.java:25
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.TypeMem.EMPTY
static final TypeMem EMPTY
Definition: TypeMem.java:223
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.type.TypeMem.slice_reaching_aliases
TypeMem slice_reaching_aliases(BitsAlias aliases)
Definition: TypeMem.java:392
com.cliffc.aa.type.TypeObj.widen
TypeObj widen()
Definition: TypeObj.java:76