<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Aptos",sans-serif;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:11.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="WordSection1">
<div>
<p class="MsoNormal">Hi,</p>
<p class="MsoNormal">Current exception regions model is weak in modeling nested try blocks, shared catch handlers and transitions between try blocks. Each of this complication multiplies complexity of the code model.</p>
<p class="MsoNormal">Following example consists of 9 bytecode instructions, wrapped in 3-level try catch, with two gaps and transitions between the try blocks:</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">- method name: tryMethod</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> flags: [STATIC]</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> method type: ()V</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> attributes: [Code]</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> code:
</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> max stack: 1</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> max locals: 0</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 0: {opcode: ICONST_0, constant value: 0}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 1: {opcode: IFEQ, target: 8}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 4: {opcode: ICONST_0, constant value: 0}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 5: {opcode: IFEQ, target: 9}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 8: {opcode: NOP}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 9: {opcode: RETURN}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 10: {opcode: ATHROW}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 11: {opcode: ATHROW}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> 12: {opcode: ATHROW}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception handlers:
</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 1: {start: 0, end: 4, handler: 10, type: java/lang/NullPointerException}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 2: {start: 4, end: 8, handler: 10, type: java/lang/NullPointerException}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 3: {start: 8, end: 10, handler: 10, type: java/lang/NullPointerException}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 4: {start: 0, end: 4, handler: 11, type: java/lang/RuntimeException}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 5: {start: 4, end: 8, handler: 11, type: java/lang/RuntimeException}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 6: {start: 8, end: 10, handler: 11, type: java/lang/RuntimeException}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 7: {start: 0, end: 4, handler: 12, type: java/lang/Throwable}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 8: {start: 4, end: 8, handler: 12, type: java/lang/Throwable}</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> handler 9: {start: 8, end: 10, handler: 12, type: java/lang/Throwable}</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">When we try to lift the above bytecode, we get following 47 blocks of model:</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">func @"tryMethod" ()void -> {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %0 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_1 ^block_46;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_1:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %1 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_2 ^block_44;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_2:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %2 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_3 ^block_41;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_3:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %3 : int = constant @"0";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %4 : boolean = neq %3 %3;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> cbranch %4 ^block_4 ^block_21;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_4:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %2 ^block_5;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_5:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %1 ^block_6;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_6:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %0 ^block_7;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_7:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %5 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_8 ^block_46;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">. (skipped due to mailing list size limit)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">. <o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_41(%24 : java.lang.NullPointerException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %1 ^block_42(%24);</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_42(%25 : java.lang.NullPointerException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %0 ^block_43(%25);</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_43(%26 : java.lang.NullPointerException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %26;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_44(%27 : java.lang.RuntimeException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %0 ^block_45(%27);</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_45(%28 : java.lang.RuntimeException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %28;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_46(%29 : java.lang.Throwable):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %29;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">};</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">My first proposal consists of:</p>
<p class="MsoNormal">- detach exception table entry declaration from the region entry</p>
<p class="MsoNormal">- allow exception.region.enter and exception.region.exit to enter resp. exit one or more exception table entries</p>
<p class="MsoNormal">- behavioral change: an exception thrown causes to leave all levels exception regions (transition to a handler clears the actual exception stack). The change requires each exception handler to explicitly declare relevant exception regions
re-entries.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">The above example model will significantly simplify and may be easily optimized even more:</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">func @"tryMethod" ()void -> {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %0 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region ^block_8;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %1 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region ^block_9;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %2 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region ^block_10;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.enter %0 %1 %2 ^block_1;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_1:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %3 : int = constant @"0";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %4 : boolean = neq %3 %3;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> cbranch %4 ^block_2 ^block_5;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_2:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %0 %1 %2 ^block_3;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_3:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.enter %0 %1 %2 ^block_4;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_4:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %5 : boolean = neq %3 %3;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> cbranch %5 ^block_5 ^block_5;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_5:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %0 %1 %2 ^block_6;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_6:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.enter %0 %1 %2 ^block_7;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_7:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> return;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_8(%6 : java.lang.NullPointerException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %6;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_9(%7 : java.lang.RuntimeException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %7;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_10(%8 : java.lang.Throwable):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %8;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">};</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">My second concern and proposal related to inability to model multi-catch try blocks. Following code:</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> @CodeReflection</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> static void multicatch() {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> try {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> System.out.println("do something");</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> } catch (NullPointerException | IllegalArgumentException e) {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw e;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> } catch (RuntimeException e) {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> return;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> }</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> }</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">is lowered to:</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">func @"multicatch" ()void -> {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %0 : java.lang.reflect.code.op.CoreOp$ExceptionRegion = exception.region.enter ^block_1 ^block_4 ^block_5;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_1:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %1 : java.io.PrintStream = field.load @"java.lang.System::out()java.io.PrintStream";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %2 : java.lang.String = constant @"do something";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> invoke %1 %2 @"java.io.PrintStream::println(java.lang.String)void";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> branch ^block_2;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_2:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %0 ^block_3;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_3:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> return;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_4(%3 : java.lang.RuntimeException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %4 : Var<java.lang.RuntimeException> = var %3 @"e";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %5 : java.lang.RuntimeException = var.load %4;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %5;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_5(%6 : java.lang.RuntimeException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %7 : Var<java.lang.RuntimeException> = var %6 @"e";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> return;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">};</span></p>
<p class="MsoNormal">Which is not correct and information about exact catch type is lost.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">I propose to add specific catch type to the exception table entry declaration, so the model will change to:</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">func @"multicatch" ()void -> {</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %0 : java.lang.reflect.code.op.CoreOp$ExceptionRegion<java.lang.NullPointerException> = exception.region ^block_4;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %1 : java.lang.reflect.code.op.CoreOp$ExceptionRegion<java.lang.IllegalArgumentException> = exception.region ^block_4;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %2 : java.lang.reflect.code.op.CoreOp$ExceptionRegion<java.lang.RuntimeException> = exception.region ^block_5;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.enter %0 %1 %2 ^block_1;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_1:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %3 : java.io.PrintStream = field.load @"java.lang.System::out()java.io.PrintStream";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %4 : java.lang.String = constant @"do something";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> invoke %3 %4 @"java.io.PrintStream::println(java.lang.String)void";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> branch ^block_2;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_2:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> exception.region.exit %0 %1 %2 ^block_3;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_3:</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> return;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_4(%3 : java.lang.RuntimeException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %4 : Var<java.lang.RuntimeException> = var %3 @"e";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %5 : java.lang.RuntimeException = var.load %4;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> throw %5;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> ^block_5(%6 : java.lang.RuntimeException):</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> %7 : Var<java.lang.RuntimeException> = var %6 @"e";</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> return;</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas">};</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas"> </span></p>
<p class="MsoNormal"> </p>
</div>
</div>
</body>
</html>