aboutsummaryrefslogtreecommitdiff
path: root/src/client/util/Scripting.ts
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2022-08-30 12:11:49 -0400
committerbobzel <zzzman@gmail.com>2022-08-30 12:11:49 -0400
commit5dcf35a986bb1d9dbe6c26d0a7056ac43ceed007 (patch)
tree2eedf69b3a7e52a5d60fee09b4694113ba470264 /src/client/util/Scripting.ts
parent505fa1fe53b2ffc75231f2ee8a66da4be92c76c4 (diff)
made script caching more robust to avoid compiles and speed up startup.
Diffstat (limited to 'src/client/util/Scripting.ts')
-rw-r--r--src/client/util/Scripting.ts8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/client/util/Scripting.ts b/src/client/util/Scripting.ts
index ea2bf6551..6dcdcb71b 100644
--- a/src/client/util/Scripting.ts
+++ b/src/client/util/Scripting.ts
@@ -7,6 +7,8 @@
import * as typescriptlib from '!!raw-loader!./type_decls.d';
import * as ts from 'typescript';
import { Doc, Field } from '../../fields/Doc';
+import { ObjectField } from '../../fields/ObjectField';
+import { ScriptField } from '../../fields/ScriptField';
import { scriptingGlobals, ScriptingGlobals } from './ScriptingGlobals';
export { ts };
@@ -177,6 +179,10 @@ function forEachNode(node: ts.Node, onEnter: Traverser, onExit?: Traverser, inde
}
export function CompileScript(script: string, options: ScriptOptions = {}): CompileResult {
+ const captured = options.capturedVariables ?? {};
+ const signature = Object.keys(captured).reduce((p, v) => p + `${v}=${captured[v] instanceof ObjectField ? 'XXX' : captured[v].toString()}`, '');
+ const found = ScriptField.GetScriptFieldCache(script + ':' + signature);
+ if (found) return found as CompiledScript;
const { requiredType = '', addReturn = false, params = {}, capturedVariables = {}, typecheck = true } = options;
if (options.params && !options.params.this) options.params.this = Doc.name;
if (options.params && !options.params.self) options.params.self = Doc.name;
@@ -241,6 +247,8 @@ export function CompileScript(script: string, options: ScriptOptions = {}): Comp
if (options.globals) {
ScriptingGlobals.resetScriptingGlobals();
}
+ !signature.includes('XXX') && ScriptField._scriptFieldCache.set(script + ':' + signature, result as CompiledScript);
+ //console.log('COMPILED: ' + script + ':' + signature);
return result;
}