summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2008-11-12 19:05:05 -0800
committerRob Pike <r@golang.org>2008-11-12 19:05:05 -0800
commitc95d659f808741a2ae318f053df052a9e8e0a663 (patch)
tree8c32b8ee9e231de5032d302f986e29c3b3d48014
parent16dec16c6a5f28a8599780d2b6aeb20b7c6e6c69 (diff)
downloadgolang-c95d659f808741a2ae318f053df052a9e8e0a663.tar.gz
add some support for modifying what pointers point to
R=rsc DELTA=27 (16 added, 11 deleted, 0 changed) OCL=19130 CL=19132
-rw-r--r--src/lib/reflect/test.go22
-rw-r--r--src/lib/reflect/value.go5
2 files changed, 16 insertions, 11 deletions
diff --git a/src/lib/reflect/test.go b/src/lib/reflect/test.go
index 708809438..7b97608dc 100644
--- a/src/lib/reflect/test.go
+++ b/src/lib/reflect/test.go
@@ -91,17 +91,6 @@ 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");
@@ -205,6 +194,17 @@ func main() {
assert(reflect.ValueToString(value.(reflect.PtrValue).Sub()), "main.AA·test{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}");
}
+ {
+ 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);
+ }
+ }
+
var pt reflect.PtrType;
var st reflect.StructType;
var mt reflect.MapType;
diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go
index bace93b6d..1877d1015 100644
--- a/src/lib/reflect/value.go
+++ b/src/lib/reflect/value.go
@@ -514,6 +514,11 @@ func (v *PtrValueStruct) Sub() Value {
}
func (v *PtrValueStruct) SetSub(subv Value) {
+ a := v.typ.(PtrType).Sub().String();
+ b := subv.Type().String();
+ if a != b {
+ panicln("reflect: incompatible types in PtrValue.SetSub:", a, b);
+ }
*AddrToPtrAddr(v.addr) = subv.Addr();
}