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