Commit a72b87ef authored by Russ Cox's avatar Russ Cox

reflect: make Value.Interface return immutable data

Fixes #3134.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5713049
parent dc159fab
......@@ -1743,3 +1743,15 @@ func isValid(v Value) {
panic("zero Value")
}
}
func TestAlias(t *testing.T) {
x := string("hello")
v := ValueOf(&x).Elem()
oldvalue := v.Interface()
v.SetString("world")
newvalue := v.Interface()
if oldvalue != "hello" || newvalue != "world" {
t.Errorf("aliasing: old=%q new=%q, want hello, world", oldvalue, newvalue)
}
}
......@@ -842,6 +842,16 @@ func valueInterface(v Value, safe bool) interface{} {
var eface emptyInterface
eface.typ = v.typ.runtimeType()
eface.word = v.iword()
if v.flag&flagIndir != 0 && v.typ.size > ptrSize {
// eface.word is a pointer to the actual data,
// which might be changed. We need to return
// a pointer to unchanging data, so make a copy.
ptr := unsafe_New(v.typ)
memmove(ptr, unsafe.Pointer(eface.word), v.typ.size)
eface.word = iword(ptr)
}
return *(*interface{})(unsafe.Pointer(&eface))
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment