| [#484] | project: nsc | priority: low | category: bug | |
|---|---|---|---|---|
| submitter | assigned to | status | date submitted | |
| Iulian | Iulian | fixed | 2005-11-10 16:56:15.0 | |
| subject | try catch blocks inside expressions generate invalid code | |||
| code |
object Foo extends AnyRef with Application {
val x = 1;
Console.print("1 + 1 = ");
Console.println(1 + (try {
x;
} catch {
case _: Error => 5;
}))
} |
|||
| what happened | Bytecode will fail verification. The reason is the way JVM handles the stack when exceptions occur: it clears th\ e stack, pushes the exception object and transfers control to the appropriate handler. This way, all intermediat\ e values found on the operand stack are lost (in our example, it is the Console.MODULE$ instance and the first '\ 1' in the addition). When the exception handler transfers control back to the instructions after the try-catch b\ lock, the stack will contain only the result value in the exception handler (here, 5), while normal control flow\ will contain the object and the int. |
|||
| what expected | Correct compilation. This can be solved either through a transformation on source code to 'lift' try-catch blocks outside contexts that depend on previous results (Apply nodes or Assignment to fields, etc.), or through stack dumping: before entering a Try block, all operands on the stack are saved to local variables, and each exception handler restores the stack before handling the exception. | |||
| [back to overview] | ||||
| Iulian edited on 2005-11-10 16:57:26.0 |
| Iulian edited on 2005-11-16 17:41:45.0 |