reflect: uncomment another test and fix RO logic issues it uncovered
Этот коммит содержится в:
родитель
e0bf376068
коммит
b39a982067
2 изменённых файлов: 16 добавлений и 7 удалений
|
@ -7659,8 +7659,6 @@ func TestAliasNames(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
func TestIssue22031(t *testing.T) {
|
||||
type s []struct{ C int }
|
||||
|
||||
|
@ -7679,6 +7677,8 @@ func TestIssue22031(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
type NonExportedFirst int
|
||||
|
||||
func (i NonExportedFirst) ΦExported() {}
|
||||
|
|
|
@ -20,6 +20,13 @@ const (
|
|||
valueFlagRO = valueFlagEmbedRO | valueFlagStickyRO
|
||||
)
|
||||
|
||||
func (v valueFlags) ro() valueFlags {
|
||||
if v&valueFlagRO != 0 {
|
||||
return valueFlagStickyRO
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type Value struct {
|
||||
typecode *rawType
|
||||
value unsafe.Pointer
|
||||
|
@ -269,11 +276,11 @@ func (v Value) Addr() Value {
|
|||
if !v.CanAddr() {
|
||||
panic("reflect.Value.Addr of unaddressable value")
|
||||
}
|
||||
|
||||
flags := (v.flags & (valueFlagExported)) | v.flags.ro()
|
||||
return Value{
|
||||
typecode: pointerTo(v.typecode),
|
||||
value: v.value,
|
||||
flags: v.flags ^ valueFlagIndirect,
|
||||
flags: flags,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -659,10 +666,12 @@ func (v Value) Elem() Value {
|
|||
if ptr == nil {
|
||||
return Value{}
|
||||
}
|
||||
// Don't copy RO flags
|
||||
flags := (v.flags & (valueFlagIndirect | valueFlagExported)) | valueFlagIndirect
|
||||
return Value{
|
||||
typecode: v.typecode.elem(),
|
||||
value: ptr,
|
||||
flags: v.flags | valueFlagIndirect,
|
||||
flags: flags,
|
||||
}
|
||||
case Interface:
|
||||
typecode, value := decomposeInterface(*(*interface{})(v.value))
|
||||
|
@ -685,7 +694,6 @@ func (v Value) Field(i int) Value {
|
|||
|
||||
// Copy flags but clear EmbedRO; we're not an embedded field anymore
|
||||
flags := v.flags & ^valueFlagEmbedRO
|
||||
|
||||
if structField.PkgPath != "" {
|
||||
// No PkgPath => not exported.
|
||||
// Clear exported flag even if the parent was exported.
|
||||
|
@ -764,9 +772,10 @@ func (v Value) Index(i int) Value {
|
|||
if uint(i) >= uint(slice.len) {
|
||||
panic("reflect: slice index out of range")
|
||||
}
|
||||
flags := (v.flags & (valueFlagExported | valueFlagIndirect)) | valueFlagIndirect | v.flags.ro()
|
||||
elem := Value{
|
||||
typecode: v.typecode.elem(),
|
||||
flags: v.flags | valueFlagIndirect,
|
||||
flags: flags,
|
||||
}
|
||||
elem.value = unsafe.Add(slice.data, elem.typecode.Size()*uintptr(i)) // pointer to new value
|
||||
return elem
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче