Skip to content

Commit 7260859

Browse files
committed
Remove ZEND_CLONE OPcode
1 parent 46c7e7e commit 7260859

10 files changed

+995
-1622
lines changed

Zend/Optimizer/zend_inference.c

-4
Original file line numberDiff line numberDiff line change
@@ -3398,10 +3398,6 @@ static zend_always_inline zend_result _zend_update_type_info(
33983398
}
33993399
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
34003400
break;
3401-
case ZEND_CLONE:
3402-
UPDATE_SSA_TYPE(MAY_BE_RC1|MAY_BE_RCN|MAY_BE_OBJECT, ssa_op->result_def);
3403-
COPY_SSA_OBJ_TYPE(ssa_op->op1_use, ssa_op->result_def);
3404-
break;
34053401
case ZEND_INIT_ARRAY:
34063402
case ZEND_ADD_ARRAY_ELEMENT:
34073403
if (ssa_op->op1_def >= 0) {

Zend/zend_ast.c

-10
Original file line numberDiff line numberDiff line change
@@ -2284,16 +2284,6 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio
22842284
}
22852285
smart_str_appendc(str, '`');
22862286
break;
2287-
case ZEND_AST_CLONE:
2288-
smart_str_appends(str, "clone");
2289-
smart_str_appendc(str, '(');
2290-
zend_ast_export_ex(str, ast->child[0], 0, indent);
2291-
if (ast->child[1]) {
2292-
smart_str_appends(str, ", ");
2293-
zend_ast_export_ex(str, ast->child[1], 0, indent);
2294-
}
2295-
smart_str_appendc(str, ')');
2296-
break;
22972287
case ZEND_AST_PRINT:
22982288
PREFIX_OP("print ", 60, 61);
22992289
case ZEND_AST_INCLUDE_OR_EVAL:

Zend/zend_ast.h

-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ enum _zend_ast_kind {
153153
ZEND_AST_MATCH_ARM,
154154
ZEND_AST_NAMED_ARG,
155155
ZEND_AST_PARENT_PROPERTY_HOOK_CALL,
156-
ZEND_AST_CLONE,
157156

158157
/* 3 child nodes */
159158
ZEND_AST_METHOD_CALL = 3 << ZEND_AST_NUM_CHILDREN_SHIFT,

Zend/zend_compile.c

-57
Original file line numberDiff line numberDiff line change
@@ -5397,60 +5397,6 @@ static void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
53975397
}
53985398
/* }}} */
53995399

5400-
static void zend_compile_clone(znode *result, zend_ast *ast) /* {{{ */
5401-
{
5402-
zend_ast *obj_ast = ast->child[0];
5403-
5404-
znode obj_node;
5405-
zend_compile_expr(&obj_node, obj_ast);
5406-
5407-
znode value_node;
5408-
if (ast->child[1]) {
5409-
ZEND_ASSERT(ast->child[1]->kind == ZEND_AST_ARG_LIST);
5410-
zend_ast_list *args_ast = zend_ast_get_list(ast->child[1]);
5411-
ZEND_ASSERT(args_ast->children > 0);
5412-
5413-
zend_ast *array;
5414-
zend_ast *last;
5415-
5416-
for (uint32_t i = 0; i < args_ast->children; ++i) {
5417-
zend_ast *arg = args_ast->child[i];
5418-
5419-
switch (arg->kind) {
5420-
case ZEND_AST_UNPACK:
5421-
if (args_ast->children != 1) {
5422-
zend_error_noreturn(E_COMPILE_ERROR, "Cannot combine unpacking with other arguments");
5423-
}
5424-
5425-
array = arg->child[0];
5426-
5427-
break;
5428-
case ZEND_AST_NAMED_ARG: {
5429-
zend_ast *elem = zend_ast_create(ZEND_AST_ARRAY_ELEM, arg->child[1], arg->child[0]);
5430-
if (i == 0) {
5431-
array = zend_ast_create_list(args_ast->children, ZEND_AST_ARRAY, elem);
5432-
last = array;
5433-
} else {
5434-
last = zend_ast_list_add(last, elem);
5435-
}
5436-
break;
5437-
}
5438-
default:
5439-
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use unnamed argument");
5440-
break;
5441-
}
5442-
}
5443-
5444-
zend_compile_expr(&value_node, array);
5445-
} else {
5446-
value_node.op_type = IS_UNUSED;
5447-
}
5448-
5449-
5450-
zend_emit_op_tmp(result, ZEND_CLONE, &obj_node, &value_node);
5451-
}
5452-
/* }}} */
5453-
54545400
static void zend_compile_global_var(zend_ast *ast) /* {{{ */
54555401
{
54565402
zend_ast *var_ast = ast->child[0];
@@ -11671,9 +11617,6 @@ static void zend_compile_expr_inner(znode *result, zend_ast *ast) /* {{{ */
1167111617
case ZEND_AST_NEW:
1167211618
zend_compile_new(result, ast);
1167311619
return;
11674-
case ZEND_AST_CLONE:
11675-
zend_compile_clone(result, ast);
11676-
return;
1167711620
case ZEND_AST_ASSIGN_OP:
1167811621
zend_compile_compound_assign(result, ast);
1167911622
return;

Zend/zend_execute.c

-9
Original file line numberDiff line numberDiff line change
@@ -4096,15 +4096,6 @@ static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DAT
40964096
}
40974097
}
40984098

