summaryrefslogtreecommitdiff
path: root/libgo/runtime/reflect.goc
blob: 01d218adb8c0004cdc21649848fca2feddff5cc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 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;
}