Go to the documentation of this file. 1 package com.cliffc.aa.type;
6 import java.util.BitSet;
7 import java.util.HashMap;
76 if( !(as[0] instanceof
TypeLive) )
return false;
77 if( as.length == 1 )
return true;
84 if( as.length==2 )
return true;
86 if( as[as.length-1] ==
null )
return false;
88 for(
int i=2; i<as.length; i++ )
91 if( as[par] !=
null ) {
92 if( as[par] == as[i] )
return false;
99 for(
TypeObj obj :
_pubs ) sum += obj==
null ? 0 : obj._hash;
102 @Override
public boolean equals( Object o ) {
103 if(
this==o )
return true;
104 if( !(o instanceof
TypeMem) )
return false;
106 if(
_pubs .length != tf.
_pubs .length )
return false;
107 for(
int i = 0; i<
_pubs.length; i++ )
114 private static final char[]
LIVEC =
new char[]{
' ',
'#',
'R',
'3'};
116 if(
this==
FULL )
return sb.
p(
"[ all ]");
117 if(
this==
EMPTY)
return sb.
p(
"[_____]");
118 if(
this==
MEM )
return sb.
p(
"[ mem ]");
119 if(
this==
XMEM )
return sb.
p(
"[~mem ]");
121 if(
_pubs.length==1 )
122 return _pubs[0].
str(sb.
p(
'['),dups,mem,debug).
p(
']');
125 else _pubs[0].
str(sb,dups,mem,debug);
128 for(
int i = 1; i<
_pubs.length; i++ )
129 if(
_pubs[i] !=
null )
130 _pubs[i].
str(sb.
p(i).
p(
':'),dups,mem,debug).
p(
",");
139 if( alias==0 )
return 1;
141 if( alias < tos.length && tos[alias] !=
null )
156 for(
int i = 0; i<
_pubs.length; i++ )
171 assert as.length==1 || as[0]==
null;
174 if( tos==
null )
return DEAD;
181 if(
len > 1 && as[1]==
null ) {
182 int i;
for( i=2; i<
len; i++ )
185 if( i==
len )
return null;
188 if(
len <= 2 )
return as;
190 for(
int i=1; i<as.length; i++ )
193 if( as[par] !=
null ) {
194 if( as[par] == as[i] ) as[i] =
null;
198 while( as[
len-1] ==
null )
len--;
199 if( as.length!=
len ) as = Arrays.copyOf(as,
len);
266 for(
int i = 0; i<
_pubs.length; i++ )
267 if(
_pubs[i] !=
null )
277 return tos==
null ?
DEAD :
make(tos);
282 int len = Math.max(as.length,bs.length);
283 int mlen = Math.min(as.length,bs.length);
292 for(
int i=1; i<
len; i++ )
293 objs[i] = i<mlen && as[i]==
null && bs[i]==
null
294 ?
null :
_meet(
at(as,i),
at(bs,i),is_loop);
308 return tos==
null ?
DEAD :
make(tos);
313 for(
int alias =
aliases.nextSetBit(0); alias != -1; alias =
aliases.nextSetBit(alias + 1))
356 { work.
push(kid); visit.set(kid); }
359 int alias=work.
pop();
360 if( alias==0 )
continue;
379 for(
int ptralias : ((
TypeMemPtr)fld)._aliases )
381 if( !visit.
tset(kid) ) {
396 for(
int i=2; i<tos.length; i++ )
406 if( sharp !=
null )
return sharp;
428 for(
int i=1; i<oops.length; i++ )
429 if( oops[i]!=
null ) oops[i] = oops[i].
crush();
435 if(
at(alias)==obj )
return this;
436 int max = Math.max(
_pubs.length,alias+1);
449 if( pub==obj )
return this;
455 return base==as ? Arrays.copyOf(base,Math.max(base.length,alias+1)) : as;
481 for(
int i=1; i<tos.length; i++ )
491 for(
int i = 1; i<
_pubs.length; i++ )
501 for(
int i=1; i<
len; i++ )
512 if( !(to instanceof
TypeStruct) )
return true;
524 int i;
for( i=1; i<
_pubs.length; i++ ) {
528 if( i==
_pubs.length )
return this;
533 for( ; i<
_pubs.length; i++ )
542 for(
int i=1; i<tos.length; i++ )
544 tos[i] = tos[i].
widen();
550 if( alias !=
null && !alias.above_center() && !alias.is_con() )
555 @Override
public boolean is_con() {
return false;}
556 @Override
public boolean must_nil() {
return false; }
static boolean check(TypeObj[] as)
static TypeMemPtr sharpen(TypeMem mem, TypeMemPtr dull)
static TypeObj[] _meet(TypeObj[] as, TypeObj[] bs, boolean is_loop)
static TypeMem make(TypeObj[] pubs)
TypeObj ld(TypeMemPtr ptr)
static final TypeMem DEAD
static int at_idx(TypeObj[]tos, int alias)
TypeMemPtr sharp_get(TypeMemPtr tmp)
HashMap< TypeMemPtr, TypeMemPtr > _sharp_cache
TypeMem update(BitsAlias aliases, Access fin, String fld, Type val)
Memory type; the state of all of memory; memory edges order memory ops.
static final TypeMem XMEM
static final TypeMemPtr OOP
static final TypeMem MEM_STR
static TypeObj at(TypeObj[] tos, int alias)
static final TypeMem LIVE_BOT
static final TypeMem ESCAPE
an implementation of language AA
static final TypeStruct ALLSTRUCT
static final TypeLive LIVE_BOT
boolean has_used(BitSet aliases)
static TypeObj[] _make1(TypeObj[] as)
TypeTuple sharptr(TypeMem mem)
static final TypeMem ALLMEM
static final Bits.Tree< BitsAlias > TREE
A memory-based collection of optionally named fields.
boolean test_recur(int i)
static RuntimeException unimpl()
boolean cycle_equals(Type o)
static final TypeMem ANYMEM
static final TypeLive DEAD
static int next_kid(int alias, int kid)
static TypeMem make0(TypeObj[] as)
static final TypeMem LNO_DISP
TypeMem update(BitsAlias aliases, TypeInt idx, Type val)
BitsAlias and_unused(BitsAlias escs)
static final TypeObj XOBJ
static final TypeMem MEM_ABC
static final TypeMem FULL
static final TypeLive NO_DISP
boolean fld_is_mod(BitsAlias aliases, String fld)
static final TypeObj UNUSED
TypeObj remove_other_flds(String fld, Type live)
static final TypeObj ISUSED
static final TypeLive ESCAPE
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
static final TypeMem ALIVE
static TypeObj[] _st_new(TypeObj[] base, TypeObj[] as, int alias)
static TypeFld[] flds(Type t1)
AryInt push(int e)
Add element in amortized constant time.
static final TypeLive LIVE
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Tight/tiny StringBuilder wrapper.
TypeMem remove_no_escapes(BitsAlias escs, String fld, Type live)
an implementation of language AA
static final char[] LIVEC
TypeMem init(TypeObj[] pubs)
static TypeObj _meet(TypeObj a, TypeObj b, boolean is_loop)
static final TypeLive ESC_DISP
static final TypeMem LESC_NO_DISP
static TypeMem make(BitsAlias aliases, TypeObj oop)
static TypeObj ld(TypeObj[] tos, BitsAlias aliases)
TypeMemPtr sharput(TypeMemPtr dull, TypeMemPtr sharp)
TypeMem st_new(int alias, TypeObj obj)
BitsAlias all_reaching_aliases(BitsAlias aliases)
TypeMemPtr sharpen(TypeMemPtr dull)
static final Pool[] POOLS
static final TypeMem[] TYPES
static TypeMem make(int alias, TypeObj oop)
static TypeMem make_live(TypeLive live)
static final TypeMem EMPTY
TypeMem slice_reaching_aliases(BitsAlias aliases)