summaryrefslogtreecommitdiff
path: root/scripting
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-05-26 14:43:20 -0400
committerEliot Horowitz <eliot@10gen.com>2009-05-26 14:43:20 -0400
commitc0fef5d2abdc049554f410bdfc5f87bd834dd771 (patch)
treefcd93429a0bc4a58944b0b27ebe42cd71d1f57b7 /scripting
parentc7c389007915217d14e3395e341dceb8c8d2808d (diff)
downloadmongo-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.cpp21
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,