--Dxnq1zWXvFF0Q93v
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable


Hi Core,

I found a bug on ruby documentation http://www.ruby-doc.org/core/ in
Hash#delete

 *  Deletes and returns a key-value pair from <i>hsh</i> whose key is
 *  equal to <i>key</i>. If the key is not found, returns the
 *  <em>default value</em>. If the optional code block is given and
 the
 *  key is not found, pass in the key and return the result of
 *  <i>block</i>

I tested this featrure:

>> h = { "a" => 100, "b" => 200 }
=> {"a"=>100, "b"=>200}
>> h.default = "Go Fishing"
=> "Go Fishing"
>> h.delete("z")
=> nil

and the documentation says that "If the key is not found, returns the
default value" but really return nil. Attach the path.

I tried this on:

Linux Debian ETCH 2.6.22-1-k7 #1 SMP Mon Jul 23 14:02:09 UTC 2007 i686
GNU/Linux
ruby 1.8.6 (2008-03-03 patchlevel 114) [i486-linux]

Looking forward for this being applied.

Regards.

Gastóî Ramos
http://gastonramos.wordpress.com/
GNU/Linux Counter user #450312

--Dxnq1zWXvFF0Q93v
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="hash-doc.patch"

Index: hash.c
--- hash.c	(revision 16501)
+++ hash.c	(working copy)
@@ -31,7 +31,7 @@
     if (!RHASH(hash)->tbl) rb_raise(rb_eTypeError, "uninitialized Hash");
     if (OBJ_FROZEN(hash)) rb_error_frozen("hash");
     if (!OBJ_TAINTED(hash) && rb_safe_level() > )
-	rb_raise(rb_eSecurityError, "Insecure: can't modify hash");
+        rb_raise(rb_eSecurityError, "Insecure: can't modify hash");
 }
 
 VALUE
@@ -61,15 +61,15 @@
 
     if (a b) return 0;
     if (FIXNUM_P(a) && FIXNUM_P(b)) {
-	return a ! ;
+        return a ! ;
     }
     if (TYPE(a) T_STRING && RBASIC(a)->klass rb_cString &&
-	TYPE(b) T_STRING && RBASIC(b)->klass rb_cString) {
-	return rb_str_cmp(a, b);
+        TYPE(b) T_STRING && RBASIC(b)->klass rb_cString) {
+        return rb_str_cmp(a, b);
     }
     if (a Qundef || b Qundef) return -1;
     if (SYMBOL_P(a) && SYMBOL_P(b)) {
-	return a ! ;
+        return a ! ;
     }
 
     args[0]  ;
@@ -94,19 +94,19 @@
     switch (TYPE(a)) {
       case T_FIXNUM:
       case T_SYMBOL:
-	hnum  int)a;
-	break;
+        hnum  int)a;
+        break;
 
       case T_STRING:
-	hnum  b_str_hash(a);
-	break;
+        hnum  b_str_hash(a);
+        break;
 
       default:
-	hval  b_funcall(a, id_hash, 0);
-	if (!FIXNUM_P(hval)) {
-	    hval  b_funcall(hval, '%', 1, INT2FIX(536870923));
-	}
-	hnum  int)FIX2LONG(hval);
+        hval  b_funcall(a, id_hash, 0);
+        if (!FIXNUM_P(hval)) {
+            hval  b_funcall(hval, '%', 1, INT2FIX(536870923));
+        }
+        hnum  int)FIX2LONG(hval);
     }
     hnum << ;
     return RSHIFT(hnum, 1);
@@ -135,7 +135,7 @@
     if (key Qundef) return ST_CONTINUE;
     status  *arg->func)(key, value, arg->arg);
     if (status ST_CONTINUE) {
-	return ST_CHECK;
+        return ST_CHECK;
     }
     return status;
 }
@@ -152,7 +152,7 @@
     arg.func  st_foreach_func *)func;
     arg.arg  ;
     if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
-	rb_raise(rb_eRuntimeError, "hash modified during iteration");
+        rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
 }
 
@@ -176,16 +176,16 @@
     if (key Qundef) return ST_CONTINUE;
     status  *arg->func)(key, value, arg->arg);
     if (RHASH(arg->hash)->tbl ! bl) {
-	rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
+        rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
     }
     switch (status) {
       case ST_DELETE:
- 	st_delete_safe(tbl, (st_data_t*)&key, 0, Qundef);
-	FL_SET(arg->hash, HASH_DELETED);
+        st_delete_safe(tbl, (st_data_t*)&key, 0, Qundef);
+        FL_SET(arg->hash, HASH_DELETED);
       case ST_CONTINUE:
- 	break;
+        break;
       case ST_STOP:
- 	return ST_STOP;
+        return ST_STOP;
     }
     return ST_CHECK;
 }
@@ -197,10 +197,10 @@
     RHASH(hash)->iter_lev--;
 
     if (RHASH(hash)->iter_lev 0) {
-	if (FL_TEST(hash, HASH_DELETED)) {
-	    st_cleanup_safe(RHASH(hash)->tbl, Qundef);
-	    FL_UNSET(hash, HASH_DELETED);
-	}
+        if (FL_TEST(hash, HASH_DELETED)) {
+            st_cleanup_safe(RHASH(hash)->tbl, Qundef);
+            FL_UNSET(hash, HASH_DELETED);
+        }
     }
     return 0;
 }
