Weirdness in TypeFlow
Andrew Haley
aph at redhat.com
Mon Jan 12 11:17:06 PST 2009
This is the TypeFlow for java.lang.Shutdown::sequence
Here's BB 7. Note that local 0 is an Object:
====================================================
#7 rpo#7 [33 - 43) Stored locals: { 0 }
State : locals 2, stack 0, monitors 1
local 0 : java/lang/Object
local 1 : java/lang/Object
Successors : 1
#10 rpo#8 [43 - 46)
Exceptions : 1
#8 rpo#12 [46 - 48) -- java/lang/Throwable
====================================================
Now look at the bytecode:
33: iconst_2
34: putstatic <Field java.lang.Shutdown.state int>
37: getstatic <Field java.lang.Shutdown.runFinalizersOnExit boolean>
40: istore_0
41: aload_1
42: monitorexit
43: goto 49
Note Instruction 40, which stores an int in local 0. So, after instruction
40, local 0 contains an int.
Here's the exception handler for this block:
====================================================
#8 rpo#12 [46 - 48) Stored locals: { }
State : locals 2, stack 1, monitors 1
local 0 : java/lang/Object
local 1 : java/lang/Object
stack 0 : java/lang/Throwable
Successors : 1
#9 rpo#13 [48 - 49)
Exceptions : 0
====================================================
Its incoming local 0 is an Object, not an int. So, what happens if
the monitorexit instruction throws a NullPointerException? It seems
to me that local 0 at address 46 is both an Object and an int.
I suppose this verifies correctly because the handler does not
use local 0. Is this TypeFLow legal? Are there cases where the type
of a local in the TypeFlow is not correct, but it doesn't matter because
no-one reads it?
Thanks,
Andrew.
TypeFlow for sequence 57 bytes
====================================================
#0 rpo#0 [0 - 6) Stored locals: { 0 }
State : locals 2, stack 0, monitors 0
local 0 : bottom
local 1 : bottom
Successors : 1
#1 rpo#1 [6 - 13)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#1 rpo#1 [6 - 13) Stored locals: { }
State : locals 2, stack 0, monitors 1
local 0 : java/lang/Object
local 1 : bottom
Successors : 2
#14 rpo#2 [13 - 15)
#4 rpo#4 [16 - 18)
Exceptions : 1
#2 rpo#14 [21 - 23) -- java/lang/Throwable
====================================================
--------------------------------------------------------
====================================================
#14 rpo#2 [13 - 15) Stored locals: { }
State : locals 2, stack 0, monitors 1
local 0 : java/lang/Object
local 1 : bottom
Successors : 1
#15 rpo#3 [15 - 16)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#15 rpo#3 [15 - 16) Stored locals: { }
State : locals 2, stack 0, monitors 0
local 0 : java/lang/Object
local 1 : bottom
Successors : 0
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#4 rpo#4 [16 - 18) Stored locals: { }
State : locals 2, stack 0, monitors 1
local 0 : java/lang/Object
local 1 : bottom
Successors : 1
#5 rpo#5 [18 - 21)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#5 rpo#5 [18 - 21) Stored locals: { }
State : locals 2, stack 0, monitors 0
local 0 : java/lang/Object
local 1 : bottom
Successors : 1
#6 rpo#6 [24 - 33)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#6 rpo#6 [24 - 33) Stored locals: { 1 }
State : locals 2, stack 0, monitors 0
local 0 : java/lang/Object
local 1 : bottom
Successors : 1
#7 rpo#7 [33 - 43)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#7 rpo#7 [33 - 43) Stored locals: { 0 }
State : locals 2, stack 0, monitors 1
local 0 : java/lang/Object
local 1 : java/lang/Object
Successors : 1
#10 rpo#8 [43 - 46)
Exceptions : 1
#8 rpo#12 [46 - 48) -- java/lang/Throwable
====================================================
--------------------------------------------------------
====================================================
#10 rpo#8 [43 - 46) Stored locals: { }
State : locals 2, stack 0, monitors 0
local 0 : int
local 1 : java/lang/Object
Successors : 1
#11 rpo#9 [49 - 53)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#11 rpo#9 [49 - 53) Stored locals: { }
State : locals 2, stack 0, monitors 0
local 0 : int
local 1 : java/lang/Object
Successors : 2
#13 rpo#10 [53 - 56)
#12 rpo#11 [56 - 57)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#13 rpo#10 [53 - 56) Stored locals: { }
State : locals 2, stack 0, monitors 0
local 0 : int
local 1 : java/lang/Object
Successors : 1
#12 rpo#11 [56 - 57)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#12 rpo#11 [56 - 57) Stored locals: { }
State : locals 2, stack 0, monitors 0
local 0 : int
local 1 : java/lang/Object
Successors : 0
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#8 rpo#12 [46 - 48) Stored locals: { }
State : locals 2, stack 1, monitors 1
local 0 : java/lang/Object
local 1 : java/lang/Object
stack 0 : java/lang/Throwable
Successors : 1
#9 rpo#13 [48 - 49)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#9 rpo#13 [48 - 49) Stored locals: { }
State : locals 2, stack 1, monitors 0
local 0 : java/lang/Object
local 1 : java/lang/Object
stack 0 : java/lang/Throwable
Successors : 0
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#2 rpo#14 [21 - 23) Stored locals: { }
State : locals 2, stack 1, monitors 1
local 0 : java/lang/Object
local 1 : bottom
stack 0 : java/lang/Throwable
Successors : 1
#3 rpo#15 [23 - 24)
Exceptions : 0
====================================================
--------------------------------------------------------
====================================================
#3 rpo#15 [23 - 24) Stored locals: { }
State : locals 2, stack 1, monitors 0
local 0 : java/lang/Object
local 1 : bottom
stack 0 : java/lang/Throwable
Successors : 0
Exceptions : 0
====================================================
--------------------------------------------------------
Method name:"sequence" private static Descriptor: ()void
Attribute "Code", length:229, max_stack:2, max_locals:2, code_length:57
0: getstatic <Field java.lang.Shutdown.lock java.lang.Object>
3: dup
4: astore_0
5: monitorenter
6: getstatic <Field java.lang.Shutdown.state int>
9: iconst_1
10: if_icmpeq 16
13: aload_0
14: monitorexit
15: return
16: aload_0
17: monitorexit
18: goto 24
21: aload_0
22: monitorexit
23: athrow
24: invokestatic <Method java.lang.Shutdown.runHooks ()void>
27: getstatic <Field java.lang.Shutdown.lock java.lang.Object>
30: dup
31: astore_1
32: monitorenter
33: iconst_2
34: putstatic <Field java.lang.Shutdown.state int>
37: getstatic <Field java.lang.Shutdown.runFinalizersOnExit boolean>
40: istore_0
41: aload_1
42: monitorexit
43: goto 49
46: aload_1
47: monitorexit
48: athrow
49: iload_0
50: ifeq 56
53: invokestatic <Method java.lang.Shutdown.runAllFinalizers ()void>
56: return
Exceptions (count: 5):
start: 6, end: 15, handler: 21, type: 0 /* finally */
start: 16, end: 18, handler: 21, type: 0 /* finally */
start: 21, end: 23, handler: 21, type: 0 /* finally */
start: 33, end: 43, handler: 46, type: 0 /* finally */
start: 46, end: 48, handler: 46, type: 0 /* finally */
Attribute "LineNumberTable", length:42, count: 10
line: 144 at pc: 0
line: 148 at pc: 6
line: 144 at pc: 16
line: 150 at pc: 24
line: 152 at pc: 27
line: 153 at pc: 33
line: 154 at pc: 37
line: 152 at pc: 41
line: 156 at pc: 49
line: 157 at pc: 56
Attribute "LocalVariableTable", length:22, count: 2
slot#0: name: rfoe, type: boolean (pc: 41 length: 5)
slot#0: name: rfoe, type: boolean (pc: 49 length: 8)
Attribute "StackMapTable", length:38
More information about the hotspot-dev
mailing list