Add support for tuple style multiiassignment in allocation_pass

This commit is contained in:
Pragyansh Chaturvedi
2025-10-14 23:06:43 +05:30
parent 4a79f9b9b2
commit dd3fc74d09

View File

@ -25,29 +25,42 @@ class LocalSymbol:
def handle_assign_allocation(builder, stmt, local_sym_tab, structs_sym_tab): def handle_assign_allocation(builder, stmt, local_sym_tab, structs_sym_tab):
"""Handle memory allocation for assignment statements.""" """Handle memory allocation for assignment statements."""
# Validate assignment logger.info(f"Handling assignment for allocation: {ast.dump(stmt)}")
if len(stmt.targets) != 1:
logger.warning("Multi-target assignment not supported, skipping allocation") # NOTE: Support multi-target assignments (e.g.: a, b = 1, 2)
if isinstance(stmt.targets[0], ast.Tuple):
if not isinstance(stmt.value, ast.Tuple):
logger.warning("Mismatched multi-target assignment, skipping allocation")
return return
targets = stmt.targets[0].elts
rvals = stmt.value.elts
if len(targets) != len(rvals):
logger.warning("Mismatched multi-target assignment, skipping allocation")
return
else:
targets = stmt.targets
rvals = [stmt.value]
target = stmt.targets[0] for target, rval in zip(targets, rvals):
# Skip non-name targets (e.g., struct field assignments) # Skip non-name targets (e.g., struct field assignments)
if isinstance(target, ast.Attribute): if isinstance(target, ast.Attribute):
logger.debug(f"Struct field assignment to {target.attr}, no allocation needed") logger.debug(
return f"Struct field assignment to {target.attr}, no allocation needed"
)
continue
if not isinstance(target, ast.Name): if not isinstance(target, ast.Name):
logger.warning(f"Unsupported assignment target type: {type(target).__name__}") logger.warning(
return f"Unsupported assignment target type: {type(target).__name__}"
)
continue
var_name = target.id var_name = target.id
rval = stmt.value
# Skip if already allocated # Skip if already allocated
if var_name in local_sym_tab: if var_name in local_sym_tab:
logger.debug(f"Variable {var_name} already allocated, skipping") logger.debug(f"Variable {var_name} already allocated, skipping")
return continue
# Determine type and allocate based on rval # Determine type and allocate based on rval
if isinstance(rval, ast.Call): if isinstance(rval, ast.Call):