Reviewers: Michael Starzinger,
Description:
Handle undefined stores to external float arrays uniformly.
[email protected]
Please review this at https://chromiumcodereview.appspot.com/9402008/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/objects.cc
M test/cctest/test-api.cc
M test/mjsunit/external-array.js
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
7bcccdf9fbf443424884f6f0b758c3e7a595c6a3..23f142e307ba0d87840e0888e25faf7d21da8029
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -11757,7 +11757,7 @@ MaybeObject*
ExternalUnsignedIntArray::SetValue(uint32_t index, Object* value) {
MaybeObject* ExternalFloatArray::SetValue(uint32_t index, Object* value) {
- float cast_value = 0;
+ float cast_value = OS::nan_value();
Heap* heap = GetHeap();
if (index < static_cast<uint32_t>(length())) {
if (value->IsSmi()) {
@@ -11778,7 +11778,7 @@ MaybeObject* ExternalFloatArray::SetValue(uint32_t
index, Object* value) {
MaybeObject* ExternalDoubleArray::SetValue(uint32_t index, Object* value) {
- double double_value = 0;
+ double double_value = OS::nan_value();
Heap* heap = GetHeap();
if (index < static_cast<uint32_t>(length())) {
if (value->IsSmi()) {
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index
87d54537560fdb061a59f68d3c386d98700d6f2c..ed5fbf1d3dd459f68ffe2fe5ffec86d00dae8201
100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -12903,7 +12903,8 @@ static void
ExternalArrayTestHelper(v8::ExternalArrayType array_type,
"ext_array[7];");
CHECK_EQ(0, result->Int32Value());
CHECK_EQ(
- 0,
static_cast<int>(jsobj->GetElement(7)->ToObjectChecked()->Number()));
+ (int)0x80000000,
+ static_cast<int>(jsobj->GetElement(7)->ToObjectChecked()->Number()));
result = CompileRun("for (var i = 0; i < 8; i++) {"
" ext_array[6] = '2.3';"
Index: test/mjsunit/external-array.js
diff --git a/test/mjsunit/external-array.js b/test/mjsunit/external-array.js
index
72cfd8595638dce1e9e8f090e322d82b4984934b..15ff8e7caa7669a3ea168681e8d027543c0cc080
100644
--- a/test/mjsunit/external-array.js
+++ b/test/mjsunit/external-array.js
@@ -317,3 +317,43 @@ for (var t = 0; t < types.length; t++) {
%DeoptimizeFunction(array_load_set_smi_check2);
gc(); // Makes V8 forget about type information for
array_load_set_smi_check.
}
+
+// Check handling of undefined in 32- and 64-bit external float arrays.
+
+function store_float32_undefined(ext_array) {
+ for (var i = 0; i < 8; i++) {
+ ext_array[7] = undefined;
+ }
+}
+
+var float32_array = new Float32Array(8);
+// Make sure runtime does it right
+store_float32_undefined(float32_array);
+assertTrue(isNaN(float32_array[7]));
+// Make sure the ICs do it right
+store_float32_undefined(float32_array);
+assertTrue(isNaN(float32_array[7]));
+// Make sure that Cranskshft does it right.
+%OptimizeFunctionOnNextCall(store_float32_undefined);
+store_float32_undefined(float32_array);
+store_float32_undefined(float32_array);
+assertTrue(isNaN(float32_array[7]));
+
+function store_float64_undefined(ext_array) {
+ for (var i = 0; i < 8; i++) {
+ ext_array[7] = undefined;
+ }
+}
+
+var float64_array = new Float64Array(8);
+// Make sure runtime does it right
+store_float64_undefined(float64_array);
+assertTrue(isNaN(float64_array[7]));
+// Make sure the ICs do it right
+store_float64_undefined(float64_array);
+assertTrue(isNaN(float64_array[7]));
+// Make sure that Cranskshft does it right.
+%OptimizeFunctionOnNextCall(store_float64_undefined);
+store_float64_undefined(float64_array);
+store_float64_undefined(float64_array);
+assertTrue(isNaN(float64_array[7]));
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev