On Thu, Jul 2, 2020 at 5:34 PM arthurwil...@gmail.com
<arthurwilliammor...@gmail.com> wrote:
>
> On Monday, June 29, 2020 at 10:41:15 PM UTC-5 Ian Lance Taylor wrote:
>>
>> On Mon, Jun 29, 2020 at 6:33 PM arthurwil...@gmail.com
>> <arthurwil...@gmail.com> wrote:
>> >
>> > On Monday, June 29, 2020 at 8:16:14 PM UTC-5 Ian Lance Taylor wrote:
>> >>
>> >> On Mon, Jun 29, 2020 at 5:32 PM Bill Morgan
>> >> <arthurwil...@gmail.com> wrote:
>> >> >
>> >> > for this code:
>> >> >
>> >> > m := make(map[int]int, 9)
>> >> >
>> >> > I think the compiler creates a maptype that is stored at 
>> >> > type.*+60480(SB) that it uses for the call to runtime.makemap:
>> >> >
>> >> > m := make(map[int]int, 9)
>> >> > 0x10d0b81 488d05f8ec0000 LEAQ type.*+60480(SB), AX
>> >> > 0x10d0b88 48890424 MOVQ AX, 0(SP)
>> >> > 0x10d0b8c 48c744240809000000 MOVQ $0x9, 0x8(SP)
>> >> > 0x10d0b95 48c744241000000000 MOVQ $0x0, 0x10(SP)
>> >> > 0x10d0b9e 6690 NOPW
>> >> > 0x10d0ba0 e8fbdff3ff CALL runtime.makemap(SB)
>> >> >
>> >> > Where is the code in the compiler that creates the maptype? I'm 
>> >> > wondering how the bucket size is computed and how the rest of the 
>> >> > maptype structure is filled out.
>> >>
>> >> https://golang.org/src/cmd/compile/internal/gc/reflect.go#L189
>> >>
>> >> > Is there a way to print out the type info stored in the binary?
>> >>
>> >> I'm not sure if this is what you want, but you can use reflect.TypeOf:
>> >> https://play.golang.org/p/FEUIoqc6SMU .
>> >>
>> >> Ian
>> >
>> > Thanks Ian, that is pretty cool. I think that is printing out the 
>> > map[int]int type though instead of the *maptype that is generated by the 
>> > compiler and passed to runtime.makemap.
>> >
>> > I think this is loading a pointer to a maptype into AX to pass as the 
>> > first arg to runtime.makemap. The maptype seems to be stored at 
>> > type.*+60480(SB).
>> >
>> > LEAQ type.*+60480(SB), AX
>> >
>> > here's the type I'm asking about: where is this guy created in the 
>> > compiler?
>> >
>> > type maptype struct {
>> > typ _type
>> > key *_type
>> > elem *_type
>> > bucket *_type // internal type representing a hash bucket
>> > // function for hashing keys (ptr to key, seed) -> hash
>> > hasher func(unsafe.Pointer, uintptr) uintptr
>> > keysize uint8 // size of key slot
>> > elemsize uint8 // size of elem slot
>> > bucketsize uint16 // size of bucket
>> > flags uint32
>> > }
>>
>> https://golang.org/src/cmd/compile/internal/gc/reflect.go#L1285
>>
>> Ian
>
>
> Where is the maptype.bucket.size computed?
>
> It is used here in makemap (t.bucket.size):
>
> https://golang.org/src/runtime/map.go#L304
>
> I'm assuming the bucket is created here in bmap but I couldn't figure out how 
> the bucket.size is computed and set:
>
> https://golang.org/src/cmd/compile/internal/gc/reflect.go#L82

The bucket type is an ordinary struct, and the runtime code is looking
at the size field of the bucket struct's type descriptor.  That is the
value returned by bmap in cmd/compile/internal/gc/reflect.go.  The
size field is set by the call to dowidth(bucket), which the size as is
done for any struct type.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcV9d5530q3u_96Vps87gdcQJH%2BXFY5Cf9gigrpN4BMvxg%40mail.gmail.com.

Reply via email to