diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-07-13 15:36:43 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-07-13 15:36:43 +0900 |
| commit | 8e1c842b7e17ecb58e25e48e0cac253bceb00f14 (patch) | |
| tree | 9fff744ddb21143e41a1b7af6346fc7e874f4c13 | |
| parent | 737eaea038af56794b8fdb5a66bb4138dbd446f6 (diff) | |
| download | mruby-8e1c842b7e17ecb58e25e48e0cac253bceb00f14.tar.gz mruby-8e1c842b7e17ecb58e25e48e0cac253bceb00f14.zip | |
simpify mruby/mrbc using context
| -rw-r--r-- | include/mruby/compile.h | 2 | ||||
| -rw-r--r-- | src/parse.y | 20 | ||||
| -rw-r--r-- | tools/mrbc/mrbc.c | 24 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 58 |
4 files changed, 49 insertions, 55 deletions
diff --git a/include/mruby/compile.h b/include/mruby/compile.h index e3361feed..4dd369adb 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -22,6 +22,8 @@ typedef struct mrbc_context { char *filename; int lineno; int capture_errors:1; + int dump_result:1; + int no_exec:1; } mrbc_context; mrbc_context* mrbc_context_new(mrb_state *mrb); diff --git a/src/parse.y b/src/parse.y index 8d626b5d8..5a22b3883 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4721,6 +4721,9 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt) } } +void codedump_all(mrb_state*, int); +void parser_dump(mrb_state *mrb, node *tree, int offset); + void mrb_parser_parse(parser_state *p, mrbc_context *c) { @@ -4756,6 +4759,9 @@ mrb_parser_parse(parser_state *p, mrbc_context *c) append(tree, p->tree); } } + if (c && c->dump_result) { + parser_dump(p->mrb, p->tree, 0); + } } parser_state* @@ -4862,7 +4868,7 @@ mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c) } static mrb_value -load_exec(mrb_state *mrb, parser_state *p) +load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) { int n; @@ -4885,13 +4891,17 @@ load_exec(mrb_state *mrb, parser_state *p) mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13)); return mrb_nil_value(); } + if (c) { + if (c->dump_result) codedump_all(mrb, n); + if (c->no_exec) return mrb_fixnum_value(n); + } return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); } mrb_value mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c) { - return load_exec(mrb, mrb_parse_file(mrb, f, c)); + return load_exec(mrb, mrb_parse_file(mrb, f, c), c); } mrb_value @@ -4903,7 +4913,7 @@ mrb_load_file(mrb_state *mrb, FILE *f) mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c) { - return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c)); + return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c); } mrb_value @@ -4915,7 +4925,7 @@ mrb_load_nstring(mrb_state *mrb, const char *s, int len) mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *c) { - return load_exec(mrb, mrb_parse_nstring(mrb, s, strlen(s), c)); + return mrb_load_nstring_cxt(mrb, s, strlen(s), c); } mrb_value @@ -4924,8 +4934,6 @@ mrb_load_string(mrb_state *mrb, const char *s) return mrb_load_string_cxt(mrb, s, NULL); } -void parser_dump(mrb_state *mrb, node *tree, int offset); - static void dump_prefix(int offset) { diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 8da37832a..a70353d63 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -158,7 +158,8 @@ main(int argc, char **argv) mrb_state *mrb = mrb_open(); int n = -1; struct _args args; - struct mrb_parser_state *p; + mrbc_context *c; + mrb_value result; if (mrb == NULL) { fprintf(stderr, "Invalid mrb_state, exiting mrbc"); @@ -166,7 +167,6 @@ main(int argc, char **argv) } n = parse_args(mrb, argc, argv, &args); - if (n < 0 || args.rfp == NULL) { cleanup(&args); usage(argv[0]); @@ -174,22 +174,17 @@ main(int argc, char **argv) return n; } - p = mrb_parse_file(mrb, args.rfp, NULL); - if (!p || !p->tree || p->nerr) { + c = mrbc_context_new(mrb); + if (args.verbose) + c->dump_result = 1; + c->no_exec = 1; + result = mrb_load_file_cxt(mrb, args.rfp, c); + if (mrb_nil_p(result)) { cleanup(&args); mrb_close(mrb); return -1; } - - if (args.verbose) - parser_dump(mrb, p->tree, 0); - - n = mrb_generate_code(mrb, p->tree); - mrb_parser_free(p); - - if (args.verbose) - codedump_all(mrb, n); - + n = mrb_fixnum(result); if (n < 0 || args.check_syntax) { cleanup(&args); mrb_close(mrb); @@ -215,4 +210,3 @@ void mrb_init_mrblib(mrb_state *mrb) { } - diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 12cdc86e9..65eae57e1 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -9,8 +9,6 @@ void mrb_show_version(mrb_state *); void mrb_show_copyright(mrb_state *); -void parser_dump(mrb_state*, struct mrb_ast_node*, int); -void codedump_all(mrb_state*, int); struct _args { FILE *rfp; @@ -149,7 +147,7 @@ main(int argc, char **argv) int n = -1; int i; struct _args args; - struct mrb_parser_state *p; + mrb_value ARGV; if (mrb == NULL) { fprintf(stderr, "Invalid mrb_state, exiting mruby"); @@ -163,50 +161,42 @@ main(int argc, char **argv) return n; } + ARGV = mrb_ary_new(mrb); + for (i = 0; i < args.argc; i++) { + mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); + } + mrb_define_global_const(mrb, "ARGV", ARGV); + if (args.mrbfile) { n = mrb_load_irep(mrb, args.rfp); + if (n >= 0) { + if (!args.check_syntax) { + mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + } + } } else { mrbc_context *c = mrbc_context_new(mrb); + + if (args.verbose) + c->dump_result = 1; + if (args.check_syntax) + c->no_exec = 1; + if (args.cmdline) { mrbc_filename(mrb, c, "-e"); - p = mrb_parse_string(mrb, (char*)args.cmdline, c); - } + mrb_load_string_cxt(mrb, (char*)args.cmdline, c); + } else { mrbc_filename(mrb, c, argv[1]); - p = mrb_parse_file(mrb, args.rfp, c); + mrb_load_file_cxt(mrb, args.rfp, c); } mrbc_context_free(mrb, c); - if (!p || !p->tree || p->nerr) { - cleanup(mrb, &args); return -1; - } - - if (args.verbose) - parser_dump(mrb, p->tree, 0); - - n = mrb_generate_code(mrb, p->tree); - mrb_parser_free(p); - } - - if (n >= 0) { - mrb_value ARGV = mrb_ary_new(mrb); - for (i = 0; i < args.argc; i++) { - mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); - } - mrb_define_global_const(mrb, "ARGV", ARGV); - - if (args.verbose) - codedump_all(mrb, n); - - if (!args.check_syntax) { - mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); - if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); - } - } } - cleanup(mrb, &args); return n > 0 ? 0 : 1; |
