]> granicus.if.org Git - php/commitdiff
Make ZEND_CLONE return a TMP_VAR
authorNikita Popov <nikic@php.net>
Thu, 10 Dec 2015 21:14:39 +0000 (22:14 +0100)
committerNikita Popov <nikic@php.net>
Thu, 10 Dec 2015 21:16:25 +0000 (22:16 +0100)
As the return value can't be reference and it's unlikely to be
unused.

Also remove some unnecessary checks for ce==NULL. A ce is required
nowadays.

Zend/zend_compile.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 53c62ab29cd4330816218fca79d652c237a2bc8a..2e50271a7f4706b51ba3de87c83cdd3c3269ec69 100644 (file)
@@ -3621,7 +3621,7 @@ void zend_compile_clone(znode *result, zend_ast *ast) /* {{{ */
        znode obj_node;
        zend_compile_expr(&obj_node, obj_ast);
 
-       zend_emit_op(result, ZEND_CLONE, &obj_node, NULL);
+       zend_emit_op_tmp(result, ZEND_CLONE, &obj_node, NULL);
 }
 /* }}} */
 
index 0fc70a307d3b4d4fad66e8dcf026d67cf0bba1e6..6b75a37bcad2abc3e5c93a94bd3262786ed95f4e 100644 (file)
@@ -5077,19 +5077,15 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY)
        } while (0);
 
        ce = Z_OBJCE_P(obj);
-       clone = ce ? ce->clone : NULL;
-       clone_call =  Z_OBJ_HT_P(obj)->clone_obj;
+       clone = ce->clone;
+       clone_call = Z_OBJ_HT_P(obj)->clone_obj;
        if (UNEXPECTED(clone_call == NULL)) {
-               if (ce) {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
-               } else {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object");
-               }
+               zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
                FREE_OP1();
                HANDLE_EXCEPTION();
        }
 
-       if (ce && clone) {
+       if (clone) {
                if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
                        /* Ensure that if we're calling a private function, we're allowed to do so.
                         */
@@ -5109,12 +5105,11 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY)
                }
        }
 
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
-               if (UNEXPECTED(!RETURN_VALUE_USED(opline)) || UNEXPECTED(EG(exception) != NULL)) {
-                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
-               }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
        }
+
        FREE_OP1();
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
index 4742401ef2de1fa8e3e7a2adb01b8cd90dfd0582..88e10282d52f911c1678c06e4d04208d9de65a9f 100644 (file)
@@ -3441,19 +3441,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
        } while (0);
 
        ce = Z_OBJCE_P(obj);
-       clone = ce ? ce->clone : NULL;
-       clone_call =  Z_OBJ_HT_P(obj)->clone_obj;
+       clone = ce->clone;
+       clone_call = Z_OBJ_HT_P(obj)->clone_obj;
        if (UNEXPECTED(clone_call == NULL)) {
-               if (ce) {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
-               } else {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object");
-               }
+               zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
 
                HANDLE_EXCEPTION();
        }
 
-       if (ce && clone) {
+       if (clone) {
                if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
                        /* Ensure that if we're calling a private function, we're allowed to do so.
                         */
@@ -3473,11 +3469,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
                }
        }
 
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
-               if (UNEXPECTED(!RETURN_VALUE_USED(opline)) || UNEXPECTED(EG(exception) != NULL)) {
-                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
-               }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -22735,19 +22729,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
        } while (0);
 
        ce = Z_OBJCE_P(obj);
-       clone = ce ? ce->clone : NULL;
-       clone_call =  Z_OBJ_HT_P(obj)->clone_obj;
+       clone = ce->clone;
+       clone_call = Z_OBJ_HT_P(obj)->clone_obj;
        if (UNEXPECTED(clone_call == NULL)) {
-               if (ce) {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
-               } else {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object");
-               }
+               zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
 
                HANDLE_EXCEPTION();
        }
 
-       if (ce && clone) {
+       if (clone) {
                if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
                        /* Ensure that if we're calling a private function, we're allowed to do so.
                         */
@@ -22767,11 +22757,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
                }
        }
 
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
-               if (UNEXPECTED(!RETURN_VALUE_USED(opline)) || UNEXPECTED(EG(exception) != NULL)) {
-                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
-               }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -29496,19 +29484,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
        } while (0);
 
        ce = Z_OBJCE_P(obj);
-       clone = ce ? ce->clone : NULL;
-       clone_call =  Z_OBJ_HT_P(obj)->clone_obj;
+       clone = ce->clone;
+       clone_call = Z_OBJ_HT_P(obj)->clone_obj;
        if (UNEXPECTED(clone_call == NULL)) {
-               if (ce) {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
-               } else {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object");
-               }
+               zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
 
                HANDLE_EXCEPTION();
        }
 
-       if (ce && clone) {
+       if (clone) {
                if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
                        /* Ensure that if we're calling a private function, we're allowed to do so.
                         */
@@ -29528,11 +29512,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
                }
        }
 
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
-               if (UNEXPECTED(!RETURN_VALUE_USED(opline)) || UNEXPECTED(EG(exception) != NULL)) {
-                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
-               }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -41061,19 +41043,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
        } while (0);
 
        ce = Z_OBJCE_P(obj);
-       clone = ce ? ce->clone : NULL;
-       clone_call =  Z_OBJ_HT_P(obj)->clone_obj;
+       clone = ce->clone;
+       clone_call = Z_OBJ_HT_P(obj)->clone_obj;
        if (UNEXPECTED(clone_call == NULL)) {
-               if (ce) {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
-               } else {
-                       zend_throw_error(NULL, "Trying to clone an uncloneable object");
-               }
+               zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
                zval_ptr_dtor_nogc(free_op1);
                HANDLE_EXCEPTION();
        }
 
-       if (ce && clone) {
+       if (clone) {
                if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
                        /* Ensure that if we're calling a private function, we're allowed to do so.
                         */
@@ -41093,12 +41071,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
                }
        }
 
-       if (EXPECTED(EG(exception) == NULL)) {
-               ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
-               if (UNEXPECTED(!RETURN_VALUE_USED(opline)) || UNEXPECTED(EG(exception) != NULL)) {
-                       OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
-               }
+       ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));
        }
+
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }