Skip to content

Commit b447939

Browse files
committed
Elem, ElemRef
1 parent 26b882f commit b447939

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

codebuild.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,36 @@ func (p *CodeBuilder) pushVal(v interface{}) *CodeBuilder {
962962
return p
963963
}
964964

965+
// Elem func
966+
func (p *CodeBuilder) Elem() *CodeBuilder {
967+
if debug {
968+
log.Println("Elem")
969+
}
970+
arg := p.stk.Get(-1)
971+
t, ok := arg.Type.(*types.Pointer)
972+
if !ok {
973+
log.Panicln("TODO: not a pointer")
974+
}
975+
p.stk.Ret(1, internal.Elem{Val: &ast.StarExpr{X: arg.Val}, Type: t.Elem()})
976+
return p
977+
}
978+
979+
// Elem func
980+
func (p *CodeBuilder) ElemRef() *CodeBuilder {
981+
if debug {
982+
log.Println("ElemRef")
983+
}
984+
arg := p.stk.Get(-1)
985+
t, ok := arg.Type.(*types.Pointer)
986+
if !ok {
987+
log.Panicln("TODO: not a pointer")
988+
}
989+
p.stk.Ret(1, internal.Elem{
990+
Val: &ast.StarExpr{X: arg.Val}, Type: &refType{typ: t.Elem()},
991+
})
992+
return p
993+
}
994+
965995
// MemberRef func
966996
func (p *CodeBuilder) MemberRef(name string) *CodeBuilder {
967997
if debug {

package_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,6 +1666,8 @@ func TestIndexRef(t *testing.T) {
16661666
Val(x).Val(0).IndexRef(1).Val(1).Assign(1).
16671667
Val(y).Val(1).IndexRef(1).Val(2).Assign(1).
16681668
Val(z).Val("a").IndexRef(1).Val(3).Assign(1).
1669+
Val(y).ElemRef().Val(x).Assign(1).
1670+
VarRef(x).Val(y).Elem().Assign(1).
16691671
End()
16701672

16711673
pkg.NewFunc(nil, "main", nil, nil, false).BodyStart(pkg).End()
@@ -1675,6 +1677,8 @@ func foo(x [10]int, y *[10]int, z map[string]int) {
16751677
x[0] = 1
16761678
y[1] = 2
16771679
z["a"] = 3
1680+
*y = x
1681+
x = *y
16781682
}
16791683
func main() {
16801684
}

0 commit comments

Comments
 (0)