From 63172605b508ccf5ee68df719737dc462d718a7b Mon Sep 17 00:00:00 2001 From: Sergey Son Date: Wed, 3 Apr 2019 14:03:14 +0300 Subject: [PATCH 1/4] Add support php7.3 --- .travis.yml | 2 ++ src/php_tarantool.h | 33 +++++++++++++++++++++++++++++++ src/tarantool.c | 2 +- src/tarantool_msgpack.c | 44 ++++++++++++++--------------------------- src/utils.c | 2 ++ 5 files changed, 53 insertions(+), 30 deletions(-) diff --git a/.travis.yml b/.travis.yml index e3ea022..5065f3f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ language: php php: - 7.0 - 7.1 + - 7.2 + - 7.3 - nightly python: diff --git a/src/php_tarantool.h b/src/php_tarantool.h index c225b85..6779129 100644 --- a/src/php_tarantool.h +++ b/src/php_tarantool.h @@ -29,6 +29,39 @@ # define smart_string_free_ex(...) smart_str_free_ex(__VA_ARGS__) #endif +#if PHP_VERSION_ID < 70300 +#define GC_ADDREF(p) ++GC_REFCOUNT(p) +#define GC_DELREF(p) --GC_REFCOUNT(p) +#define GC_SET_REFCOUNT(p, rc) GC_REFCOUNT(p) = rc +#endif + + +#if PHP_VERSION_ID < 70300 +#define ARRAY_PROTECT_RECURSION(data) \ + if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ + Z_ARRVAL_P(data)->u.v.nApplyCount++; + +#define ARRAY_UNPROTECT_RECURSION(data) \ + if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ + Z_ARRVAL_P(data)->u.v.nApplyCount--; + +#define ARRAY_IS_PROTECT_RECURSION(data) \ + (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1) + +#else +#define ARRAY_PROTECT_RECURSION(data) \ + if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ + GC_PROTECT_RECURSION(Z_ARRVAL_P(data)); + +#define ARRAY_UNPROTECT_RECURSION(data) \ + if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ + GC_UNPROTECT_RECURSION(Z_ARRVAL_P(data)); + +#define ARRAY_IS_PROTECT_RECURSION(data) \ + (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE) && GC_IS_RECURSIVE(Z_ARRVAL_P(data))) + +#endif + extern zend_module_entry tarantool_module_entry; #define phpext_tarantool_ptr &tarantool_module_entry diff --git a/src/tarantool.c b/src/tarantool.c index 30cccd9..0088afe 100644 --- a/src/tarantool.c +++ b/src/tarantool.c @@ -1150,7 +1150,7 @@ PHP_METHOD(Tarantool, __construct) { memset(&le, 0, sizeof(zend_resource)); le.type = php_tarantool_list_entry(); le.ptr = obj; - GC_REFCOUNT(&le) = 1; + GC_SET_REFCOUNT(&le, 1); assert(plist_id != NULL); if (zend_hash_update_mem(&EG(persistent_list), plist_id, diff --git a/src/tarantool_msgpack.c b/src/tarantool_msgpack.c index 817e4c5..5170470 100644 --- a/src/tarantool_msgpack.c +++ b/src/tarantool_msgpack.c @@ -122,16 +122,12 @@ void php_mp_pack_array_recursively(smart_string *str, zval *val) { size_t key_index = 0; for (; key_index < n; ++key_index) { data = zend_hash_index_find(ht, key_index); - if (!data || data == val || (Z_TYPE_P(data) == IS_ARRAY && - ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && - Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) { + if (!data || data == val || ARRAY_IS_PROTECT_RECURSION(data)) { php_mp_pack_nil(str); } else { - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount++; + ARRAY_PROTECT_RECURSION(data); php_mp_pack(str, data); - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount--; + ARRAY_UNPROTECT_RECURSION(data) } } } @@ -165,16 +161,12 @@ void php_mp_pack_hash_recursively(smart_string *str, zval *val) { break; } data = zend_hash_get_current_data_ex(ht, &pos); - if (!data || data == val || (Z_TYPE_P(data) == IS_ARRAY && - ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && - Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) { + if (!data || data == val || ARRAY_IS_PROTECT_RECURSION(data)) { php_mp_pack_nil(str); } else { - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount++; - php_mp_pack(str, data); - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount--; + ARRAY_PROTECT_RECURSION(data); + php_mp_pack(str, data); + ARRAY_UNPROTECT_RECURSION(data); } } } @@ -407,15 +399,12 @@ size_t php_mp_sizeof_array_recursively(zval *val) { for (; key_index < n; ++key_index) { data = zend_hash_index_find(ht, key_index); - if (!data || data == val || - (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) { + if (!data || data == val || ARRAY_IS_PROTECT_RECURSION(data)) { needed += php_mp_sizeof_nil(); } else { - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount++; - needed += php_mp_sizeof(data); - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount--; + ARRAY_PROTECT_RECURSION(data); + needed += php_mp_sizeof(data); + ARRAY_UNPROTECT_RECURSION(data); } } return needed; @@ -451,15 +440,12 @@ size_t php_mp_sizeof_hash_recursively(zval *val) { break; } data = zend_hash_get_current_data_ex(ht, &pos); - if (!data || data == val || - (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1)) { + if (!data || data == val || ARRAY_IS_PROTECT_RECURSION(data)) { needed += php_mp_sizeof_nil(); } else { - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount++; - needed += php_mp_sizeof(data); - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) - Z_ARRVAL_P(data)->u.v.nApplyCount--; + ARRAY_PROTECT_RECURSION(data); + needed += php_mp_sizeof(data); + ARRAY_UNPROTECT_RECURSION(data); } } return needed; diff --git a/src/utils.c b/src/utils.c index 45467af..2c743f4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -29,8 +29,10 @@ const char *tutils_op_to_string(zval *obj) { return "RESOURCE"; case(IS_REFERENCE): return "REFERENCE"; +#if PHP_VERSION_ID < 70300 case(IS_CONSTANT): return "CONSTANT"; +#endif case(IS_CONSTANT_AST): return "CONSTANT_AST"; case(IS_CALLABLE): From a116e7a455b767067bb1dee1093019332afe4121 Mon Sep 17 00:00:00 2001 From: Sergey Son Date: Thu, 4 Apr 2019 17:39:58 +0300 Subject: [PATCH 2/4] fix whitespaces --- src/php_tarantool.h | 20 ++++++++++---------- src/tarantool.c | 2 +- src/tarantool_msgpack.c | 18 +++++++++--------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/php_tarantool.h b/src/php_tarantool.h index 6779129..e3e2398 100644 --- a/src/php_tarantool.h +++ b/src/php_tarantool.h @@ -38,27 +38,27 @@ #if PHP_VERSION_ID < 70300 #define ARRAY_PROTECT_RECURSION(data) \ - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ - Z_ARRVAL_P(data)->u.v.nApplyCount++; + if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ + Z_ARRVAL_P(data)->u.v.nApplyCount++; #define ARRAY_UNPROTECT_RECURSION(data) \ - if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ - Z_ARRVAL_P(data)->u.v.nApplyCount--; + if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ + Z_ARRVAL_P(data)->u.v.nApplyCount--; #define ARRAY_IS_PROTECT_RECURSION(data) \ - (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1) + (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1) #else #define ARRAY_PROTECT_RECURSION(data) \ - if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ - GC_PROTECT_RECURSION(Z_ARRVAL_P(data)); + if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ + GC_PROTECT_RECURSION(Z_ARRVAL_P(data)); #define ARRAY_UNPROTECT_RECURSION(data) \ - if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ - GC_UNPROTECT_RECURSION(Z_ARRVAL_P(data)); + if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ + GC_UNPROTECT_RECURSION(Z_ARRVAL_P(data)); #define ARRAY_IS_PROTECT_RECURSION(data) \ - (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE) && GC_IS_RECURSIVE(Z_ARRVAL_P(data))) + (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE) && GC_IS_RECURSIVE(Z_ARRVAL_P(data))) #endif diff --git a/src/tarantool.c b/src/tarantool.c index 0088afe..c0a669a 100644 --- a/src/tarantool.c +++ b/src/tarantool.c @@ -1150,7 +1150,7 @@ PHP_METHOD(Tarantool, __construct) { memset(&le, 0, sizeof(zend_resource)); le.type = php_tarantool_list_entry(); le.ptr = obj; - GC_SET_REFCOUNT(&le, 1); + GC_SET_REFCOUNT(&le, 1); assert(plist_id != NULL); if (zend_hash_update_mem(&EG(persistent_list), plist_id, diff --git a/src/tarantool_msgpack.c b/src/tarantool_msgpack.c index 5170470..e0007fe 100644 --- a/src/tarantool_msgpack.c +++ b/src/tarantool_msgpack.c @@ -164,9 +164,9 @@ void php_mp_pack_hash_recursively(smart_string *str, zval *val) { if (!data || data == val || ARRAY_IS_PROTECT_RECURSION(data)) { php_mp_pack_nil(str); } else { - ARRAY_PROTECT_RECURSION(data); - php_mp_pack(str, data); - ARRAY_UNPROTECT_RECURSION(data); + ARRAY_PROTECT_RECURSION(data); + php_mp_pack(str, data); + ARRAY_UNPROTECT_RECURSION(data); } } } @@ -402,9 +402,9 @@ size_t php_mp_sizeof_array_recursively(zval *val) { if (!data || data == val || ARRAY_IS_PROTECT_RECURSION(data)) { needed += php_mp_sizeof_nil(); } else { - ARRAY_PROTECT_RECURSION(data); - needed += php_mp_sizeof(data); - ARRAY_UNPROTECT_RECURSION(data); + ARRAY_PROTECT_RECURSION(data); + needed += php_mp_sizeof(data); + ARRAY_UNPROTECT_RECURSION(data); } } return needed; @@ -443,9 +443,9 @@ size_t php_mp_sizeof_hash_recursively(zval *val) { if (!data || data == val || ARRAY_IS_PROTECT_RECURSION(data)) { needed += php_mp_sizeof_nil(); } else { - ARRAY_PROTECT_RECURSION(data); - needed += php_mp_sizeof(data); - ARRAY_UNPROTECT_RECURSION(data); + ARRAY_PROTECT_RECURSION(data); + needed += php_mp_sizeof(data); + ARRAY_UNPROTECT_RECURSION(data); } } return needed; From 0ebcaf6466c9156cb65df98ef49b221826fa90ce Mon Sep 17 00:00:00 2001 From: Sergey Son Date: Fri, 5 Apr 2019 07:40:55 +0300 Subject: [PATCH 3/4] add space to define in #if #else block --- src/php_tarantool.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/php_tarantool.h b/src/php_tarantool.h index e3e2398..635e546 100644 --- a/src/php_tarantool.h +++ b/src/php_tarantool.h @@ -37,27 +37,27 @@ #if PHP_VERSION_ID < 70300 -#define ARRAY_PROTECT_RECURSION(data) \ +# define ARRAY_PROTECT_RECURSION(data) \ if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ Z_ARRVAL_P(data)->u.v.nApplyCount++; -#define ARRAY_UNPROTECT_RECURSION(data) \ +# define ARRAY_UNPROTECT_RECURSION(data) \ if (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data))) \ Z_ARRVAL_P(data)->u.v.nApplyCount--; -#define ARRAY_IS_PROTECT_RECURSION(data) \ +# define ARRAY_IS_PROTECT_RECURSION(data) \ (Z_TYPE_P(data) == IS_ARRAY && ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data)) && Z_ARRVAL_P(data)->u.v.nApplyCount > 1) #else -#define ARRAY_PROTECT_RECURSION(data) \ +# define ARRAY_PROTECT_RECURSION(data) \ if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ GC_PROTECT_RECURSION(Z_ARRVAL_P(data)); -#define ARRAY_UNPROTECT_RECURSION(data) \ +# define ARRAY_UNPROTECT_RECURSION(data) \ if (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE)) \ GC_UNPROTECT_RECURSION(Z_ARRVAL_P(data)); -#define ARRAY_IS_PROTECT_RECURSION(data) \ +# define ARRAY_IS_PROTECT_RECURSION(data) \ (Z_TYPE_P(data) == IS_ARRAY && !(GC_FLAGS(Z_ARRVAL_P(data)) & GC_IMMUTABLE) && GC_IS_RECURSIVE(Z_ARRVAL_P(data))) #endif From b7d93e45193b1f56af1ed98addaeb1f22d85c5d1 Mon Sep 17 00:00:00 2001 From: Sergey Son Date: Fri, 5 Apr 2019 07:41:36 +0300 Subject: [PATCH 4/4] revert changes from .travis.yml --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5065f3f..e3ea022 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,6 @@ language: php php: - 7.0 - 7.1 - - 7.2 - - 7.3 - nightly python: