diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-07-03 15:26:11 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-07-03 15:26:11 +0900 |
| commit | ce49d90dc82bc165880a800ae95dc327b729143f (patch) | |
| tree | d6f18ce188f307068e75950a79628ede4e26b54b /src | |
| parent | 97b1c57600b243e086114179cd61e3503beaa1e6 (diff) | |
| download | mruby-ce49d90dc82bc165880a800ae95dc327b729143f.tar.gz mruby-ce49d90dc82bc165880a800ae95dc327b729143f.zip | |
modify compiler API; replace mrb_compie_xxx with mrb_load_xxx() that combines compilatoin and execution
Diffstat (limited to 'src')
| -rw-r--r-- | src/parse.y | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/src/parse.y b/src/parse.y index ae53d2cf7..7f40534b9 100644 --- a/src/parse.y +++ b/src/parse.y @@ -20,6 +20,7 @@ #include "mruby.h" #include "mruby/compile.h" +#include "mruby/proc.h" #include "node.h" #include "st.h" @@ -4793,46 +4794,49 @@ mrb_parse_string(mrb_state *mrb, const char *s) return mrb_parse_nstring(mrb, s, strlen(s)); } -void parser_dump(mrb_state *mrb, node *tree, int offset); - -int -mrb_compile_file(mrb_state * mrb, FILE *f) +static mrb_value +load_exec(mrb_state *mrb, parser_state *p) { - parser_state *p; int n; - p = mrb_parse_file(mrb, f); - if (!p) return -1; - if (!p->tree) return -1; - if (p->nerr) return -1; + if (!p || !p->tree || p->nerr) { + char buf[256]; + + n = snprintf(buf, sizeof(buf), "line %d: %s\n", + p->error_buffer[0].lineno, p->error_buffer[0].message); + mrb_pool_close(p->pool); + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); + return mrb_nil_value(); + } n = mrb_generate_code(mrb, p->tree); mrb_pool_close(p->pool); - - return n; + if (n < 0) { + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13)); + return mrb_nil_value(); + } + return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); } -int -mrb_compile_nstring(mrb_state *mrb, const char *s, int len) +mrb_value +mrb_load_file(mrb_state *mrb, FILE *f) { - parser_state *p; - int n; - - p = mrb_parse_nstring(mrb, s, len); - if (!p) return -1; - if (!p->tree) return -1; - if (p->nerr) return -1; - n = mrb_generate_code(mrb, p->tree); - mrb_pool_close(p->pool); + return load_exec(mrb, mrb_parse_file(mrb, f)); +} - return n; +mrb_value +mrb_load_nstring(mrb_state *mrb, const char *s, int len) +{ + return load_exec(mrb, mrb_parse_nstring(mrb, s, len)); } -int -mrb_compile_string(mrb_state *mrb, const char *s) +mrb_value +mrb_load_string(mrb_state *mrb, const char *s) { - return mrb_compile_nstring(mrb, s, strlen(s)); + return load_exec(mrb, mrb_parse_nstring(mrb, s, strlen(s))); } +void parser_dump(mrb_state *mrb, node *tree, int offset); + static void dump_prefix(int offset) { |
