377eb52f5a
Library reference is added for private names in order to resolve them correctly. Invocation kind byte supersedes VM-specific name mangling and makes ConstantICData more uniform with ConstantStaticICData. Change-Id: I66542356209d98b3d0cf0e6b8eb19bda052c6b7e Reviewed-on: https://dart-review.googlesource.com/57485 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Zach Anderson <zra@google.com> Reviewed-by: Régis Crelier <regis@google.com>
437 lines
11 KiB
Plaintext
437 lines
11 KiB
Plaintext
library #lib;
|
|
import self as self;
|
|
import "dart:core" as core;
|
|
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack
|
|
PushConstant CP#0
|
|
PopLocal r0
|
|
PushConstant CP#0
|
|
PopLocal r1
|
|
L2:
|
|
CheckStack
|
|
Push r1
|
|
Push FP[-5]
|
|
InstanceCall1 1, CP#2
|
|
InstanceCall1 2, CP#4
|
|
PushConstant CP#5
|
|
IfNeStrictTOS
|
|
Jump L1
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InstanceCall1 2, CP#6
|
|
InstanceCall1 2, CP#7
|
|
StoreLocal r0
|
|
Drop1
|
|
Push r1
|
|
PushConstant CP#8
|
|
InstanceCall1 2, CP#9
|
|
StoreLocal r1
|
|
Drop1
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
PushConstant CP#10
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Int 0
|
|
[1] = ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = ICData get target-name 'length', arg-desc CP#1
|
|
[3] = ArgDesc num-args 2, num-type-args 0, names []
|
|
[4] = ICData target-name '<', arg-desc CP#3
|
|
[5] = Bool true
|
|
[6] = ICData target-name '[]', arg-desc CP#3
|
|
[7] = ICData target-name '+', arg-desc CP#3
|
|
[8] = Int 1
|
|
[9] = ICData target-name '+', arg-desc CP#3
|
|
[10] = Null
|
|
}
|
|
]static method test_for(core::List<core::int> list) → core::int {
|
|
core::int sum = 0;
|
|
for (core::int i = 0; i.{core::num::<}(list.{core::List::length}); i = i.{core::num::+}(1)) {
|
|
sum = sum.{core::num::+}(list.{core::List::[]}(i));
|
|
}
|
|
return sum;
|
|
}
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack
|
|
PushConstant CP#0
|
|
PopLocal r0
|
|
PushConstant CP#0
|
|
PopLocal r1
|
|
L3:
|
|
CheckStack
|
|
Push r1
|
|
PushConstant CP#0
|
|
InstanceCall1 2, CP#2
|
|
PushConstant CP#3
|
|
IfNeStrictTOS
|
|
Jump L1
|
|
Push r1
|
|
Push FP[-5]
|
|
InstanceCall1 1, CP#5
|
|
InstanceCall1 2, CP#6
|
|
PushConstant CP#3
|
|
IfNeStrictTOS
|
|
Jump L2
|
|
Jump L1
|
|
L2:
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InstanceCall1 2, CP#7
|
|
InstanceCall1 2, CP#8
|
|
StoreLocal r0
|
|
Drop1
|
|
Push r1
|
|
PushConstant CP#9
|
|
InstanceCall1 2, CP#10
|
|
StoreLocal r1
|
|
Drop1
|
|
Jump L3
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
PushConstant CP#11
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Int 0
|
|
[1] = ArgDesc num-args 2, num-type-args 0, names []
|
|
[2] = ICData target-name '>=', arg-desc CP#1
|
|
[3] = Bool true
|
|
[4] = ArgDesc num-args 1, num-type-args 0, names []
|
|
[5] = ICData get target-name 'length', arg-desc CP#4
|
|
[6] = ICData target-name '>=', arg-desc CP#1
|
|
[7] = ICData target-name '[]', arg-desc CP#1
|
|
[8] = ICData target-name '+', arg-desc CP#1
|
|
[9] = Int 1
|
|
[10] = ICData target-name '+', arg-desc CP#1
|
|
[11] = Null
|
|
}
|
|
]static method test_for_break(core::List<core::int> list) → core::int {
|
|
core::int sum = 0;
|
|
#L1:
|
|
for (core::int i = 0; i.{core::num::>=}(0); i = i.{core::num::+}(1)) {
|
|
if(i.{core::num::>=}(list.{core::List::length})) {
|
|
break #L1;
|
|
}
|
|
sum = sum.{core::num::+}(list.{core::List::[]}(i));
|
|
}
|
|
return sum;
|
|
}
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack
|
|
PushConstant CP#0
|
|
PopLocal r0
|
|
PushConstant CP#1
|
|
InstanceCall1 1, CP#3
|
|
PopLocal r1
|
|
L4:
|
|
CheckStack
|
|
Push r1
|
|
Push FP[-5]
|
|
InstanceCall1 1, CP#4
|
|
InstanceCall1 2, CP#6
|
|
PushConstant CP#7
|
|
IfNeStrictTOS
|
|
Jump L1
|
|
Push r1
|
|
PushConstant CP#0
|
|
InstanceCall1 2, CP#8
|
|
PushConstant CP#7
|
|
IfNeStrictTOS
|
|
Jump L2
|
|
Jump L3
|
|
L2:
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InstanceCall1 2, CP#9
|
|
InstanceCall1 2, CP#10
|
|
StoreLocal r0
|
|
Drop1
|
|
L3:
|
|
Push r1
|
|
PushConstant CP#11
|
|
InstanceCall1 2, CP#12
|
|
StoreLocal r1
|
|
Drop1
|
|
Jump L4
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
PushConstant CP#13
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Int 0
|
|
[1] = Int 100
|
|
[2] = ArgDesc num-args 1, num-type-args 0, names []
|
|
[3] = ICData target-name 'unary-', arg-desc CP#2
|
|
[4] = ICData get target-name 'length', arg-desc CP#2
|
|
[5] = ArgDesc num-args 2, num-type-args 0, names []
|
|
[6] = ICData target-name '<', arg-desc CP#5
|
|
[7] = Bool true
|
|
[8] = ICData target-name '<', arg-desc CP#5
|
|
[9] = ICData target-name '[]', arg-desc CP#5
|
|
[10] = ICData target-name '+', arg-desc CP#5
|
|
[11] = Int 1
|
|
[12] = ICData target-name '+', arg-desc CP#5
|
|
[13] = Null
|
|
}
|
|
]static method test_for_continue(core::List<core::int> list) → core::int {
|
|
core::int sum = 0;
|
|
for (core::int i = 100.{core::int::unary-}(); i.{core::num::<}(list.{core::List::length}); i = i.{core::num::+}(1))
|
|
#L2:
|
|
{
|
|
if(i.{core::num::<}(0)) {
|
|
break #L2;
|
|
}
|
|
sum = sum.{core::num::+}(list.{core::List::[]}(i));
|
|
}
|
|
return sum;
|
|
}
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 4
|
|
CheckStack
|
|
PushConstant CP#0
|
|
PopLocal r0
|
|
PushConstant CP#0
|
|
PopLocal r1
|
|
L2:
|
|
CheckStack
|
|
Push r1
|
|
Push FP[-5]
|
|
InstanceCall1 1, CP#2
|
|
InstanceCall1 2, CP#4
|
|
PushConstant CP#5
|
|
IfNeStrictTOS
|
|
Jump L1
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
PopLocal r2
|
|
Push r2
|
|
PushConstant CP#6
|
|
InstanceCall1 2, CP#7
|
|
StoreLocal r1
|
|
PopLocal r3
|
|
Push r2
|
|
InstanceCall1 2, CP#8
|
|
InstanceCall1 2, CP#9
|
|
StoreLocal r0
|
|
Drop1
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
PushConstant CP#10
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Int 0
|
|
[1] = ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = ICData get target-name 'length', arg-desc CP#1
|
|
[3] = ArgDesc num-args 2, num-type-args 0, names []
|
|
[4] = ICData target-name '<', arg-desc CP#3
|
|
[5] = Bool true
|
|
[6] = Int 1
|
|
[7] = ICData target-name '+', arg-desc CP#3
|
|
[8] = ICData target-name '[]', arg-desc CP#3
|
|
[9] = ICData target-name '+', arg-desc CP#3
|
|
[10] = Null
|
|
}
|
|
]static method test_while(core::List<core::int> list) → core::int {
|
|
core::int sum = 0;
|
|
core::int i = 0;
|
|
while (i.{core::num::<}(list.{core::List::length})) {
|
|
sum = sum.{core::num::+}(list.{core::List::[]}(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1));
|
|
}
|
|
return sum;
|
|
}
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack
|
|
PushConstant CP#0
|
|
PopLocal r0
|
|
PushConstant CP#0
|
|
PopLocal r1
|
|
L1:
|
|
CheckStack
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InstanceCall1 2, CP#2
|
|
InstanceCall1 2, CP#3
|
|
StoreLocal r0
|
|
Drop1
|
|
Push r1
|
|
PushConstant CP#4
|
|
InstanceCall1 2, CP#5
|
|
StoreLocal r1
|
|
Drop1
|
|
Push r1
|
|
Push FP[-5]
|
|
InstanceCall1 1, CP#7
|
|
InstanceCall1 2, CP#8
|
|
PushConstant CP#9
|
|
IfEqStrictTOS
|
|
Jump L1
|
|
Push r0
|
|
ReturnTOS
|
|
PushConstant CP#10
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Int 0
|
|
[1] = ArgDesc num-args 2, num-type-args 0, names []
|
|
[2] = ICData target-name '[]', arg-desc CP#1
|
|
[3] = ICData target-name '+', arg-desc CP#1
|
|
[4] = Int 1
|
|
[5] = ICData target-name '+', arg-desc CP#1
|
|
[6] = ArgDesc num-args 1, num-type-args 0, names []
|
|
[7] = ICData get target-name 'length', arg-desc CP#6
|
|
[8] = ICData target-name '<', arg-desc CP#1
|
|
[9] = Bool true
|
|
[10] = Null
|
|
}
|
|
]static method test_do_while(core::List<core::int> list) → core::int {
|
|
core::int sum = 0;
|
|
core::int i = 0;
|
|
do {
|
|
sum = sum.{core::num::+}(list.{core::List::[]}(i));
|
|
i = i.{core::num::+}(1);
|
|
}
|
|
while (i.{core::num::<}(list.{core::List::length}))
|
|
return sum;
|
|
}
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 3
|
|
CheckStack
|
|
PushConstant CP#0
|
|
PopLocal r0
|
|
Push FP[-5]
|
|
InstanceCall1 1, CP#2
|
|
PopLocal r1
|
|
L2:
|
|
CheckStack
|
|
Push r1
|
|
InstanceCall1 1, CP#3
|
|
PushConstant CP#4
|
|
IfNeStrictTOS
|
|
Jump L1
|
|
Push r1
|
|
InstanceCall1 1, CP#5
|
|
PopLocal r2
|
|
Push r0
|
|
Push r2
|
|
InstanceCall1 2, CP#7
|
|
StoreLocal r0
|
|
Drop1
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
PushConstant CP#8
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Int 0
|
|
[1] = ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = ICData get target-name 'iterator', arg-desc CP#1
|
|
[3] = ICData target-name 'moveNext', arg-desc CP#1
|
|
[4] = Bool true
|
|
[5] = ICData get target-name 'current', arg-desc CP#1
|
|
[6] = ArgDesc num-args 2, num-type-args 0, names []
|
|
[7] = ICData target-name '+', arg-desc CP#6
|
|
[8] = Null
|
|
}
|
|
]static method test_for_in(core::List<core::int> list) → core::int {
|
|
core::int sum = 0;
|
|
for (core::int e in list) {
|
|
sum = sum.{core::num::+}(e);
|
|
}
|
|
return sum;
|
|
}
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 4
|
|
CheckStack
|
|
PushConstant CP#0
|
|
PopLocal r0
|
|
PushConstant CP#1
|
|
PopLocal r1
|
|
Push FP[-5]
|
|
InstanceCall1 1, CP#3
|
|
PopLocal r2
|
|
L2:
|
|
CheckStack
|
|
Push r2
|
|
InstanceCall1 1, CP#4
|
|
PushConstant CP#5
|
|
IfNeStrictTOS
|
|
Jump L1
|
|
Push r2
|
|
InstanceCall1 1, CP#6
|
|
PopLocal r3
|
|
Push r3
|
|
StoreLocal r1
|
|
Drop1
|
|
Push r0
|
|
Push r1
|
|
InstanceCall1 2, CP#8
|
|
StoreLocal r0
|
|
Drop1
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
PushConstant CP#9
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Int 0
|
|
[1] = Int 42
|
|
[2] = ArgDesc num-args 1, num-type-args 0, names []
|
|
[3] = ICData get target-name 'iterator', arg-desc CP#2
|
|
[4] = ICData target-name 'moveNext', arg-desc CP#2
|
|
[5] = Bool true
|
|
[6] = ICData get target-name 'current', arg-desc CP#2
|
|
[7] = ArgDesc num-args 2, num-type-args 0, names []
|
|
[8] = ICData target-name '+', arg-desc CP#7
|
|
[9] = Null
|
|
}
|
|
]static method test_for_in_with_outer_var(core::List<core::int> list) → core::int {
|
|
core::int sum = 0;
|
|
core::int e = 42;
|
|
for (final core::int #t3 in list) {
|
|
e = #t3;
|
|
sum = sum.{core::num::+}(e);
|
|
}
|
|
return sum;
|
|
}
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Null
|
|
}
|
|
]static method main() → dynamic {}
|