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:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user