@@ -1302,7 +1302,7 @@ func (p *CodeBuilder) Index(nidx int, lhs int, src ...ast.Node) *CodeBuilder {
13021302 }
13031303 argVal := args [0 ].Val
13041304 if ivKind == ivMapStringAny {
1305- argVal = & ast. TypeAssertExpr { X : argVal , Type : toMapType ( p . pkg , tyMapStringAny )}
1305+ argVal = p . emitTypeAssert ( argVal )
13061306 }
13071307 elem := & internal.Elem {
13081308 Val : & ast.IndexExpr {X : argVal , Index : args [1 ].Val }, Type : tyRet , Src : srcExpr ,
@@ -1785,10 +1785,8 @@ retry:
17851785 o .Complete ()
17861786
17871787 if o .Empty () { // empty interface (https://github.com/goplus/xgo/issues/2571)
1788- tyMap := tyMapStringAny
1789- p .TypeAssert (tyMap , 0 )
1790- arg = p .stk .Get (- 1 )
1791- return p .mapIndexExpr (tyMap , name , lhs , arg .Val , srcExpr )
1788+ argVal := p .emitTypeAssert (arg .Val )
1789+ return p .mapIndexExpr (tyMapStringAny , name , lhs , argVal , srcExpr )
17921790 }
17931791
17941792 if kind := p .method (o , name , aliasName , flag , arg , srcExpr ); kind != MemberInvalid {
@@ -1828,6 +1826,20 @@ retry:
18281826 return MemberInvalid
18291827}
18301828
1829+ // See https://github.com/goplus/xgo/issues/2572#issuecomment-3807206716
1830+ func (p * CodeBuilder ) emitTypeAssert (argVal ast.Expr ) ast.Expr {
1831+ pkg := p .pkg
1832+ e := & ast.TypeAssertExpr {X : argVal , Type : toMapType (pkg , tyMapStringAny )}
1833+ ret := ast .NewIdent (pkg .autoName ())
1834+ stmt := & ast.AssignStmt {
1835+ Lhs : []ast.Expr {ret , underscore },
1836+ Tok : token .DEFINE ,
1837+ Rhs : []ast.Expr {e },
1838+ }
1839+ p .emitStmt (stmt )
1840+ return ret
1841+ }
1842+
18311843func (p * CodeBuilder ) mapIndexExpr (o * types.Map , name string , lhs int , argVal ast.Expr , src ast.Node ) MemberKind {
18321844 tyRet := o .Elem ()
18331845 if lhs == 2 { // two-value assignment
0 commit comments