Revision: 10714
Author: [email protected]
Date: Wed Feb 15 23:58:07 2012
Log: Uniformly handle 'undefined' store to Float64Array and
Float32Array.
Previous behavior diverged in ICs and Crankshaft. When storing to a
Float32Array or Float64Array, the ICs treated undefined as zero while
Crankshaft treated it as NaN. Now both ICs and Crankshaft treat it as NaN,
which is consistent with the WebGL & ECMAScript spec.
[email protected]
Review URL: https://chromiumcodereview.appspot.com/9402008
http://code.google.com/p/v8/source/detail?r=10714
Modified:
/branches/bleeding_edge/src/objects.cc
/branches/bleeding_edge/test/cctest/test-api.cc
/branches/bleeding_edge/test/mjsunit/external-array.js
=======================================
--- /branches/bleeding_edge/src/objects.cc Tue Feb 14 07:09:49 2012
+++ /branches/bleeding_edge/src/objects.cc Wed Feb 15 23:58:07 2012
@@ -11757,7 +11757,7 @@
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()) {
@@ -11767,7 +11767,7 @@
double double_value = HeapNumber::cast(value)->value();
cast_value = static_cast<float>(double_value);
} else {
- // Clamp undefined to zero (default). All other types have been
+ // Clamp undefined to NaN (default). All other types have been
// converted to a number type further up in the call chain.
ASSERT(value->IsUndefined());
}
@@ -11778,7 +11778,7 @@
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()) {
@@ -11787,7 +11787,7 @@
} else if (value->IsHeapNumber()) {
double_value = HeapNumber::cast(value)->value();
} else {
- // Clamp undefined to zero (default). All other types have been
+ // Clamp undefined to NaN (default). All other types have been
// converted to a number type further up in the call chain.
ASSERT(value->IsUndefined());
}
=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc Wed Feb 15 07:42:50 2012
+++ /branches/bleeding_edge/test/cctest/test-api.cc Wed Feb 15 23:58:07 2012
@@ -12902,8 +12902,15 @@
"}"
"ext_array[7];");
CHECK_EQ(0, result->Int32Value());
- CHECK_EQ(
- 0,
static_cast<int>(jsobj->GetElement(7)->ToObjectChecked()->Number()));
+ if (array_type == kExternalDoubleArray ||
+ array_type == kExternalFloatArray) {
+ CHECK_EQ(
+ static_cast<int>(0x80000000),
+
static_cast<int>(jsobj->GetElement(7)->ToObjectChecked()->Number()));
+ } else {
+ CHECK_EQ(0, static_cast<int>(
+ jsobj->GetElement(7)->ToObjectChecked()->Number()));
+ }
result = CompileRun("for (var i = 0; i < 8; i++) {"
" ext_array[6] = '2.3';"
=======================================
--- /branches/bleeding_edge/test/mjsunit/external-array.js Wed Jan 11
07:10:56 2012
+++ /branches/bleeding_edge/test/mjsunit/external-array.js Wed Feb 15
23:58:07 2012
@@ -317,3 +317,37 @@
%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) {
+ ext_array[0] = undefined;
+}
+
+var float32_array = new Float32Array(1);
+// Make sure runtime does it right
+store_float32_undefined(float32_array);
+assertTrue(isNaN(float32_array[0]));
+// Make sure the ICs do it right
+store_float32_undefined(float32_array);
+assertTrue(isNaN(float32_array[0]));
+// Make sure that Cranskshft does it right.
+%OptimizeFunctionOnNextCall(store_float32_undefined);
+store_float32_undefined(float32_array);
+assertTrue(isNaN(float32_array[0]));
+
+function store_float64_undefined(ext_array) {
+ ext_array[0] = undefined;
+}
+
+var float64_array = new Float64Array(1);
+// Make sure runtime does it right
+store_float64_undefined(float64_array);
+assertTrue(isNaN(float64_array[0]));
+// Make sure the ICs do it right
+store_float64_undefined(float64_array);
+assertTrue(isNaN(float64_array[0]));
+// Make sure that Cranskshft does it right.
+%OptimizeFunctionOnNextCall(store_float64_undefined);
+store_float64_undefined(float64_array);
+assertTrue(isNaN(float64_array[0]));
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev