git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@383 379699f6-c40d-0410-875b-85095c16579estable
parent
c53ad623d4
commit
e7307604ae
@ -0,0 +1,81 @@ |
||||
; This class converts between boolean and ints without type casts. |
||||
; You can't decompile this directly, the decompiler probably gives type errors. |
||||
|
||||
.class public jode/test/EvilTypes |
||||
.super java/lang/Object |
||||
|
||||
.method public static boolToInt(Z)I |
||||
.limit locals 1 |
||||
.limit stack 1 |
||||
iload_0 |
||||
ireturn |
||||
.end method |
||||
|
||||
.method public static intToBool(I)Z |
||||
.limit locals 1 |
||||
.limit stack 1 |
||||
iload_0 |
||||
ireturn |
||||
.end method |
||||
|
||||
.method public static test()V |
||||
.limit locals 2 |
||||
.limit stack 2 |
||||
iconst_1 |
||||
invokestatic jode/test/EvilTypes/intToBool(I)Z |
||||
istore 0 |
||||
iconst_2 |
||||
istore 1 |
||||
iload 0 |
||||
iload 1 |
||||
ixor |
||||
pop |
||||
return |
||||
.end method |
||||
|
||||
.method private static useSerial(Ljava/io/Serializable;)V |
||||
.limit locals 1 |
||||
.limit stack 0 |
||||
return |
||||
.end method |
||||
|
||||
; This is a test where a type error occurs, because there is no Type |
||||
; that implements Cloneable, Serializable and is assignable form int |
||||
; array and java/lang/Date (though both objects are Cloneable and |
||||
; Serializable). We can't find any correct type for local 2. |
||||
|
||||
.method public static referenceCast(Ljava/util/Date;[I)Ljava/lang/Cloneable; |
||||
.limit locals 3 |
||||
.limit stack 2 |
||||
aload_0 |
||||
ifnonnull second |
||||
aload_0 |
||||
goto done |
||||
second: |
||||
aload_1 |
||||
done: |
||||
dup |
||||
astore_2 |
||||
invokestatic jode/test/EvilTypes/useSerial(Ljava/io/Serializable;)V |
||||
aload_2 |
||||
areturn |
||||
.end method |
||||
|
||||
; This shows that the bytecode verifier doesn't catch every type error. |
||||
.method public static test(Ljava/lang/String;)Ljava/lang/Runnable; |
||||
.limit locals 1 |
||||
.limit stack 1 |
||||
aload_0 |
||||
areturn |
||||
.end method |
||||
|
||||
.method public static main([Ljava/lang/String;)V |
||||
.limit locals 1 |
||||
.limit stack 2 |
||||
aload_0 |
||||
iconst_0 |
||||
aaload |
||||
invokestatic jode/test/EvilTypes/test(Ljava/lang/String;)Ljava/lang/Runnable; |
||||
invokeinterface java/lang/Runnable/run()V 1 |
||||
return |
||||
.end method |
@ -0,0 +1,73 @@ |
||||
package jode.test; |
||||
public class Expressions { |
||||
double cd; |
||||
float cf; |
||||
long cl; |
||||
int ci; |
||||
char cc; |
||||
short cs; |
||||
byte cb; |
||||
boolean cz; |
||||
|
||||
void postIncDecExpressions() { |
||||
cd++; |
||||
cf++; |
||||
cl++; |
||||
ci++; |
||||
cs++; |
||||
cb++; |
||||
cc++; |
||||
cd--; |
||||
cf--; |
||||
cl--; |
||||
ci--; |
||||
cs--; |
||||
cb--; |
||||
cc--; |
||||
float f = 0.0F; |
||||
double d = 0.0; |
||||
long l = 0L; |
||||
f++; |
||||
f--; |
||||
d++; |
||||
d--; |
||||
l++; |
||||
l--; |
||||
} |
||||
|
||||
|
||||
void unary() { |
||||
short s = 25; |
||||
s = (short) ~s; |
||||
boolean b = !true; |
||||
s = b? s: cs; |
||||
char c= 25; |
||||
c = b ? c: cc; |
||||
} |
||||
|
||||
void shift() { |
||||
int i = 0; |
||||
long l =0; |
||||
l >>= i; |
||||
l >>= i; |
||||
i >>= i; |
||||
l = l << l; |
||||
l = l << i; |
||||
l = i << l; |
||||
l = i << i; |
||||
i = (int) (l << l); |
||||
i = (int) (l << i); |
||||
i = i << l; |
||||
i = i << i; |
||||
cl >>= ci; |
||||
ci <<= ci; |
||||
cl = cl << cl; |
||||
cl = cl << ci; |
||||
cl = ci << cl; |
||||
cl = ci << ci; |
||||
ci = (int) (cl << cl); |
||||
ci = (int) (cl << ci); |
||||
ci = ci << cl; |
||||
ci = ci << ci; |
||||
} |
||||
} |
@ -0,0 +1,41 @@ |
||||
; This class contains evil stack operations, that make it very hard to |
||||
; produce correct code. |
||||
|
||||
.class public jode/test/StackOps |
||||
.super java/lang/Object |
||||
|
||||
.method public static concatSwaped(ZLjava/lang/String;Ljava/lang/String;)Ljava/lang/String; |
||||
.limit locals 3 |
||||
.limit stack 3 |
||||
aload_1 |
||||
aload_2 |
||||
iload 0 |
||||
ifeq dontswap |
||||
swap |
||||
dontswap: |
||||
invokevirtual java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; |
||||
areturn |
||||
.end method |
||||
|
||||
.method public static dupTest(Ljava/lang/String;)Ljava/lang/String; |
||||
.limit locals 1 |
||||
.limit stack 2 |
||||
; first a simple test that we can resolve |
||||
aload_0 |
||||
dup |
||||
invokevirtual java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; |
||||
; now concat again. |
||||
dup |
||||
invokevirtual java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; |
||||
; Now a more evil test. |
||||
aload_0 |
||||
swap |
||||
ifnull pushagain |
||||
dup |
||||
goto concat |
||||
pushagain: |
||||
aload_0 |
||||
concat: |
||||
invokevirtual java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; |
||||
areturn |
||||
.end method |
Loading…
Reference in new issue