diff options
author | Aaron <aaron@10gen.com> | 2010-06-22 19:18:07 -0700 |
---|---|---|
committer | Aaron <aaron@10gen.com> | 2010-06-22 19:18:07 -0700 |
commit | 1e61dd92e0a096653f976414f8c2ff985f41adc4 (patch) | |
tree | 718e2a4016c1cbe3337a181fdc3844ebd91f64a6 /scripting | |
parent | bf36eebd4f32728d4ff0de6cc4a3a3605ab0af1d (diff) | |
download | mongo-1e61dd92e0a096653f976414f8c2ff985f41adc4.tar.gz |
SERVER-776 NumberLong in v8
Diffstat (limited to 'scripting')
-rw-r--r-- | scripting/sm_db.cpp | 2 | ||||
-rw-r--r-- | scripting/v8_db.cpp | 40 |
2 files changed, 35 insertions, 7 deletions
diff --git a/scripting/sm_db.cpp b/scripting/sm_db.cpp index 1fcfa62ebd4..b14d45efcdc 100644 --- a/scripting/sm_db.cpp +++ b/scripting/sm_db.cpp @@ -713,7 +713,7 @@ namespace mongo { char *endPtr = 0; errno = 0; long long n = strtoll( numStr, &endPtr, 10 ); - smuassert( cx , "could not convert numeric representation of string to long" , *endPtr == 0 && errno != ERANGE ); + smuassert( cx , "could not convert string to long long" , *endPtr == 0 && errno != ERANGE ); c.makeLongObj( n, obj ); } diff --git a/scripting/v8_db.cpp b/scripting/v8_db.cpp index 4d14a03acdc..eaf6e6197d9 100644 --- a/scripting/v8_db.cpp +++ b/scripting/v8_db.cpp @@ -632,8 +632,8 @@ namespace mongo { v8::Handle<v8::Value> numberLongInit( const v8::Arguments& args ) { - if (args.Length() != 1 && args.Length() != 3) { - return v8::ThrowException( v8::String::New( "NumberLong needs 1 or 3 arguments" ) ); + if (args.Length() != 0 && args.Length() != 1 && args.Length() != 3) { + return v8::ThrowException( v8::String::New( "NumberLong needs 0, 1 or 3 arguments" ) ); } v8::Handle<v8::Object> it = args.This(); @@ -642,9 +642,33 @@ namespace mongo { v8::Function* f = getNamedCons( "NumberLong" ); it = f->NewInstance(); } - - it->Set( v8::String::New( "floatApprox" ) , args[0] ); - if ( args.Length() == 3 ) { + + if ( args.Length() == 0 ) { + it->Set( v8::String::New( "floatApprox" ), v8::Number::New( 0 ) ); + } else if ( args.Length() == 1 ) { + if ( args[ 0 ]->IsNumber() ) { + it->Set( v8::String::New( "floatApprox" ), args[ 0 ] ); + } else { + v8::String::Utf8Value data( args[ 0 ] ); + string num = *data; + const char *numStr = num.c_str(); + char *endPtr = 0; + errno = 0; + long long n = strtoll( numStr, &endPtr, 10 ); + if ( !( *endPtr == 0 && errno != ERANGE ) ) { + return v8::ThrowException( v8::String::New( "could not convert string to long long" ) ); + } + unsigned long long val = n; + if ( (long long)val == (long long)(double)(long long)(val) ) { + it->Set( v8::String::New( "floatApprox" ), v8::Number::New( (double)(long long)( val ) ) ); + } else { + it->Set( v8::String::New( "floatApprox" ), v8::Number::New( (double)(long long)( val ) ) ); + it->Set( v8::String::New( "top" ), v8::Integer::New( val >> 32 ) ); + it->Set( v8::String::New( "bottom" ), v8::Integer::New( (unsigned long)(val & 0x00000000ffffffff) ) ); + } + } + } else { + it->Set( v8::String::New( "floatApprox" ) , args[0] ); it->Set( v8::String::New( "top" ) , args[1] ); it->Set( v8::String::New( "bottom" ) , args[2] ); } @@ -690,7 +714,11 @@ namespace mongo { long long val = numberLongVal( it ); stringstream ss; - ss << val; + if ( val == (long long)(double)( val ) ) { + ss << "NumberLong( " << double( val ) << " )"; + } else { + ss << "NumberLong( \"" << val << "\" )"; + } string ret = ss.str(); return v8::String::New( ret.c_str() ); } |