mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
simpify mruby/mrbc using context
This commit is contained in:
@@ -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);
|
||||
|
||||
+14
-6
@@ -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)
|
||||
{
|
||||
|
||||
+9
-15
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
+31
-41
@@ -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);
|
||||
}
|
||||
else {
|
||||
mrbc_context *c = mrbc_context_new(mrb);
|
||||
if (args.cmdline) {
|
||||
mrbc_filename(mrb, c, "-e");
|
||||
p = mrb_parse_string(mrb, (char*)args.cmdline, c);
|
||||
}
|
||||
else {
|
||||
mrbc_filename(mrb, c, argv[1]);
|
||||
p = mrb_parse_file(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));
|
||||
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");
|
||||
mrb_load_string_cxt(mrb, (char*)args.cmdline, c);
|
||||
}
|
||||
else {
|
||||
mrbc_filename(mrb, c, argv[1]);
|
||||
mrb_load_file_cxt(mrb, args.rfp, c);
|
||||
}
|
||||
mrbc_context_free(mrb, c);
|
||||
return -1;
|
||||
}
|
||||
cleanup(mrb, &args);
|
||||
|
||||
return n > 0 ? 0 : 1;
|
||||
|
||||
Reference in New Issue
Block a user