Feature #8229 ยป 0001-hash.c-Hash-include-improve.patch
| hash.c | ||
|---|---|---|
| /* | ||
|  *  call-seq: | ||
|  *     hsh.has_key?(key)    -> true or false | ||
|  *     hsh.include?(key)    -> true or false | ||
|  *     hsh.key?(key)        -> true or false | ||
|  *     hsh.member?(key)     -> true or false | ||
|  * | ||
| ... | ... | |
|     return Qfalse; | ||
| } | ||
| /* | ||
|  *  call-seq: | ||
|  *     hsh.include?(key)        -> true or false | ||
|  *     hsh.include?(key, value) -> true or false | ||
|  * | ||
|  *  Returns +true+ if the given _key_ is present in _hsh_, | ||
|  *  and the value equals to the given _value_. | ||
|  * | ||
|  *     h = { "a" => 100, "b" => 200 } | ||
|  *     h.include?("a")       #=> true | ||
|  *     h.include?("z")       #=> false | ||
|  *     h.include?("a", 100)  #=> true | ||
|  *     h.include?("a", 101)  #=> false | ||
|  * | ||
|  */ | ||
| static VALUE | ||
| rb_hash_include_p(int argc, VALUE *argv, VALUE hash) | ||
| { | ||
|     st_data_t data; | ||
|     rb_check_arity(argc, 1, 2); | ||
|     if (!RHASH(hash)->ntbl) | ||
|         return Qfalse; | ||
|     if (st_lookup(RHASH(hash)->ntbl, (st_data_t)argv[0], &data)) { | ||
| 	if (argc < 2) return Qtrue; | ||
| 	return rb_equal((VALUE)data, argv[1]); | ||
|     } | ||
|     return Qfalse; | ||
| } | ||
| static int | ||
| rb_hash_search_value(VALUE key, VALUE value, VALUE arg) | ||
| { | ||
| ... | ... | |
| /* | ||
|  * call-seq: | ||
|  *   ENV.key?(name)     -> true or false | ||
|  *   ENV.include?(name) -> true or false | ||
|  *   ENV.has_key?(name) -> true or false | ||
|  *   ENV.member?(name)  -> true or false | ||
|  * | ||
| ... | ... | |
| /* | ||
|  * call-seq: | ||
|  *   ENV.include?(name)        -> true or false | ||
|  *   ENV.include?(name, value) -> true or false | ||
|  * | ||
|  * Returns +true+ if there is an environment variable with the given +name+, | ||
|  * and the value equals to the given _value_. | ||
|  */ | ||
| static VALUE | ||
| env_include_p(int argc, VALUE *argv, VALUE env) | ||
| { | ||
|     const char *s, *v, *e; | ||
|     VALUE key, value; | ||
|     rb_check_arity(argc, 1, 2); | ||
|     rb_secure(4); | ||
|     key = argv[0]; | ||
|     s = StringValuePtr(key); | ||
|     if (memchr(s, '\0', RSTRING_LEN(key))) | ||
| 	rb_raise(rb_eArgError, "bad environment variable name"); | ||
|     e = getenv(s); | ||
|     if (argc > 1) { | ||
| 	value = argv[1]; | ||
| 	if (NIL_P(value)) return e ? Qfalse : Qtrue; | ||
| 	v = StringValueCStr(value); | ||
| 	return (!e || strcmp(v, e)) ? Qfalse : Qtrue; | ||
|     } | ||
|     return e ? Qtrue : Qfalse; | ||
| } | ||
| /* | ||
|  * call-seq: | ||
|  *   ENV.assoc(name) -> Array or nil | ||
|  * | ||
|  * Returns an Array of the name and value of the environment variable with | ||
| ... | ... | |
|     rb_define_method(rb_cHash, "rassoc", rb_hash_rassoc, 1); | ||
|     rb_define_method(rb_cHash, "flatten", rb_hash_flatten, -1); | ||
|     rb_define_method(rb_cHash,"include?", rb_hash_has_key, 1); | ||
|     rb_define_method(rb_cHash,"include?", rb_hash_include_p, -1); | ||
|     rb_define_method(rb_cHash,"member?", rb_hash_has_key, 1); | ||
|     rb_define_method(rb_cHash,"has_key?", rb_hash_has_key, 1); | ||
|     rb_define_method(rb_cHash,"has_value?", rb_hash_has_value, 1); | ||
| ... | ... | |
|     rb_define_singleton_method(envtbl,"keys", env_keys, 0); | ||
|     rb_define_singleton_method(envtbl,"values", env_values, 0); | ||
|     rb_define_singleton_method(envtbl,"values_at", env_values_at, -1); | ||
|     rb_define_singleton_method(envtbl,"include?", env_has_key, 1); | ||
|     rb_define_singleton_method(envtbl,"include?", env_include_p, -1); | ||
|     rb_define_singleton_method(envtbl,"member?", env_has_key, 1); | ||
|     rb_define_singleton_method(envtbl,"has_key?", env_has_key, 1); | ||
|     rb_define_singleton_method(envtbl,"has_value?", env_has_value, 1); | ||
| test/ruby/test_env.rb | ||
|---|---|---|
|     end | ||
|   end | ||
|   def test_include_p | ||
|     feature8229 = '[ruby-core:54131] [Feature #8229]' | ||
|     assert_not_send([ENV, :include?, "test"]) | ||
|     ENV["test"] = "foo" | ||
|     assert_send([ENV, :include?, "test"]) | ||
|     assert_send([ENV, :include?, "test", "foo"], feature8229) | ||
|     assert_not_send([ENV, :include?, "test", "bar"], feature8229) | ||
|   end | ||
|   if /mswin|mingw/ =~ RUBY_PLATFORM | ||
|     def test_win32_blocksize | ||
|       len = 32767 - ENV.to_a.flatten.inject(0) {|r,e| r + e.size + 2 } | ||
| test/ruby/test_hash.rb | ||
|---|---|---|
|   end | ||
|   def test_include? | ||
|     feature8229 = '[ruby-core:54131] [Feature #8229]' | ||
|     assert_not_send([@cls[], :include?, 1]) | ||
|     assert_not_send([@cls[], :include?, nil]) | ||
|     assert_send([@h, :include?, nil]) | ||
|     assert_send([@h, :include?, 1]) | ||
|     assert_not_send([@h, :include?, 'gumby']) | ||
|     assert_send([@h, :include?, 1, 'one'], feature8229) | ||
|     assert_not_send([@h, :include?, 1, 'uno'], feature8229) | ||
|   end | ||
|   def test_key | ||