mirror of
https://github.com/golang/go
synced 2024-11-22 23:50:03 -07:00
reflect.PtrValue.SetSub() to set pointers
R=rsc OCL=19101 CL=19101
This commit is contained in:
parent
2f4d35ffb9
commit
b1d37b74d9
@ -91,6 +91,17 @@ func main() {
|
||||
var s string;
|
||||
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
|
||||
typedump("missing", "$missing$");
|
||||
typedump("int", "int");
|
||||
|
@ -39,6 +39,7 @@ export type Empty interface {} // TODO(r): Delete when no longer needed?
|
||||
export type Value interface {
|
||||
Kind() int;
|
||||
Type() Type;
|
||||
Addr() Addr;
|
||||
Interface() Empty;
|
||||
}
|
||||
|
||||
@ -58,6 +59,10 @@ func (c *Common) Type() Type {
|
||||
return c.typ
|
||||
}
|
||||
|
||||
func (c *Common) Addr() Addr {
|
||||
return c.addr
|
||||
}
|
||||
|
||||
func (c *Common) Interface() Empty {
|
||||
return sys.unreflect(*AddrToPtrAddr(c.addr), c.typ.String());
|
||||
}
|
||||
@ -493,6 +498,7 @@ export type PtrValue interface {
|
||||
Type() Type;
|
||||
Sub() Value;
|
||||
Get() Addr;
|
||||
SetSub(Value);
|
||||
}
|
||||
|
||||
type PtrValueStruct struct {
|
||||
@ -507,6 +513,10 @@ func (v *PtrValueStruct) Sub() Value {
|
||||
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 {
|
||||
return &PtrValueStruct{ Common{PtrKind, typ, addr} };
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user