summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/lib/bytecode-cache.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/lib/bytecode-cache.js')
-rw-r--r--js/src/jit-test/lib/bytecode-cache.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/js/src/jit-test/lib/bytecode-cache.js b/js/src/jit-test/lib/bytecode-cache.js
new file mode 100644
index 0000000000..1f8f58643a
--- /dev/null
+++ b/js/src/jit-test/lib/bytecode-cache.js
@@ -0,0 +1,55 @@
+
+function evalWithCache(code, ctx) {
+ ctx = ctx || {};
+ ctx = Object.create(ctx, {
+ fileName: { value: "evalWithCacheCode.js" },
+ lineNumber: { value: 0 }
+ });
+ code = code instanceof Object ? code : cacheEntry(code);
+
+ var incremental = ctx.incremental || false;
+
+ // We create a new global ...
+ if (!("global" in ctx))
+ ctx.global = newGlobal({newCompartment: ctx.newCompartment});
+
+ var ctx_save = Object.create(ctx, {
+ saveIncrementalBytecode: { value: true }
+ });
+
+ // Fetch the verification function from the evaluation context. This function
+ // is used to assert the state of the script/function after each run of the
+ // evaluate function.
+ var checkAfter = ctx.checkAfter || function(ctx) {};
+
+ // The generation counter is used to represent environment variations which
+ // might cause the program to run differently, and thus to have a different
+ // set of functions executed.
+ ctx.global.generation = 0;
+ var res1 = evaluate(code, ctx_save);
+ checkAfter(ctx);
+
+ ctx.global.generation = 1;
+ var res2 = evaluate(code, Object.create(ctx_save, {loadBytecode: { value: true } }));
+ checkAfter(ctx);
+
+ ctx.global.generation = 2;
+ var res3 = evaluate(code, Object.create(ctx, {loadBytecode: { value: true } }));
+ checkAfter(ctx);
+
+ ctx.global.generation = 3;
+ var res0 = evaluate(code, ctx);
+ checkAfter(ctx);
+
+ if (ctx.assertEqResult) {
+ assertEq(res0, res1);
+ assertEq(res0, res2);
+ assertEq(res0, res3);
+ }
+
+ if (ctx.checkFrozen) {
+ assertEq(Object.isFrozen(res0), Object.isFrozen(res1));
+ assertEq(Object.isFrozen(res0), Object.isFrozen(res2));
+ assertEq(Object.isFrozen(res0), Object.isFrozen(res3));
+ }
+}