[vm,dart2bytecode,modular_aot] Variable-length closure objects

Extend closure objects with variable number of elements to capture.
This is needed to support capturing multiple independent contexts
after capturing is computed in the front-end.

The following fixed Closure fields are moved into variable-length
elements:
 - delayed type arguments;
 - instantiator type arguments;
 - function type arguments;
 - context.

Number of elements and presence/indices of various type arguments
are encoded into the new length_and_flags field in the Closure.

Most closure objects don't need any of the type arguments so this
change will reduce average Closure object size.

TEST=ci
Issue: https://github.com/dart-lang/sdk/issues/61572
Issue: https://github.com/dart-lang/sdk/issues/61635

Change-Id: I7ca5cec0fd8725c432a01d51781fb14e803997dd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/489482
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
Reviewed-by: Tess Strickland <sstrickl@google.com>
This commit is contained in:
Alexander Markov
2026-04-09 12:22:21 -07:00
committed by Commit Queue
parent 9cb2707639
commit 88496ba1c3
88 changed files with 2794 additions and 1393 deletions
+18 -2
View File
@@ -47,7 +47,7 @@ which reside in different sections such as libraries, classes, members, code, et
```
type BytecodeFile {
UInt32 magic = 0x44424333; // 'DBC3'
UInt32 formatVersion = 1;
UInt32 formatVersion = 2;
// Descriptors of the sections below.
// Each section has a fixed index in the descriptors array.
@@ -816,6 +816,14 @@ type ConstantDeferredLibraryPrefix extends ConstantPoolEntry {
PackedObject enclosingLibrary;
PackedObject targetLibrary;
}
// Occupies 2 entries in the constant pool
type ConstantAllocateClosure extends ConstantPoolEntry {
Byte tag = 18;
UInt closureIndex;
UInt numElements;
UInt flags = (hasDelayedTypeArguments, hasInstantiatorTypeArguments, hasFunctionTypeArguments);
}
```
### Exceptions table
@@ -1423,7 +1431,15 @@ SP[0] = SP[-1] <op> SP[0] ? true : false
#### AllocateClosure D
Allocate closure object for closure function ConstantPool[D].
Allocate closure object described by ConstantAllocateClosure in ConstantPool[D].
#### LoadClosureElement D
Load element [D] from closure SP[0] and push it onto the stack.
#### StoreClosureElement D
Store object SP[0] into the element [D] of closure SP[-1].
#### Nop
+14 -2
View File
@@ -787,9 +787,21 @@ class BytecodeAssembler {
}
@pragma('vm:prefer-inline')
void emitAllocateClosure() {
void emitAllocateClosure(int rd) {
emitSourcePosition();
_emitInstruction0(Opcode.kAllocateClosure);
_emitInstructionD(Opcode.kAllocateClosure, rd);
}
@pragma('vm:prefer-inline')
void emitLoadClosureElement(int rd) {
emitSourcePosition();
_emitInstructionD(Opcode.kLoadClosureElement, rd);
}
@pragma('vm:prefer-inline')
void emitStoreClosureElement(int rd) {
emitSourcePosition();
_emitInstructionD(Opcode.kStoreClosureElement, rd);
}
@pragma('vm:prefer-inline')
+70 -65
View File
@@ -1010,8 +1010,6 @@ class BytecodeGenerator extends RecursiveVisitor {
'_interpolate',
);
late Class closureClass = libraryIndex.getClass('dart:core', '_Closure');
late Procedure objectInstanceOf = libraryIndex.getProcedure(
'dart:core',
'Object',
@@ -1024,36 +1022,6 @@ class BytecodeGenerator extends RecursiveVisitor {
'_simpleInstanceOf',
);
late Field closureInstantiatorTypeArguments = libraryIndex.getField(
'dart:core',
'_Closure',
'_instantiator_type_arguments',
);
late Field closureFunctionTypeArguments = libraryIndex.getField(
'dart:core',
'_Closure',
'_function_type_arguments',
);
late Field closureDelayedTypeArguments = libraryIndex.getField(
'dart:core',
'_Closure',
'_delayed_type_arguments',
);
late Field closureFunction = libraryIndex.getField(
'dart:core',
'_Closure',
'_function',
);
late Field closureContext = libraryIndex.getField(
'dart:core',
'_Closure',
'_context',
);
late Procedure prependTypeArguments = libraryIndex.getTopLevelProcedure(
'dart:_internal',
'_prependTypeArguments',
@@ -2226,7 +2194,7 @@ class BytecodeGenerator extends RecursiveVisitor {
if (isClosure) {
asm.emitPush(locals.closureVarIndexInFrame);
asm.emitLoadFieldTOS(cp.addInstanceField(closureContext));
asm.emitLoadClosureElement(contextClosureElement);
asm.emitPopLocal(locals.contextVarIndexInFrame);
}
@@ -2294,7 +2262,7 @@ class BytecodeGenerator extends RecursiveVisitor {
final int numParentTypeArgs = locals.numParentTypeArguments;
asm.emitPush(locals.functionTypeArgsVarIndexInFrame);
asm.emitPush(locals.closureVarIndexInFrame);
asm.emitLoadFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
asm.emitLoadClosureElement(functionTypeArgumentsClosureElement);
_genPushInt(numParentTypeArgs);
_genPushInt(numParentTypeArgs + function.typeParameters.length);
_genDirectCall(
@@ -2305,17 +2273,35 @@ class BytecodeGenerator extends RecursiveVisitor {
asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
} else {
asm.emitPush(locals.closureVarIndexInFrame);
asm.emitLoadFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
asm.emitLoadClosureElement(functionTypeArgumentsClosureElement);
asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
}
}
}
bool get closureHasDelayedTypeArguments =>
enclosingFunction!.typeParameters.isNotEmpty;
bool get closureHasInstantiatorTypeArguments =>
instantiatorTypeArguments != null;
bool get closureHasFunctionTypeArguments =>
locals.hasFunctionTypeArgsVar && locals.numParentTypeArguments > 0;
int get delayedTypeArgumentsClosureElement => 0;
int get instantiatorTypeArgumentsClosureElement =>
(closureHasDelayedTypeArguments ? 1 : 0);
int get functionTypeArgumentsClosureElement =>
(closureHasDelayedTypeArguments ? 1 : 0) +
(closureHasInstantiatorTypeArguments ? 1 : 0);
int get contextClosureElement =>
(closureHasDelayedTypeArguments ? 1 : 0) +
(closureHasInstantiatorTypeArguments ? 1 : 0) +
(closureHasFunctionTypeArguments ? 1 : 0);
void _handleDelayedTypeArguments(Label doneCheckingTypeArguments) {
Label noDelayedTypeArgs = new Label();
asm.emitPush(locals.closureVarIndexInFrame);
asm.emitLoadFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
asm.emitLoadClosureElement(delayedTypeArgumentsClosureElement);
asm.emitStoreLocal(locals.functionTypeArgsVarIndexInFrame);
asm.emitPushConstant(cp.addEmptyTypeArguments());
asm.emitJumpIfEqStrict(noDelayedTypeArgs);
@@ -2347,7 +2333,7 @@ class BytecodeGenerator extends RecursiveVisitor {
(t) => containsTypeParameter(t, functionTypeParametersSet!),
)) {
asm.emitPush(locals.closureVarIndexInFrame);
asm.emitLoadFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
asm.emitLoadClosureElement(functionTypeArgumentsClosureElement);
asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
}
@@ -2802,7 +2788,7 @@ class BytecodeGenerator extends RecursiveVisitor {
);
closures.add(closure);
final int closureFunctionIndex = cp.addClosureFunction(closureIndex);
cp.addClosureFunction(closureIndex);
_recordSourcePosition(function.fileOffset, SourcePositions.syntheticFlag);
_genPrologue(node, function);
@@ -2856,7 +2842,7 @@ class BytecodeGenerator extends RecursiveVisitor {
_popAssemblerState();
return closureFunctionIndex;
return closureIndex;
}
ClosureDeclaration getClosureDeclaration(
@@ -2972,40 +2958,59 @@ class BytecodeGenerator extends RecursiveVisitor {
void _genAllocateClosureInstance(
TreeNode node,
int closureFunctionIndex,
int closureIndex,
FunctionNode function,
) {
asm.emitPushConstant(closureFunctionIndex);
asm.emitPush(locals.contextVarIndexInFrame);
_genPushInstantiatorTypeArguments();
asm.emitAllocateClosure();
final bool hasDelayedTypeArguments = function.typeParameters.isNotEmpty;
final bool hasInstantiatorTypeArguments = instantiatorTypeArguments != null;
final bool hasFunctionTypeArguments = locals.hasFunctionTypeArgsVar;
final numElements =
(hasDelayedTypeArguments ? 1 : 0) +
(hasInstantiatorTypeArguments ? 1 : 0) +
(hasFunctionTypeArguments ? 1 : 0) + /* context */
1;
final bool storeFunctionTAV = locals.hasFunctionTypeArgsVar;
final bool setEmptyDelayedTAV = function.typeParameters.isNotEmpty;
asm.emitAllocateClosure(
cp.addAllocateClosure(
closureIndex,
numElements,
hasDelayedTypeArguments: hasDelayedTypeArguments,
hasInstantiatorTypeArguments: hasInstantiatorTypeArguments,
hasFunctionTypeArguments: hasFunctionTypeArguments,
),
);
if (storeFunctionTAV || setEmptyDelayedTAV) {
final int temp = locals.tempIndexInFrame(node);
asm.emitStoreLocal(temp);
final int temp = locals.tempIndexInFrame(node);
asm.emitStoreLocal(temp);
if (storeFunctionTAV) {
asm.emitPush(temp);
_genPushFunctionTypeArguments();
asm.emitStoreFieldTOS(
cp.addInstanceField(closureFunctionTypeArguments),
);
}
if (setEmptyDelayedTAV) {
asm.emitPush(temp);
asm.emitPushConstant(cp.addEmptyTypeArguments());
asm.emitStoreFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
}
var elementIndex = 0;
if (hasDelayedTypeArguments) {
asm.emitPush(temp);
asm.emitPushConstant(cp.addEmptyTypeArguments());
asm.emitStoreClosureElement(elementIndex++);
}
if (hasInstantiatorTypeArguments) {
asm.emitPush(temp);
_genPushInstantiatorTypeArguments();
asm.emitStoreClosureElement(elementIndex++);
}
if (hasFunctionTypeArguments) {
asm.emitPush(temp);
_genPushFunctionTypeArguments();
asm.emitStoreClosureElement(elementIndex++);
}
asm.emitPush(temp);
asm.emitPush(locals.contextVarIndexInFrame);
asm.emitStoreClosureElement(elementIndex++);
assert(elementIndex == numElements);
}
void _genClosure(LocalFunction node, String name, FunctionNode function) {
final int closureFunctionIndex = _genClosureBytecode(node, name, function);
_genAllocateClosureInstance(node, closureFunctionIndex, function);
final int closureIndex = _genClosureBytecode(node, name, function);
_genAllocateClosureInstance(node, closureIndex, function);
}
void _allocateContextIfNeeded() {
@@ -4654,7 +4659,7 @@ class BytecodeGenerator extends RecursiveVisitor {
// 1. Restore context from closure var.
// This context has a context level at frame entry.
asm.emitPush(locals.closureVarIndexInFrame);
asm.emitLoadFieldTOS(cp.addInstanceField(closureContext));
asm.emitLoadClosureElement(contextClosureElement);
asm.emitPopLocal(locals.contextVarIndexInFrame);
// 2. Restore context from captured :saved_try_context_var${depth}.
+71
View File
@@ -33,6 +33,7 @@ enum ConstantTag {
kExternalCall,
kFfiCall,
kDeferredLibraryPrefix,
kAllocateClosure,
}
String constantTagToString(ConstantTag tag) =>
@@ -93,6 +94,8 @@ abstract class ConstantPoolEntry {
return new ConstantFfiCall.read(reader);
case ConstantTag.kDeferredLibraryPrefix:
return new ConstantDeferredLibraryPrefix.read(reader);
case ConstantTag.kAllocateClosure:
return new ConstantAllocateClosure.read(reader);
}
throw 'Unexpected constant tag $tag';
}
@@ -607,6 +610,52 @@ class ConstantDeferredLibraryPrefix extends ConstantPoolEntry {
this.targetLibrary == other.targetLibrary;
}
class ConstantAllocateClosure extends ConstantPoolEntry {
static const int hasDelayedTypeArguments = 1 << 0;
static const int hasInstantiatorTypeArguments = 1 << 1;
static const int hasFunctionTypeArguments = 1 << 2;
final int closureIndex;
final int numElements;
final int flags;
ConstantAllocateClosure(this.closureIndex, this.numElements, this.flags);
@override
ConstantTag get tag => ConstantTag.kAllocateClosure;
// 2 slots: function, encoded length and flags.
@override
int get numReservedEntries => 1;
@override
void writeValue(BufferedWriter writer) {
writer.writePackedUInt30(closureIndex);
writer.writePackedUInt30(numElements);
writer.writePackedUInt30(flags);
}
ConstantAllocateClosure.read(BufferedReader reader)
: closureIndex = reader.readPackedUInt30(),
numElements = reader.readPackedUInt30(),
flags = reader.readPackedUInt30();
@override
String toString() {
return 'AllocateClosure $closureIndex, num-elements: $numElements, flags: $flags';
}
@override
int get hashCode => closureIndex.hashCode;
@override
bool operator ==(other) =>
other is ConstantAllocateClosure &&
this.closureIndex == other.closureIndex &&
this.flags == other.flags &&
this.numElements == other.numElements;
}
/// Reserved constant pool entry.
class _ReservedConstantPoolEntry extends ConstantPoolEntry {
const _ReservedConstantPoolEntry();
@@ -788,6 +837,28 @@ class ConstantPool {
),
);
int addAllocateClosure(
int closureIndex,
int numElements, {
required bool hasDelayedTypeArguments,
required bool hasInstantiatorTypeArguments,
required bool hasFunctionTypeArguments,
}) => _add(
ConstantAllocateClosure(
closureIndex,
numElements,
(hasDelayedTypeArguments
? ConstantAllocateClosure.hasDelayedTypeArguments
: 0) |
(hasInstantiatorTypeArguments
? ConstantAllocateClosure.hasInstantiatorTypeArguments
: 0) |
(hasFunctionTypeArguments
? ConstantAllocateClosure.hasFunctionTypeArguments
: 0),
),
);
int _add(ConstantPoolEntry entry) {
int? index = _canonicalizationCache[entry];
if (index == null) {
+19 -3
View File
@@ -7,7 +7,7 @@ library;
/// Version of bytecode format
/// (should match runtime/vm/constants_kbc.h).
const int bytecodeFormatVersion = 1;
const int bytecodeFormatVersion = 2;
enum Opcode {
kTrap,
@@ -34,8 +34,14 @@ enum Opcode {
kAllocate_Wide,
kAllocateT,
kCreateArrayTOS,
// Closure allocation and access.
kAllocateClosure,
kUnused03,
kAllocateClosure_Wide,
kLoadClosureElement,
kLoadClosureElement_Wide,
kStoreClosureElement,
kStoreClosureElement_Wide,
// Context allocation and access.
kAllocateContext,
@@ -677,9 +683,19 @@ const Map<Opcode, Format> BytecodeFormats = const {
Operand.imm,
Operand.none,
]),
Opcode.kAllocateClosure: const Format(Encoding.k0, const [
Opcode.kAllocateClosure: const Format(Encoding.kD, const [
Operand.lit,
Operand.none,
Operand.none,
]),
Opcode.kLoadClosureElement: const Format(Encoding.kD, const [
Operand.imm,
Operand.none,
Operand.none,
]),
Opcode.kStoreClosureElement: const Format(Encoding.kD, const [
Operand.imm,
Operand.none,
Operand.none,
]),
Opcode.kUncheckedClosureCall: const Format(Encoding.kDF, const [
+4 -22
View File
@@ -1076,37 +1076,19 @@ class _Allocator extends RecursiveVisitor {
_visitFunction(node);
}
// A temporary is only needed for function declarations or expressions when:
// * There are function type arguments to capture.
// * The function is generic and so the delayed type arguments field of the
// closure must be empty-initialized, not null-initialized.
bool _closureAllocationNeedsTemp(FunctionNode function) =>
_currentFrame.functionTypeArgsVar != null ||
function.typeParameters.isNotEmpty;
@override
void visitFunctionDeclaration(FunctionDeclaration node) {
_allocateVariable(node.variable);
final needsTemp = _closureAllocationNeedsTemp(node.function);
if (needsTemp) {
_allocateTemp(node);
}
_allocateTemp(node);
_visitFunction(node);
if (needsTemp) {
_freeTemp(node);
}
_freeTemp(node);
}
@override
void visitFunctionExpression(FunctionExpression node) {
final needsTemp = _closureAllocationNeedsTemp(node.function);
if (needsTemp) {
_allocateTemp(node);
}
_allocateTemp(node);
_visitFunction(node);
if (needsTemp) {
_freeTemp(node);
}
_freeTemp(node);
}
@override
+57 -55
View File
@@ -9,52 +9,53 @@ Class '', script = 'DART_SDK/pkg/dart2bytecode/testcases/async.dart'
Field 'asyncInFieldInitializer', type = FunctionType (dart:async::Future < dart:core::int >) -> dart:async::Future < Null >, getter = 'get:asyncInFieldInitializer', reflectable, static, is-late, has-initializer
initializer
Bytecode {
Entry 2
Entry 3
CheckStack 0
PushConstant CP#0
AllocateClosure CP#15
StoreLocal r2
Push r2
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = Type dart:async::Future < dart:core::int >
[4] = ObjectRef 'x'
[5] = SubtypeTestCache
[6] = ObjectRef < Null >
[7] = DirectCall 'dart:async::_SuspendState::_initAsync', ArgDesc num-args 0, num-type-args 1, names []
[8] = Reserved
[9] = Type dynamic
[10] = DirectCall 'dart:async::_SuspendState::_await', ArgDesc num-args 2, num-type-args 0, names []
[1] = Type dart:async::Future < dart:core::int >
[2] = ObjectRef 'x'
[3] = SubtypeTestCache
[4] = ObjectRef < Null >
[5] = DirectCall 'dart:async::_SuspendState::_initAsync', ArgDesc num-args 0, num-type-args 1, names []
[6] = Reserved
[7] = Type dynamic
[8] = DirectCall 'dart:async::_SuspendState::_await', ArgDesc num-args 2, num-type-args 0, names []
[9] = Reserved
[10] = DirectCall 'dart:async::_SuspendState::_returnAsync', ArgDesc num-args 2, num-type-args 0, names []
[11] = Reserved
[12] = DirectCall 'dart:async::_SuspendState::_returnAsync', ArgDesc num-args 2, num-type-args 0, names []
[12] = DirectCall 'dart:async::_SuspendState::_handleException', ArgDesc num-args 3, num-type-args 0, names []
[13] = Reserved
[14] = DirectCall 'dart:async::_SuspendState::_handleException', ArgDesc num-args 3, num-type-args 0, names []
[15] = Reserved
[16] = EndClosureFunctionScope
[14] = EndClosureFunctionScope
[15] = AllocateClosure 0, num-elements: 1, flags: 0
[16] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/async.dart::asyncInFieldInitializer (field)::'<anonymous closure>' async (dart:async::Future < dart:core::int > x) -> dart:async::Future < Null >
ClosureCode {
EntrySuspendable 2, 0, 0
Frame 5
Push r1
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r3
CheckStack 0
JumpIfUnchecked L1
Push r2
PushConstant CP#3
PushConstant CP#1
PushNull
PushNull
PushConstant CP#4
AssertAssignable 0, CP#5
PushConstant CP#2
AssertAssignable 0, CP#3
Drop1
L1:
PushConstant CP#6
DirectCall CP#7, 1
PushConstant CP#4
DirectCall CP#5, 1
PopLocal r0
Try #0 start:
Push r2
@@ -62,7 +63,7 @@ Try #0 start:
Suspend L2
Push r0
Push r6
DirectCall CP#10, 2
DirectCall CP#8, 2
ReturnTOS
L2:
Drop1
@@ -72,7 +73,7 @@ L2:
Push r5
PushNull
PopLocal r0
DirectCall CP#12, 2
DirectCall CP#10, 2
ReturnTOS
Try #0 end:
Try #0 handler:
@@ -84,7 +85,7 @@ Try #0 handler:
Push r0
MoveSpecial stackTrace, r0
Push r0
DirectCall CP#14, 3
DirectCall CP#12, 3
ReturnTOS
L3:
MoveSpecial exception, r0
@@ -529,7 +530,7 @@ Function 'closure', static, reflectable, debuggable
return-type dynamic
Bytecode {
Entry 3
Entry 4
CheckStack 0
AllocateContext 0, 2
PopLocal r0
@@ -539,43 +540,44 @@ Bytecode {
Push r0
PushInt 3
StoreContextVar 0, 1
PushConstant CP#0
AllocateClosure CP#15
StoreLocal r3
Push r3
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r2
Push r2
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = ObjectRef < dart:core::int >
[4] = DirectCall 'dart:async::_SuspendState::_initAsync', ArgDesc num-args 0, num-type-args 1, names []
[5] = Reserved
[6] = Type dynamic
[7] = DirectCall 'dart:async::_SuspendState::_await', ArgDesc num-args 2, num-type-args 0, names []
[8] = Reserved
[9] = ObjectRef 'fin'
[10] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[1] = ObjectRef < dart:core::int >
[2] = DirectCall 'dart:async::_SuspendState::_initAsync', ArgDesc num-args 0, num-type-args 1, names []
[3] = Reserved
[4] = Type dynamic
[5] = DirectCall 'dart:async::_SuspendState::_await', ArgDesc num-args 2, num-type-args 0, names []
[6] = Reserved
[7] = ObjectRef 'fin'
[8] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[9] = Reserved
[10] = DirectCall 'dart:async::_SuspendState::_returnAsync', ArgDesc num-args 2, num-type-args 0, names []
[11] = Reserved
[12] = DirectCall 'dart:async::_SuspendState::_returnAsync', ArgDesc num-args 2, num-type-args 0, names []
[12] = DirectCall 'dart:async::_SuspendState::_handleException', ArgDesc num-args 3, num-type-args 0, names []
[13] = Reserved
[14] = DirectCall 'dart:async::_SuspendState::_handleException', ArgDesc num-args 3, num-type-args 0, names []
[15] = Reserved
[16] = EndClosureFunctionScope
[14] = EndClosureFunctionScope
[15] = AllocateClosure 0, num-elements: 1, flags: 0
[16] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/async.dart::closure::'nested' async () -> dart:async::Future < dart:core::int >
ClosureCode {
EntrySuspendable 1, 0, 0
Frame 8
Push r1
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r2
CheckStack 0
PushConstant CP#3
DirectCall CP#4, 1
PushConstant CP#1
DirectCall CP#2, 1
PopLocal r0
Try #0 start:
PushInt 4
@@ -592,7 +594,7 @@ Try #1 start:
Suspend L1
Push r0
Push r8
DirectCall CP#7, 2
DirectCall CP#5, 2
ReturnTOS
L1:
PopLocal r5
@@ -609,8 +611,8 @@ Try #1 handler:
PopLocal r2
MoveSpecial exception, r6
MoveSpecial stackTrace, r7
PushConstant CP#9
DirectCall CP#10, 1
PushConstant CP#7
DirectCall CP#8, 1
Drop1
Push r6
Push r7
@@ -618,8 +620,8 @@ Try #1 handler:
L2:
Push r6
PopLocal r2
PushConstant CP#9
DirectCall CP#10, 1
PushConstant CP#7
DirectCall CP#8, 1
Drop1
Push r4
PopLocal r4
@@ -627,7 +629,7 @@ L2:
Push r4
PushNull
PopLocal r0
DirectCall CP#12, 2
DirectCall CP#10, 2
ReturnTOS
Try #0 end:
Try #0 handler:
@@ -639,7 +641,7 @@ Try #0 handler:
Push r0
MoveSpecial stackTrace, r0
Push r0
DirectCall CP#14, 3
DirectCall CP#12, 3
ReturnTOS
L3:
MoveSpecial exception, r0
+257 -225
View File
@@ -19,10 +19,11 @@ Bytecode {
Push r0
PushInt 5
StoreContextVar 0, 0
PushConstant CP#0
AllocateClosure CP#5
StoreLocal r3
Push r3
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r2
Push r2
StoreLocal r3
@@ -36,28 +37,28 @@ Bytecode {
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = Type dart:core::int
[4] = ObjectRef 'y'
[5] = SubtypeTestCache
[6] = EndClosureFunctionScope
[1] = Type dart:core::int
[2] = ObjectRef 'y'
[3] = SubtypeTestCache
[4] = EndClosureFunctionScope
[5] = AllocateClosure 0, num-elements: 1, flags: 0
[6] = Reserved
[7] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
}
Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::simpleClosure::'<anonymous closure>' (dart:core::int y) -> Null
ClosureCode {
Entry 2
Push FP[-6]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
JumpIfUnchecked L1
Push FP[-5]
PushConstant CP#3
PushConstant CP#1
PushNull
PushNull
PushConstant CP#4
AssertAssignable 1, CP#5
PushConstant CP#2
AssertAssignable 1, CP#3
Drop1
L1:
Push r0
@@ -188,51 +189,47 @@ Function 'testPartialInstantiation', static, reflectable, debuggable
Bytecode {
Entry 5
CheckStack 0
PushConstant CP#0
Push r0
PushNull
AllocateClosure
AllocateClosure CP#8
StoreLocal r3
Push r3
PushConstant CP#5
StoreFieldTOS CP#3
PushConstant CP#1
StoreClosureElement 0
Push r3
Push r0
StoreClosureElement 1
PopLocal r2
Push r2
PushConstant CP#14
DirectCall CP#15, 2
PushConstant CP#10
DirectCall CP#11, 2
PopLocal r4
Push r4
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
[4] = Reserved
[5] = EmptyTypeArguments
[6] = InstanceField dart:core::_Closure::_function_type_arguments (field)
[7] = Reserved
[8] = DirectCall 'dart:_internal::_prependTypeArguments', ArgDesc num-args 4, num-type-args 0, names []
[1] = EmptyTypeArguments
[2] = DirectCall 'dart:_internal::_prependTypeArguments', ArgDesc num-args 4, num-type-args 0, names []
[3] = Reserved
[4] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::testPartialInstantiation::Closure/0::TypeParam/0
[5] = ObjectRef 't'
[6] = SubtypeTestCache
[7] = EndClosureFunctionScope
[8] = AllocateClosure 0, num-elements: 2, flags: 1
[9] = Reserved
[10] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::testPartialInstantiation::Closure/0::TypeParam/0
[11] = ObjectRef 't'
[12] = SubtypeTestCache
[13] = EndClosureFunctionScope
[14] = ObjectRef < dart:core::int >
[15] = DirectCall 'dart:_internal::_instantiateClosure', ArgDesc num-args 2, num-type-args 0, names []
[16] = Reserved
[10] = ObjectRef < dart:core::int >
[11] = DirectCall 'dart:_internal::_instantiateClosure', ArgDesc num-args 2, num-type-args 0, names []
[12] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::testPartialInstantiation::'foo' type-params <'T' extends dart:core::Object? (default dynamic)> (DART_SDK/pkg/dart2bytecode/testcases/closures.dart::testPartialInstantiation::Closure/0::TypeParam/0 t) -> void
ClosureCode {
Entry 3
Push FP[-6]
LoadFieldTOS CP#1
LoadClosureElement 1
PopLocal r1
Push FP[-6]
LoadFieldTOS CP#3
LoadClosureElement 0
StoreLocal r0
PushConstant CP#5
PushConstant CP#1
JumpIfEqStrict L1
CheckFunctionTypeArgs 0, r2
Jump L2
@@ -242,18 +239,18 @@ L2:
CheckStack 0
Push r0
Push FP[-6]
LoadFieldTOS CP#6
LoadClosureElement 1
PushInt 0
PushInt 1
DirectCall CP#8, 4
DirectCall CP#2, 4
PopLocal r0
JumpIfUnchecked L3
Push FP[-5]
PushConstant CP#10
PushConstant CP#4
PushNull
Push r0
PushConstant CP#11
AssertAssignable 0, CP#12
PushConstant CP#5
AssertAssignable 0, CP#6
Drop1
L3:
PushNull
@@ -488,69 +485,72 @@ Bytecode {
Push r1
Push FP[-5]
StoreContextVar 0, 0
PushConstant CP#0
Push r1
Push FP[-5]
LoadTypeArgumentsField CP#13
AllocateClosure
AllocateClosure CP#34
StoreLocal r4
Push r4
Push r0
StoreFieldTOS CP#6
PushConstant CP#1
StoreClosureElement 0
Push r4
PushConstant CP#5
StoreFieldTOS CP#3
Push FP[-5]
LoadTypeArgumentsField CP#7
StoreClosureElement 1
Push r4
Push r0
StoreClosureElement 2
Push r4
Push r1
StoreClosureElement 3
PopLocal r3
PushConstant CP#36
Push r3
Push r3
UncheckedClosureCall CP#33, 2
UncheckedClosureCall CP#31, 2
Drop1
PushConstant CP#37
Push r3
Push r3
UncheckedClosureCall CP#33, 2
UncheckedClosureCall CP#31, 2
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
[4] = Reserved
[5] = EmptyTypeArguments
[6] = InstanceField dart:core::_Closure::_function_type_arguments (field)
[7] = Reserved
[8] = DirectCall 'dart:_internal::_prependTypeArguments', ArgDesc num-args 4, num-type-args 0, names []
[9] = Reserved
[10] = ClosureFunction 1
[11] = ClosureFunction 2
[12] = ObjectRef < dart:core::Type >
[13] = TypeArgumentsField DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A
[14] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/0
[15] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/1
[16] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/0
[17] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/1
[18] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/0
[19] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/1
[20] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/0
[21] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/1
[22] = DirectCall 'dart:core::_GrowableList::_literal8 (constructor)', ArgDesc num-args 9, num-type-args 0, names []
[23] = Reserved
[24] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[1] = EmptyTypeArguments
[2] = DirectCall 'dart:_internal::_prependTypeArguments', ArgDesc num-args 4, num-type-args 0, names []
[3] = Reserved
[4] = ClosureFunction 1
[5] = ClosureFunction 2
[6] = ObjectRef < dart:core::Type >
[7] = TypeArgumentsField DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A
[8] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/0
[9] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/1
[10] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/0
[11] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/1
[12] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/0
[13] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/1
[14] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/0
[15] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/1
[16] = DirectCall 'dart:core::_GrowableList::_literal8 (constructor)', ArgDesc num-args 9, num-type-args 0, names []
[17] = Reserved
[18] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[19] = Reserved
[20] = ObjectRef < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/1, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/1, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/1, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/1 >
[21] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/closures.dart::callWithArgs', ArgDesc num-args 0, num-type-args 8, names []
[22] = Reserved
[23] = EndClosureFunctionScope
[24] = AllocateClosure 2, num-elements: 3, flags: 6
[25] = Reserved
[26] = ObjectRef < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::TypeParam/1, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::TypeParam/1, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/1, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/1 >
[27] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/closures.dart::callWithArgs', ArgDesc num-args 0, num-type-args 8, names []
[28] = Reserved
[29] = EndClosureFunctionScope
[30] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[31] = EndClosureFunctionScope
[32] = ObjectRef < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C7, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C8 >
[33] = ObjectRef ArgDesc num-args 1, num-type-args 2, names []
[34] = ObjectRef < dart:core::List < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C7 >, dart:core::List < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C8 > >
[35] = EndClosureFunctionScope
[26] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[27] = EndClosureFunctionScope
[28] = AllocateClosure 1, num-elements: 4, flags: 7
[29] = Reserved
[30] = ObjectRef < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C7, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C8 >
[31] = ObjectRef ArgDesc num-args 1, num-type-args 2, names []
[32] = ObjectRef < dart:core::List < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C7 >, dart:core::List < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C8 > >
[33] = EndClosureFunctionScope
[34] = AllocateClosure 0, num-elements: 4, flags: 7
[35] = Reserved
[36] = ObjectRef < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C5, DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C6 >
[37] = ObjectRef < dart:core::List < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C5 >, dart:core::List < DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C6 > >
}
@@ -558,12 +558,12 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::'nested1' ty
ClosureCode {
Entry 5
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 3
PopLocal r1
Push FP[-5]
LoadFieldTOS CP#3
LoadClosureElement 0
StoreLocal r0
PushConstant CP#5
PushConstant CP#1
JumpIfEqStrict L1
CheckFunctionTypeArgs 0, r2
Jump L2
@@ -573,34 +573,37 @@ L2:
CheckStack 0
Push r0
Push FP[-5]
LoadFieldTOS CP#6
LoadClosureElement 2
PushInt 2
PushInt 4
DirectCall CP#8, 4
DirectCall CP#2, 4
PopLocal r0
PushConstant CP#10
Push r1
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#13
AllocateClosure
AllocateClosure CP#28
StoreLocal r4
Push r4
Push r0
StoreFieldTOS CP#6
PushConstant CP#1
StoreClosureElement 0
Push r4
PushConstant CP#5
StoreFieldTOS CP#3
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#7
StoreClosureElement 1
Push r4
Push r0
StoreClosureElement 2
Push r4
Push r1
StoreClosureElement 3
PopLocal r3
PushConstant CP#30
Push r3
Push r3
UncheckedClosureCall CP#31, 2
Drop1
PushConstant CP#32
Push r3
Push r3
UncheckedClosureCall CP#33, 2
Drop1
PushConstant CP#34
Push r3
Push r3
UncheckedClosureCall CP#33, 2
UncheckedClosureCall CP#31, 2
Drop1
PushNull
ReturnTOS
@@ -610,12 +613,12 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::'
ClosureCode {
Entry 5
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 3
PopLocal r1
Push FP[-5]
LoadFieldTOS CP#3
LoadClosureElement 0
StoreLocal r0
PushConstant CP#5
PushConstant CP#1
JumpIfEqStrict L1
CheckFunctionTypeArgs 0, r2
Jump L2
@@ -625,26 +628,29 @@ L2:
CheckStack 0
Push r0
Push FP[-5]
LoadFieldTOS CP#6
LoadClosureElement 2
PushInt 4
PushInt 6
DirectCall CP#8, 4
DirectCall CP#2, 4
PopLocal r0
PushConstant CP#11
Push r1
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#13
AllocateClosure
AllocateClosure CP#24
StoreLocal r4
Push r4
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#7
StoreClosureElement 0
Push r4
Push r0
StoreFieldTOS CP#6
StoreClosureElement 1
Push r4
Push r1
StoreClosureElement 2
PopLocal r3
Push r3
StoreLocal r4
Push r4
UncheckedClosureCall CP#30, 1
UncheckedClosureCall CP#26, 1
Drop1
PushNull
ReturnTOS
@@ -654,50 +660,50 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::'
ClosureCode {
Entry 3
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 2
PopLocal r1
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#6
LoadClosureElement 1
PopLocal r0
PushConstant CP#12
PushConstant CP#6
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#13
LoadTypeArgumentsField CP#7
PushNull
InstantiateType CP#8
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#7
PushNull
InstantiateType CP#9
PushNull
Push r0
InstantiateType CP#10
PushNull
Push r0
InstantiateType CP#11
PushNull
Push r0
InstantiateType CP#12
PushNull
Push r0
InstantiateType CP#13
PushNull
Push r0
InstantiateType CP#14
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#13
PushNull
Push r0
InstantiateType CP#15
PushNull
Push r0
InstantiateType CP#16
PushNull
Push r0
InstantiateType CP#17
PushNull
Push r0
InstantiateType CP#18
PushNull
Push r0
InstantiateType CP#19
PushNull
Push r0
InstantiateType CP#20
PushNull
Push r0
InstantiateType CP#21
DirectCall CP#22, 9
DirectCall CP#24, 1
DirectCall CP#16, 9
DirectCall CP#18, 1
Drop1
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#13
LoadTypeArgumentsField CP#7
Push r0
InstantiateTypeArgumentsTOS 0, CP#26
DirectCall CP#27, 1
InstantiateTypeArgumentsTOS 0, CP#20
DirectCall CP#21, 1
Drop1
PushNull
ReturnTOS
@@ -753,22 +759,23 @@ Bytecode {
Push r0
PushInt 3
StoreContextVar 0, 2
PushConstant CP#0
AllocateClosure CP#14
StoreLocal r4
Push r4
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r3
Push r3
StoreLocal r4
PushInt 10
Push r4
UncheckedClosureCall CP#14, 2
UncheckedClosureCall CP#16, 2
Drop1
Push r3
StoreLocal r4
PushInt 11
Push r4
UncheckedClosureCall CP#14, 2
UncheckedClosureCall CP#16, 2
Drop1
Push r2
DirectCall CP#11, 1
@@ -784,10 +791,11 @@ Bytecode {
Push r0
PushInt 42
StoreContextVar 0, 3
PushConstant CP#15
AllocateClosure CP#21
StoreLocal r3
Push r3
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r2
Push r2
StoreLocal r3
@@ -799,30 +807,34 @@ Bytecode {
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = Type dart:core::int
[4] = ObjectRef 'y'
[5] = SubtypeTestCache
[6] = ClosureFunction 1
[7] = InterfaceCall 'DART_SDK/pkg/dart2bytecode/testcases/closures.dart::B::get:foo', ArgDesc num-args 1, num-type-args 0, names []
[8] = Reserved
[9] = EndClosureFunctionScope
[1] = Type dart:core::int
[2] = ObjectRef 'y'
[3] = SubtypeTestCache
[4] = ClosureFunction 1
[5] = InterfaceCall 'DART_SDK/pkg/dart2bytecode/testcases/closures.dart::B::get:foo', ArgDesc num-args 1, num-type-args 0, names []
[6] = Reserved
[7] = EndClosureFunctionScope
[8] = AllocateClosure 1, num-elements: 1, flags: 0
[9] = Reserved
[10] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[11] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[12] = Reserved
[13] = EndClosureFunctionScope
[14] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
[15] = ClosureFunction 2
[16] = InterfaceCall 'DART_SDK/pkg/dart2bytecode/testcases/closures.dart::B::set:foo', ArgDesc num-args 2, num-type-args 0, names []
[17] = Reserved
[18] = EndClosureFunctionScope
[14] = AllocateClosure 0, num-elements: 1, flags: 0
[15] = Reserved
[16] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
[17] = ClosureFunction 2
[18] = InterfaceCall 'DART_SDK/pkg/dart2bytecode/testcases/closures.dart::B::set:foo', ArgDesc num-args 2, num-type-args 0, names []
[19] = Reserved
[20] = EndClosureFunctionScope
[21] = AllocateClosure 2, num-elements: 1, flags: 0
[22] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::B::topLevel::'<anonymous closure>' (dart:core::int y) -> Null
ClosureCode {
Entry 4
Push FP[-6]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
AllocateContext 1, 2
@@ -836,11 +848,11 @@ ClosureCode {
StoreContextVar 1, 0
JumpIfUnchecked L1
Push FP[-5]
PushConstant CP#3
PushConstant CP#1
PushNull
PushNull
PushConstant CP#4
AssertAssignable 1, CP#5
PushConstant CP#2
AssertAssignable 1, CP#3
Drop1
L1:
Push r0
@@ -859,10 +871,11 @@ L1:
Push r0
PushInt 4
StoreContextVar 1, 1
PushConstant CP#6
AllocateClosure CP#8
StoreLocal r3
Push r3
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r2
Push r2
Push r2
@@ -881,7 +894,7 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::B::topLevel::Closure
ClosureCode {
Entry 2
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
@@ -896,7 +909,7 @@ ClosureCode {
Push r0
LoadContextParent
LoadContextVar 0, 0
InterfaceCall CP#7, 1
InterfaceCall CP#5, 1
Push r0
LoadContextVar 1, 0
AddInt
@@ -909,14 +922,14 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::B::topLevel::'<anony
ClosureCode {
Entry 3
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
LoadContextVar 0, 0
Push r0
LoadContextVar 0, 3
InterfaceCall CP#16, 2
InterfaceCall CP#18, 2
Drop1
PushNull
ReturnTOS
@@ -982,17 +995,19 @@ L2:
CompareIntLt
JumpIfFalse L1
Push r2
PushConstant CP#3
AllocateClosure CP#5
StoreLocal r4
Push r4
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
InstantiatedInterfaceCall CP#7, 2
Drop1
Push r3
PushConstant CP#10
AllocateClosure CP#15
StoreLocal r4
Push r4
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
InstantiatedInterfaceCall CP#7, 2
Drop1
Push r0
@@ -1023,9 +1038,9 @@ ConstantPool {
[1] = DirectCall 'dart:core::_GrowableList:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
[2] = Reserved
[3] = ClosureFunction 0
[4] = InstanceField dart:core::_Closure::_context (field)
[5] = Reserved
[6] = EndClosureFunctionScope
[4] = EndClosureFunctionScope
[5] = AllocateClosure 0, num-elements: 1, flags: 0
[6] = Reserved
[7] = InstantiatedInterfaceCall 'dart:core::List::add', ArgDesc num-args 2, num-type-args 0, names [], receiver dart:core::List < dart:core::Function >
[8] = Reserved
[9] = Reserved
@@ -1034,12 +1049,14 @@ ConstantPool {
[12] = ObjectRef 'ii'
[13] = SubtypeTestCache
[14] = EndClosureFunctionScope
[15] = AllocateClosure 1, num-elements: 1, flags: 0
[16] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C::testForLoop::'<anonymous closure>' () -> dart:core::int
ClosureCode {
Entry 2
Push FP[-5]
LoadFieldTOS CP#4
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
@@ -1055,7 +1072,7 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C::testForLoop::'<an
ClosureCode {
Entry 2
Push FP[-6]
LoadFieldTOS CP#4
LoadClosureElement 0
PopLocal r0
CheckStack 0
JumpIfUnchecked L1
@@ -1100,10 +1117,11 @@ L2:
Push r2
InterfaceCall CP#4, 1
StoreContextVar 0, 0
PushConstant CP#6
AllocateClosure CP#8
StoreLocal r4
Push r4
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r3
Push r3
StoreLocal r4
@@ -1130,9 +1148,9 @@ ConstantPool {
[4] = InterfaceCall 'dart:core::Iterator::get:current', ArgDesc num-args 1, num-type-args 0, names []
[5] = Reserved
[6] = ClosureFunction 0
[7] = InstanceField dart:core::_Closure::_context (field)
[8] = Reserved
[9] = EndClosureFunctionScope
[7] = EndClosureFunctionScope
[8] = AllocateClosure 0, num-elements: 1, flags: 0
[9] = Reserved
[10] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[11] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[12] = Reserved
@@ -1141,7 +1159,7 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::C::testForInLoop::'<
ClosureCode {
Entry 2
Push FP[-5]
LoadFieldTOS CP#7
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
@@ -1183,7 +1201,7 @@ Function 'foo', reflectable, debuggable
return-type dynamic
Bytecode {
Entry 2
Entry 3
CheckStack 0
AllocateContext 0, 1
PopLocal r0
@@ -1200,11 +1218,15 @@ Bytecode {
AssertAssignable 0, CP#3
Drop1
L1:
PushConstant CP#4
Push r0
AllocateClosure CP#6
StoreLocal r2
Push r2
Push FP[-6]
LoadTypeArgumentsField CP#1
AllocateClosure
StoreClosureElement 0
Push r2
Push r0
StoreClosureElement 1
ReturnTOS
}
Parameter flags: [2]
@@ -1214,15 +1236,15 @@ ConstantPool {
[2] = ObjectRef 't'
[3] = SubtypeTestCache
[4] = ClosureFunction 0
[5] = InstanceField dart:core::_Closure::_context (field)
[6] = Reserved
[7] = EndClosureFunctionScope
[5] = EndClosureFunctionScope
[6] = AllocateClosure 0, num-elements: 2, flags: 2
[7] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::D::foo::'<anonymous closure>' () -> DART_SDK/pkg/dart2bytecode/testcases/closures.dart::D::TypeParam/0
ClosureCode {
Entry 2
Push FP[-5]
LoadFieldTOS CP#5
LoadClosureElement 1
PopLocal r0
CheckStack 0
Push r0
@@ -1236,43 +1258,53 @@ Function 'bar', reflectable, debuggable
return-type dynamic
Bytecode {
Entry 2
Entry 3
CheckStack 0
AllocateContext 0, 1
PopLocal r0
Push r0
Push FP[-5]
StoreContextVar 0, 0
PushConstant CP#0
Push r0
AllocateClosure CP#8
StoreLocal r2
Push r2
Push FP[-5]
LoadTypeArgumentsField CP#5
AllocateClosure
StoreClosureElement 0
Push r2
Push r0
StoreClosureElement 1
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = ClosureFunction 1
[4] = EndClosureFunctionScope
[1] = ClosureFunction 1
[2] = EndClosureFunctionScope
[3] = AllocateClosure 1, num-elements: 2, flags: 2
[4] = Reserved
[5] = TypeArgumentsField DART_SDK/pkg/dart2bytecode/testcases/closures.dart::D
[6] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[7] = EndClosureFunctionScope
[8] = AllocateClosure 0, num-elements: 2, flags: 2
[9] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::D::bar::'<anonymous closure>' () -> Null
ClosureCode {
Entry 4
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 1
PopLocal r0
CheckStack 0
PushConstant CP#3
Push r0
AllocateClosure CP#3
StoreLocal r3
Push r3
Push r0
LoadContextVar 0, 0
LoadTypeArgumentsField CP#5
AllocateClosure
StoreClosureElement 0
Push r3
Push r0
StoreClosureElement 1
PopLocal r2
Push r2
Push r2
@@ -1286,7 +1318,7 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/closures.dart::D::bar::Closure/0::'
ClosureCode {
Entry 2
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 1
PopLocal r0
CheckStack 0
PushNull
+28 -26
View File
@@ -13,7 +13,7 @@ Function 'testVoidNoArg', static, reflectable, debuggable
return-type dynamic
Bytecode {
Entry 5
Entry 6
CheckStack 0
PushConstant CP#0
PushConstant CP#1
@@ -24,10 +24,11 @@ Bytecode {
Push r0
Push r2
StoreContextVar 0, 0
PushConstant CP#4
AllocateClosure CP#7
StoreLocal r5
Push r5
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r4
Push r4
Push r0
@@ -48,10 +49,10 @@ ConstantPool {
[2] = DirectCall 'dart:ffi::Pointer::fromAddress (constructor)', ArgDesc num-args 2, num-type-args 0, names []
[3] = Reserved
[4] = ClosureFunction 0
[5] = InstanceField dart:core::_Closure::_context (field)
[6] = Reserved
[7] = FfiCall
[8] = EndClosureFunctionScope
[5] = FfiCall
[6] = EndClosureFunctionScope
[7] = AllocateClosure 0, num-elements: 1, flags: 0
[8] = Reserved
[9] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
}
Closure DART_SDK/pkg/dart2bytecode/testcases/ffi.dart::testVoidNoArg::'#ffiClosure0' annotations const List<dynamic> [const dart:core::pragma {dart:core::pragma::name (field): 'vm:ffi:call-closure', dart:core::pragma::options (field): const dart:ffi::_FfiCall < FunctionType () -> dart:ffi::Void > {dart:ffi::_FfiCall::isLeaf (field): const false}}]
@@ -59,12 +60,12 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/ffi.dart::testVoidNoArg::'#ffiClosu
ClosureCode {
Entry 2
Push FP[-5]
LoadFieldTOS CP#5
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
LoadContextVar 0, 0
FfiCall CP#7
FfiCall CP#5
ReturnTOS
}
@@ -74,7 +75,7 @@ Function 'testIntInt', static, reflectable, debuggable
return-type dynamic
Bytecode {
Entry 5
Entry 6
CheckStack 0
PushConstant CP#0
PushConstant CP#1
@@ -85,10 +86,11 @@ Bytecode {
Push r0
Push r2
StoreContextVar 0, 0
PushConstant CP#4
AllocateClosure CP#10
StoreLocal r5
Push r5
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r4
Push r4
Push r0
@@ -108,13 +110,13 @@ ConstantPool {
[2] = DirectCall 'dart:ffi::Pointer::fromAddress (constructor)', ArgDesc num-args 2, num-type-args 0, names []
[3] = Reserved
[4] = ClosureFunction 0
[5] = InstanceField dart:core::_Closure::_context (field)
[6] = Reserved
[7] = Type dart:core::int
[8] = ObjectRef 'arg1'
[9] = SubtypeTestCache
[10] = FfiCall
[11] = EndClosureFunctionScope
[5] = Type dart:core::int
[6] = ObjectRef 'arg1'
[7] = SubtypeTestCache
[8] = FfiCall
[9] = EndClosureFunctionScope
[10] = AllocateClosure 0, num-elements: 1, flags: 0
[11] = Reserved
[12] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
}
Closure DART_SDK/pkg/dart2bytecode/testcases/ffi.dart::testIntInt::'#ffiClosure1' annotations const List<dynamic> [const dart:core::pragma {dart:core::pragma::name (field): 'vm:ffi:call-closure', dart:core::pragma::options (field): const dart:ffi::_FfiCall < FunctionType (dart:ffi::Int64) -> dart:ffi::Int32 > {dart:ffi::_FfiCall::isLeaf (field): const false}}]
@@ -122,16 +124,16 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/ffi.dart::testIntInt::'#ffiClosure1
ClosureCode {
Entry 2
Push FP[-6]
LoadFieldTOS CP#5
LoadClosureElement 0
PopLocal r0
CheckStack 0
JumpIfUnchecked L1
Push FP[-5]
PushConstant CP#7
PushConstant CP#5
PushNull
PushNull
PushConstant CP#8
AssertAssignable 1, CP#9
PushConstant CP#6
AssertAssignable 1, CP#7
Drop1
L1:
PushNull
@@ -139,7 +141,7 @@ L1:
Push FP[-5]
Push r0
LoadContextVar 0, 0
FfiCall CP#10
FfiCall CP#8
ReturnTOS
}
@@ -72,43 +72,44 @@ Bytecode {
Push r0
Push FP[-5]
StoreContextVar 0, 0
PushConstant CP#0
AllocateClosure CP#6
StoreLocal r3
Push r3
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r2
Push r2
Push r2
UncheckedClosureCall CP#6, 1
UncheckedClosureCall CP#4, 1
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = ObjectRef 'visibleInner'
[4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[5] = Reserved
[6] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[7] = EndClosureFunctionScope
[1] = ObjectRef 'visibleInner'
[2] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[3] = Reserved
[4] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[5] = EndClosureFunctionScope
[6] = AllocateClosure 0, num-elements: 1, flags: 0
[7] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/invisible.dart::visibleClosure::'visibleInner' () -> Null
ClosureCode {
Entry 3
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
PushConstant CP#3
DirectCall CP#4, 1
PushConstant CP#1
DirectCall CP#2, 1
Drop1
Push r0
LoadContextVar 0, 0
StoreLocal r2
Push r2
UncheckedClosureCall CP#6, 1
UncheckedClosureCall CP#4, 1
Drop1
PushNull
ReturnTOS
@@ -127,44 +128,45 @@ Bytecode {
Push r0
Push FP[-5]
StoreContextVar 0, 0
PushConstant CP#0
AllocateClosure CP#6
StoreLocal r3
Push r3
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r2
Push r2
Push r2
UncheckedClosureCall CP#6, 1
UncheckedClosureCall CP#4, 1
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[2] = Reserved
[3] = ObjectRef 'invisibleInner'
[4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[5] = Reserved
[6] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[7] = EndClosureFunctionScope
[1] = ObjectRef 'invisibleInner'
[2] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[3] = Reserved
[4] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[5] = EndClosureFunctionScope
[6] = AllocateClosure 0, num-elements: 1, flags: 0
[7] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/invisible.dart::invisibleClosure::'invisibleInner' invisible annotations const List<dynamic> [const dart:core::pragma {dart:core::pragma::name (field): 'vm:invisible', dart:core::pragma::options (field): null}]
() -> Null
ClosureCode {
Entry 3
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
PushConstant CP#3
DirectCall CP#4, 1
PushConstant CP#1
DirectCall CP#2, 1
Drop1
Push r0
LoadContextVar 0, 0
StoreLocal r2
Push r2
UncheckedClosureCall CP#6, 1
UncheckedClosureCall CP#4, 1
Drop1
PushNull
ReturnTOS
@@ -215,10 +215,11 @@ Try #0 start:
Push r0
PushInt 2
StoreContextVar 0, 1
PushConstant CP#0
AllocateClosure CP#6
StoreLocal r5
Push r5
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r4
Push r4
Push r4
@@ -226,7 +227,7 @@ Try #0 start:
Drop1
Push r0
LoadContextVar 0, 1
DirectCall CP#4, 1
DirectCall CP#2, 1
Drop1
Jump L1
Try #0 end:
@@ -263,12 +264,13 @@ Try #0 handler:
LoadContextVar 0, 2
StoreIndexedTOS
DirectCall CP#11, 1
DirectCall CP#4, 1
DirectCall CP#2, 1
Drop1
PushConstant CP#13
AllocateClosure CP#21
StoreLocal r5
Push r5
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r6
Push r6
ReturnTOS
@@ -280,17 +282,17 @@ L1:
ReturnTOS
}
ExceptionsTable {
try-index 0, outer -1, start 20, end 56, handler 56, needs-stack-trace, types [CP#6]
try-index 0, outer -1, start 20, end 60, handler 60, needs-stack-trace, types [CP#4]
}
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 dart:core::Object
[7] = EndClosureFunctionScope
[1] = ObjectRef 'danger foo'
[2] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[3] = Reserved
[4] = Type dart:core::Object
[5] = EndClosureFunctionScope
[6] = AllocateClosure 0, num-elements: 1, flags: 0
[7] = Reserved
[8] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[9] = ObjectRef 'caught '
[10] = ObjectRef ' '
@@ -304,19 +306,21 @@ ConstantPool {
[18] = ObjectRef 'error '
[19] = ObjectRef ', captured stack trace: '
[20] = EndClosureFunctionScope
[21] = AllocateClosure 1, num-elements: 1, flags: 0
[22] = Reserved
}
Closure DART_SDK/pkg/dart2bytecode/testcases/try_blocks.dart::testTryCatch3::'foo' () -> void
ClosureCode {
Entry 5
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
PopLocal r2
Try #0 start:
PushConstant CP#3
DirectCall CP#4, 1
PushConstant CP#1
DirectCall CP#2, 1
Drop1
Jump L1
Try #0 end:
@@ -330,7 +334,7 @@ Try #0 handler:
PopLocal r4
Push r0
LoadContextVar 0, 0
DirectCall CP#4, 1
DirectCall CP#2, 1
Drop1
Push r0
PushInt 3
@@ -345,14 +349,14 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/try_blocks.dart::testTryCatch3::'ba
ClosureCode {
Entry 6
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
PopLocal r2
Try #0 start:
PushConstant CP#14
DirectCall CP#4, 1
DirectCall CP#2, 1
Drop1
Jump L1
Try #0 end:
@@ -390,7 +394,7 @@ Try #0 handler:
LoadContextVar 0, 2
StoreIndexedTOS
DirectCall CP#11, 1
DirectCall CP#4, 1
DirectCall CP#2, 1
Drop1
Jump L1
L2:
@@ -588,10 +592,11 @@ Try #1 start:
PushConstant CP#5
DirectCall CP#3, 1
Drop1
PushConstant CP#6
AllocateClosure CP#8
StoreLocal r8
Push r8
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r7
Push r7
Push r7
@@ -648,8 +653,8 @@ L3:
ReturnTOS
}
ExceptionsTable {
try-index 0, outer -1, start 53, end 134, handler 134, needs-stack-trace, synthetic, types [CP#11]
try-index 1, outer 0, start 70, end 96, handler 96, needs-stack-trace, synthetic, types [CP#11]
try-index 0, outer -1, start 53, end 138, handler 138, needs-stack-trace, synthetic, types [CP#11]
try-index 1, outer 0, start 70, end 100, handler 100, needs-stack-trace, synthetic, types [CP#11]
}
ConstantPool {
[0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
@@ -659,9 +664,9 @@ ConstantPool {
[4] = Reserved
[5] = ObjectRef 'try'
[6] = ClosureFunction 0
[7] = InstanceField dart:core::_Closure::_context (field)
[8] = Reserved
[9] = EndClosureFunctionScope
[7] = EndClosureFunctionScope
[8] = AllocateClosure 0, num-elements: 1, flags: 0
[9] = Reserved
[10] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
[11] = Type dynamic
[12] = ObjectRef 'finally 1'
@@ -673,7 +678,7 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/try_blocks.dart::testTryFinally2::'
ClosureCode {
Entry 2
Push FP[-5]
LoadFieldTOS CP#7
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
@@ -694,7 +699,7 @@ Function 'testTryFinally3', static, reflectable, debuggable
return-type dynamic
Bytecode {
Entry 5
Entry 6
CheckStack 0
AllocateContext 0, 1
PopLocal r0
@@ -706,22 +711,23 @@ Bytecode {
Push r0
PopLocal r3
Try #0 start:
PushConstant CP#0
AllocateClosure CP#7
StoreLocal r5
Push r5
Push r0
PushNull
AllocateClosure
StoreClosureElement 0
PopLocal r2
Jump L1
Try #0 end:
Try #0 handler:
SetFrame 5
SetFrame 6
Push r3
PopLocal r0
MoveSpecial exception, r3
MoveSpecial stackTrace, r4
Push r0
LoadContextVar 0, 0
DirectCall CP#3, 1
DirectCall CP#1, 1
Drop1
Push r2
DynamicCall CP#9, 1
@@ -734,7 +740,7 @@ L1:
PopLocal r0
Push r0
LoadContextVar 0, 0
DirectCall CP#3, 1
DirectCall CP#1, 1
Drop1
Push r2
DynamicCall CP#9, 1
@@ -746,18 +752,18 @@ L1:
ReturnTOS
}
ExceptionsTable {
try-index 0, outer -1, start 23, end 35, handler 35, needs-stack-trace, synthetic, types [CP#6]
try-index 0, outer -1, start 23, end 39, handler 39, needs-stack-trace, synthetic, types [CP#4]
}
ConstantPool {
[0] = ClosureFunction 0
[1] = InstanceField dart:core::_Closure::_context (field)
[1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
[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
[3] = ObjectRef 'try 1'
[4] = Type dynamic
[5] = ObjectRef 'try 2'
[6] = EndClosureFunctionScope
[7] = AllocateClosure 0, num-elements: 1, flags: 0
[8] = Reserved
[9] = DynamicCall 'implicit:call', ArgDesc num-args 1, num-type-args 0, names []
[10] = Reserved
}
@@ -765,18 +771,18 @@ Closure DART_SDK/pkg/dart2bytecode/testcases/try_blocks.dart::testTryFinally3::'
ClosureCode {
Entry 6
Push FP[-5]
LoadFieldTOS CP#1
LoadClosureElement 0
PopLocal r0
CheckStack 0
Push r0
LoadContextVar 0, 0
DirectCall CP#3, 1
DirectCall CP#1, 1
Drop1
Push r0
PopLocal r2
Try #0 start:
PushConstant CP#5
DirectCall CP#3, 1
PushConstant CP#3
DirectCall CP#1, 1
Drop1
Jump L1
Try #0 end:
@@ -789,8 +795,8 @@ Try #0 handler:
Push r0
PopLocal r4
Try #1 start:
PushConstant CP#7
DirectCall CP#3, 1
PushConstant CP#5
DirectCall CP#1, 1
Drop1
Jump L2
Try #1 end:
@@ -802,7 +808,7 @@ Try #1 handler:
MoveSpecial stackTrace, r5
Push r0
LoadContextVar 0, 0
DirectCall CP#3, 1
DirectCall CP#1, 1
Drop1
Push r4
Push r5
@@ -812,7 +818,7 @@ L2:
PopLocal r0
Push r0
LoadContextVar 0, 0
DirectCall CP#3, 1
DirectCall CP#1, 1
Drop1
PushInt 43
ReturnTOS
@@ -822,8 +828,8 @@ L1:
Push r0
PopLocal r4
Try #2 start:
PushConstant CP#7
DirectCall CP#3, 1
PushConstant CP#5
DirectCall CP#1, 1
Drop1
Jump L3
Try #2 end:
@@ -835,7 +841,7 @@ Try #2 handler:
MoveSpecial stackTrace, r5
Push r0
LoadContextVar 0, 0
DirectCall CP#3, 1
DirectCall CP#1, 1
Drop1
Push r4
Push r5
@@ -845,7 +851,7 @@ L3:
PopLocal r0
Push r0
LoadContextVar 0, 0
DirectCall CP#3, 1
DirectCall CP#1, 1
Drop1
PushInt 43
ReturnTOS