Decompiler Exception Test Source

Program-Transformation.Org: The Program Transformation Wiki
This is the Jasmin (essentially Java "assembly language") source code for the exceptions decompiler test. It is an attempt at the test program from Figure 6 of the paper Decompiling Java Bytecode: Problems, Traps and Pitfalls, but since the results are so different to theirs, I must have failed to reproduce their original example. I should be pretty close, though, because the SourceTec decompiler produces results very similar to what their paper claims Wingdis produces.

I wrote this program as follows. First, I wrote a Java program that comes close to the control flow required. I compiled this to bytecodes, and used Soot (see http://www.sable.mcgill.edu/soot/) to convert this to Jasmin. I then edited the Jasmin to have the control flow required, and edited the labels to be more readable. I then "assembled" this code with jasmin (a slightly modified version comes as part of Soot).

.class  foo
.super java/lang/Object

.method  <init>()V
    .limit stack 1
    .limit locals 1
    aload_0
    invokespecial java/lang/Object/<init>()V
    return
.end method

.method public foo()V
.catch java/lang/RuntimeException from label_b to after_c using catch_g
.catch java/lang/RuntimeException from label_c to after_d using catch_e
    .limit stack 2
    .limit locals 1
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "a"
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
label_b:
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "b"
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
label_c:
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "c"
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
after_c:
    goto label_d
catch_g:
    astore_0
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "g"
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
    goto label_f
label_d:
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "d"
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
after_d:
    goto label_f
catch_e:
    astore_0
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "e"
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
label_f:
    getstatic java/lang/System/out Ljava/io/PrintStream;
    ldc "f"
    invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
    return
.end method

.method public static main()V
    .limit stack 2
    .limit locals 1
    new foo
    dup
    invokespecial foo/<init>()V
    astore_0
    return
.end method

-- MikeVanEmmerik - 12 Feb 2003