diff options
Diffstat (limited to 'src/parse.y')
| -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) { |
