]> Cypherpunks repositories - gostls13.git/commitdiff
reflect fixes
authorRuss Cox <rsc@golang.org>
Fri, 20 Nov 2009 06:06:32 +0000 (22:06 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 20 Nov 2009 06:06:32 +0000 (22:06 -0800)
R=r
https://golang.org/cl/156104

src/pkg/reflect/type.go
src/pkg/reflect/value.go
src/pkg/runtime/reflect.cgo

index faea24340e9436fc335ca98e99e5afa33aef106b..a6988d312cf08b39dfebcf32881f0d0dd2abd877 100644 (file)
@@ -569,6 +569,8 @@ func (t *StructType) NumField() int { return len(t.fields) }
 // Same memory layouts, different method sets.
 func toType(i interface{}) Type {
        switch v := i.(type) {
+       case nil:
+               return nil
        case *runtime.BoolType:
                return (*BoolType)(unsafe.Pointer(v))
        case *runtime.DotDotDotType:
index add4c4b0363f1db4e62add772d6445237fd8e3fb..c71f4dd693fafda26244f1cdc4d538865543c779 100644 (file)
@@ -906,7 +906,10 @@ func setiface(typ *InterfaceType, x *interface{}, addr addr)
 
 // Set assigns x to v.
 func (v *InterfaceValue) Set(x Value) {
-       i := x.Interface();
+       var i interface{}
+       if x != nil {
+               i = x.Interface()
+       }
        if !v.canSet {
                panic(cannotSet)
        }
index 8bef070c546f30e5d85e7482b0b1b7f84aea1f79..51222f1c429bed60ad16395619b2e8c7c5bb921d 100644 (file)
@@ -108,5 +108,11 @@ func setiface(typ *byte, x *byte, ret *byte) {
                *(Eface*)ret = *(Eface*)x;
                return;
        }
+       if(((Eface*)x)->type == nil) {
+               // can assign nil to any interface
+               ((Iface*)ret)->tab = nil;
+               ((Iface*)ret)->data = nil;
+               return;
+       }
        ifaceE2I((InterfaceType*)gettype(typ), *(Eface*)x, (Iface*)ret);
 }