From 83c79712492441dab371a35c86f751d42c91f59e Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Fri, 6 Jul 2018 13:27:16 +0200 Subject: add patch for PHP 7.3 from https://github.com/google/protobuf/pull/4873 --- 4873.patch | 262 +++++++++++++++++++++++++++++++++++++++++++++++++ php-pecl-protobuf.spec | 10 +- 2 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 4873.patch diff --git a/4873.patch b/4873.patch new file mode 100644 index 0000000..83e7135 --- /dev/null +++ b/4873.patch @@ -0,0 +1,262 @@ +From 3ec00a36190393f2c865c67737309391cf280b3b Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Fri, 6 Jul 2018 10:32:18 +0200 +Subject: [PATCH] fix for API change in PHP 7.3 + +--- + php/ext/google/protobuf/def.c | 18 +++++++++--------- + php/ext/google/protobuf/encode_decode.c | 2 +- + php/ext/google/protobuf/map.c | 6 ++++-- + php/ext/google/protobuf/message.c | 8 ++++++++ + php/ext/google/protobuf/protobuf.c | 9 +++++---- + php/ext/google/protobuf/protobuf.h | 7 ++++++- + php/ext/google/protobuf/storage.c | 6 +++--- + 7 files changed, 36 insertions(+), 20 deletions(-) + +diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c +index fa33830b93..238a924789 100644 +--- a/php/ext/google/protobuf/def.c ++++ b/php/ext/google/protobuf/def.c +@@ -253,7 +253,7 @@ PHP_METHOD(Descriptor, getField) { + #else + field_hashtable_value = + field_descriptor_type->create_object(field_descriptor_type TSRMLS_CC); +- --GC_REFCOUNT(field_hashtable_value); ++ GC_DELREF(field_hashtable_value); + #endif + FieldDescriptor *field_php = + UNBOX_HASHTABLE_VALUE(FieldDescriptor, field_hashtable_value); +@@ -264,7 +264,7 @@ PHP_METHOD(Descriptor, getField) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(field_hashtable_value, 1, 0); + #else +- ++GC_REFCOUNT(field_hashtable_value); ++ GC_ADDREF(field_hashtable_value); + RETURN_OBJ(field_hashtable_value); + #endif + } +@@ -492,7 +492,7 @@ PHP_METHOD(FieldDescriptor, getEnumType) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(desc, 1, 0); + #else +- ++GC_REFCOUNT(desc); ++ GC_ADDREF(desc); + RETURN_OBJ(desc); + #endif + } +@@ -512,7 +512,7 @@ PHP_METHOD(FieldDescriptor, getMessageType) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(desc, 1, 0); + #else +- ++GC_REFCOUNT(desc); ++ GC_ADDREF(desc); + RETURN_OBJ(desc); + #endif + } +@@ -585,7 +585,7 @@ PHP_METHOD(Oneof, getField) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(field_hashtable_value, 1, 0); + #else +- ++GC_REFCOUNT(field_hashtable_value); ++ GC_ADDREF(field_hashtable_value); + RETURN_OBJ(field_hashtable_value); + #endif + } +@@ -703,7 +703,7 @@ PHP_METHOD(DescriptorPool, getGeneratedPool) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(generated_pool_php, 1, 0); + #else +- ++GC_REFCOUNT(generated_pool_php); ++ GC_ADDREF(generated_pool_php); + RETURN_OBJ(generated_pool_php); + #endif + } +@@ -713,7 +713,7 @@ PHP_METHOD(InternalDescriptorPool, getGeneratedPool) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(internal_generated_pool_php, 1, 0); + #else +- ++GC_REFCOUNT(internal_generated_pool_php); ++ GC_ADDREF(internal_generated_pool_php); + RETURN_OBJ(internal_generated_pool_php); + #endif + } +@@ -1033,7 +1033,7 @@ PHP_METHOD(DescriptorPool, getDescriptorByClassName) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(desc, 1, 0); + #else +- ++GC_REFCOUNT(desc); ++ GC_ADDREF(desc); + RETURN_OBJ(desc); + #endif + } +@@ -1070,7 +1070,7 @@ PHP_METHOD(DescriptorPool, getEnumDescriptorByClassName) { + #if PHP_MAJOR_VERSION < 7 + RETURN_ZVAL(desc, 1, 0); + #else +- ++GC_REFCOUNT(desc); ++ GC_ADDREF(desc); + RETURN_OBJ(desc); + #endif + } +diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c +index a8c47f4d35..de13dfa890 100644 +--- a/php/ext/google/protobuf/encode_decode.c ++++ b/php/ext/google/protobuf/encode_decode.c +@@ -577,7 +577,7 @@ static void map_slot_value(upb_fieldtype_t type, const void* from, + break; + case UPB_TYPE_MESSAGE: + *(zend_object**)to = Z_OBJ_P(*(zval**)from); +- ++GC_REFCOUNT(*(zend_object**)to); ++ GC_ADDREF(*(zend_object**)to); + break; + #endif + default: +diff --git a/php/ext/google/protobuf/map.c b/php/ext/google/protobuf/map.c +index ab8a518a4f..c5b500b53e 100644 +--- a/php/ext/google/protobuf/map.c ++++ b/php/ext/google/protobuf/map.c +@@ -192,7 +192,8 @@ static inline void php_proto_map_string_release(void *value) { + } + static inline void php_proto_map_object_release(void *value) { + zend_object* object = *(zend_object**)value; +- if(--GC_REFCOUNT(object) == 0) { ++ GC_DELREF(object); ++ if(GC_REFCOUNT(object) == 0) { + zend_objects_store_del(object); + } + } +@@ -302,7 +303,8 @@ static bool map_index_unset(Map *intern, const char* keyval, int length) { + zval_ptr_dtor(upb_value_memory(&old_value)); + #else + zend_object* object = *(zend_object**)upb_value_memory(&old_value); +- if(--GC_REFCOUNT(object) == 0) { ++ GC_DELREF(object); ++ if(GC_REFCOUNT(object) == 0) { + zend_objects_store_del(object); + } + #endif +diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c +index e28e42a152..a40e0f635c 100644 +--- a/php/ext/google/protobuf/message.c ++++ b/php/ext/google/protobuf/message.c +@@ -869,7 +869,11 @@ PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field\\Cardinality", + zend_declare_class_constant_long(field_cardinality_type, + "CARDINALITY_REPEATED", 20, 3 TSRMLS_CC); + const char *alias = "Google\\Protobuf\\Field_Cardinality"; ++#if PHP_VERSION_ID < 70300 + zend_register_class_alias_ex(alias, strlen(alias), field_cardinality_type TSRMLS_CC); ++#else ++ zend_register_class_alias_ex(alias, strlen(alias), field_cardinality_type, 1); ++#endif + PHP_PROTO_INIT_ENUMCLASS_END + + // ----------------------------------------------------------------------------- +@@ -924,7 +928,11 @@ PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field\\Kind", + zend_declare_class_constant_long(field_kind_type, + "TYPE_SINT64", 11, 18 TSRMLS_CC); + const char *alias = "Google\\Protobuf\\Field_Kind"; ++#if PHP_VERSION_ID < 70300 + zend_register_class_alias_ex(alias, strlen(alias), field_kind_type TSRMLS_CC); ++#else ++ zend_register_class_alias_ex(alias, strlen(alias), field_kind_type, 1); ++#endif + PHP_PROTO_INIT_ENUMCLASS_END + + // ----------------------------------------------------------------------------- +diff --git a/php/ext/google/protobuf/protobuf.c b/php/ext/google/protobuf/protobuf.c +index da00302f2c..19cc5efb4e 100644 +--- a/php/ext/google/protobuf/protobuf.c ++++ b/php/ext/google/protobuf/protobuf.c +@@ -104,7 +104,7 @@ void add_def_obj(const void* def, PHP_PROTO_HASHTABLE_VALUE value) { + #if PHP_MAJOR_VERSION < 7 + Z_ADDREF_P(value); + #else +- ++GC_REFCOUNT(value); ++ GC_ADDREF(value); + #endif + add_to_table(upb_def_to_php_obj_map, def, value); + } +@@ -117,7 +117,7 @@ void add_ce_obj(const void* ce, PHP_PROTO_HASHTABLE_VALUE value) { + #if PHP_MAJOR_VERSION < 7 + Z_ADDREF_P(value); + #else +- ++GC_REFCOUNT(value); ++ GC_ADDREF(value); + #endif + add_to_table(ce_to_php_obj_map, ce, value); + } +@@ -134,7 +134,7 @@ void add_proto_obj(const char* proto, PHP_PROTO_HASHTABLE_VALUE value) { + #if PHP_MAJOR_VERSION < 7 + Z_ADDREF_P(value); + #else +- ++GC_REFCOUNT(value); ++ GC_ADDREF(value); + #endif + add_to_strtable(proto_to_php_obj_map, proto, strlen(proto), value); + } +@@ -235,7 +235,8 @@ static PHP_GSHUTDOWN_FUNCTION(protobuf) { + static void php_proto_hashtable_descriptor_release(zval* value) { + void* ptr = Z_PTR_P(value); + zend_object* object = *(zend_object**)ptr; +- if(--GC_REFCOUNT(object) == 0) { ++ GC_DELREF(object); ++ if(GC_REFCOUNT(object) == 0) { + zend_objects_store_del(object); + } + efree(ptr); +diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h +index 20035ab7ff..6193b28d73 100644 +--- a/php/ext/google/protobuf/protobuf.h ++++ b/php/ext/google/protobuf/protobuf.h +@@ -46,6 +46,11 @@ + // PHP7 Wrappers + // ---------------------------------------------------------------------------- + ++#if PHP_VERSION_ID < 70300 ++#define GC_ADDREF(h) ++GC_REFCOUNT(h) ++#define GC_DELREF(h) --GC_REFCOUNT(h) ++#endif ++ + #if PHP_MAJOR_VERSION < 7 + + #define php_proto_zend_literal const zend_literal* +@@ -496,7 +501,7 @@ static inline int php_proto_zend_hash_get_current_data_ex(HashTable* ht, + PHP_PROTO_HASHTABLE_VALUE WRAPPED_OBJ; \ + WRAPPED_OBJ = OBJ_CLASS_ENTRY->create_object(OBJ_CLASS_ENTRY); \ + OBJ = UNBOX_HASHTABLE_VALUE(OBJ_TYPE, WRAPPED_OBJ); \ +- --GC_REFCOUNT(WRAPPED_OBJ); ++ GC_DELREF(WRAPPED_OBJ); + + #define PHP_PROTO_CE_DECLARE zend_class_entry* + #define PHP_PROTO_CE_UNREF(ce) (ce) +diff --git a/php/ext/google/protobuf/storage.c b/php/ext/google/protobuf/storage.c +index e7910c85de..a60fbe393b 100644 +--- a/php/ext/google/protobuf/storage.c ++++ b/php/ext/google/protobuf/storage.c +@@ -200,7 +200,7 @@ bool native_slot_set_by_array(upb_fieldtype_t type, + } + #else + DEREF(memory, zval*) = value; +- ++GC_REFCOUNT(Z_OBJ_P(value)); ++ GC_ADDREF(Z_OBJ_P(value)); + #endif + break; + } +@@ -251,7 +251,7 @@ bool native_slot_set_by_map(upb_fieldtype_t type, const zend_class_entry* klass, + } + #else + DEREF(memory, zend_object*) = Z_OBJ_P(value); +- ++GC_REFCOUNT(Z_OBJ_P(value)); ++ GC_ADDREF(Z_OBJ_P(value)); + #endif + break; + } +@@ -428,7 +428,7 @@ void native_slot_get_by_map_value(upb_fieldtype_t type, const void* memory, + ZVAL_ZVAL(CACHED_PTR_TO_ZVAL_PTR(cache), value, 1, 0); + } + #else +- ++GC_REFCOUNT(*(zend_object**)memory); ++ GC_ADDREF(*(zend_object**)memory); + ZVAL_OBJ(cache, *(zend_object**)memory); + #endif + return; diff --git a/php-pecl-protobuf.spec b/php-pecl-protobuf.spec index 27d0767..40da3a8 100644 --- a/php-pecl-protobuf.spec +++ b/php-pecl-protobuf.spec @@ -26,12 +26,14 @@ Summary: Mechanism for serializing structured data Name: %{?sub_prefix}php-pecl-%{pecl_name} Version: 3.6.0 -Release: 1%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} +Release: 2%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} License: BSD Group: Development/Languages URL: http://pecl.php.net/package/%{pecl_name} Source0: http://pecl.php.net/get/%{pecl_name}-%{version}%{?prever}.tgz +Patch0: https://patch-diff.githubusercontent.com/raw/google/protobuf/pull/4873.patch + BuildRequires: %{?dtsprefix}gcc BuildRequires: %{?scl_prefix}php-devel >= 5.5.9 BuildRequires: %{?scl_prefix}php-pear @@ -97,6 +99,8 @@ sed -e 's/role="test"/role="src"/' \ cd NTS +%patch0 -p5 -b .pr4873 + # Sanity check, really often broken extver=$(sed -n '/#define PHP_PROTOBUF_VERSION/{s/.* "//;s/".*$//;p}' protobuf.h) if test "x${extver}" != "x%{version}%{?prever}"; then @@ -213,6 +217,10 @@ fi %changelog +* Fri Jul 6 2018 Remi Collet - 3.6.0-2 +- add patch for PHP 7.3 from + https://github.com/google/protobuf/pull/4873 + * Thu Jun 7 2018 Remi Collet - 3.6.0-1 - update to 3.6.0 -- cgit