summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-08-19 11:49:21 -0400
committerEliot Horowitz <eliot@10gen.com>2009-08-19 11:49:21 -0400
commit9ce02334be2738eec92da44d5450a5923c801ba5 (patch)
treecf2dd9a02b049fd4ea9577e46e39854c4a83a328
parent1e689145e6ca7907fd458c71a3c0543c23d52a21 (diff)
downloadmongo-9ce02334be2738eec92da44d5450a5923c801ba5.tar.gz
couple of small optimizations
-rw-r--r--scripting/engine.cpp4
-rw-r--r--scripting/engine.h2
-rw-r--r--scripting/engine_spidermonkey.cpp28
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 ){