@@ -404,7 +404,7 @@ init_copy(VALUE dest, VALUE obj)
404404}
405405
406406static VALUE immutable_obj_clone (VALUE obj , VALUE kwfreeze );
407- static VALUE mutable_obj_clone (VALUE obj , VALUE kwfreeze );
407+ static VALUE mutable_obj_clone (VALUE obj , VALUE kwfreeze , int init_callbacks );
408408PUREFUNC (static inline int special_object_p (VALUE obj )); /*!< \private */
409409static inline int
410410special_object_p (VALUE obj )
@@ -443,7 +443,7 @@ rb_obj_clone2(rb_execution_context_t *ec, VALUE obj, VALUE freeze)
443443{
444444 VALUE kwfreeze = obj_freeze_opt (freeze );
445445 if (!special_object_p (obj ))
446- return mutable_obj_clone (obj , kwfreeze );
446+ return mutable_obj_clone (obj , kwfreeze , true );
447447 return immutable_obj_clone (obj , kwfreeze );
448448}
449449
@@ -484,7 +484,7 @@ immutable_obj_clone(VALUE obj, VALUE kwfreeze)
484484}
485485
486486VALUE
487- rb_obj_clone_setup (VALUE obj , VALUE clone , VALUE kwfreeze )
487+ rb_obj_clone_setup (VALUE obj , VALUE clone , VALUE kwfreeze , int init_callbacks )
488488{
489489 VALUE argv [2 ];
490490
@@ -498,7 +498,9 @@ rb_obj_clone_setup(VALUE obj, VALUE clone, VALUE kwfreeze)
498498
499499 switch (kwfreeze ) {
500500 case Qnil :
501- rb_funcall (clone , id_init_clone , 1 , obj );
501+ if (init_callbacks ) {
502+ rb_funcall (clone , id_init_clone , 1 , obj );
503+ }
502504 RBASIC (clone )-> flags |= RBASIC (obj )-> flags & FL_FREEZE ;
503505
504506 if (RB_TYPE_P (obj , T_STRING )) {
@@ -526,7 +528,9 @@ rb_obj_clone_setup(VALUE obj, VALUE clone, VALUE kwfreeze)
526528
527529 argv [0 ] = obj ;
528530 argv [1 ] = freeze_true_hash ;
529- rb_funcallv_kw (clone , id_init_clone , 2 , argv , RB_PASS_KEYWORDS );
531+ if (init_callbacks ) {
532+ rb_funcallv_kw (clone , id_init_clone , 2 , argv , RB_PASS_KEYWORDS );
533+ }
530534 RBASIC (clone )-> flags |= FL_FREEZE ;
531535 rb_shape_t * next_shape = rb_shape_transition_shape_frozen (clone );
532536 // If we're out of shapes, but we want to freeze, then we need to
@@ -550,7 +554,9 @@ rb_obj_clone_setup(VALUE obj, VALUE clone, VALUE kwfreeze)
550554
551555 argv [0 ] = obj ;
552556 argv [1 ] = freeze_false_hash ;
553- rb_funcallv_kw (clone , id_init_clone , 2 , argv , RB_PASS_KEYWORDS );
557+ if (init_callbacks ) {
558+ rb_funcallv_kw (clone , id_init_clone , 2 , argv , RB_PASS_KEYWORDS );
559+ }
554560 break ;
555561 }
556562 default :
@@ -561,17 +567,24 @@ rb_obj_clone_setup(VALUE obj, VALUE clone, VALUE kwfreeze)
561567}
562568
563569static VALUE
564- mutable_obj_clone (VALUE obj , VALUE kwfreeze )
570+ mutable_obj_clone (VALUE obj , VALUE kwfreeze , int init_callbacks )
565571{
566572 VALUE clone = rb_obj_alloc (rb_obj_class (obj ));
567- return rb_obj_clone_setup (obj , clone , kwfreeze );
573+ return rb_obj_clone_setup (obj , clone , kwfreeze , init_callbacks );
568574}
569575
570576VALUE
571577rb_obj_clone (VALUE obj )
572578{
573579 if (special_object_p (obj )) return obj ;
574- return mutable_obj_clone (obj , Qnil );
580+ return mutable_obj_clone (obj , Qnil , true);
581+ }
582+
583+ VALUE
584+ rb_obj_raw_clone (VALUE obj )
585+ {
586+ if (special_object_p (obj )) return obj ;
587+ return mutable_obj_clone (obj , Qnil , false);
575588}
576589
577590VALUE
0 commit comments