61f0f5bc43
This change replaces kernel AST declarations of fields and functions with bytecode declarations. Size of dilp files is reduced by 11-12%. Startup latency: Time to the first full frame: 1.945s -> 1.687s FinalizeClass: 554ms -> 277ms FinishClassLoading: 296ms -> 156ms There are following regressions in bytecode mode, which will be fixed in future: * dart:mirrors are not supported yet (implementation of mirrors relies on reading kernel AST in certain cases). As the result, lib_2/mirrors/* tests fail. * native extensions are not supported yet (annotations on libraries and classes in AST are cleaned up as they could reference members which are now removed from AST). As the result, standalone_2/entrypoints_verification_test test fails. * language_2/spread_collections/const_error_test/* tests fail due to https://github.com/dart-lang/sdk/issues/36286. Change-Id: I5130f401fd7b84038b136136e7ccc1a6e51b6cea Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97561 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com>
411 lines
10 KiB
Plaintext
411 lines
10 KiB
Plaintext
main = #lib::main;
|
|
[@vm.bytecode=
|
|
ComponentBytecodeMetadata {
|
|
|
|
Bytecode (version: stable)
|
|
Main library: #lib
|
|
|
|
}
|
|
] [@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
|
|
Function 'test_for', static, reflectable, debuggable
|
|
parameters [dart:core::List < dart:core::int > 'list'] (required: 1)
|
|
return-type dart:core::int
|
|
|
|
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack 0
|
|
PushInt 0
|
|
PopLocal r0
|
|
PushInt 0
|
|
PopLocal r1
|
|
L2:
|
|
CheckStack 1
|
|
Push r1
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#0
|
|
CompareIntLt
|
|
JumpIfFalse L1
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InterfaceCall 2, CP#2
|
|
AddInt
|
|
PopLocal r0
|
|
Push r1
|
|
PushInt 1
|
|
AddInt
|
|
StoreLocal r1
|
|
Drop1
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
|
|
Function 'test_for_break', static, reflectable, debuggable
|
|
parameters [dart:core::List < dart:core::int > 'list'] (required: 1)
|
|
return-type dart:core::int
|
|
|
|
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack 0
|
|
PushInt 0
|
|
PopLocal r0
|
|
PushInt 0
|
|
PopLocal r1
|
|
L3:
|
|
CheckStack 1
|
|
Push r1
|
|
PushInt 0
|
|
CompareIntGe
|
|
JumpIfFalse L1
|
|
Push r1
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#0
|
|
CompareIntGe
|
|
JumpIfFalse L2
|
|
Jump L1
|
|
L2:
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InterfaceCall 2, CP#2
|
|
AddInt
|
|
PopLocal r0
|
|
Push r1
|
|
PushInt 1
|
|
AddInt
|
|
StoreLocal r1
|
|
Drop1
|
|
Jump L3
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
|
|
Function 'test_for_continue', static, reflectable, debuggable
|
|
parameters [dart:core::List < dart:core::int > 'list'] (required: 1)
|
|
return-type dart:core::int
|
|
|
|
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack 0
|
|
PushInt 0
|
|
PopLocal r0
|
|
PushInt 100
|
|
NegateInt
|
|
PopLocal r1
|
|
L4:
|
|
CheckStack 1
|
|
Push r1
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#0
|
|
CompareIntLt
|
|
JumpIfFalse L1
|
|
Push r1
|
|
PushInt 0
|
|
CompareIntLt
|
|
JumpIfFalse L2
|
|
Jump L3
|
|
L2:
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InterfaceCall 2, CP#2
|
|
AddInt
|
|
PopLocal r0
|
|
L3:
|
|
Push r1
|
|
PushInt 1
|
|
AddInt
|
|
StoreLocal r1
|
|
Drop1
|
|
Jump L4
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
|
|
Function 'test_while', static, reflectable, debuggable
|
|
parameters [dart:core::List < dart:core::int > 'list'] (required: 1)
|
|
return-type dart:core::int
|
|
|
|
|
|
Bytecode {
|
|
Entry 4
|
|
CheckStack 0
|
|
PushInt 0
|
|
PopLocal r0
|
|
PushInt 0
|
|
PopLocal r1
|
|
L2:
|
|
CheckStack 1
|
|
Push r1
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#0
|
|
CompareIntLt
|
|
JumpIfFalse L1
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
PopLocal r2
|
|
Push r2
|
|
PushInt 1
|
|
AddInt
|
|
StoreLocal r1
|
|
PopLocal r3
|
|
Push r2
|
|
InterfaceCall 2, CP#2
|
|
AddInt
|
|
PopLocal r0
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
|
|
Function 'test_do_while', static, reflectable, debuggable
|
|
parameters [dart:core::List < dart:core::int > 'list'] (required: 1)
|
|
return-type dart:core::int
|
|
|
|
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack 0
|
|
PushInt 0
|
|
PopLocal r0
|
|
PushInt 0
|
|
PopLocal r1
|
|
L1:
|
|
CheckStack 1
|
|
Push r0
|
|
Push FP[-5]
|
|
Push r1
|
|
InterfaceCall 2, CP#0
|
|
AddInt
|
|
PopLocal r0
|
|
Push r1
|
|
PushInt 1
|
|
AddInt
|
|
PopLocal r1
|
|
Push r1
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#2
|
|
CompareIntLt
|
|
JumpIfTrue L1
|
|
Push r0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
|
|
Function 'test_for_in', static, reflectable, debuggable
|
|
parameters [dart:core::List < dart:core::int > 'list'] (required: 1)
|
|
return-type dart:core::int
|
|
|
|
|
|
Bytecode {
|
|
Entry 3
|
|
CheckStack 0
|
|
PushInt 0
|
|
PopLocal r0
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#0
|
|
PopLocal r1
|
|
L2:
|
|
CheckStack 1
|
|
Push r1
|
|
InterfaceCall 1, CP#2
|
|
JumpIfFalse L1
|
|
Push r1
|
|
InterfaceCall 1, CP#4
|
|
PopLocal r2
|
|
Push r0
|
|
Push r2
|
|
AddInt
|
|
PopLocal r0
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InterfaceCall 'dart:core::Iterable::get:iterator', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = InterfaceCall 'dart:core::Iterator::moveNext', ArgDesc num-args 1, num-type-args 0, names []
|
|
[3] = Reserved
|
|
[4] = InterfaceCall 'dart:core::Iterator::get:current', ArgDesc num-args 1, num-type-args 0, names []
|
|
[5] = Reserved
|
|
}
|
|
|
|
|
|
Function 'test_for_in_with_outer_var', static, reflectable, debuggable
|
|
parameters [dart:core::List < dart:core::int > 'list'] (required: 1)
|
|
return-type dart:core::int
|
|
|
|
|
|
Bytecode {
|
|
Entry 4
|
|
CheckStack 0
|
|
PushInt 0
|
|
PopLocal r0
|
|
PushInt 42
|
|
PopLocal r1
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#0
|
|
PopLocal r2
|
|
L2:
|
|
CheckStack 1
|
|
Push r2
|
|
InterfaceCall 1, CP#2
|
|
JumpIfFalse L1
|
|
Push r2
|
|
InterfaceCall 1, CP#4
|
|
PopLocal r3
|
|
Push r3
|
|
PopLocal r1
|
|
Push r0
|
|
Push r1
|
|
AddInt
|
|
PopLocal r0
|
|
Jump L2
|
|
L1:
|
|
Push r0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InterfaceCall 'dart:core::Iterable::get:iterator', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = InterfaceCall 'dart:core::Iterator::moveNext', ArgDesc num-args 1, num-type-args 0, names []
|
|
[3] = Reserved
|
|
[4] = InterfaceCall 'dart:core::Iterator::get:current', ArgDesc num-args 1, num-type-args 0, names []
|
|
[5] = Reserved
|
|
}
|
|
|
|
|
|
Function 'main', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
]library #lib from "#lib" as #lib {
|
|
|
|
static method test_for(dart.core::List<dart.core::int> list) → dart.core::int {
|
|
dart.core::int sum = 0;
|
|
for (dart.core::int i = 0; i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
|
|
sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
|
|
}
|
|
return sum;
|
|
}
|
|
static method test_for_break(dart.core::List<dart.core::int> list) → dart.core::int {
|
|
dart.core::int sum = 0;
|
|
#L1:
|
|
for (dart.core::int i = 0; i.{dart.core::num::>=}(0); i = i.{dart.core::num::+}(1)) {
|
|
if(i.{dart.core::num::>=}(list.{dart.core::List::length})) {
|
|
break #L1;
|
|
}
|
|
sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
|
|
}
|
|
return sum;
|
|
}
|
|
static method test_for_continue(dart.core::List<dart.core::int> list) → dart.core::int {
|
|
dart.core::int sum = 0;
|
|
for (dart.core::int i = 100.{dart.core::int::unary-}(); i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1))
|
|
#L2:
|
|
{
|
|
if(i.{dart.core::num::<}(0)) {
|
|
break #L2;
|
|
}
|
|
sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
|
|
}
|
|
return sum;
|
|
}
|
|
static method test_while(dart.core::List<dart.core::int> list) → dart.core::int {
|
|
dart.core::int sum = 0;
|
|
dart.core::int i = 0;
|
|
while (i.{dart.core::num::<}(list.{dart.core::List::length})) {
|
|
sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(let final dart.core::int #t1 = i in let final dart.core::int #t2 = i = #t1.{dart.core::num::+}(1) in #t1));
|
|
}
|
|
return sum;
|
|
}
|
|
static method test_do_while(dart.core::List<dart.core::int> list) → dart.core::int {
|
|
dart.core::int sum = 0;
|
|
dart.core::int i = 0;
|
|
do {
|
|
sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
|
|
i = i.{dart.core::num::+}(1);
|
|
}
|
|
while (i.{dart.core::num::<}(list.{dart.core::List::length}))
|
|
return sum;
|
|
}
|
|
static method test_for_in(dart.core::List<dart.core::int> list) → dart.core::int {
|
|
dart.core::int sum = 0;
|
|
for (dart.core::int e in list) {
|
|
sum = sum.{dart.core::num::+}(e);
|
|
}
|
|
return sum;
|
|
}
|
|
static method test_for_in_with_outer_var(dart.core::List<dart.core::int> list) → dart.core::int {
|
|
dart.core::int sum = 0;
|
|
dart.core::int e = 42;
|
|
for (final dart.core::int #t3 in list) {
|
|
e = #t3;
|
|
sum = sum.{dart.core::num::+}(e);
|
|
}
|
|
return sum;
|
|
}
|
|
static method main() → dynamic {}
|
|
}
|