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>
819 lines
22 KiB
Plaintext
819 lines
22 KiB
Plaintext
main = #lib::main;
|
|
[@vm.bytecode=
|
|
ComponentBytecodeMetadata {
|
|
|
|
Bytecode (version: stable)
|
|
Main library: #lib
|
|
|
|
}
|
|
] [@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
Field 'c1', type = #lib::A, getter = 'get:c1', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
|
|
}
|
|
|
|
|
|
Field 'c2', type = dart:core::String, reflectable, static, const, final
|
|
value = 'hello!'
|
|
|
|
Field 'c3', type = dart:core::int, reflectable, static, const, final
|
|
value = const 6
|
|
|
|
Field 'c4', type = #lib::C, getter = 'get:c4', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::C {#lib::C::j (field): const 3, #lib::B::i (field): const 15}
|
|
}
|
|
|
|
|
|
Field 'c5', type = #lib::D, getter = 'get:c5', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::D {#lib::D::x (field): const #lib::B {#lib::B::i (field): const 4}, #lib::D::y (field): null}
|
|
}
|
|
|
|
|
|
Field 'fieldWithDoubleLiteralInitializer', type = dart:core::double, reflectable, static
|
|
value = const 1.0
|
|
|
|
Function 'test_constants1', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type void
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushConstant CP#3
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushInt 6
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushConstant CP#4
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushConstant CP#5
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
|
|
[1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = Reserved
|
|
[3] = ObjectRef 'hello!'
|
|
[4] = ObjectRef const #lib::C {#lib::C::j (field): const 3, #lib::B::i (field): const 15}
|
|
[5] = ObjectRef const #lib::D {#lib::D::x (field): const #lib::B {#lib::B::i (field): const 4}, #lib::D::y (field): null}
|
|
}
|
|
|
|
|
|
Function 'test_constants2', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type void
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushInt 42
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushConstant CP#2
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushConstant CP#3
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushConstant CP#4
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushConstant CP#5
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushConstant CP#6
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
[2] = ObjectRef 'foo'
|
|
[3] = ObjectRef const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}
|
|
[4] = ObjectRef const <dart:core::Object> [const 42, 'foo', dart:core::int]
|
|
[5] = ObjectRef const dart:core::_ImmutableMap < dart:core::String, #lib::A > {dart:core::_ImmutableMap::_kvPairs (field): const <dynamic> ['E2', const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}, 'E4', const #lib::A {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}]}
|
|
[6] = ObjectRef const #lib::D {#lib::D::x (field): const #lib::C {#lib::C::j (field): const 9, #lib::B::i (field): const 30}, #lib::D::y (field): const dart:core::_ImmutableMap < dart:core::String, dart:core::Object > {dart:core::_ImmutableMap::_kvPairs (field): const <dynamic> ['foo', const 42, 'bar', const #lib::B {#lib::B::i (field): const 6}]}}
|
|
}
|
|
|
|
|
|
Function 'test_list_literal', static, reflectable, debuggable
|
|
parameters [dart:core::int 'a'] (required: 1)
|
|
return-type void
|
|
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 3
|
|
CreateArrayTOS
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 0
|
|
PushInt 1
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 1
|
|
Push FP[-5]
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 2
|
|
PushInt 3
|
|
StoreIndexedTOS
|
|
DirectCall 2, CP#1
|
|
DirectCall 1, CP#3
|
|
Drop1
|
|
PushConstant CP#5
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 3
|
|
CreateArrayTOS
|
|
StoreLocal r0
|
|
Push r0
|
|
PushInt 0
|
|
PushConstant CP#6
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 1
|
|
Push FP[-5]
|
|
InterfaceCall 1, CP#7
|
|
StoreIndexedTOS
|
|
Push r0
|
|
PushInt 2
|
|
PushConstant CP#9
|
|
StoreIndexedTOS
|
|
DirectCall 2, CP#1
|
|
DirectCall 1, CP#3
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef < dart:core::int >
|
|
[1] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, 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 < dart:core::String >
|
|
[6] = ObjectRef 'a'
|
|
[7] = InterfaceCall 'dart:core::int::toString', ArgDesc num-args 1, num-type-args 0, names []
|
|
[8] = Reserved
|
|
[9] = ObjectRef 'b'
|
|
}
|
|
|
|
|
|
Function 'test_map_literal', static, reflectable, debuggable
|
|
type-params <dart:core::Object T>
|
|
parameters [dart:core::int 'a', dart:core::int 'b', #lib::test_map_literal::TypeParam/0 'c'] (required: 3)
|
|
return-type void
|
|
|
|
|
|
Bytecode {
|
|
Entry 2
|
|
CheckStack 0
|
|
CheckFunctionTypeArgs 1, r0
|
|
PushConstant CP#0
|
|
PushConstant CP#1
|
|
PushInt 4
|
|
CreateArrayTOS
|
|
StoreLocal r1
|
|
Push r1
|
|
PushInt 0
|
|
PushInt 1
|
|
StoreIndexedTOS
|
|
Push r1
|
|
PushInt 1
|
|
Push FP[-7]
|
|
StoreIndexedTOS
|
|
Push r1
|
|
PushInt 2
|
|
Push FP[-6]
|
|
StoreIndexedTOS
|
|
Push r1
|
|
PushInt 3
|
|
PushInt 2
|
|
StoreIndexedTOS
|
|
DirectCall 2, CP#2
|
|
DirectCall 1, CP#4
|
|
Drop1
|
|
PushConstant CP#6
|
|
PushConstant CP#1
|
|
PushInt 4
|
|
CreateArrayTOS
|
|
StoreLocal r1
|
|
Push r1
|
|
PushInt 0
|
|
PushConstant CP#7
|
|
StoreIndexedTOS
|
|
Push r1
|
|
PushInt 1
|
|
Push FP[-7]
|
|
StoreIndexedTOS
|
|
Push r1
|
|
PushInt 2
|
|
Push FP[-6]
|
|
InterfaceCall 1, CP#8
|
|
StoreIndexedTOS
|
|
Push r1
|
|
PushInt 3
|
|
PushInt 3
|
|
StoreIndexedTOS
|
|
DirectCall 2, CP#2
|
|
DirectCall 1, CP#4
|
|
Drop1
|
|
PushNull
|
|
Push r0
|
|
InstantiateTypeArgumentsTOS 0, CP#10
|
|
PushConstant CP#11
|
|
DirectCall 2, CP#2
|
|
DirectCall 1, CP#4
|
|
Drop1
|
|
PushNull
|
|
Push r0
|
|
InstantiateTypeArgumentsTOS 0, CP#12
|
|
PushConstant CP#1
|
|
PushInt 2
|
|
CreateArrayTOS
|
|
StoreLocal r1
|
|
Push r1
|
|
PushInt 0
|
|
Push FP[-5]
|
|
StoreIndexedTOS
|
|
Push r1
|
|
PushInt 1
|
|
PushInt 4
|
|
StoreIndexedTOS
|
|
DirectCall 2, CP#2
|
|
DirectCall 1, CP#4
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef < dart:core::int, dart:core::int >
|
|
[1] = ObjectRef < dynamic >
|
|
[2] = DirectCall 'dart:core::Map::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
|
|
[3] = Reserved
|
|
[4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
|
|
[5] = Reserved
|
|
[6] = ObjectRef < dart:core::String, dart:core::int >
|
|
[7] = ObjectRef 'foo'
|
|
[8] = InterfaceCall 'dart:core::int::toString', ArgDesc num-args 1, num-type-args 0, names []
|
|
[9] = Reserved
|
|
[10] = ObjectRef < dart:core::String, #lib::test_map_literal::TypeParam/0 >
|
|
[11] = ObjectRef const <dynamic> []
|
|
[12] = ObjectRef < #lib::test_map_literal::TypeParam/0, dart:core::int >
|
|
}
|
|
|
|
|
|
Function 'test_symbol', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type void
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushConstant CP#3
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const 'test_symbol'
|
|
[1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = Reserved
|
|
[3] = ObjectRef const '_private_symbol'
|
|
}
|
|
|
|
|
|
Function 'test_type_literal', static, reflectable, debuggable
|
|
type-params <dart:core::Object T>
|
|
parameters [] (required: 0)
|
|
return-type void
|
|
|
|
|
|
Bytecode {
|
|
Entry 1
|
|
CheckStack 0
|
|
CheckFunctionTypeArgs 1, r0
|
|
PushConstant CP#0
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushNull
|
|
Push r0
|
|
InstantiateType CP#3
|
|
DirectCall 1, CP#1
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Type dart:core::String
|
|
[1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
|
|
[2] = Reserved
|
|
[3] = Type #lib::test_type_literal::TypeParam/0
|
|
}
|
|
|
|
|
|
Function 'testGenericConstInstance', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::F < dart:core::Map < dart:core::int, dart:core::String >, dart:core::int, dart:core::String > {}
|
|
}
|
|
|
|
|
|
Function 'testGenericFunctionTypeLiteral', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Type FunctionType <dart:core::Object X> (null::TypeParam/0) -> null::TypeParam/0
|
|
}
|
|
|
|
|
|
Function 'testFieldWithDoubleLiteralInitializer', static, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dynamic
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
PushStatic CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = StaticField #lib::fieldWithDoubleLiteralInitializer (field)
|
|
}
|
|
|
|
|
|
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 {
|
|
|
|
typedef GenericFunctionType = <X extends dart.core::Object = dynamic>(X) → X;
|
|
[@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
Field 'index', type = dart:core::int, getter = 'get:index', reflectable, final
|
|
value = null
|
|
|
|
Field '_name', type = dart:core::String, getter = 'get:_name', reflectable, final
|
|
value = null
|
|
|
|
Field 'values', type = dart:core::List < #lib::A >, getter = 'get:values', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const <#lib::A> [const #lib::A {#lib::A::index (field): const 0, #lib::A::_name (field): 'A.elem1'}, const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}, const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}, const #lib::A {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}]
|
|
}
|
|
|
|
|
|
Field 'elem1', type = #lib::A, getter = 'get:elem1', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::A {#lib::A::index (field): const 0, #lib::A::_name (field): 'A.elem1'}
|
|
}
|
|
|
|
|
|
Field 'elem2', type = #lib::A, getter = 'get:elem2', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::A {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}
|
|
}
|
|
|
|
|
|
Field 'elem3', type = #lib::A, getter = 'get:elem3', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::A {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
|
|
}
|
|
|
|
|
|
Field 'elem4', type = #lib::A, getter = 'get:elem4', reflectable, static, const, final
|
|
initializer
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef const #lib::A {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}
|
|
}
|
|
|
|
|
|
Function '', constructor, const, reflectable, debuggable
|
|
parameters [dart:core::int 'index', dart:core::String '_name'] (required: 2)
|
|
return-type #lib::A
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-7]
|
|
Push FP[-6]
|
|
StoreFieldTOS CP#0
|
|
Push FP[-7]
|
|
Push FP[-5]
|
|
StoreFieldTOS CP#2
|
|
Push FP[-7]
|
|
DirectCall 1, CP#4
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InstanceField #lib::A::index (field)
|
|
[1] = Reserved
|
|
[2] = InstanceField #lib::A::_name (field)
|
|
[3] = Reserved
|
|
[4] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[5] = Reserved
|
|
}
|
|
|
|
|
|
Function 'toString', reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type dart:core::String
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall 1, CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall '#lib::A::get:_name', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
] class A extends dart.core::Object {
|
|
final field dart.core::int index;
|
|
final field dart.core::String _name;
|
|
static const field dart.core::List<#lib::A> values = const <#lib::A>[#lib::A::elem1, #lib::A::elem2, #lib::A::elem3, #lib::A::elem4];
|
|
static const field #lib::A elem1 = const #lib::A::•(0, "A.elem1");
|
|
static const field #lib::A elem2 = const #lib::A::•(1, "A.elem2");
|
|
static const field #lib::A elem3 = const #lib::A::•(2, "A.elem3");
|
|
static const field #lib::A elem4 = const #lib::A::•(3, "A.elem4");
|
|
const constructor •(dart.core::int index, dart.core::String _name) → #lib::A
|
|
: #lib::A::index = index, #lib::A::_name = _name, super dart.core::Object::•()
|
|
;
|
|
method toString() → dart.core::String
|
|
return this.{=#lib::A::_name};
|
|
}
|
|
[@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
Field 'i', type = dart:core::int, getter = 'get:i', reflectable, final
|
|
value = null
|
|
|
|
Function '', constructor, const, reflectable, debuggable
|
|
parameters [dart:core::int 'i'] (required: 1)
|
|
return-type #lib::B
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-6]
|
|
Push FP[-5]
|
|
StoreFieldTOS CP#0
|
|
Push FP[-6]
|
|
DirectCall 1, CP#2
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InstanceField #lib::B::i (field)
|
|
[1] = Reserved
|
|
[2] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
] class B extends dart.core::Object {
|
|
final field dart.core::int i;
|
|
const constructor •(dart.core::int i) → #lib::B
|
|
: #lib::B::i = i, super dart.core::Object::•()
|
|
;
|
|
}
|
|
[@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
Field 'j', type = dart:core::int, getter = 'get:j', reflectable, final
|
|
value = null
|
|
|
|
Function '', constructor, const, reflectable, debuggable
|
|
parameters [dart:core::int 'a', dart:core::int 'b', dart:core::int 'c'] (required: 3)
|
|
return-type #lib::C
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-8]
|
|
Push FP[-7]
|
|
Push FP[-6]
|
|
AddInt
|
|
StoreFieldTOS CP#0
|
|
Push FP[-8]
|
|
Push FP[-5]
|
|
PushInt 5
|
|
MulInt
|
|
DirectCall 2, CP#2
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = InstanceField #lib::C::j (field)
|
|
[1] = Reserved
|
|
[2] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
|
|
[3] = Reserved
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
] class C extends #lib::B {
|
|
final field dart.core::int j;
|
|
const constructor •(dart.core::int a, dart.core::int b, dart.core::int c) → #lib::C
|
|
: #lib::C::j = a.{dart.core::num::+}(b), super #lib::B::•(c.{dart.core::num::*}(5))
|
|
;
|
|
}
|
|
[@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
Field 'x', type = dynamic, getter = 'get:x', reflectable, final
|
|
value = null
|
|
|
|
Field 'y', type = dynamic, getter = 'get:y', reflectable, final
|
|
value = null
|
|
|
|
Function '', constructor, const, has-optional-positional-params, reflectable, debuggable
|
|
parameters [dynamic 'x', dynamic 'y'] (required: 1)
|
|
return-type #lib::D
|
|
|
|
|
|
Bytecode {
|
|
EntryOptional 2, 1, 0
|
|
LoadConstant r2, CP#0
|
|
Frame 0
|
|
CheckStack 0
|
|
Push r0
|
|
Push r1
|
|
StoreFieldTOS CP#1
|
|
Push r0
|
|
Push r2
|
|
StoreFieldTOS CP#3
|
|
Push r0
|
|
DirectCall 1, CP#5
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = ObjectRef null
|
|
[1] = InstanceField #lib::D::x (field)
|
|
[2] = Reserved
|
|
[3] = InstanceField #lib::D::y (field)
|
|
[4] = Reserved
|
|
[5] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[6] = Reserved
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
] class D extends dart.core::Object {
|
|
final field dynamic x;
|
|
final field dynamic y;
|
|
const constructor •(dynamic x, [dynamic y = null]) → #lib::D
|
|
: #lib::D::x = x, #lib::D::y = y, super dart.core::Object::•()
|
|
;
|
|
}
|
|
[@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
|
|
Function '', constructor, const, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type #lib::E < #lib::E::TypeParam/0 >
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
] class E<T extends dart.core::Object = dynamic> extends dart.core::Object {
|
|
const constructor •() → #lib::E<#lib::E::T>
|
|
: super dart.core::Object::•()
|
|
;
|
|
}
|
|
[@vm.bytecode=
|
|
MembersBytecodeMetadata {
|
|
|
|
Members {
|
|
|
|
Function '', constructor, const, reflectable, debuggable
|
|
parameters [] (required: 0)
|
|
return-type #lib::F < dart:core::Map < #lib::F::TypeParam/0, #lib::F::TypeParam/1 >, #lib::F::TypeParam/0, #lib::F::TypeParam/1 >
|
|
|
|
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
Push FP[-5]
|
|
DirectCall 1, CP#0
|
|
Drop1
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = DirectCall '#lib::E:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
|
|
[1] = Reserved
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
] class F<P extends dart.core::Object = dynamic, Q extends dart.core::Object = dynamic> extends #lib::E<dart.core::Map<#lib::F::P, #lib::F::Q>> {
|
|
const constructor •() → #lib::F<#lib::F::P, #lib::F::Q>
|
|
: super #lib::E::•()
|
|
;
|
|
}
|
|
static const field #lib::A c1 = #lib::A::elem3;
|
|
static const field dart.core::String c2 = "hello!";
|
|
static const field dart.core::int c3 = #lib::c2.{dart.core::String::length};
|
|
static const field #lib::C c4 = const #lib::C::•(1, 2, 3);
|
|
static const field #lib::D c5 = const #lib::D::•(const #lib::B::•(4));
|
|
static field dart.core::double fieldWithDoubleLiteralInitializer = 1.0;
|
|
static method test_constants1() → void {
|
|
dart.core::print(#lib::c1);
|
|
dart.core::print(#lib::c2);
|
|
dart.core::print(#lib::c3);
|
|
dart.core::print(#lib::c4);
|
|
dart.core::print(#lib::c5);
|
|
}
|
|
static method test_constants2() → void {
|
|
dart.core::print(42);
|
|
dart.core::print("foo");
|
|
dart.core::print(#lib::A::elem2);
|
|
dart.core::print(const <dart.core::Object>[42, "foo", dart.core::int]);
|
|
dart.core::print(const <dart.core::String, #lib::A>{"E2": #lib::A::elem2, "E4": #lib::A::elem4});
|
|
dart.core::print(const #lib::D::•(const #lib::C::•(4, 5, 6), const <dart.core::String, dart.core::Object>{"foo": 42, "bar": const #lib::B::•(#lib::c2.{dart.core::String::length})}));
|
|
}
|
|
static method test_list_literal(dart.core::int a) → void {
|
|
dart.core::print(<dart.core::int>[1, a, 3]);
|
|
dart.core::print(<dart.core::String>["a", a.{dart.core::int::toString}(), "b"]);
|
|
}
|
|
static method test_map_literal<T extends dart.core::Object = dynamic>(dart.core::int a, dart.core::int b, #lib::test_map_literal::T c) → void {
|
|
dart.core::print(<dart.core::int, dart.core::int>{1: a, b: 2});
|
|
dart.core::print(<dart.core::String, dart.core::int>{"foo": a, b.{dart.core::int::toString}(): 3});
|
|
dart.core::print(<dart.core::String, #lib::test_map_literal::T>{});
|
|
dart.core::print(<#lib::test_map_literal::T, dart.core::int>{c: 4});
|
|
}
|
|
static method test_symbol() → void {
|
|
dart.core::print(#test_symbol);
|
|
dart.core::print(#_private_symbol);
|
|
}
|
|
static method test_type_literal<T extends dart.core::Object = dynamic>() → void {
|
|
dart.core::print(dart.core::String);
|
|
dart.core::print(#lib::test_type_literal::T);
|
|
}
|
|
static method testGenericConstInstance() → dynamic
|
|
return const #lib::F::•<dart.core::int, dart.core::String>();
|
|
static method testGenericFunctionTypeLiteral() → dynamic
|
|
return <X extends dart.core::Object = dynamic>(X) → X;
|
|
static method testFieldWithDoubleLiteralInitializer() → dynamic
|
|
return #lib::fieldWithDoubleLiteralInitializer;
|
|
static method main() → dynamic {}
|
|
}
|