336969538c
* Type arguments are moved to global object table (and de-duplicated). * Finalize non-recursive generic types at bytecode generation time. * Constants are moved to global object table (and de-duplicated). * ICData creation is avoided for direct calls. * Interface calls reference target member instead of selector name. Size of a dilp files: 17868K => 15896K (-11%). Change-Id: I0c9bf338137a0fae6ed90ab6b125ed2b24a1a8ad Reviewed-on: https://dart-review.googlesource.com/c/91108 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Zach Anderson <zra@google.com> Reviewed-by: Régis Crelier <regis@google.com>
622 lines
18 KiB
Plaintext
622 lines
18 KiB
Plaintext
library #lib;
|
|
import self as self;
|
|
import "dart:core" as core;
|
|
|
|
typedef GenericFunctionType = <X extends core::Object = dynamic>(X) → X;
|
|
class A extends core::Object {
|
|
final field core::int index;
|
|
final field core::String _name;
|
|
[@vm.bytecode=
|
|
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'}]
|
|
}
|
|
] static const field core::List<self::A> values = const <self::A>[self::A::elem1, self::A::elem2, self::A::elem3, self::A::elem4];
|
|
[@vm.bytecode=
|
|
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'}
|
|
}
|
|
] static const field self::A elem1 = const self::A::•(0, "A.elem1");
|
|
[@vm.bytecode=
|
|
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'}
|
|
}
|
|
] static const field self::A elem2 = const self::A::•(1, "A.elem2");
|
|
[@vm.bytecode=
|
|
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'}
|
|
}
|
|
] static const field self::A elem3 = const self::A::•(2, "A.elem3");
|
|
[@vm.bytecode=
|
|
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'}
|
|
}
|
|
] static const field self::A elem4 = const self::A::•(3, "A.elem4");
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
] const constructor •(core::int index, core::String _name) → self::A
|
|
: self::A::index = index, self::A::_name = _name, super core::Object::•()
|
|
;
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
] method toString() → core::String
|
|
return this.{=self::A::_name};
|
|
}
|
|
class B extends core::Object {
|
|
final field core::int i;
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
] const constructor •(core::int i) → self::B
|
|
: self::B::i = i, super core::Object::•()
|
|
;
|
|
}
|
|
class C extends self::B {
|
|
final field core::int j;
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
] const constructor •(core::int a, core::int b, core::int c) → self::C
|
|
: self::C::j = a.{core::num::+}(b), super self::B::•(c.{core::num::*}(5))
|
|
;
|
|
}
|
|
class D extends core::Object {
|
|
final field dynamic x;
|
|
final field dynamic y;
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
] const constructor •(dynamic x, [dynamic y = null]) → self::D
|
|
: self::D::x = x, self::D::y = y, super core::Object::•()
|
|
;
|
|
}
|
|
class E<T extends core::Object = dynamic> extends core::Object {
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
] const constructor •() → self::E<self::E::T>
|
|
: super core::Object::•()
|
|
;
|
|
}
|
|
class F<P extends core::Object = dynamic, Q extends core::Object = dynamic> extends self::E<core::Map<self::F::P, self::F::Q>> {
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
] const constructor •() → self::F<self::F::P, self::F::Q>
|
|
: super self::E::•()
|
|
;
|
|
}
|
|
[@vm.bytecode=
|
|
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'}
|
|
}
|
|
]static const field self::A c1 = self::A::elem3;
|
|
static const field core::String c2 = "hello!";
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushInt 6
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
}
|
|
]static const field core::int c3 = self::c2.{core::String::length};
|
|
[@vm.bytecode=
|
|
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}
|
|
}
|
|
]static const field self::C c4 = const self::C::•(1, 2, 3);
|
|
[@vm.bytecode=
|
|
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}
|
|
}
|
|
]static const field self::D c5 = const self::D::•(const self::B::•(4));
|
|
static field core::double fieldWithDoubleLiteralInitializer = 1.0;
|
|
[@vm.bytecode=
|
|
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}
|
|
}
|
|
]static method test_constants1() → void {
|
|
core::print(self::c1);
|
|
core::print(self::c2);
|
|
core::print(self::c3);
|
|
core::print(self::c4);
|
|
core::print(self::c5);
|
|
}
|
|
[@vm.bytecode=
|
|
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}]}}
|
|
}
|
|
]static method test_constants2() → void {
|
|
core::print(42);
|
|
core::print("foo");
|
|
core::print(self::A::elem2);
|
|
core::print(const <core::Object>[42, "foo", core::int]);
|
|
core::print(const <core::String, self::A>{"E2": self::A::elem2, "E4": self::A::elem4});
|
|
core::print(const self::D::•(const self::C::•(4, 5, 6), const <core::String, core::Object>{"foo": 42, "bar": const self::B::•(self::c2.{core::String::length})}));
|
|
}
|
|
[@vm.bytecode=
|
|
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'
|
|
}
|
|
]static method test_list_literal(core::int a) → void {
|
|
core::print(<core::int>[1, a, 3]);
|
|
core::print(<core::String>["a", a.{core::int::toString}(), "b"]);
|
|
}
|
|
[@vm.bytecode=
|
|
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 >
|
|
}
|
|
]static method test_map_literal<T extends core::Object = dynamic>(core::int a, core::int b, self::test_map_literal::T c) → void {
|
|
core::print(<core::int, core::int>{1: a, b: 2});
|
|
core::print(<core::String, core::int>{"foo": a, b.{core::int::toString}(): 3});
|
|
core::print(<core::String, self::test_map_literal::T>{});
|
|
core::print(<self::test_map_literal::T, core::int>{c: 4});
|
|
}
|
|
[@vm.bytecode=
|
|
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'
|
|
}
|
|
]static method test_symbol() → void {
|
|
core::print(#test_symbol);
|
|
core::print(#_private_symbol);
|
|
}
|
|
[@vm.bytecode=
|
|
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
|
|
}
|
|
]static method test_type_literal<T extends core::Object = dynamic>() → void {
|
|
core::print(core::String);
|
|
core::print(self::test_type_literal::T);
|
|
}
|
|
[@vm.bytecode=
|
|
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 > {}
|
|
}
|
|
]static method testGenericConstInstance() → dynamic
|
|
return const self::F::•<core::int, core::String>();
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = Type FunctionType <dart:core::Object X> (null::TypeParam/0) -> null::TypeParam/0
|
|
}
|
|
]static method testGenericFunctionTypeLiteral() → dynamic
|
|
return <X extends core::Object = dynamic>(X) → X;
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushConstant CP#0
|
|
PushStatic CP#0
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
[0] = StaticField #lib::fieldWithDoubleLiteralInitializer (field)
|
|
}
|
|
]static method testFieldWithDoubleLiteralInitializer() → dynamic
|
|
return self::fieldWithDoubleLiteralInitializer;
|
|
[@vm.bytecode=
|
|
Bytecode {
|
|
Entry 0
|
|
CheckStack 0
|
|
PushNull
|
|
ReturnTOS
|
|
}
|
|
ConstantPool {
|
|
}
|
|
]static method main() → dynamic {}
|