@@ -210,7 +210,7 @@
     struct hash_foreach_arg *arg;
 {
     if (st_foreach(RHASH(arg->hash)->tbl, hash_foreach_iter, (st_data_t)arg)) {
- 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
+        rb_raise(rb_eRuntimeError, "hash modified during iteration");
     }
     return Qnil;
 }
@@ -306,15 +306,15 @@
 
     rb_hash_modify(hash);
     if (rb_block_given_p()) {
-	if (argc > 0) {
-	    rb_raise(rb_eArgError, "wrong number of arguments");
-	}
-	RHASH(hash)->ifnone  b_block_proc();
-	FL_SET(hash, HASH_PROC_DEFAULT);
+        if (argc > 0) {
+            rb_raise(rb_eArgError, "wrong number of arguments");
+        }
+        RHASH(hash)->ifnone  b_block_proc();
+        FL_SET(hash, HASH_PROC_DEFAULT);
     }
     else {
-	rb_scan_args(argc, argv, "01", &ifnone);
-	RHASH(hash)->ifnone  fnone;
+        rb_scan_args(argc, argv, "01", &ifnone);
+        RHASH(hash)->ifnone  fnone;
     }
 
     return hash;
@@ -343,30 +343,30 @@
     int i;
 
     if (argc 1) {
-	tmp  b_check_convert_type(argv[0], T_HASH, "Hash", "to_hash");
-	if (!NIL_P(tmp)) {
-	    hash  ash_alloc0(klass);
-	    RHASH(hash)->tbl  t_copy(RHASH(tmp)->tbl);
-	    return hash;
-	}
+        tmp  b_check_convert_type(argv[0], T_HASH, "Hash", "to_hash");
+        if (!NIL_P(tmp)) {
+            hash  ash_alloc0(klass);
+            RHASH(hash)->tbl  t_copy(RHASH(tmp)->tbl);
+            return hash;
+        }
 
-	tmp  b_check_array_type(argv[0]);
-	if (!NIL_P(tmp)) {
-	    long i;
+        tmp  b_check_array_type(argv[0]);
+        if (!NIL_P(tmp)) {
+            long i;
 
-	    hash  ash_alloc(klass);
-	    for (i  ; i < RARRAY_LEN(tmp); ++i) {
-		VALUE v  b_check_array_type(RARRAY_PTR(tmp)[i]);
-		
-		if (NIL_P(v)) continue;
-		if (RARRAY_LEN(v) < 1 || 2 < RARRAY_LEN(v)) continue;
-		rb_hash_aset(hash, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]);
-	    }
-	    return hash;
-	}
+            hash  ash_alloc(klass);
+            for (i  ; i < RARRAY_LEN(tmp); ++i) {
+                VALUE v  b_check_array_type(RARRAY_PTR(tmp)[i]);
+
+                if (NIL_P(v)) continue;
+                if (RARRAY_LEN(v) < 1 || 2 < RARRAY_LEN(v)) continue;
+                rb_hash_aset(hash, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]);
+            }
+            return hash;
+        }
     }
     if (argc % 2 ! ) {
-	rb_raise(rb_eArgError, "odd number of arguments for Hash");
+        rb_raise(rb_eArgError, "odd number of arguments for Hash");
     }
 
     hash  ash_alloc(klass);
@@ -449,7 +449,7 @@
     VALUE val;
 
     if (!st_lookup(RHASH(hash)->tbl, key, &val)) {
-	return rb_funcall(hash, id_default, 1, key);
+        return rb_funcall(hash, id_default, 1, key);
     }
     return val;
 }
@@ -461,7 +461,7 @@
     VALUE val;
 
     if (!st_lookup(RHASH(hash)->tbl, key, &val)) {
-	return Qnil; /* without Hash#default */
+        return Qnil; /* without Hash#default */
     }
     return val;
 }
@@ -509,14 +509,14 @@
 
     block_given  b_block_given_p();
     if (block_given && argc 2) {
-	rb_warn("block supersedes default value argument");
+        rb_warn("block supersedes default value argument");
     }
     if (!st_lookup(RHASH(hash)->tbl, key, &val)) {
-	if (block_given) return rb_yield(key);
-	if (argc 1) {
-	    rb_raise(rb_eIndexError, "key not found");
-	}
-	return if_none;
+        if (block_given) return rb_yield(key);
+        if (argc 1) {
+            rb_raise(rb_eIndexError, "key not found");
+        }
+        return if_none;
     }
     return val;
 }
@@ -552,8 +552,8 @@
 
     rb_scan_args(argc, argv, "01", &key);
     if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	if (argc 0) return Qnil;
-	return rb_funcall(RHASH(hash)->ifnone, id_call, 2, hash, key);
+        if (argc 0) return Qnil;
+        return rb_funcall(RHASH(hash)->ifnone, id_call, 2, hash, key);
     }
     return RHASH(hash)->ifnone;
 }
@@ -608,7 +608,7 @@
     VALUE hash;
 {
     if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return RHASH(hash)->ifnone;
+        return RHASH(hash)->ifnone;
     }
     return Qnil;
 }
@@ -619,8 +619,8 @@
     VALUE *args;
 {
     if (rb_equal(value, args[0])) {
-	args[1]  ey;
-	return ST_STOP;
+        args[1]  ey;
+        return ST_STOP;
     }
     return ST_CONTINUE;
 }
