aa
NewObjNode.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.Parse;
6 import com.cliffc.aa.type.*;
7 import com.cliffc.aa.util.Util;
8 
9 import static com.cliffc.aa.AA.MEM_IDX;
10 import static com.cliffc.aa.type.TypeFld.Access;
11 
12 // Allocates a TypeStruct and produces a Tuple with the TypeStruct and a TypeMemPtr.
13 //
14 // During Parsing we construct closures whose field names are discovered as we
15 // parse. Hence we support a type which represents some concrete fields, and a
16 // choice of all possible remaining fields. The _any choice means we can add
17 // fields, although the closure remains impossibly low until the lexical scope
18 // ends and no more fields can appear.
19 
20 public class NewObjNode extends NewNode<TypeStruct> {
21  public final boolean _is_closure; // For error messages
22  public Parse[] _fld_starts; // Start of each tuple member; 0 for the display
23  // NewNodes do not really need a ctrl; useful to bind the upward motion of
24  // closures so variable stores can more easily fold into them.
25  public NewObjNode( boolean is_closure, TypeStruct disp, Node clo ) {
26  super(OP_NEWOBJ,BitsAlias.REC,disp);
27  add_def(clo);
28  _is_closure = is_closure;
29  assert disp.fld(0).is_display_ptr();
30  }
31  // Called by IntrinsicNode.convertTypeNameStruct
32  public NewObjNode( boolean is_closure, int alias, TypeStruct ts, Node clo ) {
33  super(OP_NEWOBJ,alias,ts,clo);
34  _is_closure = is_closure;
35  assert ts.fld(0).is_display_ptr();
36  }
37  public Node get(String name) { int idx = _ts.fld_find(name); assert idx >= 0; return fld(idx); }
38  public boolean exists(String name) { return _ts.fld_find(name)!=-1; }
39  public boolean is_mutable(String name) {
40  return _ts.fld(_ts.fld_find(name))._access==Access.RW;
41  }
42  //public Access mutable(String name) { return _ts.fmod(_ts.find(name)); }
43 
44  // Called when folding a Named Constructor into this allocation site
45  void set_name( TypeStruct name ) { assert !name.above_center(); setsm(name); }
46 
47  // No more fields
48  public void no_more_fields() { setsm(_ts.close()); }
49 
50  // Create a field from parser for an inactive this
51  public void create( String name, Node val, Access mutable ) {
52  assert !Util.eq(name,"^"); // Closure field created on init
53  create_active(name,val,mutable);
54  }
55 
56  // Create a field from parser for an active this
57  public void create_active( String name, Node val, Access mutable ) {
58  assert def_idx(_ts.len())== _defs._len;
59  assert _ts.fld_find(name) == -1; // No dups
60  add_def(val);
61  setsm(_ts.add_fld(name,mutable,mutable==Access.Final ? val._val : Type.SCALAR));
62  Env.GVN.add_flow(this);
63  }
64  public void update( String tok, Access mutable, Node val ) { update(_ts.fld_find(tok),mutable,val); }
65  // Update the field & mod
66  public void update( int fidx, Access mutable, Node val ) {
67  assert def_idx(_ts.len())== _defs._len;
68  set_def(def_idx(fidx),val);
69  sets(_ts.set_fld(fidx,mutable==Access.Final ? val._val : Type.SCALAR,mutable));
70  xval();
71  Env.GVN.add_flow_uses(this);
72  }
73 
74 
75  // Add a named FunPtr to a New. Auto-inflates to a Unresolved as needed.
76  public FunPtrNode add_fun( Parse bad, String name, FunPtrNode ptr ) {
77  int fidx = _ts.fld_find(name);
78  if( fidx == -1 ) {
80  } else {
81  Node n = _defs.at(def_idx(fidx));
82  if( n instanceof UnresolvedNode ) n.add_def(ptr);
83  else n = new UnresolvedNode(bad,n,ptr);
84  n.xval(); // Update the input type, so the _ts field updates
85  update(fidx,Access.Final,n);
86  }
87  return ptr;
88  }
89 
90  // The current local scope ends, no more names will appear. Forward refs
91  // first found in this scope are assumed to be defined in some outer scope
92  // and get promoted. Other locals are no longer kept alive, but live or die
93  // according to use.
94  public void promote_forward( NewObjNode parent ) {
95  assert parent != null;
96  TypeStruct ts = _ts;
97  for( int i=0; i<ts.len(); i++ ) {
98  Node n = fld(i);
99  if( n != null && n.is_forward_ref() ) {
100  // Remove current display from forward-refs display choices.
101  assert Env.LEX_DISPLAYS.test(_alias);
103  n.set_def(1,Node.con(tdisp)); // TODO: BUGGY? NEEDS TO CRAWL THE DISPLAY 1 LEVEL?
104  n.xval();
105  // Make field in the parent
106  TypeFld fld = ts.fld(i);
107  parent.create(fld._fld,n,fld._access);
108  // Stomp field locally to ANY
109  set_def(def_idx(i),Env.ANY);
110  setsm(_ts.set_fld(i,Type.ANY,Access.Final));
111  Env.GVN.add_flow_uses(n);
112  }
113  }
114  }
115 
116  @Override public Node ideal_mono() {
117  // If the value lifts a final field, so does the default lift.
118  if( _val instanceof TypeTuple ) {
119  TypeObj ts3 = (TypeObj)((TypeTuple)_val).at(MEM_IDX);
120  if( ts3 != TypeObj.UNUSED ) {
121  TypeStruct ts4 = _ts.make_from_flds((TypeStruct)ts3);
122  TypeStruct ts5 = ts4.crush();
123  assert ts4.isa(ts5);
124  if( ts5 != _crushed && ts5.isa(_crushed) ) {
125  setsm(ts4);
127  return this;
128  }
129  }
130  }
131  return null;
132  }
133  @Override public void add_flow_extra(Type old) {
134  Env.GVN.add_mono(this); // Can update crushed
135  }
136 
137  @Override TypeObj valueobj() {
138  // Gather args and produce a TypeStruct
139  TypeFld[] ts = TypeFlds.get(_ts.len());
140  for( int i=0; i<ts.length; i++ )
141  ts[i] = _ts.fld(i).make_from((_ts._open && i>0) ? Type.ALL : fld(i)._val);
142  return _ts.make_from(ts); // Pick up field names and mods
143  }
144  @Override TypeStruct dead_type() { return TypeStruct.ANYSTRUCT; }
145 
146  // Only alive fields in the MrgProj escape
147  @Override public TypeMem live_use(GVNGCM.Mode opt_mode, Node def ) {
148  TypeObj to = _live.at(_alias);
149  if( !(to instanceof TypeStruct) ) return to.above_center() ? TypeMem.DEAD : TypeMem.ESCAPE;
150  int idx = _defs.find(def)-1;
151  Type t = ((TypeStruct)to).at(idx);
153  }
154 
155  //@Override public boolean unify( boolean test ) {
156  // // Self should always should be a TObj
157  // TV2 tvar = tvar();
158  // if( tvar.is_dead() ) return false;
159  // assert tvar.isa("Obj");
160  // // Structural unification on all fields
161  // boolean progress=false;
162  // for( int i=0; i<_ts._flds.length; i++ ) {
163  // progress |= tvar.unify_at(_ts._flds[i],tvar(def_idx(i)),test);
164  // if( progress && test ) return true;
165  // }
166  // return progress;
167  //}
168 }
com.cliffc.aa.node.NewObjNode.exists
boolean exists(String name)
Definition: NewObjNode.java:38
com.cliffc.aa.node.NewObjNode.add_flow_extra
void add_flow_extra(Type old)
Definition: NewObjNode.java:133
com.cliffc.aa.type.Type.NSCALR
static final Type NSCALR
Definition: Type.java:330
com.cliffc.aa.type.TypeFld.Access.Final
Final
Definition: TypeFld.java:112
com.cliffc.aa.node.NewObjNode.NewObjNode
NewObjNode(boolean is_closure, int alias, TypeStruct ts, Node clo)
Definition: NewObjNode.java:32
com.cliffc.aa.type.TypeFlds.get
TypeFld[] get()
Definition: TypeFlds.java:59
com.cliffc.aa.type.TypeObj.above_center
boolean above_center()
Definition: TypeObj.java:77
com.cliffc.aa.type.TypeMem.DEAD
static final TypeMem DEAD
Definition: TypeMem.java:226
com.cliffc.aa.node.NewObjNode.no_more_fields
void no_more_fields()
Definition: NewObjNode.java:48
com.cliffc.aa.node.NewObjNode.live_use
TypeMem live_use(GVNGCM.Mode opt_mode, Node def)
Definition: NewObjNode.java:147
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.aa.node.NewObjNode.update
void update(String tok, Access mutable, Node val)
Definition: NewObjNode.java:64
com.cliffc.aa.type.Bits.clear
B clear(int bit)
Definition: Bits.java:255
com.cliffc.aa.GVNGCM.add_mono
public< N extends Node > N add_mono(N n)
Definition: GVNGCM.java:51
com.cliffc.aa.GVNGCM.add_flow_uses
void add_flow_uses(Node n)
Definition: GVNGCM.java:55
com.cliffc.aa.type.Type.SCALAR
static final Type SCALAR
Definition: Type.java:328
com.cliffc
com.cliffc.aa.node.NewObjNode.ideal_mono
Node ideal_mono()
Definition: NewObjNode.java:116
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
com.cliffc.aa.node.Node
Definition: Node.java:16
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.TypeFld.is_display_ptr
boolean is_display_ptr()
Definition: TypeFld.java:190
com.cliffc.aa.type.TypeMem.ESCAPE
static final TypeMem ESCAPE
Definition: TypeMem.java:227
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.type.TypeStruct.crush
TypeStruct crush()
Definition: TypeStruct.java:1092
com.cliffc.aa.AA.MEM_IDX
static final int MEM_IDX
Definition: AA.java:14
com.cliffc.aa.type.BitsAlias
Definition: BitsAlias.java:8
com.cliffc.aa.type.TypeTuple
Definition: TypeTuple.java:11
com.cliffc.aa.type.TypeFld.Access.RW
RW
Definition: TypeFld.java:111
com.cliffc.aa.node.Node._val
Type _val
Definition: Node.java:88
com.cliffc.aa.node.NewObjNode.add_fun
FunPtrNode add_fun(Parse bad, String name, FunPtrNode ptr)
Definition: NewObjNode.java:76
com.cliffc.aa.type.TypeFlds
Definition: TypeFlds.java:8
com.cliffc.aa.type.Type.ANY
static final Type ANY
Definition: Type.java:325
com.cliffc.aa.node.Node.add_def
Node add_def(Node n)
Definition: Node.java:152
com.cliffc.aa.node.NewObjNode.set_name
void set_name(TypeStruct name)
Definition: NewObjNode.java:45
com.cliffc.aa.node.FunPtrNode
Definition: FunPtrNode.java:40
com.cliffc.aa.node.NewNode< TypeStruct >::setsm
final void setsm(T ts)
Definition: NewNode.java:62
com.cliffc.aa.type.TypeStruct
A memory-based collection of optionally named fields.
Definition: TypeStruct.java:50
com.cliffc.aa.type.Bits.test
static boolean test(long[] bits, int i)
Definition: Bits.java:224
com.cliffc.aa.node.NewObjNode.NewObjNode
NewObjNode(boolean is_closure, TypeStruct disp, Node clo)
Definition: NewObjNode.java:25
com.cliffc.aa.type.Type.ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.type.BitsAlias.REC
static final int REC
Definition: BitsAlias.java:25
com.cliffc.aa.Env.GVN
static final GVNGCM GVN
Definition: Env.java:13
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.node.NewNode< TypeStruct >::def_idx
static int def_idx(int fld)
Definition: NewNode.java:52
com.cliffc.aa.type.Type.above_center
boolean above_center()
Definition: Type.java:741
com.cliffc.aa.node.NewNode< TypeStruct >::fld
Node fld(int fld)
Definition: NewNode.java:53
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.node.NewObjNode.valueobj
TypeObj valueobj()
Definition: NewObjNode.java:137
com.cliffc.aa.type.TypeObj.ISUSED
static final TypeObj ISUSED
Definition: TypeObj.java:45
com.cliffc.aa.node.NewNode< TypeStruct >::ptr
ProjNode ptr()
Definition: NewNode.java:163
com.cliffc.aa.node.NewObjNode._is_closure
final boolean _is_closure
Definition: NewObjNode.java:21
com.cliffc.aa.GVNGCM
Definition: GVNGCM.java:12
com.cliffc.aa.node.NewObjNode.update
void update(int fidx, Access mutable, Node val)
Definition: NewObjNode.java:66
com.cliffc.aa.node.NewNode< TypeStruct >::sets
final void sets(T ts)
Definition: NewNode.java:57
com.cliffc.aa.node.NewObjNode.create
void create(String name, Node val, Access mutable)
Definition: NewObjNode.java:51
com.cliffc.aa.node.NewNode< TypeStruct >::_ts
T _ts
Definition: NewNode.java:25
com.cliffc.aa.node.NewObjNode
Definition: NewObjNode.java:20
com.cliffc.aa.node.Node.con
static Node con(Type t)
Definition: Node.java:670
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.type.TypeStruct.len
int len(TypeStruct tt)
Definition: TypeStruct.java:865
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.node.UnresolvedNode
Definition: UnresolvedNode.java:13
com.cliffc.aa.type.TypeStruct.fld
TypeFld fld(int idx)
Definition: TypeStruct.java:1012
com.cliffc.aa.node.NewNode
Definition: NewNode.java:17
com.cliffc.aa.node.Node.is_forward_ref
boolean is_forward_ref()
Definition: Node.java:830
com.cliffc.aa.node.NewNode< TypeStruct >::_crushed
TypeObj _crushed
Definition: NewNode.java:31
com.cliffc.aa.type.TypeMem.LESC_NO_DISP
static final TypeMem LESC_NO_DISP
Definition: TypeMem.java:226
com.cliffc.aa.node.Node.set_def
Node set_def(int idx, Node n)
Definition: Node.java:154
com.cliffc.aa.Env.LEX_DISPLAYS
static BitsAlias LEX_DISPLAYS
Definition: Env.java:31
com.cliffc.aa.node.NewObjNode.create_active
void create_active(String name, Node val, Access mutable)
Definition: NewObjNode.java:57
com.cliffc.aa.node.Node.xval
Type xval()
Definition: Node.java:460
com.cliffc.aa.GVNGCM.add_flow
public< N extends Node > N add_flow(N n)
Definition: GVNGCM.java:50
com.cliffc.aa.node.NewNode< TypeStruct >::_alias
int _alias
Definition: NewNode.java:20
com.cliffc.aa.type.TypeFld.Access
Definition: TypeFld.java:109
com.cliffc.aa.node.NewObjNode.dead_type
TypeStruct dead_type()
Definition: NewObjNode.java:144
com.cliffc.aa.node.NewObjNode.is_mutable
boolean is_mutable(String name)
Definition: NewObjNode.java:39
com.cliffc.aa.Env.ANY
static ConNode ANY
Definition: Env.java:24
com
com.cliffc.aa.type.TypeStruct.ANYSTRUCT
static final TypeStruct ANYSTRUCT
Definition: TypeStruct.java:227
com.cliffc.aa.node.NewObjNode._fld_starts
Parse[] _fld_starts
Definition: NewObjNode.java:22
com.cliffc.aa.node.NewObjNode.promote_forward
void promote_forward(NewObjNode parent)
Definition: NewObjNode.java:94
com.cliffc.aa.Env.DEFMEM
static DefMemNode DEFMEM
Definition: Env.java:19
com.cliffc.aa.Env
Definition: Env.java:12
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14
com.cliffc.aa.Parse
an implementation of language AA
Definition: Parse.java:68
com.cliffc.aa.GVNGCM.Mode
Definition: GVNGCM.java:14
com.cliffc.aa.type.TypeMemPtr.make
static TypeMemPtr make(BitsAlias aliases, TypeObj obj)
Definition: TypeMemPtr.java:66