From d973a8ebc4d939243f3044abf35097a76b3a7221 Mon Sep 17 00:00:00 2001 From: Hiroshi Mimaki Date: Mon, 7 May 2018 17:54:02 +0900 Subject: Add `-r` option for `mruby` and `mirb`. --- mrbgems/mruby-bin-mruby/bintest/mruby.rb | 23 +++++++++++ mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 63 +++++++++++++++++++++++++---- 2 files changed, 78 insertions(+), 8 deletions(-) (limited to 'mrbgems/mruby-bin-mruby') diff --git a/mrbgems/mruby-bin-mruby/bintest/mruby.rb b/mrbgems/mruby-bin-mruby/bintest/mruby.rb index ca11ce2e7..a7fb63fa2 100644 --- a/mrbgems/mruby-bin-mruby/bintest/mruby.rb +++ b/mrbgems/mruby-bin-mruby/bintest/mruby.rb @@ -65,3 +65,26 @@ assert('mruby -d option') do o = `#{cmd('mruby')} -d -e #{shellquote('p $DEBUG')}` assert_equal "true\n", o end + +assert('mruby -r option') do + lib = Tempfile.new('lib.rb') + lib.write <cmdline) { - size_t buflen; - char *buf; - - buflen = strlen(item) + 1; - buf = (char *)mrb_malloc(mrb, buflen); - memcpy(buf, item, buflen); - args->cmdline = buf; + args->cmdline = dup_arg_item(mrb, item); } else { size_t cmdlinelen; @@ -117,6 +123,23 @@ append_cmdline: return EXIT_SUCCESS; } break; + case 'r': + if (!item[0]) { + if (argc <= 1) { + printf("%s: No library specified for -r\n", *origargv); + return EXIT_FAILURE; + } + argc--; argv++; + item = argv[0]; + } + if (args->libc == 0) { + args->libv = (char**)mrb_malloc(mrb, sizeof(char*)); + } + else { + args->libv = (char**)mrb_realloc(mrb, args->libv, sizeof(char*) * (args->libc + 1)); + } + args->libv[args->libc++] = dup_arg_item(mrb, item); + break; case 'v': if (!args->verbose) mrb_show_version(mrb); args->verbose = TRUE; @@ -167,6 +190,12 @@ cleanup(mrb_state *mrb, struct _args *args) if (!args->fname) mrb_free(mrb, args->cmdline); mrb_free(mrb, args->argv); + if (args->libc) { + while (args->libc--) { + mrb_free(mrb, args->libv[args->libc]); + } + mrb_free(mrb, args->libv); + } mrb_close(mrb); } @@ -181,6 +210,7 @@ main(int argc, char **argv) mrbc_context *c; mrb_value v; mrb_sym zero_sym; + FILE *lfp; if (mrb == NULL) { fputs("Invalid mrb_state, exiting mruby\n", stderr); @@ -225,6 +255,23 @@ main(int argc, char **argv) mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e")); } + /* Load libraries */ + for (i = 0; i < args.libc; i++) { + lfp = fopen(args.libv[i], args.mrbfile ? "rb" : "r"); + if (lfp == NULL) { + printf("Cannot open library file. (%s)\n", args.libv[i]); + cleanup(mrb, &args); + return EXIT_FAILURE; + } + if (args.mrbfile) { + v = mrb_load_irep_file_cxt(mrb, lfp, c); + } + else { + v = mrb_load_file_cxt(mrb, lfp, c); + } + fclose(lfp); + } + /* Load program */ if (args.mrbfile) { v = mrb_load_irep_file_cxt(mrb, args.rfp, c); -- cgit v1.2.3