@@ -632,13 +632,13 @@
     st_data_t ktmp  st_data_t)key, val;
 
     if (RHASH(hash)->iter_lev > 0) {
-	if (st_delete_safe(RHASH(hash)->tbl, &ktmp, &val, Qundef)) {
-	    FL_SET(hash, HASH_DELETED);
-	    return (VALUE)val;
-	}
+        if (st_delete_safe(RHASH(hash)->tbl, &ktmp, &val, Qundef)) {
+            FL_SET(hash, HASH_DELETED);
+            return (VALUE)val;
+        }
     }
     else if (st_delete(RHASH(hash)->tbl, &ktmp, &val))
-	return (VALUE)val;
+        return (VALUE)val;
     return Qundef;
 }
 
@@ -687,11 +687,11 @@
     int i;
 
     rb_warn("Hash#%s is deprecated; use Hash#values_at",
-	    rb_id2name(rb_frame_last_func()));
+            rb_id2name(rb_frame_last_func()));
     indexes  b_ary_new2(argc);
     for (i i<argc; i++) {
-	RARRAY(indexes)->ptr[i]  b_hash_aref(hash, argv[i]);
-	RARRAY(indexes)->len++;
+        RARRAY(indexes)->ptr[i]  b_hash_aref(hash, argv[i]);
+        RARRAY(indexes)->len++;
     }
     return indexes;
 }
@@ -702,10 +702,9 @@
  *     hsh.delete(key) {| key | block }  value
  *
  *  Deletes and returns a key-value pair from <i>hsh</i> whose key is
- *  equal to <i>key</i>. If the key is not found, returns the
- *  <em>default value</em>. If the optional code block is given and the
- *  key is not found, pass in the key and return the result of
- *  <i>block</i>.
+ *  equal to <i>key</i>. If the key is not found, returns <code>nil</code>.
+ *  If the optional code block is given and the key is not found,
+ *  pass in the key and return the result of <i>block</i>.
  *
  *     h   "a" 100, "b" 200 }
  *     h.delete("a")                              #100
@@ -724,7 +723,7 @@
     val  b_hash_delete_key(hash, key);
     if (val ! undef) return val;
     if (rb_block_given_p()) {
-	return rb_yield(key);
+        return rb_yield(key);
     }
     return Qnil;
 }
@@ -779,26 +778,26 @@
     rb_hash_modify(hash);
     var.key  undef;
     if (RHASH(hash)->iter_lev > 0) {
-	rb_hash_foreach(hash, shift_i_safe, (st_data_t)&var);
-	if (var.key ! undef) {
-	    st_data_t key  ar.key;
-	    if (st_delete_safe(RHASH(hash)->tbl, &key, 0, Qundef)) {
-		FL_SET(hash, HASH_DELETED);
-	    }
-	}
+        rb_hash_foreach(hash, shift_i_safe, (st_data_t)&var);
+        if (var.key ! undef) {
+            st_data_t key  ar.key;
+            if (st_delete_safe(RHASH(hash)->tbl, &key, 0, Qundef)) {
+                FL_SET(hash, HASH_DELETED);
+            }
+        }
     }
     else {
-	rb_hash_foreach(hash, shift_i, (st_data_t)&var);
+        rb_hash_foreach(hash, shift_i, (st_data_t)&var);
     }
 
     if (var.key ! undef) {
-	return rb_assoc_new(var.key, var.val);
+        return rb_assoc_new(var.key, var.val);
     }
     else if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
-	return rb_funcall(RHASH(hash)->ifnone, id_call, 2, hash, Qnil);
+        return rb_funcall(RHASH(hash)->ifnone, id_call, 2, hash, Qnil);
     }
     else {
-	return RHASH(hash)->ifnone;
+        return RHASH(hash)->ifnone;
     }
 }
 
@@ -808,7 +807,7 @@
 {
     if (key Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value))) {
-	rb_hash_delete_key(hash, key);
+        rb_hash_delete_key(hash, key);
     }
     return ST_CONTINUE;
 }
@@ -879,7 +878,7 @@
 {
     if (key Qundef) return ST_CONTINUE;
     if (RTEST(rb_yield_values(2, key, value)))
-	rb_ary_push(result, rb_assoc_new(key, value));
+        rb_ary_push(result, rb_assoc_new(key, value));
     return ST_CONTINUE;
 }
 
@@ -904,7 +903,7 @@
     long i;
 
     for (i i<argc; i++) {
-	rb_ary_push(result, rb_hash_aref(hash, argv[i]));
+        rb_ary_push(result, rb_hash_aref(hash, argv[i]));
     }
     return result;
 }
