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

ruby-changes:41698

From: nobu <ko1@a...>
Date: Mon, 8 Feb 2016 10:30:16 +0900 (JST)
Subject: [ruby-changes:41698] nobu:r53772 (trunk): ruby.c: err ambiguous feature name [ci skip]

nobu	2016-02-08 10:30:22 +0900 (Mon, 08 Feb 2016)

  New Revision: 53772

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=53772

  Log:
    ruby.c: err ambiguous feature name  [ci skip]
    
    * ruby.c (feature_option): raise a runtime error if ambiguous
      feature name is given, in the future.  [Bug #12050]

  Modified files:
    trunk/ChangeLog
    trunk/ruby.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 53771)
+++ ChangeLog	(revision 53772)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Mon Feb  8 10:30:10 2016  Nobuyoshi Nakada  <nobu@r...>
+
+	* ruby.c (feature_option): raise a runtime error if ambiguous
+	  feature name is given, in the future.  [Bug #12050]
+
 Mon Feb  8 09:43:57 2016  Martin Duerst  <duerst@i...>
 
 	* common.mk: Removed enc/unicode/casefold.h from automatic build because
Index: ruby.c
===================================================================
--- ruby.c	(revision 53771)
+++ ruby.c	(revision 53772)
@@ -70,6 +70,7 @@ char *getenv(); https://github.com/ruby/ruby/blob/trunk/ruby.c#L70
     X(rubyopt) \
     X(frozen_string_literal) \
     /* END OF FEATURES */
+#define AMBIGUOUS_FEATURE_NAMES 0 /* no ambiguous feature names now */
 #define DEFINE_FEATURE(bit) feature_##bit,
 enum feature_flag_bits {
     EACH_FEATURES(DEFINE_FEATURE)
@@ -756,14 +757,35 @@ feature_option(const char *str, int len, https://github.com/ruby/ruby/blob/trunk/ruby.c#L757
 {
     unsigned int *argp = arg;
     unsigned int mask = ~0U;
+#if AMBIGUOUS_FEATURE_NAMES
+    unsigned int set = 0U;
+    int matched = 0;
+#define SET_FEATURE(bit) \
+    if (NAME_MATCH_P(#bit, str, len)) {set |= mask = FEATURE_BIT(bit); ++matched;}
+#else
 #define SET_FEATURE(bit) \
     if (NAME_MATCH_P(#bit, str, len)) {mask = FEATURE_BIT(bit); goto found;}
+#endif
     EACH_FEATURES(SET_FEATURE);
     if (NAME_MATCH_P("all", str, len)) {
       found:
 	*argp = (*argp & ~mask) | (mask & enable);
 	return;
     }
+#if AMBIGUOUS_FEATURE_NAMES
+    if (matched == 1) goto found;
+    if (matched > 1) {
+	VALUE mesg = rb_sprintf("ambiguous feature: `%.*s' (", len, str);
+#define ADD_FEATURE(bit) \
+	if (FEATURE_BIT(bit) & set) { \
+	    rb_str_cat_cstr(mesg, #bit); \
+	    if (--matched) rb_str_cat_cstr(mesg, ", "); \
+	}
+	EACH_FEATURES(ADD_FEATURE);
+	rb_str_cat_cstr(mesg, ")");
+	rb_exc_raise(rb_exc_new_str(rb_eRuntimeError, mesg));
+    }
+#endif
     rb_warn("unknown argument for --%s: `%.*s'",
 	    enable ? "enable" : "disable", len, str);
     rb_warn("features are [gems, did-you-mean, rubyopt, frozen-string-literal].");

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

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