aa
TypeStr.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 
7 import java.util.HashMap;
8 import java.util.function.Predicate;
9 
10 import static com.cliffc.aa.type.TypeFld.Access;
11 
12 // Strings. Just an alternative TypeObj to TypeStruct - but basically really
13 // should be replaced with a named Array.
14 public class TypeStr extends TypeObj<TypeStr> {
15  private String _con; //
16  private TypeStr init(String name, boolean any, String con ) {
17  super.init(TSTR,name,any,any);
18  _con = con;
19  return this;
20  }
21  @Override int compute_hash() { return super.compute_hash() + (_con==null ? 0 : _con.hashCode()); }
22  @Override public boolean equals( Object o ) {
23  if( this==o ) return true;
24  if( !(o instanceof TypeStr) || !super.equals(o) ) return false;
25  return Util.eq(_con,((TypeStr)o)._con);
26  }
27  @Override public boolean cycle_equals( Type o ) { return equals(o); }
28  @Override public SB str( SB sb, VBitSet dups, TypeMem mem, boolean debug ) {
29  if( _any ) sb.p('~');
30  if( _con == null ) sb.p("str");
31  else sb.p('"').p(_con).p('"');
32  return sb;
33  }
34 
35  static { new Pool(TSTR,new TypeStr()); }
36  public static TypeStr make( String name, boolean any, String con ) {
37  TypeStr t1 = POOLS[TSTR].malloc();
38  return t1.init(name,any,con).hashcons_free();
39  }
40 
41  public static TypeStr make( boolean any, String con ) { return make("",any,con); }
42  public static TypeStr con(String con) { return make(false,con); }
43  public static void init() {} // Used to force class init
44 
45  public static final TypeStr STR = make(false,null); // not null
46  public static final TypeStr XSTR = STR.dual(); // choice string
47  public static final TypeStr ABC = make(false,"abc"); // a string constant
48  private static final TypeStr DEF = con("def"); // a string constant
49  static final TypeStr[] TYPES = new TypeStr[]{STR,ABC,DEF};
50  static void init1( HashMap<String,Type> types ) { types.put("str",TypeMemPtr.STRPTR); }
51  // Return a String from a TypeStr constant; assert otherwise.
52  @Override public String getstr() { assert _con!=null; return _con; }
53 
54  @Override protected TypeStr xdual() { return _con == null ? new TypeStr().init(_name, !_any,_con) : this; }
55  @Override TypeStr rdual() {
56  if( _dual != null ) return _dual;
57  TypeStr dual = _dual = xdual();
58  dual._dual = this;
59  dual._hash = dual.compute_hash();
60  return dual;
61  }
62  @Override protected Type xmeet( Type t ) {
63  switch( t._type ) {
64  case TSTR: break;
65  case TARY:
66  case TLIVE:
67  case TSTRUCT:return OBJ;
68  case TOBJ: return t.xmeet(this);
69  case TFUNSIG:
70  case TTUPLE:
71  case TFUNPTR:
72  case TMEMPTR:
73  case TFLT:
74  case TINT:
75  case TRPC:
76  case TMEM: return ALL;
77  default: throw typerr(t);
78  }
79  TypeStr ts = (TypeStr)t;
80  boolean any = _any&ts._any;
81  String con = null;
82  if( ts._any && ts._con==null ) con = _con;
83  else if( _any && _con==null ) con = ts._con;
84  else if( Util.eq(_con,ts._con) ) con = _con;
85  else any=false;
86  return make("",any,con);
87  }
88 
89  // Update (approximately) the current TypeObj. Strings are not allowed to be
90  // updated, so this is a program type-error.
91  @Override public TypeObj update(Access fin, String fld, Type val) { return this; }
92 
93  @Override public boolean may_be_con() { return super.may_be_con() || _con != null; }
94  @Override public boolean is_con() { return _con != null; }
95  @Override public Type meet_nil(Type t) { return this; }
96  // Widen (loss info), to make it suitable as the default function memory.
97  @Override public TypeObj crush() { return this; }
98 
99  // Lattice of conversions:
100  // -1 unknown; top; might fail, might be free (Scalar->Str); Scalar might lift
101  // to e.g. Float and require a user-provided rounding conversion from F64->Str.
102  // 0 requires no/free conversion (Str->Str)
103  // +1 requires a bit-changing conversion; no auto-unboxing
104  // 99 Bottom; No free converts; e.g. Flt->Str requires explicit rounding
105  @Override public byte isBitShape(Type t) {
106  if( t._type==TNIL || t._type==Type.TSTR || t._type == TOBJ ) return 0;
107  return 99;
108  }
109  @Override public TypeStr widen() { return STR; }
110  @Override public void walk( Predicate<Type> p ) { p.test(this); }
111 }
com.cliffc.aa.type.TypeStr.walk
void walk(Predicate< Type > p)
Definition: TypeStr.java:110
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.TypeObj< TypeStr >::_any
boolean _any
Definition: TypeObj.java:16
com.cliffc
com.cliffc.aa.type.TypeFld
Definition: TypeFld.java:12
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.TypeStr.isBitShape
byte isBitShape(Type t)
Definition: TypeStr.java:105
com.cliffc.aa.type.TypeStr.init1
static void init1(HashMap< String, Type > types)
Definition: TypeStr.java:50
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.type.Type.TSTR
static final byte TSTR
Definition: Type.java:270
com.cliffc.aa.type.TypeStr.DEF
static final TypeStr DEF
Definition: TypeStr.java:48
com.cliffc.aa.type.Type._type
byte _type
Definition: Type.java:98
com.cliffc.aa.type.TypeStr.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: TypeStr.java:28
com.cliffc.aa.type.TypeStr.xdual
TypeStr xdual()
Definition: TypeStr.java:54
com.cliffc.aa.type.TypeStr.make
static TypeStr make(String name, boolean any, String con)
Definition: TypeStr.java:36
com.cliffc.aa.type.TypeStr.crush
TypeObj crush()
Definition: TypeStr.java:97
com.cliffc.aa.type.TypeStr._con
String _con
Definition: TypeStr.java:15
com.cliffc.aa.type.TypeStr.is_con
boolean is_con()
Definition: TypeStr.java:94
com.cliffc.aa.type.TypeObj< TypeStr >::OBJ
static final TypeObj OBJ
Definition: TypeObj.java:44
com.cliffc.aa.type.TypeObj
Definition: TypeObj.java:15
com.cliffc.aa.type.TypeStr.compute_hash
int compute_hash()
Definition: TypeStr.java:21
com.cliffc.aa.type.TypeStr.make
static TypeStr make(boolean any, String con)
Definition: TypeStr.java:41
com.cliffc.aa.type.TypeStr.ABC
static final TypeStr ABC
Definition: TypeStr.java:47
com.cliffc.aa.util.Util
Definition: Util.java:5
com.cliffc.aa.type.TypeStr.init
static void init()
Definition: TypeStr.java:43
com.cliffc.aa.type.Type.xmeet
Type xmeet(Type t)
Definition: Type.java:461
com.cliffc.aa.type.TypeStr.XSTR
static final TypeStr XSTR
Definition: TypeStr.java:46
com.cliffc.aa.type.TypeStr.rdual
TypeStr rdual()
Definition: TypeStr.java:55
com.cliffc.aa.type.TypeStr.con
static TypeStr con(String con)
Definition: TypeStr.java:42
com.cliffc.aa.type.TypeStr
Definition: TypeStr.java:14
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.util.SB
Tight/tiny StringBuilder wrapper.
Definition: SB.java:8
com.cliffc.aa.type.TypeStr.widen
TypeStr widen()
Definition: TypeStr.java:109
com.cliffc.aa.type.TypeStr.init
TypeStr init(String name, boolean any, String con)
Definition: TypeStr.java:16
com.cliffc.aa.type.TypeStr.getstr
String getstr()
Definition: TypeStr.java:52
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.type.TypeStr.update
TypeObj update(Access fin, String fld, Type val)
Definition: TypeStr.java:91
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.type.TypeStr.meet_nil
Type meet_nil(Type t)
Definition: TypeStr.java:95
com.cliffc.aa.type.TypeStr.cycle_equals
boolean cycle_equals(Type o)
Definition: TypeStr.java:27
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.TypeMemPtr.STRPTR
static final TypeMemPtr STRPTR
Definition: TypeMemPtr.java:97
com.cliffc.aa.type.TypeStr.may_be_con
boolean may_be_con()
Definition: TypeStr.java:93
com
com.cliffc.aa.type.TypeStr.xmeet
Type xmeet(Type t)
Definition: TypeStr.java:62
com.cliffc.aa.type.TypeStr.equals
boolean equals(Object o)
Definition: TypeStr.java:22
com.cliffc.aa.type.TypeStr.TYPES
static final TypeStr[] TYPES
Definition: TypeStr.java:49
com.cliffc.aa.type
Definition: Bits.java:1
com.cliffc.aa.type.TypeMemPtr
Definition: TypeMemPtr.java:14