diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2010-07-14 11:16:20 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-07-14 11:16:20 -0700 |
commit | 8e2530c320d19717ffd3a2685a41e277e35235fd (patch) | |
tree | f11fd572cc3e50fc1ca9db2eac88ccd32b52589c /deps/v8/test | |
parent | 870aa3d97f65a58f80e8347c796f5ba685410462 (diff) | |
download | node-new-8e2530c320d19717ffd3a2685a41e277e35235fd.tar.gz |
Upgrade V8 to 2.2.24
Diffstat (limited to 'deps/v8/test')
-rw-r--r-- | deps/v8/test/cctest/test-api.cc | 87 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-assembler-arm.cc | 6 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-assembler-ia32.cc | 9 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-disasm-arm.cc | 5 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-disasm-ia32.cc | 1 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-heap-profiler.cc | 7 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-heap.cc | 2 | ||||
-rw-r--r-- | deps/v8/test/es5conform/es5conform.status | 10 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/apply.js | 23 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/json.js | 6 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/object-freeze.js | 174 |
11 files changed, 267 insertions, 63 deletions
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 330ca5bcd1..bd6108c0a0 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -470,7 +470,10 @@ TEST(MakingExternalStringConditions) { i::Heap::CollectGarbage(0, i::NEW_SPACE); i::Heap::CollectGarbage(0, i::NEW_SPACE); - Local<String> small_string = String::New(AsciiToTwoByteString("small")); + uint16_t* two_byte_string = AsciiToTwoByteString("small"); + Local<String> small_string = String::New(two_byte_string); + i::DeleteArray(two_byte_string); + // We should refuse to externalize newly created small string. CHECK(!small_string->CanMakeExternal()); // Trigger GCs so that the newly allocated string moves to old gen. @@ -479,7 +482,10 @@ TEST(MakingExternalStringConditions) { // Old space strings should be accepted. CHECK(small_string->CanMakeExternal()); - small_string = String::New(AsciiToTwoByteString("small 2")); + two_byte_string = AsciiToTwoByteString("small 2"); + small_string = String::New(two_byte_string); + i::DeleteArray(two_byte_string); + // We should refuse externalizing newly created small string. CHECK(!small_string->CanMakeExternal()); for (int i = 0; i < 100; i++) { @@ -492,8 +498,11 @@ TEST(MakingExternalStringConditions) { char* buf = i::NewArray<char>(buf_size); memset(buf, 'a', buf_size); buf[buf_size - 1] = '\0'; - Local<String> large_string = String::New(AsciiToTwoByteString(buf)); + + two_byte_string = AsciiToTwoByteString(buf); + Local<String> large_string = String::New(two_byte_string); i::DeleteArray(buf); + i::DeleteArray(two_byte_string); // Large strings should be immediately accepted. CHECK(large_string->CanMakeExternal()); } @@ -688,7 +697,11 @@ THREADED_TEST(StringConcat) { const char* two_byte_string_2 = "a_times_two_plus_b(4, 8) + "; const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);"; Local<String> left = v8_str(one_byte_string_1); - Local<String> right = String::New(AsciiToTwoByteString(two_byte_string_1)); + + uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1); + Local<String> right = String::New(two_byte_source); + i::DeleteArray(two_byte_source); + Local<String> source = String::Concat(left, right); right = String::NewExternal( new TestAsciiResource(i::StrDup(one_byte_extern_1))); @@ -698,7 +711,11 @@ THREADED_TEST(StringConcat) { source = String::Concat(source, right); right = v8_str(one_byte_string_2); source = String::Concat(source, right); - right = String::New(AsciiToTwoByteString(two_byte_string_2)); + + two_byte_source = AsciiToTwoByteString(two_byte_string_2); + right = String::New(two_byte_source); + i::DeleteArray(two_byte_source); + source = String::Concat(source, right); right = String::NewExternal( new TestResource(AsciiToTwoByteString(two_byte_extern_2))); @@ -3821,9 +3838,10 @@ v8::Handle<Value> WhammyPropertyGetter(Local<String> name, THREADED_TEST(WeakReference) { v8::HandleScope handle_scope; v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(); + Whammy* whammy = new Whammy(); templ->SetNamedPropertyHandler(WhammyPropertyGetter, 0, 0, 0, 0, - v8::External::New(new Whammy())); + v8::External::New(whammy)); const char* extension_list[] = { "v8/gc" }; v8::ExtensionConfiguration extensions(1, extension_list); v8::Persistent<Context> context = Context::New(&extensions); @@ -3842,7 +3860,7 @@ THREADED_TEST(WeakReference) { "4"; v8::Handle<Value> result = CompileRun(code); CHECK_EQ(4.0, result->NumberValue()); - + delete whammy; context.Dispose(); } @@ -8612,20 +8630,31 @@ TEST(PreCompileAPIVariationsAreSame) { v8::HandleScope scope; const char* cstring = "function foo(a) { return a+1; }"; + v8::ScriptData* sd_from_cstring = v8::ScriptData::PreCompile(cstring, i::StrLength(cstring)); TestAsciiResource* resource = new TestAsciiResource(cstring); - v8::ScriptData* sd_from_istring = v8::ScriptData::PreCompile( + v8::ScriptData* sd_from_external_string = v8::ScriptData::PreCompile( v8::String::NewExternal(resource)); - CHECK_EQ(sd_from_cstring->Length(), sd_from_istring->Length()); + v8::ScriptData* sd_from_string = v8::ScriptData::PreCompile( + v8::String::New(cstring)); + + CHECK_EQ(sd_from_cstring->Length(), sd_from_external_string->Length()); + CHECK_EQ(0, memcmp(sd_from_cstring->Data(), + sd_from_external_string->Data(), + sd_from_cstring->Length())); + + CHECK_EQ(sd_from_cstring->Length(), sd_from_string->Length()); CHECK_EQ(0, memcmp(sd_from_cstring->Data(), - sd_from_istring->Data(), + sd_from_string->Data(), sd_from_cstring->Length())); + delete sd_from_cstring; - delete sd_from_istring; + delete sd_from_external_string; + delete sd_from_string; } @@ -9049,6 +9078,7 @@ THREADED_TEST(MorphCompositeStringTest) { CHECK_EQ(String::New(expected_slice_on_cons), env->Global()->Get(v8_str("slice_on_cons"))); } + i::DeleteArray(two_byte_string); } @@ -9073,6 +9103,7 @@ TEST(CompileExternalTwoByteSource) { i::StrLength(ascii_sources[i]))); v8::Local<v8::String> source = v8::String::NewExternal(&uc16_resource); v8::Script::Compile(source); + i::DeleteArray(two_byte_string); } } @@ -10350,6 +10381,40 @@ THREADED_TEST(CaptureStackTrace) { } +static void StackTraceForUncaughtExceptionListener( + v8::Handle<v8::Message> message, + v8::Handle<Value>) { + v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); + CHECK_EQ(2, stack_trace->GetFrameCount()); + checkStackFrame("origin", "foo", 2, 3, false, false, + stack_trace->GetFrame(0)); + checkStackFrame("origin", "bar", 5, 3, false, false, + stack_trace->GetFrame(1)); +} + +TEST(CaptureStackTraceForUncaughtException) { + report_count = 0; + v8::HandleScope scope; + LocalContext env; + v8::V8::AddMessageListener(StackTraceForUncaughtExceptionListener); + v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); + + Script::Compile(v8_str("function foo() {\n" + " throw 1;\n" + "};\n" + "function bar() {\n" + " foo();\n" + "};"), + v8_str("origin"))->Run(); + v8::Local<v8::Object> global = env->Global(); + Local<Value> trouble = global->Get(v8_str("bar")); + CHECK(trouble->IsFunction()); + Function::Cast(*trouble)->Call(global, 0, NULL); + v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); + v8::V8::RemoveMessageListeners(StackTraceForUncaughtExceptionListener); +} + + // Test that idle notification can be handled and eventually returns true. THREADED_TEST(IdleNotification) { bool rv = false; diff --git a/deps/v8/test/cctest/test-assembler-arm.cc b/deps/v8/test/cctest/test-assembler-arm.cc index 3058c6f86a..5e49c0cdad 100644 --- a/deps/v8/test/cctest/test-assembler-arm.cc +++ b/deps/v8/test/cctest/test-assembler-arm.cc @@ -70,7 +70,6 @@ TEST(0) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -107,7 +106,6 @@ TEST(1) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -153,7 +151,6 @@ TEST(2) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -201,7 +198,6 @@ TEST(3) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -261,7 +257,6 @@ TEST(4) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -301,7 +296,6 @@ TEST(5) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); diff --git a/deps/v8/test/cctest/test-assembler-ia32.cc b/deps/v8/test/cctest/test-assembler-ia32.cc index e499c6fa85..b60865de45 100644 --- a/deps/v8/test/cctest/test-assembler-ia32.cc +++ b/deps/v8/test/cctest/test-assembler-ia32.cc @@ -70,7 +70,6 @@ TEST(AssemblerIa320) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -108,7 +107,6 @@ TEST(AssemblerIa321) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -150,7 +148,6 @@ TEST(AssemblerIa322) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -185,7 +182,6 @@ TEST(AssemblerIa323) { assm.GetCode(&desc); Code* code = Code::cast(Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value()))); // don't print the code - our disassembler can't handle cvttss2si @@ -220,7 +216,6 @@ TEST(AssemblerIa324) { assm.GetCode(&desc); Code* code = Code::cast(Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value()))); // don't print the code - our disassembler can't handle cvttsd2si @@ -250,7 +245,6 @@ TEST(AssemblerIa325) { assm.GetCode(&desc); Code* code = Code::cast(Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value()))); F0 f = FUNCTION_CAST<F0>(code->entry()); @@ -288,7 +282,6 @@ TEST(AssemblerIa326) { assm.GetCode(&desc); Code* code = Code::cast(Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value()))); #ifdef DEBUG @@ -329,7 +322,6 @@ TEST(AssemblerIa328) { assm.GetCode(&desc); Code* code = Code::cast(Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value()))); CHECK(code->IsCode()); @@ -385,7 +377,6 @@ TEST(AssemblerIa329) { assm.GetCode(&desc); Code* code = Code::cast(Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value()))); CHECK(code->IsCode()); diff --git a/deps/v8/test/cctest/test-disasm-arm.cc b/deps/v8/test/cctest/test-disasm-arm.cc index f890fc10a0..2bb32e7f5f 100644 --- a/deps/v8/test/cctest/test-disasm-arm.cc +++ b/deps/v8/test/cctest/test-disasm-arm.cc @@ -437,6 +437,11 @@ TEST(Vfp) { "eeb10bc0 vsqrt.f64 d0, d0"); COMPARE(vsqrt(d2, d3, ne), "1eb12bc3 vsqrt.f64ne d2, d3"); + + COMPARE(vmov(d0, 1.0), + "eeb70b00 vmov.f64 d0, #1"); + COMPARE(vmov(d2, -13.0), + "eeba2b0a vmov.f64 d2, #-13"); } VERIFY_RUN(); diff --git a/deps/v8/test/cctest/test-disasm-ia32.cc b/deps/v8/test/cctest/test-disasm-ia32.cc index e51bfabd4f..40fadd8ef2 100644 --- a/deps/v8/test/cctest/test-disasm-ia32.cc +++ b/deps/v8/test/cctest/test-disasm-ia32.cc @@ -415,7 +415,6 @@ TEST(DisasmIa320) { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); diff --git a/deps/v8/test/cctest/test-heap-profiler.cc b/deps/v8/test/cctest/test-heap-profiler.cc index 7f1e3d8062..a4fcee10ff 100644 --- a/deps/v8/test/cctest/test-heap-profiler.cc +++ b/deps/v8/test/cctest/test-heap-profiler.cc @@ -598,12 +598,13 @@ TEST(HeapSnapshotCodeObjects) { CHECK_NE(NULL, lazy_code); // Verify that non-compiled code doesn't contain references to "x" - // literal, while compiled code does. + // literal, while compiled code does. The scope info is stored in FixedArray + // objects attached to the SharedFunctionInfo. bool compiled_references_x = false, lazy_references_x = false; for (int i = 0, count = compiled_code->GetChildrenCount(); i < count; ++i) { const v8::HeapGraphEdge* prop = compiled_code->GetChild(i); const v8::HeapGraphNode* node = prop->GetToNode(); - if (node->GetType() == v8::HeapGraphNode::CODE) { + if (node->GetType() == v8::HeapGraphNode::ARRAY) { if (HasString(node, "x")) { compiled_references_x = true; break; @@ -613,7 +614,7 @@ TEST(HeapSnapshotCodeObjects) { for (int i = 0, count = lazy_code->GetChildrenCount(); i < count; ++i) { const v8::HeapGraphEdge* prop = lazy_code->GetChild(i); const v8::HeapGraphNode* node = prop->GetToNode(); - if (node->GetType() == v8::HeapGraphNode::CODE) { + if (node->GetType() == v8::HeapGraphNode::ARRAY) { if (HasString(node, "x")) { lazy_references_x = true; break; diff --git a/deps/v8/test/cctest/test-heap.cc b/deps/v8/test/cctest/test-heap.cc index 195fef49b8..01f23aa133 100644 --- a/deps/v8/test/cctest/test-heap.cc +++ b/deps/v8/test/cctest/test-heap.cc @@ -77,7 +77,6 @@ static void CheckFindCodeObject() { CodeDesc desc; assm.GetCode(&desc); Object* code = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(code->IsCode()); @@ -91,7 +90,6 @@ static void CheckFindCodeObject() { } Object* copy = Heap::CreateCode(desc, - NULL, Code::ComputeFlags(Code::STUB), Handle<Object>(Heap::undefined_value())); CHECK(copy->IsCode()); diff --git a/deps/v8/test/es5conform/es5conform.status b/deps/v8/test/es5conform/es5conform.status index e461349f26..4fb8f7bf17 100644 --- a/deps/v8/test/es5conform/es5conform.status +++ b/deps/v8/test/es5conform/es5conform.status @@ -49,25 +49,15 @@ chapter15/15.1: FAIL_OK # NOT IMPLEMENTED: seal chapter15/15.2/15.2.3/15.2.3.8: UNIMPLEMENTED -# NOT IMPLEMENTED: freeze -chapter15/15.2/15.2.3/15.2.3.9: UNIMPLEMENTED # NOT IMPLEMENTED: isSealed chapter15/15.2/15.2.3/15.2.3.11: UNIMPLEMENTED -# NOT IMPLEMENTED: isFrozen -chapter15/15.2/15.2.3/15.2.3.12: UNIMPLEMENTED # NOT IMPLEMENTED: seal chapter15/15.2/15.2.3/15.2.3.3/15.2.3.3-4-20: UNIMPLEMENTED -# NOT IMPLEMENTED: freeze -chapter15/15.2/15.2.3/15.2.3.3/15.2.3.3-4-21: UNIMPLEMENTED - # NOT IMPLEMENTED: isSealed chapter15/15.2/15.2.3/15.2.3.3/15.2.3.3-4-23: UNIMPLEMENTED -# NOT IMPLEMENTED: isFrozen -chapter15/15.2/15.2.3/15.2.3.3/15.2.3.3-4-24: UNIMPLEMENTED - # NOT IMPLEMENTED: bind chapter15/15.2/15.2.3/15.2.3.3/15.2.3.3-4-38: UNIMPLEMENTED diff --git a/deps/v8/test/mjsunit/apply.js b/deps/v8/test/mjsunit/apply.js index cab7eb82f7..613d37d9e3 100644 --- a/deps/v8/test/mjsunit/apply.js +++ b/deps/v8/test/mjsunit/apply.js @@ -94,7 +94,7 @@ function f() { } return doo; } - + assertEquals("42foofishhorse", f.apply(this, arr), "apply to this"); function s() { @@ -112,28 +112,13 @@ function al() { return arguments.length + arguments[arguments.length - 1]; } -var stack_corner_case_failure = false; - for (var j = 1; j < 0x40000000; j <<= 1) { try { var a = new Array(j); a[j - 1] = 42; assertEquals(42 + j, al.apply(345, a)); } catch (e) { - if (e.toString().indexOf("Maximum call stack size exceeded") != -1) { - // For some combinations of build settings, it may be the case that the - // stack here is just tall enough to contain the array whose size is - // specified by j but is not tall enough to contain the activation - // record for the apply call. Allow one such corner case through, - // checking that the length check will do the right thing for an array - // the next size up. - assertEquals(false, stack_corner_case_failure); - stack_corner_case_failure = true; - continue; - } - assertTrue(e.toString().indexOf("Function.prototype.apply") != -1, - "exception does not contain Function.prototype.apply: " + - e.toString()); + assertTrue(e.toString().indexOf("Maximum call stack size exceeded") != -1); for (; j < 0x40000000; j <<= 1) { var caught = false; try { @@ -143,9 +128,7 @@ for (var j = 1; j < 0x40000000; j <<= 1) { assertUnreachable("Apply of array with length " + a.length + " should have thrown"); } catch (e) { - assertTrue(e.toString().indexOf("Function.prototype.apply") != -1, - "exception does not contain Function.prototype.apply [" + - "length = " + j + "]: " + e.toString()); + assertTrue(e.toString().indexOf("Maximum call stack size exceeded") != -1); caught = true; } assertTrue(caught, "exception not caught"); diff --git a/deps/v8/test/mjsunit/json.js b/deps/v8/test/mjsunit/json.js index 85457cd6e1..945b66249b 100644 --- a/deps/v8/test/mjsunit/json.js +++ b/deps/v8/test/mjsunit/json.js @@ -85,7 +85,7 @@ n4.toISOString = function () { }; assertEquals(null, n4.toJSON()); -assertEquals(Object.prototype, JSON.__proto__); +assertTrue(Object.prototype === JSON.__proto__); assertEquals("[object JSON]", Object.prototype.toString.call(JSON)); // DontEnum @@ -313,3 +313,7 @@ TestInvalid('1); throw "foo"; (1'); var x = 0; eval("(1); x++; (1)"); TestInvalid('1); x++; (1'); + +// Test string conversion of argument. +var o = { toString: function() { return "42"; } }; +assertEquals(42, JSON.parse(o)); diff --git a/deps/v8/test/mjsunit/object-freeze.js b/deps/v8/test/mjsunit/object-freeze.js new file mode 100644 index 0000000000..0ac617762a --- /dev/null +++ b/deps/v8/test/mjsunit/object-freeze.js @@ -0,0 +1,174 @@ +// Copyright 2010 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. + +// Tests the Object.freeze and Object.isFrozen methods - ES 15.2.3.9 and +// ES 15.2.3.12 + + +// Test that we throw an error if an object is not passed as argument. +var non_objects = new Array(undefined, null, 1, -1, 0, 42.43); +for (var key in non_objects) { + try { + Object.freeze(non_objects[key]); + assertUnreachable(); + } catch(e) { + assertTrue(/Object.freeze called on non-object/.test(e)); + } +} + +for (var key in non_objects) { + try { + Object.isFrozen(non_objects[key]); + assertUnreachable(); + } catch(e) { + assertTrue(/Object.isFrozen called on non-object/.test(e)); + } +} + +// Test normal data properties. +var obj = { x: 42, z: 'foobar' }; +var desc = Object.getOwnPropertyDescriptor(obj, 'x'); +assertTrue(desc.writable); +assertTrue(desc.configurable); +assertEquals(42, desc.value); + +desc = Object.getOwnPropertyDescriptor(obj, 'z'); +assertTrue(desc.writable); +assertTrue(desc.configurable); +assertEquals('foobar', desc.value); + +assertTrue(Object.isExtensible(obj)); +assertFalse(Object.isFrozen(obj)); + +Object.freeze(obj); + +// Make sure we are no longer extensible. +assertFalse(Object.isExtensible(obj)); +assertTrue(Object.isFrozen(obj)); + +try { + obj.foo = 42; + assertUnreachable(); +} catch(e) { + assertTrue(/object is not extensible/.test(e)); +} + +desc = Object.getOwnPropertyDescriptor(obj, 'x'); +assertFalse(desc.writable); +assertFalse(desc.configurable); +assertEquals(42, desc.value); + +desc = Object.getOwnPropertyDescriptor(obj, 'z'); +assertFalse(desc.writable); +assertFalse(desc.configurable); +assertEquals("foobar", desc.value); + +// Make sure that even if we try overwrite a value that is not writable, it is +// not changed. +obj.x = "tete"; +assertEquals(42, obj.x); +obj.x = { get: function() {return 43}, set: function() {} }; +assertEquals(42, obj.x); + +// Test on accessors. +var obj2 = {}; +function get() { return 43; }; +function set() {}; +Object.defineProperty(obj2, 'x', { get: get, set: set, configurable: true }); + +desc = Object.getOwnPropertyDescriptor(obj2, 'x'); +assertTrue(desc.configurable); +assertEquals(undefined, desc.value); +assertEquals(set, desc.set); +assertEquals(get, desc.get); + +assertTrue(Object.isExtensible(obj2)); +assertFalse(Object.isFrozen(obj2)); +Object.freeze(obj2); +assertTrue(Object.isFrozen(obj2)); +assertFalse(Object.isExtensible(obj2)); + +desc = Object.getOwnPropertyDescriptor(obj2, 'x'); +assertFalse(desc.configurable); +assertEquals(undefined, desc.value); +assertEquals(set, desc.set); +assertEquals(get, desc.get); + +try { + obj2.foo = 42; + assertUnreachable(); +} catch(e) { + assertTrue(/object is not extensible/.test(e)); +} + + +// Test freeze on arrays. +var arr = new Array(42,43); + +desc = Object.getOwnPropertyDescriptor(arr, '0'); +assertTrue(desc.configurable); +assertTrue(desc.writable); +assertEquals(42, desc.value); + +desc = Object.getOwnPropertyDescriptor(arr, '1'); +assertTrue(desc.configurable); +assertTrue(desc.writable); +assertEquals(43, desc.value); + +assertTrue(Object.isExtensible(arr)); +assertFalse(Object.isFrozen(arr)); +Object.freeze(arr); +assertTrue(Object.isFrozen(arr)); +assertFalse(Object.isExtensible(arr)); + +desc = Object.getOwnPropertyDescriptor(arr, '0'); +assertFalse(desc.configurable); +assertFalse(desc.writable); +assertEquals(42, desc.value); + +desc = Object.getOwnPropertyDescriptor(arr, '1'); +assertFalse(desc.configurable); +assertFalse(desc.writable); +assertEquals(43, desc.value); + +arr[0] = 'foo'; + +assertEquals(arr[0], 42); + + +// Test that isFrozen return the correct value even if configurable has been set +// to false on all properties manually and the extensible flag has also been set +// to false manually. +var obj3 = { x: 42, y: 'foo' }; + +assertFalse(Object.isFrozen(obj3)); + +Object.defineProperty(obj3, 'x', {configurable: false, writable: false}); +Object.defineProperty(obj3, 'y', {configurable: false, writable: false}); +Object.preventExtensions(obj3); + +assertTrue(Object.isFrozen(obj3)); |