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/