1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
|
From 3ec00a36190393f2c865c67737309391cf280b3b Mon Sep 17 00:00:00 2001
From: Remi Collet <remi@remirepo.net>
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;
|