main = #lib::main;
 [@vm.bytecode=
BytecodeMetadata {
Bytecode (version: stable)
Main library: #lib
Library '#lib'
    name '#lib'
    script '#lib'

Class '', script = '#lib'


Function 'testTryCatch1', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                4
  CheckStack           0
Try #0 start:
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
Try #0 end:
Try #0 handler:
  SetFrame             4
  MoveSpecial          exception, r0
  MoveSpecial          stackTrace, r1
  Push                 r0
  PopLocal             r2
  PushNull
  PushInt              2
  CreateArrayTOS
  StoreLocal           r3
  Push                 r3
  PushInt              0
  PushConstant         CP#4
  StoreIndexedTOS
  Push                 r3
  PushInt              1
  Push                 r2
  StoreIndexedTOS
  DirectCall           CP#5, 1
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
L1:
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 4, end 14, handler 14, types [CP#3]
}
ConstantPool {
  [0] = ObjectRef 'danger!'
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = Type dynamic
  [4] = ObjectRef 'caught '
  [5] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
  [6] = Reserved
}


Function 'testTryCatch2', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                5
  CheckStack           0
Try #0 start:
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
Try #0 end:
Try #0 handler:
  SetFrame             5
  MoveSpecial          exception, r0
  MoveSpecial          stackTrace, r1
  Push                 r0
  PushConstant         CP#3
  InterfaceCall        CP#4, 2
  JumpIfFalse          L2
  PushConstant         CP#6
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
L2:
  Push                 r0
  PushConstant         CP#7
  InterfaceCall        CP#4, 2
  JumpIfFalse          L3
  Push                 r0
  PopLocal             r2
  PushNull
  PushInt              2
  CreateArrayTOS
  StoreLocal           r3
  Push                 r3
  PushInt              0
  PushConstant         CP#8
  StoreIndexedTOS
  Push                 r3
  PushInt              1
  Push                 r2
  StoreIndexedTOS
  DirectCall           CP#9, 1
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
L3:
  Push                 r0
  PushConstant         CP#11
  InterfaceCall        CP#4, 2
  JumpIfFalse          L4
  Push                 r0
  PopLocal             r2
  Push                 r1
  PopLocal             r3
  PushNull
  PushInt              4
  CreateArrayTOS
  StoreLocal           r4
  Push                 r4
  PushInt              0
  PushConstant         CP#12
  StoreIndexedTOS
  Push                 r4
  PushInt              1
  Push                 r2
  StoreIndexedTOS
  Push                 r4
  PushInt              2
  PushConstant         CP#13
  StoreIndexedTOS
  Push                 r4
  PushInt              3
  Push                 r3
  StoreIndexedTOS
  DirectCall           CP#9, 1
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
L4:
  Push                 r0
  PopLocal             r2
  Push                 r1
  PopLocal             r3
  PushNull
  PushInt              4
  CreateArrayTOS
  StoreLocal           r4
  Push                 r4
  PushInt              0
  PushConstant         CP#15
  StoreIndexedTOS
  Push                 r4
  PushInt              1
  Push                 r2
  StoreIndexedTOS
  Push                 r4
  PushInt              2
  PushConstant         CP#13
  StoreIndexedTOS
  Push                 r4
  PushInt              3
  Push                 r3
  StoreIndexedTOS
  DirectCall           CP#9, 1
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
L1:
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 4, end 14, handler 14, needs-stack-trace, types [CP#3, CP#7, CP#11, CP#14]
}
ConstantPool {
  [0] = ObjectRef 'danger!'
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = Type dart:core::TypeError
  [4] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
  [5] = Reserved
  [6] = ObjectRef 'caught type error'
  [7] = Type dart:core::AssertionError
  [8] = ObjectRef 'caught assertion error '
  [9] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
  [10] = Reserved
  [11] = Type dart:core::Error
  [12] = ObjectRef 'caught error '
  [13] = ObjectRef ' '
  [14] = Type dynamic
  [15] = ObjectRef 'caught something '
}


Function 'testTryCatch3', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                7
  CheckStack           0
  AllocateContext      0, 3
  PopLocal             r0
  Push                 r0
  PushInt              1
  StoreContextVar      0, 0
  Push                 r0
  PopLocal             r2
Try #0 start:
  Push                 r0
  PushInt              2
  StoreContextVar      0, 1
  AllocateClosure      CP#0
  StoreLocal           r5
  Push                 r5
  PushNull
  StoreFieldTOS        CP#8
  Push                 r5
  PushNull
  StoreFieldTOS        CP#10
  Push                 r5
  PushConstant         CP#12
  StoreFieldTOS        CP#13
  Push                 r5
  PushConstant         CP#0
  StoreFieldTOS        CP#15
  Push                 r5
  Push                 r0
  StoreFieldTOS        CP#1
  PopLocal             r4
  Push                 r4
  DynamicCall          CP#18, 1
  Drop1
  Push                 r0
  LoadContextVar       0, 1
  DirectCall           CP#4, 1
  Drop1
  Jump                 L1
Try #0 end:
Try #0 handler:
  SetFrame             7
  Push                 r2
  PopLocal             r0
  MoveSpecial          exception, r2
  MoveSpecial          stackTrace, r3
  Push                 r2
  PopLocal             r4
  Push                 r0
  Push                 r3
  StoreContextVar      0, 2
  PushNull
  PushInt              4
  CreateArrayTOS
  StoreLocal           r5
  Push                 r5
  PushInt              0
  PushConstant         CP#19
  StoreIndexedTOS
  Push                 r5
  PushInt              1
  Push                 r4
  StoreIndexedTOS
  Push                 r5
  PushInt              2
  PushConstant         CP#20
  StoreIndexedTOS
  Push                 r5
  PushInt              3
  Push                 r0
  LoadContextVar       0, 2
  StoreIndexedTOS
  DirectCall           CP#21, 1
  DirectCall           CP#4, 1
  Drop1
  AllocateClosure      CP#23
  StoreLocal           r5
  Push                 r5
  PushNull
  StoreFieldTOS        CP#8
  Push                 r5
  PushNull
  StoreFieldTOS        CP#10
  Push                 r5
  PushConstant         CP#12
  StoreFieldTOS        CP#13
  Push                 r5
  PushConstant         CP#23
  StoreFieldTOS        CP#15
  Push                 r5
  Push                 r0
  StoreFieldTOS        CP#1
  PopLocal             r6
  Push                 r6
  ReturnTOS
L1:
  Push                 r0
  LoadContextParent
  PopLocal             r0
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 20, end 80, handler 80, needs-stack-trace, types [CP#6]
}
ConstantPool {
  [0] = ClosureFunction 0
  [1] = InstanceField dart:core::_Closure::_context (field)
  [2] = Reserved
  [3] = ObjectRef 'danger foo'
  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [5] = Reserved
  [6] = Type dynamic
  [7] = EndClosureFunctionScope
  [8] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
  [9] = Reserved
  [10] = InstanceField dart:core::_Closure::_function_type_arguments (field)
  [11] = Reserved
  [12] = EmptyTypeArguments
  [13] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
  [14] = Reserved
  [15] = InstanceField dart:core::_Closure::_function (field)
  [16] = Reserved
  [17] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
  [18] = ICData dynamic target-name 'call', arg-desc CP#17
  [19] = ObjectRef 'caught '
  [20] = ObjectRef ' '
  [21] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
  [22] = Reserved
  [23] = ClosureFunction 1
  [24] = ObjectRef 'danger bar'
  [25] = Type dart:core::Error
  [26] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
  [27] = Reserved
  [28] = ObjectRef 'error '
  [29] = ObjectRef ', captured stack trace: '
  [30] = EndClosureFunctionScope
}
Closure #lib::testTryCatch3::'foo' () -> void
ClosureCode {
  EntryFixed           1, 6
  CheckStack           0
  Push                 FP[-5]
  LoadFieldTOS         CP#1
  PopLocal             r0
  Push                 r0
  PopLocal             r2
Try #0 start:
  PushConstant         CP#3
  DirectCall           CP#4, 1
  Drop1
  Jump                 L1
Try #0 end:
Try #0 handler:
  SetFrame             6
  Push                 r2
  PopLocal             r0
  MoveSpecial          exception, r2
  MoveSpecial          stackTrace, r3
  Push                 r2
  PopLocal             r4
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#4, 1
  Drop1
  Push                 r0
  PushInt              3
  StoreContextVar      0, 1
  Jump                 L1
L1:
  PushNull
  ReturnTOS
}

Closure #lib::testTryCatch3::'bar' () -> void
ClosureCode {
  EntryFixed           1, 6
  CheckStack           0
  Push                 FP[-5]
  LoadFieldTOS         CP#1
  PopLocal             r0
  Push                 r0
  PopLocal             r2
Try #0 start:
  PushConstant         CP#24
  DirectCall           CP#4, 1
  Drop1
  Jump                 L1
Try #0 end:
Try #0 handler:
  SetFrame             6
  Push                 r2
  PopLocal             r0
  MoveSpecial          exception, r2
  MoveSpecial          stackTrace, r3
  Push                 r2
  PushConstant         CP#25
  InterfaceCall        CP#26, 2
  JumpIfFalse          L2
  Push                 r2
  PopLocal             r4
  PushNull
  PushInt              4
  CreateArrayTOS
  StoreLocal           r5
  Push                 r5
  PushInt              0
  PushConstant         CP#28
  StoreIndexedTOS
  Push                 r5
  PushInt              1
  Push                 r4
  StoreIndexedTOS
  Push                 r5
  PushInt              2
  PushConstant         CP#29
  StoreIndexedTOS
  Push                 r5
  PushInt              3
  Push                 r0
  LoadContextVar       0, 2
  StoreIndexedTOS
  DirectCall           CP#21, 1
  DirectCall           CP#4, 1
  Drop1
  Jump                 L1
L2:
  Push                 r2
  Push                 r3
  Throw                1
L1:
  PushNull
  ReturnTOS
}


Function 'testRethrow', static, reflectable, debuggable
    parameters [dart:core::bool 'cond'] (required: 1)
    return-type dynamic

Bytecode {
  Entry                8
  CheckStack           0
Try #0 start:
Try #1 start:
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
Try #1 end:
Try #1 handler:
  SetFrame             8
  MoveSpecial          exception, r2
  MoveSpecial          stackTrace, r3
  Push                 r2
  PopLocal             r4
Try #2 start:
  PushConstant         CP#4
  DirectCall           CP#1, 1
  Drop1
  Push                 FP[-5]
  AssertBoolean        0
  JumpIfFalse          L2
  Push                 r2
  Push                 r3
  Throw                1
L2:
  Jump                 L3
Try #2 end:
Try #2 handler:
  SetFrame             8
  MoveSpecial          exception, r5
  MoveSpecial          stackTrace, r6
  Push                 r5
  PopLocal             r7
  PushConstant         CP#5
  DirectCall           CP#1, 1
  Drop1
  Jump                 L3
L3:
  Jump                 L1
L1:
  Jump                 L4
Try #0 end:
Try #0 handler:
  SetFrame             8
  MoveSpecial          exception, r0
  MoveSpecial          stackTrace, r1
  Push                 r0
  PopLocal             r2
  Push                 r1
  PopLocal             r3
  PushConstant         CP#6
  DirectCall           CP#1, 1
  Drop1
  Push                 r3
  DirectCall           CP#1, 1
  Drop1
  Jump                 L4
L4:
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 4, end 80, handler 80, needs-stack-trace, types [CP#3]
  try-index 1, outer 0, start 4, end 14, handler 14, needs-stack-trace, types [CP#3]
  try-index 2, outer 0, start 26, end 50, handler 50, types [CP#3]
}
ConstantPool {
  [0] = ObjectRef 'try 1 > try 2'
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = Type dynamic
  [4] = ObjectRef 'try 1 > catch 2 > try 3'
  [5] = ObjectRef 'try 1 > catch 2 > catch 3'
  [6] = ObjectRef 'catch 1'
}


Function 'testTryFinally1', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                3
  CheckStack           0
  PushInt              0
  PopLocal             r0
L5:
  CheckStack           1
  Push                 r0
  PushInt              10
  CompareIntLt
  JumpIfFalse          L1
Try #0 start:
  Push                 r0
  PushInt              5
  CompareIntGt
  JumpIfFalse          L2
  Jump                 L3
L2:
  Jump                 L4
Try #0 end:
Try #0 handler:
  SetFrame             3
  MoveSpecial          exception, r1
  MoveSpecial          stackTrace, r2
  Push                 r0
  DirectCall           CP#1, 1
  Drop1
  Push                 r1
  Push                 r2
  Throw                1
L3:
  Push                 r0
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
L4:
  Push                 r0
  DirectCall           CP#1, 1
  Drop1
  Push                 r0
  PushInt              1
  AddInt
  StoreLocal           r0
  Drop1
  Jump                 L5
L1:
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 19, end 36, handler 36, needs-stack-trace, types [CP#0]
}
ConstantPool {
  [0] = Type dynamic
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
}


Function 'testTryFinally2', static, reflectable, debuggable
    parameters [dart:core::int 'x'] (required: 1)
    return-type dynamic

Bytecode {
  Entry                9
  CheckStack           0
  AllocateContext      0, 2
  PopLocal             r0
  Push                 r0
  Push                 FP[-5]
  StoreContextVar      0, 0
  Push                 r0
  LoadContextVar       0, 0
  PopLocal             r2
  Push                 r2
  PushInt              1
  InterfaceCall        CP#0, 2
  JumpIfTrue           L1
  Push                 r2
  PushInt              2
  InterfaceCall        CP#0, 2
  JumpIfTrue           L2
  Jump                 L3
L1:
  Push                 r0
  PopLocal             r3
Try #0 start:
  PushConstant         CP#2
  DirectCall           CP#3, 1
  Drop1
  Push                 r0
  PushInt              3
  StoreContextVar      0, 1
  Push                 r0
  PopLocal             r5
Try #1 start:
  PushConstant         CP#5
  DirectCall           CP#3, 1
  Drop1
  AllocateClosure      CP#6
  StoreLocal           r8
  Push                 r8
  PushNull
  StoreFieldTOS        CP#10
  Push                 r8
  PushNull
  StoreFieldTOS        CP#12
  Push                 r8
  PushConstant         CP#14
  StoreFieldTOS        CP#15
  Push                 r8
  PushConstant         CP#6
  StoreFieldTOS        CP#17
  Push                 r8
  Push                 r0
  StoreFieldTOS        CP#7
  PopLocal             r7
  Push                 r7
  DynamicCall          CP#20, 1
  Drop1
  Jump                 L4
Try #1 end:
Try #1 handler:
  SetFrame             9
  Push                 r5
  PopLocal             r0
  MoveSpecial          exception, r5
  MoveSpecial          stackTrace, r6
  PushConstant         CP#22
  DirectCall           CP#3, 1
  Drop1
  Push                 r5
  Push                 r6
  Throw                1
L4:
  Push                 r5
  PopLocal             r0
  PushConstant         CP#22
  DirectCall           CP#3, 1
  Drop1
  Jump                 L5
Try #0 end:
Try #0 handler:
  SetFrame             9
  Push                 r3
  PopLocal             r0
  MoveSpecial          exception, r3
  MoveSpecial          stackTrace, r4
  PushConstant         CP#24
  DirectCall           CP#3, 1
  Drop1
  Push                 r3
  Push                 r4
  Throw                1
L5:
  Push                 r3
  PopLocal             r0
  PushConstant         CP#24
  DirectCall           CP#3, 1
  Drop1
  Jump                 L2
L2:
  PushConstant         CP#25
  DirectCall           CP#3, 1
  Drop1
  Jump                 L3
L3:
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 53, end 158, handler 158, needs-stack-trace, types [CP#21]
  try-index 1, outer 0, start 70, end 120, handler 120, needs-stack-trace, types [CP#21]
}
ConstantPool {
  [0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
  [1] = Reserved
  [2] = ObjectRef 'before try 1'
  [3] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [4] = Reserved
  [5] = ObjectRef 'try'
  [6] = ClosureFunction 0
  [7] = InstanceField dart:core::_Closure::_context (field)
  [8] = Reserved
  [9] = EndClosureFunctionScope
  [10] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
  [11] = Reserved
  [12] = InstanceField dart:core::_Closure::_function_type_arguments (field)
  [13] = Reserved
  [14] = EmptyTypeArguments
  [15] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
  [16] = Reserved
  [17] = InstanceField dart:core::_Closure::_function (field)
  [18] = Reserved
  [19] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
  [20] = ICData dynamic target-name 'call', arg-desc CP#19
  [21] = Type dynamic
  [22] = ObjectRef 'finally 1'
  [23] = ObjectRef 'after try 1'
  [24] = ObjectRef 'finally 2'
  [25] = ObjectRef 'case 2'
}
Closure #lib::testTryFinally2::'foo' () -> void
ClosureCode {
  EntryFixed           1, 2
  CheckStack           0
  Push                 FP[-5]
  LoadFieldTOS         CP#7
  PopLocal             r0
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  Push                 r0
  LoadContextVar       0, 1
  DirectCall           CP#3, 1
  Drop1
  PushNull
  ReturnTOS
}


Function 'testTryFinally3', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                6
  CheckStack           0
  AllocateContext      0, 1
  PopLocal             r0
  Push                 r0
  PushInt              11
  StoreContextVar      0, 0
  PushNull
  PopLocal             r2
  Push                 r0
  PopLocal             r3
Try #0 start:
  AllocateClosure      CP#0
  StoreLocal           r5
  Push                 r5
  PushNull
  StoreFieldTOS        CP#9
  Push                 r5
  PushNull
  StoreFieldTOS        CP#11
  Push                 r5
  PushConstant         CP#13
  StoreFieldTOS        CP#14
  Push                 r5
  PushConstant         CP#0
  StoreFieldTOS        CP#16
  Push                 r5
  Push                 r0
  StoreFieldTOS        CP#1
  PopLocal             r2
  Jump                 L1
Try #0 end:
Try #0 handler:
  SetFrame             6
  Push                 r3
  PopLocal             r0
  MoveSpecial          exception, r3
  MoveSpecial          stackTrace, r4
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  Push                 r2
  DynamicCall          CP#19, 1
  Drop1
  Push                 r3
  Push                 r4
  Throw                1
L1:
  Push                 r3
  PopLocal             r0
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  Push                 r2
  DynamicCall          CP#20, 1
  Drop1
  Push                 r0
  LoadContextParent
  PopLocal             r0
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 23, end 61, handler 61, needs-stack-trace, types [CP#6]
}
ConstantPool {
  [0] = ClosureFunction 0
  [1] = InstanceField dart:core::_Closure::_context (field)
  [2] = Reserved
  [3] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [4] = Reserved
  [5] = ObjectRef 'try 1'
  [6] = Type dynamic
  [7] = ObjectRef 'try 2'
  [8] = EndClosureFunctionScope
  [9] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
  [10] = Reserved
  [11] = InstanceField dart:core::_Closure::_function_type_arguments (field)
  [12] = Reserved
  [13] = EmptyTypeArguments
  [14] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
  [15] = Reserved
  [16] = InstanceField dart:core::_Closure::_function (field)
  [17] = Reserved
  [18] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
  [19] = ICData dynamic target-name 'call', arg-desc CP#18
  [20] = ICData dynamic target-name 'call', arg-desc CP#18
}
Closure #lib::testTryFinally3::'<anonymous closure>' () -> dart:core::int
ClosureCode {
  EntryFixed           1, 6
  CheckStack           0
  Push                 FP[-5]
  LoadFieldTOS         CP#1
  PopLocal             r0
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  Push                 r0
  PopLocal             r2
Try #0 start:
  PushConstant         CP#5
  DirectCall           CP#3, 1
  Drop1
  Jump                 L1
Try #0 end:
Try #0 handler:
  SetFrame             6
  Push                 r2
  PopLocal             r0
  MoveSpecial          exception, r2
  MoveSpecial          stackTrace, r3
  Push                 r0
  PopLocal             r4
Try #1 start:
  PushConstant         CP#7
  DirectCall           CP#3, 1
  Drop1
  Jump                 L2
Try #1 end:
Try #1 handler:
  SetFrame             6
  Push                 r4
  PopLocal             r0
  MoveSpecial          exception, r4
  MoveSpecial          stackTrace, r5
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  Push                 r4
  Push                 r5
  Throw                1
L2:
  Push                 r4
  PopLocal             r0
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  PushInt              43
  ReturnTOS
L1:
  Push                 r2
  PopLocal             r0
  Push                 r0
  PopLocal             r4
Try #2 start:
  PushConstant         CP#7
  DirectCall           CP#3, 1
  Drop1
  Jump                 L3
Try #2 end:
Try #2 handler:
  SetFrame             6
  Push                 r4
  PopLocal             r0
  MoveSpecial          exception, r4
  MoveSpecial          stackTrace, r5
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  Push                 r4
  Push                 r5
  Throw                1
L3:
  Push                 r4
  PopLocal             r0
  Push                 r0
  LoadContextVar       0, 0
  DirectCall           CP#3, 1
  Drop1
  PushInt              43
  ReturnTOS
}


Function 'testTryCatchFinally', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                5
  CheckStack           0
Try #0 start:
Try #1 start:
  PushConstant         CP#0
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
Try #1 end:
Try #1 handler:
  SetFrame             5
  MoveSpecial          exception, r2
  MoveSpecial          stackTrace, r3
  Push                 r2
  PopLocal             r4
  PushConstant         CP#4
  DirectCall           CP#1, 1
  Drop1
  Jump                 L1
L1:
  Jump                 L2
Try #0 end:
Try #0 handler:
  SetFrame             5
  MoveSpecial          exception, r0
  MoveSpecial          stackTrace, r1
  PushConstant         CP#5
  DirectCall           CP#1, 1
  Drop1
  Push                 r0
  Push                 r1
  Throw                1
L2:
  PushConstant         CP#5
  DirectCall           CP#1, 1
  Drop1
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 4, end 40, handler 40, needs-stack-trace, types [CP#3]
  try-index 1, outer 0, start 4, end 14, handler 14, types [CP#3]
}
ConstantPool {
  [0] = ObjectRef 'try'
  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
  [2] = Reserved
  [3] = Type dynamic
  [4] = ObjectRef 'catch'
  [5] = ObjectRef 'finally'
}


Function 'main', static, reflectable, debuggable
    parameters [] (required: 0)
    return-type dynamic

Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}


}
]library #lib from "#lib" as #lib {

  static method testTryCatch1() → dynamic {
    try {
      dart.core::print("danger!");
    }
    on dynamic catch(final dynamic e) {
      dart.core::print("caught ${e}");
    }
  }
  static method testTryCatch2() → dynamic {
    try {
      dart.core::print("danger!");
    }
    on dart.core::TypeError catch(no-exception-var) {
      dart.core::print("caught type error");
    }
    on dart.core::AssertionError catch(final dart.core::AssertionError e) {
      dart.core::print("caught assertion error ${e}");
    }
    on dart.core::Error catch(final dart.core::Error e, final dart.core::StackTrace st) {
      dart.core::print("caught error ${e} ${st}");
    }
    on dynamic catch(final dynamic e, final dart.core::StackTrace st) {
      dart.core::print("caught something ${e} ${st}");
    }
  }
  static method testTryCatch3() → dynamic {
    dart.core::int x = 1;
    try {
      dart.core::int y = 2;
      function foo() → void {
        try {
          dart.core::print("danger foo");
        }
        on dynamic catch(final dynamic e) {
          dart.core::print(x);
          y = 3;
        }
      }
      [@vm.call-site-attributes.metadata=receiverType:() → void] foo.call();
      dart.core::print(y);
    }
    on dynamic catch(final dynamic e, final dart.core::StackTrace st) {
      dart.core::print("caught ${e} ${st}");
      function bar() → void {
        try {
          dart.core::print("danger bar");
        }
        on dart.core::Error catch(final dart.core::Error e) {
          dart.core::print("error ${e}, captured stack trace: ${st}");
        }
      }
      return bar;
    }
  }
  static method testRethrow(dart.core::bool cond) → dynamic {
    try {
      try {
        dart.core::print("try 1 > try 2");
      }
      on dynamic catch(final dynamic e) {
        try {
          dart.core::print("try 1 > catch 2 > try 3");
          if(cond) {
            rethrow;
          }
        }
        on dynamic catch(final dynamic e) {
          dart.core::print("try 1 > catch 2 > catch 3");
        }
      }
    }
    on dynamic catch(final dynamic e, final dart.core::StackTrace st) {
      dart.core::print("catch 1");
      dart.core::print(st);
    }
  }
  static method testTryFinally1() → dynamic {
    #L1:
    for (dart.core::int i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
      try {
        if(i.{dart.core::num::>}(5)) {
          break #L1;
        }
      }
      finally {
        dart.core::print(i);
      }
    }
  }
  static method testTryFinally2(dart.core::int x) → dynamic {
    #L2:
    switch(x) {
      #L3:
      case 1:
        {
          try {
            dart.core::print("before try 1");
            dart.core::int y = 3;
            try {
              dart.core::print("try");
              function foo() → void {
                dart.core::print(x);
                dart.core::print(y);
              }
              [@vm.call-site-attributes.metadata=receiverType:() → void] foo.call();
              continue #L4;
            }
            finally {
              dart.core::print("finally 1");
            }
            dart.core::print("after try 1");
          }
          finally {
            dart.core::print("finally 2");
          }
          break #L2;
        }
      #L4:
      case 2:
        {
          dart.core::print("case 2");
          break #L2;
        }
    }
  }
  static method testTryFinally3() → dynamic {
    dart.core::int x = 11;
    dynamic y;
    try {
      y = () → dart.core::int {
        dart.core::print(x);
        try {
          dart.core::print("try 1");
          return 42;
        }
        finally {
          try {
            dart.core::print("try 2");
            return 43;
          }
          finally {
            dart.core::print(x);
          }
        }
      };
    }
    finally {
      dart.core::print(x);
      [@vm.call-site-attributes.metadata=receiverType:dynamic] y.call();
    }
  }
  static method testTryCatchFinally() → dynamic {
    try
      try {
        dart.core::print("try");
      }
      on dynamic catch(final dynamic e) {
        dart.core::print("catch");
      }
    finally {
      dart.core::print("finally");
    }
  }
  static method main() → dynamic {}
}