4099-
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_clone_call(zend_function *clone, zend_class_entry *scope)
4100-
{
4101-
zend_throw_error(NULL, "Call to %s %s::__clone() from %s%s",
4102-
zend_visibility_string(clone->common.fn_flags), ZSTR_VAL(clone->common.scope->name),
4103-
scope ? "scope " : "global scope",
4104-
scope ? ZSTR_VAL(scope->name) : ""
4105-
);
4106-
}
4107-
41084099
#if ZEND_INTENSIVE_DEBUGGING
41094100

41104101
#define CHECK_SYMBOL_TABLES() \

Zend/zend_vm_def.h

-102
Original file line numberDiff line numberDiff line change
@@ -5995,108 +5995,6 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, N
59955995
ZEND_VM_NEXT_OPCODE();
59965996
}
59975997

5998-
ZEND_VM_COLD_CONST_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
5999-
{
6000-
USE_OPLINE
6001-
zval *obj;
6002-
zend_object *zobj;
6003-
zend_class_entry *ce, *scope;
6004-
zend_function *clone;
6005-
6006-
SAVE_OPLINE();
6007-
obj = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
6008-
6009-
do {
6010-
if (OP1_TYPE == IS_CONST ||
6011-
(OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
6012-
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
6013-
obj = Z_REFVAL_P(obj);
6014-
if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
6015-
break;
6016-
}
6017-
}
6018-
ZVAL_UNDEF(EX_VAR(opline->result.var));
6019-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
6020-
ZVAL_UNDEFINED_OP1();
6021-
if (UNEXPECTED(EG(exception) != NULL)) {
6022-
HANDLE_EXCEPTION();
6023-
}
6024-
}
6025-
zend_throw_error(NULL, "__clone method called on non-object");
6026-
FREE_OP1();
6027-
FREE_OP2();
6028-
HANDLE_EXCEPTION();
6029-
}
6030-
} while (0);
6031-
6032-
zobj = Z_OBJ_P(obj);
6033-
ce = zobj->ce;
6034-
clone = ce->clone;
6035-
if (UNEXPECTED(zobj->handlers->clone_obj == NULL)) {
6036-
zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name));
6037-
FREE_OP1();
6038-
FREE_OP2();
6039-
ZVAL_UNDEF(EX_VAR(opline->result.var));
6040-
HANDLE_EXCEPTION();
6041-
}
6042-
6043-
if (clone && !(clone->common.fn_flags & ZEND_ACC_PUBLIC)) {
6044-
scope = EX(func)->op_array.scope;
6045-
if (clone->common.scope != scope) {
6046-
if (UNEXPECTED(clone->common.fn_flags & ZEND_ACC_PRIVATE)
6047-
|| UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), scope))) {
6048-
zend_wrong_clone_call(clone, scope);
6049-
FREE_OP1();
6050-
FREE_OP2();
6051-
ZVAL_UNDEF(EX_VAR(opline->result.var));
6052-
HANDLE_EXCEPTION();
6053-
}
6054-
}
6055-
}
6056-
6057-
zend_object *cloned;
6058-
if (zobj->handlers->clone_obj_with) {
6059-
scope = EX(func)->op_array.scope;
6060-
if (OP2_TYPE != IS_UNUSED) {
6061-
zval *properties = GET_OP2_ZVAL_PTR(BP_VAR_R);
6062-
if (Z_TYPE_P(properties) != IS_ARRAY) {
6063-
zend_type_error("Only arrays can be unpacked for clone, %s given", zend_zval_value_name(properties));
6064-
FREE_OP1();
6065-
FREE_OP2();
6066-
ZVAL_UNDEF(EX_VAR(opline->result.var));
6067-
HANDLE_EXCEPTION();
6068-
}
6069-
6070-
cloned = zobj->handlers->clone_obj_with(zobj, scope, Z_ARR_P(properties));
6071-
} else {
6072-
cloned = zobj->handlers->clone_obj_with(zobj, scope, NULL);
6073-
}
6074-
6075-
if (UNEXPECTED(EG(exception))) {
6076-
OBJ_RELEASE(cloned);
6077-
FREE_OP1();
6078-
FREE_OP2();
6079-
ZVAL_UNDEF(EX_VAR(opline->result.var));
6080-
HANDLE_EXCEPTION();
6081-
}
6082-
} else {
6083-
if (OP2_TYPE != IS_UNUSED) {
6084-
zend_throw_error(NULL, "Trying to clone an object with updated properties that is not compatible %s", ZSTR_VAL(ce->name));
6085-
FREE_OP1();
6086-
FREE_OP2();
6087-
ZVAL_UNDEF(EX_VAR(opline->result.var));
6088-
HANDLE_EXCEPTION();
6089-
}
6090-
6091-
cloned = zobj->handlers->clone_obj(zobj);
6092-
}
6093-
6094-
ZVAL_OBJ(EX_VAR(opline->result.var), cloned);
6095-
FREE_OP1();
6096-
FREE_OP2();
6097-
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
6098-
}
6099-
61005998
ZEND_VM_HOT_HANDLER(99, ZEND_FETCH_CONSTANT, UNUSED|CONST_FETCH, CONST, CACHE_SLOT)
61015999
{
61026000
USE_OPLINE

0 commit comments

Comments
 (0)