@@ -958,7 +957,7 @@
 {
     rb_hash_modify(hash);
     if (RHASH(hash)->tbl->num_entries > 0) {
-	rb_hash_foreach(hash, clear_i, 0);
+        rb_hash_foreach(hash, clear_i, 0);
     }
 
     return hash;
@@ -988,10 +987,10 @@
 {
     rb_hash_modify(hash);
     if (TYPE(key) ! _STRING || st_lookup(RHASH(hash)->tbl, key, 0)) {
-	st_insert(RHASH(hash)->tbl, key, val);
+        st_insert(RHASH(hash)->tbl, key, val);
     }
     else {
-	st_add_direct(RHASH(hash)->tbl, rb_str_new4(key), val);
+        st_add_direct(RHASH(hash)->tbl, rb_str_new4(key), val);
     }
     return val;
 }
@@ -1001,7 +1000,7 @@
     VALUE key, val, hash;
 {
     if (key ! undef) {
-	rb_hash_aset(hash, key, val);
+        rb_hash_aset(hash, key, val);
     }
 
     return ST_CONTINUE;
@@ -1029,10 +1028,10 @@
     rb_hash_foreach(hash2, replace_i, hash);
     RHASH(hash)->ifnone  HASH(hash2)->ifnone;
     if (FL_TEST(hash2, HASH_PROC_DEFAULT)) {
-	FL_SET(hash, HASH_PROC_DEFAULT);
+        FL_SET(hash, HASH_PROC_DEFAULT);
     }
     else {
-	FL_UNSET(hash, HASH_PROC_DEFAULT);
+        FL_UNSET(hash, HASH_PROC_DEFAULT);
     }
 
     return hash;
@@ -1074,7 +1073,7 @@
     VALUE hash;
 {
     if (RHASH(hash)->tbl->num_entries 0)
-	return Qtrue;
+        return Qtrue;
     return Qfalse;
 }
 
@@ -1282,7 +1281,7 @@
 
     if (key Qundef) return ST_CONTINUE;
     if (RSTRING(str)->len > 1) {
-	rb_str_cat2(str, ", ");
+        rb_str_cat2(str, ", ");
     }
     str2  b_inspect(key);
     rb_str_buf_append(str, str2);
@@ -1321,7 +1320,7 @@
     VALUE hash;
 {
     if (RHASH(hash)->tbl 0 || RHASH(hash)->tbl->num_entries 0)
-	return rb_str_new2("{}");
+        return rb_str_new2("{}");
     if (rb_inspecting_p(hash)) return rb_str_new2("{...}");
     return rb_protect_inspect(inspect_hash, hash, 0);
 }
@@ -1455,7 +1454,7 @@
     VALUE key;
 {
     if (st_lookup(RHASH(hash)->tbl, key, 0)) {
-	return Qtrue;
+        return Qtrue;
     }
     return Qfalse;
 }
@@ -1466,8 +1465,8 @@
 {
     if (key Qundef) return ST_CONTINUE;
     if (rb_equal(value, data[1])) {
-	data[0]  true;
-	return ST_STOP;
+        data[0]  true;
+        return ST_STOP;
     }
     return ST_CONTINUE;
 }
@@ -1514,12 +1513,12 @@
 
     if (key Qundef) return ST_CONTINUE;
     if (!st_lookup(data->tbl, key, &val2)) {
-	data->result  false;
-	return ST_STOP;
+        data->result  false;
+        return ST_STOP;
     }
     if (!(data->eql ? rb_eql(val1, val2) : rb_equal(val1, val2))) {
-	data->result  false;
-	return ST_STOP;
+        data->result  false;
+        return ST_STOP;
     }
     return ST_CONTINUE;
 }
@@ -1544,23 +1543,23 @@
 static VALUE
 hash_equal(hash1, hash2, eql)
     VALUE hash1, hash2;
-    int eql;			/* compare default value if true */
+    int eql;                    /* compare default value if true */
 {
     struct equal_data data;
 
     if (hash1 hash2) return Qtrue;
     if (TYPE(hash2) ! _HASH) {
-	if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
-	    return Qfalse;
-	}
-	return rb_equal(hash2, hash1);
+        if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
+            return Qfalse;
+        }
+        return rb_equal(hash2, hash1);
     }
     if (RHASH(hash1)->tbl->num_entries ! HASH(hash2)->tbl->num_entries)
-	return Qfalse;
+        return Qfalse;
     if (eql) {
-	if (!(rb_equal(RHASH(hash1)->ifnone, RHASH(hash2)->ifnone) &&
-	      FL_TEST(hash1, HASH_PROC_DEFAULT) FL_TEST(hash2, HASH_PROC_DEFAULT)))
-	    return Qfalse;
+        if (!(rb_equal(RHASH(hash1)->ifnone, RHASH(hash2)->ifnone) &&
+              FL_TEST(hash1, HASH_PROC_DEFAULT) FL_TEST(hash2, HASH_PROC_DEFAULT)))
+            return Qfalse;
     }
 
     data.tbl  HASH(hash2)->tbl;
@@ -1617,7 +1616,7 @@
     int hval;
 
     if (recur) {
-	return LONG2FIX(0);
+        return LONG2FIX(0);
     }
     hval  HASH(hash)->tbl->num_entries;
     rb_hash_foreach(hash, hash_i, (st_data_t)&hval);
