try/catch around constructor super.<init> (after 8167104)
Michael Rasmussen
michael.rasmussen at zeroturnaround.com
Thu Jan 26 12:26:20 UTC 2017
Hi
After the fix[1] for 8167104, it is no longer possible to have a
try/catch around the super <init> invocation, since flags are compared
as well, but verify_exception_handler_targets is called with this_uninit
set and with type resolved.
The fix broke around/tracing adapters for constructors.
previously something like this worked well:
frame[{uninitialized_this}, {}]
try
aload_0
invokespecial super.<init>
/* body */
return
end try
frame[{top}, {Throwable}]
catch
athrow
Looking at the JVMS, the above do violate the stack frame verification,
stating subset(Flags1, Flags2), which the patch fixed.
But modifying the above code to the below also fails:
frame[{uninitialized_this}, {}]
try #1
aload_0
invokespecial super.<init>
end try #1
try #2 // frame[{this}, {}]
/* body */
return
end try #2
frame[{uninitialized_this}, {Throwable}]
catch #1
athrow
frame[{top}, {Throwable}]
catch #2
athrow
Based on a quick peek, it seems when verifying the invokespecial opcode
that verify_exception_handler_targets is called inside verify_invoke_init
before the type is resolved using initialize_object, including a comment
that states that it should be done here before initialize_object. But,
verify_exception_handler_targets is called again, after initialize_object
has changed the type, from after the switch-block in verify_method, with
this_uninit set to true.
This causes an error, with the following details:
VerifyError: Stack map does not match the one at exception handler 6
Exception Details:
Location:
com/test/TraceConstructor.<init>()V @6: athrow
Reason:
Type 'com/test/TraceConstructor' (current frame, locals[0]) is not
assignable to uninitializedThis (stack map, locals[0])
Current Frame:
bci: @1
flags: { flagThisUninit }
locals: { 'com/test/TraceConstructor' }
stack: { 'java/lang/Throwable' }
Stackmap Frame:
bci: @6
flags: { flagThisUninit }
locals: { uninitializedThis }
stack: { 'java/lang/Throwable' }
Bytecode:
0x0000000: 2ab7 0008 b1bf bf
Exception Handler Table:
bci [4, 5] => handler: 5
bci [0, 4] => handler: 6
Stackmap Table:
same_frame(@0)
full_frame(@5,{Top},{Object[#10]})
full_frame(@6,{UninitializedThis},{Object[#10]})
Kind regards
Michael Rasmussen
ZeroTurnaround
[1] http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/rev/02a3d0dcbedd
http://hg.openjdk.java.net/jdk9/jdk9/hotspot/rev/a9fdfd55835e
More information about the hotspot-dev
mailing list