From 8aae70fa32bbf8d915adcd91056f3e20bda1f6c9 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 9 Jun 2016 12:08:29 +0200 Subject: php-pecl-uopz: fix for 7.1 --- php-pecl-uopz-php7.spec | 13 ++- uopz-upstream.patch | 226 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 uopz-upstream.patch diff --git a/php-pecl-uopz-php7.spec b/php-pecl-uopz-php7.spec index 2692033..388c214 100644 --- a/php-pecl-uopz-php7.spec +++ b/php-pecl-uopz-php7.spec @@ -24,7 +24,7 @@ Summary: User Operations for Zend Name: %{?sub_prefix}php-pecl-%{pecl_name} Version: 5.0.1 -Release: 1%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} +Release: 2%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} License: PHP Group: Development/Languages URL: http://pecl.php.net/package/%{pecl_name} @@ -33,6 +33,9 @@ Source0: https://github.com/%{gh_owner}/%{gh_project}/archive/%{gh_commit %else Source0: http://pecl.php.net/get/%{pecl_name}-%{version}.tgz %endif + +Patch0: %{pecl_name}-upstream.patch + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: %{?scl_prefix}php-devel > 5.4 BuildRequires: %{?scl_prefix}php-pear @@ -62,6 +65,10 @@ Obsoletes: php56u-pecl-%{pecl_name} <= %{version} Obsoletes: php56w-pecl-%{pecl_name} <= %{version} Obsoletes: php70u-pecl-%{pecl_name} <= %{version} Obsoletes: php70w-pecl-%{pecl_name} <= %{version} +%if "%{php_version}" > "7.1" +Obsoletes: php71u-pecl-%{pecl_name} <= %{version} +Obsoletes: php71w-pecl-%{pecl_name} <= %{version} +%endif %endif %if 0%{?fedora} < 20 && 0%{?rhel} < 7 @@ -116,6 +123,7 @@ sed -e 's/role="test"/role="src"/' \ -i package.xml cd NTS +%patch0 -p1 -b .upstream # Sanity check, really often broken extver=$(sed -n '/#define PHP_UOPZ_VERSION/{s/.* "//;s/".*$//;p}' uopz.h) @@ -245,6 +253,9 @@ rm -rf %{buildroot} %changelog +* Thu Jun 9 2016 Remi Collet - 5.0.1-2 +- add upstream patch for PHP 7.1 + * Wed Apr 13 2016 Remi Collet - 5.0.1-1 - update to 5.0.1 diff --git a/uopz-upstream.patch b/uopz-upstream.patch new file mode 100644 index 0000000..35a29a7 --- /dev/null +++ b/uopz-upstream.patch @@ -0,0 +1,226 @@ +From b15f4d83a760013142c5275a2b29244a5ef62d90 Mon Sep 17 00:00:00 2001 +From: Joe Watkins +Date: Thu, 26 May 2016 12:10:15 +0100 +Subject: [PATCH] fixes for 7.1, add leave helper function + +--- + src/class.c | 55 +++++++++++++++++++++++++++++++++---------------------- + src/handlers.c | 33 +++++++++++++++++++++++---------- + uopz.h | 2 +- + 3 files changed, 57 insertions(+), 33 deletions(-) + +diff --git a/src/class.c b/src/class.c +index 15100d9..db9fe6c 100644 +--- a/src/class.c ++++ b/src/class.c +@@ -27,6 +27,14 @@ + + ZEND_EXTERN_MODULE_GLOBALS(uopz); + ++#if PHP_VERSION_ID >= 70100 ++# define uopz_get_scope(e) ((e) ? zend_get_executed_scope() : EG(fake_scope)) ++# define uopz_set_scope(s) EG(fake_scope) = (s) ++#else ++# define uopz_get_scope(e) EG(scope) ++# define uopz_set_scope(s) EG(scope) = (s) ++#endif ++ + void uopz_set_mock(zend_string *clazz, zval *mock) { /* {{{ */ + zend_string *key = zend_string_tolower(clazz); + +@@ -131,12 +139,12 @@ zend_bool uopz_implement(zend_class_entry *clazz, zend_class_entry *interface) { + } /* }}} */ + + void uopz_set_property(zval *object, zval *member, zval *value) { /* {{{ */ +- zend_class_entry *scope = EG(scope); ++ zend_class_entry *scope = uopz_get_scope(1); + zend_class_entry *ce = Z_OBJCE_P(object); + zend_property_info *info; + + do { +- EG(scope) = ce; ++ uopz_set_scope(ce); + + info = zend_get_property_info(ce, Z_STR_P(member), 1); + +@@ -148,25 +156,25 @@ void uopz_set_property(zval *object, zval *member, zval *value) { /* {{{ */ + } while (ce); + + if (info && info != ZEND_WRONG_PROPERTY_INFO) { +- EG(scope) = info->ce; ++ uopz_set_scope(info->ce); + } else { +- EG(scope) = Z_OBJCE_P(object); ++ uopz_set_scope(Z_OBJCE_P(object)); + } + + Z_OBJ_HT_P(object) + ->write_property(object, member, value, NULL); + +- EG(scope) = scope; ++ uopz_set_scope(scope); + } /* }}} */ + + void uopz_get_property(zval *object, zval *member, zval *value) { /* {{{ */ +- zend_class_entry *scope = EG(scope); ++ zend_class_entry *scope = uopz_get_scope(1); + zend_class_entry *ce = Z_OBJCE_P(object); + zend_property_info *info; + zval *prop, rv; + + do { +- EG(scope) = ce; ++ uopz_set_scope(ce); + + info = zend_get_property_info(ce, Z_STR_P(member), 1); + +@@ -178,14 +186,15 @@ void uopz_get_property(zval *object, zval *member, zval *value) { /* {{{ */ + } while (ce); + + if (info && info != ZEND_WRONG_PROPERTY_INFO) { +- EG(scope) = info->ce; ++ uopz_set_scope(info->ce); + } else { +- EG(scope) = Z_OBJCE_P(object); ++ uopz_set_scope(Z_OBJCE_P(object)); + } + + prop = Z_OBJ_HT_P(object) + ->read_property(object, member, BP_VAR_R, NULL, &rv); +- EG(scope) = scope; ++ ++ uopz_set_scope(scope); + + if (!prop) { + return; +@@ -195,13 +204,13 @@ void uopz_get_property(zval *object, zval *member, zval *value) { /* {{{ */ + } /* }}} */ + + void uopz_set_static_property(zend_class_entry *ce, zend_string *property, zval *value) { /* {{{ */ +- zend_class_entry *scope = EG(scope); ++ zend_class_entry *scope = uopz_get_scope(1); + zend_class_entry *seek = ce; + zend_property_info *info; + zval *prop; + + do { +- EG(scope) = seek; ++ uopz_set_scope(seek); + + info = zend_get_property_info(seek, property, 1); + +@@ -213,13 +222,14 @@ void uopz_set_static_property(zend_class_entry *ce, zend_string *property, zval + } while (seek); + + if (info && info != ZEND_WRONG_PROPERTY_INFO) { +- EG(scope) = info->ce; ++ uopz_set_scope(info->ce); + } else { +- EG(scope) = ce; ++ uopz_set_scope(ce); + } + +- prop = zend_std_get_static_property(EG(scope), property, 1); +- EG(scope) = scope; ++ prop = zend_std_get_static_property(uopz_get_scope(0), property, 1); ++ ++ uopz_set_scope(scope); + + if (!prop) { + return; +@@ -230,13 +240,13 @@ void uopz_set_static_property(zend_class_entry *ce, zend_string *property, zval + } /* }}} */ + + void uopz_get_static_property(zend_class_entry *ce, zend_string *property, zval *value) { /* {{{ */ +- zend_class_entry *scope = EG(scope); ++ zend_class_entry *scope = uopz_get_scope(1); + zend_class_entry *seek = ce; + zend_property_info *info; + zval *prop; + + do { +- EG(scope) = seek; ++ uopz_set_scope(seek); + + info = zend_get_property_info(seek, property, 1); + +@@ -248,13 +258,14 @@ void uopz_get_static_property(zend_class_entry *ce, zend_string *property, zval + } while (seek); + + if (info && info != ZEND_WRONG_PROPERTY_INFO) { +- EG(scope) = info->ce; ++ uopz_set_scope(info->ce); + } else { +- EG(scope) = ce; ++ uopz_set_scope(ce); + } + +- prop = zend_std_get_static_property(EG(scope), property, 1); +- EG(scope) = scope; ++ prop = zend_std_get_static_property(uopz_get_scope(0), property, 1); ++ ++ uopz_set_scope(scope); + + if (!prop) { + return; +diff --git a/src/handlers.c b/src/handlers.c +index 11b7f5f..98e9c37 100644 +--- a/src/handlers.c ++++ b/src/handlers.c +@@ -344,6 +344,27 @@ static inline void uopz_run_hook(zend_function *function, zend_execute_data *exe + } + } /* }}} */ + ++/* {{{ */ ++static inline int php_uopz_leave_helper(zend_execute_data *execute_data) { ++ zend_execute_data *call = EX(call); ++ uint32_t info = ZEND_CALL_INFO(call); ++ ++ if (info & ZEND_CALL_RELEASE_THIS) { ++ OBJ_RELEASE(Z_OBJ(call->This)); ++ } else if (info & ZEND_CALL_CLOSURE) { ++ OBJ_RELEASE((zend_object*)call->func->op_array.prototype); ++ } ++ ++ EX(call) = call->prev_execute_data; ++ ++ zend_vm_stack_free_args(call); ++ zend_vm_stack_free_call_frame(call); ++ ++ EX(opline) = EX(opline) + 1; ++ ++ return ZEND_USER_OPCODE_LEAVE; ++} /* }}} */ ++ + int uopz_return_handler(UOPZ_OPCODE_HANDLER_ARGS) { /* {{{ */ + zend_execute_data *call = EX(call); + +@@ -366,26 +387,18 @@ int uopz_return_handler(UOPZ_OPCODE_HANDLER_ARGS) { /* {{{ */ + + uopz_execute_return(ureturn, call, return_value); + +- EX(call) = call->prev_execute_data; +- zend_vm_stack_free_call_frame(call); +- EX(opline) = opline + 1; +- + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&rv); + } + +- return ZEND_USER_OPCODE_CONTINUE; ++ return php_uopz_leave_helper(UOPZ_OPCODE_HANDLER_ARGS_PASSTHRU); + } + + if (RETURN_VALUE_USED(opline)) { + ZVAL_COPY(return_value, &ureturn->value); + } + +- EX(call) = call->prev_execute_data; +- zend_vm_stack_free_call_frame(call); +- EX(opline) = opline + 1; +- +- return ZEND_USER_OPCODE_CONTINUE; ++ return php_uopz_leave_helper(UOPZ_OPCODE_HANDLER_ARGS_PASSTHRU); + } + } + -- cgit