зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1330373 - Capture JSScript::lazyScript field when encoding bytecode incrementally. r=shu
This commit is contained in:
Родитель
7fac060768
Коммит
c0de281328
|
@ -712,13 +712,6 @@ frontend::CompileLazyFunction(JSContext* cx, Handle<LazyScript*> lazy, const cha
|
|||
if (!NameFunctions(cx, pn))
|
||||
return false;
|
||||
|
||||
// XDR the newly delazified function.
|
||||
if (script->scriptSource()->hasEncoder() &&
|
||||
!script->scriptSource()->xdrEncodeFunction(cx, fun, sourceObject))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
load(libdir + 'bytecode-cache.js');
|
||||
var test = "";
|
||||
gczeal(0);
|
||||
|
||||
// Check that a GC can relazify decoded functions.
|
||||
//
|
||||
// Generations 0 and 3 are executed from the source, thus f is not executed yet.
|
||||
// Generations 1 and 2 are decoded, thus we recorded the delazified f function.
|
||||
test = `
|
||||
function f() { return 1; };
|
||||
assertEq(isLazyFunction(f), generation == 0 || generation == 3);
|
||||
f();
|
||||
expect = isRelazifiableFunction(f);
|
||||
assertEq(isLazyFunction(f), false);
|
||||
`;
|
||||
evalWithCache(test, {
|
||||
checkAfter: function (ctx) {
|
||||
gc(ctx.global.f, "shrinking"); // relazify f, if possible.
|
||||
evaluate("assertEq(isLazyFunction(f), expect);", ctx);
|
||||
}
|
||||
});
|
||||
|
||||
evalWithCache(test, {
|
||||
incremental: true,
|
||||
checkAfter: function (ctx) {
|
||||
gc(ctx.global.f, "shrinking"); // relazify f, if possible.
|
||||
evaluate("assertEq(isLazyFunction(f), expect);", ctx);
|
||||
}
|
||||
});
|
|
@ -1567,6 +1567,14 @@ JSFunction::createScriptForLazilyInterpretedFunction(JSContext* cx, HandleFuncti
|
|||
// Only functions without inner functions are re-lazified.
|
||||
script->setLazyScript(lazy);
|
||||
}
|
||||
|
||||
// XDR the newly delazified function.
|
||||
if (script->scriptSource()->hasEncoder()) {
|
||||
RootedScriptSource sourceObject(cx, lazy->sourceObject());
|
||||
if (!script->scriptSource()->xdrEncodeFunction(cx, fun, sourceObject))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче