aa
ConTypeNode.java
Go to the documentation of this file.
1 package com.cliffc.aa.node;
2 
3 import com.cliffc.aa.Env;
4 import com.cliffc.aa.GVNGCM;
5 import com.cliffc.aa.type.*;
6 import com.cliffc.aa.util.Util;
7 import com.cliffc.aa.util.VBitSet;
8 
9 import static com.cliffc.aa.AA.unimpl;
10 
11 // Naming names is hard, and I dont like this name.
12 
13 // Node computes a flow-type, generally a TypeMemPtr to a TypeStruct which is
14 // somehow recursive. The type recursion can be direct or indirect (or not at
15 // all). Other than the Env.START input all other inputs are other ConTypes.
16 // Once all ConTypes (all user type variables) are parsed, all ConTypes taken
17 // together can GCP to actual constants and be replaced with ConNodes.
18 public class ConTypeNode extends Node {
19  public final String _tname; // Type-def name
20  public Type _t; // Updated when closing a forward-ref cycle
21  public ConTypeNode( String tname, Type t, ScopeNode scope ) {
22  super(OP_CONTYPE,Env.START);
23  _tname = tname;
24  _t = t;
25  }
26  public boolean is_forward_ref() { return is_forward_ref(_t); }
27  public static boolean is_forward_ref(Type t) { return t instanceof TypeMemPtr && !(((TypeMemPtr)t)._obj instanceof TypeStruct); }
28  public int alias() { return ((TypeMemPtr)_t).getbit0(); }
29 
30  // Define a forward-ref Type
31  public void def_fref(Type t, Env e) {
32  if( !(t instanceof TypeStruct) ) {
33  throw unimpl();
34  }
35  assert t._name.equals(_tname+":");
36 
37  // Close, and set an initial value
38  TypeStruct tc = ((TypeStruct)t).close();
39  _t = ((TypeMemPtr)_t).make_from(tc);
40 
41  // Inspect the struct for aliases matching other ConTypes. Force those as inputs.
42  // Updates to their types will force the value call to update as well.
43  VBitSet visit = new VBitSet();
44  tc.walk( tx -> {
45  if( visit.tset(tx._uid) ) return false;
46  if( !(tx instanceof TypeMemPtr) ) return true;
47  int alias = ((TypeMemPtr)tx)._aliases.strip_nil().abit();
48  if( alias == -1 ) return true;
49  ConTypeNode ctn = e.lookup_type(alias);
50  if( ctn==null ) return true; // Not a named type
51  if( _defs.find(ctn)== -1 ) // One-time only
52  add_def(ctn); // Add the ConType per unique alias
53  return false;
54  });
55  xval(); // Sets value equal to _t
56  xval(); // Closes any self-recursive cycle, but will leave forward-ref types alone
57  }
58 
59  @SuppressWarnings("unchecked")
60  @Override public Type value(GVNGCM.Mode opt_mode) {
61  // Simple (non-recursive) constants have no inputs and already have their named type
62  if( _defs._len==1 ) return _t;
63  assert _t instanceof TypeMemPtr;
64 
65  // Walk 't' recursively. Instances of TypeMemPtr with aliases same as the
66  // input ConTypeNodes, use their value instead of 't's value. This might
67  // make a recursive-type, unrolled once (if, through a cycle, we reference
68  // ourselves). Approximate the unrolled type.
69  TypeMem mem = TypeMem.EMPTY;
70  for( Node ctn : _defs )
71  if( ctn instanceof ConTypeNode ) {
72  TypeObj obj = ctn._val instanceof TypeMemPtr ? ((TypeMemPtr)ctn._val)._obj : TypeObj.UNUSED;
73  mem = mem.set(((ConTypeNode)ctn).alias(),obj);
74  }
75  VBitSet visit = new VBitSet();
76 
77  TypeMemPtr t1 = (TypeMemPtr)_t.make_from(_t,mem,visit);
78  TypeStruct t2 = ((TypeStruct)(t1._obj)).approx(1,alias());
79  TypeMemPtr t3 = t1.make_from(t2);
80  return t3;
81  }
82  @Override public TypeMem all_live() { return TypeMem.ALIVE; }
83  @Override public int hashCode() { return super.hashCode()+ _tname.hashCode(); }
84  @Override public boolean equals(Object o) {
85  if( this==o ) return true;
86  if( !(o instanceof ConTypeNode) ) return false;
87  ConTypeNode ct = (ConTypeNode)o;
88  return Util.eq(_tname,ct._tname) && super.equals(ct);
89  }
90 }
com.cliffc.aa.node.ConTypeNode.value
Type value(GVNGCM.Mode opt_mode)
Definition: ConTypeNode.java:60
com.cliffc.aa.node.ConTypeNode.hashCode
int hashCode()
Definition: ConTypeNode.java:83
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.util.Util.eq
static boolean eq(String s0, String s1)
Definition: Util.java:16
com.cliffc
com.cliffc.aa.node.ScopeNode
Definition: ScopeNode.java:17
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.node.ConTypeNode.is_forward_ref
static boolean is_forward_ref(Type t)
Definition: ConTypeNode.java:27
com.cliffc.aa.node.ConTypeNode._tname
final String _tname
Definition: ConTypeNode.java:19
com.cliffc.aa.node.Node.OP_CONTYPE
static final byte OP_CONTYPE
Definition: Node.java:21
com.cliffc.aa.Env.lookup_type
ConTypeNode lookup_type(String name)
Definition: Env.java:222
com.cliffc.aa.node.Node.add_def
Node add_def(Node n)
Definition: Node.java:152
com.cliffc.aa.type.TypeStruct
A memory-based collection of optionally named fields.
Definition: TypeStruct.java:50
com.cliffc.aa.AA.unimpl
static RuntimeException unimpl()
Definition: AA.java:10
com.cliffc.aa.type.TypeMemPtr._obj
TypeObj _obj
Definition: TypeMemPtr.java:26
com.cliffc.aa.Env.START
static StartNode START
Definition: Env.java:14
com.cliffc.aa.util.VBitSet.tset
boolean tset(int idx)
Definition: VBitSet.java:7
com.cliffc.aa.node.ConTypeNode._t
Type _t
Definition: ConTypeNode.java:20
com.cliffc.aa.node.ConTypeNode.ConTypeNode
ConTypeNode(String tname, Type t, ScopeNode scope)
Definition: ConTypeNode.java:21
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.node.ConTypeNode.alias
int alias()
Definition: ConTypeNode.java:28
com.cliffc.aa.util.Util
Definition: Util.java:5
com.cliffc.aa.type.TypeObj.UNUSED
static final TypeObj UNUSED
Definition: TypeObj.java:46
com.cliffc.aa.type.Type.make_from
Type make_from(Type head, TypeMem map, VBitSet visit)
Definition: Type.java:945
com.cliffc.aa.node.ConTypeNode.def_fref
void def_fref(Type t, Env e)
Definition: ConTypeNode.java:31
com.cliffc.aa.type.TypeMem.ALIVE
static final TypeMem ALIVE
Definition: TypeMem.java:226
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.type.TypeMem.set
TypeMem set(int alias, TypeObj obj)
Definition: TypeMem.java:434
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.type.TypeStruct.walk
void walk(Predicate< Type > p)
Definition: TypeStruct.java:1135
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.ConTypeNode
Definition: ConTypeNode.java:18
com.cliffc.aa.node.ConTypeNode.all_live
TypeMem all_live()
Definition: ConTypeNode.java:82
com.cliffc.aa.node.ConTypeNode.equals
boolean equals(Object o)
Definition: ConTypeNode.java:84
com.cliffc.aa.type.Type._name
String _name
Definition: Type.java:99
com.cliffc.aa.node.Node.xval
Type xval()
Definition: Node.java:460
com.cliffc.aa.node.ConTypeNode.is_forward_ref
boolean is_forward_ref()
Definition: ConTypeNode.java:26
com
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type.TypeMemPtr.make_from
TypeMemPtr make_from(TypeObj obj)
Definition: TypeMemPtr.java:73
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.TypeStruct.close
TypeStruct close()
Definition: TypeStruct.java:212
com.cliffc.aa.node.Node._defs
Ary< Node > _defs
Definition: Node.java:124
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.GVNGCM.Mode
Definition: GVNGCM.java:14