char *sysimport =
"package sys\n"
- "type sys.any any\n"
- "type sys.uint32 uint32\n"
- "export func sys.mal (? sys.uint32) (? *sys.any)\n"
+ "export func sys.mal (? uint32) (? *any)\n"
"export func sys.breakpoint ()\n"
"export func sys.throwindex ()\n"
"export func sys.throwreturn ()\n"
- "type sys.int32 int32\n"
- "export func sys.panicl (? sys.int32)\n"
- "type sys.bool bool\n"
- "export func sys.printbool (? sys.bool)\n"
- "type sys.float64 float64\n"
- "export func sys.printfloat (? sys.float64)\n"
- "type sys.int64 int64\n"
- "export func sys.printint (? sys.int64)\n"
- "type sys.string string\n"
- "export func sys.printstring (? sys.string)\n"
- "export func sys.printpointer (? *sys.any)\n"
- "export func sys.printinter (? sys.any)\n"
+ "export func sys.panicl (? int32)\n"
+ "export func sys.printbool (? bool)\n"
+ "export func sys.printfloat (? float64)\n"
+ "export func sys.printint (? int64)\n"
+ "export func sys.printstring (? string)\n"
+ "export func sys.printpointer (? *any)\n"
+ "export func sys.printinter (? any)\n"
"export func sys.printnl ()\n"
"export func sys.printsp ()\n"
- "export func sys.catstring (? sys.string, ? sys.string) (? sys.string)\n"
- "export func sys.cmpstring (? sys.string, ? sys.string) (? sys.int32)\n"
- "export func sys.slicestring (? sys.string, ? sys.int32, ? sys.int32) (? sys.string)\n"
- "type sys.uint8 uint8\n"
- "export func sys.indexstring (? sys.string, ? sys.int32) (? sys.uint8)\n"
- "export func sys.intstring (? sys.int64) (? sys.string)\n"
- "export func sys.byteastring (? *sys.uint8, ? sys.int32) (? sys.string)\n"
- "export func sys.arraystring (? *[]sys.uint8) (? sys.string)\n"
- "export func sys.ifaceT2I (sigi *sys.uint8, sigt *sys.uint8, elem sys.any) (ret sys.any)\n"
- "export func sys.ifaceI2T (sigt *sys.uint8, iface sys.any) (ret sys.any)\n"
- "export func sys.ifaceI2I (sigi *sys.uint8, iface sys.any) (ret sys.any)\n"
- "export func sys.ifaceeq (i1 sys.any, i2 sys.any) (ret sys.bool)\n"
- "export func sys.argc () (? sys.int32)\n"
- "export func sys.envc () (? sys.int32)\n"
- "export func sys.argv (? sys.int32) (? sys.string)\n"
- "export func sys.envv (? sys.int32) (? sys.string)\n"
- "export func sys.frexp (? sys.float64) (? sys.float64, ? sys.int32)\n"
- "export func sys.ldexp (? sys.float64, ? sys.int32) (? sys.float64)\n"
- "export func sys.modf (? sys.float64) (? sys.float64, ? sys.float64)\n"
- "export func sys.isInf (? sys.float64, ? sys.int32) (? sys.bool)\n"
- "export func sys.isNaN (? sys.float64) (? sys.bool)\n"
- "export func sys.Inf (? sys.int32) (? sys.float64)\n"
- "export func sys.NaN () (? sys.float64)\n"
- "export func sys.newmap (keysize sys.uint32, valsize sys.uint32, keyalg sys.uint32, valalg sys.uint32, hint sys.uint32) (hmap *map[sys.any] sys.any)\n"
- "export func sys.mapaccess1 (hmap *map[sys.any] sys.any, key sys.any) (val sys.any)\n"
- "export func sys.mapaccess2 (hmap *map[sys.any] sys.any, key sys.any) (val sys.any, pres sys.bool)\n"
- "export func sys.mapassign1 (hmap *map[sys.any] sys.any, key sys.any, val sys.any)\n"
- "export func sys.mapassign2 (hmap *map[sys.any] sys.any, key sys.any, val sys.any, pres sys.bool)\n"
- "export func sys.newchan (elemsize sys.uint32, elemalg sys.uint32, hint sys.uint32) (hchan *chan sys.any)\n"
- "export func sys.chanrecv1 (hchan *chan sys.any) (elem sys.any)\n"
- "export func sys.chanrecv2 (hchan *chan sys.any) (elem sys.any, pres sys.bool)\n"
- "export func sys.chanrecv3 (hchan *chan sys.any, elem *sys.any) (pres sys.bool)\n"
- "export func sys.chansend1 (hchan *chan sys.any, elem sys.any)\n"
- "export func sys.chansend2 (hchan *chan sys.any, elem sys.any) (pres sys.bool)\n"
- "export func sys.newselect (size sys.uint32) (sel *sys.uint8)\n"
- "export func sys.selectsend (sel *sys.uint8, hchan *chan sys.any, elem sys.any) (selected sys.bool)\n"
- "export func sys.selectrecv (sel *sys.uint8, hchan *chan sys.any, elem *sys.any) (selected sys.bool)\n"
- "export func sys.selectgo (sel *sys.uint8)\n"
- "export func sys.newarray (nel sys.uint32, cap sys.uint32, width sys.uint32) (ary *[]sys.any)\n"
- "export func sys.arraysliced (old *[]sys.any, lb sys.uint32, hb sys.uint32, width sys.uint32) (ary *[]sys.any)\n"
- "export func sys.arrayslices (old *sys.any, nel sys.uint32, lb sys.uint32, hb sys.uint32, width sys.uint32) (ary *[]sys.any)\n"
- "export func sys.arrays2d (old *sys.any, nel sys.uint32) (ary *[]sys.any)\n"
+ "export func sys.catstring (? string, ? string) (? string)\n"
+ "export func sys.cmpstring (? string, ? string) (? int32)\n"
+ "export func sys.slicestring (? string, ? int32, ? int32) (? string)\n"
+ "export func sys.indexstring (? string, ? int32) (? uint8)\n"
+ "export func sys.intstring (? int64) (? string)\n"
+ "export func sys.byteastring (? *uint8, ? int32) (? string)\n"
+ "export func sys.arraystring (? *[]uint8) (? string)\n"
+ "export func sys.ifaceT2I (sigi *uint8, sigt *uint8, elem any) (ret any)\n"
+ "export func sys.ifaceI2T (sigt *uint8, iface any) (ret any)\n"
+ "export func sys.ifaceI2I (sigi *uint8, iface any) (ret any)\n"
+ "export func sys.ifaceeq (i1 any, i2 any) (ret bool)\n"
+ "export func sys.reflect (i interface { }) (? uint64, ? string)\n"
+ "export func sys.argc () (? int32)\n"
+ "export func sys.envc () (? int32)\n"
+ "export func sys.argv (? int32) (? string)\n"
+ "export func sys.envv (? int32) (? string)\n"
+ "export func sys.frexp (? float64) (? float64, ? int32)\n"
+ "export func sys.ldexp (? float64, ? int32) (? float64)\n"
+ "export func sys.modf (? float64) (? float64, ? float64)\n"
+ "export func sys.isInf (? float64, ? int32) (? bool)\n"
+ "export func sys.isNaN (? float64) (? bool)\n"
+ "export func sys.Inf (? int32) (? float64)\n"
+ "export func sys.NaN () (? float64)\n"
+ "export func sys.newmap (keysize uint32, valsize uint32, keyalg uint32, valalg uint32, hint uint32) (hmap *map[any] any)\n"
+ "export func sys.mapaccess1 (hmap *map[any] any, key any) (val any)\n"
+ "export func sys.mapaccess2 (hmap *map[any] any, key any) (val any, pres bool)\n"
+ "export func sys.mapassign1 (hmap *map[any] any, key any, val any)\n"
+ "export func sys.mapassign2 (hmap *map[any] any, key any, val any, pres bool)\n"
+ "export func sys.newchan (elemsize uint32, elemalg uint32, hint uint32) (hchan *chan any)\n"
+ "export func sys.chanrecv1 (hchan *chan any) (elem any)\n"
+ "export func sys.chanrecv2 (hchan *chan any) (elem any, pres bool)\n"
+ "export func sys.chanrecv3 (hchan *chan any, elem *any) (pres bool)\n"
+ "export func sys.chansend1 (hchan *chan any, elem any)\n"
+ "export func sys.chansend2 (hchan *chan any, elem any) (pres bool)\n"
+ "export func sys.newselect (size uint32) (sel *uint8)\n"
+ "export func sys.selectsend (sel *uint8, hchan *chan any, elem any) (selected bool)\n"
+ "export func sys.selectrecv (sel *uint8, hchan *chan any, elem *any) (selected bool)\n"
+ "export func sys.selectgo (sel *uint8)\n"
+ "export func sys.newarray (nel uint32, cap uint32, width uint32) (ary *[]any)\n"
+ "export func sys.arraysliced (old *[]any, lb uint32, hb uint32, width uint32) (ary *[]any)\n"
+ "export func sys.arrayslices (old *any, nel uint32, lb uint32, hb uint32, width uint32) (ary *[]any)\n"
+ "export func sys.arrays2d (old *any, nel uint32) (ary *[]any)\n"
"export func sys.gosched ()\n"
"export func sys.goexit ()\n"
- "export func sys.readfile (? sys.string) (? sys.string, ? sys.bool)\n"
- "export func sys.writefile (? sys.string, ? sys.string) (? sys.bool)\n"
- "export func sys.bytestorune (? *sys.uint8, ? sys.int32, ? sys.int32) (? sys.int32, ? sys.int32)\n"
- "export func sys.stringtorune (? sys.string, ? sys.int32) (? sys.int32, ? sys.int32)\n"
- "export func sys.exit (? sys.int32)\n"
+ "export func sys.readfile (? string) (? string, ? bool)\n"
+ "export func sys.writefile (? string, ? string) (? bool)\n"
+ "export func sys.bytestorune (? *uint8, ? int32, ? int32) (? int32, ? int32)\n"
+ "export func sys.stringtorune (? string, ? int32) (? int32, ? int32)\n"
+ "export func sys.exit (? int32)\n"
"\n"
"$$\n";
#define END nil,0,0,nil
-Sigi sys·sigi_inter[2] = { (byte*)"sys·nilinter", 0, 0, nil, 0, 0 };
+Sigi sys·sigi_inter[2] = { (byte*)"interface {}", 0, 0, nil, 0, 0 };
-Sigt sys·sigt_int8[2] = { (byte*)"sys·int8", ASIMP, 1, nil, END };
-Sigt sys·sigt_int16[2] = { (byte*)"sys·int16", ASIMP, 2, nil, END };
-Sigt sys·sigt_int32[2] = { (byte*)"sys·int32", ASIMP, 4, nil, END };
-Sigt sys·sigt_int64[2] = { (byte*)"sys·int64", ASIMP, 8, nil, END };
+Sigt sys·sigt_int8[2] = { (byte*)"int8", ASIMP, 1, nil, END };
+Sigt sys·sigt_int16[2] = { (byte*)"int16", ASIMP, 2, nil, END };
+Sigt sys·sigt_int32[2] = { (byte*)"int32", ASIMP, 4, nil, END };
+Sigt sys·sigt_int64[2] = { (byte*)"int64", ASIMP, 8, nil, END };
-Sigt sys·sigt_uint8[2] = { (byte*)"sys·uint8", ASIMP, 1, nil, END };
-Sigt sys·sigt_uint16[2] = { (byte*)"sys·uint16", ASIMP, 2, nil, END };
-Sigt sys·sigt_uint32[2] = { (byte*)"sys·uint32", ASIMP, 4, nil, END };
-Sigt sys·sigt_uint64[2] = { (byte*)"sys·uint64", ASIMP, 8, nil, END };
+Sigt sys·sigt_uint8[2] = { (byte*)"uint8", ASIMP, 1, nil, END };
+Sigt sys·sigt_uint16[2] = { (byte*)"uint16", ASIMP, 2, nil, END };
+Sigt sys·sigt_uint32[2] = { (byte*)"uint32", ASIMP, 4, nil, END };
+Sigt sys·sigt_uint64[2] = { (byte*)"uint64", ASIMP, 8, nil, END };
-Sigt sys·sigt_float32[2] = { (byte*)"sys·float32", ASIMP, 4, nil, END };
-Sigt sys·sigt_float64[2] = { (byte*)"sys·float64", ASIMP, 8, nil, END };
-//Sigt sys·sigt_float80[2] = { (byte*)"sys·float80", ASIMP, 0, nil, END };
+Sigt sys·sigt_float32[2] = { (byte*)"float32", ASIMP, 4, nil, END };
+Sigt sys·sigt_float64[2] = { (byte*)"float64", ASIMP, 8, nil, END };
+//Sigt sys·sigt_float80[2] = { (byte*)"float80", ASIMP, 0, nil, END };
-Sigt sys·sigt_bool[2] = { (byte*)"sys·bool", ASIMP, 1, nil, END };
-Sigt sys·sigt_string[2] = { (byte*)"sys·string", ASTRING, 8, nil, END };
+Sigt sys·sigt_bool[2] = { (byte*)"bool", ASIMP, 1, nil, END };
+Sigt sys·sigt_string[2] = { (byte*)"string", ASTRING, 8, nil, END };
static void
printsigi(Sigi *si)
}
static Map*
-hashmap(Sigi *si, Sigt *st)
+hashmap(Sigi *si, Sigt *st, int32 canfail)
{
int32 nt, ni;
uint32 ihash, h;
for(m=hash[h]; m!=nil; m=m->link) {
if(m->sigi == si && m->sigt == st) {
if(m->bad) {
- throw("bad hashmap");
+ if(!canfail)
+ throw("bad hashmap");
m = nil;
}
// prints("old hashmap\n");
// from structure signature
sname = st[nt].name;
if(sname == nil) {
- prints("cannot convert type ");
- prints((int8*)st[0].name);
- prints(" to interface ");
- prints((int8*)si[0].name);
- prints(": missing method ");
- prints((int8*)iname);
- prints("\n");
- throw("interface conversion");
+ if(!canfail) {
+ prints("cannot convert type ");
+ prints((int8*)st[0].name);
+ prints(" to interface ");
+ prints((int8*)si[0].name);
+ prints(": missing method ");
+ prints((int8*)iname);
+ prints("\n");
+ throw("interface conversion");
+ }
m->bad = 1;
m->link = hash[h];
hash[h] = m;
prints("\n");
}
- retim = hashmap(si, st);
+ retim = hashmap(si, st, 0);
// alg = st->hash;
// wid = st->offset;
retit = it;
retim = im;
if(im->sigi != si)
- retim = hashmap(si, im->sigt);
+ retim = hashmap(si, im->sigt, 0);
}
if(debug) {
{
printiface(im, it);
}
+
+void
+sys·reflect(Map *im, void *it, uint64 retit, string rettype)
+{
+ string s;
+ int32 n;
+ byte *type;
+
+ if(im == nil) {
+ retit = 0;
+ rettype = nil;
+ } else {
+ retit = (uint64)it;
+ type = im->sigt->name;
+ n = findnull((int8*)type);
+ s = mal(sizeof *s + n + 1);
+ s->len = n;
+ mcpy(s->str, type, n);
+ rettype = s;
+ }
+ FLUSH(&retit);
+ FLUSH(&rettype);
+}