summaryrefslogtreecommitdiff
path: root/scripting
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2010-06-22 19:18:07 -0700
committerAaron <aaron@10gen.com>2010-06-22 19:18:07 -0700
commit1e61dd92e0a096653f976414f8c2ff985f41adc4 (patch)
tree718e2a4016c1cbe3337a181fdc3844ebd91f64a6 /scripting
parentbf36eebd4f32728d4ff0de6cc4a3a3605ab0af1d (diff)
downloadmongo-1e61dd92e0a096653f976414f8c2ff985f41adc4.tar.gz
SERVER-776 NumberLong in v8
Diffstat (limited to 'scripting')
-rw-r--r--scripting/sm_db.cpp2
-rw-r--r--scripting/v8_db.cpp40
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() );
}