@@ -1704,7 +1703,7 @@
 {
     if (key Qundef) return ST_CONTINUE;
     if (rb_hash_has_key(hash, key)) {
-	value  b_yield_values(3, key, rb_hash_aref(hash, key), value);
+        value  b_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
     rb_hash_aset(hash, key, value);
     return ST_CONTINUE;
@@ -1731,10 +1730,10 @@
 {
     hash2  o_hash(hash2);
     if (rb_block_given_p()) {
-	rb_hash_foreach(hash2, rb_hash_update_block_i, hash1);
+        rb_hash_foreach(hash2, rb_hash_update_block_i, hash1);
     }
     else {
-	rb_hash_foreach(hash2, rb_hash_update_i, hash1);
+        rb_hash_foreach(hash2, rb_hash_update_i, hash1);
     }
     return hash1;
 }
@@ -1811,22 +1810,22 @@
     SafeStringValue(name);
     nam  STRING(name)->ptr;
     if (strlen(nam) ! STRING(name)->len) {
-	rb_raise(rb_eArgError, "bad environment variable name");
+        rb_raise(rb_eArgError, "bad environment variable name");
     }
     val  etenv(nam);
     if (val) {
-	VALUE value  nv_str_new2(val);
+        VALUE value  nv_str_new2(val);
 
-	ruby_setenv(nam, 0);
+        ruby_setenv(nam, 0);
 #ifdef ENV_IGNORECASE
-	if (strcasecmp(nam, PATH_ENV) 0)
+        if (strcasecmp(nam, PATH_ENV) 0)
 #else
-	if (strcmp(nam, PATH_ENV) 0)
+        if (strcmp(nam, PATH_ENV) 0)
 #endif
-	{
-	    path_tainted  ;
-	}
-	return value;
+        {
+            path_tainted  ;
+        }
+        return value;
     }
     return Qnil;
 }
@@ -1851,22 +1850,22 @@
     StringValue(name);
     nam  STRING(name)->ptr;
     if (strlen(nam) ! STRING(name)->len) {
-	rb_raise(rb_eArgError, "bad environment variable name");
+        rb_raise(rb_eArgError, "bad environment variable name");
     }
     env  etenv(nam);
     if (env) {
 #ifdef ENV_IGNORECASE
-	if (strcasecmp(nam, PATH_ENV) 0 && !rb_env_path_tainted())
+        if (strcasecmp(nam, PATH_ENV) 0 && !rb_env_path_tainted())
 #else
-	if (strcmp(nam, PATH_ENV) 0 && !rb_env_path_tainted())
+        if (strcmp(nam, PATH_ENV) 0 && !rb_env_path_tainted())
 #endif
-	{
-	    VALUE str  b_str_new2(env);
+        {
+            VALUE str  b_str_new2(env);
 
-	    rb_obj_freeze(str);
-	    return str;
-	}
-	return env_str_new2(env);
+            rb_obj_freeze(str);
+            return str;
+        }
+        return env_str_new2(env);
     }
     return Qnil;
 }
@@ -1883,27 +1882,27 @@
     rb_scan_args(argc, argv, "11", &key, &if_none);
     block_given  b_block_given_p();
     if (block_given && argc 2) {
-	rb_warn("block supersedes default value argument");
+        rb_warn("block supersedes default value argument");
     }
     StringValue(key);
     nam  STRING(key)->ptr;
     if (strlen(nam) ! STRING(key)->len) {
-	rb_raise(rb_eArgError, "bad environment variable name");
+        rb_raise(rb_eArgError, "bad environment variable name");
     }
     env  etenv(nam);
     if (!env) {
-	if (block_given) return rb_yield(key);
-	if (argc 1) {
-	    rb_raise(rb_eIndexError, "key not found");
-	}
-	return if_none;
+        if (block_given) return rb_yield(key);
+        if (argc 1) {
+            rb_raise(rb_eIndexError, "key not found");
+        }
+        return if_none;
     }
 #ifdef ENV_IGNORECASE
     if (strcasecmp(nam, PATH_ENV) 0 && !rb_env_path_tainted())
 #else
     if (strcmp(nam, PATH_ENV) 0 && !rb_env_path_tainted())
 #endif
-	return rb_str_new2(env);
+        return rb_str_new2(env);
     return env_str_new2(env);
 }
 
@@ -1918,7 +1917,7 @@
 rb_env_path_tainted()
 {
     if (path_tainted < 0) {
-	path_tainted_p(getenv(PATH_ENV));
+        path_tainted_p(getenv(PATH_ENV));
     }
     return path_tainted;
 }
@@ -1932,15 +1931,15 @@
 
     env  ET_ENVIRON(environ);
     for (i  ; env[i]; i++) {
-	if (
+        if (
 #ifdef ENV_IGNORECASE
-	    strncasecmp(env[i],nam,len) 0
+            strncasecmp(env[i],nam,len) 0
 #else
-	    memcmp(env[i],nam,len) 0
+            memcmp(env[i],nam,len) 0
 #endif
-	    && env[i][len] '
-	    break;			/* memcmp must come first to avoid */
-    }					/* potential SEGV's */
+            && env[i][len] '
+            break;                      /* memcmp must come first to avoid */
+    }                                   /* potential SEGV's */
     FREE_ENVIRON(environ);
     return i;
 }
@@ -1973,42 +1972,42 @@
 #undef setenv
 #undef unsetenv
     if (value)
-	setenv(name,value,1);
+        setenv(name,value,1);
     else
-	unsetenv(name);
+        unsetenv(name);
 #else  /* WIN32 */
     size_t len;
-    int iß×ix(name);		        /* where does it go? */
+    int iß×ix(name);                  /* where does it go? */
 
