summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-bin-mruby
diff options
context:
space:
mode:
authorHiroshi Mimaki <[email protected]>2018-05-07 17:54:02 +0900
committerHiroshi Mimaki <[email protected]>2018-05-07 18:17:50 +0900
commitd973a8ebc4d939243f3044abf35097a76b3a7221 (patch)
tree590c7d5f615525101e2b493eb8ba15e9a3a7220f /mrbgems/mruby-bin-mruby
parentfc247449e29b26f07a9c6ba84c6dfaf0c6369f46 (diff)
downloadmruby-d973a8ebc4d939243f3044abf35097a76b3a7221.tar.gz
mruby-d973a8ebc4d939243f3044abf35097a76b3a7221.zip
Add `-r` option for `mruby` and `mirb`.
Diffstat (limited to 'mrbgems/mruby-bin-mruby')
-rw-r--r--mrbgems/mruby-bin-mruby/bintest/mruby.rb23
-rw-r--r--mrbgems/mruby-bin-mruby/tools/mruby/mruby.c63
2 files changed, 78 insertions, 8 deletions
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 <<EOS
+class Hoge
+ def hoge
+ :hoge
+ end
+end
+EOS
+ lib.flush
+
+ script = Tempfile.new('test.rb')
+ script.write <<EOS
+print Hoge.new.hoge
+EOS
+ script.flush
+ assert_equal 'hoge', `#{cmd('mruby')} -r #{lib.path} #{script.path}`
+ assert_equal 0, $?.exitstatus
+
+ assert_equal 'hogeClass', `#{cmd('mruby')} -r #{lib.path} -r #{script.path} -e #{shellquote('print Hoge.class')}`
+ assert_equal 0, $?.exitstatus
+end
diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
index 0db2c3f37..88824ce55 100644
--- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
+++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
@@ -30,6 +30,8 @@ struct _args {
mrb_bool debug : 1;
int argc;
char** argv;
+ int libc;
+ char **libv;
};
static void
@@ -39,8 +41,9 @@ usage(const char *name)
"switches:",
"-b load and execute RiteBinary (mrb) file",
"-c check syntax only",
- "-d Set debugging flags (set $DEBUG to true)"
+ "-d set debugging flags (set $DEBUG to true)"
"-e 'command' one line of script",
+ "-r library load the library before executing your script",
"-v print version number, then run in verbose mode",
"--verbose run in verbose mode",
"--version print the version",
@@ -54,6 +57,15 @@ usage(const char *name)
printf(" %s\n", *p++);
}
+static char *
+dup_arg_item(mrb_state *mrb, const char *item)
+{
+ size_t buflen = strlen(item) + 1;
+ char *buf = mrb_malloc(mrb, buflen);
+ memcpy(buf, item, buflen);
+ return buf;
+}
+
static int
parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
{
@@ -92,13 +104,7 @@ 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;
-
- 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);