summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/javascript_execution.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/pipeline/javascript_execution.cpp')
-rw-r--r--src/mongo/db/pipeline/javascript_execution.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/mongo/db/pipeline/javascript_execution.cpp b/src/mongo/db/pipeline/javascript_execution.cpp
index f9ce429ba76..8b6d3bc6f9b 100644
--- a/src/mongo/db/pipeline/javascript_execution.cpp
+++ b/src/mongo/db/pipeline/javascript_execution.cpp
@@ -47,22 +47,37 @@ JsExecution* JsExecution::get(OperationContext* opCtx,
StringData database,
bool loadStoredProcedures,
boost::optional<int> jsHeapLimitMB) {
+ // If a JsExecution object has already been created, return it.
+ JsExecution* jsExec = getCached(opCtx, loadStoredProcedures);
+ if (jsExec) {
+ return jsExec;
+ }
+
+ // There is no cached JsExecution object, so create and cache one now.
auto& exec = getExec(opCtx);
- if (!exec) {
- exec = std::make_unique<JsExecution>(opCtx, scope, jsHeapLimitMB);
- exec->getScope()->setLocalDB(database);
- if (loadStoredProcedures) {
- exec->getScope()->loadStored(opCtx, true);
- }
- exec->_storedProceduresLoaded = loadStoredProcedures;
- } else {
- uassert(31438,
- "A single operation cannot use both JavaScript aggregation expressions and $where.",
- loadStoredProcedures == exec->_storedProceduresLoaded);
+ exec = std::make_unique<JsExecution>(opCtx, scope, jsHeapLimitMB);
+ exec->getScope()->setLocalDB(database);
+ if (loadStoredProcedures) {
+ exec->getScope()->loadStored(opCtx, true);
}
+ exec->_storedProceduresLoaded = loadStoredProcedures;
+
return exec.get();
}
+JsExecution* JsExecution::getCached(OperationContext* opCtx, bool loadStoredProcedures) {
+ auto& exec = getExec(opCtx);
+ if (exec) {
+ if (loadStoredProcedures == exec->_storedProceduresLoaded) {
+ return exec.get();
+ }
+ tasserted(
+ 9136200,
+ "A single operation cannot use both JavaScript aggregation expressions and $where.");
+ }
+ return nullptr;
+}
+
Value JsExecution::callFunction(ScriptingFunction func,
const BSONObj& params,
const BSONObj& thisObj) {