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

Reply via email to