Skip to content

Commit 4ec8fb9

Browse files
committed
typechecker: Optimisation avoiding unneeded assignment to temporaries
1 parent eec5f72 commit 4ec8fb9

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
@@ -7311,7 +7311,6 @@ struct Typechecker {
73117311
safety_mode: SafetyMode
73127312
) throws -> [CheckedStatement] {
73137313
match lhs {
7314-
// Simple variable assignment
73157314
Var => {
73167315
let assign_stmt = ParsedStatement::Expression(
73177316
expr: ParsedExpression::BinaryOp(
@@ -7325,11 +7324,50 @@ struct Typechecker {
73257324
let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
73267325
return [checked_assign]
73277326
}
7328-
7329-
// Nested tuple assignment - handle recursively
73307327
JaktTuple(values) => {
7331-
// Create a temporary variable for the nested tuple RHS
7332-
let nested_tmp_name = format("__jakt_nested_tuple_tmp{}", .temp_var_count)
7328+
// Optimization: If all elements are simple variables, we can
7329+
// avoid introducing an intermediate temporary and directly index
7330+
// into the parent tuple expression (chaining IndexedTuple expressions).
7331+
mut no_nesting = true
7332+
for v in values {
7333+
match v {
7334+
Var => {},
7335+
else => {
7336+
no_nesting = false
7337+
break
7338+
}
7339+
}
7340+
}
7341+
7342+
if no_nesting {
7343+
mut direct_assignments: [CheckedStatement] = []
7344+
for i in 0..values.size() {
7345+
let nested_lhs = values[i]
7346+
let nested_rhs = ParsedExpression::IndexedTuple(
7347+
expr: rhs,
7348+
index: i,
7349+
is_optional: false,
7350+
span: nested_lhs.span()
7351+
)
7352+
7353+
// Build assignment: nested_lhs = rhs.get<i>()
7354+
let assign_stmt = ParsedStatement::Expression(
7355+
expr: ParsedExpression::BinaryOp(
7356+
lhs: nested_lhs,
7357+
op: BinaryOperator::Assign,
7358+
rhs: nested_rhs,
7359+
span: nested_lhs.span()
7360+
)
7361+
span: nested_lhs.span()
7362+
)
7363+
let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
7364+
direct_assignments.push(checked_assign)
7365+
}
7366+
return direct_assignments
7367+
}
7368+
7369+
// else: introduce an intermediate temporary for the nested tuple RHS
7370+
let nested_tmp_name = format("__jakt_tuple_assign_tmp{}", .temp_var_count)
73337371
.temp_var_count++
73347372

73357373
let nested_tmp_decl = ParsedVarDecl(
@@ -7367,8 +7405,6 @@ struct Typechecker {
73677405

73687406
return nested_assignments
73697407
}
7370-
7371-
// Other expressions - not allowed in tuple destructuring
73727408
else => {
73737409
.error("Left-hand side of tuple assignment must be variables or nested tuples", lhs.span())
73747410
return []

0 commit comments

Comments
 (0)