| // Copyright 2010 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package reflect |
| #include "go-type.h" |
| #include "interface.h" |
| #define nil NULL |
| typedef unsigned char byte; |
| |
| typedef struct __go_interface Iface; |
| typedef struct __go_empty_interface Eface; |
| |
| func setiface(typ *byte, x *byte, ret *byte) { |
| struct __go_interface_type *t; |
| const struct __go_type_descriptor* xt; |
| |
| /* FIXME: We should check __type_descriptor to verify that |
| this is really a type descriptor. */ |
| t = (struct __go_interface_type *)typ; |
| if(t->__methods.__count == 0) { |
| // already an empty interface |
| *(Eface*)ret = *(Eface*)x; |
| return; |
| } |
| xt = ((Eface*)x)->__type_descriptor; |
| if(xt == nil) { |
| // can assign nil to any interface |
| ((Iface*)ret)->__methods = nil; |
| ((Iface*)ret)->__object = nil; |
| return; |
| } |
| ((Iface*)ret)->__methods = __go_convert_interface(&t->__common, xt); |
| ((Iface*)ret)->__object = ((Eface*)x)->__object; |
| } |