[abc] Jasmin misbehaving under Java 1.5

From: Pavel Avgustinov <pavel.avgustinov@magdalen.oxford.ac.uk>
Date: Tue Aug 01 2006 - 18:11:57 BST

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