diff options
author | Ben Murdoch <benm@google.com> | 2012-01-20 14:57:15 +0000 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2012-01-20 14:57:15 +0000 |
commit | 2b4ba1175df6a5a6b9b5cda034189197bf6565ec (patch) | |
tree | 6a4c479deebb22e68c5d7b915609593adee56a92 /test | |
parent | 35e02d4f35686cd3d202dab09aa0fdf24651afed (diff) | |
download | v8-2b4ba1175df6a5a6b9b5cda034189197bf6565ec.tar.gz |
Merge V8 at r10446: Roll to 3.6.6.19
Bug: 5688872
Change-Id: Ie6be41e043db4e38abeb6b8d92761d7cc2c294bf
Diffstat (limited to 'test')
-rw-r--r-- | test/cctest/test-hashing.cc | 88 | ||||
-rw-r--r-- | test/mjsunit/compiler/regress-funcaller.js | 11 | ||||
-rw-r--r-- | test/mjsunit/compiler/regress-lazy-deopt.js | 48 |
3 files changed, 144 insertions, 3 deletions
diff --git a/test/cctest/test-hashing.cc b/test/cctest/test-hashing.cc index 9aa84614..a6265105 100644 --- a/test/cctest/test-hashing.cc +++ b/test/cctest/test-hashing.cc @@ -117,6 +117,41 @@ void generate(MacroAssembler* masm, i::Vector<const char> string) { } +void generate(MacroAssembler* masm, uint32_t key) { +#ifdef V8_TARGET_ARCH_IA32 + __ push(ebx); + __ mov(eax, Immediate(key)); + __ GetNumberHash(eax, ebx); + __ pop(ebx); + __ Ret(); +#elif V8_TARGET_ARCH_X64 + __ push(kRootRegister); + __ InitializeRootRegister(); + __ push(rbx); + __ movq(rax, Immediate(key)); + __ GetNumberHash(rax, rbx); + __ pop(rbx); + __ pop(kRootRegister); + __ Ret(); +#elif V8_TARGET_ARCH_ARM + __ push(kRootRegister); + __ InitializeRootRegister(); + __ mov(r0, Operand(key)); + __ GetNumberHash(r0, ip); + __ pop(kRootRegister); + __ mov(pc, Operand(lr)); +#elif V8_TARGET_ARCH_MIPS + __ push(kRootRegister); + __ InitializeRootRegister(); + __ li(v0, Operand(key)); + __ GetNumberHash(v0, t1); + __ pop(kRootRegister); + __ jr(ra); + __ nop(); +#endif +} + + void check(i::Vector<const char> string) { v8::HandleScope scope; v8::internal::byte buffer[2048]; @@ -146,12 +181,47 @@ void check(i::Vector<const char> string) { } +void check(uint32_t key) { + v8::HandleScope scope; + v8::internal::byte buffer[2048]; + MacroAssembler masm(Isolate::Current(), buffer, sizeof buffer); + + generate(&masm, key); + + CodeDesc desc; + masm.GetCode(&desc); + Code* code = Code::cast(HEAP->CreateCode( + desc, + Code::ComputeFlags(Code::STUB), + Handle<Object>(HEAP->undefined_value()))->ToObjectChecked()); + CHECK(code->IsCode()); + + HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); +#ifdef USE_SIMULATOR + uint32_t codegen_hash = + reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); +#else + uint32_t codegen_hash = hash(); +#endif + + uint32_t runtime_hash = ComputeIntegerHash( + key, + Isolate::Current()->heap()->HashSeed()); + CHECK(runtime_hash == codegen_hash); +} + + void check_twochars(char a, char b) { char ab[2] = {a, b}; check(i::Vector<const char>(ab, 2)); } +static uint32_t PseudoRandom(uint32_t i, uint32_t j) { + return ~(~((i * 781) ^ (j * 329))); +} + + TEST(StringHash) { if (env.IsEmpty()) env = v8::Context::New(); for (int a = 0; a < String::kMaxAsciiCharCode; a++) { @@ -169,4 +239,22 @@ TEST(StringHash) { check(i::Vector<const char>("-=[ vee eight ftw ]=-", 21)); } + +TEST(NumberHash) { + if (env.IsEmpty()) env = v8::Context::New(); + + // Some specific numbers + for (uint32_t key = 0; key < 42; key += 7) { + check(key); + } + + // Some pseudo-random numbers + static const uint32_t kLimit = 1000; + for (uint32_t i = 0; i < 5; i++) { + for (uint32_t j = 0; j < 5; j++) { + check(PseudoRandom(i, j) % kLimit); + } + } +} + #undef __ diff --git a/test/mjsunit/compiler/regress-funcaller.js b/test/mjsunit/compiler/regress-funcaller.js index 88db147a..5c2a5972 100644 --- a/test/mjsunit/compiler/regress-funcaller.js +++ b/test/mjsunit/compiler/regress-funcaller.js @@ -25,6 +25,8 @@ // (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 + // Test function.caller. function A() {} @@ -40,9 +42,10 @@ A.prototype.g = gee; var o = new A(); -for (var i=0; i<5000000; i++) { +for (var i=0; i<5; i++) { o.g(i); } +%OptimizeFunctionOnNextCall(o.g); assertEquals(gee, o.g(0)); assertEquals(null, o.g(1)); @@ -53,9 +56,10 @@ function hej(x) { return o.g(x); } -for (var j=0; j<5000000; j++) { +for (var j=0; j<5; j++) { hej(j); } +%OptimizeFunctionOnNextCall(hej); assertEquals(gee, hej(0)); assertEquals(hej, hej(1)); @@ -66,8 +70,9 @@ function from_eval(x) { return o.g(x); } -for (var j=0; j<5000000; j++) { +for (var j=0; j<5; j++) { from_eval(j); } +%OptimizeFunctionOnNextCall(from_eval); assertEquals(gee, from_eval(0)); assertEquals(from_eval, from_eval(1)); diff --git a/test/mjsunit/compiler/regress-lazy-deopt.js b/test/mjsunit/compiler/regress-lazy-deopt.js new file mode 100644 index 00000000..d1c3d01d --- /dev/null +++ b/test/mjsunit/compiler/regress-lazy-deopt.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. + +// Flags: --allow-natives-syntax + +// Test lazy deoptimization after CallFunctionStub. + +function foo() { return 1; } + +function f(x, y) { + var a = [0]; + if (x == 0) { + %DeoptimizeFunction(f); + return 1; + } + a[0] = %_CallFunction(null, x - 1, f); + return x >> a[0]; +} + +f(42); +f(42); +assertEquals(42, f(42)); +%OptimizeFunctionOnNextCall(f); +assertEquals(42, f(42)); |