-    if (environ origenviron) {	/* need we copy environment? */
-	int j;
-	int max;
-	char **tmpenv;
+    if (environ origenviron) {       /* need we copy environment? */
+        int j;
+        int max;
+        char **tmpenv;
 
-	for (max  ; environ[max]; max++) ;
-	tmpenv  LLOC_N(char*, max+2);
-	for (j j<max; j++)		/* copy environment */
-	    tmpenv[j]  trdup(environ[j]);
-	tmpenv[max]  ;
-	environ  mpenv;		/* tell exec where it is now */
+        for (max  ; environ[max]; max++) ;
+        tmpenv  LLOC_N(char*, max+2);
+        for (j j<max; j++)           /* copy environment */
+            tmpenv[j]  trdup(environ[j]);
+        tmpenv[max]  ;
+        environ  mpenv;               /* tell exec where it is now */
     }
     if (environ[i]) {
-	char **envp  rigenviron;
-	while (*envp && *envp ! nviron[i]) envp++;
-	if (!*envp)
-	    free(environ[i]);
-	if (!value) {
-	    while (environ[i]) {
-		environ[i]  nviron[i+1];
-		i++;
-	    }
-	    return;
-	}
+        char **envp  rigenviron;
+        while (*envp && *envp ! nviron[i]) envp++;
+        if (!*envp)
+            free(environ[i]);
+        if (!value) {
+            while (environ[i]) {
+                environ[i]  nviron[i+1];
+                i++;
+            }
+            return;
+        }
     }
-    else {			/* does not exist yet */
-	if (!value) return;
-	REALLOC_N(environ, char*, i+2);	/* just expand it a bit */
-	environ[i+1]  ;	/* make sure it's null terminated */
+    else {                      /* does not exist yet */
+        if (!value) return;
+        REALLOC_N(environ, char*, i+2); /* just expand it a bit */
+        environ[i+1]  ;       /* make sure it's null terminated */
     }
     len  trlen(name) + strlen(value) + 2;
     environ[i]  LLOC_N(char, len);
@@ -2041,12 +2040,12 @@
     char *name, *value;
 
     if (rb_safe_level() > ) {
-	rb_raise(rb_eSecurityError, "can't change environment variable");
+        rb_raise(rb_eSecurityError, "can't change environment variable");
     }
 
     if (NIL_P(val)) {
-	env_delete(obj, nm);
-	return Qnil;
+        env_delete(obj, nm);
+        return Qnil;
     }
 
     StringValue(nm);
@@ -2054,9 +2053,9 @@
     name  STRING(nm)->ptr;
     value  STRING(val)->ptr;
     if (strlen(name) ! STRING(nm)->len)
-	rb_raise(rb_eArgError, "bad environment variable name");
+        rb_raise(rb_eArgError, "bad environment variable name");
     if (strlen(value) ! STRING(val)->len)
-	rb_raise(rb_eArgError, "bad environment variable value");
+        rb_raise(rb_eArgError, "bad environment variable value");
 
     ruby_setenv(name, value);
 #ifdef ENV_IGNORECASE
@@ -2064,14 +2063,14 @@
 #else
     if (strcmp(name, PATH_ENV) 0) {
 #endif
-	if (OBJ_TAINTED(val)) {
-	    /* already tainted, no check */
-	    path_tainted  ;
-	    return val;
-	}
-	else {
-	    path_tainted_p(value);
-	}
+        if (OBJ_TAINTED(val)) {
+            /* already tainted, no check */
+            path_tainted  ;
+            return val;
+        }
+        else {
+            path_tainted_p(value);
+        }
     }
     return val;
 }
@@ -2084,11 +2083,11 @@
 
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s) {
-	    rb_ary_push(ary, env_str_new(*env, s-*env));
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s) {
+            rb_ary_push(ary, env_str_new(*env, s-*env));
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
     return ary;
@@ -2103,7 +2102,7 @@
 
     RETURN_ENUMERATOR(ehash, 0, 0);
     for (i i<RARRAY(keys)->len; i++) {
-	rb_yield(RARRAY(keys)->ptr[i]);
+        rb_yield(RARRAY(keys)->ptr[i]);
     }
     return ehash;
 }
@@ -2116,11 +2115,11 @@
 
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s) {
-	    rb_ary_push(ary, env_str_new2(s+1));
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s) {
+            rb_ary_push(ary, env_str_new2(s+1));
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
     return ary;
@@ -2135,7 +2134,7 @@
 
     RETURN_ENUMERATOR(ehash, 0, 0);
     for (i i<RARRAY(values)->len; i++) {
-	rb_yield(RARRAY(values)->ptr[i]);
+        rb_yield(RARRAY(values)->ptr[i]);
     }
     return ehash;
 }
