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
  StoreLocal           r5
  Push                 r5
  UncheckedClosureCall CP#17, 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#18
  StoreIndexedTOS
  Push                 r5
  PushInt              1
  Push                 r4
  StoreIndexedTOS
  Push                 r5
  PushInt              2
  PushConstant         CP#19
  StoreIndexedTOS
  Push                 r5
  PushInt              3
  Push                 r0
  LoadContextVar       0, 2
  StoreIndexedTOS
  DirectCall           CP#20, 1
  DirectCall           CP#4, 1
  Drop1
  AllocateClosure      CP#22
  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#22
  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 84, handler 84, 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] = ObjectRef 'caught '
  [19] = ObjectRef ' '
  [20] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
  [21] = Reserved
  [22] = ClosureFunction 1
  [23] = ObjectRef 'danger bar'
  [24] = Type dart:core::Error
  [25] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
  [26] = Reserved
  [27] = ObjectRef 'error '
  [28] = ObjectRef ', captured stack trace: '
  [29] = EndClosureFunctionScope
}
Closure #lib::testTryCatch3::'foo' () -> void
ClosureCode {
  EntryFixed           1, 6
  Push                 FP[-5]
  LoadFieldTOS         CP#1
  PopLocal             r0
  CheckStack           0
  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
  Push                 FP[-5]
  LoadFieldTOS         CP#1
  PopLocal             r0
  CheckStack           0
  Push                 r0
  PopLocal             r2
Try #0 start:
  PushConstant         CP#23
  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#24
  InterfaceCall        CP#25, 2
  JumpIfFalse          L2
  Push                 r2
  PopLocal             r4
  PushNull
  PushInt              4
  CreateArrayTOS
  StoreLocal           r5
  Push                 r5
  PushInt              0
  PushConstant         CP#27
  StoreIndexedTOS
  Push                 r5
  PushInt              1
  Push                 r4
  StoreIndexedTOS
  Push                 r5
  PushInt              2
  PushConstant         CP#28
  StoreIndexedTOS
  Push                 r5
  PushInt              3
  Push                 r0
  LoadContextVar       0, 2
  StoreIndexedTOS
  DirectCall           CP#20, 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
  StoreLocal           r8
  Push                 r8
  UncheckedClosureCall CP#19, 1
  Drop1
  Jump                 L4
Try #1 end:
Try #1 handler:
  SetFrame             9
  Push                 r5
  PopLocal             r0
  MoveSpecial          exception, r5
  MoveSpecial          stackTrace, r6
  PushConstant         CP#21
  DirectCall           CP#3, 1
  Drop1
  Push                 r5
  Push                 r6
  Throw                1
L4:
  Push                 r5
  PopLocal             r0
  PushConstant         CP#21
  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#23
  DirectCall           CP#3, 1
  Drop1
  Push                 r3
  Push                 r4
  Throw                1
L5:
  Push                 r3
  PopLocal             r0
  PushConstant         CP#23
  DirectCall           CP#3, 1
  Drop1
  Jump                 L2
L2:
  PushConstant         CP#24
  DirectCall           CP#3, 1
  Drop1
  Jump                 L3
L3:
  PushNull
  ReturnTOS
}
ExceptionsTable {
  try-index 0, outer -1, start 53, end 162, handler 162, needs-stack-trace, types [CP#20]
  try-index 1, outer 0, start 70, end 124, handler 124, needs-stack-trace, types [CP#20]
}
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] = Type dynamic
  [21] = ObjectRef 'finally 1'
  [22] = ObjectRef 'after try 1'
  [23] = ObjectRef 'finally 2'
  [24] = ObjectRef 'case 2'
}
Closure #lib::testTryFinally2::'foo' () -> void
ClosureCode {
  EntryFixed           1, 2
  Push                 FP[-5]
  LoadFieldTOS         CP#7
  PopLocal             r0
  CheckStack           0
  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#18, 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#18, 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] = DynamicCall 'call', ArgDesc num-args 1, num-type-args 0, names []
  [19] = Reserved
}
Closure #lib::testTryFinally3::'<anonymous closure>' () -> dart:core::int
ClosureCode {
  EntryFixed           1, 6
  Push                 FP[-5]
  LoadFieldTOS         CP#1
  PopLocal             r0
  CheckStack           0
  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 #C1:
        {
          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 #C2:
        {
          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 {}
}
constants  {
  #C1 = 1
  #C2 = 2
}
