static int compile_rb2mrb(mrb_state *mrb0, const char *code, int code_len, const char *path, FILE* tmpfp) { mrb_state *mrb = mrb_open(); mrb_value result; mrbc_context *c; int ret = -1; int debuginfo = 1; mrb_irep *irep; c = mrbc_context_new(mrb); c->no_exec = 1; if (path != NULL) { mrbc_filename(mrb, c, path); } result = mrb_load_nstring_cxt(mrb, code, code_len, c); if (mrb_undef_p(result)) { mrbc_context_free(mrb, c); mrb_close(mrb); return MRB_DUMP_GENERAL_FAILURE; } irep = mrb_proc_ptr(result)->body.irep; ret = mrb_dump_irep_binary(mrb, irep, debuginfo, tmpfp); mrbc_context_free(mrb, c); mrb_close(mrb); return ret; }
static int strip(mrb_state *mrb, struct strip_args *args) { int i; for (i = args->argc_start; i < args->argc; ++i) { char *filename; FILE *rfile; mrb_irep *irep; FILE *wfile; int dump_result; filename = args->argv[i]; rfile = fopen(filename, "rb"); if (rfile == NULL) { fprintf(stderr, "can't open file for reading %s\n", filename); return EXIT_FAILURE; } irep = mrb_read_irep_file(mrb, rfile); fclose(rfile); if (irep == NULL) { fprintf(stderr, "can't read irep file %s\n", filename); return EXIT_FAILURE; } /* clear lv if --lvar is enabled */ if (args->lvar) { irep_remove_lv(mrb, irep); } wfile = fopen(filename, "wb"); if (wfile == NULL) { fprintf(stderr, "can't open file for writing %s\n", filename); mrb_irep_decref(mrb, irep); return EXIT_FAILURE; } /* debug flag must always be false */ dump_result = mrb_dump_irep_binary(mrb, irep, FALSE, wfile); fclose(wfile); mrb_irep_decref(mrb, irep); if (dump_result != MRB_DUMP_OK) { fprintf(stderr, "error occurred during dumping %s\n", filename); return EXIT_FAILURE; } } return EXIT_SUCCESS; }
int main(int argc, char **argv) { mrb_state *mrb = mrb_open(); int n = -1; struct _args args; mrbc_context *c; mrb_value result; if (mrb == NULL) { fputs("Invalid mrb_state, exiting mrbc\n", stderr); return EXIT_FAILURE; } n = parse_args(mrb, argc, argv, &args); if (n == EXIT_FAILURE || args.rfp == NULL) { cleanup(mrb, &args); usage(argv[0]); return n; } c = mrbc_context_new(mrb); if (args.verbose) c->dump_result = 1; c->no_exec = 1; c->filename = args.filename; result = mrb_load_file_cxt(mrb, args.rfp, c); if (mrb_undef_p(result) || mrb_fixnum(result) < 0) { cleanup(mrb, &args); return EXIT_FAILURE; } if (args.check_syntax) { puts("Syntax OK"); cleanup(mrb, &args); return EXIT_SUCCESS; } if (args.initname) { n = mrb_dump_irep_cfunc(mrb, n, args.debug_info, args.wfp, args.initname); if (n == MRB_DUMP_INVALID_ARGUMENT) { printf("%s: Invalid C language symbol name\n", args.initname); return EXIT_FAILURE; } } else { n = mrb_dump_irep_binary(mrb, n, args.debug_info, args.wfp); } cleanup(mrb, &args); return EXIT_SUCCESS; }
static int dump_file(mrb_state *mrb, FILE *wfp, const char *outfile, struct mrbc_args *args) { int n = MRB_DUMP_OK; if (args->initname) { n = mrb_dump_irep_cfunc(mrb, 0, args->debug_info, wfp, args->initname); if (n == MRB_DUMP_INVALID_ARGUMENT) { fprintf(stderr, "%s: invalid C language symbol name\n", args->initname); } } else { n = mrb_dump_irep_binary(mrb, 0, args->debug_info, wfp); } if (n != MRB_DUMP_OK) { fprintf(stderr, "%s: error in mrb dump (%s) %d\n", args->prog, outfile, n); } return n; }