Hi all (well, mainly Jennifer, I guess...),
I've been working on fixing the tracematch indexing data structure.
Unfortunately, I'm seeing some very strange behaviour.
There is a set of classes that don't correspond to any Java source, but
are generated in Jimple using the soot.Jimple API. This is where the
problem occurs: When running under Java 1.4, things are OK, but if abc
is compiled and running under Java 1.5, several things occur:
* Compilation is EXTREMELY slow.
* Compilation is EXTREMELY memory-hungry (to the point of the GC giving
warnings like "GC Warning: Out of Memory! Returning NIL!", and also
complaining about some very large allocations which might hamper
performance (150-300MB chunks).
* Jasmin produces lots of error messages like this:
Jasmin:12: Warning - Syntax error.
Jasmin:12: Error - Couldn't repair and continue parse.
Jasmin: Found 2 errors
Those three lines are repeated, with only the line number (the "12"
above, I assume it's a line number -- what does it refer to?) varying.
Ultimately there is invariably an OutOfMemoryError.
Has anyone seen something like this before? Once again, none of the
above problems exist under a 1.4 JVM, when compilation using abc isn't
particularly slower than usual, and certainly doesn't produce the error
messages.
------------------------------
To reproduce, consider the attached Jimple file (sorry, it's not reduced
at all). Running `java soot.Main Constraint\$tracematch\$0` under a 1.4
JVM produces a .class file, while under a 1.5 JVM exhibits the Jasmin
error messages above.
Any advice would be greatly appreciated.
Cheers,
- P
public class Constraint$tracematch$0 extends java.lang.Object
{
public java.util.LinkedHashSet disjuncts;
public java.util.LinkedHashSet disjuncts_tmp;
public java.util.LinkedHashSet disjuncts_skip;
public java.util.Map indexedDisjuncts;
public java.util.Map indexedDisjuncts_tmp;
public java.util.Map indexedDisjuncts_skip;
public int onState;
public int collectableUntil;
public int primitiveUntil;
public int weakUntil;
public void <init>(int)
{
Constraint$tracematch$0 thisLocal$2;
int paramLocal0$3;
java.util.LinkedHashSet newObject$4, newObject$5, newObject$6;
thisLocal$2 := @this: Constraint$tracematch$0;
specialinvoke thisLocal$2.<java.lang.Object: void <init>()>();
paramLocal0$3 := @parameter0: int;
thisLocal$2.<Constraint$tracematch$0: int onState> = paramLocal0$3;
newObject$4 = new java.util.LinkedHashSet;
specialinvoke newObject$4.<java.util.LinkedHashSet: void <init>()>();
thisLocal$2.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts> = newObject$4;
newObject$5 = new java.util.LinkedHashSet;
specialinvoke newObject$5.<java.util.LinkedHashSet: void <init>()>();
thisLocal$2.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_tmp> = newObject$5;
newObject$6 = new java.util.LinkedHashSet;
specialinvoke newObject$6.<java.util.LinkedHashSet: void <init>()>();
thisLocal$2.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_skip> = newObject$6;
thisLocal$2.<Constraint$tracematch$0: int collectableUntil> = -1;
thisLocal$2.<Constraint$tracematch$0: int primitiveUntil> = -1;
thisLocal$2.<Constraint$tracematch$0: int weakUntil> = -1;
return;
}
public void <init>(int, java.util.LinkedHashSet)
{
Constraint$tracematch$0 thisLocal$7;
int paramLocal0$8;
java.util.LinkedHashSet paramLocal1$9, newObject$10, newObject$11;
thisLocal$7 := @this: Constraint$tracematch$0;
specialinvoke thisLocal$7.<java.lang.Object: void <init>()>();
paramLocal0$8 := @parameter0: int;
paramLocal1$9 := @parameter1: java.util.LinkedHashSet;
thisLocal$7.<Constraint$tracematch$0: int onState> = paramLocal0$8;
thisLocal$7.<Constraint$tracematch$0: int collectableUntil> = -1;
thisLocal$7.<Constraint$tracematch$0: int primitiveUntil> = -1;
thisLocal$7.<Constraint$tracematch$0: int weakUntil> = -1;
thisLocal$7.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts> = paramLocal1$9;
newObject$10 = new java.util.LinkedHashSet;
specialinvoke newObject$10.<java.util.LinkedHashSet: void <init>()>();
thisLocal$7.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_tmp> = newObject$10;
newObject$11 = new java.util.LinkedHashSet;
specialinvoke newObject$11.<java.util.LinkedHashSet: void <init>(java.util.Collection)>(paramLocal1$9);
thisLocal$7.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_skip> = newObject$11;
return;
}
protected void finalize()
{
return;
}
public void queue(java.util.LinkedHashSet)
{
Constraint$tracematch$0 thisLocal$12;
java.util.LinkedHashSet paramLocal0$13, disjuncts_tmp$local$16;
thisLocal$12 := @this: Constraint$tracematch$0;
paramLocal0$13 := @parameter0: java.util.LinkedHashSet;
disjuncts_tmp$local$16 = thisLocal$12.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_tmp>;
virtualinvoke disjuncts_tmp$local$16.<java.util.LinkedHashSet: boolean addAll(java.util.Collection)>(paramLocal0$13);
return;
}
public static Constraint$tracematch$0 getTrue(int)
{
java.util.LinkedHashSet newObject$17;
Disjunct$tracematch$0 trueD$local$18;
int paramLocal0$19;
Constraint$tracematch$0 newObject$20;
newObject$17 = new java.util.LinkedHashSet;
specialinvoke newObject$17.<java.util.LinkedHashSet: void <init>()>();
trueD$local$18 = <Disjunct$tracematch$0: Disjunct$tracematch$0 trueD>;
virtualinvoke newObject$17.<java.util.LinkedHashSet: boolean add(java.lang.Object)>(trueD$local$18);
paramLocal0$19 := @parameter0: int;
newObject$20 = new Constraint$tracematch$0;
specialinvoke newObject$20.<Constraint$tracematch$0: void <init>(int,java.util.LinkedHashSet)>(paramLocal0$19, newObject$17);
return newObject$20;
}
public void merge()
{
Constraint$tracematch$0 thisLocal$21;
int collectableUntil$local$22, collectableUntil$local$30, primitiveUntil$local$31, weakUntil$local$32, collectableUntil$local$38, primitiveUntil$local$39, weakUntil$local$40;
java.util.LinkedHashSet disjuncts_skip$local$23, disjuncts$local$24, disjuncts_tmp$local$25, newObject$26;
java.util.Map indexedDisjuncts_skip$local$27, indexedDisjuncts_tmp$local$28, map$$29, map$$37;
org.aspectbench.tm.runtime.internal.IdentityHashMap newObject$33, newObject$41;
org.aspectbench.tm.runtime.internal.WeakKeyCollectingIdentityHashMap newObject$34, newObject$42;
java.util.HashMap newObject$35, newObject$43;
org.aspectbench.tm.runtime.internal.WeakKeyIdentityHashMap newObject$36, newObject$44;
thisLocal$21 := @this: Constraint$tracematch$0;
collectableUntil$local$22 = thisLocal$21.<Constraint$tracematch$0: int collectableUntil>;
if collectableUntil$local$22 > -1 goto label0;
disjuncts_skip$local$23 = thisLocal$21.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_skip>;
thisLocal$21.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts> = disjuncts_skip$local$23;
disjuncts$local$24 = thisLocal$21.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts>;
disjuncts_tmp$local$25 = thisLocal$21.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_tmp>;
virtualinvoke disjuncts$local$24.<java.util.LinkedHashSet: boolean addAll(java.util.Collection)>(disjuncts_tmp$local$25);
newObject$26 = new java.util.LinkedHashSet;
specialinvoke newObject$26.<java.util.LinkedHashSet: void <init>()>();
thisLocal$21.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_tmp> = newObject$26;
return;
label0:
indexedDisjuncts_skip$local$27 = thisLocal$21.<Constraint$tracematch$0: java.util.Map indexedDisjuncts_skip>;
virtualinvoke thisLocal$21.<Constraint$tracematch$0: void merge(java.util.Map,boolean)>(indexedDisjuncts_skip$local$27, 1);
indexedDisjuncts_tmp$local$28 = thisLocal$21.<Constraint$tracematch$0: java.util.Map indexedDisjuncts_tmp>;
virtualinvoke thisLocal$21.<Constraint$tracematch$0: void merge(java.util.Map,boolean)>(indexedDisjuncts_tmp$local$28, 0);
collectableUntil$local$30 = thisLocal$21.<Constraint$tracematch$0: int collectableUntil>;
if collectableUntil$local$30 > 0 goto label1;
primitiveUntil$local$31 = thisLocal$21.<Constraint$tracematch$0: int primitiveUntil>;
if primitiveUntil$local$31 > 0 goto label2;
weakUntil$local$32 = thisLocal$21.<Constraint$tracematch$0: int weakUntil>;
if weakUntil$local$32 > 0 goto label3;
newObject$33 = new org.aspectbench.tm.runtime.internal.IdentityHashMap;
specialinvoke newObject$33.<org.aspectbench.tm.runtime.internal.IdentityHashMap: void <init>()>();
map$$29 = newObject$33;
goto label4;
label1:
newObject$34 = new org.aspectbench.tm.runtime.internal.WeakKeyCollectingIdentityHashMap;
specialinvoke newObject$34.<org.aspectbench.tm.runtime.internal.WeakKeyCollectingIdentityHashMap: void <init>()>();
map$$29 = newObject$34;
goto label4;
label2:
newObject$35 = new java.util.HashMap;
specialinvoke newObject$35.<java.util.HashMap: void <init>()>();
map$$29 = newObject$35;
goto label4;
label3:
newObject$36 = new org.aspectbench.tm.runtime.internal.WeakKeyIdentityHashMap;
specialinvoke newObject$36.<org.aspectbench.tm.runtime.internal.WeakKeyIdentityHashMap: void <init>()>();
map$$29 = newObject$36;
label4:
thisLocal$21.<Constraint$tracematch$0: java.util.Map indexedDisjuncts_tmp> = map$$29;
collectableUntil$local$38 = thisLocal$21.<Constraint$tracematch$0: int collectableUntil>;
if collectableUntil$local$38 > 0 goto label5;
primitiveUntil$local$39 = thisLocal$21.<Constraint$tracematch$0: int primitiveUntil>;
if primitiveUntil$local$39 > 0 goto label6;
weakUntil$local$40 = thisLocal$21.<Constraint$tracematch$0: int weakUntil>;
if weakUntil$local$40 > 0 goto label7;
newObject$41 = new org.aspectbench.tm.runtime.internal.IdentityHashMap;
specialinvoke newObject$41.<org.aspectbench.tm.runtime.internal.IdentityHashMap: void <init>()>();
map$$37 = newObject$41;
goto label8;
label5:
newObject$42 = new org.aspectbench.tm.runtime.internal.WeakKeyCollectingIdentityHashMap;
specialinvoke newObject$42.<org.aspectbench.tm.runtime.internal.WeakKeyCollectingIdentityHashMap: void <init>()>();
map$$37 = newObject$42;
goto label8;
label6:
newObject$43 = new java.util.HashMap;
specialinvoke newObject$43.<java.util.HashMap: void <init>()>();
map$$37 = newObject$43;
goto label8;
label7:
newObject$44 = new org.aspectbench.tm.runtime.internal.WeakKeyIdentityHashMap;
specialinvoke newObject$44.<org.aspectbench.tm.runtime.internal.WeakKeyIdentityHashMap: void <init>()>();
map$$37 = newObject$44;
label8:
thisLocal$21.<Constraint$tracematch$0: java.util.Map indexedDisjuncts_skip> = map$$37;
return;
}
public void merge(java.util.Map, boolean)
{
Constraint$tracematch$0 thisLocal$45;
java.util.Map paramLocal0$46;
boolean paramLocal1$47;
java.lang.RuntimeException newObject$49;
thisLocal$45 := @this: Constraint$tracematch$0;
paramLocal0$46 := @parameter0: java.util.Map;
paramLocal1$47 := @parameter1: boolean;
newObject$49 = new java.lang.RuntimeException;
specialinvoke newObject$49.<java.lang.RuntimeException: void <init>(java.lang.String)>("merge(Map, boolean) called on a non-indexing state");
throw newObject$49;
}
public java.lang.Object[] getDisjunctArray()
{
Constraint$tracematch$0 thisLocal$50;
java.util.LinkedHashSet disjuncts$local$51;
java.lang.Object[] toArray$result$52;
thisLocal$50 := @this: Constraint$tracematch$0;
disjuncts$local$51 = thisLocal$50.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts>;
toArray$result$52 = virtualinvoke disjuncts$local$51.<java.util.LinkedHashSet: java.lang.Object[] toArray()>();
return toArray$result$52;
}
public java.util.LinkedHashSet getBindingsForSymbolf(int)
{
Constraint$tracematch$0 thisLocal$53;
java.util.LinkedHashSet disjuncts$local$55, newObject$56;
thisLocal$53 := @this: Constraint$tracematch$0;
disjuncts$local$55 = thisLocal$53.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts>;
newObject$56 = new java.util.LinkedHashSet;
specialinvoke newObject$56.<java.util.LinkedHashSet: void <init>(java.util.Collection)>(disjuncts$local$55);
return newObject$56;
}
public java.util.LinkedHashSet getBindingsForSymbolg(int)
{
Constraint$tracematch$0 thisLocal$57;
java.util.LinkedHashSet disjuncts$local$59, newObject$60;
thisLocal$57 := @this: Constraint$tracematch$0;
disjuncts$local$59 = thisLocal$57.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts>;
newObject$60 = new java.util.LinkedHashSet;
specialinvoke newObject$60.<java.util.LinkedHashSet: void <init>(java.util.Collection)>(disjuncts$local$59);
return newObject$60;
}
public void queueNegativeBindingsForSymbolf()
{
Constraint$tracematch$0 thisLocal$61;
int onState$local$62;
java.util.LinkedHashSet disjuncts_skip$local$63, newObject$64;
java.util.Iterator iterator$result$65;
boolean hasNext$result$66, validateDisjunct$result$69;
java.lang.Object next$result$67;
Disjunct$tracematch$0 castResult$68, addNegativeBindingsForSymbolf$result$70, falseD$local$71;
thisLocal$61 := @this: Constraint$tracematch$0;
onState$local$62 = thisLocal$61.<Constraint$tracematch$0: int onState>;
disjuncts_skip$local$63 = thisLocal$61.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_skip>;
newObject$64 = new java.util.LinkedHashSet;
specialinvoke newObject$64.<java.util.LinkedHashSet: void <init>()>();
iterator$result$65 = virtualinvoke disjuncts_skip$local$63.<java.util.LinkedHashSet: java.util.Iterator iterator()>();
label0:
hasNext$result$66 = interfaceinvoke iterator$result$65.<java.util.Iterator: boolean hasNext()>();
if hasNext$result$66 == 0 goto label2;
next$result$67 = interfaceinvoke iterator$result$65.<java.util.Iterator: java.lang.Object next()>();
castResult$68 = (Disjunct$tracematch$0) next$result$67;
validateDisjunct$result$69 = virtualinvoke castResult$68.<Disjunct$tracematch$0: boolean validateDisjunct(int)>(onState$local$62);
if validateDisjunct$result$69 == 0 goto label1;
addNegativeBindingsForSymbolf$result$70 = virtualinvoke castResult$68.<Disjunct$tracematch$0: Disjunct$tracematch$0 addNegativeBindingsForSymbolf(int)>(onState$local$62);
virtualinvoke newObject$64.<java.util.LinkedHashSet: boolean add(java.lang.Object)>(addNegativeBindingsForSymbolf$result$70);
goto label0;
label1:
interfaceinvoke iterator$result$65.<java.util.Iterator: void remove()>();
goto label0;
label2:
falseD$local$71 = <Disjunct$tracematch$0: Disjunct$tracematch$0 falseD>;
virtualinvoke newObject$64.<java.util.LinkedHashSet: boolean remove(java.lang.Object)>(falseD$local$71);
thisLocal$61.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_skip> = newObject$64;
return;
}
public void queueNegativeBindingsForSymbolg()
{
Constraint$tracematch$0 thisLocal$72;
int onState$local$73;
java.util.LinkedHashSet disjuncts_skip$local$74, newObject$75;
java.util.Iterator iterator$result$76;
boolean hasNext$result$77, validateDisjunct$result$80;
java.lang.Object next$result$78;
Disjunct$tracematch$0 castResult$79, addNegativeBindingsForSymbolg$result$81, falseD$local$82;
thisLocal$72 := @this: Constraint$tracematch$0;
onState$local$73 = thisLocal$72.<Constraint$tracematch$0: int onState>;
disjuncts_skip$local$74 = thisLocal$72.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_skip>;
newObject$75 = new java.util.LinkedHashSet;
specialinvoke newObject$75.<java.util.LinkedHashSet: void <init>()>();
iterator$result$76 = virtualinvoke disjuncts_skip$local$74.<java.util.LinkedHashSet: java.util.Iterator iterator()>();
label0:
hasNext$result$77 = interfaceinvoke iterator$result$76.<java.util.Iterator: boolean hasNext()>();
if hasNext$result$77 == 0 goto label2;
next$result$78 = interfaceinvoke iterator$result$76.<java.util.Iterator: java.lang.Object next()>();
castResult$79 = (Disjunct$tracematch$0) next$result$78;
validateDisjunct$result$80 = virtualinvoke castResult$79.<Disjunct$tracematch$0: boolean validateDisjunct(int)>(onState$local$73);
if validateDisjunct$result$80 == 0 goto label1;
addNegativeBindingsForSymbolg$result$81 = virtualinvoke castResult$79.<Disjunct$tracematch$0: Disjunct$tracematch$0 addNegativeBindingsForSymbolg(int)>(onState$local$73);
virtualinvoke newObject$75.<java.util.LinkedHashSet: boolean add(java.lang.Object)>(addNegativeBindingsForSymbolg$result$81);
goto label0;
label1:
interfaceinvoke iterator$result$76.<java.util.Iterator: void remove()>();
goto label0;
label2:
falseD$local$82 = <Disjunct$tracematch$0: Disjunct$tracematch$0 falseD>;
virtualinvoke newObject$75.<java.util.LinkedHashSet: boolean remove(java.lang.Object)>(falseD$local$82);
thisLocal$72.<Constraint$tracematch$0: java.util.LinkedHashSet disjuncts_skip> = newObject$75;
return;
}
}
Received on Tue Aug 01 18:11:59 2006
This archive was generated by hypermail 2.1.8 : Tue Mar 06 2007 - 16:13:29 GMT