Chromium Code Reviews| Index: test/cctest/test-hashing.cc |
| diff --git a/test/cctest/test-hashing.cc b/test/cctest/test-hashing.cc |
| index 9aa84614d6bee442e7b619c37be08459f91c5b90..daf55866bf370a52d1254e4a6824b58ce5ca9abf 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,6 +181,37 @@ 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()->StringHashSeed() |
| + ); |
| + CHECK(runtime_hash == codegen_hash); |
| +} |
| + |
| + |
| void check_twochars(char a, char b) { |
| char ab[2] = {a, b}; |
| check(i::Vector<const char>(ab, 2)); |
| @@ -169,4 +235,18 @@ TEST(StringHash) { |
| check(i::Vector<const char>("-=[ vee eight ftw ]=-", 21)); |
| } |
|
Erik Corry
2012/01/10 11:53:16
Missing blank line here.
|
| +TEST(NumberHash) { |
| + if (env.IsEmpty()) env = v8::Context::New(); |
| + |
| + // Some specific numbers |
| + for (uint32_t key = 0; key < 42; key += 7) { |
| + check(key); |
| + } |
| + |
| + // Some random numbers |
| + for (uint32_t i = 0; i < 23; i += 1) { |
| + check(rand() % 10000); |
| + } |
| +} |
| + |
| #undef __ |