@@ -2151,22 +2150,22 @@
 
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s) {
-	    rb_ary_push(ary, env_str_new(*env, s-*env));
-	    rb_ary_push(ary, env_str_new2(s+1));
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s) {
+            rb_ary_push(ary, env_str_new(*env, s-*env));
+            rb_ary_push(ary, env_str_new2(s+1));
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
 
     for (i i<RARRAY(ary)->len; i+  {
-	if (values) {
-	    rb_yield_values(2, RARRAY(ary)->ptr[i], RARRAY(ary)->ptr[i+1]);
-	}
-	else {
-	    rb_yield(rb_assoc_new(RARRAY(ary)->ptr[i], RARRAY(ary)->ptr[i+1]));
-	}
+        if (values) {
+            rb_yield_values(2, RARRAY(ary)->ptr[i], RARRAY(ary)->ptr[i+1]);
+        }
+        else {
+            rb_yield(rb_assoc_new(RARRAY(ary)->ptr[i], RARRAY(ary)->ptr[i+1]));
+        }
     }
     return ehash;
 }
@@ -2199,14 +2198,14 @@
     keys  nv_keys();
 
     for (i i<RARRAY(keys)->len; i++) {
-	VALUE val  b_f_getenv(Qnil, RARRAY(keys)->ptr[i]);
-	if (!NIL_P(val)) {
-	    if (RTEST(rb_yield_values(2, RARRAY(keys)->ptr[i], val))) {
-		FL_UNSET(RARRAY(keys)->ptr[i], FL_TAINT);
-		env_delete(Qnil, RARRAY(keys)->ptr[i]);
-		del++;
-	    }
-	}
+        VALUE val  b_f_getenv(Qnil, RARRAY(keys)->ptr[i]);
+        if (!NIL_P(val)) {
+            if (RTEST(rb_yield_values(2, RARRAY(keys)->ptr[i], val))) {
+                FL_UNSET(RARRAY(keys)->ptr[i], FL_TAINT);
+                env_delete(Qnil, RARRAY(keys)->ptr[i]);
+                del++;
+            }
+        }
     }
     if (del 0) return Qnil;
     return envtbl;
@@ -2229,7 +2228,7 @@
     long i;
 
     for (i i<argc; i++) {
-	rb_ary_push(result, rb_f_getenv(Qnil, argv[i]));
+        rb_ary_push(result, rb_f_getenv(Qnil, argv[i]));
     }
     return result;
 }
@@ -2245,15 +2244,15 @@
     result  b_ary_new();
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s) {
-	    VALUE k  nv_str_new(*env, s-*env);
-	    VALUE v  nv_str_new2(s+1);
-	    if (RTEST(rb_yield_values(2, k, v))) {
-		rb_ary_push(result, rb_assoc_new(k, v));
-	    }
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s) {
+            VALUE k  nv_str_new(*env, s-*env);
+            VALUE v  nv_str_new2(s+1);
+            if (RTEST(rb_yield_values(2, k, v))) {
+                rb_ary_push(result, rb_assoc_new(k, v));
+            }
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
 
@@ -2270,10 +2269,10 @@
     keys  nv_keys();
 
     for (i i<RARRAY(keys)->len; i++) {
-	VALUE val  b_f_getenv(Qnil, RARRAY(keys)->ptr[i]);
-	if (!NIL_P(val)) {
-	    env_delete(Qnil, RARRAY(keys)->ptr[i]);
-	}
+        VALUE val  b_f_getenv(Qnil, RARRAY(keys)->ptr[i]);
+        if (!NIL_P(val)) {
+            env_delete(Qnil, RARRAY(keys)->ptr[i]);
+        }
     }
     return envtbl;
 }
