XR symbol_eq(XR cl, XR self, XR other) { (void) cl; if (!xrIsPtr(other)) return VAL_FALSE; if (xrMTable(other) != symbol_vt) return VAL_FALSE; if (xrSymLen(self) != xrSymLen(other)) return VAL_FALSE; /* FIXME: Symbols will all be so short this won't really help, need * to be able to just assume all symbols are interned */ /* UPDATE: all symbols should now be interned. Just need to sort out * proper interfaces/messages for comparison */ if (xrSymInterned(self) && xrSymInterned(other) && self == other) { return VAL_TRUE; } const char *stra = xrSymPtr(self); const char *strb = xrSymPtr(other); size_t slen = xrSymLen(self); size_t olen = xrSymLen(other); size_t mlen = (slen < olen) ? slen : olen; if (strncmp(stra, strb, mlen) == 0) return VAL_TRUE; return VAL_FALSE; }
int main(int argc, char **argv) { xr_init(); bool eval = false; bool verbose = false; int c; while ((c = getopt(argc, argv, "ev")) != -1) { switch (c) { case 'e': eval = true; break; case 'v': verbose = true; break; } } XR obj_list; if (optind < argc) { char *file = argv[optind]; obj_list = xr_parse_dump_file(file); } else { obj_list = xr_parse_dump_from_stdin(); } if (verbose) log("# Objs: %ld\n", xrListLen(obj_list)); XR root_mt = xrMTable(root); assert(root_mt); /* Lookup the "init" method */ XR init_m = xrClosureAt(send(root_mt, s_at, xr_sym("init")), 0); if (verbose) qsend(init_m, "show"); if (!eval) { FILE *fp = fopen("blahtestsymfile", "w"); qsend(root, "pack", fp); fclose(fp); return 0; } if (verbose) log("##############\nRunning VM\n##############\n"); xr_run_method(init_m); return 0; }