Revision: 3013
Author: [email protected]
Date: Fri Oct  2 08:51:07 2009
Log: Add a method to convert unsigned C integer into V8 Integer.

Review URL: http://codereview.chromium.org/260002
http://code.google.com/p/v8/source/detail?r=3013

Modified:
  /branches/bleeding_edge/include/v8.h
  /branches/bleeding_edge/src/checks.h
  /branches/bleeding_edge/test/cctest/test-api.cc

=======================================
--- /branches/bleeding_edge/include/v8.h        Thu Oct  1 03:33:05 2009
+++ /branches/bleeding_edge/include/v8.h        Fri Oct  2 08:51:07 2009
@@ -1063,6 +1063,7 @@
  class V8EXPORT Integer : public Number {
   public:
    static Local<Integer> New(int32_t value);
+  static inline Local<Integer> New(uint32_t value);
    int64_t Value() const;
    static inline Integer* Cast(v8::Value* obj);
   private:
@@ -3024,6 +3025,16 @@
  #endif
    return static_cast<Number*>(value);
  }
+
+
+Local<Integer> Integer::New(uint32_t value) {
+  // If highest bit is not set, chances are it's SMI.
+  bool could_be_smi = (value & (1 << 31)) == 0;
+  if (could_be_smi) {
+    return Integer::New(static_cast<int32_t>(value));
+  }
+  return Local<Integer>::Cast(Number::New(value));
+}


  Integer* Integer::Cast(v8::Value* value) {
=======================================
--- /branches/bleeding_edge/src/checks.h        Tue Sep  8 01:49:54 2009
+++ /branches/bleeding_edge/src/checks.h        Fri Oct  2 08:51:07 2009
@@ -79,6 +79,25 @@
               expected_source, value_source, expected, value);
    }
  }
+
+// 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) {
+  if (expected != value) {
+    // Sorry, printing int64_t in a fanky hex way,
+    // that's our mother tongue after all :)
+    V8_Fatal(file, line,
+             "CHECK_EQ(%s, %s) failed\n#"
+             "   Expected: 0x%08x%08x\n#   Found: 0x%08x%08x",
+             expected_source, value_source,
+             uint32_t(expected >> 32), uint32_t(expected),
+             uint32_t(value >> 32), uint32_t(value));
+  }
+}


  // Helper function used by the CHECK_NE function when given int
=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc     Thu Oct  1 03:33:05 2009
+++ /branches/bleeding_edge/test/cctest/test-api.cc     Fri Oct  2 08:51:07 2009
@@ -700,6 +700,75 @@
    Local<Script> setter = v8_compile("obj.foo = 901;");
    CHECK_EQ(901, setter->Run()->Int32Value());
  }
+
+
+THREADED_TEST(TinyInteger) {
+  v8::HandleScope scope;
+  LocalContext env;
+  int32_t value = 239;
+  Local<v8::Integer> value_obj = v8::Integer::New(value);
+  CHECK_EQ(int64_t(value), value_obj->Value());
+}
+
+
+THREADED_TEST(BigSmiInteger) {
+  v8::HandleScope scope;
+  LocalContext env;
+  int32_t value = (1 << 30) - 1;
+  CHECK(i::Smi::IsValid(value));
+  CHECK(!i::Smi::IsValid(value + 1));
+  Local<v8::Integer> value_obj = v8::Integer::New(value);
+  CHECK_EQ(int64_t(value), value_obj->Value());
+}
+
+
+THREADED_TEST(BigInteger) {
+  v8::HandleScope scope;
+  LocalContext env;
+  int32_t value = (1 << 30) + 1;
+  CHECK(!i::Smi::IsValid(value));
+  Local<v8::Integer> value_obj = v8::Integer::New(value);
+  CHECK_EQ(int64_t(value), value_obj->Value());
+}
+
+
+THREADED_TEST(TinyUnsignedInteger) {
+  v8::HandleScope scope;
+  LocalContext env;
+  uint32_t value = 239;
+  Local<v8::Integer> value_obj = v8::Integer::New(value);
+  CHECK_EQ(int64_t(value), value_obj->Value());
+}
+
+
+THREADED_TEST(BigUnsignedSmiInteger) {
+  v8::HandleScope scope;
+  LocalContext env;
+  uint32_t value = (1 << 30) - 1;
+  CHECK(i::Smi::IsValid(value));
+  CHECK(!i::Smi::IsValid(value + 1));
+  Local<v8::Integer> value_obj = v8::Integer::New(value);
+  CHECK_EQ(int64_t(value), value_obj->Value());
+}
+
+
+THREADED_TEST(BigUnsignedInteger) {
+  v8::HandleScope scope;
+  LocalContext env;
+  uint32_t value = (1 << 30) + 1;
+  CHECK(!i::Smi::IsValid(value));
+  Local<v8::Integer> value_obj = v8::Integer::New(value);
+  CHECK_EQ(int64_t(value), value_obj->Value());
+}
+
+
+THREADED_TEST(OutOfSignedRangeUnsignedInteger) {
+  v8::HandleScope scope;
+  LocalContext env;
+  uint32_t value = uint32_t(0xffffffff);
+  Local<v8::Integer> value_obj = v8::Integer::New(value);
+  CHECK_EQ(int64_t(value), value_obj->Value());
+}


  THREADED_TEST(Number) {

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to