Index: test/cctest/test-api.cc |
=================================================================== |
--- test/cctest/test-api.cc (revision 3353) |
+++ test/cctest/test-api.cc (working copy) |
@@ -8049,6 +8049,66 @@ |
result = CompileRun("ext_array[1] = 23;"); |
CHECK_EQ(23, result->Int32Value()); |
+ // Test more complex manipulations which cause eax to contain values |
+ // that won't be completely overwritten by loads from the arrays. |
+ // This catches bugs in the instructions used for the KeyedLoadIC |
+ // for byte and word types. |
+ { |
+ const int kXSize = 300; |
+ const int kYSize = 300; |
+ const int kLargeElementCount = kXSize * kYSize * 4; |
+ ElementType* large_array_data = |
+ static_cast<ElementType*>(malloc(kLargeElementCount * element_size)); |
+ i::Handle<ExternalArrayClass> large_array = |
+ i::Handle<ExternalArrayClass>::cast( |
+ i::Factory::NewExternalArray(kElementCount, array_type, array_data)); |
+ v8::Handle<v8::Object> large_obj = v8::Object::New(); |
+ // Set the elements to be the external array. |
+ large_obj->SetIndexedPropertiesToExternalArrayData(large_array_data, |
+ array_type, |
+ kLargeElementCount); |
+ context->Global()->Set(v8_str("large_array"), large_obj); |
+ result = CompileRun("for (var y = 0; y < 300; y++) {" |
+ " for (var x = 0; x < 300; x++) {" |
+ " large_array[4 * 300 * y + 4 * x + 0] = 127;" |
+ " large_array[4 * 300 * y + 4 * x + 1] = 0;" |
+ " large_array[4 * 300 * y + 4 * x + 2] = 0;" |
+ " large_array[4 * 300 * y + 4 * x + 3] = 127;" |
+ " }" |
+ "}" |
+ "var failed = false;" |
+ "var offset = 0;" |
+ "for (var i = 0; i < 300; i++) {" |
+ " if (large_array[4 * i] != 127 ||" |
+ " large_array[4 * i + 1] != 0 ||" |
+ " large_array[4 * i + 2] != 0 ||" |
+ " large_array[4 * i + 3] != 127) {" |
+ " failed = true;" |
+ " }" |
+ "}" |
+ "offset = 150 * 300 * 4;" |
+ "for (var i = 0; i < 300; i++) {" |
+ " if (large_array[offset + 4 * i] != 127 ||" |
+ " large_array[offset + 4 * i + 1] != 0 ||" |
+ " large_array[offset + 4 * i + 2] != 0 ||" |
+ " large_array[offset + 4 * i + 3] != 127) {" |
+ " failed = true;" |
+ " }" |
+ "}" |
+ "offset = 298 * 300 * 4;" |
+ "for (var i = 0; i < 300; i++) {" |
+ " if (large_array[offset + 4 * i] != 127 ||" |
+ " large_array[offset + 4 * i + 1] != 0 ||" |
+ " large_array[offset + 4 * i + 2] != 0 ||" |
+ " large_array[offset + 4 * i + 3] != 127) {" |
+ " failed = true;" |
+ " }" |
+ "}" |
+ "!failed;"); |
+ CHECK_EQ(true, result->BooleanValue()); |
+ free(large_array_data); |
+ } |
+ |
free(array_data); |
} |