///\return string of the sig tuple. "arg1=o,arg2=o" PN potion_sig_string(Potion *P, PN cl, PN sig) { PN out = potion_byte_str(P, ""); if (PN_IS_TUPLE(sig)) { int nextdef = 0; struct PNTuple * volatile t = ((struct PNTuple *)potion_fwd(sig)); if (t->len != 0) { PN_SIZE i, comma=0; for (i = 0; i < t->len; i++) { PN v = (PN)t->set[i]; if (PN_IS_NUM(v)) { // currently types are still encoded as NUM, TODO: support VTABLE also int c = PN_INT(v); comma=0; if (c == '.') // is end pn_printf(P, out, "."); else if (c == '|') // is optional pn_printf(P, out, "|"); else if (c == ':') { nextdef = 1; pn_printf(P, out, ":"); // is default } else { if (comma++) pn_printf(P, out, ","); if (nextdef) { nextdef = 0; pn_printf(P, out, "="); potion_bytes_obj_string(P, out, v); } else pn_printf(P, out, "=%c", c); } } else { if (comma++) pn_printf(P, out, ","); if (nextdef) { nextdef = 0; pn_printf(P, out, "="); } potion_bytes_obj_string(P, out, v); }}}} return PN_STR_B(out); }
PN potion_source_string(Potion *P, PN cl, PN self) { int i, n; struct PNSource *t = (struct PNSource *)self; PN out = potion_byte_str(P, potion_ast_names[t->part]); n = potion_ast_sizes[t->part]; for (i = 0; i < n; i++) { pn_printf(P, out, " "); if (i == 0 && n > 1) pn_printf(P, out, "("); potion_bytes_obj_string(P, out, t->a[i]); if (i == n - 1 && n > 1) pn_printf(P, out, ")"); } return out; }
PN potion_proto_string(Potion *P, PN cl, PN self) { vPN(Proto) t = (struct PNProto *)self; int x = 0; PN_SIZE num = 1; PN_SIZE numcols; PN out = potion_byte_str(P, "; function definition"); pn_printf(P, out, ": %p ; %u bytes\n", t, PN_FLEX_SIZE(t->asmb)); pn_printf(P, out, "; ("); PN_TUPLE_EACH(t->sig, i, v, { if (PN_IS_NUM(v)) { if (v == '.') pn_printf(P, out, ". "); else if (v == '|') pn_printf(P, out, "| "); else pn_printf(P, out, "=%c, ", (int)PN_INT(v)); } else potion_bytes_obj_string(P, out, v); });
///\memberof PNProto /// string method of PNProto. ascii dump of a function definition PN potion_proto_string(Potion *P, PN cl, PN self) { vPN(Proto) t = (struct PNProto *)self; int x = 0; PN_SIZE num = 1; PN_SIZE numcols; PN out = potion_byte_str(P, "; function definition"); #ifdef JIT_DEBUG pn_printf(P, out, ": %p; %u bytes\n", t, PN_FLEX_SIZE(t->asmb)); #else pn_printf(P, out, ": %u bytes\n", PN_FLEX_SIZE(t->asmb)); #endif if (t->name) pn_printf(P, out, "; %s(", PN_STR_PTR(t->name)); else pn_printf(P, out, "; ("); potion_bytes_obj_string(P, out, potion_sig_string(P, cl, t->sig)); pn_printf(P, out, ") %ld registers\n", PN_INT(t->stack)); PN_TUPLE_EACH(t->paths, i, v, { pn_printf(P, out, ".path /"); v = PN_TUPLE_AT(t->values, PN_INT(v)); potion_bytes_obj_string(P, out, v); pn_printf(P, out, " ; %u\n", i); });
int main ( int argc, char *argv[] ) { POTION_INIT_STACK(sp); int i, verbose = 0, exec = 1 + POTION_JIT, interactive = 1; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-I") == 0 || strcmp(argv[i], "--inspect") == 0) { verbose = 1; continue; } if (strcmp(argv[i], "-V") == 0 || strcmp(argv[i], "--verbose") == 0) { verbose = 2; continue; } if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) { potion_cmd_version(); return 0; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { potion_cmd_usage(); return 0; } if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--stats") == 0) { potion_cmd_stats(sp); return 0; } if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--compile") == 0) { exec = 0; continue; } if (strcmp(argv[i], "-B") == 0 || strcmp(argv[i], "--bytecode") == 0) { exec = 1; continue; } if (strcmp(argv[i], "-X") == 0 || strcmp(argv[i], "--x86") == 0) { exec = 2; continue; } if (i == argc - 1) { interactive = 0; continue; } potion_fatal("** Unrecognized option: %s\n", argv[i]); } if (!interactive) { potion_cmd_compile(argv[argc - 1], exec, verbose, sp); } else { if (!exec || verbose) potion_fatal("** no filename given\n"); Potion *P = potion_create(sp); potion_eval(P, potion_byte_str(P, "load 'readline'\n" "loop:\n" " code = readline('>> ')\n" " if (not code): \"\\n\" print, break.\n" " if (code != ''):\n" " obj = code eval\n" " if (obj kind == Error):\n" " obj string print." " else: ('=> ', obj, \"\\n\") join print.\n" " .\n" "."), exec - 1); potion_destroy(P); } return 0; }
int main(int argc, char *argv[]) { POTION_INIT_STACK(sp); int i, verbose = 0, exec = 1 + POTION_JIT; if (argc > 1) { for (i = 0; i < argc; i++) { if (strcmp(argv[i], "-I") == 0 || strcmp(argv[i], "--inspect") == 0) { verbose = 1; continue; } if (strcmp(argv[i], "-V") == 0 || strcmp(argv[i], "--verbose") == 0) { verbose = 2; continue; } if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0) { potion_cmd_version(); return 0; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { potion_cmd_usage(); return 0; } if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--stats") == 0) { potion_cmd_stats(sp); return 0; } if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--compile") == 0) { exec = 0; } if (strcmp(argv[i], "-B") == 0 || strcmp(argv[i], "--bytecode") == 0) { exec = 1; } if (strcmp(argv[i], "-X") == 0 || strcmp(argv[i], "--x86") == 0) { exec = 2; } } potion_cmd_compile(argv[argc-1], exec, verbose, sp); return 0; } Potion *P = potion_create(sp); potion_eval(P, potion_byte_str(P, "loop:\n" \ " '>> ' print\n" \ " code = read\n" \ " if (not code): break.\n" \ " if (code != ''):\n" \ " obj = code eval\n" \ " if (obj kind == Error):\n" \ " obj string print." \ " else: ('=> ', obj, \"\\n\") join print.\n" \ " .\n" ".")); potion_destroy(P); return 0; }