Index: test/cctest/test-macro-assembler-mips.cc |
diff --git a/test/cctest/test-macro-assembler-mips.cc b/test/cctest/test-macro-assembler-mips.cc |
index b20094967970feb682f791a050d322297758359a..3154aac596ebdb95135fc054a538e1ae57576bc3 100644 |
--- a/test/cctest/test-macro-assembler-mips.cc |
+++ b/test/cctest/test-macro-assembler-mips.cc |
@@ -132,5 +132,47 @@ TEST(CopyBytes) { |
} |
+static void TestNaN(const char *code) { |
+ // NaN value is different on MIPS and x86 architectures, and TEST(NaNx) |
+ // tests checks the case where a x86 NaN value is serialized into the |
+ // snapshot on the simulator during cross compilation. |
+ v8::HandleScope scope(CcTest::isolate()); |
+ v8::Local<v8::Context> context = CcTest::NewContext(PRINT_EXTENSION); |
+ v8::Context::Scope context_scope(context); |
+ |
+ v8::Local<v8::Script> script = v8::Script::Compile(v8_str(code)); |
+ v8::Local<v8::Object> result = v8::Local<v8::Object>::Cast(script->Run()); |
+ // Have to populate the handle manually, as it's not Cast-able. |
+ i::Handle<i::JSObject> o = |
+ v8::Utils::OpenHandle<v8::Object, i::JSObject>(result); |
+ i::Handle<i::JSArray> array1(reinterpret_cast<i::JSArray*>(*o)); |
+ i::FixedDoubleArray* a = i::FixedDoubleArray::cast(array1->elements()); |
+ double value = a->get_scalar(0); |
+ CHECK(std::isnan(value) && |
+ i::BitCast<uint64_t>(value) == |
+ i::BitCast<uint64_t>( |
+ i::FixedDoubleArray::canonical_not_the_hole_nan_as_double())); |
+} |
+ |
+ |
+TEST(NaN0) { |
+ TestNaN( |
+ "var result;" |
+ "for (var i = 0; i < 2; i++) {" |
+ " result = new Array(Number.NaN, Number.POSITIVE_INFINITY);" |
+ "}" |
+ "result;"); |
+} |
+ |
+ |
+TEST(NaN1) { |
+ TestNaN( |
+ "var result;" |
+ "for (var i = 0; i < 2; i++) {" |
+ " result = [NaN];" |
+ "}" |
+ "result;"); |
+} |
+ |
#undef __ |