|
6 | 6 | logger = logging.getLogger(__name__) |
7 | 7 |
|
8 | 8 |
|
| 9 | +def handle_struct_field_assignment( |
| 10 | + func, module, builder, target, rval, local_sym_tab, structs_sym_tab |
| 11 | +): |
| 12 | + """Handle struct field assignment (obj.field = value).""" |
| 13 | + |
| 14 | + var_name = target.value.id |
| 15 | + field_name = target.attr |
| 16 | + |
| 17 | + if var_name not in local_sym_tab: |
| 18 | + logger.error(f"Variable '{var_name}' not found in symbol table") |
| 19 | + return |
| 20 | + |
| 21 | + struct_type = local_sym_tab[var_name].metadata |
| 22 | + struct_info = structs_sym_tab[struct_type] |
| 23 | + |
| 24 | + if field_name not in struct_info.fields: |
| 25 | + logger.error(f"Field '{field_name}' not found in struct '{struct_type}'") |
| 26 | + return |
| 27 | + |
| 28 | + # Get field pointer and evaluate value |
| 29 | + field_ptr = struct_info.gep(builder, local_sym_tab[var_name].var, field_name) |
| 30 | + val = eval_expr(func, module, builder, rval, local_sym_tab, None, structs_sym_tab) |
| 31 | + |
| 32 | + if val is None: |
| 33 | + logger.error(f"Failed to evaluate value for {var_name}.{field_name}") |
| 34 | + return |
| 35 | + |
| 36 | + # TODO: Handle string assignment to char array (not a priority) |
| 37 | + field_type = struct_info.field_type(field_name) |
| 38 | + if isinstance(field_type, ir.ArrayType) and val[1] == ir.PointerType(ir.IntType(8)): |
| 39 | + logger.warning( |
| 40 | + f"String to char array assignment not implemented for {var_name}.{field_name}" |
| 41 | + ) |
| 42 | + return |
| 43 | + |
| 44 | + # Store the value |
| 45 | + builder.store(val[0], field_ptr) |
| 46 | + logger.info(f"Assigned to struct field {var_name}.{field_name}") |
| 47 | + |
| 48 | + |
9 | 49 | def handle_variable_assignment( |
10 | 50 | func, module, builder, var_name, rval, local_sym_tab, map_sym_tab, structs_sym_tab |
11 | 51 | ): |
|
0 commit comments