diff options
author | Steve Block <steveblock@google.com> | 2011-05-24 12:43:12 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-05-24 13:42:09 +0100 |
commit | 1e0659c275bb392c045087af4f6b0d7565cb3d77 (patch) | |
tree | 09febd313ccef178417974f7b7098e89e20bfd93 /test | |
parent | b8e0da25ee8efac3bb05cd6b2730aafbd96119f4 (diff) | |
download | v8-1e0659c275bb392c045087af4f6b0d7565cb3d77.tar.gz |
Update V8 to r6768 as required by WebKit r78450
Change-Id: Ib8868ff7147a76547a8d1d85f257ebe8546a3d3f
Diffstat (limited to 'test')
68 files changed, 3169 insertions, 177 deletions
diff --git a/test/cctest/cctest.status b/test/cctest/cctest.status index a7eca5b3..a7422c25 100644 --- a/test/cctest/cctest.status +++ b/test/cctest/cctest.status @@ -29,11 +29,6 @@ prefix cctest test-api/Bug*: FAIL -# The problem is that a code object can get a different optimizable flag -# in crankshaft after creation. -test-log/EquivalenceOfLoggingAndTraversal: SKIP - - ############################################################################## # BUG(281): This test fails on some Linuxes. test-debug/DebuggerAgent: PASS, (PASS || FAIL) if $system == linux @@ -51,7 +46,6 @@ test-heap-profiler/HeapSnapshotsDiff: PASS || FAIL test-serialize/TestThatAlwaysFails: FAIL test-serialize/DependentTestThatAlwaysFails: FAIL - ############################################################################## [ $arch == x64 ] @@ -64,25 +58,10 @@ test-heap/TestInternalWeakListsTraverseWithGC: PASS || FAIL [ $arch == x64 && $crankshaft ] # Tests that fail with crankshaft. -test-deoptimization/DeoptimizeBinaryOperationADDString: FAIL -test-deoptimization/DeoptimizeBinaryOperationADD: FAIL -test-deoptimization/DeoptimizeBinaryOperationSUB: FAIL -test-deoptimization/DeoptimizeBinaryOperationMUL: FAIL test-deoptimization/DeoptimizeBinaryOperationMOD: FAIL -test-deoptimization/DeoptimizeBinaryOperationDIV: FAIL test-deoptimization/DeoptimizeLoadICStoreIC: FAIL test-deoptimization/DeoptimizeLoadICStoreICNested: FAIL -test-deoptimization/DeoptimizeCompare: FAIL - -# Tests that time out with crankshaft. -test-api/Threading: SKIP - -# BUG(1049): Currently no deoptimization support. -test-serialize/ContextSerialization: SKIP -test-serialize/ContextDeserialization: SKIP -test-debug/BreakPointReturn: SKIP -test-debug/DebugStepLinearMixedICs: SKIP - +test-deoptimization/DeoptimizeCompare: PASS || FAIL ############################################################################## [ $arch == arm ] @@ -104,6 +83,11 @@ test-log/ProfLazyMode: SKIP test-debug/DebuggerAgentProtocolOverflowHeader: SKIP test-sockets/Socket: SKIP +# BUG(1075): Some deserialization tests fail om ARM +test-serialize/Deserialize: SKIP +test-serialize/DeserializeFromSecondSerializationAndRunScript2: SKIP +test-serialize/DeserializeAndRunScript2: SKIP +test-serialize/DeserializeFromSecondSerialization: SKIP ############################################################################## [ $arch == arm && $crankshaft ] diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index 6a2f3289..b92185f5 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -874,6 +874,10 @@ THREADED_TEST(ExternalWrap) { TestExternalPointerWrapping(); #if defined(V8_HOST_ARCH_X64) + // Check a value with a leading 1 bit in x64 Smi encoding. + expected_ptr = reinterpret_cast<void*>(0x400000000); + TestExternalPointerWrapping(); + expected_ptr = reinterpret_cast<void*>(0xdeadbeefdeadbeef); TestExternalPointerWrapping(); @@ -1645,6 +1649,23 @@ THREADED_TEST(IdentityHash) { CHECK_NE(hash, hash3); int hash4 = obj->GetIdentityHash(); CHECK_EQ(hash, hash4); + + // Check identity hashes behaviour in the presence of JS accessors. + // Put a getter for 'v8::IdentityHash' on the Object's prototype: + { + CompileRun("Object.prototype['v8::IdentityHash'] = 42;\n"); + Local<v8::Object> o1 = v8::Object::New(); + Local<v8::Object> o2 = v8::Object::New(); + CHECK_NE(o1->GetIdentityHash(), o2->GetIdentityHash()); + } + { + CompileRun( + "function cnst() { return 42; };\n" + "Object.prototype.__defineGetter__('v8::IdentityHash', cnst);\n"); + Local<v8::Object> o1 = v8::Object::New(); + Local<v8::Object> o2 = v8::Object::New(); + CHECK_NE(o1->GetIdentityHash(), o2->GetIdentityHash()); + } } @@ -2365,18 +2386,50 @@ static void check_reference_error_message( } -// Test that overwritten toString methods are not invoked on uncaught -// exception formatting. However, they are invoked when performing -// normal error string conversions. +static v8::Handle<Value> Fail(const v8::Arguments& args) { + ApiTestFuzzer::Fuzz(); + CHECK(false); + return v8::Undefined(); +} + + +// Test that overwritten methods are not invoked on uncaught exception +// formatting. However, they are invoked when performing normal error +// string conversions. TEST(APIThrowMessageOverwrittenToString) { v8::HandleScope scope; v8::V8::AddMessageListener(check_reference_error_message); - LocalContext context; + Local<ObjectTemplate> templ = ObjectTemplate::New(); + templ->Set(v8_str("fail"), v8::FunctionTemplate::New(Fail)); + LocalContext context(NULL, templ); + CompileRun("asdf;"); + CompileRun("var limit = {};" + "limit.valueOf = fail;" + "Error.stackTraceLimit = limit;"); + CompileRun("asdf"); + CompileRun("Array.prototype.pop = fail;"); + CompileRun("Object.prototype.hasOwnProperty = fail;"); + CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }"); + CompileRun("Number.prototype.toString = function f() { return 'Yikes'; }"); + CompileRun("String.prototype.toString = function f() { return 'Yikes'; }"); CompileRun("ReferenceError.prototype.toString =" " function() { return 'Whoops' }"); CompileRun("asdf;"); + CompileRun("ReferenceError.prototype.constructor.name = void 0;"); + CompileRun("asdf;"); + CompileRun("ReferenceError.prototype.constructor = void 0;"); + CompileRun("asdf;"); + CompileRun("ReferenceError.prototype.__proto__ = new Object();"); + CompileRun("asdf;"); + CompileRun("ReferenceError.prototype = new Object();"); + CompileRun("asdf;"); v8::Handle<Value> string = CompileRun("try { asdf; } catch(e) { e + ''; }"); CHECK(string->Equals(v8_str("Whoops"))); + CompileRun("ReferenceError.prototype.constructor = new Object();" + "ReferenceError.prototype.constructor.name = 1;" + "Number.prototype.toString = function() { return 'Whoops'; };" + "ReferenceError.prototype.toString = Object.prototype.toString;"); + CompileRun("asdf;"); v8::V8::RemoveMessageListeners(check_message); } @@ -5273,11 +5326,13 @@ TEST(DetachAndReattachGlobal) { } +static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false }; static bool NamedAccessBlocker(Local<v8::Object> global, Local<Value> name, v8::AccessType type, Local<Value> data) { - return Context::GetCurrent()->Global()->Equals(global); + return Context::GetCurrent()->Global()->Equals(global) || + allowed_access_type[type]; } @@ -5285,7 +5340,8 @@ static bool IndexedAccessBlocker(Local<v8::Object> global, uint32_t key, v8::AccessType type, Local<Value> data) { - return Context::GetCurrent()->Global()->Equals(global); + return Context::GetCurrent()->Global()->Equals(global) || + allowed_access_type[type]; } @@ -5317,7 +5373,7 @@ static void UnreachableSetter(Local<String>, Local<Value>, } -THREADED_TEST(AccessControl) { +TEST(AccessControl) { v8::HandleScope handle_scope; v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); @@ -5343,6 +5399,27 @@ THREADED_TEST(AccessControl) { v8::Handle<v8::Object> global0 = context0->Global(); + // Define a property with JS getter and setter. + CompileRun( + "function getter() { return 'getter'; };\n" + "function setter() { return 'setter'; }\n" + "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})"); + + Local<Value> getter = global0->Get(v8_str("getter")); + Local<Value> setter = global0->Get(v8_str("setter")); + + // And define normal element. + global0->Set(239, v8_str("239")); + + // Define an element with JS getter and setter. + CompileRun( + "function el_getter() { return 'el_getter'; };\n" + "function el_setter() { return 'el_setter'; };\n" + "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});"); + + Local<Value> el_getter = global0->Get(v8_str("el_getter")); + Local<Value> el_setter = global0->Get(v8_str("el_setter")); + v8::HandleScope scope1; v8::Persistent<Context> context1 = Context::New(); @@ -5351,40 +5428,187 @@ THREADED_TEST(AccessControl) { v8::Handle<v8::Object> global1 = context1->Global(); global1->Set(v8_str("other"), global0); - v8::Handle<Value> value; + // Access blocked property. + CompileRun("other.blocked_prop = 1"); + + ExpectUndefined("other.blocked_prop"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'blocked_prop')"); + ExpectFalse("propertyIsEnumerable.call(other, 'blocked_prop')"); + + // Enable ACCESS_HAS + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other.blocked_prop"); + // ... and now we can get the descriptor... + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'blocked_prop').value"); + // ... and enumerate the property. + ExpectTrue("propertyIsEnumerable.call(other, 'blocked_prop')"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Access blocked element. + CompileRun("other[239] = 1"); + + ExpectUndefined("other[239]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239')"); + ExpectFalse("propertyIsEnumerable.call(other, '239')"); + + // Enable ACCESS_HAS + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other[239]"); + // ... and now we can get the descriptor... + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239').value"); + // ... and enumerate the property. + ExpectTrue("propertyIsEnumerable.call(other, '239')"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Access a property with JS accessor. + CompileRun("other.js_accessor_p = 2"); + + ExpectUndefined("other.js_accessor_p"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p')"); + + // Enable ACCESS_HAS. + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other.js_accessor_p"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_GET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + + ExpectString("other.js_accessor_p", "getter"); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectUndefined("other.js_accessor_p"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get"); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS, ACCESS_GET and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectString("other.js_accessor_p", "getter"); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Access an element with JS accessor. + CompileRun("other[42] = 2"); + + ExpectUndefined("other[42]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42')"); + + // Enable ACCESS_HAS. + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other[42]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').get"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').set"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_GET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + + ExpectString("other[42]", "el_getter"); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').set"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectUndefined("other[42]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').get"); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS, ACCESS_GET and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectString("other[42]", "el_getter"); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; - // Access blocked property - value = v8_compile("other.blocked_prop = 1")->Run(); - value = v8_compile("other.blocked_prop")->Run(); - CHECK(value->IsUndefined()); - - value = v8_compile("propertyIsEnumerable.call(other, 'blocked_prop')")->Run(); - CHECK(value->IsFalse()); + v8::Handle<Value> value; // Access accessible property - value = v8_compile("other.accessible_prop = 3")->Run(); + value = CompileRun("other.accessible_prop = 3"); CHECK(value->IsNumber()); CHECK_EQ(3, value->Int32Value()); CHECK_EQ(3, g_echo_value); - value = v8_compile("other.accessible_prop")->Run(); + value = CompileRun("other.accessible_prop"); CHECK(value->IsNumber()); CHECK_EQ(3, value->Int32Value()); - value = - v8_compile("propertyIsEnumerable.call(other, 'accessible_prop')")->Run(); + value = CompileRun( + "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); + CHECK(value->IsNumber()); + CHECK_EQ(3, value->Int32Value()); + + value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); CHECK(value->IsTrue()); // Enumeration doesn't enumerate accessors from inaccessible objects in // the prototype chain even if the accessors are in themselves accessible. - Local<Value> result = + value = CompileRun("(function(){var obj = {'__proto__':other};" "for (var p in obj)" " if (p == 'accessible_prop' || p == 'blocked_prop') {" " return false;" " }" "return true;})()"); - CHECK(result->IsTrue()); + CHECK(value->IsTrue()); context1->Exit(); context0->Exit(); @@ -6229,7 +6453,7 @@ THREADED_TEST(FunctionDescriptorException) { " var str = String(e);" " if (str.indexOf('TypeError') == -1) return 1;" " if (str.indexOf('[object Fun]') != -1) return 2;" - " if (str.indexOf('#<a Fun>') == -1) return 3;" + " if (str.indexOf('#<Fun>') == -1) return 3;" " return 0;" " }" " return 4;" @@ -7318,6 +7542,61 @@ static void GenerateSomeGarbage() { "garbage = undefined;"); } +v8::Handle<v8::Value> DirectApiCallback(const v8::Arguments& args) { + static int count = 0; + if (count++ % 3 == 0) { + v8::V8::LowMemoryNotification(); // This should move the stub + GenerateSomeGarbage(); // This should ensure the old stub memory is flushed + } + return v8::Handle<v8::Value>(); +} + + +THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) { + v8::HandleScope scope; + LocalContext context; + v8::Handle<v8::ObjectTemplate> nativeobject_templ = v8::ObjectTemplate::New(); + nativeobject_templ->Set("callback", + v8::FunctionTemplate::New(DirectApiCallback)); + v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); + context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); + // call the api function multiple times to ensure direct call stub creation. + CompileRun( + "function f() {" + " for (var i = 1; i <= 30; i++) {" + " nativeobject.callback();" + " }" + "}" + "f();"); +} + + +v8::Handle<v8::Value> ThrowingDirectApiCallback(const v8::Arguments& args) { + return v8::ThrowException(v8_str("g")); +} + + +THREADED_TEST(CallICFastApi_DirectCall_Throw) { + v8::HandleScope scope; + LocalContext context; + v8::Handle<v8::ObjectTemplate> nativeobject_templ = v8::ObjectTemplate::New(); + nativeobject_templ->Set("callback", + v8::FunctionTemplate::New(ThrowingDirectApiCallback)); + v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); + context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); + // call the api function multiple times to ensure direct call stub creation. + v8::Handle<Value> result = CompileRun( + "var result = '';" + "function f() {" + " for (var i = 1; i <= 5; i++) {" + " try { nativeobject.callback(); } catch (e) { result += e; }" + " }" + "}" + "f(); result;"); + CHECK_EQ(v8_str("ggggg"), result); +} + + THREADED_TEST(InterceptorCallICFastApi_TrivialSignature) { int interceptor_call_count = 0; v8::HandleScope scope; @@ -10325,6 +10604,108 @@ THREADED_TEST(PixelArray) { "i"); CHECK_EQ(255, result->Int32Value()); + // Make sure that pixel array ICs recognize when a non-pixel array + // is passed to it. + result = CompileRun("function pa_load(p) {" + " var sum = 0;" + " for (var j = 0; j < 256; j++) { sum += p[j]; }" + " return sum;" + "}" + "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" + "for (var i = 0; i < 10; ++i) { pa_load(pixels); }" + "just_ints = new Object();" + "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" + "for (var i = 0; i < 10; ++i) {" + " result = pa_load(just_ints);" + "}" + "result"); + CHECK_EQ(32640, result->Int32Value()); + + // Make sure that pixel array ICs recognize out-of-bound accesses. + result = CompileRun("function pa_load(p, start) {" + " var sum = 0;" + " for (var j = start; j < 256; j++) { sum += p[j]; }" + " return sum;" + "}" + "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" + "for (var i = 0; i < 10; ++i) { pa_load(pixels,0); }" + "for (var i = 0; i < 10; ++i) {" + " result = pa_load(pixels,-10);" + "}" + "result"); + CHECK_EQ(0, result->Int32Value()); + + // Make sure that generic ICs properly handles a pixel array. + result = CompileRun("function pa_load(p) {" + " var sum = 0;" + " for (var j = 0; j < 256; j++) { sum += p[j]; }" + " return sum;" + "}" + "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" + "just_ints = new Object();" + "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" + "for (var i = 0; i < 10; ++i) { pa_load(just_ints); }" + "for (var i = 0; i < 10; ++i) {" + " result = pa_load(pixels);" + "}" + "result"); + CHECK_EQ(32640, result->Int32Value()); + + // Make sure that generic load ICs recognize out-of-bound accesses in + // pixel arrays. + result = CompileRun("function pa_load(p, start) {" + " var sum = 0;" + " for (var j = start; j < 256; j++) { sum += p[j]; }" + " return sum;" + "}" + "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" + "just_ints = new Object();" + "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" + "for (var i = 0; i < 10; ++i) { pa_load(just_ints,0); }" + "for (var i = 0; i < 10; ++i) { pa_load(pixels,0); }" + "for (var i = 0; i < 10; ++i) {" + " result = pa_load(pixels,-10);" + "}" + "result"); + CHECK_EQ(0, result->Int32Value()); + + // Make sure that generic ICs properly handles other types than pixel + // arrays (that the inlined fast pixel array test leaves the right information + // in the right registers). + result = CompileRun("function pa_load(p) {" + " var sum = 0;" + " for (var j = 0; j < 256; j++) { sum += p[j]; }" + " return sum;" + "}" + "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" + "just_ints = new Object();" + "for (var i = 0; i < 256; ++i) { just_ints[i] = i; }" + "for (var i = 0; i < 10; ++i) { pa_load(just_ints); }" + "for (var i = 0; i < 10; ++i) { pa_load(pixels); }" + "sparse_array = new Object();" + "for (var i = 0; i < 256; ++i) { sparse_array[i] = i; }" + "sparse_array[1000000] = 3;" + "for (var i = 0; i < 10; ++i) {" + " result = pa_load(sparse_array);" + "}" + "result"); + CHECK_EQ(32640, result->Int32Value()); + + // Make sure that pixel array loads are optimized by crankshaft. + result = CompileRun("function pa_load(p) {" + " var sum = 0;" + " for (var i=0; i<256; ++i) {" + " sum += p[i];" + " }" + " return sum; " + "}" + "for (var i = 0; i < 256; ++i) { pixels[i] = i; }" + "for (var i = 0; i < 10000; ++i) {" + " result = pa_load(pixels);" + "}" + "result"); + CHECK_EQ(32640, result->Int32Value()); + free(pixel_data); } @@ -10583,6 +10964,33 @@ static void ExternalArrayTestHelper(v8::ExternalArrayType array_type, CHECK_EQ(0, result->Int32Value()); CHECK_EQ(0, i::Smi::cast(jsobj->GetElement(5)->ToObjectChecked())->value()); + + // Check truncation behavior of integral arrays. + const char* unsigned_data = + "var source_data = [0.6, 10.6];" + "var expected_results = [0, 10];"; + const char* signed_data = + "var source_data = [0.6, 10.6, -0.6, -10.6];" + "var expected_results = [0, 10, 0, -10];"; + bool is_unsigned = + (array_type == v8::kExternalUnsignedByteArray || + array_type == v8::kExternalUnsignedShortArray || + array_type == v8::kExternalUnsignedIntArray); + + i::OS::SNPrintF(test_buf, + "%s" + "var all_passed = true;" + "for (var i = 0; i < source_data.length; i++) {" + " for (var j = 0; j < 8; j++) {" + " ext_array[j] = source_data[i];" + " }" + " all_passed = all_passed &&" + " (ext_array[5] == expected_results[i]);" + "}" + "all_passed;", + (is_unsigned ? unsigned_data : signed_data)); + result = CompileRun(test_buf.start()); + CHECK_EQ(true, result->BooleanValue()); } result = CompileRun("ext_array[3] = 33;" @@ -10977,6 +11385,26 @@ TEST(CaptureStackTraceForUncaughtException) { } +TEST(CaptureStackTraceForUncaughtExceptionAndSetters) { + v8::HandleScope scope; + LocalContext env; + v8::V8::SetCaptureStackTraceForUncaughtExceptions(true, + 1024, + v8::StackTrace::kDetailed); + + CompileRun( + "var setters = ['column', 'lineNumber', 'scriptName',\n" + " 'scriptNameOrSourceURL', 'functionName', 'isEval',\n" + " 'isConstructor'];\n" + "for (var i = 0; i < setters.length; i++) {\n" + " var prop = setters[i];\n" + " Object.prototype.__defineSetter__(prop, function() { throw prop; });\n" + "}\n"); + CompileRun("throw 'exception';"); + v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); +} + + v8::Handle<Value> AnalyzeStackOfEvalWithSourceURL(const v8::Arguments& args) { v8::HandleScope scope; v8::Handle<v8::StackTrace> stackTrace = @@ -12147,6 +12575,25 @@ TEST(RegExp) { } +THREADED_TEST(Equals) { + v8::HandleScope handleScope; + LocalContext localContext; + + v8::Handle<v8::Object> globalProxy = localContext->Global(); + v8::Handle<Value> global = globalProxy->GetPrototype(); + + CHECK(global->StrictEquals(global)); + CHECK(!global->StrictEquals(globalProxy)); + CHECK(!globalProxy->StrictEquals(global)); + CHECK(globalProxy->StrictEquals(globalProxy)); + + CHECK(global->Equals(global)); + CHECK(!global->Equals(globalProxy)); + CHECK(!globalProxy->Equals(global)); + CHECK(globalProxy->Equals(globalProxy)); +} + + static v8::Handle<v8::Value> Getter(v8::Local<v8::String> property, const v8::AccessorInfo& info ) { return v8_str("42!"); @@ -12173,3 +12620,19 @@ TEST(NamedEnumeratorAndForIn) { CHECK_EQ(1, result->Length()); CHECK_EQ(v8_str("universalAnswer"), result->Get(0)); } + + +TEST(DefinePropertyPostDetach) { + v8::HandleScope scope; + LocalContext context; + v8::Handle<v8::Object> proxy = context->Global(); + v8::Handle<v8::Function> define_property = + CompileRun("(function() {" + " Object.defineProperty(" + " this," + " 1," + " { configurable: true, enumerable: true, value: 3 });" + "})").As<Function>(); + context->DetachGlobal(); + define_property->Call(proxy, 0, NULL); +} diff --git a/test/cctest/test-assembler-arm.cc b/test/cctest/test-assembler-arm.cc index 0f12f985..43cf580a 100644 --- a/test/cctest/test-assembler-arm.cc +++ b/test/cctest/test-assembler-arm.cc @@ -45,11 +45,7 @@ typedef Object* (*F3)(void* p, int p1, int p2, int p3, int p4); static v8::Persistent<v8::Context> env; -// The test framework does not accept flags on the command line, so we set them static void InitializeVM() { - // enable generation of comments - FLAG_debug_code = true; - if (env.IsEmpty()) { env = v8::Context::New(); } @@ -233,6 +229,8 @@ TEST(4) { double d; double e; double f; + double g; + double h; int i; float x; float y; @@ -290,6 +288,15 @@ TEST(4) { __ vmov(s31, lr); __ vcvt_f64_s32(d4, s31); __ vstr(d4, r4, OFFSET_OF(T, f)); + + // Test vabs. + __ vldr(d1, r4, OFFSET_OF(T, g)); + __ vabs(d0, d1); + __ vstr(d0, r4, OFFSET_OF(T, g)); + __ vldr(d2, r4, OFFSET_OF(T, h)); + __ vabs(d0, d2); + __ vstr(d0, r4, OFFSET_OF(T, h)); + __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); CodeDesc desc; @@ -309,6 +316,8 @@ TEST(4) { t.d = 0.0; t.e = 0.0; t.f = 0.0; + t.g = -2718.2818; + t.h = 31415926.5; t.i = 0; t.x = 4.5; t.y = 9.0; @@ -317,6 +326,8 @@ TEST(4) { CHECK_EQ(4.5, t.y); CHECK_EQ(9.0, t.x); CHECK_EQ(2, t.i); + CHECK_EQ(2718.2818, t.g); + CHECK_EQ(31415926.5, t.h); CHECK_EQ(42.0, t.f); CHECK_EQ(1.0, t.e); CHECK_EQ(1.000000059604644775390625, t.d); @@ -398,71 +409,189 @@ TEST(6) { } -static void TestRoundingMode(int32_t mode, double value, int expected) { +enum VCVTTypes { + s32_f64, + u32_f64 +}; + +static void TestRoundingMode(VCVTTypes types, + VFPRoundingMode mode, + double value, + int expected, + bool expected_exception = false) { InitializeVM(); v8::HandleScope scope; Assembler assm(NULL, 0); - __ vmrs(r1); - // Set custom FPSCR. - __ bic(r2, r1, Operand(((mode ^ 3) << 22) | 0xf)); - __ orr(r2, r2, Operand(mode << 22)); - __ vmsr(r2); + if (CpuFeatures::IsSupported(VFP3)) { + CpuFeatures::Scope scope(VFP3); - // Load value, convert, and move back result to r0. - __ vmov(d1, value); - __ vcvt_s32_f64(s0, d1, Assembler::FPSCRRounding, al); - __ vmov(r0, s0); + Label wrong_exception; + + __ vmrs(r1); + // Set custom FPSCR. + __ bic(r2, r1, Operand(kVFPRoundingModeMask | kVFPExceptionMask)); + __ orr(r2, r2, Operand(mode)); + __ vmsr(r2); + + // Load value, convert, and move back result to r0 if everything went well. + __ vmov(d1, value); + switch (types) { + case s32_f64: + __ vcvt_s32_f64(s0, d1, kFPSCRRounding); + break; + + case u32_f64: + __ vcvt_u32_f64(s0, d1, kFPSCRRounding); + break; + + default: + UNREACHABLE(); + break; + } + // Check for vfp exceptions + __ vmrs(r2); + __ tst(r2, Operand(kVFPExceptionMask)); + // Check that we behaved as expected. + __ b(&wrong_exception, + expected_exception ? eq : ne); + // There was no exception. Retrieve the result and return. + __ vmov(r0, s0); + __ mov(pc, Operand(lr)); - __ mov(pc, Operand(lr)); + // The exception behaviour is not what we expected. + // Load a special value and return. + __ bind(&wrong_exception); + __ mov(r0, Operand(11223344)); + __ mov(pc, Operand(lr)); - CodeDesc desc; - assm.GetCode(&desc); - Object* code = Heap::CreateCode( - desc, - Code::ComputeFlags(Code::STUB), - Handle<Object>(Heap::undefined_value()))->ToObjectChecked(); - CHECK(code->IsCode()); + CodeDesc desc; + assm.GetCode(&desc); + Object* code = Heap::CreateCode( + desc, + Code::ComputeFlags(Code::STUB), + Handle<Object>(Heap::undefined_value()))->ToObjectChecked(); + CHECK(code->IsCode()); #ifdef DEBUG - Code::cast(code)->Print(); + Code::cast(code)->Print(); #endif - F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); - int res = reinterpret_cast<int>( - CALL_GENERATED_CODE(f, 0, 0, 0, 0, 0)); - ::printf("res = %d\n", res); - CHECK_EQ(expected, res); + F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); + int res = reinterpret_cast<int>( + CALL_GENERATED_CODE(f, 0, 0, 0, 0, 0)); + ::printf("res = %d\n", res); + CHECK_EQ(expected, res); + } } TEST(7) { // Test vfp rounding modes. - // See ARM DDI 0406B Page A2-29. - enum FPSCRRoungingMode { - RN, // Round to Nearest. - RP, // Round towards Plus Infinity. - RM, // Round towards Minus Infinity. - RZ // Round towards zero. - }; - - if (CpuFeatures::IsSupported(VFP3)) { - CpuFeatures::Scope scope(VFP3); - - TestRoundingMode(RZ, 0.5, 0); - TestRoundingMode(RZ, -0.5, 0); - TestRoundingMode(RZ, 123.7, 123); - TestRoundingMode(RZ, -123.7, -123); - TestRoundingMode(RZ, 123456.2, 123456); - TestRoundingMode(RZ, -123456.2, -123456); - - TestRoundingMode(RM, 0.5, 0); - TestRoundingMode(RM, -0.5, -1); - TestRoundingMode(RM, 123.7, 123); - TestRoundingMode(RM, -123.7, -124); - TestRoundingMode(RM, 123456.2, 123456); - TestRoundingMode(RM, -123456.2, -123457); - } + // s32_f64 (double to integer). + + TestRoundingMode(s32_f64, RN, 0, 0); + TestRoundingMode(s32_f64, RN, 0.5, 0); + TestRoundingMode(s32_f64, RN, -0.5, 0); + TestRoundingMode(s32_f64, RN, 1.5, 2); + TestRoundingMode(s32_f64, RN, -1.5, -2); + TestRoundingMode(s32_f64, RN, 123.7, 124); + TestRoundingMode(s32_f64, RN, -123.7, -124); + TestRoundingMode(s32_f64, RN, 123456.2, 123456); + TestRoundingMode(s32_f64, RN, -123456.2, -123456); + TestRoundingMode(s32_f64, RN, static_cast<double>(kMaxInt), kMaxInt); + TestRoundingMode(s32_f64, RN, (kMaxInt + 0.49), kMaxInt); + TestRoundingMode(s32_f64, RN, (kMaxInt + 1.0), kMaxInt, true); + TestRoundingMode(s32_f64, RN, (kMaxInt + 0.5), kMaxInt, true); + TestRoundingMode(s32_f64, RN, static_cast<double>(kMinInt), kMinInt); + TestRoundingMode(s32_f64, RN, (kMinInt - 0.5), kMinInt); + TestRoundingMode(s32_f64, RN, (kMinInt - 1.0), kMinInt, true); + TestRoundingMode(s32_f64, RN, (kMinInt - 0.51), kMinInt, true); + + TestRoundingMode(s32_f64, RM, 0, 0); + TestRoundingMode(s32_f64, RM, 0.5, 0); + TestRoundingMode(s32_f64, RM, -0.5, -1); + TestRoundingMode(s32_f64, RM, 123.7, 123); + TestRoundingMode(s32_f64, RM, -123.7, -124); + TestRoundingMode(s32_f64, RM, 123456.2, 123456); + TestRoundingMode(s32_f64, RM, -123456.2, -123457); + TestRoundingMode(s32_f64, RM, static_cast<double>(kMaxInt), kMaxInt); + TestRoundingMode(s32_f64, RM, (kMaxInt + 0.5), kMaxInt); + TestRoundingMode(s32_f64, RM, (kMaxInt + 1.0), kMaxInt, true); + TestRoundingMode(s32_f64, RM, static_cast<double>(kMinInt), kMinInt); + TestRoundingMode(s32_f64, RM, (kMinInt - 0.5), kMinInt, true); + TestRoundingMode(s32_f64, RM, (kMinInt + 0.5), kMinInt); + + TestRoundingMode(s32_f64, RZ, 0, 0); + TestRoundingMode(s32_f64, RZ, 0.5, 0); + TestRoundingMode(s32_f64, RZ, -0.5, 0); + TestRoundingMode(s32_f64, RZ, 123.7, 123); + TestRoundingMode(s32_f64, RZ, -123.7, -123); + TestRoundingMode(s32_f64, RZ, 123456.2, 123456); + TestRoundingMode(s32_f64, RZ, -123456.2, -123456); + TestRoundingMode(s32_f64, RZ, static_cast<double>(kMaxInt), kMaxInt); + TestRoundingMode(s32_f64, RZ, (kMaxInt + 0.5), kMaxInt); + TestRoundingMode(s32_f64, RZ, (kMaxInt + 1.0), kMaxInt, true); + TestRoundingMode(s32_f64, RZ, static_cast<double>(kMinInt), kMinInt); + TestRoundingMode(s32_f64, RZ, (kMinInt - 0.5), kMinInt); + TestRoundingMode(s32_f64, RZ, (kMinInt - 1.0), kMinInt, true); + + + // u32_f64 (double to integer). + + // Negative values. + TestRoundingMode(u32_f64, RN, -0.5, 0); + TestRoundingMode(u32_f64, RN, -123456.7, 0, true); + TestRoundingMode(u32_f64, RN, static_cast<double>(kMinInt), 0, true); + TestRoundingMode(u32_f64, RN, kMinInt - 1.0, 0, true); + + TestRoundingMode(u32_f64, RM, -0.5, 0, true); + TestRoundingMode(u32_f64, RM, -123456.7, 0, true); + TestRoundingMode(u32_f64, RM, static_cast<double>(kMinInt), 0, true); + TestRoundingMode(u32_f64, RM, kMinInt - 1.0, 0, true); + + TestRoundingMode(u32_f64, RZ, -0.5, 0); + TestRoundingMode(u32_f64, RZ, -123456.7, 0, true); + TestRoundingMode(u32_f64, RZ, static_cast<double>(kMinInt), 0, true); + TestRoundingMode(u32_f64, RZ, kMinInt - 1.0, 0, true); + + // Positive values. + // kMaxInt is the maximum *signed* integer: 0x7fffffff. + static const uint32_t kMaxUInt = 0xffffffffu; + TestRoundingMode(u32_f64, RZ, 0, 0); + TestRoundingMode(u32_f64, RZ, 0.5, 0); + TestRoundingMode(u32_f64, RZ, 123.7, 123); + TestRoundingMode(u32_f64, RZ, 123456.2, 123456); + TestRoundingMode(u32_f64, RZ, static_cast<double>(kMaxInt), kMaxInt); + TestRoundingMode(u32_f64, RZ, (kMaxInt + 0.5), kMaxInt); + TestRoundingMode(u32_f64, RZ, (kMaxInt + 1.0), + static_cast<uint32_t>(kMaxInt) + 1); + TestRoundingMode(u32_f64, RZ, (kMaxUInt + 0.5), kMaxUInt); + TestRoundingMode(u32_f64, RZ, (kMaxUInt + 1.0), kMaxUInt, true); + + TestRoundingMode(u32_f64, RM, 0, 0); + TestRoundingMode(u32_f64, RM, 0.5, 0); + TestRoundingMode(u32_f64, RM, 123.7, 123); + TestRoundingMode(u32_f64, RM, 123456.2, 123456); + TestRoundingMode(u32_f64, RM, static_cast<double>(kMaxInt), kMaxInt); + TestRoundingMode(u32_f64, RM, (kMaxInt + 0.5), kMaxInt); + TestRoundingMode(u32_f64, RM, (kMaxInt + 1.0), + static_cast<uint32_t>(kMaxInt) + 1); + TestRoundingMode(u32_f64, RM, (kMaxUInt + 0.5), kMaxUInt); + TestRoundingMode(u32_f64, RM, (kMaxUInt + 1.0), kMaxUInt, true); + + TestRoundingMode(u32_f64, RN, 0, 0); + TestRoundingMode(u32_f64, RN, 0.5, 0); + TestRoundingMode(u32_f64, RN, 1.5, 2); + TestRoundingMode(u32_f64, RN, 123.7, 124); + TestRoundingMode(u32_f64, RN, 123456.2, 123456); + TestRoundingMode(u32_f64, RN, static_cast<double>(kMaxInt), kMaxInt); + TestRoundingMode(u32_f64, RN, (kMaxInt + 0.49), kMaxInt); + TestRoundingMode(u32_f64, RN, (kMaxInt + 0.5), + static_cast<uint32_t>(kMaxInt) + 1); + TestRoundingMode(u32_f64, RN, (kMaxUInt + 0.49), kMaxUInt); + TestRoundingMode(u32_f64, RN, (kMaxUInt + 0.5), kMaxUInt, true); + TestRoundingMode(u32_f64, RN, (kMaxUInt + 1.0), kMaxUInt, true); } #undef __ diff --git a/test/cctest/test-assembler-mips.cc b/test/cctest/test-assembler-mips.cc index 955562b2..ecb42e2f 100644 --- a/test/cctest/test-assembler-mips.cc +++ b/test/cctest/test-assembler-mips.cc @@ -47,14 +47,10 @@ typedef Object* (*F3)(void* p, int p1, int p2, int p3, int p4); static v8::Persistent<v8::Context> env; -// The test framework does not accept flags on the command line, so we set them. static void InitializeVM() { // Disable compilation of natives. FLAG_disable_native_files = true; - // Enable generation of comments. - FLAG_debug_code = true; - if (env.IsEmpty()) { env = v8::Context::New(); } diff --git a/test/cctest/test-assembler-x64.cc b/test/cctest/test-assembler-x64.cc index f100b734..5d292df0 100644 --- a/test/cctest/test-assembler-x64.cc +++ b/test/cctest/test-assembler-x64.cc @@ -48,6 +48,12 @@ using v8::internal::rcx; using v8::internal::rdx; using v8::internal::rbp; using v8::internal::rsp; +using v8::internal::r8; +using v8::internal::r9; +using v8::internal::r12; +using v8::internal::r13; +using v8::internal::times_1; + using v8::internal::FUNCTION_CAST; using v8::internal::CodeDesc; using v8::internal::less_equal; @@ -289,4 +295,47 @@ TEST(AssemblerX64LoopImmediates) { CHECK_EQ(1, result); } + +TEST(OperandRegisterDependency) { + int offsets[4] = {0, 1, 0xfed, 0xbeefcad}; + for (int i = 0; i < 4; i++) { + int offset = offsets[i]; + CHECK(Operand(rax, offset).AddressUsesRegister(rax)); + CHECK(!Operand(rax, offset).AddressUsesRegister(r8)); + CHECK(!Operand(rax, offset).AddressUsesRegister(rcx)); + + CHECK(Operand(rax, rax, times_1, offset).AddressUsesRegister(rax)); + CHECK(!Operand(rax, rax, times_1, offset).AddressUsesRegister(r8)); + CHECK(!Operand(rax, rax, times_1, offset).AddressUsesRegister(rcx)); + + CHECK(Operand(rax, rcx, times_1, offset).AddressUsesRegister(rax)); + CHECK(Operand(rax, rcx, times_1, offset).AddressUsesRegister(rcx)); + CHECK(!Operand(rax, rcx, times_1, offset).AddressUsesRegister(r8)); + CHECK(!Operand(rax, rcx, times_1, offset).AddressUsesRegister(r9)); + CHECK(!Operand(rax, rcx, times_1, offset).AddressUsesRegister(rdx)); + CHECK(!Operand(rax, rcx, times_1, offset).AddressUsesRegister(rsp)); + + CHECK(Operand(rsp, offset).AddressUsesRegister(rsp)); + CHECK(!Operand(rsp, offset).AddressUsesRegister(rax)); + CHECK(!Operand(rsp, offset).AddressUsesRegister(r12)); + + CHECK(Operand(rbp, offset).AddressUsesRegister(rbp)); + CHECK(!Operand(rbp, offset).AddressUsesRegister(rax)); + CHECK(!Operand(rbp, offset).AddressUsesRegister(r13)); + + CHECK(Operand(rbp, rax, times_1, offset).AddressUsesRegister(rbp)); + CHECK(Operand(rbp, rax, times_1, offset).AddressUsesRegister(rax)); + CHECK(!Operand(rbp, rax, times_1, offset).AddressUsesRegister(rcx)); + CHECK(!Operand(rbp, rax, times_1, offset).AddressUsesRegister(r13)); + CHECK(!Operand(rbp, rax, times_1, offset).AddressUsesRegister(r8)); + CHECK(!Operand(rbp, rax, times_1, offset).AddressUsesRegister(rsp)); + + CHECK(Operand(rsp, rbp, times_1, offset).AddressUsesRegister(rsp)); + CHECK(Operand(rsp, rbp, times_1, offset).AddressUsesRegister(rbp)); + CHECK(!Operand(rsp, rbp, times_1, offset).AddressUsesRegister(rax)); + CHECK(!Operand(rsp, rbp, times_1, offset).AddressUsesRegister(r12)); + CHECK(!Operand(rsp, rbp, times_1, offset).AddressUsesRegister(r13)); + } +} + #undef __ diff --git a/test/cctest/test-bignum-dtoa.cc b/test/cctest/test-bignum-dtoa.cc index 51a90574..a696ed8e 100644 --- a/test/cctest/test-bignum-dtoa.cc +++ b/test/cctest/test-bignum-dtoa.cc @@ -1,4 +1,4 @@ -// Copyright 2010 the V8 project authors. All rights reserved. +// Copyright 2011 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -44,7 +44,7 @@ using namespace v8::internal; // Removes trailing '0' digits. // Can return the empty string if all digits are 0. static void TrimRepresentation(Vector<char> representation) { - int len = strlen(representation.start()); + int len = StrLength(representation.start()); int i; for (i = len - 1; i >= 0; --i) { if (representation[i] != '0') break; diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc index b9f60383..441aae63 100644 --- a/test/cctest/test-debug.cc +++ b/test/cctest/test-debug.cc @@ -997,7 +997,7 @@ TEST(DebugStub) { CheckDebugBreakFunction(&env, "function f2(){x=1;}", "f2", 0, - v8::internal::RelocInfo::CODE_TARGET, + v8::internal::RelocInfo::CODE_TARGET_CONTEXT, Builtins::builtin(Builtins::StoreIC_DebugBreak)); CheckDebugBreakFunction(&env, "function f3(){var a=x;}", "f3", diff --git a/test/cctest/test-disasm-arm.cc b/test/cctest/test-disasm-arm.cc index c375831f..dea0db92 100644 --- a/test/cctest/test-disasm-arm.cc +++ b/test/cctest/test-disasm-arm.cc @@ -435,6 +435,11 @@ TEST(Vfp) { COMPARE(vmov(s31, r10), "ee0faa90 vmov s31, r10"); + COMPARE(vabs(d0, d1), + "eeb00bc1 vabs d0, d1"); + COMPARE(vabs(d3, d4, mi), + "4eb03bc4 vabsmi d3, d4"); + COMPARE(vadd(d0, d1, d2), "ee310b02 vadd.f64 d0, d1, d2"); COMPARE(vadd(d3, d4, d5, mi), diff --git a/test/cctest/test-disasm-ia32.cc b/test/cctest/test-disasm-ia32.cc index 30d708e4..c995aa8e 100644 --- a/test/cctest/test-disasm-ia32.cc +++ b/test/cctest/test-disasm-ia32.cc @@ -446,6 +446,14 @@ TEST(DisasmIa320) { } } + { + if (CpuFeatures::IsSupported(SSE4_1)) { + CpuFeatures::Scope scope(SSE4_1); + __ pextrd(Operand(eax), xmm0, 1); + __ pinsrd(xmm1, Operand(eax), 0); + } + } + __ ret(0); CodeDesc desc; diff --git a/test/cctest/test-dtoa.cc b/test/cctest/test-dtoa.cc index ff0b6607..66c2aafc 100644 --- a/test/cctest/test-dtoa.cc +++ b/test/cctest/test-dtoa.cc @@ -44,7 +44,7 @@ using namespace v8::internal; // Removes trailing '0' digits. static void TrimRepresentation(Vector<char> representation) { - int len = strlen(representation.start()); + int len = StrLength(representation.start()); int i; for (i = len - 1; i >= 0; --i) { if (representation[i] != '0') break; diff --git a/test/cctest/test-fast-dtoa.cc b/test/cctest/test-fast-dtoa.cc index 30d24765..d311713c 100644 --- a/test/cctest/test-fast-dtoa.cc +++ b/test/cctest/test-fast-dtoa.cc @@ -19,7 +19,7 @@ static const int kBufferSize = 100; // Removes trailing '0' digits. static void TrimRepresentation(Vector<char> representation) { - int len = strlen(representation.start()); + int len = StrLength(representation.start()); int i; for (i = len - 1; i >= 0; --i) { if (representation[i] != '0') break; diff --git a/test/cctest/test-log.cc b/test/cctest/test-log.cc index 503e0cf7..032a1836 100644 --- a/test/cctest/test-log.cc +++ b/test/cctest/test-log.cc @@ -1074,6 +1074,21 @@ static bool AreFuncNamesEqual(CodeEntityInfo ref_s, CodeEntityInfo new_s) { return true; } } + // Code objects can change their optimizability: code object may start + // as optimizable, but later be discovered to be actually not optimizable. + // Alas, we don't record this info as of now, so we allow cases when + // ref is thought to be optimizable while traverse finds it to be + // not optimizable. + if (ref_s[1] == '~') { // Code object used to be optimizable + if (new_s[1] == ' ') { // ...but later was set unoptimizable. + CHECK_EQ('"', ref_s[0]); + CHECK_EQ('"', new_s[0]); + ref_s += 2; // Cut the leading quote and the marker + ref_len -= 2; + new_s += 1; // Cut the leading quote only. + new_len -= 1; + } + } return ref_len == new_len && strncmp(ref_s, new_s, ref_len) == 0; } diff --git a/test/cctest/test-strtod.cc b/test/cctest/test-strtod.cc index f5547dbc..da6b07bb 100644 --- a/test/cctest/test-strtod.cc +++ b/test/cctest/test-strtod.cc @@ -324,6 +324,25 @@ TEST(Strtod) { StrtodChar("5708990770823839207320493820740630171355185151999", -3)); CHECK_EQ(5708990770823839524233143877797980545530986496.0, StrtodChar("5708990770823839207320493820740630171355185152001", -3)); + + // The following test-cases got some public attention in early 2011 when they + // sent Java and PHP into an infinite loop. + CHECK_EQ(2.225073858507201e-308, StrtodChar("22250738585072011", -324)); + CHECK_EQ(2.22507385850720138309e-308, + StrtodChar("22250738585072011360574097967091319759348195463516456480" + "23426109724822222021076945516529523908135087914149158913" + "03962110687008643869459464552765720740782062174337998814" + "10632673292535522868813721490129811224514518898490572223" + "07285255133155755015914397476397983411801999323962548289" + "01710708185069063066665599493827577257201576306269066333" + "26475653000092458883164330377797918696120494973903778297" + "04905051080609940730262937128958950003583799967207254304" + "36028407889577179615094551674824347103070260914462157228" + "98802581825451803257070188608721131280795122334262883686" + "22321503775666622503982534335974568884423900265498198385" + "48794829220689472168983109969836584681402285424333066033" + "98508864458040010349339704275671864433837704860378616227" + "71738545623065874679014086723327636718751", -1076)); } diff --git a/test/es5conform/es5conform.status b/test/es5conform/es5conform.status index a51bd302..39754ca5 100644 --- a/test/es5conform/es5conform.status +++ b/test/es5conform/es5conform.status @@ -41,17 +41,9 @@ chapter10/10.4/10.4.2/10.4.2-2-c-1: FAIL_OK # We are compatible with Safari and Firefox. chapter11/11.1/11.1.5: UNIMPLEMENTED -# Delete returns true in eval even when it should return false. -# Please see http://code.google.com/p/v8/issues/detail?id=759 -chapter11/11.4/11.4.1//11.4.1-4.a-5: FAIL -chapter11/11.4/11.4.1//11.4.1-4.a-7: FAIL - # We do not have a global object called 'global' as required by tests. chapter15/15.1: FAIL_OK -# NOT IMPLEMENTED: bind -chapter15/15.2/15.2.3/15.2.3.3/15.2.3.3-4-38: UNIMPLEMENTED - # NaN is writable. We are compatible with JSC. chapter15/15.2/15.2.3/15.2.3.3/15.2.3.3-4-178: FAIL_OK # Infinity is writable. We are compatible with JSC. @@ -99,7 +91,7 @@ chapter15/15.2/15.2.3/15.2.3.4/15.2.3.4-4-2: FAIL_OK # SUBSETFAIL chapter15/15.2/15.2.3/15.2.3.4/15.2.3.4-4-3: FAIL_OK -# SUBSETFAIL + we do not implement Function.prototype.bind. +# SUBSETFAIL chapter15/15.2/15.2.3/15.2.3.4/15.2.3.4-4-4: FAIL_OK # SUBSETFAIL @@ -180,9 +172,6 @@ chapter15/15.2/15.2.3/15.2.3.4/15.2.3.4-4-34: FAIL_OK # SUBSETFAIL chapter15/15.2/15.2.3/15.2.3.4/15.2.3.4-4-35: FAIL_OK -# NOT IMPLEMENTED: bind on Function.prototype. -chapter15/15.3/15.3.4/15.3.4.5/15.3.4.5-0-1: UNIMPLEMENTED - # Bad test - the spec does not say anything about throwing errors # on calling Array.prototype.indexOf with undefined as argument. chapter15/15.4/15.4.4/15.4.4.14/15.4.4.14-1-1: FAIL_OK @@ -240,6 +229,263 @@ chapter15/15.10/15.10.7/15.10.7.4/15.10.7.4-2: FAIL_OK chapter15/15.10/15.10.7/15.10.7.5/15.10.7.5-1: FAIL_OK chapter15/15.10/15.10.7/15.10.7.5/15.10.7.5-2: FAIL_OK +############################################################################## +# Unimplemented parts of strict mode +# Setting expectations to fail only so that the tests trigger as soon as +# the strict mode feature gets implemented + +# A directive preceeding an 'use strict' directive may not contain +# an OctalEscapeSequence +# Incorrect test - need double escape in eval. +chapter07/7.8/7.8.4/7.8.4-1-s: FAIL + +# this is not coerced to an object in strict mode (Number) +chapter10/10.4/10.4.3/10.4.3-1-1-s: FAIL +# this is not coerced to an object in strict mode (string) +chapter10/10.4/10.4.3/10.4.3-1-2-s: FAIL +# this is not coerced to an object in strict mode (undefined) +chapter10/10.4/10.4.3/10.4.3-1-3-s: FAIL +# this is not coerced to an object in strict mode (boolean) +chapter10/10.4/10.4.3/10.4.3-1-4-s: FAIL + +# arguments[i] remains same after changing actual parameters in strict mode +chapter10/10.6/10.6-10-c-ii-1-s: FAIL +# arguments[i] doesn't map to actual parameters in strict mode +chapter10/10.6/10.6-10-c-ii-2-s: FAIL + +# Accessing caller property of Arguments object throws TypeError in strict mode +chapter10/10.6/10.6-13-b-1-s: FAIL +# arguments.caller exists in strict mode +chapter10/10.6/10.6-13-b-2-s: FAIL +# arguments.caller is non-configurable in strict mode +chapter10/10.6/10.6-13-b-3-s: FAIL +# Accessing callee property of Arguments object throws TypeError in strict mode +chapter10/10.6/10.6-13-c-1-s: FAIL +# arguments.callee is non-configurable in strict mode +chapter10/10.6/10.6-13-c-3-s: FAIL + +# simple assignment throws TypeError if LeftHandSide is a property reference +# with a primitive base value (this is undefined) +chapter11/11.13/11.13.1/11.13.1-1-7-s: FAIL + +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Global.NaN) +chapter11/11.13/11.13.1/11.13.1-4-2-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Global.Infinity) +chapter11/11.13/11.13.1/11.13.1-4-3-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Global.length) +chapter11/11.13/11.13.1/11.13.1-4-4-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Object.length) +chapter11/11.13/11.13.1/11.13.1-4-5-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Function.length) +chapter11/11.13/11.13.1/11.13.1-4-6-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Array.length) +chapter11/11.13/11.13.1/11.13.1-4-7-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (String.length) +chapter11/11.13/11.13.1/11.13.1-4-8-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Boolean.length) +chapter11/11.13/11.13.1/11.13.1-4-9-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.length) +chapter11/11.13/11.13.1/11.13.1-4-10-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Date.length) +chapter11/11.13/11.13.1/11.13.1-4-11-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (RegExp.length) +chapter11/11.13/11.13.1/11.13.1-4-12-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Error.length) +chapter11/11.13/11.13.1/11.13.1-4-13-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.MAX_VALUE) +chapter11/11.13/11.13.1/11.13.1-4-14-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.MIN_VALUE) +chapter11/11.13/11.13.1/11.13.1-4-15-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.NaN) +chapter11/11.13/11.13.1/11.13.1-4-16-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.NEGATIVE_INFINITY) +chapter11/11.13/11.13.1/11.13.1-4-17-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.POSITIVE_INFINITY) +chapter11/11.13/11.13.1/11.13.1-4-18-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.E) +chapter11/11.13/11.13.1/11.13.1-4-19-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LN10) +chapter11/11.13/11.13.1/11.13.1-4-20-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LN2) +chapter11/11.13/11.13.1/11.13.1-4-21-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LOG2E) +chapter11/11.13/11.13.1/11.13.1-4-22-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LOG10E) +chapter11/11.13/11.13.1/11.13.1-4-23-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.PI) +chapter11/11.13/11.13.1/11.13.1-4-24-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.SQRT1_2) +chapter11/11.13/11.13.1/11.13.1-4-25-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.SQRT2) +chapter11/11.13/11.13.1/11.13.1-4-26-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Global.undefined) +chapter11/11.13/11.13.1/11.13.1-4-27-s: FAIL + +# delete operator throws TypeError when deleting a non-configurable data +# property in strict mode +chapter11/11.4/11.4.1/11.4.1-4.a-3-s: FAIL +# delete operator throws TypeError when when deleting a non-configurable +# data property in strict mode (Global.NaN) +chapter11/11.4/11.4.1/11.4.1-4.a-4-s: FAIL +# delete operator throws TypeError when deleting a non-configurable data +# property in strict mode (Math.LN2) +chapter11/11.4/11.4.1/11.4.1-4.a-9-s: FAIL + +# delete operator throws ReferenceError when deleting a direct reference +# to a var in strict mode +chapter11/11.4/11.4.1/11.4.1-5-1-s: FAIL +# delete operator throws ReferenceError when deleting a direct reference +# to a function argument in strict mode +chapter11/11.4/11.4.1/11.4.1-5-2-s: FAIL +# delete operator throws ReferenceError when deleting a direct reference +# to a function name in strict mode +chapter11/11.4/11.4.1/11.4.1-5-3-s: FAIL +# delete operator throws SyntaxError when deleting a direct reference +# to a function argument(object) in strict mode +chapter11/11.4/11.4.1/11.4.1-5-4-s: FAIL + +# eval - a function declaring a var named 'eval' throws EvalError in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-1-s: FAIL +# eval - a function assigning into 'eval' throws EvalError in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-2-s: FAIL +# eval - a function expr declaring a var named 'eval' throws EvalError +# in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-3-s: FAIL +# eval - a function expr assigning into 'eval' throws a EvalError in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-4-s: FAIL +# eval - a Function declaring var named 'eval' throws EvalError in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-5-s: FAIL +# eval - a Function assigning into 'eval' throws EvalError in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-6-s: FAIL +# eval - a direct eval declaring a var named 'eval' throws EvalError +# in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-7-s: FAIL +# eval - a direct eval assigning into 'eval' throws EvalError in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-8-s: FAIL +# eval - an indirect eval declaring a var named 'eval' throws EvalError +# in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-9-s: FAIL +# eval - an indirect eval assigning into 'eval' throws EvalError in strict mode +# Invalid test case. SyntaxError should be expected instead of EvalError. +chapter12/12.2/12.2.1/12.2.1-10-s: FAIL + +# SyntaxError if eval used as function identifier in function declaration +# with strict body +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-3-s: FAIL +# SyntaxError if eval used as function identifier in function expression +# with strict body +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-4-s: FAIL +# SyntaxError if eval used as function identifier in function declaration +# in strict code +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-5-s: FAIL +# SyntaxError if eval used as function identifier in function expression +# in strict code +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-6-s: FAIL +# SyntaxError if arguments used as function identifier in function declaration +# with strict body +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-9-s: FAIL +# SyntaxError if arguments used as function identifier in function expression +# with strict body +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-10-s: FAIL +# SyntaxError if arguments used as function identifier in function declaration +# in strict code +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-11-s: FAIL +# SyntaxError if arguments used as function identifier in function expression +# in strict code +# Test fails to return true on success (invalid test case). +chapter13/13.1/13.1-3-12-s: FAIL + +# 'use strict' directive - correct usage +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-1-s: FAIL +# "use strict" directive - correct usage double quotes +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-2-s: FAIL +# 'use strict' directive - may follow other directives +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-8-s: FAIL +# 'use strict' directive - may occur multiple times +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-9-s: FAIL +# other directives - may follow 'use strict' directive +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-10-s: FAIL +# comments may preceed 'use strict' directive +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-11-s: FAIL +# comments may follow 'use strict' directive +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-12-s: FAIL +# semicolon insertion works for'use strict' directive +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-13-s: FAIL +# semicolon insertion may come before 'use strict' directive +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-14-s: FAIL +# blank lines may come before 'use strict' directive +# depends on "this is not coerced to an object in strict mode (undefined)" +chapter14/14.1/14.1-15-s: FAIL + +# Duplicate combined parameter name allowed in Function constructor called +# in strict mode if body not strict +# Test fails to return true on success (invalid test case). +chapter15/15.3/15.3.2/15.3.2.1/15.3.2.1-11-6-s: FAIL + +# Array.prototype.every - thisArg not passed to strict callbackfn +chapter15/15.4/15.4.4/15.4.4.16/15.4.4.16-5-1-s: FAIL +# Array.prototype.some - thisArg not passed to strict callbackfn +chapter15/15.4/15.4.4/15.4.4.17/15.4.4.17-5-1-s: FAIL +# Array.prototype.forEach - thisArg not passed to strict callbackfn +chapter15/15.4/15.4.4/15.4.4.18/15.4.4.18-5-1-s: FAIL +# Array.prototype.map - thisArg not passed to strict callbackfn +chapter15/15.4/15.4.4/15.4.4.19/15.4.4.19-5-1-s: FAIL +# Array.prototype.filter - thisArg not passed to strict callbackfn +chapter15/15.4/15.4.4/15.4.4.20/15.4.4.20-5-1-s: FAIL +# Array.prototype.reduce - null passed as thisValue to strict callbackfn +chapter15/15.4/15.4.4/15.4.4.21/15.4.4.21-9-c-ii-4-s: FAIL + [ $arch == mips ] # Skip all tests on MIPS. diff --git a/test/mjsunit/array-splice.js b/test/mjsunit/array-splice.js index 68dd9b2b..0e307b5d 100644 --- a/test/mjsunit/array-splice.js +++ b/test/mjsunit/array-splice.js @@ -339,6 +339,20 @@ })(); +// Check the case of JS builtin .splice() +(function() { + for (var i = 0; i < 7; i++) { + var array = [1, 2, 3, 4]; + Array.prototype[3] = 'foo'; // To force JS builtin. + + var spliced = array.splice(); + + assertEquals([], spliced); + assertEquals([1, 2, 3, 4], array); + } +})(); + + // Check the behaviour when approaching maximal values for length. (function() { for (var i = 0; i < 7; i++) { diff --git a/test/mjsunit/compiler/literals.js b/test/mjsunit/compiler/literals.js index d846cf5b..e910bb3c 100644 --- a/test/mjsunit/compiler/literals.js +++ b/test/mjsunit/compiler/literals.js @@ -88,3 +88,6 @@ assertEquals(17, eval('[1,2,3,4]; 17')); assertEquals(19, eval('var a=1, b=2; [a,b,3,4]; 19')); assertEquals(23, eval('var a=1, b=2; c=23; [a,b,3,4]; c')); +// Test that literals work for non-smi indices. +// Ensure hash-map collision if using value as hash. +var o = {"2345678901" : 42, "2345678901" : 30}; diff --git a/test/mjsunit/compiler/regress-1085.js b/test/mjsunit/compiler/regress-1085.js new file mode 100644 index 00000000..5d787a45 --- /dev/null +++ b/test/mjsunit/compiler/regress-1085.js @@ -0,0 +1,35 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// Test correct checks for negative zero. +// This test relies on specific type feedback for Math.min. +function f(x) { return 1 / Math.min(1, x); } + +for (var i=0; i<1000000; i++) f(1); + +assertEquals(-Infinity, f(-0)); diff --git a/test/mjsunit/compiler/regress-arguments.js b/test/mjsunit/compiler/regress-arguments.js index 234d3fbc..ebae5a03 100644 --- a/test/mjsunit/compiler/regress-arguments.js +++ b/test/mjsunit/compiler/regress-arguments.js @@ -46,4 +46,7 @@ function u() { return f.apply(v, arguments); } -for (var i=0; i<1000000; i++) assertEquals(void 0, u()); +Number.prototype.foo = 42; +delete Number.prototype.foo; + +for (var i=0; i<100000; i++) assertEquals(void 0, u()); diff --git a/test/mjsunit/cyclic-error-to-string.js b/test/mjsunit/cyclic-error-to-string.js new file mode 100644 index 00000000..2502b534 --- /dev/null +++ b/test/mjsunit/cyclic-error-to-string.js @@ -0,0 +1,46 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test printing of cyclic errors which return the empty string for +// compatibility with Safari and Firefox. + +var e = new Error(); +assertEquals('Error', e + ''); + +e = new Error(); +e.name = e; +e.message = e; +e.stack = e; +e.arguments = e; +assertEquals(': ', e + ''); + +e = new Error(); +e.name = [ e ]; +e.message = [ e ]; +e.stack = [ e ]; +e.arguments = [ e ]; +assertEquals(': ', e + ''); diff --git a/test/mjsunit/debug-backtrace-text.js b/test/mjsunit/debug-backtrace-text.js index 67c67466..61648fa4 100644 --- a/test/mjsunit/debug-backtrace-text.js +++ b/test/mjsunit/debug-backtrace-text.js @@ -80,9 +80,9 @@ function listener(event, exec_state, event_data, data) { // 1: Call distance on Point where distance is a direct property // 2: Call on function an array element 2 // 3: [anonymous] - assertEquals("#<a Point>.distanceTo(p=#<a Point>)", exec_state.frame(0).invocationText()); - assertEquals("#<a Point>.distanceTo(p=#<a Point>)", exec_state.frame(1).invocationText()); - assertEquals("#<an Array>[2](aka distance)(p=#<a Point>, q=#<a Point>)", exec_state.frame(2).invocationText()); + assertEquals("#<Point>.distanceTo(p=#<Point>)", exec_state.frame(0).invocationText()); + assertEquals("#<Point>.distanceTo(p=#<Point>)", exec_state.frame(1).invocationText()); + assertEquals("#<Array>[2](aka distance)(p=#<Point>, q=#<Point>)", exec_state.frame(2).invocationText()); assertEquals("[anonymous]()", exec_state.frame(3).invocationText()); listenerCalled = true; } else { diff --git a/test/mjsunit/delete-global-properties.js b/test/mjsunit/delete-global-properties.js index b3813dc1..2acf5916 100644 --- a/test/mjsunit/delete-global-properties.js +++ b/test/mjsunit/delete-global-properties.js @@ -1,4 +1,4 @@ -// Copyright 2008 the V8 project authors. All rights reserved. +// Copyright 2011 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -32,6 +32,17 @@ assertFalse(delete tmp); // should be DONT_DELETE assertTrue("tmp" in this); function f() { return 1; } assertFalse(delete f); // should be DONT_DELETE -assertEquals(1, f()); +assertEquals(1, f()); -/* Perhaps related to bugs/11? */ +// Check that deleting and reintroducing global variables works. +// Get into the IC case for storing to a deletable global property. +function introduce_x() { x = 42; } +for (var i = 0; i < 10; i++) introduce_x(); +// Check that the property has been introduced. +assertTrue(this.hasOwnProperty('x')); +// Check that deletion works. +delete x; +assertFalse(this.hasOwnProperty('x')); +// Check that reintroduction works. +introduce_x(); +assertTrue(this.hasOwnProperty('x')); diff --git a/test/mjsunit/get-own-property-descriptor.js b/test/mjsunit/get-own-property-descriptor.js index ceb77153..79c1fac6 100644 --- a/test/mjsunit/get-own-property-descriptor.js +++ b/test/mjsunit/get-own-property-descriptor.js @@ -103,3 +103,19 @@ objWithProto.prototype = proto; objWithProto[0] = 'bar'; var descWithProto = Object.getOwnPropertyDescriptor(objWithProto, '10'); assertEquals(undefined, descWithProto); + +// Test elements on global proxy object. +var global = (function() { return this; })(); + +global[42] = 42; + +function el_getter() { return 239; }; +function el_setter() {}; +Object.defineProperty(global, '239', {get: el_getter, set: el_setter}); + +var descRegularElement = Object.getOwnPropertyDescriptor(global, '42'); +assertEquals(42, descRegularElement.value); + +var descAccessorElement = Object.getOwnPropertyDescriptor(global, '239'); +assertEquals(el_getter, descAccessorElement.get); +assertEquals(el_setter, descAccessorElement.set); diff --git a/test/mjsunit/getter-in-prototype.js b/test/mjsunit/getter-in-prototype.js index dd26c533..5563123e 100644 --- a/test/mjsunit/getter-in-prototype.js +++ b/test/mjsunit/getter-in-prototype.js @@ -31,9 +31,11 @@ var o = {}; var p = {}; p.__defineGetter__('x', function(){}); +p.__defineGetter__(0, function(){}); o.__proto__ = p; assertThrows("o.x = 42"); +assertThrows("o[0] = 42"); function f() { with(o) { @@ -48,3 +50,9 @@ function g() { x = 42; } assertThrows("g()"); + +__proto__ = p; +function g2() { + this[0] = 42; +} +assertThrows("g2()"); diff --git a/test/mjsunit/json.js b/test/mjsunit/json.js index a0be8dd1..812ffeb5 100644 --- a/test/mjsunit/json.js +++ b/test/mjsunit/json.js @@ -415,3 +415,17 @@ var falseNum = Object("37"); falseNum.__proto__ = Number.prototype; falseNum.toString = function() { return 42; }; assertEquals('"42"', JSON.stringify(falseNum)); + +// We don't currently allow plain properties called __proto__ in JSON +// objects in JSON.parse. Instead we read them as we would JS object +// literals. If we change that, this test should change with it. +// +// Parse a non-object value as __proto__. This must not create a +// __proto__ property different from the original, and should not +// change the original. +var o = JSON.parse('{"__proto__":5}'); +assertEquals(Object.prototype, o.__proto__); // __proto__ isn't changed. +assertEquals(0, Object.keys(o).length); // __proto__ isn't added as enumerable. + + + diff --git a/test/mjsunit/math-pow.js b/test/mjsunit/math-pow.js index e732955c..30d0cbdc 100644 --- a/test/mjsunit/math-pow.js +++ b/test/mjsunit/math-pow.js @@ -58,10 +58,11 @@ assertEquals(Infinity, Math.pow(-1.1, Infinity)); assertEquals(Infinity, Math.pow(2, Infinity)); assertEquals(Infinity, Math.pow(-2, Infinity)); -assertEquals(+0, Math.pow(1.1, -Infinity)); -assertEquals(+0, Math.pow(-1.1, -Infinity)); -assertEquals(+0, Math.pow(2, -Infinity)); -assertEquals(+0, Math.pow(-2, -Infinity)); +// Because +0 == -0, we need to compare 1/{+,-}0 to {+,-}Infinity +assertEquals(+Infinity, 1/Math.pow(1.1, -Infinity)); +assertEquals(+Infinity, 1/Math.pow(-1.1, -Infinity)); +assertEquals(+Infinity, 1/Math.pow(2, -Infinity)); +assertEquals(+Infinity, 1/Math.pow(-2, -Infinity)); assertEquals(NaN, Math.pow(1, Infinity)); assertEquals(NaN, Math.pow(1, -Infinity)); @@ -81,8 +82,8 @@ assertEquals(Infinity, Math.pow(-0.999, -Infinity)); assertEquals(Infinity, Math.pow(Infinity, 0.1)); assertEquals(Infinity, Math.pow(Infinity, 2)); -assertEquals(+0, Math.pow(Infinity, -0.1)); -assertEquals(+0, Math.pow(Infinity, -2)); +assertEquals(+Infinity, 1/Math.pow(Infinity, -0.1)); +assertEquals(+Infinity, 1/Math.pow(Infinity, -2)); assertEquals(-Infinity, Math.pow(-Infinity, 3)); assertEquals(-Infinity, Math.pow(-Infinity, 13)); @@ -90,23 +91,23 @@ assertEquals(-Infinity, Math.pow(-Infinity, 13)); assertEquals(Infinity, Math.pow(-Infinity, 3.1)); assertEquals(Infinity, Math.pow(-Infinity, 2)); -assertEquals(-0, Math.pow(-Infinity, -3)); -assertEquals(-0, Math.pow(-Infinity, -13)); +assertEquals(-Infinity, 1/Math.pow(-Infinity, -3)); +assertEquals(-Infinity, 1/Math.pow(-Infinity, -13)); -assertEquals(+0, Math.pow(-Infinity, -3.1)); -assertEquals(+0, Math.pow(-Infinity, -2)); +assertEquals(+Infinity, 1/Math.pow(-Infinity, -3.1)); +assertEquals(+Infinity, 1/Math.pow(-Infinity, -2)); -assertEquals(+0, Math.pow(+0, 1.1)); -assertEquals(+0, Math.pow(+0, 2)); +assertEquals(+Infinity, 1/Math.pow(+0, 1.1)); +assertEquals(+Infinity, 1/Math.pow(+0, 2)); assertEquals(Infinity, Math.pow(+0, -1.1)); assertEquals(Infinity, Math.pow(+0, -2)); -assertEquals(-0, Math.pow(-0, 3)); -assertEquals(-0, Math.pow(-0, 13)); +assertEquals(-Infinity, 1/Math.pow(-0, 3)); +assertEquals(-Infinity, 1/Math.pow(-0, 13)); -assertEquals(+0, Math.pow(-0, 3.1)); -assertEquals(+0, Math.pow(-0, 2)); +assertEquals(+Infinity, 1/Math.pow(-0, 3.1)); +assertEquals(+Infinity, 1/Math.pow(-0, 2)); assertEquals(-Infinity, Math.pow(-0, -3)); assertEquals(-Infinity, Math.pow(-0, -13)); @@ -123,6 +124,18 @@ assertEquals(NaN, Math.pow(-2, -1.1)); assertEquals(NaN, Math.pow(-1000, 1.1)); assertEquals(NaN, Math.pow(-1000, -1.1)); +assertEquals(+Infinity, 1/Math.pow(-0, 0.5)); +assertEquals(+Infinity, 1/Math.pow(-0, 0.6)); +assertEquals(-Infinity, 1/Math.pow(-0, 1)); +assertEquals(-Infinity, 1/Math.pow(-0, 10000000001)); + +assertEquals(+Infinity, Math.pow(-0, -0.5)); +assertEquals(+Infinity, Math.pow(-0, -0.6)); +assertEquals(-Infinity, Math.pow(-0, -1)); +assertEquals(-Infinity, Math.pow(-0, -10000000001)); + + + // Tests from Sputnik S8.5_A13_T1. assertTrue((1*((Math.pow(2,53))-1)*(Math.pow(2,-1074))) === 4.4501477170144023e-308); assertTrue((1*(Math.pow(2,52))*(Math.pow(2,-1074))) === 2.2250738585072014e-308); diff --git a/test/mjsunit/mirror-error.js b/test/mjsunit/mirror-error.js index 4ed8c1b4..9fea17cf 100644 --- a/test/mjsunit/mirror-error.js +++ b/test/mjsunit/mirror-error.js @@ -76,7 +76,7 @@ function testErrorMirror(e) { } assertTrue(found_message, 'Property message not found'); } - + // Check the formatted text (regress 1231579). assertEquals(fromJSON.text, e.toString(), 'toString'); } diff --git a/test/mjsunit/mjsunit.status b/test/mjsunit/mjsunit.status index 39ddf5a4..40127994 100644 --- a/test/mjsunit/mjsunit.status +++ b/test/mjsunit/mjsunit.status @@ -105,6 +105,10 @@ regress/regress-create-exception: SKIP regress/regress-3218915: SKIP regress/regress-3247124: SKIP +# Requires bigger stack size in the Genesis and if stack size is increased, +# the test requires too much time to run. However, the problem test covers +# should be platform-independent. +regress/regress-1132: SKIP ############################################################################## [ $arch == arm && $crankshaft ] @@ -112,6 +116,8 @@ regress/regress-3247124: SKIP # Test that currently fails with crankshaft on ARM. compiler/simple-osr: FAIL +# BUG (1094) +regress/regress-deopt-gc: SKIP ############################################################################## [ $arch == x64 && $crankshaft ] @@ -119,9 +125,8 @@ compiler/simple-osr: FAIL # BUG (1026) This test is currently flaky. compiler/simple-osr: SKIP -# BUG(1049): Currently no deoptimization support. -debug-liveedit-newsource: SKIP -debug-liveedit-1: SKIP +# BUG (1094) +regress/regress-deopt-gc: SKIP ############################################################################## [ $arch == mips ] diff --git a/test/mjsunit/object-define-property.js b/test/mjsunit/object-define-property.js index d24a4e5a..a8a32130 100644 --- a/test/mjsunit/object-define-property.js +++ b/test/mjsunit/object-define-property.js @@ -749,14 +749,33 @@ assertTrue(desc.writable); assertTrue(desc.enumerable); assertFalse(desc.configurable); -// Ensure that we can't overwrite the non configurable element. +// Can use defineProperty to change the value of a non +// configurable property. try { Object.defineProperty(obj6, '2', descElement); + desc = Object.getOwnPropertyDescriptor(obj6, '2'); + assertEquals(desc.value, 'foobar'); +} catch (e) { + assertUnreachable(); +} + +// Ensure that we can't change the descriptor of a +// non configurable property. +try { + var descAccessor = { get: function() { return 0; } }; + Object.defineProperty(obj6, '2', descAccessor); assertUnreachable(); } catch (e) { assertTrue(/Cannot redefine property/.test(e)); } +Object.defineProperty(obj6, '2', descElementNonWritable); +desc = Object.getOwnPropertyDescriptor(obj6, '2'); +assertEquals(desc.value, 'foofoo'); +assertFalse(desc.writable); +assertTrue(desc.enumerable); +assertFalse(desc.configurable); + Object.defineProperty(obj6, '3', descElementNonWritable); desc = Object.getOwnPropertyDescriptor(obj6, '3'); assertEquals(desc.value, 'foofoo'); @@ -827,14 +846,33 @@ assertTrue(desc.writable); assertTrue(desc.enumerable); assertFalse(desc.configurable); -// Ensure that we can't overwrite the non configurable element. +// Can use defineProperty to change the value of a non +// configurable property of an array. try { Object.defineProperty(arr, '2', descElement); + desc = Object.getOwnPropertyDescriptor(arr, '2'); + assertEquals(desc.value, 'foobar'); +} catch (e) { + assertUnreachable(); +} + +// Ensure that we can't change the descriptor of a +// non configurable property. +try { + var descAccessor = { get: function() { return 0; } }; + Object.defineProperty(arr, '2', descAccessor); assertUnreachable(); } catch (e) { assertTrue(/Cannot redefine property/.test(e)); } +Object.defineProperty(arr, '2', descElementNonWritable); +desc = Object.getOwnPropertyDescriptor(arr, '2'); +assertEquals(desc.value, 'foofoo'); +assertFalse(desc.writable); +assertTrue(desc.enumerable); +assertFalse(desc.configurable); + Object.defineProperty(arr, '3', descElementNonWritable); desc = Object.getOwnPropertyDescriptor(arr, '3'); assertEquals(desc.value, 'foofoo'); @@ -898,3 +936,98 @@ Object.defineProperty(o, "x", { writable: false }); assertEquals(undefined, o.x); o.x = 37; assertEquals(undefined, o.x); + +function testDefineProperty(obj, propertyName, desc, resultDesc) { + Object.defineProperty(obj, propertyName, desc); + var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName); + assertEquals(resultDesc.enumerable, actualDesc.enumerable); + assertEquals(resultDesc.configurable, actualDesc.configurable); + if (resultDesc.hasOwnProperty('value')) { + assertEquals(resultDesc.value, actualDesc.value); + assertEquals(resultDesc.writable, actualDesc.writable); + assertFalse(resultDesc.hasOwnProperty('get')); + assertFalse(resultDesc.hasOwnProperty('set')); + } else { + assertEquals(resultDesc.get, actualDesc.get); + assertEquals(resultDesc.set, actualDesc.set); + assertFalse(resultDesc.hasOwnProperty('value')); + assertFalse(resultDesc.hasOwnProperty('writable')); + } +} + +// tests redefining existing property with a generic descriptor +o = { p : 42 }; +testDefineProperty(o, 'p', + { }, + { value : 42, writable : true, enumerable : true, configurable : true }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { enumerable : true }, + { value : 42, writable : true, enumerable : true, configurable : true }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { configurable : true }, + { value : 42, writable : true, enumerable : true, configurable : true }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { enumerable : false }, + { value : 42, writable : true, enumerable : false, configurable : true }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { configurable : false }, + { value : 42, writable : true, enumerable : true, configurable : false }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { enumerable : true, configurable : true }, + { value : 42, writable : true, enumerable : true, configurable : true }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { enumerable : false, configurable : true }, + { value : 42, writable : true, enumerable : false, configurable : true }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { enumerable : true, configurable : false }, + { value : 42, writable : true, enumerable : true, configurable : false }); + +o = { p : 42 }; +testDefineProperty(o, 'p', + { enumerable : false, configurable : false }, + { value : 42, writable : true, enumerable : false, configurable : false }); + +// can make a writable, non-configurable field non-writable +o = { p : 42 }; +Object.defineProperty(o, 'p', { configurable: false }); +testDefineProperty(o, 'p', + { writable: false }, + { value : 42, writable : false, enumerable : true, configurable : false }); + +// redefine of get only property with generic descriptor +o = {}; +Object.defineProperty(o, 'p', + { get : getter1, enumerable: true, configurable: true }); +testDefineProperty(o, 'p', + { enumerable : false, configurable : false }, + { get: getter1, set: undefined, enumerable : false, configurable : false }); + +// redefine of get/set only property with generic descriptor +o = {}; +Object.defineProperty(o, 'p', + { get: getter1, set: setter1, enumerable: true, configurable: true }); +testDefineProperty(o, 'p', + { enumerable : false, configurable : false }, + { get: getter1, set: setter1, enumerable : false, configurable : false }); + +// redefine of set only property with generic descriptor +o = {}; +Object.defineProperty(o, 'p', + { set : setter1, enumerable: true, configurable: true }); +testDefineProperty(o, 'p', + { enumerable : false, configurable : false }, + { get: undefined, set: setter1, enumerable : false, configurable : false }); diff --git a/test/mjsunit/regress/regress-1060.js b/test/mjsunit/regress/regress-1060.js new file mode 100644 index 00000000..8abe178d --- /dev/null +++ b/test/mjsunit/regress/regress-1060.js @@ -0,0 +1,32 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Make sure that we do not record multiple bailouts in the unoptimized code +// for the (shared) .arguments proxy, even for calls. +function f(x) { arguments; return x() + x(); } + +assertEquals("hesthest", f(function () { return "hest"; })); diff --git a/test/mjsunit/regress/regress-1079.js b/test/mjsunit/regress/regress-1079.js new file mode 100644 index 00000000..f3f3ce5b --- /dev/null +++ b/test/mjsunit/regress/regress-1079.js @@ -0,0 +1,45 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Getting the arguments property of an optimized function should not crash, +// even if called through our optimized version of Function.prototype.apply. + +function optimized() { + return unoptimized.apply(null, arguments); +} + +// It's not crucial that this is unoptimized. +function unoptimized() { + with ({}) { + return optimized.arguments; + } +} + +for (var i = 0; i < 100000; ++i) { + assertEquals(3, optimized(1, 2, 3).length); +} + diff --git a/test/mjsunit/regress/regress-1083.js b/test/mjsunit/regress/regress-1083.js new file mode 100644 index 00000000..d231899b --- /dev/null +++ b/test/mjsunit/regress/regress-1083.js @@ -0,0 +1,38 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that changing the generic descriptor flags on a property +// on the global object doesn't break invariants. +Object.defineProperty(this, 'Object', {enumerable:true}); + +var desc = Object.getOwnPropertyDescriptor(this, 'Object'); +assertTrue(desc.enumerable); +assertTrue(desc.configurable); +assertFalse(desc.hasOwnProperty('get')); +assertFalse(desc.hasOwnProperty('set')); +assertTrue(desc.hasOwnProperty('value')); +assertTrue(desc.writable); diff --git a/test/mjsunit/regress/regress-1092.js b/test/mjsunit/regress/regress-1092.js new file mode 100644 index 00000000..0b29231a --- /dev/null +++ b/test/mjsunit/regress/regress-1092.js @@ -0,0 +1,35 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that CodeGenerator::EmitKeyedPropertyAssignment for the start +// of an initialization block doesn't normalize the properties of the +// JSGlobalProxy. +this.w = 0; +this.x = 1; +this.y = 2; +this.z = 3; + diff --git a/test/mjsunit/regress/regress-1099.js b/test/mjsunit/regress/regress-1099.js new file mode 100644 index 00000000..0ed6ede4 --- /dev/null +++ b/test/mjsunit/regress/regress-1099.js @@ -0,0 +1,46 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that LApplyArguments lithium instruction restores context after the call. + +function X() { + var slot = "foo"; return function (a) { return slot === a; } +} + +function Y(x) { + var slot = "bar"; + return function (a) { + x.apply(this, arguments); + return slot === 'bar'; + }; +} + +var y = Y(X()); + +for (var i = 0; i < 1000000; i++) { + assertTrue(y("foo")); +} diff --git a/test/mjsunit/regress/regress-1103.js b/test/mjsunit/regress/regress-1103.js new file mode 100644 index 00000000..4ad25b3b --- /dev/null +++ b/test/mjsunit/regress/regress-1103.js @@ -0,0 +1,32 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that freezing the global object functions correctly and does not +// freeze the global proxy. + +var obj = this; +obj = Object.freeze(obj); diff --git a/test/mjsunit/regress/regress-1104.js b/test/mjsunit/regress/regress-1104.js new file mode 100644 index 00000000..aca0a664 --- /dev/null +++ b/test/mjsunit/regress/regress-1104.js @@ -0,0 +1,37 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A redeclaration of a variable that aliases a parameter and so rewrites to +// an arguments object access should not record duplicate AST IDs for +// bailout. +function test(f) { + function f() {} + function f() {} + return arguments; +} + +test(); diff --git a/test/mjsunit/regress/regress-1105.js b/test/mjsunit/regress/regress-1105.js new file mode 100644 index 00000000..cfe2bd38 --- /dev/null +++ b/test/mjsunit/regress/regress-1105.js @@ -0,0 +1,38 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This should properly catch the exception from the setter triggered +// by the loaded file, and it should not fail an assertion in debug mode. + +__defineSetter__("x", function(){ throw 42; }); + +try { + this.eval('function x(){}'); + assertUnreachable(); +} catch (e) { + assertEquals(42, e); +} diff --git a/test/mjsunit/regress/regress-1106.js b/test/mjsunit/regress/regress-1106.js new file mode 100644 index 00000000..382fd1ba --- /dev/null +++ b/test/mjsunit/regress/regress-1106.js @@ -0,0 +1,50 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test for issue 1106, where the optimizing compiler broke when accessing +// a property lying on a prototype of the global object, and that prototype +// object was in dictionary mode. + +x = Object.prototype; +x.foo = 3; +x.bar = 4; +delete x.foo; +x.foo = 5; + +function f() { return foo; } + +for (i=0 ; i < 100000; ++i) { + assertEquals(5, f()); +} + +// Test calls on functions defined in the prototype of the global object. +x.gee = function() { return 42; } +function g() { return gee(); } + +for (i=0 ; i < 100000; ++i) { + assertEquals(42, g()); +} diff --git a/test/mjsunit/regress/regress-1107.js b/test/mjsunit/regress/regress-1107.js new file mode 100644 index 00000000..4ba277a2 --- /dev/null +++ b/test/mjsunit/regress/regress-1107.js @@ -0,0 +1,32 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that even if we cannot set element 0 on all the objects, we still +// can format exception messages to some extent. + +Object.prototype.__defineGetter__(0, function(){}); +assertThrows("x"); diff --git a/test/mjsunit/regress/regress-1110.js b/test/mjsunit/regress/regress-1110.js new file mode 100644 index 00000000..204a87ba --- /dev/null +++ b/test/mjsunit/regress/regress-1110.js @@ -0,0 +1,38 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that the illegal continue is thrown at parse time. + +try { + function Crash() { continue;if (Crash) { + } } + Crash(); + assertTrue(false); +} catch (e) { + assertTrue(e instanceof SyntaxError); + assertTrue(/continue/.test(e.message)); +} diff --git a/test/mjsunit/regress/regress-1112.js b/test/mjsunit/regress/regress-1112.js new file mode 100644 index 00000000..d780106b --- /dev/null +++ b/test/mjsunit/regress/regress-1112.js @@ -0,0 +1,36 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Regression test making sure that defineProperty on the global proxy +// defines the property on the global object. + +Object.defineProperty(this, + 1, + { configurable: true, enumerable: true, value: 3 }); +assertEquals(3, this[1]); +assertTrue(this.hasOwnProperty("1")); + diff --git a/test/mjsunit/regress/regress-1117.js b/test/mjsunit/regress/regress-1117.js new file mode 100644 index 00000000..b013a223 --- /dev/null +++ b/test/mjsunit/regress/regress-1117.js @@ -0,0 +1,35 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that we actually return the right value (-0) when we multiply +// constant 0 with a negative integer. + +function foo(y) {return 0 * y; } +for( var i = 0; i< 1000000; i++){ + foo(42); +} +assertEquals(1/foo(-42), -Infinity); diff --git a/test/mjsunit/regress/regress-1118.js b/test/mjsunit/regress/regress-1118.js new file mode 100644 index 00000000..84f96e46 --- /dev/null +++ b/test/mjsunit/regress/regress-1118.js @@ -0,0 +1,50 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// An exception thrown in a function optimized by on-stack replacement (OSR) +// should be able to construct a receiver from all optimized stack frames. + +function A() { } +A.prototype.f = function() { } + +function B() { } + +var o = new A(); + +// This function throws if o does not have an f property, and should not be +// inlined. +function g() { try { return o.f(); } finally { }} + +// This function should be optimized via OSR. +function h() { + while(false) ; + for (var j = 0; j < 5000000; j++) g(); +} + +h(); +o = new B(); +assertThrows("h()"); diff --git a/test/mjsunit/regress/regress-1119.js b/test/mjsunit/regress/regress-1119.js new file mode 100644 index 00000000..484893c9 --- /dev/null +++ b/test/mjsunit/regress/regress-1119.js @@ -0,0 +1,45 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test runtime declaration of properties with var which are intercepted +// by JS accessors. + +__proto__.__defineSetter__("x", function() { hasBeenInvoked = true; }); +__proto__.__defineSetter__("y", function() { throw 'exception'; }); + +var hasBeenInvoked = false; +eval("try { } catch (e) { var x = false; }"); +assertTrue(hasBeenInvoked); + +var exception; +try { + eval("try { } catch (e) { var y = false; }"); + assertUnreachable(); +} catch (e) { + exception = e; +} +assertEquals('exception', exception); diff --git a/test/mjsunit/regress/regress-1120.js b/test/mjsunit/regress/regress-1120.js new file mode 100644 index 00000000..c8c06aa5 --- /dev/null +++ b/test/mjsunit/regress/regress-1120.js @@ -0,0 +1,33 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that retrieving the extensible value for the global object is +// working correctly and does not return the bit from the global proxy map. + +var obj = this; +Object.freeze(obj); +assertFalse(Object.isExtensible(obj)); diff --git a/test/mjsunit/regress/regress-1121.js b/test/mjsunit/regress/regress-1121.js new file mode 100644 index 00000000..0ad29cc9 --- /dev/null +++ b/test/mjsunit/regress/regress-1121.js @@ -0,0 +1,34 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// See: http://code.google.com/p/v8/issues/detail?id=1121 + +// Test that changing Array.prototype.__proto__ keeps Array functions working. + +Array.prototype.__proto__ = null; +// pop has custom call generator, so we need some beefier function. +assertEquals([1, 2, 3], [1, 2, 3].slice()); diff --git a/test/mjsunit/regress/regress-1122.js b/test/mjsunit/regress/regress-1122.js new file mode 100644 index 00000000..7dc9b248 --- /dev/null +++ b/test/mjsunit/regress/regress-1122.js @@ -0,0 +1,55 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that we can handle functions with up to 32766 arguments, and that +// functions with more arguments throw an exception. + +// See http://code.google.com/p/v8/issues/detail?id=1122. + +function function_with_n_args(n) { + test_prefix = 'prefix '; + test_suffix = ' suffix'; + var source = 'test_prefix + (function f('; + for (var arg = 0; arg < n ; arg++) { + if (arg != 0) source += ','; + source += 'arg' + arg; + } + source += ') { return arg' + (n - n % 2) / 2 + '; })('; + for (var arg = 0; arg < n ; arg++) { + if (arg != 0) source += ','; + source += arg; + } + source += ') + test_suffix'; + return eval(source); +} + +assertEquals('prefix 4000 suffix', function_with_n_args(8000)); +assertEquals('prefix 9000 suffix', function_with_n_args(18000)); +assertEquals('prefix 16000 suffix', function_with_n_args(32000)); + +assertThrows("function_with_n_args(35000)"); +assertThrows("function_with_n_args(100000)"); diff --git a/test/mjsunit/regress/regress-1125.js b/test/mjsunit/regress/regress-1125.js new file mode 100644 index 00000000..b0e1cb72 --- /dev/null +++ b/test/mjsunit/regress/regress-1125.js @@ -0,0 +1,41 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test a lot of updates to freshly created contexts. + +function f(x, y) { + with ("abcdefghijxxxxxxxxxx") + var y = {}; +} + +function g() { + f.apply(this, arguments); +} + +for (var i = 0; i < 150000; i++) { + g(i); +} diff --git a/test/mjsunit/regress/regress-1126.js b/test/mjsunit/regress/regress-1126.js new file mode 100644 index 00000000..303583b9 --- /dev/null +++ b/test/mjsunit/regress/regress-1126.js @@ -0,0 +1,35 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This should properly catch the exception from the setter triggered +// by the loaded file, and it should not fail an assertion in debug mode. + +try { + eval('--'); + assertUnreachable(); +} catch (e) { +} diff --git a/test/mjsunit/regress/regress-1129.js b/test/mjsunit/regress/regress-1129.js new file mode 100644 index 00000000..37bf9a81 --- /dev/null +++ b/test/mjsunit/regress/regress-1129.js @@ -0,0 +1,44 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Flags: --verify-heap --expose-gc + +// This should not hit an assertion in debug mode. + +// Create RegExp that is syntactically correct, but throws a stack overflow +// during compilation. +var source = Array(50000).join("(") + "a" + Array(50000).join(")"); +var r = RegExp(source); +try { + // Try to compile in UC16 mode, and drop the exception. + r.test("\x80"); + assertUnreachable(); +} catch (e) { +} + +// Trigger a heap validation. +gc(); diff --git a/test/mjsunit/regress/regress-1130.js b/test/mjsunit/regress/regress-1130.js new file mode 100644 index 00000000..188f3f92 --- /dev/null +++ b/test/mjsunit/regress/regress-1130.js @@ -0,0 +1,38 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that parser errors can be build up correctly even in the presence +// of JS accessors on Object's prototype elements. + +Object.prototype.__defineGetter__(0, function() { throw 42; } ); + +try { + eval("(function() { const x; var x })")(); + assertUnreachable(); +} catch (e) { + assertTrue(e instanceof TypeError); +} diff --git a/test/mjsunit/regress/regress-1131.js b/test/mjsunit/regress/regress-1131.js new file mode 100644 index 00000000..a1af9c90 --- /dev/null +++ b/test/mjsunit/regress/regress-1131.js @@ -0,0 +1,29 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +var nonArray = { length: 4, 0: 42, 2: 37, 0xf7da5000: undefined, 4: 0 }; +Array.prototype.sort.call(nonArray); diff --git a/test/mjsunit/regress/regress-1132.js b/test/mjsunit/regress/regress-1132.js new file mode 100644 index 00000000..4423ecdd --- /dev/null +++ b/test/mjsunit/regress/regress-1132.js @@ -0,0 +1,48 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test the case when exception is thrown from the parser when lazy +// compiling a function. + +// Flags: --stack_size=32 +// NOTE: stack size constant above has been empirically chosen. +// If the test starts to fail in Genesis, consider increasing this constant. + +function test() { + try { + test(1, test(1)); + } catch(e) { + assertFalse(delete e, "deleting catch variable"); + assertEquals(42, e); + } +} + +try { + test(); + assertUnreachable(); +} catch (e) { +} diff --git a/test/mjsunit/regress/regress-1150.js b/test/mjsunit/regress/regress-1150.js new file mode 100644 index 00000000..57f739a4 --- /dev/null +++ b/test/mjsunit/regress/regress-1150.js @@ -0,0 +1,33 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test that Object.keys is working correctly on the global object. + +var a = 10; +var global = (function () { return this; }) (); +var keys = Object.keys(global); +assertTrue(keys.indexOf("a") > 0); diff --git a/test/mjsunit/regress/regress-3408144.js b/test/mjsunit/regress/regress-3408144.js new file mode 100644 index 00000000..6e292d63 --- /dev/null +++ b/test/mjsunit/regress/regress-3408144.js @@ -0,0 +1,37 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test incorrect code generation for alternations on ARM. + + +// Flags: --nofull-compiler + +function foo() { + return (0 > ("10"||10) - 1); +} + +assertFalse(foo()); diff --git a/test/mjsunit/regress/regress-70066.js b/test/mjsunit/regress/regress-70066.js new file mode 100644 index 00000000..b8386a70 --- /dev/null +++ b/test/mjsunit/regress/regress-70066.js @@ -0,0 +1,146 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Regression test for Chromium issue 70066. Delete should work properly +// from inside 'with' scopes. +// http://code.google.com/p/chromium/issues/detail?id=70066 + +x = 0; + +// Delete on a slot from a function's own context. +function test1() { + var value = 1; + var status; + with ({}) { status = delete value; } + return value + ":" + status; +} + +assertEquals("1:false", test1(), "test1"); +assertEquals(0, x, "test1"); // Global x is undisturbed. + + +// Delete on a slot from an outer context. +function test2() { + function f() { + with ({}) { return delete value; } + } + var value = 2; + var status = f(); + return value + ":" + status; +} + +assertEquals("2:false", test2(), "test2"); +assertEquals(0, x, "test2"); // Global x is undisturbed. + + +// Delete on an argument. This hits the same code paths as test5 because +// 'with' forces all parameters to be indirected through the arguments +// object. +function test3(value) { + var status; + with ({}) { status = delete value; } + return value + ":" + status; +} + +assertEquals("undefined:true", test3(3), "test3"); +assertEquals(0, x, "test3"); // Global x is undisturbed. + + +// Delete on an argument from an outer context. This hits the same code +// path as test2. +function test4(value) { + function f() { + with ({}) { return delete value; } + } + var status = f(); + return value + ":" + status; +} + +assertEquals("4:false", test4(4), "test4"); +assertEquals(0, x, "test4"); // Global x is undisturbed. + + +// Delete on an argument found in the arguments object. Such properties are +// normally DONT_DELETE in JavaScript but deletion is allowed by V8. +function test5(value) { + var status; + with ({}) { status = delete value; } + return arguments[0] + ":" + status; +} + +assertEquals("undefined:true", test5(5), "test5"); +assertEquals(0, x, "test5"); // Global x is undisturbed. + +function test6(value) { + function f() { + with ({}) { return delete value; } + } + var status = f(); + return arguments[0] + ":" + status; +} + +assertEquals("undefined:true", test6(6), "test6"); +assertEquals(0, x, "test6"); // Global x is undisturbed. + + +// Delete on a property found on 'with' object. +function test7(object) { + with (object) { return delete value; } +} + +var o = {value: 7}; +assertEquals(true, test7(o), "test7"); +assertEquals(void 0, o.value, "test7"); +assertEquals(0, x, "test7"); // Global x is undisturbed. + + +// Delete on a global property. +function test8() { + with ({}) { return delete x; } +} + +assertEquals(true, test8(), "test8"); +assertThrows("x", "test8"); // Global x should be deleted. + + +// Delete on a property that is not found anywhere. +function test9() { + with ({}) { return delete x; } +} + +assertThrows("x", "test9"); // Make sure it's not there. +assertEquals(true, test9(), "test9"); + + +// Delete on a DONT_DELETE property of the global object. +var y = 10; +function test10() { + with ({}) { return delete y; } +} + +assertEquals(false, test10(), "test10"); +assertEquals(10, y, "test10"); diff --git a/test/mjsunit/regress/regress-71647.js b/test/mjsunit/regress/regress-71647.js new file mode 100644 index 00000000..44510116 --- /dev/null +++ b/test/mjsunit/regress/regress-71647.js @@ -0,0 +1,34 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +var qe = 'object'; + +function g() { + for (var i = 0; i < 10000; i++) typeof i === qe; +} + +g(); diff --git a/test/mjsunit/regress/regress-900966.js b/test/mjsunit/regress/regress-900966.js index acffe750..99603c12 100644 --- a/test/mjsunit/regress/regress-900966.js +++ b/test/mjsunit/regress/regress-900966.js @@ -37,6 +37,8 @@ function f() { } f(); f(); +f(); +f(); assertTrue(2[11] === undefined); Number.prototype[11] = 'y'; diff --git a/test/mjsunit/regress/regress-992.js b/test/mjsunit/regress/regress-992.js new file mode 100644 index 00000000..dbe25a5f --- /dev/null +++ b/test/mjsunit/regress/regress-992.js @@ -0,0 +1,43 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Object.defineProperty with generic desc on existing property +// should just update enumerable/configurable flags. + +var obj = { get p() { return 42; } }; +var desc = Object.getOwnPropertyDescriptor(obj, 'p'); +var getter = desc.get; + +Object.defineProperty(obj, 'p', {enumerable: false }); +assertEquals(obj.p, 42); +desc = Object.getOwnPropertyDescriptor(obj, 'p'); +assertFalse(desc.enumerable); +assertTrue(desc.configurable); +assertEquals(desc.get, getter); +assertEquals(desc.set, undefined); +assertFalse(desc.hasOwnProperty('value')); +assertFalse(desc.hasOwnProperty('writable')); diff --git a/test/mjsunit/regress/regress-deopt-gc.js b/test/mjsunit/regress/regress-deopt-gc.js new file mode 100644 index 00000000..7b7c29a3 --- /dev/null +++ b/test/mjsunit/regress/regress-deopt-gc.js @@ -0,0 +1,49 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Flags: --allow-natives-syntax --expose-gc + +// This tests that we can correctly handle a GC immediately after a function +// has been deoptimized, even when we have an activation of this function on +// the stack. + +// Ensure that there is code objects before the code for the opt_me function. +(function() { var a = 10; a++; })(); + +function opt_me() { + deopt(); +} + +function deopt() { + // Make sure we don't inline this function + try { var a = 42; } catch(o) {}; + %DeoptimizeFunction(opt_me); + gc(true); +} + + +opt_me(); diff --git a/test/mjsunit/strict-mode-eval.js b/test/mjsunit/strict-mode-eval.js new file mode 100644 index 00000000..018ed9e0 --- /dev/null +++ b/test/mjsunit/strict-mode-eval.js @@ -0,0 +1,82 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"use strict"; + +var code1 = "function f(eval) {}"; +var code2 = "function f(a, a) {}"; +var code3 = "var x = '\\020;'"; +var code4 = "function arguments() {}"; + +// Verify the code compiles just fine in non-strict mode +// (using aliased eval to force non-strict mode) +var eval_alias = eval; + +eval_alias(code1); +eval_alias(code2); +eval_alias(code3); +eval_alias(code4); + +function strict1() { + try { + eval(code1); + assertUnreachable("did not throw exception"); + } catch (e) { + assertInstanceof(e, SyntaxError); + } + + function strict2() { + try { + eval(code2); + assertUnreachable("did not throw exception"); + } catch (e) { + assertInstanceof(e, SyntaxError); + } + + function strict3() { + try { + eval(code3); + assertUnreachable("did not throw exception"); + } catch (e) { + assertInstanceof(e, SyntaxError); + } + + function strict4() { + try { + eval(code4); + assertUnreachable("did not throw exception"); + } catch (e) { + assertInstanceof(e, SyntaxError); + } + } + strict4(); + } + strict3(); + } + strict2(); +} +strict1(); diff --git a/test/mjsunit/strict-mode.js b/test/mjsunit/strict-mode.js new file mode 100644 index 00000000..6b775fcb --- /dev/null +++ b/test/mjsunit/strict-mode.js @@ -0,0 +1,376 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +function CheckStrictMode(code, exception) { + assertDoesNotThrow(code); + assertThrows("'use strict';\n" + code, exception); + assertThrows('"use strict";\n' + code, exception); + assertDoesNotThrow("\ + function outer() {\ + function inner() {\n" + + code + + "\n}\ + }"); + assertThrows("\ + function outer() {\ + 'use strict';\ + function inner() {\n" + + code + + "\n}\ + }", exception); +} + +function CheckFunctionConstructorStrictMode() { + var args = []; + for (var i = 0; i < arguments.length; i ++) { + args[i] = arguments[i]; + } + // Create non-strict function. No exception. + args[arguments.length] = ""; + assertDoesNotThrow(function() { + Function.apply(this, args); + }); + // Create strict mode function. Exception expected. + args[arguments.length] = "'use strict';"; + assertThrows(function() { + Function.apply(this, args); + }, SyntaxError); +} + +// Incorrect 'use strict' directive. +(function UseStrictEscape() { + "use\\x20strict"; + with ({}) {}; +})(); + +// 'use strict' in non-directive position. +(function UseStrictNonDirective() { + void(0); + "use strict"; + with ({}) {}; +})(); + +// Multiple directives, including "use strict". +assertThrows('\ +"directive 1";\ +"another directive";\ +"use strict";\ +"directive after strict";\ +"and one more";\ +with({}) {}', SyntaxError); + +// 'with' disallowed in strict mode. +CheckStrictMode("with({}) {}", SyntaxError); + +// Function named 'eval'. +CheckStrictMode("function eval() {}", SyntaxError); + +// Function named 'arguments'. +CheckStrictMode("function arguments() {}", SyntaxError); + +// Function parameter named 'eval'. +CheckStrictMode("function foo(a, b, eval, c, d) {}", SyntaxError); + +// Function parameter named 'arguments'. +CheckStrictMode("function foo(a, b, arguments, c, d) {}", SyntaxError); + +// Property accessor parameter named 'eval'. +CheckStrictMode("var o = { set foo(eval) {} }", SyntaxError); + +// Property accessor parameter named 'arguments'. +CheckStrictMode("var o = { set foo(arguments) {} }", SyntaxError); + +// Duplicate function parameter name. +CheckStrictMode("function foo(a, b, c, d, b) {}", SyntaxError); + +// Function constructor: eval parameter name. +CheckFunctionConstructorStrictMode("eval"); + +// Function constructor: arguments parameter name. +CheckFunctionConstructorStrictMode("arguments"); + +// Function constructor: duplicate parameter name. +CheckFunctionConstructorStrictMode("a", "b", "c", "b"); +CheckFunctionConstructorStrictMode("a,b,c,b"); + +// catch(eval) +CheckStrictMode("try{}catch(eval){};", SyntaxError); + +// catch(arguments) +CheckStrictMode("try{}catch(arguments){};", SyntaxError); + +// var eval +CheckStrictMode("var eval;", SyntaxError); + +// var arguments +CheckStrictMode("var arguments;", SyntaxError); + +// Strict mode applies to the function in which the directive is used.. +assertThrows('\ +function foo(eval) {\ + "use strict";\ +}', SyntaxError); + +// Strict mode doesn't affect the outer stop of strict code. +(function NotStrict(eval) { + function Strict() { + "use strict"; + } + with ({}) {}; +})(); + +// Octal literal +CheckStrictMode("var x = 012"); +CheckStrictMode("012"); +CheckStrictMode("'Hello octal\\032'"); +CheckStrictMode("function octal() { return 012; }"); +CheckStrictMode("function octal() { return '\\032'; }"); + +(function ValidEscape() { + "use strict"; + var x = '\0'; + var y = "\0"; +})(); + +// Octal before "use strict" +assertThrows('\ + function strict() {\ + "octal\\032directive";\ + "use strict";\ + }', SyntaxError); + +// Duplicate data properties. +CheckStrictMode("var x = { dupe : 1, nondupe: 3, dupe : 2 };", SyntaxError); +CheckStrictMode("var x = { '1234' : 1, '2345' : 2, '1234' : 3 };", SyntaxError); +CheckStrictMode("var x = { '1234' : 1, '2345' : 2, 1234 : 3 };", SyntaxError); +CheckStrictMode("var x = { 3.14 : 1, 2.71 : 2, 3.14 : 3 };", SyntaxError); +CheckStrictMode("var x = { 3.14 : 1, '3.14' : 2 };", SyntaxError); +CheckStrictMode("var x = { 123: 1, 123.00000000000000000000000000000000000000000000000000000000000000000001 : 2 }", SyntaxError); + +// Non-conflicting data properties. +(function StrictModeNonDuplicate() { + "use strict"; + var x = { 123 : 1, "0123" : 2 }; + var x = { 123: 1, '123.00000000000000000000000000000000000000000000000000000000000000000001' : 2 } +})(); + +// Two getters (non-strict) +assertThrows("var x = { get foo() { }, get foo() { } };", SyntaxError); +assertThrows("var x = { get foo(){}, get 'foo'(){}};", SyntaxError); +assertThrows("var x = { get 12(){}, get '12'(){}};", SyntaxError); + +// Two setters (non-strict) +assertThrows("var x = { set foo(v) { }, set foo(v) { } };", SyntaxError); +assertThrows("var x = { set foo(v) { }, set 'foo'(v) { } };", SyntaxError); +assertThrows("var x = { set 13(v) { }, set '13'(v) { } };", SyntaxError); + +// Setter and data (non-strict) +assertThrows("var x = { foo: 'data', set foo(v) { } };", SyntaxError); +assertThrows("var x = { set foo(v) { }, foo: 'data' };", SyntaxError); +assertThrows("var x = { foo: 'data', set 'foo'(v) { } };", SyntaxError); +assertThrows("var x = { set foo(v) { }, 'foo': 'data' };", SyntaxError); +assertThrows("var x = { 'foo': 'data', set foo(v) { } };", SyntaxError); +assertThrows("var x = { set 'foo'(v) { }, foo: 'data' };", SyntaxError); +assertThrows("var x = { 'foo': 'data', set 'foo'(v) { } };", SyntaxError); +assertThrows("var x = { set 'foo'(v) { }, 'foo': 'data' };", SyntaxError); +assertThrows("var x = { 12: 1, set '12'(v){}};", SyntaxError); +assertThrows("var x = { 12: 1, set 12(v){}};", SyntaxError); +assertThrows("var x = { '12': 1, set '12'(v){}};", SyntaxError); +assertThrows("var x = { '12': 1, set 12(v){}};", SyntaxError); + +// Getter and data (non-strict) +assertThrows("var x = { foo: 'data', get foo() { } };", SyntaxError); +assertThrows("var x = { get foo() { }, foo: 'data' };", SyntaxError); +assertThrows("var x = { 'foo': 'data', get foo() { } };", SyntaxError); +assertThrows("var x = { get 'foo'() { }, 'foo': 'data' };", SyntaxError); +assertThrows("var x = { '12': 1, get '12'(){}};", SyntaxError); +assertThrows("var x = { '12': 1, get 12(){}};", SyntaxError); + +// Assignment to eval or arguments +CheckStrictMode("function strict() { eval = undefined; }", SyntaxError); +CheckStrictMode("function strict() { arguments = undefined; }", SyntaxError); +CheckStrictMode("function strict() { print(eval = undefined); }", SyntaxError); +CheckStrictMode("function strict() { print(arguments = undefined); }", SyntaxError); +CheckStrictMode("function strict() { var x = eval = undefined; }", SyntaxError); +CheckStrictMode("function strict() { var x = arguments = undefined; }", SyntaxError); + +// Compound assignment to eval or arguments +CheckStrictMode("function strict() { eval *= undefined; }", SyntaxError); +CheckStrictMode("function strict() { arguments /= undefined; }", SyntaxError); +CheckStrictMode("function strict() { print(eval %= undefined); }", SyntaxError); +CheckStrictMode("function strict() { print(arguments %= undefined); }", SyntaxError); +CheckStrictMode("function strict() { var x = eval += undefined; }", SyntaxError); +CheckStrictMode("function strict() { var x = arguments -= undefined; }", SyntaxError); +CheckStrictMode("function strict() { eval <<= undefined; }", SyntaxError); +CheckStrictMode("function strict() { arguments >>= undefined; }", SyntaxError); +CheckStrictMode("function strict() { print(eval >>>= undefined); }", SyntaxError); +CheckStrictMode("function strict() { print(arguments &= undefined); }", SyntaxError); +CheckStrictMode("function strict() { var x = eval ^= undefined; }", SyntaxError); +CheckStrictMode("function strict() { var x = arguments |= undefined; }", SyntaxError); + +// Postfix increment with eval or arguments +CheckStrictMode("function strict() { eval++; }", SyntaxError); +CheckStrictMode("function strict() { arguments++; }", SyntaxError); +CheckStrictMode("function strict() { print(eval++); }", SyntaxError); +CheckStrictMode("function strict() { print(arguments++); }", SyntaxError); +CheckStrictMode("function strict() { var x = eval++; }", SyntaxError); +CheckStrictMode("function strict() { var x = arguments++; }", SyntaxError); + +// Postfix decrement with eval or arguments +CheckStrictMode("function strict() { eval--; }", SyntaxError); +CheckStrictMode("function strict() { arguments--; }", SyntaxError); +CheckStrictMode("function strict() { print(eval--); }", SyntaxError); +CheckStrictMode("function strict() { print(arguments--); }", SyntaxError); +CheckStrictMode("function strict() { var x = eval--; }", SyntaxError); +CheckStrictMode("function strict() { var x = arguments--; }", SyntaxError); + +// Prefix increment with eval or arguments +CheckStrictMode("function strict() { ++eval; }", SyntaxError); +CheckStrictMode("function strict() { ++arguments; }", SyntaxError); +CheckStrictMode("function strict() { print(++eval); }", SyntaxError); +CheckStrictMode("function strict() { print(++arguments); }", SyntaxError); +CheckStrictMode("function strict() { var x = ++eval; }", SyntaxError); +CheckStrictMode("function strict() { var x = ++arguments; }", SyntaxError); + +// Prefix decrement with eval or arguments +CheckStrictMode("function strict() { --eval; }", SyntaxError); +CheckStrictMode("function strict() { --arguments; }", SyntaxError); +CheckStrictMode("function strict() { print(--eval); }", SyntaxError); +CheckStrictMode("function strict() { print(--arguments); }", SyntaxError); +CheckStrictMode("function strict() { var x = --eval; }", SyntaxError); +CheckStrictMode("function strict() { var x = --arguments; }", SyntaxError); + +// Prefix unary operators other than delete, ++, -- are valid in strict mode +(function StrictModeUnaryOperators() { + "use strict"; + var x = [void eval, typeof eval, +eval, -eval, ~eval, !eval]; + var y = [void arguments, typeof arguments, + +arguments, -arguments, ~arguments, !arguments]; +})(); + +// 7.6.1.2 Future Reserved Words +var future_reserved_words = [ + "class", + "enum", + "export", + "extends", + "import", + "super", + "implements", + "interface", + "let", + "package", + "private", + "protected", + "public", + "static", + "yield" ]; + +function testFutureReservedWord(word) { + // Simple use of each reserved word + CheckStrictMode("var " + word + " = 1;", SyntaxError); + + // object literal properties + eval("var x = { " + word + " : 42 };"); + eval("var x = { get " + word + " () {} };"); + eval("var x = { set " + word + " (value) {} };"); + + // object literal with string literal property names + eval("var x = { '" + word + "' : 42 };"); + eval("var x = { get '" + word + "' () { } };"); + eval("var x = { set '" + word + "' (value) { } };"); + eval("var x = { get '" + word + "' () { 'use strict'; } };"); + eval("var x = { set '" + word + "' (value) { 'use strict'; } };"); + + // Function names and arguments, strict and non-strict contexts + CheckStrictMode("function " + word + " () {}", SyntaxError); + CheckStrictMode("function foo (" + word + ") {}", SyntaxError); + CheckStrictMode("function foo (" + word + ", " + word + ") {}", SyntaxError); + CheckStrictMode("function foo (a, " + word + ") {}", SyntaxError); + CheckStrictMode("function foo (" + word + ", a) {}", SyntaxError); + CheckStrictMode("function foo (a, " + word + ", b) {}", SyntaxError); + CheckStrictMode("var foo = function (" + word + ") {}", SyntaxError); + + // Function names and arguments when the body is strict + assertThrows("function " + word + " () { 'use strict'; }", SyntaxError); + assertThrows("function foo (" + word + ") 'use strict'; {}", SyntaxError); + assertThrows("function foo (" + word + ", " + word + ") { 'use strict'; }", SyntaxError); + assertThrows("function foo (a, " + word + ") { 'use strict'; }", SyntaxError); + assertThrows("function foo (" + word + ", a) { 'use strict'; }", SyntaxError); + assertThrows("function foo (a, " + word + ", b) { 'use strict'; }", SyntaxError); + assertThrows("var foo = function (" + word + ") { 'use strict'; }", SyntaxError); + + // get/set when the body is strict + eval("var x = { get " + word + " () { 'use strict'; } };"); + eval("var x = { set " + word + " (value) { 'use strict'; } };"); + assertThrows("var x = { get foo(" + word + ") { 'use strict'; } };", SyntaxError); + assertThrows("var x = { set foo(" + word + ") { 'use strict'; } };", SyntaxError); +} + +for (var i = 0; i < future_reserved_words.length; i++) { + testFutureReservedWord(future_reserved_words[i]); +} + +function testAssignToUndefined(should_throw) { + "use strict"; + try { + possibly_undefined_variable_for_strict_mode_test = "should throw?"; + } catch (e) { + assertTrue(should_throw, "strict mode"); + assertInstanceof(e, ReferenceError, "strict mode"); + return; + } + assertFalse(should_throw, "strict mode"); +} + +testAssignToUndefined(true); +testAssignToUndefined(true); +testAssignToUndefined(true); + +possibly_undefined_variable_for_strict_mode_test = "value"; + +testAssignToUndefined(false); +testAssignToUndefined(false); +testAssignToUndefined(false); + +delete possibly_undefined_variable_for_strict_mode_test; + +testAssignToUndefined(true); +testAssignToUndefined(true); +testAssignToUndefined(true); + +function repeat(n, f) { + for (var i = 0; i < n; i ++) { f(); } +} + +repeat(10, function() { testAssignToUndefined(true); }); +possibly_undefined_variable_for_strict_mode_test = "value"; +repeat(10, function() { testAssignToUndefined(false); }); +delete possibly_undefined_variable_for_strict_mode_test; +repeat(10, function() { testAssignToUndefined(true); }); +possibly_undefined_variable_for_strict_mode_test = undefined; +repeat(10, function() { testAssignToUndefined(false); }); diff --git a/test/mjsunit/string-charcodeat.js b/test/mjsunit/string-charcodeat.js index 831f688f..f18d0a53 100644 --- a/test/mjsunit/string-charcodeat.js +++ b/test/mjsunit/string-charcodeat.js @@ -153,6 +153,17 @@ TestStringType(Slice16End, true); TestStringType(Flat16, true); TestStringType(NotAString16, true); + +function ConsNotSmiIndex() { + var str = Cons(); + assertTrue(isNaN(str.charCodeAt(0x7fffffff))); +} + +for (var i = 0; i < 100000; i++) { + ConsNotSmiIndex(); +} + + for (var i = 0; i != 10; i++) { assertEquals(101, Cons16().charCodeAt(1.1)); assertEquals('e', Cons16().charAt(1.1)); @@ -194,3 +205,23 @@ assertTrue(isNaN(long.charCodeAt(-1)), 35); assertEquals(49, long.charCodeAt(0), 36); assertEquals(56, long.charCodeAt(65535), 37); assertTrue(isNaN(long.charCodeAt(65536)), 38); + + +// Test crankshaft code when the function is set directly on the +// string prototype object instead of the hidden prototype object. +// See http://code.google.com/p/v8/issues/detail?id=1070 + +String.prototype.x = String.prototype.charCodeAt; + +function directlyOnPrototype() { + assertEquals(97, "a".x(0)); + assertEquals(98, "b".x(0)); + assertEquals(99, "c".x(0)); + assertEquals(97, "a".x(0)); + assertEquals(98, "b".x(0)); + assertEquals(99, "c".x(0)); +} + +for (var i = 0; i < 10000; i++) { + directlyOnPrototype(); +} diff --git a/test/mjsunit/tools/codemap.js b/test/mjsunit/tools/codemap.js index 06a91e81..81fb8101 100644 --- a/test/mjsunit/tools/codemap.js +++ b/test/mjsunit/tools/codemap.js @@ -30,7 +30,7 @@ function newCodeEntry(size, name) { - return new devtools.profiler.CodeMap.CodeEntry(size, name); + return new CodeMap.CodeEntry(size, name); }; @@ -47,7 +47,7 @@ function assertNoEntry(codeMap, addr) { (function testLibrariesAndStaticCode() { - var codeMap = new devtools.profiler.CodeMap(); + var codeMap = new CodeMap(); codeMap.addLibrary(0x1500, newCodeEntry(0x3000, 'lib1')); codeMap.addLibrary(0x15500, newCodeEntry(0x5000, 'lib2')); codeMap.addLibrary(0x155500, newCodeEntry(0x10000, 'lib3')); @@ -97,7 +97,7 @@ function assertNoEntry(codeMap, addr) { (function testDynamicCode() { - var codeMap = new devtools.profiler.CodeMap(); + var codeMap = new CodeMap(); codeMap.addCode(0x1500, newCodeEntry(0x200, 'code1')); codeMap.addCode(0x1700, newCodeEntry(0x100, 'code2')); codeMap.addCode(0x1900, newCodeEntry(0x50, 'code3')); @@ -123,7 +123,7 @@ function assertNoEntry(codeMap, addr) { (function testCodeMovesAndDeletions() { - var codeMap = new devtools.profiler.CodeMap(); + var codeMap = new CodeMap(); codeMap.addCode(0x1500, newCodeEntry(0x200, 'code1')); codeMap.addCode(0x1700, newCodeEntry(0x100, 'code2')); assertEntry(codeMap, 'code1', 0x1500); @@ -139,7 +139,7 @@ function assertNoEntry(codeMap, addr) { (function testDynamicNamesDuplicates() { - var codeMap = new devtools.profiler.CodeMap(); + var codeMap = new CodeMap(); // Code entries with same names but different addresses. codeMap.addCode(0x1500, newCodeEntry(0x200, 'code')); codeMap.addCode(0x1700, newCodeEntry(0x100, 'code')); @@ -152,7 +152,7 @@ function assertNoEntry(codeMap, addr) { (function testStaticEntriesExport() { - var codeMap = new devtools.profiler.CodeMap(); + var codeMap = new CodeMap(); codeMap.addStaticCode(0x1500, newCodeEntry(0x3000, 'lib1')); codeMap.addStaticCode(0x15500, newCodeEntry(0x5000, 'lib2')); codeMap.addStaticCode(0x155500, newCodeEntry(0x10000, 'lib3')); @@ -163,7 +163,7 @@ function assertNoEntry(codeMap, addr) { (function testDynamicEntriesExport() { - var codeMap = new devtools.profiler.CodeMap(); + var codeMap = new CodeMap(); codeMap.addCode(0x1500, newCodeEntry(0x200, 'code1')); codeMap.addCode(0x1700, newCodeEntry(0x100, 'code2')); codeMap.addCode(0x1900, newCodeEntry(0x50, 'code3')); diff --git a/test/mjsunit/tools/csvparser.js b/test/mjsunit/tools/csvparser.js index 6ac49080..f1449f6b 100644 --- a/test/mjsunit/tools/csvparser.js +++ b/test/mjsunit/tools/csvparser.js @@ -28,7 +28,7 @@ // Load CSV parser implementation from <project root>/tools. // Files: tools/csvparser.js -var parser = new devtools.profiler.CsvParser(); +var parser = new CsvParser(); assertEquals( [], diff --git a/test/mjsunit/tools/profile.js b/test/mjsunit/tools/profile.js index 9ed851b1..4df1a08f 100644 --- a/test/mjsunit/tools/profile.js +++ b/test/mjsunit/tools/profile.js @@ -58,7 +58,7 @@ function countNodes(profile, traverseFunc) { function ProfileTestDriver() { - this.profile = new devtools.profiler.Profile(); + this.profile = new Profile(); this.stack_ = []; this.addFunctions_(); }; diff --git a/test/mjsunit/tools/profile_view.js b/test/mjsunit/tools/profile_view.js index 3ed1128b..7f60119a 100644 --- a/test/mjsunit/tools/profile_view.js +++ b/test/mjsunit/tools/profile_view.js @@ -30,7 +30,7 @@ function createNode(name, time, opt_parent) { - var node = new devtools.profiler.ProfileView.Node(name, time, time, null); + var node = new ProfileView.Node(name, time, time, null); if (opt_parent) { opt_parent.addChild(node); } @@ -61,7 +61,7 @@ function createNode(name, time, opt_parent) { createNode('d', 4, b3); createNode('d', 2, b3); - var view = new devtools.profiler.ProfileView(root); + var view = new ProfileView(root); var flatTree = []; function fillFlatTree(node) { diff --git a/test/mjsunit/tools/splaytree.js b/test/mjsunit/tools/splaytree.js index 3beba0b9..5e18796d 100644 --- a/test/mjsunit/tools/splaytree.js +++ b/test/mjsunit/tools/splaytree.js @@ -30,7 +30,7 @@ (function testIsEmpty() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); assertTrue(tree.isEmpty()); tree.insert(0, 'value'); assertFalse(tree.isEmpty()); @@ -38,7 +38,7 @@ (function testExportValues() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); assertArrayEquals([], tree.exportValues()); tree.insert(0, 'value'); assertArrayEquals(['value'], tree.exportValues()); @@ -79,7 +79,7 @@ function createSampleTree() { (function testSplay() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); tree.root_ = createSampleTree(); assertArrayEquals(['50', '30', '60', '10', '40', '90', '20', '70', '100', '15', '80'], tree.exportValues()); @@ -93,7 +93,7 @@ function createSampleTree() { (function testInsert() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); tree.insert(5, 'root'); tree.insert(3, 'left'); assertArrayEquals(['left', 'root'], tree.exportValues()); @@ -103,7 +103,7 @@ function createSampleTree() { (function testFind() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); tree.insert(5, 'root'); tree.insert(3, 'left'); tree.insert(7, 'right'); @@ -117,7 +117,7 @@ function createSampleTree() { (function testFindMin() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); assertEquals(null, tree.findMin()); tree.insert(5, 'root'); tree.insert(3, 'left'); @@ -127,7 +127,7 @@ function createSampleTree() { (function testFindMax() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); assertEquals(null, tree.findMax()); tree.insert(5, 'root'); tree.insert(3, 'left'); @@ -137,7 +137,7 @@ function createSampleTree() { (function testFindGreatestLessThan() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); assertEquals(null, tree.findGreatestLessThan(10)); tree.insert(5, 'root'); tree.insert(3, 'left'); @@ -151,7 +151,7 @@ function createSampleTree() { (function testRemove() { - var tree = new goog.structs.SplayTree(); + var tree = new SplayTree(); assertThrows('tree.remove(5)'); tree.insert(5, 'root'); tree.insert(3, 'left'); diff --git a/test/mozilla/mozilla.status b/test/mozilla/mozilla.status index a119bf2a..3b6a524c 100644 --- a/test/mozilla/mozilla.status +++ b/test/mozilla/mozilla.status @@ -110,7 +110,7 @@ ecma_3/RegExp/regress-209067: PASS || FAIL if $mode == debug js1_5/GC/regress-278725: PASS || FAIL if $mode == debug # http://b/issue?id=1206983 js1_5/Regress/regress-367561-03: PASS || FAIL if $mode == debug -ecma/Date/15.9.5.10-2: PASS || FAIL if $mode == debug +ecma/Date/15.9.5.10-2: PASS || (FAIL || TIMEOUT if $mode == debug) # These tests create two Date objects just after each other and # expects them to match. Sometimes this happens on the border @@ -169,7 +169,6 @@ js1_5/Regress/regress-416628: PASS || FAIL || TIMEOUT if $mode == debug # In Denmark the adjustment starts one week earlier!. # Tests based on shell that use dates in this gap are flaky. ecma/Date/15.9.5.10-1: PASS || FAIL -ecma/Date/15.9.5.10-2: PASS || TIMEOUT if ($arch == arm && $mode == debug) ecma/Date/15.9.5.12-1: PASS || FAIL ecma/Date/15.9.5.14: PASS || FAIL ecma/Date/15.9.5.34-1: PASS || FAIL @@ -198,6 +197,9 @@ js1_5/Regress/regress-404755: PASS || FAIL js1_5/extensions/regress-363258: PASS || FAIL +# Test that assumes specific runtime for a regexp, flaky in debug mode. +ecma_3/RegExp/regress-85721: PASS || FAIL if $mode == debug + ##################### INCOMPATIBLE TESTS ##################### @@ -818,20 +820,17 @@ js1_5/Regress/regress-271716-n: PASS || SKIP if $FAST == yes js1_5/extensions/regress-342960: SKIP # BUG(3251229): Times out when running new crankshaft test script. -ecma/Date/15.9.5.12-2: SKIP -ecma/Date/15.9.5.11-2: SKIP -ecma/Date/15.9.5.10-2: SKIP -ecma/Date/15.9.5.8: SKIP ecma_3/RegExp/regress-311414: SKIP -js1_5/Array/regress-99120-02: SKIP -js1_5/Regress/regress-203278-1: SKIP ecma/Date/15.9.5.8: SKIP ecma/Date/15.9.5.10-2: SKIP ecma/Date/15.9.5.11-2: SKIP ecma/Date/15.9.5.12-2: SKIP +js1_5/Array/regress-99120-02: SKIP +js1_5/extensions/regress-371636: SKIP +js1_5/Regress/regress-203278-1: SKIP js1_5/Regress/regress-404755: SKIP js1_5/Regress/regress-451322: SKIP -js1_5/extensions/regress-371636: SKIP + # BUG(1040): Allow this test to timeout. js1_5/GC/regress-203278-2: PASS || TIMEOUT @@ -862,7 +861,6 @@ ecma/Date/15.9.5.20: SKIP ecma/Date/15.9.5.12-2: SKIP ecma/Date/15.9.5.8: SKIP ecma/Date/15.9.5.9: SKIP -ecma/Date/15.9.5.10-2: SKIP ecma/Date/15.9.5.11-2: SKIP ecma/Expressions/11.7.2: SKIP ecma/Expressions/11.10-2: SKIP |