Go to the documentation of this file. 1 package com.cliffc.aa.HM;
5 import org.jetbrains.annotations.
NotNull;
73 static final HashMap<String,PrimSyn>
PRIMSYNS =
new HashMap<>();
78 static final boolean DO_HM =
true;
81 public static Root hm( String sprog ) {
85 for(
PrimSyn prim :
new PrimSyn[]{
new If(),
new Pair1(),
new Pair(),
new EQ(),
new EQ0(),
new Mul(),
new Dec(),
new Str(),
new Triple(),
new Factor(),
new IsEmpty(),
new NotNil()} )
92 int cnt_syns = prog.
prep_tree(
null,
null,work);
93 int init_T2s =
T2.
CNT;
95 while( work.
len()>0 ) {
97 assert work.
_cnt<1000;
114 if( syn.
_par!=
null ) {
126 System.out.println(
"Initial T2s: "+init_T2s+
", Prog size: "+cnt_syns+
", worklist iters: "+work.
_cnt+
", T2s: "+
T2.
CNT);
142 private static int X;
143 private static byte[]
BUF;
149 if(
skipWS() != -1 )
throw unimpl(
"Junk at end of program: "+
new String(
BUF,
X,
BUF.length-
X));
151 return new Root(prog);
154 if(
skipWS()==-1 )
return null;
165 if( fun instanceof
If &&
166 args.
at(0) instanceof
Ident ) {
188 return prim==
null ?
new Ident(
id) : prim.
make();
206 if( fld==
null )
throw unimpl(
"Missing term for field "+
id);
221 throw unimpl(
"Unknown syntax");
224 private static String
id() {
229 if( s.length()==0 )
throw unimpl(
"Missing id");
236 sum = sum*10+
BUF[
X++]-
'0';
240 float f = (float)sum;
241 f = f + (
BUF[
X++]-
'0')/10.0f;
246 while(
X<
BUF.length &&
BUF[
X]!=
'"' )
X++;
253 private static boolean isWS (
byte c) {
return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\r'; }
254 private static boolean isDigit (
byte c) {
return '0' <= c && c <=
'9'; }
255 private static boolean isAlpha0(
byte c) {
return (
'a'<=c && c <=
'z') || (
'A'<=c && c <=
'Z') || (c==
'_') || (c==
'*') || (c==
'?'); }
256 private static boolean isAlpha1(
byte c) {
return isAlpha0(c) || (
'0'<=c && c <=
'9') || (c==
'/'); }
257 private static void require(
char c) {
if(
skipWS()!=c )
throw unimpl(
"Missing '"+c+
"'");
X++; }
261 for(
int i=0; i<s.length(); i++ )
262 if(
X+i >=
BUF.length ||
BUF[
X+i]!=s.charAt(i) )
263 throw unimpl(
"Missing '"+s+
"'");
272 private final HashSet<Syntax>
_work =
new HashSet<>();
301 for(
VStack vs =
this; vs!=
null; vs = vs.
_par )
302 vs._nongen.get_dups(dups);
311 @NotNull @Override
public Iterator<T2>
iterator() {
return new Iter(); }
312 private class Iter implements Iterator<T2> {
363 if( work.
has(
this) )
return true;
382 return p2(sb.
ii(1),dups).
di(1);
435 syn.prep_lookup_deps(
this);
439 if( syn instanceof
Lambda ) {
443 }
else if( syn instanceof
Let ) {
449 throw new RuntimeException(
"Parse error, "+
_name+
" is undefined");
481 for( String arg :
_args ) sb.
p(arg).
p(
' ');
486 for(
int i=0; i<
_args.length; i++ ) {
492 return sb.
p(
" -> ... } ");
497 boolean progress =
false;
500 if( old.
is_err() )
return false;
502 for(
int i=0; i<
_targs.length; i++ )
504 { progress=
true;
break; }
512 return old.
unify(fun,work);
517 for(
int i=0; i<
_targs.length; i++ )
534 for(
int i=0; i<
_args.length; i++ )
591 @Override
SB p1(
SB sb) {
return sb.
p(
"(...)"); }
601 boolean progress =
false;
608 if(
str!=
null &&
str.is_struct() ) {
610 if( !aliases.
test(0) ) {
611 str._alias =
str._alias.meet_nil();
613 if( work==
null )
return true;
625 if( work==
null )
return true;
627 for(
int i=0; i<
_args.length; i++ )
631 progress = tfun.
unify(nfun,work);
638 for(
int i=0; i<
_args.length; i++ ) {
640 if( progress && work==
null )
return true;
641 if( (tfun=tfun.
find()).is_err() )
return find().
unify(tfun,work);
645 if( (tfun=tfun.
find()).is_err() )
return find().
unify(tfun,work);
653 static private final HashMap<T2,Type>
T2MAP =
new HashMap<>();
664 for(
int fidx : tfp.
_fidxs )
678 {
WDUPS.
clear(); arg.find().walk_types_in(arg._flow); }
681 rez = rez2.
join(rez);
699 for(
int i=0; i<fun.
_types.length; i++ ) {
703 if( formal != rez ) {
707 if( i==0 && fun instanceof
If ) work.
push(fun);
717 for(
Syntax arg :
_args ) cnt += arg.prep_tree(
this,nongen,work);
719 if(
str!=
null )
str.push_update(
this);
725 for(
Syntax arg :
_args )
if( !arg.more_work(work) )
return false;
745 for(
int fidx : fun.
_fidxs )
783 for(
int i=0; i<
_ids.length; i++ ) {
786 if( i <
_ids.length-1 ) sb.
p(
',');
792 for(
int i=0; i<
_ids.length; i++ )
797 boolean progress =
false, must_alloc=
false;
802 if( rec.
is_err() )
return false;
803 for( String
id :
_ids )
805 { must_alloc =
true;
break; }
807 if( work==
null )
return true;
809 for(
int i=0; i<
_ids.length; i++ )
818 for(
int i=0; i<rec.
_ids.length; i++ ) {
820 if( work==
null )
return true;
826 for(
int i=0; i<
_ids.length; i++ ) {
829 if( work==
null && progress )
return true;
842 for(
int i=0; i<
_flds.length; i++ )
853 for(
int i=0; i<
_flds.length; i++ ) {
862 if( !fld.more_work(work) )
877 if(
find().is_err() )
return false;
885 if( work==
null )
return true;
908 if( idx!=-1 )
return tstr.
at(idx);
939 private static final String[][]
IDS =
new String[][] {
946 super(
null,
IDS[t2s.length-1]);
948 for(
int i=0; i<
_targs.length; i++ )
958 if( old.
is_err() )
return false;
960 for(
int i=0; i<
_targs.length; i++ )
961 if(
targ(i).is_err() )
979 @Override String
name() {
return "pair1"; }
981 static HashMap<Type,Pair1X>
PAIR1S =
new HashMap<>();
1013 @Override String
name() {
return "pair"; }
1030 @Override String
name() {
return "triple"; }
1045 @Override String
name() {
return "if"; }
1083 @Override String
name() {
return "eq"; }
1100 @Override String
name() {
return "?0"; }
1116 @Override String
name() {
return "isempty"; }
1131 @Override String
name() {
return "notnil"; }
1135 int cnt = super.prep_tree(par,nongen,work);
1150 if( arg==ret )
return false;
1151 if( work==
null )
return true;
1167 int i=0;
for( ; i<arg.
_ids.length; i++ ) {
1169 if( idx== -1 || arg.
args(i)!=ret.
args(idx) )
1172 if( i==arg.
_ids.length )
1177 if( work==
null )
return true;
1185 for(
int i=0; i<arg.
_ids.length; i++ ) {
1186 String
id = arg.
_ids[i];
1191 for(
int i=0; i<ret.
_ids.length; i++ ) {
1192 String
id = ret.
_ids[i];
1208 @Override String
name() {
return "*"; }
1228 @Override String
name() {
return "dec"; }
1242 @Override String
name() {
return "str"; }
1257 @Override String
name() {
return "factor"; }
1308 T2 tstr =
new T2(
"@{}",flds);
1330 private T2(@NotNull String name,
T2 @NotNull ...
args) {
1346 if(
_args==
null )
return this;
1348 if( u.
no_uf() )
return u;
1357 if( u==
this || u==
_args[0] )
return u;
1366 return u==uu ? uu : (
_args[i]=uu);
1376 assert
ADUPS.isEmpty();
1394 for(
int i=0; i<
_ids.length; i++ )
1399 for(
int i=0; i<
_ids.length; i++ )
1425 if( this._flow==
null )
return that.
_flow;
1430 if( this._fidxs==
null )
return that.
_fidxs;
1435 if( this._alias==
null )
return that.
_alias;
1440 String[] ids = that.
_ids;
1441 if(
_ids==ids )
return ids;
1442 if(
_ids==
null )
return ids;
1443 if( ids==
null )
return _ids;
1444 if(
_ids.length!=ids.length )
throw unimpl();
1445 for( String
id : ids )
1457 if( this._err==
null )
return that.
_err;
1458 if( that.
_err==
null )
return this.
_err;
1464 if(
_flow !=
null ) cnt++;
1465 if(
_fidxs!=
null ) cnt++;
1466 if(
_err !=
null ) cnt++;
1467 if(
_alias!=
null ) { cnt++; assert
_ids!=
null; }
1468 else assert
_ids==
null;
1477 if(
this==that )
return false;
1478 if( work==
null )
return true;
1480 if(
_flow !=that._flow ||
1484 _open !=that._open ||
1486 work.addAll(that._deps);
1489 return union_err(that,work,
"Cannot unify "+this.
p()+
" and "+that.p());
1496 if( this._flow==
Type.
XNIL && that.is_struct() ) {
1497 that._alias = that._alias.meet_nil();
1500 if( that._err!=
null ) {
1501 that._flow=
null; that._fidxs=
null; that._alias=
null; that._ids=
null;
1506 if(
_deps !=
null ) {
1509 if( that._deps==
null && that._args==
null ) that._deps =
_deps;
1510 else for(
Syntax dep :
_deps ) that.push_update(dep);
1527 static private final HashMap<Long,T2>
DUPS =
new HashMap<>();
1529 if(
this==that )
return false;
1530 assert
DUPS.isEmpty();
1531 boolean progress =
_unify(that,work);
1541 if(
this==that )
return false;
1544 if( this._args==
null && that.
_args==
null ) {
1545 T2 lhs=
this, rhs=that;
1548 { rhs=
this; lhs=that; }
1551 return lhs.
union(rhs,work);
1554 if( this.
is_leaf() || that.
is_err() )
return this.
union(that,work);
1558 return that.
union(
this,work);
1560 return this.
union(that,work);
1565 assert rez==
null || rez==that;
1566 if( rez!=
null )
return false;
1567 DUPS.put(luid,that);
1569 if( work==
null )
return true;
1572 return union_err(that,work,
"Cannot unify "+this.
p()+
" and "+that.
p());
1581 for(
int i=0; i<
_args.length; i++ ) {
1583 if( (that=that.
find()).is_err() )
break;
1599 for(
int i=0; i<
_ids.length; i++ ) {
1604 if( (that=that.
find()).is_err() )
return;
1611 for(
int i=0; i<that.
_ids.length; i++ )
1622 int len =
_ids.length;
1624 int idx = Arrays.binarySearch(
_ids,
id);
1630 System.arraycopy(
_ids,idx,
_ids,idx+1,len-idx);
1631 System.arraycopy(
_args,idx,
_args,idx+1,len-idx);
1644 boolean progress=
false;
1648 String[] ids =
meet_ids (that); progress |= ids != that.
_ids;
1651 if( !progress )
return false;
1652 if( work==
null )
return true;
1662 that.
_flow = that_flow;
1663 String msg =
"Cannot unify "+this.
p()+
" and "+that.
p();
1674 if(
_flow==
null || that_flow==
null )
return true;
1677 if( wthisflow==wthatflow )
return true;
1678 return wthisflow.
isa(wthatflow);
1691 static private final HashMap<T2,T2>
VARS =
new HashMap<>();
1693 assert
VARS.isEmpty() &&
DUPS.isEmpty();
1698 throw unimpl(
"busted, made T2s but just testing");
1705 T2 prior =
VARS.get(
this);
1725 if( work==
null )
return true;
1728 return t2.
_unify(that, work);
1739 return work ==
null ||
vput(that,that.
_unify(
make_err(
"Cannot unify "+this.
p()+
" and "+that.
p()),work));
1743 boolean progress =
false;
1748 for(
int i=0; i<
_args.length; i++ ) {
1750 if( progress && work==
null )
return true;
1751 if( (that=that.
find()).is_err() )
return true;
1754 if( fidxs!=that.
_fidxs ) progress=
true;
1755 if( progress && work==
null )
return true;
1764 boolean progress =
false;
1770 for(
int i=0; i<
_ids.length; i++ ) {
1773 if( work==
null )
return true;
1779 if( progress && work==
null )
return true;
1786 for(
int i=0; i<that.
_ids.length; i++ )
1789 if( work ==
null )
return true;
1795 if( alias!=that.
_alias ) progress=
true;
1796 if( progress && work==
null )
return true;
1801 private boolean vput(
T2 that,
boolean progress) {
VARS.put(
this,that);
return progress; }
1805 assert
VARS.isEmpty();
1813 if( rez!=
null )
return rez;
1824 for(
int i=0; i<
_args.length; i++ )
1834 if( x==
this )
return true;
1837 for(
int i=0; i<x.
_args.length; i++ )
1849 if( vs==
null )
return false;
1859 static private final HashMap<T2,T2>
CDUPS =
new HashMap<>();
1861 assert
CDUPS.isEmpty();
1868 if(
this==t )
return true;
1880 if( tc!=
null )
return tc==t;
1884 for(
int i=0; i<
_args.length; i++ )
1892 for(
int i=0; i<
_args.length; i++ ) {
1924 : (lambda.
_body ==
null
1938 for(
int i=0; i<
_args.length; i++ ) {
1957 if( tmap !=
null )
return tmap;
1958 if(
is_err() )
throw unimpl();
1962 if( !(t instanceof
TypeMemPtr) )
throw unimpl();
1966 boolean progress=
false;
1967 for(
int i=0; i<
_args.length; i++ ) {
1969 if( idx==-1 )
continue;
1972 progress |= targ != rez;
1974 if( !progress )
return t;
1977 for(
int i=0; i<
_args.length; i++ ) {
1979 if( idx==-1 )
continue;
2003 for(
int i=0; i<
_args.length; i++ )
2004 if(
_args[i]!=
null )
2016 for(
int i=0; i<
_args.length; i++ )
2033 t._get_dups(visit,dups);
2044 boolean dup = dups.get(
_uid);
2049 if( dup ) sb.
p(
"$V").
p(
_uid);
2050 if( visit.
tset(
_uid) && dup )
return sb;
2051 if( dup ) sb.
p(
':');
2056 for(
int i=0; i<
_args.length-1; i++ )
2064 for(
int i=0; i<
_ids.length; i++ )
2079 private static final HashMap<T2,Integer>
VNAMES =
new HashMap<>();
2085 Integer ii =
VNAMES.get(
this);
2089 if( later ) sb.
p(
'$');
2090 char c = (char)(
'A'+ii);
2091 if( c<
'V' ) sb.
p(c);
else sb.
p(
"V"+ii);
2092 if( later )
return sb;
2101 for(
int i=0; i<
_args.length-1; i++ )
2102 args(i).
_p(sb,visit,dups).
p(
" ");
2103 return args(
_args.length-1).
_p(sb.
p(
"-> "),visit,dups).
p(
" }");
2110 for(
int i=0; i<
_ids.length; i++ ) {
2111 int idx =
Util.
find(
_ids,
new String(
new char[]{(char)(
'0'+i)}).intern());
2112 args(idx).
_p(sb.
p(
' '),visit,dups).
p(
',');
2118 TreeMap<String,Integer> map =
new TreeMap<String,Integer>();
2119 for(
int i=0; i<
_ids.length; i++ )
2120 map.put(
_ids[i], i );
2121 for(
int i : map.values() )
2130 for(
int i=0; i<
_args.length; i++ )
args(i).
_p(sb,visit,dups).
p(
" ");
2135 if(
_ids==
null )
return false;
2136 for( String
id :
_ids )
2137 if( !
isDigit((
byte)
id.charAt(0)) )
final void prep_tree_impl(Syntax par, VStack nongen, Worklist work, T2 t)
Type walk_types_out(Type t)
Type apply(Syntax[] args)
void add_val_work(Syntax child, Worklist work)
int prep_tree(Syntax par, VStack nongen, Worklist work)
static T2 make_struct(BitsAlias aliases, String[] ids, T2[] flds)
boolean hm(Worklist work)
static TypeFld make_tup(Type t, int order)
static final String[][] IDS
static T2 make_err(String s)
boolean hm(Worklist work)
E push(E e)
Add element in amortized constant time.
static TypeTuple make_args(Type[] ts)
Type apply(Syntax[] args)
void push_update_impl(Syntax a)
static BitsFun make0(int bit)
static void require(String s)
String[] meet_ids(T2 that)
static int find(int[] es, int e)
static final HashMap< Long, T2 > DUPS
abstract boolean hm(Worklist work)
void add_val_work(Syntax child, Worklist work)
void add_hm_work(Worklist work)
static TypeTuple make_ret(Type trez)
static boolean eq(String s0, String s1)
int prep_tree(Syntax par, VStack nongen, Worklist work)
abstract boolean more_work(Worklist work)
boolean cycle_equals(T2 t)
static final boolean DEBUG_LEAKS
Type apply(Syntax[] args)
SB p2(SB sb, VBitSet dups)
int prep_tree(Syntax par, VStack nongen, Worklist work)
static final NonBlockingHashMapLong< Type > UF
SB p2(SB sb, VBitSet dups)
static T2 make_struct(BitsAlias aliases, String[] ids, T2[] flds, boolean open)
static final Type XSCALAR
void prep_lookup_deps(Ident id)
final SB p0(SB sb, VBitSet dups)
boolean union(T2 that, Worklist work)
void add_hm_work(Worklist work)
boolean more_work(Worklist work)
an implementation of language AA
void clear()
Removes all of the mappings from this map.
static TypeFunSig make(String[] args, TypeTuple formals, TypeTuple ret)
SB p2(SB sb, VBitSet dups)
void prep_lookup_deps(Ident id)
static final BitsFun FULL
void add_val_work(Syntax child, Worklist work)
static< T > T require(char c, T t)
boolean more_work(Worklist work)
int prep_tree(Syntax par, VStack nongen, Worklist work)
void add_deps_work(Worklist work)
static final TypeFld NO_DISP
SB p2(SB sb, VBitSet dups)
static TypeInt con(long con)
SB p2(SB sb, VBitSet dups)
static final NonBlockingHashMapLong< Lambda > FUNS
VStack(VStack par, T2 nongen)
void add_hm_work(Worklist work)
abstract void add_hm_work(Worklist work)
TypeStruct install_cyclic(Ary< Type > reachs)
static int new_alias(int par)
boolean more_work(Worklist work)
static boolean isDigit(byte c)
boolean more_work(Worklist work)
A memory-based collection of optionally named fields.
static TypeFld make(String fld, Type t, int order)
static RuntimeException unimpl()
static boolean test(long[] bits, int i)
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Type apply(Syntax[] args)
boolean hm(Worklist work)
static boolean intern_check()
Lambda(Syntax body, String... args)
static final VBitSet UPDATE_VISIT
Type apply(Syntax[] args)
Type apply(Syntax[] args)
boolean hm(Worklist work)
Let(String arg0, Syntax def, Syntax body)
SB p2(SB sb, VBitSet dups)
void _unify_struct(T2 that, Worklist work)
static final TypeInt INT64
int prep_tree(Syntax par, VStack nongen, Worklist work)
boolean _fresh_unify(T2 that, VStack nongen, Worklist work)
static Type con(double con)
boolean fresh_unify(T2 that, VStack nongen, Worklist work)
static T2 make_base(Type flow)
void add_hm_work(Worklist work)
final TypeV get(long key)
Returns the value to which the specified key is mapped, or.
Type apply(Syntax[] args)
static int RECURSIVE_MEET
VBitSet _get_dups(VBitSet visit, VBitSet dups)
void add_val_work(Syntax child, Worklist work)
T2 push_update(Ary< Syntax > as)
boolean add_fld(String id, T2 fld, Worklist work)
TypeV putIfAbsent(long key, TypeV val)
Atomically, do a put if-and-only-if the key is not mapped.
static T2 make_fun(BitsFun fidxs, T2... args)
boolean meet_opens(T2 that)
Field(String id, Syntax str)
void addAll(Ary<? extends Syntax > ss)
Apply(Syntax fun, Syntax... args)
static final HashMap< T2, Type > T2MAP
BitsAlias meet_alias(T2 that)
boolean hm(Worklist work)
int prep_tree(Syntax par, VStack nongen, Worklist work)
void prep_lookup_deps(Ident id)
boolean union_err(T2 that, Worklist work, String msg)
boolean fresh_base(T2 that, Worklist work)
boolean nongen_in(VStack vs)
static Root parse(String s)
Struct(String[] ids, Syntax[] flds)
SB str(SB sb, VBitSet dups)
void add_val_work(Syntax child, Worklist work)
static TypeStr con(String con)
static TypeFunPtr make(BitsFun fidxs, int nargs, Type disp)
boolean hm(Worklist work)
static boolean isAlpha1(byte c)
final boolean more_work_impl(Worklist work)
static final HashMap< T2, T2 > CDUPS
static TypeFld[] flds(Type t1)
boolean _occurs_in_type(T2 x)
SB str(SB sb, VBitSet visit, VBitSet dups)
Type apply(Syntax[] args)
BitsFun meet_fidxs(T2 that)
Tight/tiny StringBuilder wrapper.
Type apply(Syntax[] args)
int prep_tree(Syntax par, VStack nongen, Worklist work)
static Root hm(String sprog)
static TypeFld malloc(String fld, Type t, Access access, int order)
void add_hm_work(Worklist work)
Type apply(Syntax[] args)
void add_deps_work_impl(Worklist work)
an implementation of language AA
static Type xval(TypeFunPtr fun)
void add_hm_work(Worklist work)
TypeStruct approx(int cutoff, int alias)
T2(@NotNull String name, T2 @NotNull ... args)
boolean _unify(T2 that, Worklist work)
boolean vput(T2 that, boolean progress)
static BitsAlias make0(int bit)
void add_hm_work(Worklist work)
boolean _can_be_HM_base(T2 that, Type that_flow)
int _init(Syntax def, T2 idt)
TypeStruct make_from(String name)
Type apply(Syntax[] args)
Iterator< T2 > iterator()
static final HashMap< T2, Integer > VNAMES
Type apply(Syntax[] args)
static void require(char c)
SB p2(SB sb, VBitSet dups)
int prep_tree(Syntax par, VStack nongen, Worklist work)
static void reset_to_init0()
SB _p(SB sb, VBitSet visit, VBitSet dups)
Type walk_types_in(Type t)
boolean hm(Worklist work)
boolean occurs_in_type(T2 x)
boolean more_work(Worklist work)
static Type add_sig(Type t)
static TypeStruct make(String fld_name, Type t)
static final NonBlockingHashMapLong< TypeStruct > ADUPS
A lock-free alternate implementation of java.util.concurrent.ConcurrentHashMap with primitive long ke...
boolean more_work(Worklist work)
static TypeStruct shrink(Ary< Type > reaches, TypeStruct tstart)
static boolean isWS(byte c)
boolean _cycle_equals_struct(T2 t)
abstract int prep_tree(Syntax par, VStack nongen, Worklist work)
Type apply(Syntax[] args)
static final HashMap< String, PrimSyn > PRIMSYNS
SB p2(SB sb, VBitSet dups)
boolean more_work(Worklist work)
static final TypeInt ZERO
TypeV put(long key, TypeV val)
Maps the specified key to the specified value in the table.
E set(int i, E e)
Set existing element.
static TypeStruct malloc(String name, boolean any, TypeFld[] flds, boolean open)
static boolean isAlpha0(byte c)
static final NonBlockingHashMapLong< String > WDUPS
int prep_tree(Syntax par, VStack nongen, Worklist work)
static final TypeMemPtr STRPTR
final HashSet< Syntax > _work
static final TypeInt TRUE
void add_hm_work(Worklist work)
static final boolean DO_GCP
boolean unify(T2 that, Worklist work)
boolean hm(Worklist work)
abstract SB p2(SB sb, VBitSet dups)
static int new_fidx(int par)
TypeFld make_from(Type t)
static HashMap< Type, Pair1X > PAIR1S
static final boolean DO_HM
TypeMemPtr make_from(TypeObj obj)
boolean more_work(Worklist work)
static final TypeInt BOOL
static final VBitSet ODUPS
boolean hm(Worklist work)
boolean hm(Worklist work)
boolean _cycle_equals(T2 t)
boolean hm(Worklist work)
static final TypeFlt FLT64
VBitSet get_dups(VBitSet dups)
static void reset_to_init0()
static SB str(SB sb, VBitSet visit, T2 t, VBitSet dups)
boolean _fresh_unify_struct(T2 that, VStack nongen, Worklist work)
void add_hm_work(Worklist work)
static final HashMap< T2, T2 > VARS
Type apply(Syntax[] args)
abstract Type val(Worklist work)
static TypeMemPtr make(BitsAlias aliases, TypeObj obj)