Index: test/mjsunit/unbox-double-arrays.js |
diff --git a/test/mjsunit/unbox-double-arrays.js b/test/mjsunit/unbox-double-arrays.js |
index a603e00c05ddba73638cca4153036710f9215006..64f1cdc8abe1b70a19483b46ea9b1575e4f16196 100644 |
--- a/test/mjsunit/unbox-double-arrays.js |
+++ b/test/mjsunit/unbox-double-arrays.js |
@@ -28,7 +28,7 @@ |
// Test dictionary -> double elements -> dictionary elements round trip |
// Flags: --allow-natives-syntax --unbox-double-arrays --expose-gc |
-var large_array_size = 500000; |
+var large_array_size = 100000; |
var approx_dict_to_elements_threshold = 69000; |
var name = 0; |
@@ -42,6 +42,7 @@ function expected_array_value(i) { |
} |
function force_to_fast_double_array(a) { |
+ a[large_array_size - 1] = 1; |
for (var i= 0; i < approx_dict_to_elements_threshold; ++i ) { |
a[i] = expected_array_value(i); |
} |
@@ -52,8 +53,14 @@ function flush_compiled_code() { |
gc(); |
} |
+function make_object_like_array(size) { |
+ obj = new Object(); |
+ obj.length = size; |
+ return obj; |
+} |
+ |
function testOneArrayType(allocator) { |
- var large_array = new allocator(500000); |
+ var large_array = new allocator(large_array_size); |
force_to_fast_double_array(large_array); |
for (var i= 0; i < approx_dict_to_elements_threshold; i += 501 ) { |
@@ -67,7 +74,7 @@ function testOneArrayType(allocator) { |
assertEquals(value_5, a[5]); |
assertEquals(value_6, a[6]); |
assertEquals(value_7, a[7]); |
- assertEquals(undefined, a[large_array_size-1]); |
+ assertEquals(undefined, a[large_array_size-2]); |
assertEquals(undefined, a[-1]); |
assertEquals(large_array_size, a.length); |
assertTrue(%HasFastDoubleElements(a)); |
@@ -78,7 +85,7 @@ function testOneArrayType(allocator) { |
assertEquals(value_5, a[5]); |
assertEquals(value_6, a[6]); |
assertEquals(value_7, a[7]); |
- assertEquals(undefined, a[large_array_size-1]); |
+ assertEquals(undefined, a[large_array_size-2]); |
assertEquals(undefined, a[-1]); |
assertEquals(large_array_size, a.length); |
assertTrue(%HasFastDoubleElements(a)); |
@@ -89,7 +96,7 @@ function testOneArrayType(allocator) { |
assertEquals(value_5, a[5]); |
assertEquals(value_6, a[6]); |
assertEquals(value_7, a[7]); |
- assertEquals(undefined, a[large_array_size-1]); |
+ assertEquals(undefined, a[large_array_size-2]); |
assertEquals(undefined, a[-1]); |
assertEquals(large_array_size, a.length); |
assertTrue(%HasFastDoubleElements(a)); |
@@ -100,7 +107,7 @@ function testOneArrayType(allocator) { |
assertEquals(value_5, a[5]); |
assertEquals(value_6, a[6]); |
assertEquals(value_7, a[7]); |
- assertEquals(undefined, a[large_array_size-1]); |
+ assertEquals(undefined, a[large_array_size-2]); |
assertEquals(undefined, a[-1]); |
assertEquals(large_array_size, a.length); |
assertTrue(%HasFastDoubleElements(a)); |
@@ -111,7 +118,7 @@ function testOneArrayType(allocator) { |
assertEquals(value_5, a[5]); |
assertEquals(value_6, a[6]); |
assertEquals(value_7, a[7]); |
- assertEquals(undefined, a[large_array_size-1]); |
+ assertEquals(undefined, a[large_array_size-2]); |
assertEquals(undefined, a[-1]); |
assertEquals(large_array_size, a.length); |
assertTrue(%HasFastDoubleElements(a)); |
@@ -122,7 +129,7 @@ function testOneArrayType(allocator) { |
assertEquals(value_5, a[5]); |
assertEquals(value_6, a[6]); |
assertEquals(value_7, a[7]); |
- assertEquals(undefined, a[large_array_size-1]); |
+ assertEquals(undefined, a[large_array_size-2]); |
assertEquals(undefined, a[-1]); |
assertEquals(large_array_size, a.length); |
assertTrue(%HasFastDoubleElements(a)); |
@@ -317,39 +324,80 @@ function testOneArrayType(allocator) { |
-Infinity, |
expected_array_value(7)); |
+ // Test apply |
assertTrue(%GetOptimizationStatus(test_various_stores) != 2); |
- |
- // Make sure that we haven't converted from fast double. |
- assertTrue(%HasFastDoubleElements(large_array)); |
- // Cause the array to grow beyond it's JSArray length. This will double the |
- // size of the capacity and force the array into "slow" dictionary case. |
- large_array[large_array_size+1] = 50; |
- assertTrue(%HasDictionaryElements(large_array)); |
- assertEquals(50, large_array[large_array_size+1]); |
- assertEquals(large_array_size+2, large_array.length); |
- assertEquals(Infinity, large_array[5]); |
- assertEquals(undefined, large_array[large_array_size-1]); |
- assertEquals(undefined, large_array[-1]); |
- assertEquals(large_array_size+2, large_array.length); |
- |
- // Test dictionary -> double elements -> fast elements. |
- var large_array2 = new allocator(large_array_size); |
- force_to_fast_double_array(large_array2); |
- delete large_array2[5]; |
- |
- // Convert back to fast elements and make sure the contents of the array are |
- // unchanged. |
- large_array2[25] = new Object(); |
- assertTrue(%HasFastElements(large_array2)); |
- for (var i= 0; i < approx_dict_to_elements_threshold; i += 500 ) { |
- if (i != 25 && i != 5) { |
- assertEquals(expected_array_value(i), large_array2[i]); |
- } |
- } |
- assertEquals(undefined, large_array2[5]) |
- assertEquals(undefined, large_array2[large_array_size-1]) |
- assertEquals(undefined, large_array2[-1]) |
- assertEquals(large_array_size, large_array2.length); |
} |
+testOneArrayType(make_object_like_array); |
testOneArrayType(Array); |
+ |
+var large_array = new Array(large_array_size); |
+force_to_fast_double_array(large_array); |
+assertTrue(%HasFastDoubleElements(large_array)); |
+ |
+// Cause the array to grow beyond it's JSArray length. This will double the |
+// size of the capacity and force the array into "slow" dictionary case. |
+large_array[5] = Infinity; |
+large_array[large_array_size+10001] = 50; |
+assertTrue(%HasDictionaryElements(large_array)); |
+assertEquals(50, large_array[large_array_size+10001]); |
+assertEquals(large_array_size+10002, large_array.length); |
+assertEquals(Infinity, large_array[5]); |
+assertEquals(undefined, large_array[large_array_size-2]); |
+assertEquals(undefined, large_array[-1]); |
+assertEquals(large_array_size+10002, large_array.length); |
+ |
+// Test dictionary -> double elements -> fast elements. |
+var large_array2 = new Array(large_array_size); |
+force_to_fast_double_array(large_array2); |
+delete large_array2[5]; |
+ |
+// Convert back to fast elements and make sure the contents of the array are |
+// unchanged. |
+large_array2[25] = new Object(); |
+assertTrue(%HasFastElements(large_array2)); |
+for (var i= 0; i < approx_dict_to_elements_threshold; i += 500 ) { |
+ if (i != 25 && i != 5) { |
+ assertEquals(expected_array_value(i), large_array2[i]); |
+ } |
+} |
+assertEquals(undefined, large_array2[5]); |
+assertEquals(undefined, large_array2[large_array_size-2]); |
+assertEquals(undefined, large_array2[-1]); |
+assertEquals(large_array_size, large_array2.length); |
+ |
+// Make sure it's possible to change the array's length and that array is still |
+// intact after the resize. |
+var large_array3 = new Array(large_array_size); |
+force_to_fast_double_array(large_array3); |
+large_array3.length = 60000; |
+assertEquals(60000, large_array3.length); |
+assertEquals(undefined, large_array3[60000]); |
+assertTrue(%HasFastDoubleElements(large_array3)); |
+assertEquals(expected_array_value(5), large_array3[5]); |
+assertEquals(expected_array_value(6), large_array3[6]); |
+assertEquals(expected_array_value(7), large_array3[7]); |
Mads Ager (chromium)
2011/07/19 09:23:06
Test the element at "length - 1"?
danno
2011/07/19 15:47:19
Done.
|
+assertEquals(undefined, large_array3[large_array_size-2]); |
+assertEquals(undefined, large_array3[-1]); |
+ |
+large_array3.length = 25; |
+assertEquals(25, large_array3.length); |
+assertTrue(%HasFastDoubleElements(large_array3)); |
+assertEquals(undefined, large_array3[25]); |
+assertEquals(expected_array_value(5), large_array3[5]); |
+assertEquals(expected_array_value(6), large_array3[6]); |
+assertEquals(expected_array_value(7), large_array3[7]); |
+assertEquals(undefined, large_array3[large_array_size-2]); |
+assertEquals(undefined, large_array3[-1]); |
+ |
+large_array3.length = 100; |
+assertEquals(100, large_array3.length); |
+large_array3[95] = 95; |
+assertTrue(%HasFastDoubleElements(large_array3)); |
+assertEquals(undefined, large_array3[100]); |
+assertEquals(95, large_array3[95]); |
+assertEquals(expected_array_value(5), large_array3[5]); |
+assertEquals(expected_array_value(6), large_array3[6]); |
+assertEquals(expected_array_value(7), large_array3[7]); |
+assertEquals(undefined, large_array3[large_array_size-2]); |
+assertEquals(undefined, large_array3[-1]); |