diff --git a/scripting/engine.h b/scripting/engine.h index 1ff87b5db9e..67cdf0c7e68 100644 --- a/scripting/engine.h +++ b/scripting/engine.h @@ -60,6 +60,8 @@ namespace mongo { virtual bool execFile( const string& filename , bool printResult , bool reportError , bool assertOnError, int timeoutMs = 0 ); virtual void injectNative( const char *field, NativeFunction func ) = 0; + + virtual void gc() = 0; }; class ScriptEngine : boost::noncopyable { diff --git a/scripting/engine_spidermonkey.cpp b/scripting/engine_spidermonkey.cpp index bb3396181b5..ede14121003 100644 --- a/scripting/engine_spidermonkey.cpp +++ b/scripting/engine_spidermonkey.cpp @@ -339,13 +339,11 @@ namespace mongo { assert( array ); jsval myarray = OBJECT_TO_JSVAL( array ); - JS_AddRoot( _context , &myarray ); for ( int i=0; icheck(); - + string s = c.toString( id ); BSONElement e = holder->_obj[ s.c_str() ]; if ( e.type() == EOO ){ *objp = 0; + JS_LeaveLocalRootScope( cx ); return JS_TRUE; } @@ -622,6 +622,7 @@ namespace mongo { holder->_inResolve = false; *objp = obj; + JS_LeaveLocalRootScope( cx ); return JS_TRUE; } @@ -943,6 +944,10 @@ namespace mongo { } + virtual void gc(){ + JS_GC( _context ); + } + JSContext *context() const { return _context; } private: