diff options
author | Eliot Horowitz <eliot@10gen.com> | 2009-05-26 14:43:20 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2009-05-26 14:43:20 -0400 |
commit | c0fef5d2abdc049554f410bdfc5f87bd834dd771 (patch) | |
tree | fcd93429a0bc4a58944b0b27ebe42cd71d1f57b7 /scripting | |
parent | c7c389007915217d14e3395e341dceb8c8d2808d (diff) | |
download | mongo-c0fef5d2abdc049554f410bdfc5f87bd834dd771.tar.gz |
don't translate sm -> bson if object hasn't been modified
SERVER-70
Diffstat (limited to 'scripting')
-rw-r--r-- | scripting/engine_spidermonkey.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/scripting/engine_spidermonkey.cpp b/scripting/engine_spidermonkey.cpp index 0fc147f68a9..bb3396181b5 100644 --- a/scripting/engine_spidermonkey.cpp +++ b/scripting/engine_spidermonkey.cpp @@ -19,6 +19,7 @@ namespace mongo { BSONHolder( BSONObj obj ){ _obj = obj.getOwned(); _inResolve = false; + _modified = false; _magic = 17; } @@ -32,6 +33,7 @@ namespace mongo { bool _inResolve; char _magic; list<string> _extra; + bool _modified; }; class BSONFieldIterator { @@ -122,7 +124,10 @@ namespace mongo { BSONObj orig; if ( JS_InstanceOf( _context , o , &bson_class , 0 ) ){ - orig = GETHOLDER(_context,o)->_obj; + BSONHolder * holder = GETHOLDER(_context,o); + if ( ! holder->_modified ) + return holder->_obj; + orig = holder->_obj; } BSONObjBuilder b; @@ -511,18 +516,26 @@ namespace mongo { if ( ! holder->_inResolve ){ Convertor c(cx); holder->_extra.push_back( c.toString( idval ) ); + holder->_modified = true; } return JS_TRUE; } + + JSBool mark_modified( JSContext *cx, JSObject *obj, jsval idval, jsval *vp){ + BSONHolder * holder = GETHOLDER( cx , obj ); + if ( holder->_inResolve ) + return JS_TRUE; + holder->_modified = true; + return JS_TRUE; + } + JSClass bson_class = { "bson_object" , JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_NEW_ENUMERATE , - bson_add_prop, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, + bson_add_prop, mark_modified, JS_PropertyStub, mark_modified, (JSEnumerateOp)bson_enumerate, (JSResolveOp)(&resolveBSONField) , JS_ConvertStub, bson_finalize , JSCLASS_NO_OPTIONAL_MEMBERS }; - - static JSClass global_class = { "global", JSCLASS_GLOBAL_FLAGS, |