Commit 6e0767bb authored by Russ Cox's avatar Russ Cox

reflect fixes

R=r
https://golang.org/cl/156104
parent 7fce5ad0
...@@ -569,6 +569,8 @@ func (t *StructType) NumField() int { return len(t.fields) } ...@@ -569,6 +569,8 @@ func (t *StructType) NumField() int { return len(t.fields) }
// Same memory layouts, different method sets. // Same memory layouts, different method sets.
func toType(i interface{}) Type { func toType(i interface{}) Type {
switch v := i.(type) { switch v := i.(type) {
case nil:
return nil
case *runtime.BoolType: case *runtime.BoolType:
return (*BoolType)(unsafe.Pointer(v)) return (*BoolType)(unsafe.Pointer(v))
case *runtime.DotDotDotType: case *runtime.DotDotDotType:
......
...@@ -906,7 +906,10 @@ func setiface(typ *InterfaceType, x *interface{}, addr addr) ...@@ -906,7 +906,10 @@ func setiface(typ *InterfaceType, x *interface{}, addr addr)
// Set assigns x to v. // Set assigns x to v.
func (v *InterfaceValue) Set(x Value) { func (v *InterfaceValue) Set(x Value) {
i := x.Interface(); var i interface{}
if x != nil {
i = x.Interface()
}
if !v.canSet { if !v.canSet {
panic(cannotSet) panic(cannotSet)
} }
......
...@@ -108,5 +108,11 @@ func setiface(typ *byte, x *byte, ret *byte) { ...@@ -108,5 +108,11 @@ func setiface(typ *byte, x *byte, ret *byte) {
*(Eface*)ret = *(Eface*)x; *(Eface*)ret = *(Eface*)x;
return; 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); ifaceE2I((InterfaceType*)gettype(typ), *(Eface*)x, (Iface*)ret);
} }
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