#include "runtime.h"
#include "type.h"
#line 8 "reflect.cgo"
static Type*
gettype ( void *typ )
{
#line 15 "reflect.cgo"
return ( Type* ) ( ( void** ) typ - 2 ) ;
}
void
reflect·mapaccess(byte* map, byte* key, byte* val, bool pres)
{
#line 25 "reflect.cgo"
mapaccess((Hmap*)map, key, val, &pres);
FLUSH(&pres);
}
void
reflect·mapassign(byte* map, byte* key, byte* val)
{
#line 29 "reflect.cgo"
mapassign((Hmap*)map, key, val);
}
void
reflect·maplen(byte* map, int32 len)
{
#line 33 "reflect.cgo"
// length is first word of map
len = *(uint32*)map;
FLUSH(&len);
}
void
reflect·mapiterinit(byte* map, byte* it)
{
#line 38 "reflect.cgo"
it = (byte*)mapiterinit((Hmap*)map);
FLUSH(&it);
}
void
reflect·mapiternext(byte* it)
{
#line 42 "reflect.cgo"
mapiternext((struct hash_iter*)it);
}
void
reflect·mapiterkey(byte* it, byte* key, bool ok)
{
#line 46 "reflect.cgo"
ok = mapiterkey((struct hash_iter*)it, key);
FLUSH(&ok);
}
void
reflect·makemap(byte* typ, byte* map)
{
#line 50 "reflect.cgo"
MapType *t;
t = (MapType*)gettype(typ);
map = (byte*)makemap(t->key, t->elem, 0);
FLUSH(&map);
}
void
reflect·makechan(byte* typ, uint32 size, byte* ch)
{
#line 61 "reflect.cgo"
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);
FLUSH(&ch);
}
void
reflect·chansend(byte* ch, byte* val, bool* pres)
{
#line 72 "reflect.cgo"
chansend((Hchan*)ch, val, pres);
}
void
reflect·chanrecv(byte* ch, byte* val, bool* pres)
{
#line 76 "reflect.cgo"
chanrecv((Hchan*)ch, val, pres);
}
void
reflect·chanclose(byte* ch)
{
#line 80 "reflect.cgo"
chanclose((Hchan*)ch);
}
void
reflect·chanclosed(byte* ch, bool r)
{
#line 84 "reflect.cgo"
r = chanclosed((Hchan*)ch);
FLUSH(&r);
}
void
reflect·chanlen(byte* ch, int32 r)
{
#line 88 "reflect.cgo"
r = chanlen((Hchan*)ch);
FLUSH(&r);
}
void
reflect·chancap(byte* ch, int32 r)
{
#line 92 "reflect.cgo"
r = chancap((Hchan*)ch);
FLUSH(&r);
}
void
reflect·setiface(byte* typ, byte* x, byte* ret)
{
#line 101 "reflect.cgo"
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);
}
|