Skip to content

Commit 8b8b3a4

Browse files
committed
typechecker: Optimisation for avoiding unneeded assignment to temporaries
1 parent 0c51407 commit 8b8b3a4

1 file changed

Lines changed: 43 additions & 7 deletions

File tree

selfhost/typechecker.jakt

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7316,7 +7316,6 @@ struct Typechecker {
73167316
safety_mode: SafetyMode
73177317
) throws -> [CheckedStatement] {
73187318
match lhs {
7319-
// Simple variable assignment
73207319
Var => {
73217320
let assign_stmt = ParsedStatement::Expression(
73227321
expr: ParsedExpression::BinaryOp(
@@ -7330,11 +7329,50 @@ struct Typechecker {
73307329
let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
73317330
return [checked_assign]
73327331
}
7333-
7334-
// Nested tuple assignment - handle recursively
73357332
JaktTuple(values) => {
7336-
// Create a temporary variable for the nested tuple RHS
7337-
let nested_tmp_name = format("__jakt_nested_tuple_tmp{}", .temp_var_count)
7333+
// Optimization: If all elements are simple variables, we can
7334+
// avoid introducing an intermediate temporary and directly index
7335+
// into the parent tuple expression (chaining IndexedTuple expressions).
7336+
mut no_nesting = true
7337+
for v in values {
7338+
match v {
7339+
Var => {},
7340+
else => {
7341+
no_nesting = false
7342+
break
7343+
}
7344+
}
7345+
}
7346+
7347+
if no_nesting {
7348+
mut direct_assignments: [CheckedStatement] = []
7349+
for i in 0..values.size() {
7350+
let nested_lhs = values[i]
7351+
let nested_rhs = ParsedExpression::IndexedTuple(
7352+
expr: rhs,
7353+
index: i,
7354+
is_optional: false,
7355+
span: nested_lhs.span()
7356+
)
7357+
7358+
// Build assignment: nested_lhs = rhs.get<i>()
7359+
let assign_stmt = ParsedStatement::Expression(
7360+
expr: ParsedExpression::BinaryOp(
7361+
lhs: nested_lhs,
7362+
op: BinaryOperator::Assign,
7363+
rhs: nested_rhs,
7364+
span: nested_lhs.span()
7365+
)
7366+
span: nested_lhs.span()
7367+
)
7368+
let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
7369+
direct_assignments.push(checked_assign)
7370+
}
7371+
return direct_assignments
7372+
}
7373+
7374+
// else: introduce an intermediate temporary for the nested tuple RHS
7375+
let nested_tmp_name = format("__jakt_tuple_assign_tmp{}", .temp_var_count)
73387376
.temp_var_count++
73397377

73407378
let nested_tmp_decl = ParsedVarDecl(
@@ -7372,8 +7410,6 @@ struct Typechecker {
73727410

73737411
return nested_assignments
73747412
}
7375-
7376-
// Other expressions - not allowed in tuple destructuring
73777413
else => {
73787414
.error("Left-hand side of tuple assignment must be variables or nested tuples", lhs.span())
73797415
return []

0 commit comments

Comments
 (0)