t = n->type;
if(t->etype != TSTRUCT || t->map != T || t->funarg)
break;
+ Bprint(b, "#define %s__size %d\n", t->sym->name, (int)t->width);
for(t=t->type; t != T; t=t->down)
if(!isblanksym(t->sym))
Bprint(b, "#define %s_%s %d\n", n->sym->name, t->sym->name, (int)t->width);
if canfail {
return nil
}
- i := (*imethod)(add(unsafe.Pointer(inter), unsafe.Sizeof(interfacetype{})))
- panic(&TypeAssertionError{"", *typ._string, *inter.typ._string, *i.name})
+ panic(&TypeAssertionError{"", *typ._string, *inter.typ._string, *inter.mhdr[0].name})
}
// compiler has provided some good hash codes for us.
}
}
- m = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.mhdr))*ptrSize, 0, &memstats.other_sys))
+ m = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.mhdr)-1)*ptrSize, 0, &memstats.other_sys))
m.inter = inter
m._type = typ
nt := len(x.mhdr)
j := 0
for k := 0; k < ni; k++ {
- i := (*imethod)(add(unsafe.Pointer(inter), unsafe.Sizeof(interfacetype{})+uintptr(k)*unsafe.Sizeof(imethod{})))
+ i := &inter.mhdr[k]
iname := i.name
ipkgpath := i.pkgpath
itype := i._type
for ; j < nt; j++ {
- t := (*method)(add(unsafe.Pointer(x), unsafe.Sizeof(uncommontype{})+uintptr(j)*unsafe.Sizeof(method{})))
+ t := &x.mhdr[j]
if t.mtyp == itype && t.name == iname && t.pkgpath == ipkgpath {
if m != nil {
- *(*unsafe.Pointer)(add(unsafe.Pointer(m), unsafe.Sizeof(itab{})+uintptr(k)*ptrSize)) = t.ifn
+ *(*unsafe.Pointer)(add(unsafe.Pointer(&m.fun[0]), uintptr(k)*ptrSize)) = t.ifn
}
goto nextimethod
}
type stackmap struct {
n int32 // number of bitmaps
nbit int32 // number of bits in each bitmap
- bytedata [0]byte // bitmaps, each starting on a 32-bit boundary
+ bytedata [1]byte // bitmaps, each starting on a 32-bit boundary
}
// Returns pointer map data for the given stackmap index
gopc uintptr // pc of go statement that created this goroutine
racectx uintptr
waiting *sudog // sudog structures this g is waiting on (that have a valid elem ptr)
- end [0]byte
}
type mts struct {
notesig *int8
errstr *byte
//#endif
- end [0]byte
}
type p struct {
link *itab
bad int32
unused int32
- fun [0]uintptr
+ fun [1]uintptr // variable sized
}
// Lock-free stack node.
MOVL SP, DX
// setup dummy m, g
- SUBL $m_end, SP // space for M
+ SUBL $m__size, SP // space for M
MOVL SP, 0(SP)
- MOVL $m_end, 4(SP)
+ MOVL $m__size, 4(SP)
CALL runtime·memclr(SB) // smashes AX,BX,CX
LEAL m_tls(SP), CX
MOVL CX, 0x14(FS)
MOVL SP, BX
- SUBL $g_end, SP // space for G
+ SUBL $g__size, SP // space for G
MOVL SP, g(CX)
MOVL SP, m_g0(BX)
MOVL SP, 0(SP)
- MOVL $g_end, 4(SP)
+ MOVL $g__size, 4(SP)
CALL runtime·memclr(SB) // smashes AX,BX,CX
- LEAL g_end(SP), BX
+ LEAL g__size(SP), BX
MOVL BX, g_m(SP)
LEAL -8192(SP), CX
MOVL CX, (g_stack+stack_lo)(SP)
MOVQ SP, DX
// setup dummy m, g
- SUBQ $m_end, SP // space for M
+ SUBQ $m__size, SP // space for M
MOVQ SP, 0(SP)
- MOVQ $m_end, 8(SP)
+ MOVQ $m__size, 8(SP)
CALL runtime·memclr(SB) // smashes AX,BX,CX
LEAQ m_tls(SP), CX
MOVQ CX, 0x28(GS)
MOVQ SP, BX
- SUBQ $g_end, SP // space for G
+ SUBQ $g__size, SP // space for G
MOVQ SP, g(CX)
MOVQ SP, m_g0(BX)
MOVQ SP, 0(SP)
- MOVQ $g_end, 8(SP)
+ MOVQ $g__size, 8(SP)
CALL runtime·memclr(SB) // smashes AX,BX,CX
- LEAQ g_end(SP), BX
+ LEAQ g__size(SP), BX
MOVQ BX, g_m(SP)
LEAQ -8192(SP), CX
name *string
pkgpath *string
mhdr []method
- m [0]method
}
type imethod struct {
type interfacetype struct {
typ _type
mhdr []imethod
- m [0]imethod
}
type maptype struct {