]> Cypherpunks repositories - gostls13.git/commitdiff
add some support for modifying what pointers point to
authorRob Pike <r@golang.org>
Thu, 13 Nov 2008 03:05:05 +0000 (19:05 -0800)
committerRob Pike <r@golang.org>
Thu, 13 Nov 2008 03:05:05 +0000 (19:05 -0800)
R=rsc
DELTA=27  (16 added, 11 deleted, 0 changed)
OCL=19130
CL=19132

src/lib/reflect/test.go
src/lib/reflect/value.go

index 70880943836e5a23c9b19f65b84de4a9c17931f1..7b97608dca853388f0dfdd7874316d043817a7eb 100644 (file)
@@ -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;
index bace93b6d1d5ee994d7e2a98ca79f48113d90aa3..1877d1015a9462f887ab034232a825190dcd7d94 100644 (file)
@@ -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();
 }