diff options
author | Eliot Horowitz <eliot@10gen.com> | 2009-08-19 11:49:21 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2009-08-19 11:49:21 -0400 |
commit | 9ce02334be2738eec92da44d5450a5923c801ba5 (patch) | |
tree | cf2dd9a02b049fd4ea9577e46e39854c4a83a328 | |
parent | 1e689145e6ca7907fd458c71a3c0543c23d52a21 (diff) | |
download | mongo-9ce02334be2738eec92da44d5450a5923c801ba5.tar.gz |
couple of small optimizations
-rw-r--r-- | scripting/engine.cpp | 4 | ||||
-rw-r--r-- | scripting/engine.h | 2 | ||||
-rw-r--r-- | scripting/engine_spidermonkey.cpp | 28 |
3 files changed, 22 insertions, 12 deletions
diff --git a/scripting/engine.cpp b/scripting/engine.cpp index bb85691171e..132793743b9 100644 --- a/scripting/engine.cpp +++ b/scripting/engine.cpp @@ -183,8 +183,8 @@ namespace mongo { /** * @return 0 on success */ - int invoke( ScriptingFunction func , const BSONObj& args, int timeoutMs = 0 ){ - return _real->invoke( func , args , timeoutMs ); + int invoke( ScriptingFunction func , const BSONObj& args, int timeoutMs , bool ignoreReturn ){ + return _real->invoke( func , args , timeoutMs , ignoreReturn ); } string getError(){ diff --git a/scripting/engine.h b/scripting/engine.h index 8475d52c950..1d67e6a6239 100644 --- a/scripting/engine.h +++ b/scripting/engine.h @@ -45,7 +45,7 @@ namespace mongo { /** * @return 0 on success */ - virtual int invoke( ScriptingFunction func , const BSONObj& args, int timeoutMs = 0 ) = 0; + virtual int invoke( ScriptingFunction func , const BSONObj& args, int timeoutMs = 0 , bool ignoreReturn = false ) = 0; void invokeSafe( ScriptingFunction func , const BSONObj& args, int timeoutMs = 0 ){ assert( invoke( func , args , timeoutMs ) == 0 ); } diff --git a/scripting/engine_spidermonkey.cpp b/scripting/engine_spidermonkey.cpp index 70d0785b78a..49d98bd3854 100644 --- a/scripting/engine_spidermonkey.cpp +++ b/scripting/engine_spidermonkey.cpp @@ -1132,7 +1132,7 @@ namespace mongo { return worked; } - int invoke( JSFunction * func , const BSONObj& args, int timeoutMs ){ + int invoke( JSFunction * func , const BSONObj& args, int timeoutMs , bool ignoreReturn ){ smlock; precall(); jsval rval; @@ -1140,12 +1140,19 @@ namespace mongo { int nargs = args.nFields(); auto_ptr<jsval> smargsPtr( new jsval[nargs] ); jsval* smargs = smargsPtr.get(); + if ( nargs ){ + + BSONObjIterator it( args ); + for ( int i=0; i<nargs; i++ ) + smargs[i] = _convertor->toval( it.next() ); + } - BSONObjIterator it( args ); - for ( int i=0; i<nargs; i++ ) - smargs[i] = _convertor->toval( it.next() ); - - setObject( "args" , args , true ); // this is for backwards compatability + if ( args.isEmpty() ){ + _convertor->setProperty( _global , "args" , JSVAL_NULL ); + } + else { + setObject( "args" , args , true ); // this is for backwards compatability + } installCheckTimeout( timeoutMs ); JSBool ret = JS_CallFunction( _context , _this , func , nargs , smargs , &rval ); @@ -1154,13 +1161,16 @@ namespace mongo { if ( !ret ) { return -3; } + + if ( ! ignoreReturn ){ + assert( JS_SetProperty( _context , _global , "return" , &rval ) ); + } - assert( JS_SetProperty( _context , _global , "return" , &rval ) ); return 0; } - int invoke( ScriptingFunction funcAddr , const BSONObj& args, int timeoutMs = 0 ){ - return invoke( (JSFunction*)funcAddr , args , timeoutMs ); + int invoke( ScriptingFunction funcAddr , const BSONObj& args, int timeoutMs = 0 , bool ignoreReturn = 0 ){ + return invoke( (JSFunction*)funcAddr , args , timeoutMs , ignoreReturn ); } void gotError( string s ){ |