mirror of
https://github.com/golang/go
synced 2024-11-19 13:54:56 -07:00
runtime: remove bad field from itab
Just use fun[0]==0 to indicate a bad itab. Change-Id: I28ecb2d2d857090c1ecc40b1d1866ac24a844848 Reviewed-on: https://go-review.googlesource.com/44473 Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
This commit is contained in:
parent
3d1699ea78
commit
98d0634b7a
@ -1459,16 +1459,14 @@ func dumptabs() {
|
||||
// _type *_type
|
||||
// _ uintptr TODO: remove
|
||||
// hash uint32
|
||||
// bad bool
|
||||
// _ [3]byte
|
||||
// _ [4]byte
|
||||
// fun [1]uintptr // variable sized
|
||||
// }
|
||||
o := dsymptr(i.lsym, 0, dtypesym(i.itype).Linksym(), 0)
|
||||
o = dsymptr(i.lsym, o, dtypesym(i.t).Linksym(), 0)
|
||||
o = duintptr(i.lsym, o, 0) // unused
|
||||
o = duint32(i.lsym, o, typehash(i.t)) // copy of type hash
|
||||
o += 1 // bad is false
|
||||
o += 3 // skip unused fields
|
||||
o += 4 // skip unused field
|
||||
o += len(imethods(i.itype)) * Widthptr // skip fun method pointers
|
||||
// at runtime the itab will contain pointers to types, other itabs and
|
||||
// method functions. None are allocated on heap, so we can use obj.NOPTR.
|
||||
|
@ -184,8 +184,7 @@ type nonEmptyInterface struct {
|
||||
typ *rtype // dynamic concrete type
|
||||
_ uintptr
|
||||
hash uint32 // copy of typ.hash
|
||||
bad bool
|
||||
_ [3]byte
|
||||
_ [4]byte
|
||||
fun [100000]unsafe.Pointer // method table
|
||||
}
|
||||
word unsafe.Pointer
|
||||
|
@ -70,7 +70,7 @@ func getitab(inter *interfacetype, typ *_type, canfail bool) *itab {
|
||||
itabAdd(m)
|
||||
unlock(&itabLock)
|
||||
finish:
|
||||
if !m.bad {
|
||||
if m.fun[0] != 0 {
|
||||
return m
|
||||
}
|
||||
if canfail {
|
||||
@ -219,7 +219,7 @@ imethods:
|
||||
}
|
||||
}
|
||||
// didn't find method
|
||||
m.bad = true
|
||||
m.fun[0] = 0
|
||||
return iname
|
||||
}
|
||||
return ""
|
||||
|
@ -628,9 +628,8 @@ type itab struct {
|
||||
_type *_type
|
||||
_ uintptr
|
||||
hash uint32 // copy of _type.hash. Used for type switches.
|
||||
bad bool // type does not implement interface
|
||||
_ [3]byte
|
||||
fun [1]uintptr // variable sized
|
||||
_ [4]byte
|
||||
fun [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
|
||||
}
|
||||
|
||||
// Lock-free stack node.
|
||||
|
Loading…
Reference in New Issue
Block a user