Skip to content

Commit 976ed2f

Browse files
authored
Fix assignment to undefined globals in try catch with no return (#1192)
1 parent 2df7047 commit 976ed2f

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

src/transformation/visitors/errors.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,31 +44,38 @@ export const transformTryStatement: FunctionVisitor<ts.TryStatement> = (statemen
4444
const catchParameter = statement.catchClause.variableDeclaration
4545
? transformIdentifier(context, statement.catchClause.variableDeclaration.name as ts.Identifier)
4646
: undefined;
47-
const catchParameters = () => (catchParameter ? [lua.cloneIdentifier(catchParameter)] : []);
48-
47+
const catchFunction = lua.createFunctionExpression(
48+
catchBlock,
49+
catchParameter ? [lua.cloneIdentifier(catchParameter)] : []
50+
);
4951
const catchIdentifier = lua.createIdentifier("____catch");
50-
const catchFunction = lua.createFunctionExpression(catchBlock, catchParameters());
5152
result.push(lua.createVariableDeclarationStatement(catchIdentifier, catchFunction));
5253

54+
const hasReturn = tryScope.functionReturned ?? catchScope.functionReturned;
55+
5356
const tryReturnIdentifiers = [tryResultIdentifier]; // ____try
54-
if (returnedIdentifier) {
55-
tryReturnIdentifiers.push(returnedIdentifier); // ____returned or catch variable
56-
if (tryScope.functionReturned || catchScope.functionReturned) {
57+
if (hasReturn || statement.catchClause.variableDeclaration) {
58+
tryReturnIdentifiers.push(returnedIdentifier); // ____returned
59+
if (hasReturn) {
5760
tryReturnIdentifiers.push(returnValueIdentifier); // ____returnValue
5861
returnCondition = lua.cloneIdentifier(returnedIdentifier);
5962
}
6063
}
6164
result.push(lua.createVariableDeclarationStatement(tryReturnIdentifiers, tryCall));
6265

63-
// Wrap catch in function if try or catch has return
64-
const catchCall = lua.createCallExpression(catchIdentifier, [lua.cloneIdentifier(returnedIdentifier)]);
65-
const catchAssign = lua.createAssignmentStatement(
66-
[lua.cloneIdentifier(returnedIdentifier), lua.cloneIdentifier(returnValueIdentifier)],
67-
catchCall
66+
const catchCall = lua.createCallExpression(
67+
catchIdentifier,
68+
statement.catchClause.variableDeclaration ? [lua.cloneIdentifier(returnedIdentifier)] : []
6869
);
70+
const catchCallStatement = hasReturn
71+
? lua.createAssignmentStatement(
72+
[lua.cloneIdentifier(returnedIdentifier), lua.cloneIdentifier(returnValueIdentifier)],
73+
catchCall
74+
)
75+
: lua.createExpressionStatement(catchCall);
6976

7077
const notTryCondition = lua.createUnaryExpression(tryResultIdentifier, lua.SyntaxKind.NotOperator);
71-
result.push(lua.createIfStatement(notTryCondition, lua.createBlock([catchAssign])));
78+
result.push(lua.createIfStatement(notTryCondition, lua.createBlock([catchCallStatement])));
7279
} else if (tryScope.functionReturned) {
7380
// try with return, but no catch
7481
// returnedIdentifier = lua.createIdentifier("____returned");

0 commit comments

Comments
 (0)