[前][次][番号順一覧][スレッド一覧]

ruby-changes:18811

From: nobu <ko1@a...>
Date: Fri, 11 Feb 2011 12:06:58 +0900 (JST)
Subject: [ruby-changes:18811] Ruby:r30836 (trunk): * ruby.c (add_gems, require_libraries, proc_options): add

nobu	2011-02-11 12:06:50 +0900 (Fri, 11 Feb 2011)

  New Revision: 30836

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30836

  Log:
    * ruby.c (add_gems, require_libraries, proc_options): add
      --require and --gem options.

  Modified files:
    trunk/ChangeLog
    trunk/ruby.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 30835)
+++ ChangeLog	(revision 30836)
@@ -1,3 +1,8 @@
+Fri Feb 11 12:06:48 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* ruby.c (add_gems, require_libraries, proc_options): add
+	  --require and --gem options.
+
 Fri Feb 11 12:03:24 2011  Nobuyoshi Nakada  <nobu@r...>
 
 	* configure.in (rubygems): add --disable-rubygems option.
Index: ruby.c
===================================================================
--- ruby.c	(revision 30835)
+++ ruby.c	(revision 30836)
@@ -480,6 +480,31 @@
     rb_ary_push(list, rb_obj_freeze(rb_str_new2(mod)));
 }
 
+static void
+add_gems(VALUE *req_list, const char *mod)
+{
+    VALUE list = *req_list;
+    VALUE gem, ver;
+    const char *v;
+
+    if (!list) {
+	*req_list = list = rb_ary_new();
+	RBASIC(list)->klass = 0;
+    }
+    for (v = mod; *v && !ISSPACE(*v) && !strchr("=!<>~", *v); ++v);
+    gem = rb_obj_freeze(rb_str_new(mod, v-mod));
+    if (*v) {
+	while (ISSPACE(*v)) ++v;
+    }
+    if (*v) {
+	gem = rb_assoc_new(gem, rb_obj_freeze(rb_str_new2(v)));
+    }
+    else {
+	gem = rb_ary_new4(1, &gem);
+    }
+    rb_ary_push(list, rb_obj_freeze(gem));
+}
+
 extern void Init_ext(void);
 extern VALUE rb_vm_top_self(void);
 
@@ -487,7 +512,8 @@
 require_libraries(VALUE *req_list)
 {
     VALUE list = *req_list;
-    ID require;
+    VALUE self = rb_vm_top_self();
+    ID require, gem;
     rb_thread_t *th = GET_THREAD();
     rb_block_t *prev_base_block = th->base_block;
     int prev_parse_in_eval = th->parse_in_eval;
@@ -496,9 +522,15 @@
 
     Init_ext();		/* should be called here for some reason :-( */
     CONST_ID(require, "require");
+    CONST_ID(gem, "gem");
     while (list && RARRAY_LEN(list) > 0) {
 	VALUE feature = rb_ary_shift(list);
-	rb_funcall2(rb_vm_top_self(), require, 1, &feature);
+	if (RB_TYPE_P(feature, T_ARRAY)) {
+	    rb_funcall2(self, gem, RARRAY_LENINT(feature), RARRAY_PTR(feature));
+	}
+	else {
+	    rb_funcall2(self, require, 1, &feature);
+	}
     }
     *req_list = 0;
 
@@ -1036,6 +1068,12 @@
 		set_source_encoding_once(opt, s, 0);
 	    }
 #endif
+	    else if (is_option_with_arg("require", Qfalse, Qtrue)) {
+		add_modules(&opt->req_list, s);
+	    }
+	    else if (is_option_with_arg("gem", Qfalse, Qtrue)) {
+		add_gems(&opt->req_list, s);
+	    }
 	    else if (strcmp("version", s) == 0) {
 		if (envopt) goto noenvopt_long;
 		opt->dump |= DUMP_BIT(version);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]