Skip to content

Commit 9d1a307

Browse files
alexmarkovcommit-bot@chromium.org
authored andcommitted
[vm] Add specialized factory constructors for small list literals
Flutter gallery in release mode: AOT snapshot size arm64 -0.22%, arm -0.21% instructions size arm64 -0.46%, arm -0.4% TEST=existing tests Fixes #44391 Change-Id: I4733e91ecf4601c0bcde725cf9e97f5db0b8bc13 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/175821 Commit-Queue: Alexander Markov <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Vyacheslav Egorov <[email protected]>
1 parent 1941ee0 commit 9d1a307

File tree

293 files changed

+1555
-1370
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

293 files changed

+1555
-1370
lines changed

pkg/front_end/lib/src/fasta/source/source_loader.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1464,10 +1464,18 @@ class List<E> extends Iterable<E> {
14641464
}
14651465
14661466
class _GrowableList<E> {
1467-
factory _GrowableList() => null;
1467+
factory _GrowableList(int length) => null;
14681468
factory _GrowableList.empty() => null;
14691469
factory _GrowableList.filled() => null;
14701470
factory _GrowableList.generate(int length, E generator(int index)) => null;
1471+
factory _GrowableList._literal1(E e0) => null;
1472+
factory _GrowableList._literal2(E e0, E e1) => null;
1473+
factory _GrowableList._literal3(E e0, E e1, E e2) => null;
1474+
factory _GrowableList._literal4(E e0, E e1, E e2, E e3) => null;
1475+
factory _GrowableList._literal5(E e0, E e1, E e2, E e3, E e4) => null;
1476+
factory _GrowableList._literal6(E e0, E e1, E e2, E e3, E e4, E e5) => null;
1477+
factory _GrowableList._literal7(E e0, E e1, E e2, E e3, E e4, E e5, E e6) => null;
1478+
factory _GrowableList._literal8(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7) => null;
14711479
}
14721480
14731481
class _List<E> {

pkg/front_end/testcases/expression/class_static3.expression.yaml.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Errors: {
44
^^^^^^^^^
55
}
66
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
7-
return #lib1::globalVar.{dart.core::num::+}(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:13: Error: Getter not found: 'staticVar'.\nglobalVar + staticVar + 5\n ^^^^^^^^^" as{TypeError,ForDynamic} dart.core::num*).{dart.core::num::+}(5);
7+
return #lib1::globalVar.{dart.core::num::+}(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:13: Error: Getter not found: 'staticVar'.\nglobalVar + staticVar + 5\n ^^^^^^^^^").{dart.core::num::+}(5);
88
Errors: {
99
}
1010
static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
Errors: {
22
}
33
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic s) → dynamic
4-
return this.{main::D::m}(this.{main::D::id}<dart.core::List<main::D::T*>*>((s = <dynamic>[]) as{TypeError} dart.core::List<main::D::T*>*));
4+
return this.{main::D::m}(this.{main::D::id}<dart.core::List<main::D::T*>*>((s = dart.core::_GrowableList::•<dynamic>(0)) as{TypeError} dart.core::List<main::D::T*>*));

pkg/front_end/testcases/expression/set_literal.expression.yaml.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ Errors: {
22
}
33
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
44
return block {
5-
final dart.core::Set<dart.core::String*>* #t1 = dart.collection::LinkedHashSet::•<dart.core::String*>();
5+
final dart.core::Set<dart.core::String*>* #t1 = new dart.collection::_CompactLinkedHashSet::•<dart.core::String*>();
66
#t1.{dart.core::Set::add}{Invariant}("a");
77
} =>#t1;

pkg/front_end/testcases/extensions/issue38755.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ extension A<T extends core::Object* = dynamic> on core::List<T*>* {
66
method myMap = self::A|myMap;
77
tearoff myMap = self::A|get#myMap;
88
}
9-
static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(<core::String*>["a", "b", "c"], (core::String* it) → core::String* => it);
9+
static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(core::_GrowableList::_literal3<core::String*>("a", "b", "c"), (core::String* it) → core::String* => it);
1010
static method A|myMap<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final core::List<self::A|myMap::T*>* #this, (self::A|myMap::T*) →* self::A|myMap::R* block) → core::List<self::A|myMap::R*>* {
1111
return #this.{core::Iterable::map}<self::A|myMap::R*>(block).{core::Iterable::toList}();
1212
}

