aa
TypeObj.java
Go to the documentation of this file.
1 package com.cliffc.aa.type;
2 
3 import com.cliffc.aa.util.SB;
4 import com.cliffc.aa.util.VBitSet;
5 
6 import java.util.function.Predicate;
7 
8 import static com.cliffc.aa.type.TypeFld.Access;
9 
10 // Types which extend memory-based objects - currently Structs (which include
11 // tuples but not TypeTuple) and Str (Strings); will include Arrays at some
12 // point. Structs have memory words addressed by a base-pointer and a field
13 // name (for tuples, the field number), and Arrays have memory words addressed
14 // by a base-pointer and an index.
15 public class TypeObj<O extends TypeObj<O>> extends Type<O> {
16  boolean _any; // True=choice/join; False=all/meet
17  boolean _use; // Equal to _any for OBJ/XOBJ; unequal to _any for UNUSED/ISUSED
18  @SuppressWarnings("unchecked")
19  protected O init(byte type, String name, boolean any, boolean use) {
20  super.init(type,name);
21  _any=any;
22  _use=use;
23  return (O)this;
24  }
25  // Hash does not depend on other types, so never changes
26  @Override int compute_hash() { return super.compute_hash()+(_any?1:0)+(_use?2:0); }
27  @Override public boolean equals( Object o ) {
28  if( this==o ) return true;
29  if( !(o instanceof TypeObj) || !super.equals(o) ) return false;
30  TypeObj to = (TypeObj)o;
31  return _any ==to._any && _use ==to._use;
32  }
33  @Override public boolean cycle_equals( Type o ) { return equals(o); }
34  @Override public SB str( SB sb, VBitSet dups, TypeMem mem, boolean debug ) {
35  return sb.p(_name).p(_any?"~":"").p(_any==_use ? "obj" : "use");
36  }
37 
38  static { new Pool(TOBJ,new TypeObj()); }
39  private static TypeObj make( String name, boolean any, boolean use ) {
40  TypeObj t1 = POOLS[TOBJ].malloc();
41  return (TypeObj)t1.init(TOBJ,name,any,use).hashcons_free();
42  }
43 
44  public static final TypeObj OBJ = make("",false,false); // Any obj; allocated as *something*
45  public static final TypeObj ISUSED= make("",false,true ); // Possibly allocated, the worst possible result
46  public static final TypeObj UNUSED= (TypeObj)ISUSED.dual(); // Never allocated
47  public static final TypeObj XOBJ = (TypeObj)OBJ .dual(); // alloc, but object type is unknown (either struct or array)
48  static final TypeObj[] TYPES = new TypeObj[]{OBJ,ISUSED};
49 
50  @Override boolean is_display() { return false; }
51  @SuppressWarnings("unchecked")
52  @Override protected O xdual() { return (O)new TypeObj().init(TOBJ,_name,!_any,!_use); }
53  @Override protected Type xmeet( Type t ) {
54  if( !(t instanceof TypeObj) ) return ALL;
55  assert this!=t; // already handled
56  TypeObj to = (TypeObj)t;
57  if( _any ) { // 'this' is high
58  if( _use && t == UNUSED ) return XOBJ;
59  return to; // Above all 't'
60  }
61  // 'this' is low
62  if( !_use && t == ISUSED ) return ISUSED;
63  return this;
64  }
65 
66  // Update (approximately) the current TypeObj. Merges fields.
67  public TypeObj update(Access fin, String fld, Type val) { return this; }
68  // Approximate array update.
69  public TypeObj update(TypeInt idx, Type val) {
70  if( this==ISUSED || this==OBJ ) return this;
71  return TypeAry.ARY.dual().update(idx,val);
72  }
73 
74  TypeObj flatten_fields() { return this; }
75  TypeObj remove_other_flds(String fld, Type live) { return UNUSED; }
76  @Override public TypeObj widen() { return ISUSED; }
77  @Override public boolean above_center() { return _any; }
78  @Override public boolean may_be_con() { return _any; }
79  @Override public boolean is_con() { return false; }
80  @Override public boolean must_nil() { return false; }
81  @Override public boolean may_nil() { return false; }
82  @Override public void walk( Predicate<Type> p ) { p.test(this); }
83  // Widen (loss info), to make it suitable as the default function memory.
84  // Must be monotonic, as CallEpiNode.value() uses this.
85  public TypeObj crush() { return this; }
86 }
com.cliffc.aa.type.TypeObj.walk
void walk(Predicate< Type > p)
Definition: TypeObj.java:82
com.cliffc.aa.type.TypeObj.above_center
boolean above_center()
Definition: TypeObj.java:77
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.TypeObj._any
boolean _any
Definition: TypeObj.java:16
com.cliffc.aa.type.TypeObj.xdual
O xdual()
Definition: TypeObj.java:52
com.cliffc
com.cliffc.aa.type.TypeObj.crush
TypeObj crush()
Definition: TypeObj.java:85
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.TypeInt
Definition: TypeInt.java:9
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.type.TypeObj.TYPES
static final TypeObj[] TYPES
Definition: TypeObj.java:48
com.cliffc.aa.type.TypeObj.init
O init(byte type, String name, boolean any, boolean use)
Definition: TypeObj.java:19
com.cliffc.aa.type.TypeObj.must_nil
boolean must_nil()
Definition: TypeObj.java:80
com.cliffc.aa.type.TypeAry
Definition: TypeAry.java:7
com.cliffc.aa.type.Type< O >::ALL
static final Type ALL
Definition: Type.java:324
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.TypeAry.update
TypeObj update(TypeInt idx, Type val)
Definition: TypeAry.java:93
com.cliffc.aa.type.TypeObj.may_nil
boolean may_nil()
Definition: TypeObj.java:81
com.cliffc.aa.type.TypeAry.ARY
static final TypeAry ARY
Definition: TypeAry.java:44
com.cliffc.aa.type.TypeObj.is_con
boolean is_con()
Definition: TypeObj.java:79
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.type.TypeObj.UNUSED
static final TypeObj UNUSED
Definition: TypeObj.java:46
com.cliffc.aa.type.TypeObj.remove_other_flds
TypeObj remove_other_flds(String fld, Type live)
Definition: TypeObj.java:75
com.cliffc.aa.type.TypeObj.ISUSED
static final TypeObj ISUSED
Definition: TypeObj.java:45
com.cliffc.aa.type.TypeObj.compute_hash
int compute_hash()
Definition: TypeObj.java:26
com.cliffc.aa.type.TypeObj.is_display
boolean is_display()
Definition: TypeObj.java:50
com.cliffc.aa.type.TypeObj.may_be_con
boolean may_be_con()
Definition: TypeObj.java:78
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.type.TypeObj.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: TypeObj.java:34
com.cliffc.aa.util.SB
Tight/tiny StringBuilder wrapper.
Definition: SB.java:8
com.cliffc.aa.type.TypeObj.cycle_equals
boolean cycle_equals(Type o)
Definition: TypeObj.java:33
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.type.Type< O >::_name
String _name
Definition: Type.java:99
com.cliffc.aa.type.TypeObj.update
TypeObj update(TypeInt idx, Type val)
Definition: TypeObj.java:69
com.cliffc.aa.type.Type.dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.type.TypeObj.update
TypeObj update(Access fin, String fld, Type val)
Definition: TypeObj.java:67
com.cliffc.aa.type.Type< O >::POOLS
static final Pool[] POOLS
Definition: Type.java:281
com.cliffc.aa.type.Type< O >::TOBJ
static final byte TOBJ
Definition: Type.java:267
com.cliffc.aa.type.TypeFld.Access
Definition: TypeFld.java:109
com.cliffc.aa.type.TypeObj._use
boolean _use
Definition: TypeObj.java:17
com.cliffc.aa.type.TypeObj.xmeet
Type xmeet(Type t)
Definition: TypeObj.java:53
com
com.cliffc.aa.type.TypeObj.equals
boolean equals(Object o)
Definition: TypeObj.java:27
com.cliffc.aa.type.TypeObj.make
static TypeObj make(String name, boolean any, boolean use)
Definition: TypeObj.java:39
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.TypeObj.widen
TypeObj widen()
Definition: TypeObj.java:76