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/