Commit 8e1c842b authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

simpify mruby/mrbc using context

parent 737eaea0
...@@ -22,6 +22,8 @@ typedef struct mrbc_context { ...@@ -22,6 +22,8 @@ typedef struct mrbc_context {
char *filename; char *filename;
int lineno; int lineno;
int capture_errors:1; int capture_errors:1;
int dump_result:1;
int no_exec:1;
} mrbc_context; } mrbc_context;
mrbc_context* mrbc_context_new(mrb_state *mrb); mrbc_context* mrbc_context_new(mrb_state *mrb);
......
...@@ -4721,6 +4721,9 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt) ...@@ -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 void
mrb_parser_parse(parser_state *p, mrbc_context *c) mrb_parser_parse(parser_state *p, mrbc_context *c)
{ {
...@@ -4756,6 +4759,9 @@ 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); append(tree, p->tree);
} }
} }
if (c && c->dump_result) {
parser_dump(p->mrb, p->tree, 0);
}
} }
parser_state* parser_state*
...@@ -4862,7 +4868,7 @@ mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c) ...@@ -4862,7 +4868,7 @@ mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c)
} }
static mrb_value static mrb_value
load_exec(mrb_state *mrb, parser_state *p) load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
{ {
int n; int n;
...@@ -4885,13 +4891,17 @@ load_exec(mrb_state *mrb, parser_state *p) ...@@ -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)); mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13));
return mrb_nil_value(); 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)); return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
} }
mrb_value mrb_value
mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c) 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 mrb_value
...@@ -4903,7 +4913,7 @@ mrb_load_file(mrb_state *mrb, FILE *f) ...@@ -4903,7 +4913,7 @@ mrb_load_file(mrb_state *mrb, FILE *f)
mrb_value mrb_value
mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c) 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 mrb_value
...@@ -4915,7 +4925,7 @@ mrb_load_nstring(mrb_state *mrb, const char *s, int len) ...@@ -4915,7 +4925,7 @@ mrb_load_nstring(mrb_state *mrb, const char *s, int len)
mrb_value mrb_value
mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *c) 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 mrb_value
...@@ -4924,8 +4934,6 @@ mrb_load_string(mrb_state *mrb, const char *s) ...@@ -4924,8 +4934,6 @@ mrb_load_string(mrb_state *mrb, const char *s)
return mrb_load_string_cxt(mrb, s, NULL); return mrb_load_string_cxt(mrb, s, NULL);
} }
void parser_dump(mrb_state *mrb, node *tree, int offset);
static void static void
dump_prefix(int offset) dump_prefix(int offset)
{ {
......
...@@ -158,7 +158,8 @@ main(int argc, char **argv) ...@@ -158,7 +158,8 @@ main(int argc, char **argv)
mrb_state *mrb = mrb_open(); mrb_state *mrb = mrb_open();
int n = -1; int n = -1;
struct _args args; struct _args args;
struct mrb_parser_state *p; mrbc_context *c;
mrb_value result;
if (mrb == NULL) { if (mrb == NULL) {
fprintf(stderr, "Invalid mrb_state, exiting mrbc"); fprintf(stderr, "Invalid mrb_state, exiting mrbc");
...@@ -166,7 +167,6 @@ main(int argc, char **argv) ...@@ -166,7 +167,6 @@ main(int argc, char **argv)
} }
n = parse_args(mrb, argc, argv, &args); n = parse_args(mrb, argc, argv, &args);
if (n < 0 || args.rfp == NULL) { if (n < 0 || args.rfp == NULL) {
cleanup(&args); cleanup(&args);
usage(argv[0]); usage(argv[0]);
...@@ -174,22 +174,17 @@ main(int argc, char **argv) ...@@ -174,22 +174,17 @@ main(int argc, char **argv)
return n; return n;
} }
p = mrb_parse_file(mrb, args.rfp, NULL); c = mrbc_context_new(mrb);
if (!p || !p->tree || p->nerr) { 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); cleanup(&args);
mrb_close(mrb); mrb_close(mrb);
return -1; return -1;
} }
n = mrb_fixnum(result);
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);
if (n < 0 || args.check_syntax) { if (n < 0 || args.check_syntax) {
cleanup(&args); cleanup(&args);
mrb_close(mrb); mrb_close(mrb);
...@@ -215,4 +210,3 @@ void ...@@ -215,4 +210,3 @@ void
mrb_init_mrblib(mrb_state *mrb) mrb_init_mrblib(mrb_state *mrb)
{ {
} }
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
void mrb_show_version(mrb_state *); void mrb_show_version(mrb_state *);
void mrb_show_copyright(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 { struct _args {
FILE *rfp; FILE *rfp;
...@@ -149,7 +147,7 @@ main(int argc, char **argv) ...@@ -149,7 +147,7 @@ main(int argc, char **argv)
int n = -1; int n = -1;
int i; int i;
struct _args args; struct _args args;
struct mrb_parser_state *p; mrb_value ARGV;
if (mrb == NULL) { if (mrb == NULL) {
fprintf(stderr, "Invalid mrb_state, exiting mruby"); fprintf(stderr, "Invalid mrb_state, exiting mruby");
...@@ -163,50 +161,42 @@ main(int argc, char **argv) ...@@ -163,50 +161,42 @@ main(int argc, char **argv)
return n; 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) { if (args.mrbfile) {
n = mrb_load_irep(mrb, args.rfp); 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 { else {
mrbc_context *c = mrbc_context_new(mrb); 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) { if (args.cmdline) {
mrbc_filename(mrb, c, "-e"); mrbc_filename(mrb, c, "-e");
p = mrb_parse_string(mrb, (char*)args.cmdline, c); mrb_load_string_cxt(mrb, (char*)args.cmdline, c);
} }
else { else {
mrbc_filename(mrb, c, argv[1]); 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); mrbc_context_free(mrb, c);
if (!p || !p->tree || p->nerr) {
cleanup(mrb, &args);
return -1; 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); cleanup(mrb, &args);
return n > 0 ? 0 : 1; return n > 0 ? 0 : 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment