Skip to content

Commit 0812361

Browse files
authored
Merge pull request #2739 from xushiwei/q
cl compileComprehensionExpr: use cb.MoveLastStmtTo instead of pkg.NewAutoParam
2 parents 082c69d + d25ef7a commit 0812361

3 files changed

Lines changed: 25 additions & 12 deletions

File tree

cl/expr.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1991,24 +1991,23 @@ func compileComprehensionExpr(ctx *blockCtx, lhs int, v *ast.ComprehensionExpr)
19911991
)
19921992
kind := comprehensionKind(v)
19931993
pkg, cb := ctx.pkg, ctx.cb
1994+
pkgTypes := pkg.Types
19941995
var results *types.Tuple
19951996
var ret *types.Var
19961997
if v.Elt == nil {
1997-
boolean := pkg.NewParam(token.NoPos, nameOk, types.Typ[types.Bool])
1998+
boolean := types.NewParam(token.NoPos, pkgTypes, nameOk, types.Typ[types.Bool])
19981999
results = types.NewTuple(boolean)
19992000
} else {
2000-
ret = pkg.NewAutoParam(nameRet)
2001+
// use tyInvalid as unbounded return type
2002+
ret = types.NewParam(token.NoPos, pkgTypes, nameRet, types.Typ[types.Invalid])
20012003
if kind == comprehensionSelect && lhs == 2 {
2002-
boolean := pkg.NewParam(token.NoPos, nameOk, types.Typ[types.Bool])
2004+
boolean := types.NewParam(token.NoPos, pkgTypes, nameOk, types.Typ[types.Bool])
20032005
results = types.NewTuple(ret, boolean)
20042006
} else {
20052007
results = types.NewTuple(ret)
20062008
}
20072009
}
20082010
cb.NewClosure(nil, results, false).BodyStart(pkg)
2009-
if kind == comprehensionMap {
2010-
cb.VarRef(ret).ZeroLit(ret.Type()).Assign(1)
2011-
}
20122011
end := 0
20132012
for i := len(v.Fors) - 1; i >= 0; i-- {
20142013
names := make([]string, 0, 2)
@@ -2040,21 +2039,30 @@ func compileComprehensionExpr(ctx *blockCtx, lhs int, v *ast.ComprehensionExpr)
20402039
}
20412040
end++
20422041
}
2042+
stk := cb.InternalStack()
20432043
switch kind {
20442044
case comprehensionList:
20452045
// _xgo_ret = append(_xgo_ret, elt)
2046+
compileExpr(ctx, 1, v.Elt)
2047+
e := stk.Pop()
2048+
*ret = *types.NewVar(token.NoPos, pkgTypes, nameRet, types.NewSlice(e.Type))
20462049
cb.VarRef(ret)
20472050
cb.Val(pkg.Builtin().Ref("append"))
20482051
cb.Val(ret)
2049-
compileExpr(ctx, 1, v.Elt)
2052+
stk.Push(e)
20502053
cb.Call(2).Assign(1)
20512054
case comprehensionMap:
20522055
// _xgo_ret[key] = val
2053-
cb.Val(ret)
20542056
kv := v.Elt.(*ast.KeyValueExpr)
20552057
compileExpr(ctx, 1, kv.Key)
2056-
cb.IndexRef(1)
2058+
key := stk.Pop()
20572059
compileExpr(ctx, 1, kv.Value)
2060+
val := stk.Pop()
2061+
*ret = *types.NewVar(token.NoPos, pkgTypes, nameRet, types.NewMap(key.Type, val.Type))
2062+
cb.Val(ret)
2063+
stk.Push(key)
2064+
cb.IndexRef(1)
2065+
stk.Push(val)
20582066
cb.Assign(1)
20592067
default:
20602068
if v.Elt == nil {
@@ -2064,6 +2072,8 @@ func compileComprehensionExpr(ctx *blockCtx, lhs int, v *ast.ComprehensionExpr)
20642072
} else {
20652073
// return elt, true
20662074
compileExpr(ctx, 1, v.Elt)
2075+
e := stk.Get(-1)
2076+
*ret = *types.NewVar(token.NoPos, pkgTypes, nameRet, e.Type)
20672077
n := 1
20682078
if lhs == 2 {
20692079
cb.Val(true)
@@ -2075,6 +2085,9 @@ func compileComprehensionExpr(ctx *blockCtx, lhs int, v *ast.ComprehensionExpr)
20752085
for i := 0; i < end; i++ {
20762086
cb.End()
20772087
}
2088+
if kind == comprehensionMap {
2089+
cb.VarRef(ret).MapLit(ret.Type(), 0, v).Assign(1).MoveLastStmtTo(0)
2090+
}
20782091
cb.Return(0).End().Call(0)
20792092
}
20802093

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ require (
88
github.com/fsnotify/fsnotify v1.10.1
99
github.com/goccy/go-yaml v1.19.2
1010
github.com/goplus/cobra v1.10.7 //xgo:class
11-
github.com/goplus/gogen v1.23.0-pre.3.0.20260414234848-6641c10c9d6f
11+
github.com/goplus/gogen v1.23.0-pre.3.0.20260521054245-6cb1c229ef46
1212
github.com/goplus/lib v0.3.1
1313
github.com/goplus/mod v0.20.2
1414
github.com/qiniu/x v1.17.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=
44
github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
55
github.com/goplus/cobra v1.10.7 h1:pdMf0tzzAQn8941Ac1m78SSeTMQaSKihy/ipvANbLnc=
66
github.com/goplus/cobra v1.10.7/go.mod h1:p4LhfNJDKEpiGjGiNn0crUXL5dUPA5DX2ztYpEJR34E=
7-
github.com/goplus/gogen v1.23.0-pre.3.0.20260414234848-6641c10c9d6f h1:qb3VcmljqvrIgEVbs83cbZkckszvtHl3OnO/ums8Zoc=
8-
github.com/goplus/gogen v1.23.0-pre.3.0.20260414234848-6641c10c9d6f/go.mod h1:Y7ulYW3wonQ3d9er00b0uGFEV/IUZa6okWJZh892ACQ=
7+
github.com/goplus/gogen v1.23.0-pre.3.0.20260521054245-6cb1c229ef46 h1:LFDRVt3fH2e0wi1C/oRFwg0+ujfEN3YsArT2ZvK1hls=
8+
github.com/goplus/gogen v1.23.0-pre.3.0.20260521054245-6cb1c229ef46/go.mod h1:Y7ulYW3wonQ3d9er00b0uGFEV/IUZa6okWJZh892ACQ=
99
github.com/goplus/lib v0.3.1 h1:Xws4DBVvgOMu58awqB972wtvTacDbk3nqcbHjdx9KSg=
1010
github.com/goplus/lib v0.3.1/go.mod h1:SgJv3oPqLLHCu0gcL46ejOP3x7/2ry2Jtxu7ta32kp0=
1111
github.com/goplus/mod v0.20.2 h1:YX72E6AhhRLvlkVnI9cBK6PZvUwtge2hwROh7w9N6Yk=

0 commit comments

Comments
 (0)