@@ -2293,19 +2292,19 @@
 
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
+        char *s  trchr(*env, ';
 
-	if (env ! nviron) {
-	    rb_str_buf_cat2(str, ", ");
-	}
-	if (s) {
-	    rb_str_buf_cat2(str, "\"");
-	    rb_str_buf_cat(str, *env, s-*env);
-	    rb_str_buf_cat2(str, "\");
-	    i  b_inspect(rb_str_new2(s+1));
-	    rb_str_buf_append(str, i);
-	}
-	env++;
+        if (env ! nviron) {
+            rb_str_buf_cat2(str, ", ");
+        }
+        if (s) {
+            rb_str_buf_cat2(str, "\"");
+            rb_str_buf_cat(str, *env, s-*env);
+            rb_str_buf_cat2(str, "\");
+            i  b_inspect(rb_str_new2(s+1));
+            rb_str_buf_append(str, i);
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
     rb_str_buf_cat2(str, "}");
@@ -2322,12 +2321,12 @@
 
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s) {
-	    rb_ary_push(ary, rb_assoc_new(env_str_new(*env, s-*env),
-					  env_str_new2(s+1)));
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s) {
+            rb_ary_push(ary, rb_assoc_new(env_str_new(*env, s-*env),
+                                          env_str_new2(s+1)));
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
     return ary;
@@ -2347,7 +2346,7 @@
 
     env  ET_ENVIRON(environ);
     for(i env[i]; i++)
-	;
+        ;
     FREE_ENVIRON(environ);
     return INT2FIX(i);
 }
@@ -2359,8 +2358,8 @@
 
     env  ET_ENVIRON(environ);
     if (env[0] 0) {
-	FREE_ENVIRON(environ);
-	return Qtrue;
+        FREE_ENVIRON(environ);
+        return Qtrue;
     }
     FREE_ENVIRON(environ);
     return Qfalse;
@@ -2374,7 +2373,7 @@
 
     s  tringValuePtr(key);
     if (strlen(s) ! STRING(key)->len)
-	rb_raise(rb_eArgError, "bad environment variable name");
+        rb_raise(rb_eArgError, "bad environment variable name");
     if (getenv(s)) return Qtrue;
     return Qfalse;
 }
@@ -2388,15 +2387,15 @@
     if (TYPE(value) ! _STRING) return Qfalse;
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s++) {
-	    long len  trlen(s);
-	    if (RSTRING(value)->len len && strncmp(s, RSTRING(value)->ptr, len) 0) {
-		FREE_ENVIRON(environ);
-		return Qtrue;
-	    }
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s++) {
+            long len  trlen(s);
+            if (RSTRING(value)->len len && strncmp(s, RSTRING(value)->ptr, len) 0) {
+                FREE_ENVIRON(environ);
+                return Qtrue;
+            }
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
     return Qfalse;
@@ -2412,16 +2411,16 @@
     StringValue(value);
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s++) {
-	    long len  trlen(s);
-	    if (RSTRING(value)->len len && strncmp(s, RSTRING(value)->ptr, len) 0) {
-		str  nv_str_new(*env, s-*env-1);
-		FREE_ENVIRON(environ);
-		return str;
-	    }
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s++) {
+            long len  trlen(s);
+            if (RSTRING(value)->len len && strncmp(s, RSTRING(value)->ptr, len) 0) {
+                str  nv_str_new(*env, s-*env-1);
+                FREE_ENVIRON(environ);
+                return str;
+            }
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
     return Qnil;
@@ -2436,16 +2435,16 @@
     VALUE indexes  b_ary_new2(argc);
 
     rb_warn("ENV.%s is deprecated; use ENV.values_at",
-	    rb_id2name(rb_frame_last_func()));
+            rb_id2name(rb_frame_last_func()));
     for (ii<argc;i++) {
-	VALUE tmp  b_check_string_type(argv[i]);
-	if (NIL_P(tmp)) {
-	    RARRAY(indexes)->ptr[i]  nil;
-	}
-	else {
-	    RARRAY(indexes)->ptr[i]  nv_str_new2(getenv(RSTRING(tmp)->ptr));
-	}
-	RARRAY(indexes)->len  +1;
+        VALUE tmp  b_check_string_type(argv[i]);
+        if (NIL_P(tmp)) {
+            RARRAY(indexes)->ptr[i]  nil;
+        }
+        else {
+            RARRAY(indexes)->ptr[i]  nv_str_new2(getenv(RSTRING(tmp)->ptr));
+        }
+        RARRAY(indexes)->len  +1;
     }
 
     return indexes;
@@ -2459,12 +2458,12 @@
 
     env  ET_ENVIRON(environ);
     while (*env) {
-	char *s  trchr(*env, ';
-	if (s) {
-	    rb_hash_aset(hash, env_str_new(*env, s-*env),
-			       env_str_new2(s+1));
-	}
-	env++;
+        char *s  trchr(*env, ';
+        if (s) {
+            rb_hash_aset(hash, env_str_new(*env, s-*env),
+                               env_str_new2(s+1));
+        }
+        env++;
     }
     FREE_ENVIRON(environ);
     return hash;
@@ -2483,13 +2482,13 @@
 
     env  ET_ENVIRON(environ);
     if (*env) {
-	char *s  trchr(*env, ';
-	if (s) {
-	    VALUE key  nv_str_new(*env, s-*env);
-	    VALUE val  nv_str_new2(getenv(RSTRING(key)->ptr));
-	    env_delete(Qnil, key);
-	    return rb_assoc_new(key, val);
-	}
+        char *s  trchr(*env, ';
+        if (s) {
+            VALUE key  nv_str_new(*env, s-*env);
+            VALUE val  nv_str_new2(getenv(RSTRING(key)->ptr));
+            env_delete(Qnil, key);
+            return rb_assoc_new(key, val);
+        }
     }
     FREE_ENVIRON(environ);
     return Qnil;
@@ -2506,10 +2505,10 @@
     VALUE key, val, keys;
 {
     if (key ! undef) {
-	env_aset(Qnil, key, val);
-	if (rb_ary_includes(keys, key)) {
-	    rb_ary_delete(keys, key);
-	}
+        env_aset(Qnil, key, val);
+        if (rb_ary_includes(keys, key)) {
+            rb_ary_delete(keys, key);
+        }
     }
     return ST_CONTINUE;
 }
@@ -2526,7 +2525,7 @@
     rb_hash_foreach(hash, env_replace_i, keys);
 
     for (i i<RARRAY(keys)->len; i++) {
-	env_delete(env, RARRAY(keys)->ptr[i]);
+        env_delete(env, RARRAY(keys)->ptr[i]);
     }
     return env;
 }
@@ -2536,10 +2535,10 @@
     VALUE key, val;
 {
     if (key ! undef) {
-	if (rb_block_given_p()) {
-	    val  b_yield_values(3, key, rb_f_getenv(Qnil, key), val);
-	}
-	env_aset(Qnil, key, val);
+        if (rb_block_given_p()) {
+            val  b_yield_values(3, key, rb_f_getenv(Qnil, key), val);
+        }
+        env_aset(Qnil, key, val);
     }
     return ST_CONTINUE;
 }
@@ -2714,7 +2713,7 @@
 
     rb_define_global_const("ENV", envtbl);
 #else /* __MACOS__ */
-	envtbl  b_hash_s_new(0, NULL, rb_cHash);
+        envtbl  b_hash_s_new(0, NULL, rb_cHash);
     rb_define_global_const("ENV", envtbl);
 #endif  /* ifndef __MACOS__  environment variables nothing on MacOS. */
 }

--Dxnq1zWXvFF0Q93v--