Mark class prototype as read-only (#12115)

* initial code 2 fix the issue #2025

* Mark class prototype as read-only

* Update fixtures

* Fix failure

* Update Babel 8 fixtures

* Disable in loose mode

* Update fixtures

Co-authored-by: Nicolò Ribaudo <nicolo.ribaudo@gmail.com>
This commit is contained in:
wentout
2021-12-10 23:44:48 +03:00
committed by GitHub
parent 39080492f4
commit c59870c526
221 changed files with 490 additions and 458 deletions

View File

@@ -58,6 +58,7 @@ export default function transformClass(
superThises: [],
pushedConstructor: false,
pushedInherits: false,
pushedCreateClass: false,
protoAlias: null,
isLoose: false,
@@ -93,6 +94,10 @@ export default function transformClass(
},
]);
function createClassHelper(args) {
return t.callExpression(classState.file.addHelper("createClass"), args);
}
/**
* Creates a class constructor or bail out if there is none
*/
@@ -240,11 +245,8 @@ export default function transformClass(
}
args = args.slice(0, lastNonNullIndex + 1);
body.push(
t.expressionStatement(
t.callExpression(classState.file.addHelper("createClass"), args),
),
);
body.push(t.expressionStatement(createClassHelper(args)));
classState.pushedCreateClass = true;
}
}
@@ -737,10 +739,16 @@ export default function transformClass(
if (constructorOnly) {
// named class with only a constructor
return t.toExpression(body[0]);
const expr = t.toExpression(body[0]);
return classState.isLoose ? expr : createClassHelper([expr]);
}
body.push(t.returnStatement(t.cloneNode(classState.classRef)));
let returnArg = t.cloneNode(classState.classRef);
if (!classState.pushedCreateClass && !classState.isLoose) {
returnArg = createClassHelper([returnArg]);
}
body.push(t.returnStatement(returnArg));
const container = t.arrowFunctionExpression(
closureParams,
t.blockStatement(body, directives),