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 {
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);
......
......@@ -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)
{
......
......@@ -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)
{
}
......@@ -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;
......
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