Files
sdk/pkg/vm/testcases/bytecode/literals.dart.expect
T
Alexander Markov 61f0f5bc43 [vm/bytecode] Declare members in bytecode
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>
2019-03-26 21:40:10 +00:00

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 {}
}