Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1239)

Unified Diff: test/cctest/test-log-stack-tracer.cc

Issue 21014003: Optionally use 31-bits SMI value for 64-bit system (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed danno's comments Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/cctest/test-log-stack-tracer.cc
diff --git a/test/cctest/test-log-stack-tracer.cc b/test/cctest/test-log-stack-tracer.cc
index 7c3567c140bf2bb4da366f79f3c61e5dca0a3f61..192e88e66019a91163c77dc8ff4503892d94a42c 100644
--- a/test/cctest/test-log-stack-tracer.cc
+++ b/test/cctest/test-log-stack-tracer.cc
@@ -134,8 +134,17 @@ Address TraceExtension::GetFP(const v8::FunctionCallbackInfo<v8::Value>& args) {
#if defined(V8_HOST_ARCH_32_BIT)
Address fp = *reinterpret_cast<Address*>(*args[0]);
#elif defined(V8_HOST_ARCH_64_BIT)
- int64_t low_bits = *reinterpret_cast<uint64_t*>(*args[0]) >> 32;
- int64_t high_bits = *reinterpret_cast<uint64_t*>(*args[1]);
+ int64_t low_bits, high_bits;
+ if (v8::internal::kSmiValueSize == 32) {
+ low_bits = *reinterpret_cast<uint64_t*>(*args[0]) >> 32;
+ high_bits = *reinterpret_cast<uint64_t*>(*args[1]);
+ } else {
+ ASSERT(v8::internal::kSmiValueSize == 31);
+ // Low 33 bits ([32, 0]), the least two bits are zero.
+ low_bits = ((*reinterpret_cast<uint64_t*>(*args[0])) & 0xffffffff) << 1;
+ // High 32 bits ([63, 32]), 32th bit has been set by low_bits.
+ high_bits = *reinterpret_cast<uint64_t*>(*args[1]) << 32;
+ }
Address fp = reinterpret_cast<Address>(high_bits | low_bits);
#else
#error Host architecture is neither 32-bit nor 64-bit.
@@ -213,8 +222,17 @@ static void construct_call(const v8::FunctionCallbackInfo<v8::Value>& args) {
args.This()->Set(v8_str("low_bits"), v8_num(low_bits >> 1));
#elif defined(V8_HOST_ARCH_64_BIT)
uint64_t fp = reinterpret_cast<uint64_t>(calling_frame->fp());
- int32_t low_bits = static_cast<int32_t>(fp & 0xffffffff);
- int32_t high_bits = static_cast<int32_t>(fp >> 32);
+ int32_t low_bits, high_bits;
+ if (v8::internal::kSmiValueSize == 32) {
+ low_bits = static_cast<int32_t>(fp & 0xffffffff);
+ high_bits = static_cast<int32_t>(fp >> 32);
+ } else {
+ ASSERT(v8::internal::kSmiValueSize == 31);
+ // Middle 31-bits ([32, 2]), the least two bits are always 0 for FP.
+ low_bits = static_cast<int32_t>((fp >> 2) & 0xffffffff);
+ // High 31-bits ([63, 33]).
+ high_bits = static_cast<int32_t>(fp >> 33);
+ }
args.This()->Set(v8_str("low_bits"), v8_num(low_bits));
args.This()->Set(v8_str("high_bits"), v8_num(high_bits));
#else

Powered by Google App Engine
This is Rietveld 408576698