diff --git a/scripting/engine.cpp b/scripting/engine.cpp index 85463d9adf2..fb5bd907c80 100644 --- a/scripting/engine.cpp +++ b/scripting/engine.cpp @@ -9,10 +9,14 @@ namespace mongo { long long Scope::_lastVersion = 1; + int Scope::_numScopes = 0; + Scope::Scope() : _localDBName("") , _loadedVersion(0){ + _numScopes++; } Scope::~Scope(){ + _numScopes--; } ScriptEngine::ScriptEngine(){ @@ -122,6 +126,15 @@ namespace mongo { setElement( n.valuestr() , v ); } } + + ScriptingFunction Scope::createFunction( const char * code ){ + map::iterator i = _cachedFunctions.find( code ); + if ( i != _cachedFunctions.end() ) + return i->second; + ScriptingFunction f = _createFunction( code ); + _cachedFunctions[code] = f; + return f; + } typedef map< string , list > PoolToScopes; @@ -261,6 +274,10 @@ namespace mongo { return _real->createFunction( code ); } + ScriptingFunction _createFunction( const char * code ){ + return _real->createFunction( code ); + } + /** * @return 0 on success */ diff --git a/scripting/engine.h b/scripting/engine.h index 5dbf91c91f3..e5c164be836 100644 --- a/scripting/engine.h +++ b/scripting/engine.h @@ -43,8 +43,8 @@ namespace mongo { virtual void setBoolean( const char *field , bool val ) = 0; virtual void setThis( const BSONObj * obj ) = 0; - virtual ScriptingFunction createFunction( const char * code ) = 0; - + virtual ScriptingFunction createFunction( const char * code ); + /** * @return 0 on success */ @@ -77,10 +77,20 @@ namespace mongo { */ static void storedFuncMod(); + static int getNumScopes(){ + return _numScopes; + } + protected: + + virtual ScriptingFunction _createFunction( const char * code ) = 0; + string _localDBName; long long _loadedVersion; static long long _lastVersion; + map _cachedFunctions; + + static int _numScopes; }; class ScriptEngine : boost::noncopyable { diff --git a/scripting/engine_spidermonkey.cpp b/scripting/engine_spidermonkey.cpp index 378a28090ec..454298b173b 100644 --- a/scripting/engine_spidermonkey.cpp +++ b/scripting/engine_spidermonkey.cpp @@ -1136,7 +1136,7 @@ namespace mongo { // ---- functions ----- - ScriptingFunction createFunction( const char * code ){ + ScriptingFunction _createFunction( const char * code ){ smlock; precall(); return (ScriptingFunction)_convertor->compileFunction( code );