diff options
| -rw-r--r-- | include/mruby/dump.h | 1 | ||||
| -rw-r--r-- | include/mruby/irep.h | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 47 | ||||
| -rw-r--r-- | src/load.c | 22 |
4 files changed, 39 insertions, 34 deletions
diff --git a/include/mruby/dump.h b/include/mruby/dump.h index c21f225c0..02c5250c9 100644 --- a/include/mruby/dump.h +++ b/include/mruby/dump.h @@ -19,6 +19,7 @@ int mrb_dump_irep_binary(mrb_state*, mrb_irep*, int, FILE*); int mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep*, int, FILE *f, const char *initname); mrb_irep *mrb_read_irep_file(mrb_state*, FILE*); mrb_value mrb_load_irep_file(mrb_state*,FILE*); +mrb_value mrb_load_irep_file_cxt(mrb_state*, FILE*, mrbc_context*); #endif mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*); diff --git a/include/mruby/irep.h b/include/mruby/irep.h index 241e52a1b..1b978dd42 100644 --- a/include/mruby/irep.h +++ b/include/mruby/irep.h @@ -11,6 +11,8 @@ extern "C" { #endif +#include "mruby/compile.h" + enum irep_pool_type { IREP_TT_STRING, IREP_TT_FIXNUM, @@ -50,6 +52,7 @@ typedef struct mrb_irep { mrb_irep *mrb_add_irep(mrb_state *mrb); mrb_value mrb_load_irep(mrb_state*, const uint8_t*); +mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*); void mrb_irep_free(mrb_state*, struct mrb_irep*); void mrb_irep_incref(mrb_state*, struct mrb_irep*); void mrb_irep_decref(mrb_state*, struct mrb_irep*); diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index e286ce1f2..c2ba43002 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -178,6 +178,8 @@ main(int argc, char **argv) int i; struct _args args; mrb_value ARGV; + mrbc_context *c; + mrb_value v; if (mrb == NULL) { fputs("Invalid mrb_state, exiting mruby\n", stderr); @@ -197,30 +199,16 @@ main(int argc, char **argv) } mrb_define_global_const(mrb, "ARGV", ARGV); + c = mrbc_context_new(mrb); + if (args.verbose) + c->dump_result = 1; + if (args.check_syntax) + c->no_exec = 1; if (args.mrbfile) { - mrb_irep *irep = mrb_read_irep_file(mrb, args.rfp); - if (!irep) { - fprintf(stderr, "failed to load mrb file: %s\n", args.cmdline); - } - else if (!args.check_syntax) { - mrb_context_run(mrb, mrb_proc_new(mrb, irep), mrb_top_self(mrb), 0); - mrb_irep_decref(mrb, irep); - n = 0; - if (mrb->exc) { - mrb_print_error(mrb); - n = -1; - } - } + v = mrb_load_irep_file_cxt(mrb, args.rfp, c); } else { - mrbc_context *c = mrbc_context_new(mrb); mrb_sym zero_sym = mrb_intern2(mrb, "$0", 2); - mrb_value v; - - if (args.verbose) - c->dump_result = 1; - if (args.check_syntax) - c->no_exec = 1; if (args.rfp) { char *cmdline; @@ -234,17 +222,16 @@ main(int argc, char **argv) mrb_gv_set(mrb, zero_sym, mrb_str_new(mrb, "-e", 2)); v = mrb_load_string_cxt(mrb, args.cmdline, c); } - - mrbc_context_free(mrb, c); - if (mrb->exc) { - if (!mrb_undef_p(v)) { - mrb_print_error(mrb); - } - n = -1; - } - else if (args.check_syntax) { - printf("Syntax OK\n"); + } + mrbc_context_free(mrb, c); + if (mrb->exc) { + if (!mrb_undef_p(v)) { + mrb_print_error(mrb); } + n = -1; + } + else if (args.check_syntax) { + printf("Syntax OK\n"); } cleanup(mrb, &args); diff --git a/src/load.c b/src/load.c index 562a1a0d9..5b689368f 100644 --- a/src/load.c +++ b/src/load.c @@ -477,7 +477,7 @@ irep_error(mrb_state *mrb) } mrb_value -mrb_load_irep(mrb_state *mrb, const uint8_t *bin) +mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) { mrb_irep *irep = mrb_read_irep(mrb, bin); mrb_value val; @@ -488,11 +488,18 @@ mrb_load_irep(mrb_state *mrb, const uint8_t *bin) return mrb_nil_value(); } proc = mrb_proc_new(mrb, irep); - val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0); mrb_irep_decref(mrb, irep); + if (c && c->no_exec) return mrb_obj_value(proc); + val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0); return val; } +mrb_value +mrb_load_irep(mrb_state *mrb, const uint8_t *bin) +{ + return mrb_load_irep_cxt(mrb, bin, NULL); +} + #ifdef ENABLE_STDIO static int @@ -691,7 +698,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) } mrb_value -mrb_load_irep_file(mrb_state *mrb, FILE* fp) +mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c) { mrb_irep *irep = mrb_read_irep_file(mrb, fp); mrb_value val; @@ -702,8 +709,15 @@ mrb_load_irep_file(mrb_state *mrb, FILE* fp) return mrb_nil_value(); } proc = mrb_proc_new(mrb, irep); - val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0); mrb_irep_decref(mrb, irep); + if (c && c->no_exec) return mrb_obj_value(proc); + val = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0); return val; } + +mrb_value +mrb_load_irep_file(mrb_state *mrb, FILE* fp) +{ + return mrb_load_irep_file_cxt(mrb, fp, NULL); +} #endif /* ENABLE_STDIO */ |
