// Copyright 2009 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 "runtime.h" #include "type.h" static Type* gettype(void *typ) { // typ is a *runtime.Type (or *runtime.MapType, etc), but the Type // defined in type.h includes an interface value header // in front of the raw structure. the -2 below backs up // to the interface value header. return (Type*)((void**)typ - 2); } /* * Go wrappers around the C functions near the bottom of hashmap.c * There's no recursion here even though it looks like there is: * the names after func are in the reflect package name space * but the names in the C bodies are in the standard C name space. */ func mapaccess(map *byte, key *byte, val *byte) (pres bool) { mapaccess((Hmap*)map, key, val, &pres); } func mapassign(map *byte, key *byte, val *byte) { mapassign((Hmap*)map, key, val); } func maplen(map *byte) (len int32) { // length is first word of map len = *(uint32*)map; } func mapiterinit(map *byte) (it *byte) { it = (byte*)mapiterinit((Hmap*)map); } func mapiternext(it *byte) { mapiternext((struct hash_iter*)it); } func mapiterkey(it *byte, key *byte) (ok bool) { ok = mapiterkey((struct hash_iter*)it, key); } func makemap(typ *byte) (map *byte) { MapType *t; t = (MapType*)gettype(typ); map = (byte*)makemap(t->key, t->elem, 0); } /* * Go wrappers around the C functions in chan.c */ func makechan(typ *byte, size uint32) (ch *byte) { ChanType *t; // typ is a *runtime.ChanType, but the ChanType // defined in type.h includes an interface value header // in front of the raw ChanType. the -2 below backs up // to the interface value header. t = (ChanType*)gettype(typ); ch = (byte*)makechan(t->elem, size); } func chansend(ch *byte, val *byte, pres *bool) { chansend((Hchan*)ch, val, pres); } func chanrecv(ch *byte, val *byte, pres *bool) { chanrecv((Hchan*)ch, val, pres); } func chanclose(ch *byte) { chanclose((Hchan*)ch); } func chanclosed(ch *byte) (r bool) { r = chanclosed((Hchan*)ch); } func chanlen(ch *byte) (r int32) { r = chanlen((Hchan*)ch); } func chancap(ch *byte) (r int32) { r = chancap((Hchan*)ch); } /* * Go wrappers around the functions in iface.c */ func setiface(typ *byte, x *byte, ret *byte) { InterfaceType *t; t = (InterfaceType*)gettype(typ); if(t->mhdr.len == 0) { // already an empty interface *(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); }