@@ -369,29 +369,33 @@ def _gen_stmt(self, stmt, indent: str): # noqa: C901 # pylint: disable=too-man
369369 self ._emit (f"{ indent } ;; unpacking declaration lowered" )
370370 else :
371371 name = _name (stmt .name )
372- self ._locals .add (name )
373372 self ._emit (f"{ indent } ;; let { name } = ..." )
374373 self ._gen_expr (stmt .value , indent )
375- self ._emit (f"{ indent } local.set ${ self ._wat_symbol (name )} " )
374+ if not self ._is_module_global (name ):
375+ self ._locals .add (name )
376+ self ._emit_name_set (name , indent )
376377 self ._update_assignment_tracking (name , stmt .value , indent )
377378
378379 elif isinstance (stmt , Assignment ):
379380 target = stmt .target
380381 if isinstance (target , Identifier ):
381382 name = target .name
382- self ._locals .add (name )
383383 op = stmt .op
384384 if op == "=" :
385385 self ._emit (f"{ indent } ;; { name } = ..." )
386386 self ._gen_expr (stmt .value , indent )
387- self ._emit (f"{ indent } local.set ${ self ._wat_symbol (name )} " )
387+ if not self ._is_module_global (name ):
388+ self ._locals .add (name )
389+ self ._emit_name_set (name , indent )
388390 self ._update_assignment_tracking (name , stmt .value , indent )
389391 else :
390392 # Compound assignment: a op= b
391393 self ._emit (f"{ indent } ;; { name } { op } ..." )
392- self ._emit (f"{ indent } local.get ${ self ._wat_symbol (name )} " )
394+ if not self ._is_module_global (name ):
395+ self ._locals .add (name )
396+ self ._emit_name_get (name , indent )
393397 self ._gen_augmented_op (op , stmt .value , indent )
394- self ._emit ( f" { indent } local.set $ { self . _wat_symbol ( name ) } " )
398+ self ._emit_name_set ( name , indent )
395399 self ._clear_assignment_tracking (name )
396400 elif (isinstance (target , AttributeAccess )
397401 and isinstance (target .obj , Identifier )):
@@ -457,15 +461,16 @@ def _gen_stmt(self, stmt, indent: str): # noqa: C901 # pylint: disable=too-man
457461 elif isinstance (stmt , AnnAssignment ):
458462 if isinstance (stmt .target , Identifier ):
459463 name = stmt .target .name
460- self ._locals .add (name )
461464 self ._emit (f"{ indent } ;; annotated assignment { name } : ..." )
462465 if stmt .value is None :
463466 self ._emit (f"{ indent } f64.const 0" )
464467 self ._clear_assignment_tracking (name )
465468 else :
466469 self ._gen_expr (stmt .value , indent )
467470 self ._update_assignment_tracking (name , stmt .value , indent )
468- self ._emit (f"{ indent } local.set ${ self ._wat_symbol (name )} " )
471+ if not self ._is_module_global (name ):
472+ self ._locals .add (name )
473+ self ._emit_name_set (name , indent )
469474 else :
470475 self ._emit (f"{ indent } ;; annotated assignment with complex target (nop in WAT)" )
471476
@@ -478,9 +483,10 @@ def _gen_stmt(self, stmt, indent: str): # noqa: C901 # pylint: disable=too-man
478483 for target in stmt .targets :
479484 if isinstance (target , Identifier ):
480485 name = target .name
481- self ._locals .add (name )
482486 self ._emit (f"{ indent } local.get ${ self ._wat_symbol (tmp_name )} " )
483- self ._emit (f"{ indent } local.set ${ self ._wat_symbol (name )} " )
487+ if not self ._is_module_global (name ):
488+ self ._locals .add (name )
489+ self ._emit_name_set (name , indent )
484490 self ._update_assignment_tracking (name , stmt .value , indent )
485491 else :
486492 self ._emit (
@@ -686,38 +692,38 @@ def _gen_stmt(self, stmt, indent: str): # noqa: C901 # pylint: disable=too-man
686692 elif (isinstance (expr .func , AttributeAccess )
687693 and expr .func .attr == "append"
688694 and isinstance (expr .func .obj , Identifier )
689- and expr .func .obj .name in self . _list_locals
695+ and self . _is_tracked_list_name ( expr .func .obj .name )
690696 and len (expr .args ) == 1 ):
691697 # lst.append(x) → allocate new list, update local
692698 obj_name = expr .func .obj .name
693699 self ._emit (f"{ indent } ;; { obj_name } .append(x)" )
694- self ._gen_expr ( expr . func . obj , indent )
700+ self ._emit_name_get ( obj_name , indent )
695701 self ._gen_expr (expr .args [0 ], indent )
696702 self ._emit (f"{ indent } call $__list_append" )
697- self ._emit ( f" { indent } local.set $ { self . _wat_symbol ( obj_name ) } " )
703+ self ._emit_name_set ( obj_name , indent )
698704 elif (isinstance (expr .func , AttributeAccess )
699705 and expr .func .attr == "pop"
700706 and isinstance (expr .func .obj , Identifier )
701- and expr .func .obj .name in self . _list_locals
707+ and self . _is_tracked_list_name ( expr .func .obj .name )
702708 and not expr .args ):
703709 # lst.pop() statement — result discarded
704710 obj_name = expr .func .obj .name
705711 self ._emit (f"{ indent } ;; { obj_name } .pop() (result discarded)" )
706- self ._gen_expr ( expr . func . obj , indent )
712+ self ._emit_name_get ( obj_name , indent )
707713 self ._emit (f"{ indent } call $__list_pop" )
708714 self ._emit (f"{ indent } drop" )
709715 elif (isinstance (expr .func , AttributeAccess )
710716 and expr .func .attr == "extend"
711717 and isinstance (expr .func .obj , Identifier )
712- and expr .func .obj .name in self . _list_locals
718+ and self . _is_tracked_list_name ( expr .func .obj .name )
713719 and len (expr .args ) == 1 ):
714720 # lst.extend(other) → allocate new list, update local
715721 obj_name = expr .func .obj .name
716722 self ._emit (f"{ indent } ;; { obj_name } .extend(other)" )
717- self ._gen_expr ( expr . func . obj , indent )
723+ self ._emit_name_get ( obj_name , indent )
718724 self ._gen_expr (expr .args [0 ], indent )
719725 self ._emit (f"{ indent } call $__list_extend" )
720- self ._emit ( f" { indent } local.set $ { self . _wat_symbol ( obj_name ) } " )
726+ self ._emit_name_set ( obj_name , indent )
721727 else :
722728 # Closure, constructor, builtin, or other non-WAT callable
723729 self ._emit (f"{ indent } ;; unsupported call: { fname } (...) — not a WAT function" )
@@ -1069,8 +1075,7 @@ def _gen_expr(self, node, indent: str): # noqa: C901 # pylint: disable=too-man
10691075 self ._emit (f"{ indent } f64.const 0 ;; unsupported expr: DictLiteral" )
10701076
10711077 elif isinstance (node , Identifier ):
1072- if node .name in self ._locals :
1073- self ._emit (f"{ indent } local.get ${ self ._wat_symbol (node .name )} " )
1078+ if self ._emit_name_get (node .name , indent ):
10741079 if node .name in self ._string_len_locals :
10751080 len_local = self ._string_len_locals [node .name ]
10761081 self ._emit (f"{ indent } local.get ${ self ._wat_symbol (len_local )} " )
@@ -1792,11 +1797,11 @@ def _gen_expr(self, node, indent: str): # noqa: C901 # pylint: disable=too-man
17921797 elif isinstance (node , IndexAccess ):
17931798 obj = node .obj
17941799 if isinstance (obj , Identifier ) and (
1795- obj .name in self ._list_locals or obj .name in self . _tuple_locals
1800+ self . _is_tracked_list_name ( obj .name ) or self ._is_tracked_tuple_name ( obj .name )
17961801 ):
17971802 # list[i] / tuple[i] → load from base + 8 + i*8
17981803 self ._emit (f"{ indent } ;; { obj .name } [i]" )
1799- self ._emit ( f" { indent } local.get $ { self . _wat_symbol ( obj .name ) } " )
1804+ self ._emit_name_get ( obj .name , indent )
18001805 self ._emit (f"{ indent } i32.trunc_f64_u" )
18011806 self ._gen_expr (node .index , indent )
18021807 self ._emit (f"{ indent } i32.trunc_f64_u" )
0 commit comments