aa
TypeFld.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.Util;
5 import com.cliffc.aa.util.VBitSet;
6 import org.jetbrains.annotations.NotNull;
7 
8 import java.util.function.Predicate;
9 
10 
11 // A field in a TypeStruct
12 public class TypeFld extends Type<TypeFld> {
13  // Field names are never null, and never zero-length. If the 1st char is a
14  // '*' the field is Top; a '.' is Bot; all other values are valid field names.
15  public @NotNull String _fld; // The field name
16  public Type _t; // Field type. Usually some type of Scalar, or ANY or ALL.
17  public Access _access; // Field access type: read/write, final, read/only
18  public int _order; // Field order in the struct, or -1 for undefined (Bot) or -2 for conforming (top)
19 
20  private TypeFld init( @NotNull String fld, Type t, Access access, int order ) {
21  super.init(TFLD,"");
22  assert !(t instanceof TypeFld);
23  _fld=fld; _t=t; _access=access; _order=order;
24  _hash = compute_hash();
25  return this;
26  }
27 
28  // Note: hash does not depend on field type, to support building cyclic TypeStructs.
29  @Override public int compute_hash() { return _fld.hashCode()+_access.hashCode()+_order; }
30  @Override public boolean equals( Object o ) {
31  if( this==o ) return true;
32  if( !(o instanceof TypeFld) ) return false;
33  TypeFld t = (TypeFld)o;
34  return Util.eq(_fld,t._fld) && _t==t._t && _access==t._access && _order==t._order;
35  }
36  @Override public boolean cycle_equals( Type o ) {
37  if( this==o ) return true;
38  if( !(o instanceof TypeFld) ) return false;
39  TypeFld t2 = (TypeFld)o;
40  if( !Util.eq(_fld,t2._fld) || _access!=t2._access || _order!=t2._order ) return false;
41  return _t == t2._t || _t.cycle_equals(t2._t);
42  }
43 
44  @Override public SB str( SB sb, VBitSet dups, TypeMem mem, boolean debug ) {
45  if( dups.tset(_uid) ) return sb.p('$'); // Break recursive printing cycle
46  if( !TypeStruct.isDigit(_fld.charAt(0)) ) // Do not print number-named fields for tuples
47  _access.str(sb.p(_fld),debug);
48  return _t==null ? sb.p('!') : (_t==Type.SCALAR ? sb : _t.str(sb,dups,mem,debug));
49  }
50 
51  // Split malloc/hashcons is used when making cyclic structures
52  static { new Pool(TFLD,new TypeFld()); }
53  public static TypeFld malloc( String fld, Type t, Access access, int order ) {
54  return POOLS[TFLD].<TypeFld>malloc().init(fld,t,access,order);
55  }
56  public static TypeFld malloc( String fld, Type t, int order ) { return malloc(fld,t,Access.Final,order); }
57 
58  public static TypeFld make( String fld, Type t, int order ) { return make(fld,t,Access.Final,order); }
59  public static TypeFld make( String fld, Type t, Access access, int order ) { return malloc(fld,t,access,order).hashcons_free(); }
60 
61  // Some convenient default constructors
62  private static final String[] ARGS = new String[]{"^","x","y","z"};
63  private static final String[] TUPS = new String[]{"^","0","1","2"};
64  public static TypeFld make_arg( Type t, int order ) { return make(ARGS[order],t,Access.Final,order); }
65  public static TypeFld make_tup( Type t, int order ) { return make(TUPS[order],t,Access.Final,order); }
66  public TypeFld make_from(Type t) { return t==_t ? this : make(_fld,t,_access,_order); }
67  public TypeFld make_from(Type t, Access a) { return (t==_t && a==_access) ? this : make(_fld,t,a,_order); }
68 
69  @Override protected TypeFld xdual() { return malloc(sdual(_fld),_t._dual,_access.dual(),odual(_order)); }
70  @Override protected TypeFld rdual() {
71  if( _dual != null ) return _dual;
72  // Make a dual without recursion
74  dual.setX(_t.rdual()); // Now recurse
75  dual._dual = this;
76  assert _hash!=0 && dual._hash!=0;
77  return dual;
78  }
79 
80  @Override protected TypeFld xmeet( Type tf ) {
81  if( this==tf ) return this;
82  if( tf._type != TFLD ) throw typerr(tf);
83  TypeFld f = (TypeFld)tf;
84  String fld = smeet(_fld, f._fld) ;
85  Type t = _t .meet(f._t );
86  Access access= _access.meet(f._access);
87  int order = omeet(_order,f._order);
88  return make(fld,t,access,order);
89  }
90 
91  // Used during cyclic struct meets, either side (but not both) might be null,
92  // and the _t field is not filled in. A new TypeFld is returned.
93  static TypeFld cmeet(TypeFld f0, TypeFld f1) {
94  if( f0==null ) return malloc(f1._fld,null,f1._access,f1._order);
95  if( f1==null ) return malloc(f0._fld,null,f0._access,f0._order);
96  String fld = smeet(f0._fld, f1._fld);
97  Access access= f0._access.meet(f1._access);
98  int order = omeet(f0._order,f1._order);
99  return malloc(fld,null,access,order);
100  }
101  // Used during cyclic struct meets. The LHS is meeted into directly.
102  // The _t field is not filled in.
103  void cmeet(TypeFld f) {
104  _fld = smeet(_fld,f._fld);
106  _order = omeet(_order,f._order);
107  }
108 
109  public enum Access {
110  ReadOnly, // Read-Only; other threads can Write
111  RW, // Read/Write
112  Final, // No future load will ever see a different value than any final store
113  NoAccess, // Cannot access (either read or write)
117  public static final Access[] values = values();
118  static Access bot() { return ReadOnly; }
119  Access dual() { return values[("6453120".charAt(ordinal()))-'0']; }
120  private static final String[] FMEET = {
121  /* 0123456 */
122  /*0*/"0000000",
123  /*1*/"0101111",
124  /*2*/"0022222",
125  /*3*/"0123333",
126  /*4*/"0123434",
127  /*5*/"0123355",
128  /*6*/"0123456",
129  };
130  Access meet(Access a) { return values[FMEET[ordinal()].charAt(a.ordinal())-'0']; }
131  private static final String[] SHORTS = new String[]{"==",":=","=","~=","!:=!","!=!","!~=!"};
132  private static final String[] LONGS = new String[]{"read-only","read/write","final","noaccess","!:=!","!=!","!~=!"};
133  @Override public String toString() { return LONGS[ordinal()]; }
134  public SB str(SB sb, boolean debug) { return sb.p(SHORTS[ordinal()]); }
135 
136  };
137 
138  // Field names
139  public static final String fldTop = "\\";
140  public static final String fldBot = "." ;
141  // String dual
142  private static String sdual(String s) {
143  if( Util.eq(s,fldTop) ) return fldBot;
144  if( Util.eq(s,fldBot) ) return fldTop;
145  return s;
146  }
147  // String meet
148  private static String smeet( String s0, String s1 ) {
149  if( Util.eq(s0,s1) ) return s0;
150  if( Util.eq(s0,fldTop) ) return s1;
151  if( Util.eq(s1,fldTop) ) return s0;
152  return fldBot;
153  }
154 
155  // Field order, -1 is undefined (bot) and -2 is conforming (top)
156  private static final int oTop = -1;
157  private static final int oBot = -2;
158  private static int odual( int order ) {
159  if( order==oTop ) return oBot;
160  if( order==oBot ) return oTop;
161  return order;
162  }
163  private static int omeet( int o0, int o1 ) {
164  if( o0==o1 ) return o0;
165  if( o0==oTop ) return o1;
166  if( o1==oTop ) return o0;
167  return oBot;
168  }
169 
170  public static final TypeFld NO_DISP = make("^",Type.ANY,Access.Final,0);
171 
172  // Setting the type during recursive construction.
173  public TypeFld setX(Type t) {
174  assert !(t instanceof TypeFld);
175  if( _t==t) return this; // No change
176  assert _dual==null; // Not interned
177  _t = t;
178  return this;
179  }
180  public TypeFld setX(Type t, Access access) {
181  assert !(t instanceof TypeFld);
182  if( _t==t && _access==access ) return this; // No change
183  assert _dual==null; // Not interned
184  _t = t;
185  _access = access;
186  return this;
187  }
188 
189  // If this is a display field
190  @Override public boolean is_display_ptr() { return _order==0 && Util.eq(_fld,"^") && _t.is_display_ptr(); }
191 
192  @Override public TypeFld simple_ptr() { return make_from(_t.simple_ptr()); }
193  @SuppressWarnings("unchecked")
194  @Override public void walk( Predicate<Type> p ) { if( p.test(this) ) _t.walk(p); }
195 
196  // Simple string find on an array
197  static int fld_find(TypeFld[] flds, String fld) {
198  for( int i=0; i<flds.length; i++ )
199  if( Util.eq(flds[i]._fld,fld) )
200  return i;
201  return -1;
202  }
203 
204  // Make a Type, replacing all dull pointers from the matching types in mem.
205  @Override public TypeFld make_from(Type head, TypeMem mem, VBitSet visit) {
206  return setX(_t.make_from(head,mem,visit)).hashcons_free();
207  }
208  // Used for assertions
209  @Override boolean intern_check1() { return _t.intern_lookup()!=null; }
210 
211 }
212 
com.cliffc.aa.type.TypeFld.Access.Final
Final
Definition: TypeFld.java:112
com.cliffc.aa.type.TypeFld.TUPS
static final String[] TUPS
Definition: TypeFld.java:63
com.cliffc.aa.type.TypeFld.make_tup
static TypeFld make_tup(Type t, int order)
Definition: TypeFld.java:65
com.cliffc.aa.type.TypeFld.xmeet
TypeFld xmeet(Type tf)
Definition: TypeFld.java:80
com.cliffc.aa.type.TypeFld.equals
boolean equals(Object o)
Definition: TypeFld.java:30
com.cliffc.aa.type.TypeFld.sdual
static String sdual(String s)
Definition: TypeFld.java:142
com.cliffc.aa.type.Type< TypeFld >::typerr
RuntimeException typerr(Type t)
Definition: Type.java:947
com.cliffc.aa.type.TypeFld._order
int _order
Definition: TypeFld.java:18
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.type.Type.SCALAR
static final Type SCALAR
Definition: Type.java:328
com.cliffc
com.cliffc.aa.type.Type< TypeFld >::_hash
int _hash
Definition: Type.java:97
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
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.TypeFld.malloc
static TypeFld malloc(String fld, Type t, int order)
Definition: TypeFld.java:56
com.cliffc.aa.type.TypeFld.setX
TypeFld setX(Type t, Access access)
Definition: TypeFld.java:180
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.type.TypeFld.xdual
TypeFld xdual()
Definition: TypeFld.java:69
com.cliffc.aa.type.Type._type
byte _type
Definition: Type.java:98
com.cliffc.aa.type.TypeFld.Access.RW
RW
Definition: TypeFld.java:111
com.cliffc.aa.type.TypeFld.NO_DISP
static final TypeFld NO_DISP
Definition: TypeFld.java:170
com.cliffc.aa.type.TypeFld.cmeet
static TypeFld cmeet(TypeFld f0, TypeFld f1)
Definition: TypeFld.java:93
com.cliffc.aa.type.TypeFld.smeet
static String smeet(String s0, String s1)
Definition: TypeFld.java:148
com.cliffc.aa.type.Type.ANY
static final Type ANY
Definition: Type.java:325
com.cliffc.aa.type.Type.meet
final Type meet(Type t)
Definition: Type.java:412
com.cliffc.aa.type.TypeStruct
A memory-based collection of optionally named fields.
Definition: TypeStruct.java:50
com.cliffc.aa.type.TypeFld.make
static TypeFld make(String fld, Type t, int order)
Definition: TypeFld.java:58
com.cliffc.aa.type.Type.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: Type.java:131
com.cliffc.aa.type.TypeFld.make_from
TypeFld make_from(Type t, Access a)
Definition: TypeFld.java:67
com.cliffc.aa.type.TypeFld.rdual
TypeFld rdual()
Definition: TypeFld.java:70
com.cliffc.aa.type.Type.cycle_equals
boolean cycle_equals(Type t)
Definition: Type.java:118
com.cliffc.aa.type.TypeFld.make
static TypeFld make(String fld, Type t, Access access, int order)
Definition: TypeFld.java:59
com.cliffc.aa.util.VBitSet.tset
boolean tset(int idx)
Definition: VBitSet.java:7
com.cliffc.aa.type.TypeFld.cycle_equals
boolean cycle_equals(Type o)
Definition: TypeFld.java:36
com.cliffc.aa.type.TypeFld.odual
static int odual(int order)
Definition: TypeFld.java:158
com.cliffc.aa.type.Type.rdual
T rdual()
Definition: Type.java:366
com.cliffc.aa.type.TypeFld.fldBot
static final String fldBot
Definition: TypeFld.java:140
com.cliffc.aa.type.TypeFld.setX
TypeFld setX(Type t)
Definition: TypeFld.java:173
com.cliffc.aa.type.TypeFld.ARGS
static final String[] ARGS
Definition: TypeFld.java:62
com.cliffc.aa.type.TypeFld._access
Access _access
Definition: TypeFld.java:17
com.cliffc.aa.type.Type< TypeFld >::TFLD
static final byte TFLD
Definition: Type.java:271
com.cliffc.aa.type.Type._dual
T _dual
Definition: Type.java:100
com.cliffc.aa.util.Util
Definition: Util.java:5
com.cliffc.aa.type.Type.make_from
Type make_from(Type head, TypeMem map, VBitSet visit)
Definition: Type.java:945
com.cliffc.aa.type.TypeStruct.isDigit
static boolean isDigit(char c)
Definition: TypeStruct.java:140
com.cliffc.aa.type.TypeFld._fld
String _fld
Definition: TypeFld.java:15
com.cliffc.aa.type.TypeFld.Access.toString
String toString()
Definition: TypeFld.java:133
com.cliffc.aa.type.TypeFld.fldTop
static final String fldTop
Definition: TypeFld.java:139
com.cliffc.aa.type.TypeFld.Access.str
SB str(SB sb, boolean debug)
Definition: TypeFld.java:134
com.cliffc.aa.type.TypeFld.Access.values
static final Access[] values
Definition: TypeFld.java:117
com.cliffc.aa.type.TypeFld.Access.HiFinal
HiFinal
Definition: TypeFld.java:115
com.cliffc.aa.type.Type.simple_ptr
Type simple_ptr()
Definition: Type.java:358
com.cliffc.aa.type.TypeFld.Access.dual
Access dual()
Definition: TypeFld.java:119
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.type.TypeFld.cmeet
void cmeet(TypeFld f)
Definition: TypeFld.java:103
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.TypeFld.malloc
static TypeFld malloc(String fld, Type t, Access access, int order)
Definition: TypeFld.java:53
com.cliffc.aa.type.TypeFld.walk
void walk(Predicate< Type > p)
Definition: TypeFld.java:194
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.TypeFld.Access.ReadOnly
ReadOnly
Definition: TypeFld.java:110
com.cliffc.aa.type.Type< TypeFld >::_uid
int _uid
Definition: Type.java:96
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.type.TypeFld.make_from
TypeFld make_from(Type head, TypeMem mem, VBitSet visit)
Definition: TypeFld.java:205
com.cliffc.aa.type.TypeFld.simple_ptr
TypeFld simple_ptr()
Definition: TypeFld.java:192
com.cliffc.aa.type.TypeFld.oBot
static final int oBot
Definition: TypeFld.java:157
com.cliffc.aa.type.TypeFld.Access.meet
Access meet(Access a)
Definition: TypeFld.java:130
com.cliffc.aa.type.Type.walk
void walk(Predicate< Type > p)
Definition: Type.java:936
com.cliffc.aa.type.TypeFld.oTop
static final int oTop
Definition: TypeFld.java:156
com.cliffc.aa.type.Type< TypeFld >::dual
final T dual()
Definition: Type.java:361
com.cliffc.aa.type.TypeFld._t
Type _t
Definition: TypeFld.java:16
com.cliffc.aa.type.Type< TypeFld >::POOLS
static final Pool[] POOLS
Definition: Type.java:281
com.cliffc.aa.type.TypeFld.Access.HiNoAccess
HiNoAccess
Definition: TypeFld.java:116
com.cliffc.aa.type.TypeFld.Access
Definition: TypeFld.java:109
com.cliffc.aa.type.Type.intern_lookup
Type intern_lookup()
Definition: Type.java:210
com.cliffc.aa.type.TypeFld.init
TypeFld init( @NotNull String fld, Type t, Access access, int order)
Definition: TypeFld.java:20
com.cliffc.aa.type.TypeFld.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: TypeFld.java:44
com.cliffc.aa.type.TypeFld.make_arg
static TypeFld make_arg(Type t, int order)
Definition: TypeFld.java:64
com
com.cliffc.aa.type.TypeFld.Access.bot
static Access bot()
Definition: TypeFld.java:118
com.cliffc.aa.type.TypeFld.fld_find
static int fld_find(TypeFld[] flds, String fld)
Definition: TypeFld.java:197
com.cliffc.aa.type.TypeFld.Access.NoAccess
NoAccess
Definition: TypeFld.java:113
com.cliffc.aa.type.TypeFld.make_from
TypeFld make_from(Type t)
Definition: TypeFld.java:66
com.cliffc.aa.type.TypeFld.omeet
static int omeet(int o0, int o1)
Definition: TypeFld.java:163
com.cliffc.aa.type.TypeFld.Access.HiReadWrite
HiReadWrite
Definition: TypeFld.java:114
com.cliffc.aa.type.TypeFld.intern_check1
boolean intern_check1()
Definition: TypeFld.java:209
com.cliffc.aa.type.TypeFld.compute_hash
int compute_hash()
Definition: TypeFld.java:29