da8cb470cc
Size of a large application:
Before: 26628600
After: 21480120 (-19.3%)
Size of snapshots:
isolate_snapshot_framework.bin
Before: 9322496
After: 6782976 (-27.2%)
isolate_snapshot_product_framework.bin
Before: 9166848
After: 6602752 (-27.9%)
Regressions in tests:
1) Test language_2/type_alias_equality_test/04 fails similarly to default mode, as VM
does not implement comparison of function types according to the specification.
Previously this test was passing as function types were canonicalized in bytecode,
which was not always correct. This CL fixes the problem with canonicalization of
function types in bytecode and the test starts failing again.
2) Tests standalone_2/entrypoints_verification_test, standalone_2/io/test_extension_test,
standalone_2/io/test_extension_fail_test fail as native extensions are not supported
in bytecode yet. These tests start passing after df5e7aac17,
which switched bytecode tests to kernel service (on x64), because kernel service doesn't
drop ASTs. This CL switches from reading AST library declarations to bytecode even if
AST is not removed, so tests fail again.
Change-Id: I8b7ba44bfa49d0b1599b2509553ff7c831a4e244
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/104700
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
528 lines
13 KiB
Plaintext
528 lines
13 KiB
Plaintext
main = #lib::main;
|
|
[@vm.bytecode=
|
|
BytecodeMetadata {
|
|
Bytecode (version: stable)
|
|
Main library: #lib
|
|
Library '#lib'
|
|
name '#lib'
|
|
script '#lib'
|
|
|
|
Class '', script = '#lib'
|
|
|
|
|
|
Function 'main', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
}
|
|
|
|
Class 'Base1', script = '#lib'
|
|
extends dart:core::Object
|
|
|
|
|
|
Function '', constructor, reflectable
|
|
parameters [] (required: 0)
|
|
return-type #lib::Base1
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall CP#0, 1
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
|
|
Function 'foo', reflectable, debuggable
|
|
type-params <dart:core::Object T>
|
|
parameters [#lib::Base1::foo::TypeParam/0 'a1', dart:core::int 'a2'] (required: 2)
|
|
return-type void
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
CheckFunctionTypeArgs 1, r0
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
}
|
|
|
|
|
|
Function 'get:bar', getter, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushInt 42
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
}
|
|
|
|
|
|
Function 'set:bazz', setter, reflectable, debuggable
|
|
parameters [dart:core::int 'x'] (required: 1)
|
|
return-type void
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
}
|
|
|
|
Class 'A', script = '#lib'
|
|
extends #lib::Base1
|
|
|
|
|
|
Function '', constructor, reflectable
|
|
parameters [] (required: 0)
|
|
return-type #lib::A
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall CP#0, 1
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall '#lib::Base1:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperCall', reflectable, debuggable
|
|
parameters [dart:core::int 'x'] (required: 1)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
Push FP[-6]
|
|
PushConstant CP#1
|
|
PushInt 2
|
|
DirectCall CP#2, 4
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef < dart:core::String >
|
|
[1] = ObjectRef 'a1'
|
|
[2] = DirectCall '#lib::Base1::foo', ArgDesc num-args 3, num-type-args 1, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperTearOff', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall CP#0, 1
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall '#lib::Base1::get:foo', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperGet', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall CP#0, 1
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall '#lib::Base1::get:bar', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperCallViaGetter', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
Push FP[-5]
|
|
DirectCall CP#1, 1
|
|
PushConstant CP#3
|
|
DynamicCall CP#5, 3
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef < dart:core::int >
|
|
[1] = DirectCall '#lib::Base1::get:bar', ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = Reserved
|
|
[3] = ObjectRef 'param'
|
|
[4] = ObjectRef ArgDesc num-args 2, num-type-args 1, names []
|
|
[5] = ICData dynamic target-name 'call', arg-desc CP#4
|
|
}
|
|
|
|
|
|
Function 'testSuperSet', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
PushInt 3
|
|
DirectCall CP#0, 2
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall '#lib::Base1::set:bazz', ArgDesc num-args 2, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
Class 'Base2', script = '#lib', abstract
|
|
extends dart:core::Object
|
|
|
|
|
|
Function '', constructor, reflectable
|
|
parameters [] (required: 0)
|
|
return-type #lib::Base2
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall CP#0, 1
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
|
|
Function 'foo', abstract, reflectable, debuggable
|
|
type-params <dart:core::Object T>
|
|
parameters [dart:core::String 'a1', #lib::Base2::foo::TypeParam/0 'a2', dart:core::int 'a3'] (required: 3)
|
|
return-type void
|
|
|
|
Function 'get:bar', getter, abstract, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Function 'set:bazz', setter, abstract, reflectable, debuggable
|
|
parameters [dart:core::int 'x'] (required: 1)
|
|
return-type void
|
|
Class 'B', script = '#lib', abstract
|
|
extends #lib::Base2
|
|
|
|
|
|
Function '', constructor, reflectable
|
|
parameters [] (required: 0)
|
|
return-type #lib::B
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall CP#0, 1
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall '#lib::Base2:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperCall', reflectable, debuggable
|
|
parameters [dart:core::int 'x'] (required: 1)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
Push FP[-6]
|
|
PushConstant CP#1
|
|
PushConstant CP#0
|
|
PushConstant CP#2
|
|
PushInt 5
|
|
CreateArrayTOS
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 0
|
|
PushConstant CP#3
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 1
|
|
Push FP[-6]
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 2
|
|
PushConstant CP#4
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 3
|
|
PushConstant CP#5
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 4
|
|
PushInt 5
|
|
StoreIndexedTOS
|
|
PushTrue
|
|
DirectCall CP#6, 4
|
|
DirectCall CP#8, 2
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef ArgDesc num-args 4, num-type-args 1, names []
|
|
[1] = ObjectRef 'foo'
|
|
[2] = ObjectRef < dynamic >
|
|
[3] = ObjectRef < dart:core::double >
|
|
[4] = ObjectRef 'a1'
|
|
[5] = ObjectRef const 3.14
|
|
[6] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
|
|
[7] = Reserved
|
|
[8] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
|
|
[9] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperTearOff', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
PushConstant CP#1
|
|
PushConstant CP#0
|
|
PushConstant CP#2
|
|
PushInt 1
|
|
CreateArrayTOS
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 0
|
|
Push FP[-5]
|
|
StoreIndexedTOS
|
|
PushTrue
|
|
DirectCall CP#3, 4
|
|
DirectCall CP#5, 2
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = ObjectRef 'foo'
|
|
[2] = ObjectRef < dynamic >
|
|
[3] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
|
|
[4] = Reserved
|
|
[5] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
|
|
[6] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperGet', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
PushConstant CP#1
|
|
PushConstant CP#0
|
|
PushConstant CP#2
|
|
PushInt 1
|
|
CreateArrayTOS
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 0
|
|
Push FP[-5]
|
|
StoreIndexedTOS
|
|
PushTrue
|
|
DirectCall CP#3, 4
|
|
DirectCall CP#5, 2
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = ObjectRef 'bar'
|
|
[2] = ObjectRef < dynamic >
|
|
[3] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
|
|
[4] = Reserved
|
|
[5] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
|
|
[6] = Reserved
|
|
}
|
|
|
|
|
|
Function 'testSuperCallViaGetter', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
Push FP[-5]
|
|
PushConstant CP#2
|
|
PushConstant CP#1
|
|
PushConstant CP#3
|
|
PushInt 1
|
|
CreateArrayTOS
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 0
|
|
Push FP[-5]
|
|
StoreIndexedTOS
|
|
PushTrue
|
|
DirectCall CP#4, 4
|
|
DirectCall CP#6, 2
|
|
PushConstant CP#8
|
|
DynamicCall CP#10, 3
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef < dart:core::int >
|
|
[1] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = ObjectRef 'bar'
|
|
[3] = ObjectRef < dynamic >
|
|
[4] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
|
|
[5] = Reserved
|
|
[6] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
|
|
[7] = Reserved
|
|
[8] = ObjectRef 'param'
|
|
[9] = ObjectRef ArgDesc num-args 2, num-type-args 1, names []
|
|
[10] = ICData dynamic target-name 'call', arg-desc CP#9
|
|
}
|
|
|
|
|
|
Function 'testSuperSet', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
PushConstant CP#1
|
|
PushConstant CP#0
|
|
PushConstant CP#2
|
|
PushInt 2
|
|
CreateArrayTOS
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 0
|
|
Push FP[-5]
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 1
|
|
PushInt 3
|
|
StoreIndexedTOS
|
|
PushTrue
|
|
DirectCall CP#3, 4
|
|
DirectCall CP#5, 2
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
|
|
[1] = ObjectRef 'bazz'
|
|
[2] = ObjectRef < dynamic >
|
|
[3] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
|
|
[4] = Reserved
|
|
[5] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
|
|
[6] = Reserved
|
|
}
|
|
|
|
|
|
}
|
|
]library #lib from "#lib" as #lib {
|
|
|
|
class Base1 extends dart.core::Object {
|
|
synthetic constructor •() → #lib::Base1
|
|
: super dart.core::Object::•()
|
|
;
|
|
method foo<T extends dart.core::Object = dynamic>(#lib::Base1::foo::T a1, dart.core::int a2) → void {}
|
|
get bar() → dynamic
|
|
return 42;
|
|
set bazz(dart.core::int x) → void {}
|
|
}
|
|
class A extends #lib::Base1 {
|
|
synthetic constructor •() → #lib::A
|
|
: super #lib::Base1::•()
|
|
;
|
|
method testSuperCall(dart.core::int x) → dynamic
|
|
return super.{#lib::Base1::foo}<dart.core::String>("a1", 2);
|
|
method testSuperTearOff() → dynamic
|
|
return super.{#lib::Base1::foo};
|
|
method testSuperGet() → dynamic
|
|
return super.{#lib::Base1::bar};
|
|
method testSuperCallViaGetter() → dynamic
|
|
return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base1::bar}.call<dart.core::int>("param");
|
|
method testSuperSet() → dynamic {
|
|
super.{#lib::Base1::bazz} = 3;
|
|
}
|
|
}
|
|
abstract class Base2 extends dart.core::Object {
|
|
synthetic constructor •() → #lib::Base2
|
|
: super dart.core::Object::•()
|
|
;
|
|
abstract method foo<T extends dart.core::Object = dynamic>(dart.core::String a1, #lib::Base2::foo::T a2, dart.core::int a3) → void;
|
|
abstract get bar() → dynamic;
|
|
abstract set bazz(dart.core::int x) → void;
|
|
}
|
|
abstract class B extends #lib::Base2 {
|
|
synthetic constructor •() → #lib::B
|
|
: super #lib::Base2::•()
|
|
;
|
|
method testSuperCall(dart.core::int x) → dynamic
|
|
return super.{#lib::Base2::foo}<dart.core::double>("a1", 3.14, 5);
|
|
method testSuperTearOff() → dynamic
|
|
return super.{#lib::Base2::foo};
|
|
method testSuperGet() → dynamic
|
|
return super.{#lib::Base2::bar};
|
|
method testSuperCallViaGetter() → dynamic
|
|
return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base2::bar}.call<dart.core::int>("param");
|
|
method testSuperSet() → dynamic {
|
|
super.{#lib::Base2::bazz} = 3;
|
|
}
|
|
}
|
|
static method main() → dynamic {}
|
|
}
|