Skip to content

Commit 82431c4

Browse files
Sergey SonTotktonada
Sergey Son
authored andcommitted
Support PHP 7.3
See [1] for the list of changes of the PHP internal API. The following items are relevant here: c. Array/Object recursion protection e. AST and IS_CONSTANT f. GC_REFCOUNT() [1]: https://github.com/php/php-src/blob/PHP-7.3.16/UPGRADING.INTERNALS Fixes #139. @Totktonada: style and naming fixes.
1 parent 31591c0 commit 82431c4

File tree

4 files changed

+71
-27
lines changed

4 files changed

+71
-27
lines changed

src/php_tarantool.h

+56
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,62 @@
2929
# define smart_string_free_ex(...) smart_str_free_ex(__VA_ARGS__)
3030
#endif
3131

32+
#if PHP_VERSION_ID < 70300
33+
# define GC_SET_REFCOUNT(p, rc) do { \
34+
GC_REFCOUNT((p)) = (rc); \
35+
} while(0)
36+
#endif /* PHP_VERSION_ID < 70300 */
37+
38+
#if PHP_VERSION_ID < 70300
39+
40+
# define ARRAY_PROTECT_RECURSION(data) do { \
41+
if (Z_TYPE_P((data)) == IS_ARRAY && \
42+
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P((data)))) \
43+
{ \
44+
Z_ARRVAL_P((data))->u.v.nApplyCount++; \
45+
} \
46+
} while(0)
47+
48+
# define ARRAY_UNPROTECT_RECURSION(data) do { \
49+
if (Z_TYPE_P((data)) == IS_ARRAY && \
50+
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P((data)))) \
51+
{ \
52+
Z_ARRVAL_P((data))->u.v.nApplyCount--; \
53+
} \
54+
} while(0)
55+
56+
# define ARRAY_IS_RECURSIVE(data) ( \
57+
Z_TYPE_P(data) == IS_ARRAY && \
58+
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P((data))) && \
59+
Z_ARRVAL_P((data))->u.v.nApplyCount > 1 \
60+
)
61+
62+
#else /* PHP_VERSION_ID < 70300 */
63+
64+
# define ARRAY_PROTECT_RECURSION(data) do { \
65+
if (Z_TYPE_P((data)) == IS_ARRAY && \
66+
!(GC_FLAGS(Z_ARRVAL_P((data))) & GC_IMMUTABLE)) \
67+
{ \
68+
GC_PROTECT_RECURSION(Z_ARRVAL_P((data))); \
69+
} \
70+
} while(0)
71+
72+
# define ARRAY_UNPROTECT_RECURSION(data) do { \
73+
if (Z_TYPE_P((data)) == IS_ARRAY && \
74+
!(GC_FLAGS(Z_ARRVAL_P((data))) & GC_IMMUTABLE)) \
75+
{ \
76+
GC_UNPROTECT_RECURSION(Z_ARRVAL_P((data))); \
77+
} \
78+
} while(0)
79+
80+
# define ARRAY_IS_RECURSIVE(data) ( \
81+
Z_TYPE_P((data)) == IS_ARRAY && \
82+
!(GC_FLAGS(Z_ARRVAL_P((data))) & GC_IMMUTABLE) && \
83+
GC_IS_RECURSIVE(Z_ARRVAL_P((data))) \
84+
)
85+
86+
#endif /* !(PHP_VERSION_ID < 70300)) */
87+
3288
extern zend_module_entry tarantool_module_entry;
3389
#define phpext_tarantool_ptr &tarantool_module_entry
3490

