Commit b1d37b74 authored by Rob Pike's avatar Rob Pike

reflect.PtrValue.SetSub() to set pointers

R=rsc
OCL=19101
CL=19101
parent 2f4d35ff
...@@ -91,6 +91,17 @@ func main() { ...@@ -91,6 +91,17 @@ func main() {
var s string; var s string;
var t reflect.Type; var t reflect.Type;
{
var ip *int32;
var i int32 = 1234;
vip := reflect.NewValue(&ip);
vi := reflect.NewValue(i);
vip.(reflect.PtrValue).Sub().(reflect.PtrValue).SetSub(vi);
if *ip != 1234 {
panicln("SetSub failure", *ip);
}
}
// Types // Types
typedump("missing", "$missing$"); typedump("missing", "$missing$");
typedump("int", "int"); typedump("int", "int");
......
...@@ -39,6 +39,7 @@ export type Empty interface {} // TODO(r): Delete when no longer needed? ...@@ -39,6 +39,7 @@ export type Empty interface {} // TODO(r): Delete when no longer needed?
export type Value interface { export type Value interface {
Kind() int; Kind() int;
Type() Type; Type() Type;
Addr() Addr;
Interface() Empty; Interface() Empty;
} }
...@@ -58,6 +59,10 @@ func (c *Common) Type() Type { ...@@ -58,6 +59,10 @@ func (c *Common) Type() Type {
return c.typ return c.typ
} }
func (c *Common) Addr() Addr {
return c.addr
}
func (c *Common) Interface() Empty { func (c *Common) Interface() Empty {
return sys.unreflect(*AddrToPtrAddr(c.addr), c.typ.String()); return sys.unreflect(*AddrToPtrAddr(c.addr), c.typ.String());
} }
...@@ -493,6 +498,7 @@ export type PtrValue interface { ...@@ -493,6 +498,7 @@ export type PtrValue interface {
Type() Type; Type() Type;
Sub() Value; Sub() Value;
Get() Addr; Get() Addr;
SetSub(Value);
} }
type PtrValueStruct struct { type PtrValueStruct struct {
...@@ -507,6 +513,10 @@ func (v *PtrValueStruct) Sub() Value { ...@@ -507,6 +513,10 @@ func (v *PtrValueStruct) Sub() Value {
return NewValueAddr(v.typ.(PtrType).Sub(), v.Get()); return NewValueAddr(v.typ.(PtrType).Sub(), v.Get());
} }
func (v *PtrValueStruct) SetSub(subv Value) {
*AddrToPtrAddr(v.addr) = subv.Addr();
}
func PtrCreator(typ Type, addr Addr) Value { func PtrCreator(typ Type, addr Addr) Value {
return &PtrValueStruct{ Common{PtrKind, typ, addr} }; return &PtrValueStruct{ Common{PtrKind, typ, addr} };
} }
......
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