mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-06-25 20:29:33 +00:00
53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
|
|
function evalWithCache(code, ctx) {
|
|
ctx = ctx || {};
|
|
ctx = Object.create(ctx, {
|
|
fileName: { value: "evalWithCacheCode.js" },
|
|
lineNumber: { value: 0 }
|
|
});
|
|
code = code instanceof Object ? code : cacheEntry(code);
|
|
|
|
// We create a new global ...
|
|
if (!("global" in ctx))
|
|
ctx.global = newGlobal({ cloneSingletons: true });
|
|
|
|
if (!("isRunOnce" in ctx))
|
|
ctx.isRunOnce = 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, Object.create(ctx, {saveBytecode: { value: true } }));
|
|
checkAfter(ctx);
|
|
|
|
ctx.global.generation = 1;
|
|
var res2 = evaluate(code, Object.create(ctx, {loadBytecode: { value: true }, saveBytecode: { 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));
|
|
}
|
|
}
|