pkg/front_end/testcases/general/DeltaBlue.dart.strong.transformed.expect

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ class EqualityConstraint extends self::BinaryConstraint {
265265
}
266266
}
267267
class Variable extends core::Object {
268-
field core::List<self::Constraint*>* constraints = <self::Constraint*>[];
268+
field core::List<self::Constraint*>* constraints = core::_GrowableList::•<self::Constraint*>(0);
269269
field self::Constraint* determinedBy = null;
270270
field core::int* mark = 0;
271271
field self::Strength* walkStrength = #C18;
@@ -337,7 +337,7 @@ class Planner extends core::Object {
337337
return plan;
338338
}
339339
method extractPlanFromConstraints(core::List<self::Constraint*>* constraints) → self::Plan* {
340-
core::List<self::Constraint*>* sources = <self::Constraint*>[];
340+
core::List<self::Constraint*>* sources = core::_GrowableList::•<self::Constraint*>(0);
341341
for (core::int* i = 0; i.{core::num::<}(constraints.{core::List::length}); i = i.{core::num::+}(1)) {
342342
self::Constraint* c = constraints.{core::List::[]}(i);
343343
if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
@@ -346,7 +346,7 @@ class Planner extends core::Object {
346346
return this.{self::Planner::makePlan}(sources);
347347
}
348348
method addPropagate(self::Constraint* c, core::int* mark) → core::bool* {
349-
core::List<self::Constraint*>* todo = <self::Constraint*>[c];
349+
core::List<self::Constraint*>* todo = core::_GrowableList::_literal1<self::Constraint*>(c);
350350
while (todo.{core::List::length}.{core::num::>}(0)) {
351351
self::Constraint* d = todo.{core::List::removeLast}();
352352
if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
@@ -362,8 +362,8 @@ class Planner extends core::Object {
362362
out.{self::Variable::determinedBy} = null;
363363
out.{self::Variable::walkStrength} = #C18;
364364
out.{self::Variable::stay} = true;
365-
core::List<self::Constraint*>* unsatisfied = <self::Constraint*>[];
366-
core::List<self::Variable*>* todo = <self::Variable*>[out];
365+
core::List<self::Constraint*>* unsatisfied = core::_GrowableList::•<self::Constraint*>(0);
366+
core::List<self::Variable*>* todo = core::_GrowableList::_literal1<self::Variable*>(out);
367367
while (todo.{core::List::length}.{core::num::>}(0)) {
368368
self::Variable* v = todo.{core::List::removeLast}();
369369
for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
@@ -402,7 +402,7 @@ class Planner extends core::Object {
402402
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
403403
}
404404
class Plan extends core::Object {
405-
field core::List<self::Constraint*>* list = <self::Constraint*>[];
405+
field core::List<self::Constraint*>* list = core::_GrowableList::•<self::Constraint*>(0);
406406
synthetic constructor •() → self::Plan*
407407
: super core::Object::•()
408408
;
@@ -458,7 +458,7 @@ static method chainTest(core::int* n) → void {
458458
}
459459
new self::StayConstraint::•(last, #C9);
460460
self::EditConstraint* edit = new self::EditConstraint::•(first, #C6);
461-
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint*>[edit]);
461+
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(core::_GrowableList::_literal1<self::Constraint*>(edit));
462462
for (core::int* i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
463463
first.{self::Variable::value} = i;
464464
plan.{self::Plan::execute}();
@@ -474,7 +474,7 @@ static method projectionTest(core::int* n) → void {
474474
self::Variable* offset = new self::Variable::•("offset", 1000);
475475
self::Variable* src = null;
476476
self::Variable* dst = null;
477-
core::List<self::Variable*>* dests = <self::Variable*>[];
477+
core::List<self::Variable*>* dests = core::_GrowableList::•<self::Variable*>(0);
478478
for (core::int* i = 0; i.{core::num::<}(n); i = i.{core::num::+}(1)) {
479479
src = new self::Variable::•("src", i);
480480
dst = new self::Variable::•("dst", i);
@@ -501,7 +501,7 @@ static method projectionTest(core::int* n) → void {
501501
}
502502
static method change(self::Variable* v, core::int* newValue) → void {
503503
self::EditConstraint* edit = new self::EditConstraint::•(v, #C6);
504-
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint*>[edit]);
504+
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(core::_GrowableList::_literal1<self::EditConstraint*>(edit));
505505
for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
506506
v.{self::Variable::value} = newValue;
507507
plan.{self::Plan::execute}();

pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ static method loop(core::List<dynamic>* xs) → void {
1414
static method main() → dynamic {
1515
self::foo(4, 5);
1616
self::foo(6, 7);
17-
self::loop(<dynamic>["dfg"]);
17+
self::loop(core::_GrowableList::_literal1<dynamic>("dfg"));
1818
}

pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import "dart:_internal" as _in;
66

77
import "dart:async";
88

9-
static field core::List<core::String*>* stringList = <core::String*>["bar"];
9+
static field core::List<core::String*>* stringList = core::_GrowableList::_literal1<core::String*>("bar");
1010
static method asyncString() → asy::Future<core::String*>* /* originally async */ {
1111
final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
1212
core::bool* :is_sync = false;

pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,18 @@ static method main() → void /* originally async */ {
4444
#L1:
4545
{
4646
core::String* expected = "1 2 3 4 5 6 7 8 9 10";
47-
:async_temporary_2 = new self::Node::•("2", <self::Node*>[]);
48-
[yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("7", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
49-
[yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("6", <self::Node*>[_in::unsafeCast<self::Node*>(:result)])), :async_op_then, :async_op_error, :async_op) in null;
47+
:async_temporary_2 = new self::Node::•("2", core::_GrowableList::•<self::Node*>(0));
48+
[yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("7", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
49+
[yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("6", core::_GrowableList::_literal1<self::Node*>(_in::unsafeCast<self::Node*>(:result)))), :async_op_then, :async_op_error, :async_op) in null;
5050
:async_temporary_1 = _in::unsafeCast<self::Node*>(:result);
51-
[yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
51+
[yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
5252
:async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
53-
[yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
54-
[yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_1), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
55-
[yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", <self::Node*>[_in::unsafeCast<self::Node*>(:result)])), :async_op_then, :async_op_error, :async_op) in null;
53+
[yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
54+
[yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", core::_GrowableList::_literal1<self::Node*>(new self::Node::•("5", core::_GrowableList::_literal3<self::Node*>(_in::unsafeCast<self::Node*>(:async_temporary_1), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)))))), :async_op_then, :async_op_error, :async_op) in null;
55+
[yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", core::_GrowableList::_literal1<self::Node*>(_in::unsafeCast<self::Node*>(:result)))), :async_op_then, :async_op_error, :async_op) in null;
5656
:async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
57-
[yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
58-
self::Node* node = new self::Node::•("1", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_2), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)]);
57+
[yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
58+
self::Node* node = new self::Node::•("1", core::_GrowableList::_literal3<self::Node*>(_in::unsafeCast<self::Node*>(:async_temporary_2), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)));
5959
core::String* actual = node.{self::Node::toSimpleString}() as{TypeError,ForDynamic} core::String*;
6060
core::print(actual);
6161
if(!actual.{core::String::==}(expected)) {

pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ static method others() → dynamic /* originally async */ {
244244
[yield] let dynamic #t19 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
245245
core::num* d = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
246246
core::int* cnt = 2;
247-
core::List<core::int*>* b = <core::int*>[1, 2, 3];
247+
core::List<core::int*>* b = core::_GrowableList::_literal3<core::int*>(1, 2, 3);
248248
:async_temporary_3 = b;
249249
:async_temporary_2 = cnt;
250250
[yield] let dynamic #t20 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
@@ -354,7 +354,7 @@ static method asserts() → dynamic /* originally async */ {
354354
#L6:
355355
{
356356
{
357-
core::Iterator<core::Function*>* :sync-for-iterator = <core::Function*>[#C1, #C2].{core::Iterable::iterator};
357+
core::Iterator<core::Function*>* :sync-for-iterator = core::_GrowableList::_literal2<core::Function*>(#C1, #C2).{core::Iterable::iterator};
358358
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
359359
final core::Function* #t26 = :sync-for-iterator.{core::Iterator::current};
360360
{
@@ -433,7 +433,7 @@ static method controlFlow() → dynamic /* originally async */ {
433433
#L7:
434434
{
435435
{
436-
core::Iterator<core::Function*>* :sync-for-iterator = <core::Function*>[#C1, #C2].{core::Iterable::iterator};
436+
core::Iterator<core::Function*>* :sync-for-iterator = core::_GrowableList::_literal2<core::Function*>(#C1, #C2).{core::Iterable::iterator};
437437
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
438438
final core::Function* #t33 = :sync-for-iterator.{core::Iterator::current};
439439
{
@@ -637,7 +637,7 @@ static method controlFlow() → dynamic /* originally async */ {
637637
:controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
638638
return :controller_stream;
639639
}
640-
:async_temporary_0 = <dynamic>[42];
640+
:async_temporary_0 = core::_GrowableList::_literal1<dynamic>(42);
641641
[yield] let dynamic #t55 = asy::_awaitHelper(testStream1.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
642642
self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_0), _in::unsafeCast<core::List<core::int*>>(:result));
643643
function testStream2() → asy::Stream<core::int*>* /* originally async* */ {
@@ -674,7 +674,7 @@ static method controlFlow() → dynamic /* originally async */ {
674674
:controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
675675
return :controller_stream;
676676
}
677-
:async_temporary_1 = <dynamic>[42];
677+
:async_temporary_1 = core::_GrowableList::_literal1<dynamic>(42);
678678
[yield] let dynamic #t57 = asy::_awaitHelper(testStream2.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
679679
self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_1), _in::unsafeCast<core::List<core::int*>>(:result));
680680
}

pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class C extends core::Object {
2323
try {
2424
#L1:
2525
{
26-
final core::List<core::int*>* #t1 = <core::int*>[];
26+
final core::List<core::int*>* #t1 = core::_GrowableList::•<core::int*>(0);
2727
[yield] let dynamic #t2 = asy::_awaitHelper(this.{self::C::_m}(), :async_op_then, :async_op_error, :async_op) in null;
2828
#t1.{core::List::add}(_in::unsafeCast<core::int*>(:result));
2929
:return_value = block {} =>#t1;

pkg/front_end/testcases/general/bug32414b.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import self as self;
33
import "dart:core" as core;
44

55
static method test() → void {
6-
core::List<dynamic>* l = <dynamic>[1, "hello"];
6+
core::List<dynamic>* l = core::_GrowableList::_literal2<dynamic>(1, "hello");
77
core::List<core::String*>* l2 = l.{core::Iterable::map}<core::String*>((dynamic element) → core::String* => element.{core::Object::toString}()).{core::Iterable::toList}();
88
}
99
static method main() → void {}

pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static method f1() → asy::Future<core::List<core::Object*>*>* /* originally as
5252
try {
5353
#L1:
5454
{
55-
:return_value = <core::Object*>[1];
55+
:return_value = core::_GrowableList::_literal1<core::Object*>(1);
5656
break #L1;
5757
}
5858
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
@@ -68,7 +68,7 @@ static method f1() → asy::Future<core::List<core::Object*>*>* /* originally as
6868
return :async_future;
6969
}
7070
static method f2() → core::List<core::Object*>*
71-
return <core::Object*>[2];
71+
return core::_GrowableList::_literal1<core::Object*>(2);
7272
static method f3() → asy::Future<core::Object*>* /* originally async */ {
7373
final asy::_Future<core::Object*>* :async_future = new asy::_Future::•<core::Object*>();
7474
core::bool* :is_sync = false;

0 commit comments

Comments
 (0)