Index: hash.c =================================================================== --- hash.c (revision 18504) +++ hash.c (working copy) @@ -613,6 +613,33 @@ return Qnil; } +extern VALUE rb_obj_is_proc(VALUE); +/* + * call-seq: + * hsh.default_proc = proc_obj => proc_obj + * + * Sets the default proc to be executed on each key lookup. + * + * h.default_proc = proc do |hash, key| + * hash[key] = key + key + * end + * h[2] #=> 4 + * h["cat"] #=> "catcat" + */ + +static VALUE +rb_hash_set_default_proc(hash, proc) + VALUE hash, proc; +{ + rb_hash_modify(hash); + if (!rb_obj_is_proc(proc)) { + rb_raise(rb_eTypeError, "default_proc must be Proc"); + } + RHASH(hash)->ifnone = proc; + FL_SET(hash, HASH_PROC_DEFAULT); + return proc; +} + static int index_i(key, value, args) VALUE key, value; @@ -2666,6 +2693,7 @@ rb_define_method(rb_cHash,"default", rb_hash_default, -1); rb_define_method(rb_cHash,"default=", rb_hash_set_default, 1); rb_define_method(rb_cHash,"default_proc", rb_hash_default_proc, 0); + rb_define_method(rb_cHash,"default_proc=", rb_hash_set_default_proc, 1); rb_define_method(rb_cHash,"index", rb_hash_index, 1); rb_define_method(rb_cHash,"indexes", rb_hash_indexes, -1); rb_define_method(rb_cHash,"indices", rb_hash_indexes, -1); Index: eval.c =================================================================== --- eval.c (revision 18504) +++ eval.c (working copy) @@ -2553,7 +2553,7 @@ static void blk_free(); -static VALUE +VALUE rb_obj_is_proc(proc) VALUE proc; {