diff options
author | Ryan <ry@tinyclouds.org> | 2009-09-02 11:13:46 +0200 |
---|---|---|
committer | Ryan <ry@tinyclouds.org> | 2009-09-02 11:13:46 +0200 |
commit | 97ce138621b375f24db98280972a56e063be0b1d (patch) | |
tree | 3bc3aa651233955ade15b1f5a00678e042be1076 /deps/v8/test | |
parent | 78bb53b009e04c94f142aa3241b06c640395b170 (diff) | |
download | node-97ce138621b375f24db98280972a56e063be0b1d.tar.gz |
Upgrade V8 to 1.3.9
Diffstat (limited to 'deps/v8/test')
-rw-r--r-- | deps/v8/test/cctest/cctest.status | 4 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-api.cc | 61 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-assembler-arm.cc | 4 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-heap.cc | 2 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-log-stack-tracer.cc | 6 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-regexp.cc | 39 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-thread-termination.cc | 60 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-utils.cc | 2 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/debug-stepin-constructor.js | 4 | ||||
-rwxr-xr-x | deps/v8/test/mjsunit/simple-constructor.js | 66 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/transcendentals.js | 49 |
11 files changed, 260 insertions, 37 deletions
diff --git a/deps/v8/test/cctest/cctest.status b/deps/v8/test/cctest/cctest.status index 68aabb516..67e9d8a45 100644 --- a/deps/v8/test/cctest/cctest.status +++ b/deps/v8/test/cctest/cctest.status @@ -50,6 +50,10 @@ test-api/RegExpInterruption: SKIP test-api/OutOfMemory: SKIP test-api/OutOfMemoryNested: SKIP +# BUG(432): Fail on ARM hardware. +test-regexp/MacroAssemblerNativeSimple: PASS || FAIL +test-regexp/MacroAssemblerNativeSimpleUC16: PASS || FAIL + # BUG(355): Test crashes on ARM. test-log/ProfLazyMode: SKIP diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index c8f855b11..80f91d39b 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -2673,40 +2673,67 @@ THREADED_TEST(SimpleExtensions) { } -static const char* kEvalExtensionSource = - "function UseEval() {" +static const char* kEvalExtensionSource1 = + "function UseEval1() {" " var x = 42;" " return eval('x');" "}"; +static const char* kEvalExtensionSource2 = + "(function() {" + " var x = 42;" + " function e() {" + " return eval('x');" + " }" + " this.UseEval2 = e;" + "})()"; + + THREADED_TEST(UseEvalFromExtension) { v8::HandleScope handle_scope; - v8::RegisterExtension(new Extension("evaltest", kEvalExtensionSource)); - const char* extension_names[] = { "evaltest" }; - v8::ExtensionConfiguration extensions(1, extension_names); + v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); + v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); + const char* extension_names[] = { "evaltest1", "evaltest2" }; + v8::ExtensionConfiguration extensions(2, extension_names); v8::Handle<Context> context = Context::New(&extensions); Context::Scope lock(context); - v8::Handle<Value> result = Script::Compile(v8_str("UseEval()"))->Run(); + v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run(); + CHECK_EQ(result, v8::Integer::New(42)); + result = Script::Compile(v8_str("UseEval2()"))->Run(); CHECK_EQ(result, v8::Integer::New(42)); } -static const char* kWithExtensionSource = - "function UseWith() {" +static const char* kWithExtensionSource1 = + "function UseWith1() {" " var x = 42;" " with({x:87}) { return x; }" "}"; + +static const char* kWithExtensionSource2 = + "(function() {" + " var x = 42;" + " function e() {" + " with ({x:87}) { return x; }" + " }" + " this.UseWith2 = e;" + "})()"; + + THREADED_TEST(UseWithFromExtension) { v8::HandleScope handle_scope; - v8::RegisterExtension(new Extension("withtest", kWithExtensionSource)); - const char* extension_names[] = { "withtest" }; - v8::ExtensionConfiguration extensions(1, extension_names); + v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); + v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); + const char* extension_names[] = { "withtest1", "withtest2" }; + v8::ExtensionConfiguration extensions(2, extension_names); v8::Handle<Context> context = Context::New(&extensions); Context::Scope lock(context); - v8::Handle<Value> result = Script::Compile(v8_str("UseWith()"))->Run(); + v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run(); + CHECK_EQ(result, v8::Integer::New(87)); + result = Script::Compile(v8_str("UseWith2()"))->Run(); CHECK_EQ(result, v8::Integer::New(87)); } @@ -7815,6 +7842,7 @@ THREADED_TEST(PixelArray) { free(pixel_data); } + THREADED_TEST(ScriptContextDependence) { v8::HandleScope scope; LocalContext c1; @@ -7830,6 +7858,7 @@ THREADED_TEST(ScriptContextDependence) { CHECK_EQ(indep->Run()->Int32Value(), 101); } + THREADED_TEST(StackTrace) { v8::HandleScope scope; LocalContext context; @@ -7842,3 +7871,11 @@ THREADED_TEST(StackTrace) { v8::String::Utf8Value stack(try_catch.StackTrace()); CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL); } + + +// Test that idle notification can be handled when V8 has not yet been +// set up. +THREADED_TEST(IdleNotification) { + for (int i = 0; i < 100; i++) v8::V8::IdleNotification(true); + for (int i = 0; i < 100; i++) v8::V8::IdleNotification(false); +} diff --git a/deps/v8/test/cctest/test-assembler-arm.cc b/deps/v8/test/cctest/test-assembler-arm.cc index fe1621c2a..34f16395e 100644 --- a/deps/v8/test/cctest/test-assembler-arm.cc +++ b/deps/v8/test/cctest/test-assembler-arm.cc @@ -185,7 +185,7 @@ TEST(3) { Label L, C; __ mov(ip, Operand(sp)); - __ stm(db_w, sp, r4.bit() | fp.bit() | sp.bit() | lr.bit()); + __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); __ sub(fp, ip, Operand(4)); __ mov(r4, Operand(r0)); __ ldr(r0, MemOperand(r4, OFFSET_OF(T, i))); @@ -199,7 +199,7 @@ TEST(3) { __ add(r0, r2, Operand(r0)); __ mov(r2, Operand(r2, ASR, 3)); __ strh(r2, MemOperand(r4, OFFSET_OF(T, s))); - __ ldm(ia, sp, r4.bit() | fp.bit() | sp.bit() | pc.bit()); + __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); CodeDesc desc; assm.GetCode(&desc); diff --git a/deps/v8/test/cctest/test-heap.cc b/deps/v8/test/cctest/test-heap.cc index 37dbdd7c6..eb32b6539 100644 --- a/deps/v8/test/cctest/test-heap.cc +++ b/deps/v8/test/cctest/test-heap.cc @@ -179,7 +179,7 @@ TEST(HeapObjects) { TEST(Tagging) { InitializeVM(); int request = 24; - ASSERT_EQ(request, OBJECT_SIZE_ALIGN(request)); + CHECK_EQ(request, static_cast<int>(OBJECT_SIZE_ALIGN(request))); CHECK(Smi::FromInt(42)->IsSmi()); CHECK(Failure::RetryAfterGC(request, NEW_SPACE)->IsFailure()); CHECK_EQ(request, Failure::RetryAfterGC(request, NEW_SPACE)->requested()); diff --git a/deps/v8/test/cctest/test-log-stack-tracer.cc b/deps/v8/test/cctest/test-log-stack-tracer.cc index 1ef0a93d9..43df6ba7a 100644 --- a/deps/v8/test/cctest/test-log-stack-tracer.cc +++ b/deps/v8/test/cctest/test-log-stack-tracer.cc @@ -336,8 +336,10 @@ static void CFuncDoTrace() { #elif defined _MSC_VER && defined V8_TARGET_ARCH_IA32 __asm mov [fp], ebp // NOLINT #elif defined _MSC_VER && defined V8_TARGET_ARCH_X64 - // FIXME: I haven't really tried to compile it. - __asm movq [fp], rbp // NOLINT + // TODO(X64): __asm extension is not supported by the Microsoft Visual C++ + // 64-bit compiler. + fp = 0; + UNIMPLEMENTED(); #endif DoTrace(fp); } diff --git a/deps/v8/test/cctest/test-regexp.cc b/deps/v8/test/cctest/test-regexp.cc index 89c7868d8..81c220520 100644 --- a/deps/v8/test/cctest/test-regexp.cc +++ b/deps/v8/test/cctest/test-regexp.cc @@ -40,6 +40,7 @@ #include "regexp-macro-assembler-irregexp.h" #ifdef V8_NATIVE_REGEXP #ifdef V8_TARGET_ARCH_ARM +#include "arm/macro-assembler-arm.h" #include "arm/regexp-macro-assembler-arm.h" #endif #ifdef V8_TARGET_ARCH_X64 @@ -605,11 +606,12 @@ TEST(DispatchTableConstruction) { #ifdef V8_NATIVE_REGEXP -#ifdef V8_TARGET_ARCH_IA32 +#if V8_TARGET_ARCH_IA32 typedef RegExpMacroAssemblerIA32 ArchRegExpMacroAssembler; -#endif -#ifdef V8_TARGET_ARCH_X64 +#elif V8_TARGET_ARCH_X64 typedef RegExpMacroAssemblerX64 ArchRegExpMacroAssembler; +#elif V8_TARGET_ARCH_ARM +typedef RegExpMacroAssemblerARM ArchRegExpMacroAssembler; #endif class ContextInitializer { @@ -845,7 +847,7 @@ TEST(MacroAssemblerNativeBackReferenceASCII) { v8::V8::Initialize(); ContextInitializer initializer; - ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 3); + ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); m.WriteCurrentPositionToRegister(0, 0); m.AdvanceCurrentPosition(2); @@ -870,7 +872,7 @@ TEST(MacroAssemblerNativeBackReferenceASCII) { Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); Address start_adr = seq_input->GetCharsAddress(); - int output[3]; + int output[4]; NativeRegExpMacroAssembler::Result result = Execute(*code, *input, @@ -884,6 +886,7 @@ TEST(MacroAssemblerNativeBackReferenceASCII) { CHECK_EQ(0, output[0]); CHECK_EQ(2, output[1]); CHECK_EQ(6, output[2]); + CHECK_EQ(-1, output[3]); } @@ -891,7 +894,7 @@ TEST(MacroAssemblerNativeBackReferenceUC16) { v8::V8::Initialize(); ContextInitializer initializer; - ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 3); + ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4); m.WriteCurrentPositionToRegister(0, 0); m.AdvanceCurrentPosition(2); @@ -918,7 +921,7 @@ TEST(MacroAssemblerNativeBackReferenceUC16) { Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); Address start_adr = seq_input->GetCharsAddress(); - int output[3]; + int output[4]; NativeRegExpMacroAssembler::Result result = Execute(*code, *input, @@ -932,6 +935,7 @@ TEST(MacroAssemblerNativeBackReferenceUC16) { CHECK_EQ(0, output[0]); CHECK_EQ(2, output[1]); CHECK_EQ(6, output[2]); + CHECK_EQ(-1, output[3]); } @@ -1055,12 +1059,12 @@ TEST(MacroAssemblerNativeRegisters) { v8::V8::Initialize(); ContextInitializer initializer; - ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 5); + ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 6); uc16 foo_chars[3] = {'f', 'o', 'o'}; Vector<const uc16> foo(foo_chars, 3); - enum registers { out1, out2, out3, out4, out5, sp, loop_cnt }; + enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt }; Label fail; Label backtrack; m.WriteCurrentPositionToRegister(out1, 0); // Output: [0] @@ -1114,7 +1118,7 @@ TEST(MacroAssemblerNativeRegisters) { m.GoTo(&loop3); m.Bind(&exit_loop3); m.PopCurrentPosition(); - m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9] + m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9,-1] m.Succeed(); @@ -1132,15 +1136,15 @@ TEST(MacroAssemblerNativeRegisters) { Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); Address start_adr = seq_input->GetCharsAddress(); - int output[5]; + int output[6]; NativeRegExpMacroAssembler::Result result = Execute(*code, - *input, - 0, - start_adr, - start_adr + input->length(), - output, - true); + *input, + 0, + start_adr, + start_adr + input->length(), + output, + true); CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); CHECK_EQ(0, output[0]); @@ -1148,6 +1152,7 @@ TEST(MacroAssemblerNativeRegisters) { CHECK_EQ(6, output[2]); CHECK_EQ(9, output[3]); CHECK_EQ(9, output[4]); + CHECK_EQ(-1, output[5]); } diff --git a/deps/v8/test/cctest/test-thread-termination.cc b/deps/v8/test/cctest/test-thread-termination.cc index 323be1d77..552f49df1 100644 --- a/deps/v8/test/cctest/test-thread-termination.cc +++ b/deps/v8/test/cctest/test-thread-termination.cc @@ -193,3 +193,63 @@ TEST(TerminateMultipleV8Threads) { delete semaphore; semaphore = NULL; } + + +int call_count = 0; + + +v8::Handle<v8::Value> TerminateOrReturnObject(const v8::Arguments& args) { + if (++call_count == 10) { + v8::V8::TerminateExecution(); + return v8::Undefined(); + } + v8::Local<v8::Object> result = v8::Object::New(); + result->Set(v8::String::New("x"), v8::Integer::New(42)); + return result; +} + + +v8::Handle<v8::Value> LoopGetProperty(const v8::Arguments& args) { + v8::TryCatch try_catch; + v8::Script::Compile(v8::String::New("function f() {" + " try {" + " while(true) {" + " terminate_or_return_object().x;" + " }" + " fail();" + " } catch(e) {" + " fail();" + " }" + "}" + "f()"))->Run(); + CHECK(try_catch.HasCaught()); + CHECK(try_catch.Exception()->IsNull()); + CHECK(try_catch.Message().IsEmpty()); + CHECK(!try_catch.CanContinue()); + return v8::Undefined(); +} + + +// Test that we correctly handle termination exceptions if they are +// triggered by the creation of error objects in connection with ICs. +TEST(TerminateLoadICException) { + v8::HandleScope scope; + v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); + global->Set(v8::String::New("terminate_or_return_object"), + v8::FunctionTemplate::New(TerminateOrReturnObject)); + global->Set(v8::String::New("fail"), v8::FunctionTemplate::New(Fail)); + global->Set(v8::String::New("loop"), + v8::FunctionTemplate::New(LoopGetProperty)); + + v8::Persistent<v8::Context> context = v8::Context::New(NULL, global); + v8::Context::Scope context_scope(context); + // Run a loop that will be infinite if thread termination does not work. + v8::Handle<v8::String> source = + v8::String::New("try { loop(); fail(); } catch(e) { fail(); }"); + call_count = 0; + v8::Script::Compile(source)->Run(); + // Test that we can run the code again after thread termination. + call_count = 0; + v8::Script::Compile(source)->Run(); + context.Dispose(); +} diff --git a/deps/v8/test/cctest/test-utils.cc b/deps/v8/test/cctest/test-utils.cc index 23b3254c2..ffcaf8abc 100644 --- a/deps/v8/test/cctest/test-utils.cc +++ b/deps/v8/test/cctest/test-utils.cc @@ -158,7 +158,7 @@ TEST(Utils1) { // int8_t and intptr_t signed integers. CHECK_EQ(-2, -8 >> 2); CHECK_EQ(-2, static_cast<int8_t>(-8) >> 2); - CHECK_EQ(-2, static_cast<intptr_t>(-8) >> 2); + CHECK_EQ(-2, static_cast<int>(static_cast<intptr_t>(-8) >> 2)); } diff --git a/deps/v8/test/mjsunit/debug-stepin-constructor.js b/deps/v8/test/mjsunit/debug-stepin-constructor.js index 6dbe5d192..6ee334735 100644 --- a/deps/v8/test/mjsunit/debug-stepin-constructor.js +++ b/deps/v8/test/mjsunit/debug-stepin-constructor.js @@ -59,6 +59,10 @@ function f() { break_break_point_hit_count = 0; f(); assertEquals(5, break_break_point_hit_count); +f(); +assertEquals(10, break_break_point_hit_count); +f(); +assertEquals(15, break_break_point_hit_count); // Test step into constructor with builtin constructor. function g() { diff --git a/deps/v8/test/mjsunit/simple-constructor.js b/deps/v8/test/mjsunit/simple-constructor.js index b26d6519b..e9ae92100 100755 --- a/deps/v8/test/mjsunit/simple-constructor.js +++ b/deps/v8/test/mjsunit/simple-constructor.js @@ -53,9 +53,11 @@ function f4(x) { } o1_1 = new f1(); +assertEquals(1, o1_1.x, "1"); o1_2 = new f1(); -assertArrayEquals(["x"], props(o1_1)); -assertArrayEquals(["x"], props(o1_2)); +assertEquals(1, o1_1.x, "2"); +assertArrayEquals(["x"], props(o1_1), "3"); +assertArrayEquals(["x"], props(o1_2), "4"); o2_1 = new f2(0); o2_2 = new f2(0); @@ -76,3 +78,63 @@ o4_1_1 = new f4(1); o4_1_2 = new f4(1); assertArrayEquals(["x", "y"], props(o4_1_1)); assertArrayEquals(["x", "y"], props(o4_1_2)); + +function f5(x, y) { + this.x = x; + this.y = y; +} + +function f6(x, y) { + this.y = y; + this.x = x; +} + +function f7(x, y, z) { + this.x = x; + this.y = y; +} + +function testArgs(fun) { + obj = new fun(); + assertArrayEquals(["x", "y"], props(obj)); + assertEquals(void 0, obj.x); + assertEquals(void 0, obj.y); + + obj = new fun("x"); + assertArrayEquals(["x", "y"], props(obj)); + assertEquals("x", obj.x); + assertEquals(void 0, obj.y); + + obj = new fun("x", "y"); + assertArrayEquals(["x", "y"], props(obj)); + assertEquals("x", obj.x); + assertEquals("y", obj.y); + + obj = new fun("x", "y", "z"); + assertArrayEquals(["x", "y"], props(obj)); + assertEquals("x", obj.x); + assertEquals("y", obj.y); +} + +for (var i = 0; i < 10; i++) { + testArgs(f5); + testArgs(f6); + testArgs(f7); +} + +function g(){ + this.x=1 +} + +o = new g(); +assertEquals(1, o.x); +o = new g(); +assertEquals(1, o.x); +g.prototype = {y:2} +o = new g(); +assertEquals(1, o.x); +assertEquals(2, o.y); +o = new g(); +assertEquals(1, o.x); +assertEquals(2, o.y); + diff --git a/deps/v8/test/mjsunit/transcendentals.js b/deps/v8/test/mjsunit/transcendentals.js new file mode 100644 index 000000000..78e6c4807 --- /dev/null +++ b/deps/v8/test/mjsunit/transcendentals.js @@ -0,0 +1,49 @@ +// Copyright 2009 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. + + +// Two fp numbers that have the same hash value (see TranscendentalCache +// in heap.h). +var x = 0x123456789ABCD / 0x2000000000000; +var y = 0x1134567899BCD / 0x2000000000000; + +assertTrue(Math.sin(x) != Math.sin(y)); + +assertTrue(Math.cos(x) != Math.cos(y)); + +assertTrue(Math.tan(x) != Math.tan(y)); + +assertTrue(Math.log(x) != Math.log(y)); + +assertTrue(Math.asin(x) != Math.asin(y)); + +assertTrue(Math.acos(x) != Math.acos(y)); + +assertTrue(Math.atan(x) != Math.atan(y)); + +assertTrue(Math.exp(x) != Math.exp(y)); + |