Skip to content

Commit 6db4bc2

Browse files
author
danno@chromium.org
committed
Force small array literals to have FAST_ELEMENTs
R=verwaest@chromium.org Review URL: https://codereview.chromium.org/11414139 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13042 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
1 parent bebf377 commit 6db4bc2

2 files changed

Lines changed: 15 additions & 6 deletions

File tree

src/parser.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3718,6 +3718,7 @@ Expression* Parser::ParseArrayLiteral(bool* ok) {
37183718
isolate()->factory()->NewFixedArray(values->length(), TENURED);
37193719
Handle<FixedDoubleArray> double_literals;
37203720
ElementsKind elements_kind = FAST_SMI_ELEMENTS;
3721+
bool has_only_undefined_values = true;
37213722
bool has_hole_values = false;
37223723

37233724
// Fill in the literals.
@@ -3749,6 +3750,7 @@ Expression* Parser::ParseArrayLiteral(bool* ok) {
37493750
// FAST_DOUBLE_ELEMENTS and FAST_ELEMENTS as necessary. Always remember
37503751
// the tagged value, no matter what the ElementsKind is in case we
37513752
// ultimately end up in FAST_ELEMENTS.
3753+
has_only_undefined_values = false;
37523754
object_literals->set(i, *boilerplate_value);
37533755
if (elements_kind == FAST_SMI_ELEMENTS) {
37543756
// Smi only elements. Notice if a transition to FAST_DOUBLE_ELEMENTS or
@@ -3787,6 +3789,13 @@ Expression* Parser::ParseArrayLiteral(bool* ok) {
37873789
}
37883790
}
37893791

3792+
// Very small array literals that don't have a concrete hint about their type
3793+
// from a constant value should default to the slow case to avoid lots of
3794+
// elements transitions on really small objects.
3795+
if (has_only_undefined_values && values->length() <= 2) {
3796+
elements_kind = FAST_ELEMENTS;
3797+
}
3798+
37903799
// Simple and shallow arrays can be lazily copied, we transform the
37913800
// elements array to a copy-on-write array.
37923801
if (is_simple && depth == 1 && values->length() > 0 &&

test/mjsunit/array-natives-elements.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ function get(foo) { return foo; } // Used to generate dynamic values.
4949
function array_natives_test() {
5050

5151
// Ensure small array literals start in specific element kind mode.
52-
assertTrue(%HasFastSmiElements([]));
52+
assertTrue(%HasFastObjectElements([]));
5353
assertTrue(%HasFastSmiElements([1]));
5454
assertTrue(%HasFastSmiElements([1,2]));
5555
assertTrue(%HasFastDoubleElements([1.1]));
@@ -73,7 +73,7 @@ function array_natives_test() {
7373
// Concat
7474
var a1;
7575
a1 = [1,2,3].concat([]);
76-
assertTrue(%HasFastSmiElements(a1));
76+
assertTrue(%HasFastObjectElements(a1));
7777
assertEquals([1,2,3], a1);
7878
a1 = [1,2,3].concat([4,5,6]);
7979
assertTrue(%HasFastSmiElements(a1));
@@ -82,7 +82,7 @@ function array_natives_test() {
8282
assertTrue(%HasFastSmiElements(a1));
8383
assertEquals([1,2,3,4,5,6,7,8,9], a1);
8484
a1 = [1.1,2,3].concat([]);
85-
assertTrue(%HasFastDoubleElements(a1));
85+
assertTrue(%HasFastObjectElements(a1));
8686
assertEquals([1.1,2,3], a1);
8787
a1 = [1,2,3].concat([1.1, 2]);
8888
assertTrue(%HasFastDoubleElements(a1));
@@ -173,7 +173,7 @@ function array_natives_test() {
173173
a3r = a3.splice(0, 0, 2);
174174
// Commented out since handled in js, which takes the best fit.
175175
// assertTrue(%HasFastDoubleElements(a3r));
176-
assertTrue(%HasFastSmiElements(a3r));
176+
assertTrue(%HasFastObjectElements(a3r));
177177
assertTrue(%HasFastDoubleElements(a3));
178178
assertEquals([], a3r);
179179
assertEquals([2, 1.1, 2, 3], a3);
@@ -187,7 +187,7 @@ function array_natives_test() {
187187
a3r = a3.splice(0, 0, 2.1);
188188
// Commented out since handled in js, which takes the best fit.
189189
// assertTrue(%HasFastDoubleElements(a3r));
190-
assertTrue(%HasFastSmiElements(a3r));
190+
assertTrue(%HasFastObjectElements(a3r));
191191
assertTrue(%HasFastDoubleElements(a3));
192192
assertEquals([], a3r);
193193
assertEquals([2.1, 1.1, 2, 3], a3);
@@ -201,7 +201,7 @@ function array_natives_test() {
201201
a3r = a3.splice(0, 0, 2.1);
202202
// Commented out since handled in js, which takes the best fit.
203203
// assertTrue(%HasFastDoubleElements(a3r));
204-
assertTrue(%HasFastSmiElements(a3r));
204+
assertTrue(%HasFastObjectElements(a3r));
205205
assertTrue(%HasFastDoubleElements(a3));
206206
assertEquals([], a3r);
207207
assertEquals([2.1, 1, 2, 3], a3);

0 commit comments

Comments
 (0)