src/tarantool.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1155,7 +1155,7 @@ PHP_METHOD(Tarantool, __construct) {
11551155
memset(&le, 0, sizeof(zend_resource));
11561156
le.type = php_tarantool_list_entry();
11571157
le.ptr = obj;
1158-
GC_REFCOUNT(&le) = 1;
1158+
GC_SET_REFCOUNT(&le, 1);
11591159

11601160
assert(plist_id != NULL);
11611161
if (zend_hash_update_mem(&EG(persistent_list), plist_id,

src/tarantool_msgpack.c

+12-26
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,12 @@ void php_mp_pack_array_recursively(smart_string *str, zval *val) {
122122
size_t key_index = 0;
123123
for (; key_index < n; ++key_index) {
124124
data = zend_hash_index_find(ht, key_index);
125-
if (!data || data == val || (Z_TYPE_P(data) == IS_ARRAY &&
126-
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) &&
127-
Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) {
125+
if (!data || data == val || ARRAY_IS_RECURSIVE(data)) {
128126
php_mp_pack_nil(str);
129127
} else {
130-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
131-
Z_ARRVAL_P(data)->u.v.nApplyCount++;
128+
ARRAY_PROTECT_RECURSION(data);
132129
php_mp_pack(str, data);
133-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
134-
Z_ARRVAL_P(data)->u.v.nApplyCount--;
130+
ARRAY_UNPROTECT_RECURSION(data);
135131
}
136132
}
137133
}
@@ -165,16 +161,12 @@ void php_mp_pack_hash_recursively(smart_string *str, zval *val) {
165161
break;
166162
}
167163
data = zend_hash_get_current_data_ex(ht, &pos);
168-
if (!data || data == val || (Z_TYPE_P(data) == IS_ARRAY &&
169-
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) &&
170-
Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) {
164+
if (!data || data == val || ARRAY_IS_RECURSIVE(data)) {
171165
php_mp_pack_nil(str);
172166
} else {
173-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
174-
Z_ARRVAL_P(data)->u.v.nApplyCount++;
167+
ARRAY_PROTECT_RECURSION(data);
175168
php_mp_pack(str, data);
176-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
177-
Z_ARRVAL_P(data)->u.v.nApplyCount--;
169+
ARRAY_UNPROTECT_RECURSION(data);
178170
}
179171
}
180172
}
@@ -407,15 +399,12 @@ size_t php_mp_sizeof_array_recursively(zval *val) {
407399

408400
for (; key_index < n; ++key_index) {
409401
data = zend_hash_index_find(ht, key_index);
410-
if (!data || data == val ||
411-
(Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) {
402+
if (!data || data == val || ARRAY_IS_RECURSIVE(data)) {
412403
needed += php_mp_sizeof_nil();
413404
} else {
414-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
415-
Z_ARRVAL_P(data)->u.v.nApplyCount++;
405+
ARRAY_PROTECT_RECURSION(data);
416406
needed += php_mp_sizeof(data);
417-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
418-
Z_ARRVAL_P(data)->u.v.nApplyCount--;
407+
ARRAY_UNPROTECT_RECURSION(data);
419408
}
420409
}
421410
return needed;
@@ -451,15 +440,12 @@ size_t php_mp_sizeof_hash_recursively(zval *val) {
451440
break;
452441
}
453442
data = zend_hash_get_current_data_ex(ht, &pos);
454-
if (!data || data == val ||
455-
(Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) {
443+
if (!data || data == val || ARRAY_IS_RECURSIVE(data)) {
456444
needed += php_mp_sizeof_nil();
457445
} else {
458-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
459-
Z_ARRVAL_P(data)->u.v.nApplyCount++;
446+
ARRAY_PROTECT_RECURSION(data);
460447
needed += php_mp_sizeof(data);
461-
if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)))
462-
Z_ARRVAL_P(data)->u.v.nApplyCount--;
448+
ARRAY_UNPROTECT_RECURSION(data);
463449
}
464450
}
465451
return needed;

src/utils.c

+2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ const char *tutils_op_to_string(zval *obj) {
2929
return "RESOURCE";
3030
case(IS_REFERENCE):
3131
return "REFERENCE";
32+
#if PHP_VERSION_ID < 70300
3233
case(IS_CONSTANT):
3334
return "CONSTANT";
35+
#endif
3436
case(IS_CONSTANT_AST):
3537
return "CONSTANT_AST";
3638
case(IS_CALLABLE):

0 commit comments

Comments
 (0)