diff --git a/internal/codegen/codegen.go b/internal/codegen/codegen.go index c0e354e5..5eed7494 100644 --- a/internal/codegen/codegen.go +++ b/internal/codegen/codegen.go @@ -1526,7 +1526,7 @@ func emitRangeMap(meta *ir.MetaForContainer) { emitComment(2, "ForRangeStmt map Initialization\n") // _mp = EXPRs - _emitSingleAssign(meta.ForRangeStmt.MapVar, meta.ForRangeStmt.X) + emitSingleAssign(meta.ForRangeStmt.MapVarAssign) // if _mp == nil then exit emitVariable(meta.ForRangeStmt.MapVar) // value of _mp diff --git a/internal/ir/ir.go b/internal/ir/ir.go index 077021b6..9f372f5b 100644 --- a/internal/ir/ir.go +++ b/internal/ir/ir.go @@ -125,15 +125,16 @@ type MetaForForStmt struct { } type MetaForRangeStmt struct { - Tpos token.Pos - IsMap bool - LenVar *Variable - Indexvar *Variable - MapVar *Variable // map - ItemVar *Variable // map element - X MetaExpr - Key MetaExpr - Value MetaExpr + Tpos token.Pos + IsMap bool + LenVar *Variable + Indexvar *Variable + MapVar *Variable // map + ItemVar *Variable // map element + X MetaExpr + Key MetaExpr + Value MetaExpr + MapVarAssign *MetaSingleAssign } type MetaBranchStmt struct { diff --git a/internal/sema/sema.go b/internal/sema/sema.go index 2742ca92..4f75bc98 100644 --- a/internal/sema/sema.go +++ b/internal/sema/sema.go @@ -1004,12 +1004,18 @@ func walkRangeStmt(s *ast.RangeStmt) *ir.MetaForContainer { X: metaX, } case types.T_MAP: + mapVar := registerLocalVariable(currentFunc, ".range.map", types.Uintptr) + mapVarAssign := &ir.MetaSingleAssign{ + Tpos: s.Pos(), + Lhs: mapVar, + Rhs: metaX, + } meta.ForRangeStmt = &ir.MetaForRangeStmt{ - Tpos: s.Pos(), - IsMap: true, - MapVar: registerLocalVariable(currentFunc, ".range.map", types.Uintptr), - ItemVar: registerLocalVariable(currentFunc, ".range.item", types.Uintptr), - X: metaX, + Tpos: s.Pos(), + IsMap: true, + MapVar: mapVar, + ItemVar: registerLocalVariable(currentFunc, ".range.item", types.Uintptr), + MapVarAssign: mapVarAssign, } default: throw(collectionType)