summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--php-pecl-uopz-php7.spec13
-rw-r--r--uopz-upstream.patch226
2 files changed, 238 insertions, 1 deletions
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 <remi@fedoraproject.org> - 5.0.1-2
+- add upstream patch for PHP 7.1
+
* Wed Apr 13 2016 Remi Collet <remi@fedoraproject.org> - 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 <krakjoe@php.net>
+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);
+ }
+ }
+