Feature #16175 » freeze-true.patch
| object.c | ||
|---|---|---|
|     if (!NIL_P(opt)) { | ||
| 	rb_get_kwargs(opt, keyword_ids, 0, 1, &kwfreeze); | ||
| 	if (kwfreeze == Qfalse) return FALSE; | ||
| 	if (kwfreeze != Qundef && kwfreeze != Qtrue) { | ||
|         if (kwfreeze == Qtrue) return TRUE; | ||
| 	if (kwfreeze != Qundef) { | ||
| 	    rb_raise(rb_eArgError, "unexpected value for freeze: %"PRIsVALUE, | ||
| 		     rb_obj_class(kwfreeze)); | ||
| 	} | ||
|     } | ||
|     return TRUE; | ||
|     return -1; // neither true nor false | ||
| } | ||
| static VALUE | ||
| ... | ... | |
|     init_copy(clone, obj); | ||
|     rb_funcall(clone, id_init_clone, 1, obj); | ||
|     if (kwfreeze) { | ||
|     if (kwfreeze == TRUE) { | ||
|         // true: always freeze | ||
|         RBASIC(clone)->flags |= FL_FREEZE; | ||
|     } else if (kwfreeze == FALSE) { | ||
|         // false: don't copy frozen flag = always unfreeze | ||
|     } else { | ||
|         // not set: copy frozen flag without changing it | ||
| 	RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE; | ||
|     } | ||
| test/ruby/test_object.rb | ||
|---|---|---|
|     assert_equal(2, d.b) | ||
|     assert_equal(3, d.e) | ||
|     e = d.clone(freeze: true) | ||
|     assert_equal(true, e.frozen?) | ||
|     assert_equal 1, 1.clone | ||
|     assert_equal true, true.clone | ||
|     assert_equal nil, nil.clone | ||