Add CHECK_INT64_EQ function to avoid operand size ambiguities.
authorwhesse@chromium.org <whesse@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Sat, 3 Oct 2009 13:46:22 +0000 (13:46 +0000)
committerwhesse@chromium.org <whesse@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Sat, 3 Oct 2009 13:46:22 +0000 (13:46 +0000)
Review URL: http://codereview.chromium.org/256048

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3016 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/checks.h
test/cctest/test-api.cc

index 44db46af2f74e42aed3356181532ba1427205a7a..74d15212dd2063c44c7fa7b6468733545461586c 100644 (file)
@@ -80,17 +80,18 @@ static inline void CheckEqualsHelper(const char* file, int line,
   }
 }
 
-#if !V8_HOST_ARCH_64_BIT
-// Helper function used by the CHECK_EQ function when given int64_t
-// arguments.  Should not be called directly.
-static inline void CheckEqualsHelper(const char* file, int line,
-                                     const char* expected_source,
-                                     int64_t expected,
-                                     const char* value_source,
-                                     int64_t value) {
+// Helper function used by the CHECK_INT64_EQ function when given int64_t
+// arguments.  Should not be called directly.  We do not overload CHECK_EQ
+// with both 32-bit and 64-bit integers, because it causes ambiguity
+// with operands of mixed sizes.
+static inline void CheckInt64EqualsHelper(const char* file, int line,
+                                          const char* expected_source,
+                                          int64_t expected,
+                                          const char* value_source,
+                                          int64_t value) {
   if (expected != value) {
-    // Sorry, printing int64_t in a fanky hex way,
-    // that's our mother tongue after all :)
+    // Print int64_t values in hex, as two int32s,
+    // to avoid platform-dependencies.
     V8_Fatal(file, line,
              "CHECK_EQ(%s, %s) failed\n#"
              "   Expected: 0x%08x%08x\n#   Found: 0x%08x%08x",
@@ -99,7 +100,6 @@ static inline void CheckEqualsHelper(const char* file, int line,
              uint32_t(value >> 32), uint32_t(value));
   }
 }
-#endif
 
 
 // Helper function used by the CHECK_NE function when given int
@@ -233,6 +233,9 @@ void CheckEqualsHelper(const char* file,
 #define CHECK_GT(a, b) CHECK((a) > (b))
 #define CHECK_GE(a, b) CHECK((a) >= (b))
 
+#define CHECK_INT64_EQ(expected, value) CheckInt64EqualsHelper(__FILE__, \
+  __LINE__, #expected, expected, #value, value)
+
 
 // This is inspired by the static assertion facility in boost.  This
 // is pretty magical.  If it causes you trouble on a platform you may
index 73d0f1ab06e7a3c488311f85b755990b43d11bc3..0e4b5b1717c7447edc8679e838f13b68f3ea801c 100644 (file)
@@ -702,18 +702,12 @@ THREADED_TEST(PropertyHandler) {
 }
 
 
-#if V8_HOST_ARCH_64_BIT
-# define CAST_TO_INT64(x) (int(x))
-#else
-# define CAST_TO_INT64(x) (int64_t(x))
-#endif
-
 THREADED_TEST(TinyInteger) {
   v8::HandleScope scope;
   LocalContext env;
   int32_t value = 239;
   Local<v8::Integer> value_obj = v8::Integer::New(value);
-  CHECK_EQ(CAST_TO_INT64(value), value_obj->Value());
+  CHECK_INT64_EQ(static_cast<int64_t>(value), value_obj->Value());
 }
 
 
@@ -724,7 +718,7 @@ THREADED_TEST(BigSmiInteger) {
   CHECK(i::Smi::IsValid(value));
   CHECK(!i::Smi::IsValid(value + 1));
   Local<v8::Integer> value_obj = v8::Integer::New(value);
-  CHECK_EQ(CAST_TO_INT64(value), value_obj->Value());
+  CHECK_INT64_EQ(static_cast<int64_t>(value), value_obj->Value());
 }
 
 
@@ -734,7 +728,7 @@ THREADED_TEST(BigInteger) {
   int32_t value = (1 << 30) + 1;
   CHECK(!i::Smi::IsValid(value));
   Local<v8::Integer> value_obj = v8::Integer::New(value);
-  CHECK_EQ(CAST_TO_INT64(value), value_obj->Value());
+  CHECK_INT64_EQ(static_cast<int64_t>(value), value_obj->Value());
 }
 
 
@@ -743,7 +737,7 @@ THREADED_TEST(TinyUnsignedInteger) {
   LocalContext env;
   uint32_t value = 239;
   Local<v8::Integer> value_obj = v8::Integer::New(value);
-  CHECK_EQ(CAST_TO_INT64(value), value_obj->Value());
+  CHECK_INT64_EQ(static_cast<int64_t>(value), value_obj->Value());
 }
 
 
@@ -754,7 +748,7 @@ THREADED_TEST(BigUnsignedSmiInteger) {
   CHECK(i::Smi::IsValid(value));
   CHECK(!i::Smi::IsValid(value + 1));
   Local<v8::Integer> value_obj = v8::Integer::New(value);
-  CHECK_EQ(CAST_TO_INT64(value), value_obj->Value());
+  CHECK_INT64_EQ(static_cast<int64_t>(value), value_obj->Value());
 }
 
 
@@ -764,7 +758,7 @@ THREADED_TEST(BigUnsignedInteger) {
   uint32_t value = (1 << 30) + 1;
   CHECK(!i::Smi::IsValid(value));
   Local<v8::Integer> value_obj = v8::Integer::New(value);
-  CHECK_EQ(CAST_TO_INT64(value), value_obj->Value());
+  CHECK_INT64_EQ(static_cast<int64_t>(value), value_obj->Value());
 }
 
 
@@ -773,7 +767,7 @@ THREADED_TEST(OutOfSignedRangeUnsignedInteger) {
   LocalContext env;
   uint32_t value = uint32_t(0xffffffff);
   Local<v8::Integer> value_obj = v8::Integer::New(value);
-  CHECK_EQ(CAST_TO_INT64(value), value_obj->Value());
+  CHECK_INT64_EQ(static_cast<int64_t>(value), value_obj->Value());
 }