// 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; }