RFR 8050485: super() in a try block in a ctor causes VerifyError

harold seigel harold.seigel at oracle.com
Thu Jul 24 17:55:26 UTC 2014


Hi,

Please review this verifier fix for bug 8050485.

The fix for JDK-8035119 
<https://bugs.openjdk.java.net/browse/JDK-8035119> broke existing tools, 
such as NetBeans Profiler, that generate bytecodes which place TRY 
blocks around constructor calls to super() and this().  The purpose of 
that fix was to prevent exception handlers from handling exceptions 
thrown from super() and this(), and returning malformed objects to the 
callers of the constructors.

The NB Profiler prevents malformed objects from being returned to the 
constructors' callers by having the exception handlers re-throw the 
exceptions.

The purpose of this fix is to allow a TRY block around a constructor's 
call to super() and this(), provided that all code paths in the TRY 
block's exception handlers terminate with a throw. This prevents 
malformed objects from being returned and does not break tools like NB 
Profiler.

The fix works by parsing the bytecodes inside of the exception handlers, 
making sure that all code paths end in an 'athrow' bytecode.  Otherwise, 
it throws a VerifyError exception.  This parsing is only done when the 
verifier detects a constructor's call to super() or this() from inside 
of a TRY block.

Bug:  https://bugs.openjdk.java.net/browse/JDK-8050485
Open webrev: http://cr.openjdk.java.net/~hseigel/bug_8050485/

The fix was tested with the JCK lang, vm, and api/java_lang tests, the 
UTE verifier and quick tests, the JTREG hotspot tests, and additional 
tests with constructor calls to super() and this() from inside of a TRY 
block, including one provided by NB Profiler.

Thanks, Harold


More information about the hotspot-runtime-dev mailing list