diff options
Diffstat (limited to 'mrbgems/mruby-bin-mruby')
| -rw-r--r-- | mrbgems/mruby-bin-mruby/bintest/mruby.rb | 16 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mruby/mrbgem.rake | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 90 |
3 files changed, 59 insertions, 48 deletions
diff --git a/mrbgems/mruby-bin-mruby/bintest/mruby.rb b/mrbgems/mruby-bin-mruby/bintest/mruby.rb new file mode 100644 index 000000000..22872c389 --- /dev/null +++ b/mrbgems/mruby-bin-mruby/bintest/mruby.rb @@ -0,0 +1,16 @@ +require 'tempfile' + +assert('regression for #1564') do + o = `bin/mruby -e '<<' 2>&1` + assert_equal o, "-e:1:2: syntax error, unexpected tLSHFT\n" + o = `bin/mruby -e '<<-' 2>&1` + assert_equal o, "-e:1:3: syntax error, unexpected tLSHFT\n" +end + +assert('regression for #1572') do + script, bin = Tempfile.new('test.rb'), Tempfile.new('test.mrb') + system "echo 'p \"ok\"' > #{script.path}" + system "bin/mrbc -g -o #{bin.path} #{script.path}" + o = `bin/mruby -b #{bin.path}`.strip + assert_equal o, '"ok"' +end diff --git a/mrbgems/mruby-bin-mruby/mrbgem.rake b/mrbgems/mruby-bin-mruby/mrbgem.rake index 08ba89855..4e2f6a142 100644 --- a/mrbgems/mruby-bin-mruby/mrbgem.rake +++ b/mrbgems/mruby-bin-mruby/mrbgem.rake @@ -1,5 +1,6 @@ MRuby::Gem::Specification.new('mruby-bin-mruby') do |spec| spec.license = 'MIT' spec.author = 'mruby developers' + spec.summary = 'mruby command' spec.bins = %w(mruby) end diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index 97b55687f..01e38ef84 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -1,13 +1,11 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> #include "mruby.h" -#include "mruby/proc.h" #include "mruby/array.h" -#include "mruby/string.h" #include "mruby/compile.h" #include "mruby/dump.h" #include "mruby/variable.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> #ifndef ENABLE_STDIO static void @@ -77,10 +75,10 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) item = argv[0] + 1; switch (*item++) { case 'b': - args->mrbfile = 1; + args->mrbfile = TRUE; break; case 'c': - args->check_syntax = 1; + args->check_syntax = TRUE; break; case 'e': if (item[0]) { @@ -91,16 +89,24 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) item = argv[0]; append_cmdline: if (!args->cmdline) { + size_t buflen; char *buf; - buf = (char *)mrb_malloc(mrb, strlen(item)+1); - strcpy(buf, item); + buflen = strlen(item) + 1; + buf = (char *)mrb_malloc(mrb, buflen); + memcpy(buf, item, buflen); args->cmdline = buf; } else { - args->cmdline = (char *)mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(item)+2); - strcat(args->cmdline, "\n"); - strcat(args->cmdline, item); + size_t cmdlinelen; + size_t itemlen; + + cmdlinelen = strlen(args->cmdline); + itemlen = strlen(item); + args->cmdline = + (char *)mrb_realloc(mrb, args->cmdline, cmdlinelen + itemlen + 2); + args->cmdline[cmdlinelen] = '\n'; + memcpy(args->cmdline + cmdlinelen + 1, item, itemlen + 1); } } else { @@ -110,7 +116,7 @@ append_cmdline: break; case 'v': if (!args->verbose) mrb_show_version(mrb); - args->verbose = 1; + args->verbose = TRUE; break; case '-': if (strcmp((*argv) + 2, "version") == 0) { @@ -118,7 +124,7 @@ append_cmdline: exit(EXIT_SUCCESS); } else if (strcmp((*argv) + 2, "verbose") == 0) { - args->verbose = 1; + args->verbose = TRUE; break; } else if (strcmp((*argv) + 2, "copyright") == 0) { @@ -136,9 +142,9 @@ append_cmdline: args->rfp = fopen(argv[0], args->mrbfile ? "rb" : "r"); if (args->rfp == NULL) { printf("%s: Cannot open program file. (%s)\n", *origargv, *argv); - return 0; + return EXIT_FAILURE; } - args->fname = 1; + args->fname = TRUE; args->cmdline = argv[0]; argc--; argv++; } @@ -170,6 +176,8 @@ main(int argc, char **argv) int i; struct _args args; mrb_value ARGV; + mrbc_context *c; + mrb_value v; if (mrb == NULL) { fputs("Invalid mrb_state, exiting mruby\n", stderr); @@ -185,33 +193,20 @@ main(int argc, char **argv) ARGV = mrb_ary_new_capa(mrb, args.argc); for (i = 0; i < args.argc; i++) { - mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); + mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, args.argv[i])); } mrb_define_global_const(mrb, "ARGV", ARGV); + c = mrbc_context_new(mrb); + if (args.verbose) + c->dump_result = TRUE; + if (args.check_syntax) + c->no_exec = TRUE; if (args.mrbfile) { - n = mrb_read_irep_file(mrb, args.rfp); - if (n < 0) { - fprintf(stderr, "failed to load mrb file: %s\n", args.cmdline); - } - else if (!args.check_syntax) { - mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); - n = 0; - if (mrb->exc) { - mrb_print_error(mrb); - n = -1; - } - } + v = mrb_load_irep_file_cxt(mrb, args.rfp, c); } else { - mrbc_context *c = mrbc_context_new(mrb); - mrb_sym zero_sym = mrb_intern2(mrb, "$0", 2); - mrb_value v; - - if (args.verbose) - c->dump_result = 1; - if (args.check_syntax) - c->no_exec = 1; + mrb_sym zero_sym = mrb_intern_lit(mrb, "$0"); if (args.rfp) { char *cmdline; @@ -222,20 +217,19 @@ main(int argc, char **argv) } else { mrbc_filename(mrb, c, "-e"); - mrb_gv_set(mrb, zero_sym, mrb_str_new(mrb, "-e", 2)); + mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e")); v = mrb_load_string_cxt(mrb, args.cmdline, c); } - - mrbc_context_free(mrb, c); - if (mrb->exc) { - if (!mrb_undef_p(v)) { - mrb_print_error(mrb); - } - n = -1; - } - else if (args.check_syntax) { - printf("Syntax OK\n"); + } + mrbc_context_free(mrb, c); + if (mrb->exc) { + if (!mrb_undef_p(v)) { + mrb_print_error(mrb); } + n = -1; + } + else if (args.check_syntax) { + printf("Syntax OK\n"); } cleanup(mrb, &args); |
