1515package objects
1616
1717import (
18- "fmt"
1918 "go/token"
2019 "go/types"
2120
@@ -104,72 +103,48 @@ func (b *Builder) Type(ty typeset.Type) *Builder {
104103}
105104
106105func (b * Builder ) Struct (gty * types.Struct ) * Struct {
107- b .GoType (gty )
108- s := & Struct {}
109- s .loc = b .Gen ()
110- s .typ = b .mmod .Type (s .loc )
111- n := memory .Loc (b .mmod .Lsize (s .loc ))
112- s .fields = make ([]memory.Loc , 0 , gty .NumFields ())
113- for i := memory .Loc (1 ); i < n ; i ++ {
114- pfloc := b .mmod .Parent (s .loc + i )
115- if pfloc != s .loc {
116- continue
117- }
118- s .fields = append (s .fields , s .loc + i )
119- }
120- if len (s .fields ) != gty .NumFields () {
121- panic ("internal error" )
122- }
123- b .omap [s .loc ] = s
124- b .walkObj (s .loc )
125- return s
106+ m := b .GoType (gty ).Gen ()
107+ b .walkObj (m )
108+ return b .omap [m ].(* Struct )
109+ }
110+
111+ func (b * Builder ) Tuple (ty * types.Tuple ) * Tuple {
112+ m := b .GoType (ty ).Gen ()
113+ b .walkObj (m )
114+ return b .omap [m ].(* Tuple )
126115}
127116
128117func (b * Builder ) Array (gty * types.Array ) * Array {
129- b .GoType (gty )
130- a := & Array {}
131- a .loc = b .Gen ()
132- a .typ = b .mmod .Type (a .loc )
133- a .n = gty .Len ()
134- a .elemSize = int64 (b .ts .Lsize (b .ts .Elem (a .typ )))
135- b .omap [a .loc ] = a
136- b .walkObj (a .loc )
137- return a
118+ m := b .GoType (gty ).Gen ()
119+ b .walkObj (m )
120+ return b .omap [m ].(* Array )
138121}
139122
140123func (b * Builder ) Slice (gty * types.Slice , length , capacity indexing.I ) * Slice {
141124 ty := b .ts .FromGoType (gty )
142- b .Type (ty )
143- s := & Slice {}
144- s .loc = b .Gen ()
145- s .Len = length
146- s .Cap = capacity
147- // add one uni-slot by default.
148- b .AddSlot (s , b .indexing .Var ())
149- b .omap [s .loc ] = s
150- return s
125+ m := b .Type (ty ).Gen ()
126+ b .walkObj (m )
127+ sl := b .omap [m ].(* Slice )
128+ sl .Len = length
129+ sl .Cap = capacity
130+ b .AddSlot (sl , b .indexing .Var ())
131+ return sl
151132}
152133
153134func (b * Builder ) AddSlot (slice * Slice , i indexing.I ) {
154135 elem := b .ts .Elem (slice .typ )
136+ loc := b .Type (elem ).Gen ()
155137 slice .slots = append (slice .slots , Slot {
156- Loc : b . Type ( elem ). Gen () ,
138+ Loc : loc ,
157139 I : i })
140+ b .walkObj (loc )
158141}
159142
160143func (b * Builder ) Map (gty * types.Map ) * Map {
161144 ty := b .ts .FromGoType (gty )
162- kty , ety := b .ts .Key (ty ), b .ts .Elem (ty )
163- mloc := b .mmod .Gen (b .mgp .Type (ty ))
164- kloc := b .Type (kty ).Gen ()
165- eloc := b .Type (ety ).Gen ()
166- b .mmod .AddAddressOf (mloc , eloc )
167-
168- m := & Map {key : kloc , elem : eloc }
169- m .loc = mloc
170- m .typ = ty
171- b .omap [m .loc ] = m
172- return m
145+ m := b .Type (ty ).Gen ()
146+ b .walkObj (m )
147+ return b .omap [m ].(* Map )
173148}
174149
175150func (b * Builder ) Object (m memory.Loc ) Object {
@@ -212,6 +187,7 @@ func (b *Builder) Func(sig *types.Signature, declName string, opaque memory.Attr
212187 if recv != nil {
213188 b .mgp .Type (b .ts .FromGoType (recv .Type ()))
214189 fn .recv = b .mmod .Gen (b .mgp )
190+ b .walkObj (fn .recv )
215191 }
216192 params := sig .Params ()
217193 N := params .Len ()
@@ -220,6 +196,7 @@ func (b *Builder) Func(sig *types.Signature, declName string, opaque memory.Attr
220196 pty := b .ts .FromGoType (param .Type ())
221197 fn .params [i ] =
222198 b .Pos (param .Pos ()).Type (pty ).Attrs (memory .IsParam | opaque ).Gen ()
199+ b .walkObj (fn .params [i ])
223200 }
224201 rets := sig .Results ()
225202 N = rets .Len ()
@@ -228,6 +205,7 @@ func (b *Builder) Func(sig *types.Signature, declName string, opaque memory.Attr
228205 rty := b .ts .FromGoType (ret .Type ())
229206 fn .results [i ] =
230207 b .Pos (ret .Pos ()).Type (rty ).Attrs (memory .IsReturn | opaque ).Gen ()
208+ b .walkObj (fn .results [i ])
231209 }
232210 // TBD: FreeVars
233211 b .omap [fn .loc ] = fn
@@ -245,7 +223,6 @@ func (b *Builder) walkObj(m memory.Loc) {
245223 switch ty {
246224 case typeset .Pointer :
247225 if b .omap [m ] == nil {
248- fmt .Printf ("walk ptr\n " )
249226 ptr := & Pointer {}
250227 ptr .loc = m
251228 ptr .typ = ty
@@ -256,7 +233,6 @@ func (b *Builder) walkObj(m memory.Loc) {
256233 var arr * Array
257234 obj := b .omap [m ]
258235 if obj == nil {
259- fmt .Printf ("walk arr\n " )
260236 arr = & Array {}
261237 arr .loc = m
262238 arr .typ = ty
@@ -276,42 +252,76 @@ func (b *Builder) walkObj(m memory.Loc) {
276252 var strukt * Struct
277253 obj := b .omap [m ]
278254 if obj == nil {
279- fmt .Printf ("walk str\n " )
280255 strukt = & Struct {}
281256 strukt .loc = m
282257 strukt .typ = ty
283- n := b .ts .NumFields (ty )
284- strukt .fields = make ([]memory.Loc , 0 , n )
285- for i := 0 ; i < n ; i ++ {
286- _ , _ , foff := b .ts .Field (ty , i )
287- strukt .fields [i ] = m + memory .Loc (foff )
288- b .walkObj (m + memory .Loc (foff ))
289- }
290258 b .omap [m ] = strukt
291259 } else {
292260 strukt = obj .(* Struct )
293261 }
262+ n := b .ts .NumFields (ty )
263+ strukt .fields = make ([]memory.Loc , n )
264+ for i := 0 ; i < n ; i ++ {
265+ _ , _ , foff := b .ts .Field (ty , i )
266+ floc := m + memory .Loc (foff )
267+ strukt .fields [i ] = floc
268+ b .walkObj (floc )
269+ }
294270
295271 case typeset .Chan :
296272 case typeset .Map :
297273 var ma * Map
298274 obj := b .omap [m ]
299275 if obj == nil {
300- fmt .Printf ("walk map\n " )
301- ma := & Map {}
276+ ma = & Map {}
302277 ma .loc = m
303278 ma .typ = ty
279+ ma .key = b .Type (b .ts .Key (ty )).Gen ()
280+ ma .elem = b .Type (b .ts .Elem (ty )).Gen ()
281+ b .mmod .AddAddressOf (ma .loc , ma .elem )
304282 b .omap [m ] = ma
305283 } else {
306284 ma = obj .(* Map )
307285 }
308286 b .walkObj (ma .key )
309287 b .walkObj (ma .elem )
310288 case typeset .Slice :
289+ var slice * Slice
290+ obj := b .omap [m ]
291+ if obj == nil {
292+ slice = & Slice {}
293+ slice .loc = m
294+ slice .typ = b .mmod .Type (m )
295+ slice .Len = b .indexing .Var ()
296+ slice .Cap = b .indexing .Var ()
297+ b .omap [m ] = slice
298+ } else {
299+ slice = obj .(* Slice )
300+ }
301+
311302 case typeset .Interface :
312303 case typeset .Func :
313304 case typeset .Named :
305+
314306 case typeset .Tuple :
307+ var tuple * Tuple
308+ obj := b .omap [m ]
309+ if obj == nil {
310+ tuple = & Tuple {}
311+ tuple .loc = m
312+ tuple .typ = ty
313+ b .omap [m ] = tuple
314+ } else {
315+ tuple = obj .(* Tuple )
316+ }
317+ n := b .ts .NumFields (ty )
318+ tuple .fields = make ([]memory.Loc , n )
319+ for i := 0 ; i < n ; i ++ {
320+ _ , _ , foff := b .ts .Field (ty , i )
321+ floc := m + memory .Loc (foff )
322+ tuple .fields [i ] = floc
323+ b .walkObj (floc )
324+ }
315325
316326 }
317327}
0 commit comments