Bug 1385428 - Disable asm.js compilation in accessor methods. r=luke

--HG--
extra : rebase_source : a67e1821f4f579d47d88204c487964d471b58d5d
This commit is contained in:
André Bargull 2017-07-29 02:37:24 -07:00
parent 5c9399ceab
commit fa5f8209e7
4 changed files with 29 additions and 1 deletions

View File

@ -527,6 +527,11 @@ class ParseContext : public Nestable<ParseContext>
return sc_->isFunctionBox() && sc_->asFunctionBox()->function()->isMethod();
}
bool isGetterOrSetter() const {
return sc_->isFunctionBox() && (sc_->asFunctionBox()->function()->isGetter() ||
sc_->asFunctionBox()->function()->isSetter());
}
uint32_t scriptId() const {
return scriptId_;
}

View File

@ -0,0 +1,19 @@
if (!('oomTest' in this))
quit();
loadFile(`
try {
Array.prototype.splice.call({ get length() {
"use asm"
function f() {}
return f;
} });
} catch (e) {
assertEq(e, s2, "wrong error thrown: " + e);
}
`);
function loadFile(lfVarx) {
try {
oomTest(new Function(lfVarx));
} catch (lfVare) {}
}

View File

@ -138,6 +138,10 @@ assertTypeFailInEval('function *f() { "use asm"; function g() {} return g }');
assertTypeFailInEval('f => { "use asm"; function g() {} return g }');
assertTypeFailInEval('var f = { method() {"use asm"; return {}} }');
assertAsmTypeFail(USE_ASM + 'return {m() {}};');
assertTypeFailInEval('var f = { get p() {"use asm"; return {}} }');
assertAsmTypeFail(USE_ASM + 'return {get p() {}};');
assertTypeFailInEval('var f = { set p(x) {"use asm"; return {}} }');
assertAsmTypeFail(USE_ASM + 'return {set p(x) {}};');
assertTypeFailInEval('class f { constructor() {"use asm"; return {}} }');
assertAsmTypeFail(USE_ASM + 'class c { constructor() {}}; return c;');

View File

@ -8665,7 +8665,7 @@ EstablishPreconditions(JSContext* cx, AsmJSParser& parser)
return Warn(parser, JSMSG_USE_ASM_TYPE_FAIL, "Disabled by arrow function context");
// Class constructors are also methods
if (parser.pc->isMethod())
if (parser.pc->isMethod() || parser.pc->isGetterOrSetter())
return Warn(parser, JSMSG_USE_ASM_TYPE_FAIL, "Disabled by class constructor or method context");
return true;