Files
sdk/pkg/vm/testcases/bytecode/closures.dart.expect
T
Alexander Markov a9abc64613 [vm/bytecode] Add context IDs to disambiguate accesses to distinct contexts
This CL adds context ID operand to AllocateContext, CloneContext,
LoadContextVar and StoreContextVar bytecode instructions.
The context ID will be used to create distinct Slots and disambiguate
accesses to context objects corresponding to different scopes.

Change-Id: I98850ab763017b71c1dcacfccaffc085bd850e00
Reviewed-on: https://dart-review.googlesource.com/c/84681
Auto-Submit: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2018-11-17 00:35:30 +00:00

1526 lines
42 KiB
Plaintext

library #lib;
import self as self;
import "dart:core" as core;
typedef IntFunc = (core::int) → dynamic;
class C1 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C1
: super core::Object::•()
;
}
class C2 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C2
: super core::Object::•()
;
}
class C3 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C3
: super core::Object::•()
;
}
class C4 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C4
: super core::Object::•()
;
}
class C5 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C5
: super core::Object::•()
;
}
class C6 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C6
: super core::Object::•()
;
}
class C7 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C7
: super core::Object::•()
;
}
class C8 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C8
: super core::Object::•()
;
}
class A<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic> extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::A<self::A::T1, self::A::T2>
: super core::Object::•()
;
[@vm.bytecode=
Bytecode (version: stable) {
Entry 5
CheckStack 0
CheckFunctionTypeArgs 2, r0
AllocateContext 0, 1
PopLocal r1
Push r1
Push FP[-5]
StoreContextVar 0, 0
Allocate CP#31
StoreLocal r4
Push r4
Push FP[-5]
LoadTypeArgumentsField CP#15
StoreFieldTOS CP#32
Push r4
Push r0
StoreFieldTOS CP#6
Push r4
PushConstant CP#5
StoreFieldTOS CP#3
Push r4
PushConstant CP#0
StoreFieldTOS CP#34
Push r4
Push r1
StoreFieldTOS CP#1
PopLocal r3
PushConstant CP#44
Push r3
InstanceCall 2, CP#45
Drop1
PushConstant CP#46
Push r3
InstanceCall 2, CP#47
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction nested1 <T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic>() → void;
[1] = InstanceField dart.core::_Closure::_context
[2] = Reserved
[3] = InstanceField dart.core::_Closure::_delayed_type_arguments
[4] = Reserved
[5] = EmptyTypeArguments
[6] = InstanceField dart.core::_Closure::_function_type_arguments
[7] = Reserved
[8] = ArgDesc num-args 4, num-type-args 0, names []
[9] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#8
[10] = ClosureFunction nested2 <T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void;
[11] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#8
[12] = ClosureFunction <anonymous closure> () → dart.core::Null;
[13] = TypeArgs [dart.core::Type]
[14] = Type #lib::A::T1
[15] = TypeArgumentsField #lib::A
[16] = Type #lib::A::T2
[17] = Type #lib::A::foo::T3
[18] = Type #lib::A::foo::T4
[19] = Type T5
[20] = Type T6
[21] = Type T7
[22] = Type T8
[23] = ArgDesc num-args 2, num-type-args 0, names []
[24] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#23
[25] = ArgDesc num-args 1, num-type-args 0, names []
[26] = StaticICData target 'dart.core::print', arg-desc CP#25
[27] = TypeArgs [#lib::A::T1, #lib::A::T2, #lib::A::foo::T3, #lib::A::foo::T4, T5, T6, T7, T8]
[28] = ArgDesc num-args 0, num-type-args 8, names []
[29] = StaticICData target '#lib::callWithArgs', arg-desc CP#28
[30] = EndClosureFunctionScope
[31] = Class dart.core::_Closure
[32] = InstanceField dart.core::_Closure::_instantiator_type_arguments
[33] = Reserved
[34] = InstanceField dart.core::_Closure::_function
[35] = Reserved
[36] = ICData dynamic target-name 'call', arg-desc CP#25
[37] = EndClosureFunctionScope
[38] = TypeArgs [#lib::C7, #lib::C8]
[39] = ArgDesc num-args 1, num-type-args 2, names []
[40] = ICData dynamic target-name 'call', arg-desc CP#39
[41] = TypeArgs [dart.core::List<#lib::C7>, dart.core::List<#lib::C8>]
[42] = ICData dynamic target-name 'call', arg-desc CP#39
[43] = EndClosureFunctionScope
[44] = TypeArgs [#lib::C5, #lib::C6]
[45] = ICData dynamic target-name 'call', arg-desc CP#39
[46] = TypeArgs [dart.core::List<#lib::C5>, dart.core::List<#lib::C6>]
[47] = ICData dynamic target-name 'call', arg-desc CP#39
}
Closure CP#12 {
EntryFixed 1, 4
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#1
PopLocal r1
Push FP[-5]
LoadFieldTOS CP#6
PopLocal r0
PushConstant CP#13
StoreLocal r3
Push r3
PushInt 8
CreateArrayTOS
StoreLocal r3
Push r3
PushInt 0
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#15
PushNull
InstantiateType CP#14
StoreIndexedTOS
Push r3
PushInt 1
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#15
PushNull
InstantiateType CP#16
StoreIndexedTOS
Push r3
PushInt 2
PushNull
Push r0
InstantiateType CP#17
StoreIndexedTOS
Push r3
PushInt 3
PushNull
Push r0
InstantiateType CP#18
StoreIndexedTOS
Push r3
PushInt 4
PushNull
Push r0
InstantiateType CP#19
StoreIndexedTOS
Push r3
PushInt 5
PushNull
Push r0
InstantiateType CP#20
StoreIndexedTOS
Push r3
PushInt 6
PushNull
Push r0
InstantiateType CP#21
StoreIndexedTOS
Push r3
PushInt 7
PushNull
Push r0
InstantiateType CP#22
StoreIndexedTOS
PushConstant CP#24
IndirectStaticCall 2, CP#23
PushConstant CP#26
IndirectStaticCall 1, CP#25
Drop1
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#15
Push r0
InstantiateTypeArgumentsTOS 0, CP#27
PushConstant CP#29
IndirectStaticCall 1, CP#28
Drop1
PushNull
ReturnTOS
}
Closure CP#10 {
EntryFixed 1, 5
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#1
PopLocal r1
Push FP[-5]
LoadFieldTOS CP#3
StoreLocal r0
PushConstant CP#5
JumpIfEqStrict L1
CheckFunctionTypeArgs 0, r2
Jump L2
L1:
CheckFunctionTypeArgs 2, r0
L2:
Push r0
Push FP[-5]
LoadFieldTOS CP#6
PushInt 4
PushInt 6
PushConstant CP#11
IndirectStaticCall 4, CP#8
PopLocal r0
Allocate CP#31
StoreLocal r4
Push r4
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#15
StoreFieldTOS CP#32
Push r4
Push r0
StoreFieldTOS CP#6
Push r4
PushConstant CP#5
StoreFieldTOS CP#3
Push r4
PushConstant CP#12
StoreFieldTOS CP#34
Push r4
Push r1
StoreFieldTOS CP#1
PopLocal r3
Push r3
InstanceCall 1, CP#36
Drop1
PushNull
ReturnTOS
}
Closure CP#0 {
EntryFixed 1, 5
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#1
PopLocal r1
Push FP[-5]
LoadFieldTOS CP#3
StoreLocal r0
PushConstant CP#5
JumpIfEqStrict L1
CheckFunctionTypeArgs 0, r2
Jump L2
L1:
CheckFunctionTypeArgs 2, r0
L2:
Push r0
Push FP[-5]
LoadFieldTOS CP#6
PushInt 2
PushInt 4
PushConstant CP#9
IndirectStaticCall 4, CP#8
PopLocal r0
Allocate CP#31
StoreLocal r4
Push r4
Push r1
LoadContextVar 0, 0
LoadTypeArgumentsField CP#15
StoreFieldTOS CP#32
Push r4
Push r0
StoreFieldTOS CP#6
Push r4
PushConstant CP#5
StoreFieldTOS CP#3
Push r4
PushConstant CP#10
StoreFieldTOS CP#34
Push r4
Push r1
StoreFieldTOS CP#1
PopLocal r3
PushConstant CP#38
Push r3
InstanceCall 2, CP#40
Drop1
PushConstant CP#41
Push r3
InstanceCall 2, CP#42
Drop1
PushNull
ReturnTOS
}
] method foo<T3 extends core::Object = dynamic, T4 extends core::Object = dynamic>() → void {
function nested1<T5 extends core::Object = dynamic, T6 extends core::Object = dynamic>() → void {
function nested2<T7 extends core::Object = dynamic, T8 extends core::Object = dynamic>() → void {
() → core::Null nested3 = () → core::Null {
core::print(<core::Type>[self::A::T1, self::A::T2, self::A::foo::T3, self::A::foo::T4, T5, T6, T7, T8]);
self::callWithArgs<self::A::T1, self::A::T2, self::A::foo::T3, self::A::foo::T4, T5, T6, T7, T8>();
};
[@vm.call-site-attributes.metadata=receiverType:() → dart.core::Null] nested3.call();
}
[@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void] nested2.call<self::C7, self::C8>();
[@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void] nested2.call<core::List<self::C7>, core::List<self::C8>>();
}
[@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic>() → void] nested1.call<self::C5, self::C6>();
[@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic>() → void] nested1.call<core::List<self::C5>, core::List<self::C6>>();
}
}
class B extends core::Object {
field core::int foo = null;
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
Nullable fields: [#lib::B::foo]
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::B
: super core::Object::•()
;
[@vm.bytecode=
Bytecode (version: stable) {
Entry 5
CheckStack 0
AllocateContext 0, 4
PopLocal r0
Push r0
Push FP[-5]
StoreContextVar 0, 0
Push r0
PushInt 1
StoreContextVar 0, 1
PushInt 2
PopLocal r2
Push r0
PushInt 3
StoreContextVar 0, 2
Allocate CP#10
StoreLocal r4
Push r4
PushNull
StoreFieldTOS CP#11
Push r4
PushNull
StoreFieldTOS CP#13
Push r4
PushConstant CP#15
StoreFieldTOS CP#16
Push r4
PushConstant CP#0
StoreFieldTOS CP#18
Push r4
Push r0
StoreFieldTOS CP#1
PopLocal r3
Push r3
PushInt 10
InstanceCall 2, CP#24
Drop1
Push r3
PushInt 11
InstanceCall 2, CP#25
Drop1
Push r2
PushConstant CP#26
IndirectStaticCall 1, CP#7
Drop1
Push r0
LoadContextVar 0, 2
PushConstant CP#27
IndirectStaticCall 1, CP#7
Drop1
Push r0
LoadContextVar 0, 1
PushConstant CP#28
IndirectStaticCall 1, CP#7
Drop1
Push r0
PushInt 42
StoreContextVar 0, 3
Allocate CP#10
StoreLocal r3
Push r3
PushNull
StoreFieldTOS CP#11
Push r3
PushNull
StoreFieldTOS CP#13
Push r3
PushConstant CP#15
StoreFieldTOS CP#16
Push r3
PushConstant CP#29
StoreFieldTOS CP#18
Push r3
Push r0
StoreFieldTOS CP#1
PopLocal r2
Push r2
InstanceCall 1, CP#32
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction <anonymous closure> (dart.core::int y) → dart.core::Null;
[1] = InstanceField dart.core::_Closure::_context
[2] = Reserved
[3] = Type dart.core::int
[4] = String 'y'
[5] = SubtypeTestCache
[6] = ClosureFunction closure2 () → void;
[7] = ArgDesc num-args 1, num-type-args 0, names []
[8] = ICData get target-name 'foo', arg-desc CP#7
[9] = EndClosureFunctionScope
[10] = Class dart.core::_Closure
[11] = InstanceField dart.core::_Closure::_instantiator_type_arguments
[12] = Reserved
[13] = InstanceField dart.core::_Closure::_function_type_arguments
[14] = Reserved
[15] = EmptyTypeArguments
[16] = InstanceField dart.core::_Closure::_delayed_type_arguments
[17] = Reserved
[18] = InstanceField dart.core::_Closure::_function
[19] = Reserved
[20] = ICData dynamic target-name 'call', arg-desc CP#7
[21] = StaticICData target 'dart.core::print', arg-desc CP#7
[22] = EndClosureFunctionScope
[23] = ArgDesc num-args 2, num-type-args 0, names []
[24] = ICData dynamic target-name 'call', arg-desc CP#23
[25] = ICData dynamic target-name 'call', arg-desc CP#23
[26] = StaticICData target 'dart.core::print', arg-desc CP#7
[27] = StaticICData target 'dart.core::print', arg-desc CP#7
[28] = StaticICData target 'dart.core::print', arg-desc CP#7
[29] = ClosureFunction <anonymous closure> () → dart.core::Null;
[30] = ICData set target-name 'foo', arg-desc CP#23
[31] = EndClosureFunctionScope
[32] = ICData dynamic target-name 'call', arg-desc CP#7
}
Closure CP#6 {
EntryFixed 1, 3
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#1
PopLocal r0
Push r0
LoadContextParent
Push r0
LoadContextParent
LoadContextVar 0, 1
PushInt 2
AddInt
StoreContextVar 0, 2
Push r0
Push r0
LoadContextParent
LoadContextVar 0, 0
InstanceCall 1, CP#8
Push r0
LoadContextVar 1, 0
AddInt
StoreContextVar 1, 1
PushNull
ReturnTOS
}
Closure CP#0 {
EntryFixed 2, 4
CheckStack 0
Push FP[-6]
LoadFieldTOS CP#1
PopLocal r0
AllocateContext 1, 2
StoreLocal r1
Push r1
Push r0
StoreContextParent
PopLocal r0
Push r0
Push FP[-5]
StoreContextVar 1, 0
Push FP[-5]
PushConstant CP#3
PushNull
PushNull
PushConstant CP#4
AssertAssignable 1, CP#5
Drop1
Push r0
LoadContextParent
Push r0
LoadContextVar 1, 0
PushInt 1
AddInt
StoreContextVar 0, 1
Push r0
LoadContextParent
LoadContextVar 0, 1
PushInt 5
CompareIntGt
JumpIfFalse L1
Push r0
PushInt 4
StoreContextVar 1, 1
Allocate CP#10
StoreLocal r2
Push r2
PushNull
StoreFieldTOS CP#11
Push r2
PushNull
StoreFieldTOS CP#13
Push r2
PushConstant CP#15
StoreFieldTOS CP#16
Push r2
PushConstant CP#6
StoreFieldTOS CP#18
Push r2
Push r0
StoreFieldTOS CP#1
PopLocal r3
Push r3
InstanceCall 1, CP#20
Drop1
Push r0
LoadContextVar 1, 1
PushConstant CP#21
IndirectStaticCall 1, CP#7
Drop1
L1:
PushNull
ReturnTOS
}
Closure CP#29 {
EntryFixed 1, 3
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#1
PopLocal r0
Push r0
LoadContextVar 0, 0
Push r0
LoadContextVar 0, 3
InstanceCall 2, CP#30
Drop1
PushNull
ReturnTOS
}
] method topLevel() → void {
{
core::int x = 1;
{
core::int y = 2;
core::int z = 3;
(core::int) → core::Null closure1 = (core::int y) → core::Null {
x = y.{core::num::+}(1);
if(x.{core::num::>}(5)) {
core::int w = 4;
function closure2() → void {
z = x.{core::num::+}(2);
w = this.{self::B::foo}.{core::num::+}(y);
}
[@vm.call-site-attributes.metadata=receiverType:() → void] closure2.call();
core::print(w);
}
};
[@vm.call-site-attributes.metadata=receiverType:(dart.core::int) → dart.core::Null] closure1.call(10);
[@vm.call-site-attributes.metadata=receiverType:(dart.core::int) → dart.core::Null] closure1.call(11);
core::print(y);
core::print(z);
}
core::print(x);
}
{
core::int x = 42;
() → core::Null closure3 = () → core::Null {
this.{self::B::foo} = x;
};
[@vm.call-site-attributes.metadata=receiverType:() → dart.core::Null] closure3.call();
}
}
}
class C extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::C
: super core::Object::•()
;
[@vm.bytecode=
Bytecode (version: stable) {
Entry 5
CheckStack 0
AllocateContext 0, 1
PopLocal r0
Push r0
PushInt 0
StoreContextVar 0, 0
PushConstant CP#0
StoreLocal r3
Push r3
PushInt 0
CreateArrayTOS
StoreLocal r3
PushConstant CP#2
IndirectStaticCall 2, CP#1
PopLocal r2
PushConstant CP#0
StoreLocal r3
Push r3
PushInt 0
CreateArrayTOS
StoreLocal r3
PushConstant CP#3
IndirectStaticCall 2, CP#1
PopLocal r4
AllocateContext 1, 1
StoreLocal r1
Push r1
Push r0
StoreContextParent
PopLocal r0
Push r0
PushInt 0
StoreContextVar 1, 0
L2:
CheckStack 1
Push r0
LoadContextVar 1, 0
PushInt 10
CompareIntLt
JumpIfFalse L1
Push r2
Allocate CP#8
StoreLocal r3
Push r3
PushNull
StoreFieldTOS CP#9
Push r3
PushNull
StoreFieldTOS CP#11
Push r3
PushConstant CP#13
StoreFieldTOS CP#14
Push r3
PushConstant CP#4
StoreFieldTOS CP#16
Push r3
Push r0
StoreFieldTOS CP#5
InstanceCall 2, CP#18
Drop1
Push r4
Allocate CP#8
StoreLocal r3
Push r3
PushNull
StoreFieldTOS CP#9
Push r3
PushNull
StoreFieldTOS CP#11
Push r3
PushConstant CP#13
StoreFieldTOS CP#14
Push r3
PushConstant CP#19
StoreFieldTOS CP#16
Push r3
Push r0
StoreFieldTOS CP#5
InstanceCall 2, CP#24
Drop1
Push r0
CloneContext 1, 1
PopLocal r0
Push r0
Push r0
LoadContextVar 1, 0
PushInt 1
AddInt
StoreLocal r3
StoreContextVar 1, 0
Push r3
Drop1
Jump L2
L1:
Push r0
LoadContextParent
PopLocal r0
Push r0
LoadContextParent
PopLocal r0
PushNull
ReturnTOS
}
ConstantPool {
[0] = TypeArgs [dart.core::Function]
[1] = ArgDesc num-args 2, num-type-args 0, names []
[2] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
[3] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
[4] = ClosureFunction <anonymous closure> () → dart.core::int;
[5] = InstanceField dart.core::_Closure::_context
[6] = Reserved
[7] = EndClosureFunctionScope
[8] = Class dart.core::_Closure
[9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
[10] = Reserved
[11] = InstanceField dart.core::_Closure::_function_type_arguments
[12] = Reserved
[13] = EmptyTypeArguments
[14] = InstanceField dart.core::_Closure::_delayed_type_arguments
[15] = Reserved
[16] = InstanceField dart.core::_Closure::_function
[17] = Reserved
[18] = ICData target-name 'add', arg-desc CP#1
[19] = ClosureFunction <anonymous closure> (dart.core::int ii) → dart.core::Null;
[20] = Type dart.core::int
[21] = String 'ii'
[22] = SubtypeTestCache
[23] = EndClosureFunctionScope
[24] = ICData target-name 'add', arg-desc CP#1
}
Closure CP#4 {
EntryFixed 1, 2
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#5
PopLocal r0
Push r0
LoadContextVar 1, 0
Push r0
LoadContextParent
LoadContextVar 0, 0
AddInt
ReturnTOS
}
Closure CP#19 {
EntryFixed 2, 3
CheckStack 0
Push FP[-6]
LoadFieldTOS CP#5
PopLocal r0
Push FP[-5]
PushConstant CP#20
PushNull
PushNull
PushConstant CP#21
AssertAssignable 1, CP#22
Drop1
Push r0
Push FP[-5]
Push r0
LoadContextParent
LoadContextVar 0, 0
AddInt
StoreContextVar 1, 0
PushNull
ReturnTOS
}
] method testForLoop() → void {
core::int delta = 0;
core::List<core::Function> getI = <core::Function>[];
core::List<core::Function> setI = <core::Function>[];
for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
[@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function>] getI.{core::List::add}(() → core::int => i.{core::num::+}(delta));
[@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function>] setI.{core::List::add}((core::int ii) → core::Null {
i = ii.{core::num::+}(delta);
});
}
}
[@vm.bytecode=
Bytecode (version: stable) {
Entry 5
CheckStack 0
Push FP[-5]
InstanceCall 1, CP#1
PopLocal r2
L2:
CheckStack 1
Push r2
InstanceCall 1, CP#2
JumpIfFalse L1
AllocateContext 0, 1
PopLocal r0
Push r0
Push r2
InstanceCall 1, CP#3
StoreContextVar 0, 0
Allocate CP#8
StoreLocal r4
Push r4
PushNull
StoreFieldTOS CP#9
Push r4
PushNull
StoreFieldTOS CP#11
Push r4
PushConstant CP#13
StoreFieldTOS CP#14
Push r4
PushConstant CP#4
StoreFieldTOS CP#16
Push r4
Push r0
StoreFieldTOS CP#5
PopLocal r3
Push r3
InstanceCall 1, CP#18
Drop1
Push r0
LoadContextVar 0, 0
PushConstant CP#19
IndirectStaticCall 1, CP#0
Drop1
Push r0
LoadContextParent
PopLocal r0
Jump L2
L1:
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = ICData get target-name 'iterator', arg-desc CP#0
[2] = ICData target-name 'moveNext', arg-desc CP#0
[3] = ICData get target-name 'current', arg-desc CP#0
[4] = ClosureFunction <anonymous closure> () → dart.core::Null;
[5] = InstanceField dart.core::_Closure::_context
[6] = Reserved
[7] = EndClosureFunctionScope
[8] = Class dart.core::_Closure
[9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
[10] = Reserved
[11] = InstanceField dart.core::_Closure::_function_type_arguments
[12] = Reserved
[13] = EmptyTypeArguments
[14] = InstanceField dart.core::_Closure::_delayed_type_arguments
[15] = Reserved
[16] = InstanceField dart.core::_Closure::_function
[17] = Reserved
[18] = ICData dynamic target-name 'call', arg-desc CP#0
[19] = StaticICData target 'dart.core::print', arg-desc CP#0
}
Closure CP#4 {
EntryFixed 1, 3
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#5
PopLocal r0
Push r0
Push r0
LoadContextVar 0, 0
PushInt 1
AddInt
StoreContextVar 0, 0
PushNull
ReturnTOS
}
] method testForInLoop(core::List<core::int> list) → void {
for (core::int i in list) {
() → core::Null inc = () → core::Null {
i = i.{core::num::+}(1);
};
[@vm.call-site-attributes.metadata=receiverType:() → dart.core::Null] inc.call();
core::print(i);
}
}
}
class D<T extends core::Object = dynamic> extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
Push FP[-5]
PushConstant CP#1
IndirectStaticCall 1, CP#0
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
[1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
}
] synthetic constructor •() → self::D<self::D::T>
: super core::Object::•()
;
[@vm.bytecode=
Bytecode (version: stable) {
Entry 3
CheckStack 0
AllocateContext 0, 1
PopLocal r0
Push r0
Push FP[-5]
StoreContextVar 0, 0
Push FP[-5]
PushConstant CP#0
Push FP[-6]
LoadTypeArgumentsField CP#1
PushNull
PushConstant CP#2
AssertAssignable 0, CP#3
Drop1
Allocate CP#8
StoreLocal r2
Push r2
Push FP[-6]
LoadTypeArgumentsField CP#1
StoreFieldTOS CP#9
Push r2
PushNull
StoreFieldTOS CP#11
Push r2
PushConstant CP#13
StoreFieldTOS CP#14
Push r2
PushConstant CP#4
StoreFieldTOS CP#16
Push r2
Push r0
StoreFieldTOS CP#5
ReturnTOS
}
ConstantPool {
[0] = Type #lib::D::T
[1] = TypeArgumentsField #lib::D
[2] = String 't'
[3] = SubtypeTestCache
[4] = ClosureFunction <anonymous closure> () → #lib::D::T;
[5] = InstanceField dart.core::_Closure::_context
[6] = Reserved
[7] = EndClosureFunctionScope
[8] = Class dart.core::_Closure
[9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
[10] = Reserved
[11] = InstanceField dart.core::_Closure::_function_type_arguments
[12] = Reserved
[13] = EmptyTypeArguments
[14] = InstanceField dart.core::_Closure::_delayed_type_arguments
[15] = Reserved
[16] = InstanceField dart.core::_Closure::_function
[17] = Reserved
}
Closure CP#4 {
EntryFixed 1, 2
CheckStack 0
Push FP[-5]
LoadFieldTOS CP#5
PopLocal r0
Push r0
LoadContextVar 0, 0
ReturnTOS
}
] method foo(generic-covariant-impl self::D::T t) → dynamic {
return () → self::D::T => t;
}
}
[@vm.bytecode=
Bytecode (version: stable) {
Entry 4
CheckStack 0
AllocateContext 0, 1
PopLocal r0
Push r0
PushInt 5
StoreContextVar 0, 0
Allocate CP#7
StoreLocal r3
Push r3
PushNull
StoreFieldTOS CP#8
Push r3
PushNull
StoreFieldTOS CP#10
Push r3
PushConstant CP#12
StoreFieldTOS CP#13
Push r3
PushConstant CP#0
StoreFieldTOS CP#15
Push r3
Push r0
StoreFieldTOS CP#1
PopLocal r2
Push r2
PushInt 3
InstanceCall 2, CP#18
Drop1
Push r0
LoadContextVar 0, 0
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction <anonymous closure> (dart.core::int y) → dart.core::Null;
[1] = InstanceField dart.core::_Closure::_context
[2] = Reserved
[3] = Type dart.core::int
[4] = String 'y'
[5] = SubtypeTestCache
[6] = EndClosureFunctionScope
[7] = Class dart.core::_Closure
[8] = InstanceField dart.core::_Closure::_instantiator_type_arguments
[9] = Reserved
[10] = InstanceField dart.core::_Closure::_function_type_arguments
[11] = Reserved
[12] = EmptyTypeArguments
[13] = InstanceField dart.core::_Closure::_delayed_type_arguments
[14] = Reserved
[15] = InstanceField dart.core::_Closure::_function
[16] = Reserved
[17] = ArgDesc num-args 2, num-type-args 0, names []
[18] = ICData dynamic target-name 'call', arg-desc CP#17
}
Closure CP#0 {
EntryFixed 2, 3
CheckStack 0
Push FP[-6]
LoadFieldTOS CP#1
PopLocal r0
Push FP[-5]
PushConstant CP#3
PushNull
PushNull
PushConstant CP#4
AssertAssignable 1, CP#5
Drop1
Push r0
Push r0
LoadContextVar 0, 0
Push FP[-5]
AddInt
StoreContextVar 0, 0
PushNull
ReturnTOS
}
]static method simpleClosure() → core::int {
core::int x = 5;
(core::int) → core::Null inc = (core::int y) → core::Null {
x = x.{core::num::+}(y);
};
[@vm.call-site-attributes.metadata=receiverType:(dart.core::int) → dart.core::Null] inc.call(3);
return x;
}
[@vm.bytecode=
Bytecode (version: stable) {
Entry 2
CheckStack 0
CheckFunctionTypeArgs 8, r0
PushConstant CP#0
StoreLocal r1
Push r1
PushInt 8
CreateArrayTOS
StoreLocal r1
Push r1
PushInt 0
PushNull
Push r0
InstantiateType CP#1
StoreIndexedTOS
Push r1
PushInt 1
PushNull
Push r0
InstantiateType CP#2
StoreIndexedTOS
Push r1
PushInt 2
PushNull
Push r0
InstantiateType CP#3
StoreIndexedTOS
Push r1
PushInt 3
PushNull
Push r0
InstantiateType CP#4
StoreIndexedTOS
Push r1
PushInt 4
PushNull
Push r0
InstantiateType CP#5
StoreIndexedTOS
Push r1
PushInt 5
PushNull
Push r0
InstantiateType CP#6
StoreIndexedTOS
Push r1
PushInt 6
PushNull
Push r0
InstantiateType CP#7
StoreIndexedTOS
Push r1
PushInt 7
PushNull
Push r0
InstantiateType CP#8
StoreIndexedTOS
PushConstant CP#10
IndirectStaticCall 2, CP#9
PushConstant CP#12
IndirectStaticCall 1, CP#11
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = TypeArgs [dart.core::Type]
[1] = Type #lib::callWithArgs::T1
[2] = Type #lib::callWithArgs::T2
[3] = Type #lib::callWithArgs::T3
[4] = Type #lib::callWithArgs::T4
[5] = Type #lib::callWithArgs::T5
[6] = Type #lib::callWithArgs::T6
[7] = Type #lib::callWithArgs::T7
[8] = Type #lib::callWithArgs::T8
[9] = ArgDesc num-args 2, num-type-args 0, names []
[10] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#9
[11] = ArgDesc num-args 1, num-type-args 0, names []
[12] = StaticICData target 'dart.core::print', arg-desc CP#11
}
]static method callWithArgs<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic, T3 extends core::Object = dynamic, T4 extends core::Object = dynamic, T5 extends core::Object = dynamic, T6 extends core::Object = dynamic, T7 extends core::Object = dynamic, T8 extends core::Object = dynamic>() → void {
core::print(<core::Type>[self::callWithArgs::T1, self::callWithArgs::T2, self::callWithArgs::T3, self::callWithArgs::T4, self::callWithArgs::T5, self::callWithArgs::T6, self::callWithArgs::T7, self::callWithArgs::T8]);
}
[@vm.bytecode=
Bytecode (version: stable) {
Entry 1
CheckStack 0
PushConstant CP#0
PushConstant CP#2
PushConstant CP#1
AllocateT
StoreLocal r0
Push r0
PushConstant CP#4
IndirectStaticCall 1, CP#3
Drop1
InstanceCall 2, CP#6
Drop1
PushConstant CP#7
PushConstant CP#2
PushConstant CP#1
AllocateT
StoreLocal r0
Push r0
PushConstant CP#8
IndirectStaticCall 1, CP#3
Drop1
InstanceCall 2, CP#9
Drop1
PushConstant CP#7
PushConstant CP#10
PushConstant CP#1
AllocateT
StoreLocal r0
Push r0
PushConstant CP#11
IndirectStaticCall 1, CP#3
Drop1
InstanceCall 2, CP#12
Drop1
PushNull
ReturnTOS
}
ConstantPool {
[0] = TypeArgs [#lib::C3, #lib::C4]
[1] = Class #lib::A
[2] = TypeArgumentsForInstanceAllocation #lib::A [#lib::C1, #lib::C2]
[3] = ArgDesc num-args 1, num-type-args 0, names []
[4] = StaticICData target '#lib::A::', arg-desc CP#3
[5] = ArgDesc num-args 1, num-type-args 2, names []
[6] = ICData target-name 'foo', arg-desc CP#5
[7] = TypeArgs [dart.core::List<#lib::C3>, dart.core::List<#lib::C4>]
[8] = StaticICData target '#lib::A::', arg-desc CP#3
[9] = ICData target-name 'foo', arg-desc CP#5
[10] = TypeArgumentsForInstanceAllocation #lib::A [dart.core::List<#lib::C1>, dart.core::List<#lib::C2>]
[11] = StaticICData target '#lib::A::', arg-desc CP#3
[12] = ICData target-name 'foo', arg-desc CP#5
}
]static method callA() → void {
new self::A::•<self::C1, self::C2>().{self::A::foo}<self::C3, self::C4>();
new self::A::•<self::C1, self::C2>().{self::A::foo}<core::List<self::C3>, core::List<self::C4>>();
new self::A::•<core::List<self::C1>, core::List<self::C2>>().{self::A::foo}<core::List<self::C3>, core::List<self::C4>>();
}
[@vm.bytecode=
Bytecode (version: stable) {
Entry 7
CheckStack 0
Allocate CP#14
StoreLocal r3
Push r3
PushNull
StoreFieldTOS CP#15
Push r3
PushNull
StoreFieldTOS CP#6
Push r3
PushConstant CP#5
StoreFieldTOS CP#3
Push r3
PushConstant CP#0
StoreFieldTOS CP#17
Push r3
Push r0
StoreFieldTOS CP#1
PopLocal r2
Push r2
StoreLocal r3
PushConstant CP#19
StoreLocal r6
PushConstant CP#21
IndirectStaticCall 2, CP#20
Drop1
Allocate CP#14
StoreLocal r5
Push r6
StoreFieldTOS CP#3
Push r5
Push r3
LoadFieldTOS CP#15
StoreFieldTOS CP#15
Push r5
Push r3
LoadFieldTOS CP#6
StoreFieldTOS CP#6
Push r5
Push r3
LoadFieldTOS CP#17
StoreFieldTOS CP#17
Push r5
Push r3
LoadFieldTOS CP#1
StoreFieldTOS CP#1
Push r5
PopLocal r4
Push r4
ReturnTOS
}
ConstantPool {
[0] = ClosureFunction foo <T extends dart.core::Object = dynamic>(T t) → void;
[1] = InstanceField dart.core::_Closure::_context
[2] = Reserved
[3] = InstanceField dart.core::_Closure::_delayed_type_arguments
[4] = Reserved
[5] = EmptyTypeArguments
[6] = InstanceField dart.core::_Closure::_function_type_arguments
[7] = Reserved
[8] = ArgDesc num-args 4, num-type-args 0, names []
[9] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#8
[10] = Type T
[11] = String 't'
[12] = SubtypeTestCache
[13] = EndClosureFunctionScope
[14] = Class dart.core::_Closure
[15] = InstanceField dart.core::_Closure::_instantiator_type_arguments
[16] = Reserved
[17] = InstanceField dart.core::_Closure::_function
[18] = Reserved
[19] = TypeArgs [dart.core::int]
[20] = ArgDesc num-args 2, num-type-args 0, names []
[21] = StaticICData target 'dart._internal::_boundsCheckForPartialInstantiation', arg-desc CP#20
}
Closure CP#0 {
EntryFixed 2, 3
CheckStack 0
Push FP[-6]
LoadFieldTOS CP#1
PopLocal r1
Push FP[-6]
LoadFieldTOS CP#3
StoreLocal r0
PushConstant CP#5
JumpIfEqStrict L1
CheckFunctionTypeArgs 0, r2
Jump L2
L1:
CheckFunctionTypeArgs 1, r0
L2:
Push r0
Push FP[-6]
LoadFieldTOS CP#6
PushInt 0
PushInt 1
PushConstant CP#9
IndirectStaticCall 4, CP#8
PopLocal r0
Push FP[-5]
PushConstant CP#10
PushNull
Push r0
PushConstant CP#11
AssertAssignable 0, CP#12
Drop1
PushNull
ReturnTOS
}
]static method testPartialInstantiation() → (core::int) → dynamic {
function foo<T extends core::Object = dynamic>(T t) → void {}
(core::int) → dynamic intFunc = foo<core::int>;
return intFunc;
}
[@vm.bytecode=
Bytecode (version: stable) {
Entry 0
CheckStack 0
PushNull
ReturnTOS
}
ConstantPool {
}
]static method main() → dynamic {}