Skip to content

Commit 9456e1b

Browse files
authored
Merge pull request phpredis#1002 from yatsukhnenko/develop
WIP: php7 compatibility
2 parents 73049f4 + f5024a5 commit 9456e1b

File tree

4 files changed

+88
-97
lines changed

4 files changed

+88
-97
lines changed

common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ static int (*_php_var_unserialize)(zval **, const unsigned char **, const unsign
308308
#define php_var_unserialize(rval, p, max, var_hash) _php_var_unserialize(&rval, p, max, var_hash TSRMLS_CC)
309309

310310
#else
311+
#include <zend_smart_str.h>
311312
#include <ext/standard/php_smart_string.h>
312313
#endif
313314

library.c

Lines changed: 56 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -387,10 +387,9 @@ PHP_REDIS_API int redis_unsubscribe_response(INTERNAL_FUNCTION_PARAMETERS,
387387
void *ctx)
388388
{
389389
subscribeContext *sctx = (subscribeContext*)ctx;
390-
zval *z_chan, *z_ret, z_resp;
390+
zval *z_chan, zv, *z_ret = &zv, z_resp;
391391
int i;
392392

393-
MAKE_STD_ZVAL(z_ret);
394393
array_init(z_ret);
395394

396395
for (i = 0; i < sctx->argc; i++) {
@@ -399,7 +398,6 @@ PHP_REDIS_API int redis_unsubscribe_response(INTERNAL_FUNCTION_PARAMETERS,
399398
(z_chan = zend_hash_index_find(Z_ARRVAL(z_resp), 1)) == NULL
400399
) {
401400
zval_dtor(z_ret);
402-
efree(z_ret);
403401
return -1;
404402
}
405403

@@ -1204,10 +1202,9 @@ static void array_zip_values_and_scores(RedisSock *redis_sock, zval *z_tab,
12041202
int decode TSRMLS_DC)
12051203
{
12061204

1207-
zval *z_ret;
1205+
zval zv, *z_ret = &zv;
12081206
HashTable *keytable;
12091207

1210-
MAKE_STD_ZVAL(z_ret);
12111208
array_init(z_ret);
12121209
keytable = Z_ARRVAL_P(z_tab);
12131210

@@ -1255,11 +1252,7 @@ static void array_zip_values_and_scores(RedisSock *redis_sock, zval *z_tab,
12551252

12561253
/* replace */
12571254
zval_dtor(z_tab);
1258-
*z_tab = *z_ret;
1259-
zval_copy_ctor(z_tab);
1260-
zval_dtor(z_ret);
1261-
1262-
efree(z_ret);
1255+
ZVAL_ZVAL(z_tab, z_ret, 1, 0);
12631256
}
12641257

12651258
static int
@@ -1268,7 +1261,6 @@ redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
12681261
{
12691262
char inbuf[1024];
12701263
int numElems;
1271-
zval *z_multi_result;
12721264

12731265
if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) {
12741266
return -1;
@@ -1288,7 +1280,12 @@ redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
12881280
return -1;
12891281
}
12901282
numElems = atoi(inbuf+1);
1283+
#if (PHP_MAJOR_VERSION < 7)
1284+
zval *z_multi_result;
12911285
MAKE_STD_ZVAL(z_multi_result);
1286+
#else
1287+
zval zv, *z_multi_result = &zv;
1288+
#endif
12921289
array_init(z_multi_result); /* pre-allocate array for multi's results. */
12931290

12941291
/* Grab our key, value, key, value array */
@@ -1301,10 +1298,7 @@ redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
13011298
IF_MULTI_OR_PIPELINE() {
13021299
add_next_index_zval(z_tab, z_multi_result);
13031300
} else {
1304-
*return_value = *z_multi_result;
1305-
zval_copy_ctor(return_value);
1306-
zval_dtor(z_multi_result);
1307-
efree(z_multi_result);
1301+
RETVAL_ZVAL(z_multi_result, 0, 1);
13081302
}
13091303

13101304
return 0;
@@ -1753,7 +1747,6 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS,
17531747
{
17541748
char inbuf[1024];
17551749
int numElems, err_len;
1756-
zval *z_multi_result;
17571750

17581751
if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) {
17591752
return -1;
@@ -1778,7 +1771,12 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS,
17781771
return -1;
17791772
}
17801773
numElems = atoi(inbuf+1);
1774+
#if (PHP_MAJOR_VERSION < 7)
1775+
zval *z_multi_result;
17811776
MAKE_STD_ZVAL(z_multi_result);
1777+
#else
1778+
zval zv, *z_multi_result = &zv;
1779+
#endif
17821780
array_init(z_multi_result); /* pre-allocate array for multi's results. */
17831781

17841782
redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
@@ -1787,8 +1785,7 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS,
17871785
IF_MULTI_OR_PIPELINE() {
17881786
add_next_index_zval(z_tab, z_multi_result);
17891787
} else {
1790-
*return_value = *z_multi_result;
1791-
efree(z_multi_result);
1788+
RETVAL_ZVAL(z_multi_result, 0, 1);
17921789
}
17931790
/*zval_copy_ctor(return_value); */
17941791
return 0;
@@ -1800,7 +1797,6 @@ PHP_REDIS_API int redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock
18001797
{
18011798
char inbuf[1024];
18021799
int numElems, err_len;
1803-
zval *z_multi_result;
18041800

18051801
if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) {
18061802
return -1;
@@ -1824,7 +1820,12 @@ PHP_REDIS_API int redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock
18241820
return -1;
18251821
}
18261822
numElems = atoi(inbuf+1);
1823+
#if (PHP_MAJOR_VERSION < 7)
1824+
zval *z_multi_result;
18271825
MAKE_STD_ZVAL(z_multi_result);
1826+
#else
1827+
zval zv, *z_multi_result = &zv;
1828+
#endif
18281829
array_init(z_multi_result); /* pre-allocate array for multi's results. */
18291830

18301831
redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
@@ -1833,8 +1834,7 @@ PHP_REDIS_API int redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock
18331834
IF_MULTI_OR_PIPELINE() {
18341835
add_next_index_zval(z_tab, z_multi_result);
18351836
} else {
1836-
*return_value = *z_multi_result;
1837-
efree(z_multi_result);
1837+
RETVAL_ZVAL(z_multi_result, 0, 1);
18381838
}
18391839
/*zval_copy_ctor(return_value); */
18401840
return 0;
@@ -1881,7 +1881,6 @@ PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSoc
18811881
char inbuf[1024], *response;
18821882
int response_len;
18831883
int i, numElems;
1884-
zval *z_multi_result;
18851884

18861885
zval *z_keys = ctx;
18871886

@@ -1903,7 +1902,12 @@ PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSoc
19031902
return -1;
19041903
}
19051904
numElems = atoi(inbuf+1);
1905+
#if (PHP_MAJOR_VERSION < 7)
1906+
zval *z_multi_result;
19061907
MAKE_STD_ZVAL(z_multi_result);
1908+
#else
1909+
zval zv, *z_multi_result = &zv;
1910+
#endif
19071911
array_init(z_multi_result); /* pre-allocate array for multi's results. */
19081912

19091913
for(i = 0; i < numElems; ++i) {
@@ -1926,11 +1930,7 @@ PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSoc
19261930
IF_MULTI_OR_PIPELINE() {
19271931
add_next_index_zval(z_tab, z_multi_result);
19281932
} else {
1929-
*return_value = *z_multi_result;
1930-
zval_copy_ctor(return_value);
1931-
INIT_PZVAL(return_value);
1932-
zval_dtor(z_multi_result);
1933-
efree(z_multi_result);
1933+
RETVAL_ZVAL(z_multi_result, 0, 1);
19341934
}
19351935
return 0;
19361936
}
@@ -1996,27 +1996,25 @@ redis_serialize(RedisSock *redis_sock, zval *z, char **val, int *val_len
19961996
case IS_STRING:
19971997
*val = Z_STRVAL_P(z);
19981998
*val_len = Z_STRLEN_P(z);
1999-
return 0;
1999+
break;
20002000

20012001
case IS_OBJECT:
20022002
*val = "Object";
20032003
*val_len = 6;
2004-
return 0;
2004+
break;
20052005

20062006
case IS_ARRAY:
20072007
*val = "Array";
20082008
*val_len = 5;
2009-
return 0;
2009+
break;
20102010

20112011
default: /* copy */
2012-
z_copy = *z;
2013-
zval_copy_ctor(&z_copy);
2012+
ZVAL_ZVAL(&z_copy, z, 1, 0);
20142013
convert_to_string(&z_copy);
20152014
*val = Z_STRVAL(z_copy);
20162015
*val_len = Z_STRLEN(z_copy);
20172016
}
2018-
return 1;
2019-
2017+
break;
20202018
case REDIS_SERIALIZER_PHP:
20212019

20222020
#if ZEND_MODULE_API_NO >= 20100000
@@ -2226,7 +2224,7 @@ redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type,
22262224
*/
22272225
PHP_REDIS_API int
22282226
redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type,
2229-
zval **z_ret TSRMLS_DC)
2227+
zval *z_ret TSRMLS_DC)
22302228
{
22312229
// Buffer to read our single line reply
22322230
char inbuf[1024];
@@ -2247,34 +2245,34 @@ redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type,
22472245
redis_sock_set_err(redis_sock, inbuf, line_size);
22482246

22492247
/* Set our response to FALSE */
2250-
ZVAL_FALSE(*z_ret);
2248+
ZVAL_FALSE(z_ret);
22512249
} else {
22522250
/* Set our response to TRUE */
2253-
ZVAL_TRUE(*z_ret);
2251+
ZVAL_TRUE(z_ret);
22542252
}
22552253

22562254
return 0;
22572255
}
22582256

22592257
PHP_REDIS_API int
2260-
redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret
2258+
redis_read_variant_bulk(RedisSock *redis_sock, int size, zval *z_ret
22612259
TSRMLS_DC)
22622260
{
22632261
// Attempt to read the bulk reply
22642262
char *bulk_resp = redis_sock_read_bulk_reply(redis_sock, size TSRMLS_CC);
22652263

22662264
/* Set our reply to FALSE on failure, and the string on success */
22672265
if(bulk_resp == NULL) {
2268-
ZVAL_FALSE(*z_ret);
2266+
ZVAL_FALSE(z_ret);
22692267
return -1;
22702268
}
2271-
ZVAL_STRINGL(*z_ret, bulk_resp, size);
2269+
ZVAL_STRINGL(z_ret, bulk_resp, size);
22722270
efree(bulk_resp);
22732271
return 0;
22742272
}
22752273

22762274
PHP_REDIS_API int
2277-
redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret
2275+
redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval *z_ret
22782276
TSRMLS_DC)
22792277
{
22802278
long reply_info;
@@ -2298,29 +2296,29 @@ redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret
22982296
case TYPE_ERR:
22992297
case TYPE_LINE:
23002298
ALLOC_INIT_ZVAL(z_subelem);
2301-
redis_read_variant_line(redis_sock, reply_type, &z_subelem
2299+
redis_read_variant_line(redis_sock, reply_type, z_subelem
23022300
TSRMLS_CC);
2303-
add_next_index_zval(*z_ret, z_subelem);
2301+
add_next_index_zval(z_ret, z_subelem);
23042302
break;
23052303
case TYPE_INT:
23062304
// Add our long value
2307-
add_next_index_long(*z_ret, reply_info);
2305+
add_next_index_long(z_ret, reply_info);
23082306
break;
23092307
case TYPE_BULK:
23102308
// Init a zval for our bulk response, read and add it
23112309
ALLOC_INIT_ZVAL(z_subelem);
2312-
redis_read_variant_bulk(redis_sock, reply_info, &z_subelem
2310+
redis_read_variant_bulk(redis_sock, reply_info, z_subelem
23132311
TSRMLS_CC);
2314-
add_next_index_zval(*z_ret, z_subelem);
2312+
add_next_index_zval(z_ret, z_subelem);
23152313
break;
23162314
case TYPE_MULTIBULK:
23172315
// Construct an array for our sub element, and add it,
23182316
// and recurse
23192317
ALLOC_INIT_ZVAL(z_subelem);
23202318
array_init(z_subelem);
2321-
add_next_index_zval(*z_ret, z_subelem);
2319+
add_next_index_zval(z_ret, z_subelem);
23222320
redis_read_multibulk_recursive(redis_sock, reply_info,
2323-
&z_subelem TSRMLS_CC);
2321+
z_subelem TSRMLS_CC);
23242322
break;
23252323
default:
23262324
// Stop the compiler from whinging
@@ -2342,28 +2340,30 @@ redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
23422340
REDIS_REPLY_TYPE reply_type;
23432341
long reply_info;
23442342
//char *bulk_resp;
2345-
zval *z_ret;
23462343

23472344
// Attempt to read our header
23482345
if(redis_read_reply_type(redis_sock,&reply_type,&reply_info TSRMLS_CC) < 0)
23492346
{
23502347
return -1;
23512348
}
23522349

2353-
/* Our return ZVAL */
2354-
MAKE_STD_ZVAL(z_ret);
2355-
2350+
#if (PHP_MAJOR_VERSION < 7)
2351+
zval *z_ret;
2352+
MAKE_STD_ZVAL(z_ret);
2353+
#else
2354+
zval zv, *z_ret = &zv;
2355+
#endif
23562356
/* Switch based on our top level reply type */
23572357
switch(reply_type) {
23582358
case TYPE_ERR:
23592359
case TYPE_LINE:
2360-
redis_read_variant_line(redis_sock, reply_type, &z_ret TSRMLS_CC);
2360+
redis_read_variant_line(redis_sock, reply_type, z_ret TSRMLS_CC);
23612361
break;
23622362
case TYPE_INT:
23632363
ZVAL_LONG(z_ret, reply_info);
23642364
break;
23652365
case TYPE_BULK:
2366-
redis_read_variant_bulk(redis_sock, reply_info, &z_ret TSRMLS_CC);
2366+
redis_read_variant_bulk(redis_sock, reply_info, z_ret TSRMLS_CC);
23672367
break;
23682368
case TYPE_MULTIBULK:
23692369
/* Initialize an array for our multi-bulk response */
@@ -2372,14 +2372,12 @@ redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
23722372
// If we've got more than zero elements, parse our multi bulk
23732373
// response recursively
23742374
if(reply_info > -1) {
2375-
redis_read_multibulk_recursive(redis_sock, reply_info, &z_ret
2375+
redis_read_multibulk_recursive(redis_sock, reply_info, z_ret
23762376
TSRMLS_CC);
23772377
}
23782378
break;
23792379
default:
23802380
// Protocol error
2381-
zval_dtor(z_ret);
2382-
efree(z_ret);
23832381
zend_throw_exception_ex(redis_exception_ce, 0 TSRMLS_CC,
23842382
"protocol error, got '%c' as reply-type byte\n", reply_type);
23852383
return FAILURE;
@@ -2389,10 +2387,7 @@ redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
23892387
add_next_index_zval(z_tab, z_ret);
23902388
} else {
23912389
/* Set our return value */
2392-
*return_value = *z_ret;
2393-
zval_copy_ctor(return_value);
2394-
zval_dtor(z_ret);
2395-
efree(z_ret);
2390+
RETVAL_ZVAL(z_ret, 0, 1);
23962391
}
23972392

23982393
/* Success */

library.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ redis_unserialize(RedisSock *redis_sock, const char *val, int val_len, zval **re
7777
*/
7878

7979
PHP_REDIS_API int redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, long *reply_info TSRMLS_DC);
80-
PHP_REDIS_API int redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval **z_ret TSRMLS_DC);
81-
PHP_REDIS_API int redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret TSRMLS_DC);
82-
PHP_REDIS_API int redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret TSRMLS_DC);
80+
PHP_REDIS_API int redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval *z_ret TSRMLS_DC);
81+
PHP_REDIS_API int redis_read_variant_bulk(RedisSock *redis_sock, int size, zval *z_ret TSRMLS_DC);
82+
PHP_REDIS_API int redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval *z_ret TSRMLS_DC);
8383
PHP_REDIS_API int redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
8484

8585
PHP_REDIS_API void redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);

0 commit comments

Comments
 (0)