Revision: 3038 Author: [email protected] Date: Thu Oct 8 05:54:29 2009 Log: Introduce v8::Integer::NewFromUnsigned method.
Review URL: http://codereview.chromium.org/251100 http://code.google.com/p/v8/source/detail?r=3038 Modified: /branches/bleeding_edge/include/v8.h /branches/bleeding_edge/src/checks.h /branches/bleeding_edge/src/x64/macro-assembler-x64.cc /branches/bleeding_edge/test/cctest/test-api.cc ======================================= --- /branches/bleeding_edge/include/v8.h Thu Oct 8 05:36:12 2009 +++ /branches/bleeding_edge/include/v8.h Thu Oct 8 05:54:29 2009 @@ -1063,6 +1063,7 @@ class V8EXPORT Integer : public Number { public: static Local<Integer> New(int32_t value); + static inline Local<Integer> NewFromUnsigned(uint32_t value); int64_t Value() const; static inline Integer* Cast(v8::Value* obj); private: @@ -3043,6 +3044,15 @@ #endif return static_cast<Number*>(value); } + + +Local<Integer> Integer::NewFromUnsigned(uint32_t value) { + bool fits_into_int32_t = (value & (1 << 31)) == 0; + if (fits_into_int32_t) { + 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 Mon Oct 5 03:50:55 2009 +++ /branches/bleeding_edge/src/checks.h Thu Oct 8 05:54:29 2009 @@ -79,6 +79,27 @@ 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) { + // 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", + expected_source, value_source, + static_cast<uint32_t>(expected >> 32), + static_cast<uint32_t>(expected), + static_cast<uint32_t>(value >> 32), + static_cast<uint32_t>(value)); + } +} // Helper function used by the CHECK_NE function when given int ======================================= --- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Thu Oct 8 05:36:12 2009 +++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Thu Oct 8 05:54:29 2009 @@ -1463,7 +1463,7 @@ Smi* constant, Label* on_not_smi_result) { // Does not assume that src is a smi. - ASSERT_EQ(1, kSmiTagMask); + ASSERT_EQ(static_cast<intptr_t>(1), kSmiTagMask); ASSERT_EQ(0, kSmiTag); Register tmp = (src.is(dst) ? kScratchRegister : dst); ======================================= --- /branches/bleeding_edge/test/cctest/test-api.cc Thu Oct 8 05:36:12 2009 +++ /branches/bleeding_edge/test/cctest/test-api.cc Thu Oct 8 05:54:29 2009 @@ -25,8 +25,6 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#include <stdlib.h> - #include "v8.h" #include "api.h" @@ -700,6 +698,79 @@ 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(static_cast<int64_t>(value), value_obj->Value()); +} + + +THREADED_TEST(BigSmiInteger) { + v8::HandleScope scope; + LocalContext env; + int32_t value = i::Smi::kMaxValue; + CHECK(i::Smi::IsValid(value)); + CHECK(!i::Smi::IsValid(value + 1)); + Local<v8::Integer> value_obj = v8::Integer::New(value); + CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); +} + + +THREADED_TEST(BigInteger) { + v8::HandleScope scope; + LocalContext env; + int32_t value = i::Smi::kMaxValue + 1; + CHECK(value > i::Smi::kMaxValue); + CHECK(!i::Smi::IsValid(value)); + Local<v8::Integer> value_obj = v8::Integer::New(value); + CHECK_EQ(static_cast<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::NewFromUnsigned(value); + CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); +} + + +THREADED_TEST(BigUnsignedSmiInteger) { + v8::HandleScope scope; + LocalContext env; + uint32_t value = static_cast<uint32_t>(i::Smi::kMaxValue); + CHECK(i::Smi::IsValid(value)); + CHECK(!i::Smi::IsValid(value + 1)); + Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value); + CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); +} + + +THREADED_TEST(BigUnsignedInteger) { + v8::HandleScope scope; + LocalContext env; + uint32_t value = static_cast<uint32_t>(i::Smi::kMaxValue) + 1; + CHECK(value > static_cast<uint32_t>(i::Smi::kMaxValue)); + CHECK(!i::Smi::IsValid(value)); + Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value); + CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); +} + + +THREADED_TEST(OutOfSignedRangeUnsignedInteger) { + v8::HandleScope scope; + LocalContext env; + uint32_t INT32_MAX_AS_UINT = (1U << 31) - 1; + uint32_t value = INT32_MAX_AS_UINT + 1; + CHECK(value > INT32_MAX_AS_UINT); // No overflow. + Local<v8::Integer> value_obj = v8::Integer::NewFromUnsigned(value); + CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); +} THREADED_TEST(Number) { --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
