@@ -6001,12 +6001,13 @@ 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
6012
do {
6012
6013
if (OP1_TYPE == IS_CONST ||
@@ -6033,8 +6034,7 @@ ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
6033
6034
zobj = Z_OBJ_P (obj );
6034
6035
ce = zobj -> ce ;
6035
6036
clone = ce -> clone ;
6036
- clone_call = zobj -> handlers -> clone_obj ;
6037
- if (UNEXPECTED (clone_call == NULL )) {
6037
+ if (UNEXPECTED (zobj -> handlers -> clone_obj == NULL )) {
6038
6038
zend_throw_error (NULL , "Trying to clone an uncloneable object of class %s" , ZSTR_VAL (ce -> name ));
6039
6039
FREE_OP1 ();
6040
6040
ZVAL_UNDEF (EX_VAR (opline -> result .var ));
@@ -6054,8 +6054,20 @@ ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
6054
6054
}
6055
6055
}
6056
6056
6057
- ZVAL_OBJ (EX_VAR (opline -> result .var ), clone_call (zobj ));
6057
+ zend_object * cloned ;
6058
+ if (zobj -> handlers -> clone_obj_with ) {
6059
+ scope = EX (func )-> op_array .scope ;
6060
+ cloned = zobj -> handlers -> clone_obj_with (zobj , scope , & zend_empty_array );
6061
+ } else {
6062
+ cloned = zobj -> handlers -> clone_obj (zobj );
6063
+ }
6058
6064
6065
+ ZEND_ASSERT (cloned || EG (exception ));
6066
+ if (EXPECTED (cloned )) {
6067
+ ZVAL_OBJ (EX_VAR (opline -> result .var ), cloned );
6068
+ } else {
6069
+ ZVAL_UNDEF (EX_VAR (opline -> result .var ));
6070
+ }
6059
6071
FREE_OP1 ();
6060
6072
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
6061
6073
}
0 commit comments