summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2013-04-03 19:23:31 -0400
committerEric Milkie <milkie@10gen.com>2013-04-05 22:23:39 -0400
commit219986d5caade286de1f40e7ea84ba4f0374d07f (patch)
tree645f36dbb5c68a40c9284fbfd02c0cc3bb38e288
parentaefcffa1248b4830699ff84b367246ba1317d748 (diff)
downloadmongo-219986d5caade286de1f40e7ea84ba4f0374d07f.tar.gz
Speed up conversion of v8::Arrays to BSON
Two major improvements: * Use BSONObjBuilder::numStr() to convert index to string (has global cache of strings for 0-99) * Use indexed rather than named iteration over the v8::Array
-rw-r--r--src/mongo/scripting/engine_v8.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/mongo/scripting/engine_v8.cpp b/src/mongo/scripting/engine_v8.cpp
index 7c9403b7760..296e2052699 100644
--- a/src/mongo/scripting/engine_v8.cpp
+++ b/src/mongo/scripting/engine_v8.cpp
@@ -1583,8 +1583,14 @@ namespace mongo {
return;
}
if (value->IsArray()) {
- BSONObj sub = v8ToMongo(value->ToObject(), depth);
- b.appendArray(sname, sub);
+ // Note: can't use BSONArrayBuilder because need to call recursively
+ BSONObjBuilder arrBuilder(b.subarrayStart(sname));
+ v8::Handle<v8::Array> array = value.As<v8::Array>();
+ const int len = array->Length();
+ for (int i=0; i < len; i++) {
+ const string name = BSONObjBuilder::numStr(i);
+ v8ToMongoElement(arrBuilder, name, array->Get(i), depth+1, originalParent);
+ }
return;
}
if (value->IsDate()) {