@@ -6001,12 +6001,12 @@ ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
6001
6001
zend_object * zobj ;
6002
6002
zend_class_entry * ce , * scope ;
6003
6003
zend_function * clone ;
6004
- zend_object_clone_obj_t clone_call ;
6005
6004
6006
6005
SAVE_OPLINE ();
6007
6006
obj = GET_OP1_OBJ_ZVAL_PTR_UNDEF (BP_VAR_R );
6008
6007
6009
- /* ZEND_CLONE also exists as the clone() function and both implementations must be kept in sync. */
6008
+ /* ZEND_CLONE also exists as the clone() function and both implementations must be kept in sync.
6009
+ * The OPcode intentionally does not support a clone-with property list to keep it simple. */
6010
6010
6011
6011
do {
6012
6012
if (OP1_TYPE == IS_CONST ||
@@ -6033,8 +6033,7 @@ ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
6033
6033
zobj = Z_OBJ_P (obj );
6034
6034
ce = zobj -> ce ;
6035
6035
clone = ce -> clone ;
6036
- clone_call = zobj -> handlers -> clone_obj ;
6037
- if (UNEXPECTED (clone_call == NULL )) {
6036
+ if (UNEXPECTED (zobj -> handlers -> clone_obj == NULL )) {
6038
6037
zend_throw_error (NULL , "Trying to clone an uncloneable object of class %s" , ZSTR_VAL (ce -> name ));
6039
6038
FREE_OP1 ();
6040
6039
ZVAL_UNDEF (EX_VAR (opline -> result .var ));
@@ -6054,8 +6053,20 @@ ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
6054
6053
}
6055
6054
}
6056
6055
6057
- ZVAL_OBJ (EX_VAR (opline -> result .var ), clone_call (zobj ));
6056
+ zend_object * cloned ;
6057
+ if (zobj -> handlers -> clone_obj_with ) {
6058
+ scope = EX (func )-> op_array .scope ;
6059
+ cloned = zobj -> handlers -> clone_obj_with (zobj , scope , & zend_empty_array );
6060
+ } else {
6061
+ cloned = zobj -> handlers -> clone_obj (zobj );
6062
+ }
6058
6063
6064
+ ZEND_ASSERT (cloned || EG (exception ));
6065
+ if (EXPECTED (cloned )) {
6066
+ ZVAL_OBJ (EX_VAR (opline -> result .var ), cloned );
6067
+ } else {
6068
+ ZVAL_UNDEF (EX_VAR (opline -> result .var ));
6069
+ }
6059
6070
FREE_OP1 ();
6060
6071
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
6061
6072
}
0 commit comments