12c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 22c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// Redistribution and use in source and binary forms, with or without 32c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// modification, are permitted provided that the following conditions are 42c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// met: 52c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// 62c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// * Redistributions of source code must retain the above copyright 72c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// notice, this list of conditions and the following disclaimer. 82c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// * Redistributions in binary form must reproduce the above 92c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// copyright notice, this list of conditions and the following 102c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// disclaimer in the documentation and/or other materials provided 112c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// with the distribution. 122c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// * Neither the name of Google Inc. nor the names of its 132c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// contributors may be used to endorse or promote products derived 142c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// from this software without specific prior written permission. 152c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// 162c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 282c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include <stdlib.h> 292c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 302c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "v8.h" 312c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 322c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "factory.h" 332c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "macro-assembler.h" 342c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "cctest.h" 352c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "code-stubs.h" 362c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "objects.h" 372c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 382c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#ifdef USE_SIMULATOR 392c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#include "simulator.h" 402c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#endif 412c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 422c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.orgusing namespace v8::internal; 432c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 442c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 452c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.orgtypedef uint32_t (*HASH_FUNCTION)(); 462c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 47f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#define __ masm-> 482c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 492c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 5059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid generate(MacroAssembler* masm, i::Vector<const uint8_t> string) { 51f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // GenerateHashInit takes the first character as an argument so it can't 52f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // handle the zero length string. 53f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com ASSERT(string.length() > 0); 5493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32 552c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ push(ebx); 562c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ push(ecx); 572c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ mov(eax, Immediate(0)); 58f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ mov(ebx, Immediate(string.at(0))); 59f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashInit(masm, eax, ebx, ecx); 602c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org for (int i = 1; i < string.length(); i++) { 612c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ mov(ebx, Immediate(string.at(i))); 62f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashAddCharacter(masm, eax, ebx, ecx); 632c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 64f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashGetHash(masm, eax, ecx); 652c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ pop(ecx); 662c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ pop(ebx); 672c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ Ret(); 682c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#elif V8_TARGET_ARCH_X64 69f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(kRootRegister); 70f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ InitializeRootRegister(); 712c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ push(rbx); 722c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ push(rcx); 732c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ movq(rax, Immediate(0)); 74f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ movq(rbx, Immediate(string.at(0))); 75f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashInit(masm, rax, rbx, rcx); 762c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org for (int i = 1; i < string.length(); i++) { 772c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ movq(rbx, Immediate(string.at(i))); 78f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashAddCharacter(masm, rax, rbx, rcx); 792c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 80f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashGetHash(masm, rax, rcx); 812c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ pop(rcx); 822c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ pop(rbx); 83f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(kRootRegister); 842c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ Ret(); 852c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#elif V8_TARGET_ARCH_ARM 86f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(kRootRegister); 87f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ InitializeRootRegister(); 88f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 892c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ mov(r0, Operand(0)); 90f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ mov(ip, Operand(string.at(0))); 91f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashInit(masm, r0, ip); 922c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org for (int i = 1; i < string.length(); i++) { 932c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ mov(ip, Operand(string.at(i))); 94f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashAddCharacter(masm, r0, ip); 952c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 96f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashGetHash(masm, r0); 97f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(kRootRegister); 982c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ mov(pc, Operand(lr)); 992c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#elif V8_TARGET_ARCH_MIPS 100f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(kRootRegister); 101f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ InitializeRootRegister(); 102f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 1032c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ li(v0, Operand(0)); 104f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ li(t1, Operand(string.at(0))); 105f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashInit(masm, v0, t1); 1062c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org for (int i = 1; i < string.length(); i++) { 1072c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ li(t1, Operand(string.at(i))); 108f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashAddCharacter(masm, v0, t1); 1092c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 110f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com StringHelper::GenerateHashGetHash(masm, v0); 111f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(kRootRegister); 112f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ jr(ra); 113f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ nop(); 114f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#endif 115f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com} 116f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 117f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 118f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid generate(MacroAssembler* masm, uint32_t key) { 11993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32 120f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(ebx); 121f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ mov(eax, Immediate(key)); 122f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ GetNumberHash(eax, ebx); 123f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(ebx); 124f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ Ret(); 125f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#elif V8_TARGET_ARCH_X64 126f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(kRootRegister); 127f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ InitializeRootRegister(); 128f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(rbx); 129f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ movq(rax, Immediate(key)); 130f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ GetNumberHash(rax, rbx); 131f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(rbx); 132f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(kRootRegister); 133f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ Ret(); 134f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#elif V8_TARGET_ARCH_ARM 135f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(kRootRegister); 136f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ InitializeRootRegister(); 137f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ mov(r0, Operand(key)); 138f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ GetNumberHash(r0, ip); 139f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(kRootRegister); 140f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ mov(pc, Operand(lr)); 141f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#elif V8_TARGET_ARCH_MIPS 142f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ push(kRootRegister); 143f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ InitializeRootRegister(); 144f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ li(v0, Operand(key)); 145f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ GetNumberHash(v0, t1); 146f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com __ pop(kRootRegister); 1472c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org __ jr(ra); 1487ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org __ nop(); 1492c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#endif 1502c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org} 1512c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 1522c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 15359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid check(i::Vector<const uint8_t> string) { 15459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Isolate* isolate = Isolate::Current(); 15559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Factory* factory = isolate->factory(); 15659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org HandleScope scope(isolate); 15759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 1582c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org v8::internal::byte buffer[2048]; 15959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org MacroAssembler masm(isolate, buffer, sizeof buffer); 1602c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 161f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com generate(&masm, string); 1622c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 1632c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org CodeDesc desc; 164f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com masm.GetCode(&desc); 16559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Handle<Object> undefined(isolate->heap()->undefined_value(), isolate); 16659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Handle<Code> code = factory->NewCode(desc, 16759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Code::ComputeFlags(Code::STUB), 16859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org undefined); 1692c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org CHECK(code->IsCode()); 1702c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 1717ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); 17259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Handle<String> v8_string = factory->NewStringFromOneByte(string); 1732c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org v8_string->set_hash_field(String::kEmptyHashField); 1742c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#ifdef USE_SIMULATOR 1752c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org uint32_t codegen_hash = 1762c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); 1772c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#else 1782c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org uint32_t codegen_hash = hash(); 1792c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#endif 1802c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org uint32_t runtime_hash = v8_string->Hash(); 1812c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org CHECK(runtime_hash == codegen_hash); 1822c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org} 1832c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 1842c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 18559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid check(i::Vector<const char> s) { 18659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org check(i::Vector<const uint8_t>::cast(s)); 18759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org} 18859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 18959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 190f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid check(uint32_t key) { 19159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Isolate* isolate = Isolate::Current(); 19259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Factory* factory = isolate->factory(); 19359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org HandleScope scope(isolate); 19459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 195f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com v8::internal::byte buffer[2048]; 196f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com MacroAssembler masm(Isolate::Current(), buffer, sizeof buffer); 197f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 198f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com generate(&masm, key); 199f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 200f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com CodeDesc desc; 201f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com masm.GetCode(&desc); 20259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Handle<Object> undefined(isolate->heap()->undefined_value(), isolate); 20359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Handle<Code> code = factory->NewCode(desc, 20459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Code::ComputeFlags(Code::STUB), 20559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org undefined); 206f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com CHECK(code->IsCode()); 207f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 208f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com HASH_FUNCTION hash = FUNCTION_CAST<HASH_FUNCTION>(code->entry()); 209f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#ifdef USE_SIMULATOR 210f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com uint32_t codegen_hash = 211f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com reinterpret_cast<uint32_t>(CALL_GENERATED_CODE(hash, 0, 0, 0, 0, 0)); 212f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#else 213f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com uint32_t codegen_hash = hash(); 214f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#endif 215f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 21659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint32_t runtime_hash = ComputeIntegerHash(key, isolate->heap()->HashSeed()); 217f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com CHECK(runtime_hash == codegen_hash); 218f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com} 219f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 220f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 22159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid check_twochars(uint8_t a, uint8_t b) { 22259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t ab[2] = {a, b}; 22359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org check(i::Vector<const uint8_t>(ab, 2)); 2242c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org} 2252c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 2262c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 227f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comstatic uint32_t PseudoRandom(uint32_t i, uint32_t j) { 228f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return ~(~((i * 781) ^ (j * 329))); 229f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com} 230f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 231f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 2322c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.orgTEST(StringHash) { 23357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Isolate* isolate = v8::Isolate::GetCurrent(); 23457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope handle_scope(isolate); 23557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Context::Scope context_scope(v8::Context::New(isolate)); 23657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 23759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org for (uint8_t a = 0; a < String::kMaxOneByteCharCode; a++) { 2382c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org // Numbers are hashed differently. 2392c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org if (a >= '0' && a <= '9') continue; 24059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org for (uint8_t b = 0; b < String::kMaxOneByteCharCode; b++) { 2412c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org if (b >= '0' && b <= '9') continue; 24259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org check_twochars(a, b); 2432c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 2442c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 2452c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org check(i::Vector<const char>("*", 1)); 2462c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org check(i::Vector<const char>(".zZ", 3)); 2472c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org check(i::Vector<const char>("muc", 3)); 2482c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org check(i::Vector<const char>("(>'_')>", 7)); 2492c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org check(i::Vector<const char>("-=[ vee eight ftw ]=-", 21)); 2502c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org} 2512c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 252f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 253f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comTEST(NumberHash) { 25457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Isolate* isolate = v8::Isolate::GetCurrent(); 25557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope handle_scope(isolate); 25657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Context::Scope context_scope(v8::Context::New(isolate)); 257f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 258f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Some specific numbers 259f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com for (uint32_t key = 0; key < 42; key += 7) { 260f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com check(key); 261f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 262f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 263f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Some pseudo-random numbers 264f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com static const uint32_t kLimit = 1000; 265f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com for (uint32_t i = 0; i < 5; i++) { 266f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com for (uint32_t j = 0; j < 5; j++) { 267f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com check(PseudoRandom(i, j) % kLimit); 268f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 269f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 270f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com} 271f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 2722c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org#undef __ 273