diff options
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r-- | Zend/zend_vm_execute.h | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 399533de1a..c104199b10 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1624,6 +1624,13 @@ static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ if (IS_CONSTANT_TYPE(Z_TYPE_P(assignment_value))) { Z_SET_REFCOUNT_P(assignment_value, 1); zval_update_constant(&assignment_value, 0 TSRMLS_CC); + } else if (Z_TYPE_P(assignment_value) == IS_ARRAY) { + HashTable *ht; + + ALLOC_HASHTABLE(ht); + zend_hash_init(ht, zend_hash_num_elements(Z_ARRVAL_P(assignment_value)), NULL, ZVAL_PTR_DTOR, 0); + zend_hash_copy(ht, Z_ARRVAL_P(assignment_value), (copy_ctor_func_t) zval_deep_copy, NULL, sizeof(zval *)); + Z_ARRVAL_P(assignment_value) = ht; } else { zval_copy_ctor(assignment_value); } @@ -6781,6 +6788,7 @@ static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER { USE_OPLINE zend_function *op_array; + int closure_is_static, closure_is_being_defined_inside_static_context; SAVE_OPLINE(); @@ -6789,7 +6797,13 @@ static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER zend_error_noreturn(E_ERROR, "Base lambda function for closure not found"); } - zend_create_closure(&EX_T(opline->result.var).tmp_var, (zend_function *) op_array, EG(scope), EG(This) TSRMLS_CC); + closure_is_static = op_array->common.fn_flags & ZEND_ACC_STATIC; + closure_is_being_defined_inside_static_context = EX(prev_execute_data) && EX(prev_execute_data)->function_state.function->common.fn_flags & ZEND_ACC_STATIC; + if (closure_is_static || closure_is_being_defined_inside_static_context) { + zend_create_closure(&EX_T(opline->result.var).tmp_var, (zend_function *) op_array, EG(called_scope), NULL TSRMLS_CC); + } else { + zend_create_closure(&EX_T(opline->result.var).tmp_var, (zend_function *) op_array, EG(scope), EG(This) TSRMLS_CC); + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -9309,7 +9323,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); if (EG(exception) != NULL) { @@ -10212,7 +10226,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_dtor(free_op2.var); if (EG(exception) != NULL) { @@ -11116,7 +11130,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_ptr_dtor_nogc(&free_op2.var); if (EG(exception) != NULL) { @@ -12600,7 +12614,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); if (EG(exception) != NULL) { @@ -15876,7 +15890,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_ptr_dtor_nogc(&free_op1.var); @@ -18261,7 +18275,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_dtor(free_op2.var); zval_ptr_dtor_nogc(&free_op1.var); @@ -20607,7 +20621,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_ptr_dtor_nogc(&free_op2.var); zval_ptr_dtor_nogc(&free_op1.var); @@ -24103,7 +24117,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_ptr_dtor_nogc(&free_op1.var); @@ -25784,7 +25798,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); if (EG(exception) != NULL) { @@ -27230,7 +27244,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_dtor(free_op2.var); if (EG(exception) != NULL) { @@ -28582,7 +28596,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_ptr_dtor_nogc(&free_op2.var); if (EG(exception) != NULL) { @@ -30362,7 +30376,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); if (EG(exception) != NULL) { @@ -33639,7 +33653,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); if (EG(exception) != NULL) { @@ -35789,7 +35803,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_dtor(free_op2.var); if (EG(exception) != NULL) { @@ -37994,7 +38008,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); zval_ptr_dtor_nogc(&free_op2.var); if (EG(exception) != NULL) { @@ -41200,7 +41214,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H HANDLE_EXCEPTION(); } - zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on a non-object", function_name_strval); + zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", function_name_strval, zend_get_type_by_const(Z_TYPE_P(call->object))); if (EG(exception) != NULL) { |