Bug 1330373 - Capture JSScript::lazyScript field when encoding bytecode incrementally. r=shu

This commit is contained in:
Nicolas B. Pierron 2017-06-16 12:31:54 +00:00
Родитель 7fac060768
Коммит c0de281328
3 изменённых файлов: 37 добавлений и 7 удалений

Просмотреть файл

@ -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;
}