@@ -97,16 +97,10 @@ static void redis_array_free(RedisArray *ra) {
9797 efree (ra -> hosts );
9898
9999 /* delete hash function */
100- if (ra -> z_fun ) {
101- zval_dtor (ra -> z_fun );
102- efree (ra -> z_fun );
103- }
100+ zval_dtor (& ra -> z_fun );
104101
105102 /* Distributor */
106- if (ra -> z_dist ) {
107- zval_dtor (ra -> z_dist );
108- efree (ra -> z_dist );
109- }
103+ zval_dtor (& ra -> z_dist );
110104
111105 /* Delete pur commands */
112106 zval_dtor (& ra -> z_pure_cmds );
@@ -212,7 +206,7 @@ uint32_t rcrc32(const char *s, size_t sz) {
212206 Public constructor */
213207PHP_METHOD (RedisArray , __construct )
214208{
215- zval * z0 , * z_fun = NULL , * z_dist = NULL , * zpData , * z_opts = NULL ;
209+ zval * z0 , z_fun , z_dist , * zpData , * z_opts = NULL ;
216210 RedisArray * ra = NULL ;
217211 zend_bool b_index = 0 , b_autorehash = 0 , b_pconnect = 0 ;
218212 HashTable * hPrev = NULL , * hOpts = NULL ;
@@ -240,17 +234,17 @@ PHP_METHOD(RedisArray, __construct)
240234 }
241235
242236 /* extract function name. */
243- if ((zpData = zend_hash_str_find (hOpts , "function" , sizeof ("function" ) - 1 )) ! = NULL ) {
244- MAKE_STD_ZVAL ( z_fun );
245- * z_fun = * zpData ;
246- zval_copy_ctor ( z_fun );
237+ if ((zpData = zend_hash_str_find (hOpts , "function" , sizeof ("function" ) - 1 )) = = NULL ) {
238+ ZVAL_NULL ( & z_fun );
239+ } else {
240+ ZVAL_ZVAL ( & z_fun , zpData , 1 , 0 );
247241 }
248242
249243 /* extract function name. */
250- if ((zpData = zend_hash_str_find (hOpts , "distributor" , sizeof ("distributor" ) - 1 )) ! = NULL ) {
251- MAKE_STD_ZVAL ( z_dist );
252- * z_dist = * zpData ;
253- zval_copy_ctor ( z_dist );
244+ if ((zpData = zend_hash_str_find (hOpts , "distributor" , sizeof ("distributor" ) - 1 )) = = NULL ) {
245+ ZVAL_NULL ( & z_dist );
246+ } else {
247+ ZVAL_ZVAL ( & z_dist , zpData , 1 , 0 );
254248 }
255249
256250 /* extract index option. */
@@ -308,13 +302,15 @@ PHP_METHOD(RedisArray, __construct)
308302 break ;
309303
310304 case IS_ARRAY :
311- ra = ra_make_array (Z_ARRVAL_P (z0 ), z_fun , z_dist , hPrev , b_index , b_pconnect , l_retry_interval , b_lazy_connect , d_connect_timeout TSRMLS_CC );
305+ ra = ra_make_array (Z_ARRVAL_P (z0 ), & z_fun , & z_dist , hPrev , b_index , b_pconnect , l_retry_interval , b_lazy_connect , d_connect_timeout TSRMLS_CC );
312306 break ;
313307
314308 default :
315309 WRONG_PARAM_COUNT ;
316310 break ;
317311 }
312+ zval_dtor (& z_dist );
313+ zval_dtor (& z_fun );
318314
319315 if (ra ) {
320316 ra -> auto_rehash = b_autorehash ;
@@ -522,7 +518,7 @@ PHP_METHOD(RedisArray, _instance)
522518
523519PHP_METHOD (RedisArray , _function )
524520{
525- zval * object ;
521+ zval * object , * z_fun ;
526522 RedisArray * ra ;
527523
528524 if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "O" ,
@@ -534,17 +530,13 @@ PHP_METHOD(RedisArray, _function)
534530 RETURN_FALSE ;
535531 }
536532
537- if (ra -> z_fun ) {
538- * return_value = * ra -> z_fun ;
539- zval_copy_ctor (return_value );
540- } else {
541- RETURN_NULL ();
542- }
533+ z_fun = & ra -> z_fun ;
534+ RETURN_ZVAL (z_fun , 1 , 0 );
543535}
544536
545537PHP_METHOD (RedisArray , _distributor )
546538{
547- zval * object ;
539+ zval * object , * z_dist ;
548540 RedisArray * ra ;
549541
550542 if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "O" ,
@@ -556,12 +548,8 @@ PHP_METHOD(RedisArray, _distributor)
556548 RETURN_FALSE ;
557549 }
558550
559- if (ra -> z_fun ) {
560- * return_value = * ra -> z_fun ;
561- zval_copy_ctor (return_value );
562- } else {
563- RETURN_NULL ();
564- }
551+ z_dist = & ra -> z_dist ;
552+ RETURN_ZVAL (z_dist , 1 , 0 );
565553}
566554
567555PHP_METHOD (RedisArray , _rehash )
@@ -589,7 +577,7 @@ PHP_METHOD(RedisArray, _rehash)
589577
590578static void multihost_distribute (INTERNAL_FUNCTION_PARAMETERS , const char * method_name )
591579{
592- zval * object , z_fun , * z_tmp ;
580+ zval * object , z_fun ;
593581 int i ;
594582 RedisArray * ra ;
595583
@@ -607,8 +595,10 @@ static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *metho
607595
608596 array_init (return_value );
609597 for (i = 0 ; i < ra -> count ; ++ i ) {
610-
598+ zval zv , * z_tmp = & zv ;
599+ #if (PHP_MAJOR_VERSION < 7 )
611600 MAKE_STD_ZVAL (z_tmp );
601+ #endif
612602
613603 /* Call each node in turn */
614604 call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 0 , NULL );
@@ -651,7 +641,7 @@ PHP_METHOD(RedisArray, bgsave)
651641
652642PHP_METHOD (RedisArray , keys )
653643{
654- zval * object , z_args [1 ], * z_tmp , z_fun ;
644+ zval * object , z_args [1 ], z_fun ;
655645 RedisArray * ra ;
656646 char * pattern ;
657647 int pattern_len , i ;
@@ -679,8 +669,11 @@ PHP_METHOD(RedisArray, keys)
679669
680670 /* Iterate our RedisArray nodes */
681671 for (i = 0 ; i < ra -> count ; ++ i ) {
672+ zval zv , * z_tmp = & zv ;
673+ #if (PHP_MAJOR_VERSION < 7 )
682674 /* Return for this node */
683675 MAKE_STD_ZVAL (z_tmp );
676+ #endif
684677
685678 /* Call KEYS on each node */
686679 call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 1 , z_args );
@@ -694,7 +687,7 @@ PHP_METHOD(RedisArray, keys)
694687
695688PHP_METHOD (RedisArray , getOption )
696689{
697- zval * object , z_fun , * z_tmp , z_args [1 ];
690+ zval * object , z_fun , z_args [1 ];
698691 int i ;
699692 RedisArray * ra ;
700693 long opt ;
@@ -716,8 +709,10 @@ PHP_METHOD(RedisArray, getOption)
716709
717710 array_init (return_value );
718711 for (i = 0 ; i < ra -> count ; ++ i ) {
719-
712+ zval zv , * z_tmp = & zv ;
713+ #if (PHP_MAJOR_VERSION < 7 )
720714 MAKE_STD_ZVAL (z_tmp );
715+ #endif
721716
722717 /* Call each node in turn */
723718 call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 1 , z_args );
@@ -729,7 +724,7 @@ PHP_METHOD(RedisArray, getOption)
729724
730725PHP_METHOD (RedisArray , setOption )
731726{
732- zval * object , z_fun , * z_tmp , z_args [2 ];
727+ zval * object , z_fun , z_args [2 ];
733728 int i ;
734729 RedisArray * ra ;
735730 long opt ;
@@ -754,8 +749,10 @@ PHP_METHOD(RedisArray, setOption)
754749
755750 array_init (return_value );
756751 for (i = 0 ; i < ra -> count ; ++ i ) {
757-
752+ zval zv , * z_tmp = & zv ;
753+ #if (PHP_MAJOR_VERSION < 7 )
758754 MAKE_STD_ZVAL (z_tmp );
755+ #endif
759756
760757 /* Call each node in turn */
761758 call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 2 , z_args );
@@ -768,7 +765,7 @@ PHP_METHOD(RedisArray, setOption)
768765
769766PHP_METHOD (RedisArray , select )
770767{
771- zval * object , z_fun , * z_tmp , z_args [1 ];
768+ zval * object , z_fun , z_args [1 ];
772769 int i ;
773770 RedisArray * ra ;
774771 long opt ;
@@ -790,7 +787,10 @@ PHP_METHOD(RedisArray, select)
790787
791788 array_init (return_value );
792789 for (i = 0 ; i < ra -> count ; ++ i ) {
790+ zval zv , * z_tmp = & zv ;
791+ #if (PHP_MAJOR_VERSION < 7 )
793792 MAKE_STD_ZVAL (z_tmp );
793+ #endif
794794
795795 /* Call each node in turn */
796796 call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 1 , z_args );
@@ -799,7 +799,7 @@ PHP_METHOD(RedisArray, select)
799799 }
800800 zval_dtor (& z_fun );
801801}
802-
802+ #if ( PHP_MAJOR_VERSION < 7 )
803803#define HANDLE_MULTI_EXEC (cmd ) do {\
804804 if (redis_array_get(getThis(), &ra TSRMLS_CC) >= 0 && ra->z_multi_exec) {\
805805 int i, num_varargs;\
@@ -828,6 +828,29 @@ PHP_METHOD(RedisArray, select)
828828 return ;\
829829 }\
830830}while (0 )
831+ #else
832+ #define HANDLE_MULTI_EXEC (cmd ) do { \
833+ if (redis_array_get(getThis(), &ra TSRMLS_CC) >= 0 && ra->z_multi_exec) { \
834+ int i, num_varargs; \
835+ zval *varargs = NULL, z_arg_array; \
836+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O*", \
837+ &object, redis_array_ce, &varargs, &num_varargs) == FAILURE) { \
838+ RETURN_FALSE;\
839+ } \
840+ /* copy all args into a zval hash table */ \
841+ array_init (& z_arg_array ); \
842+ for (i = 0 ; i < num_varargs ; i ++ ) { \
843+ zval z_tmp ; \
844+ ZVAL_ZVAL (& z_tmp , & varargs [i ], 1 , 0 ); \
845+ add_next_index_zval (& z_arg_array , & z_tmp ); \
846+ } \
847+ /* call */ \
848+ ra_forward_call (INTERNAL_FUNCTION_PARAM_PASSTHRU , ra , cmd , sizeof (cmd ) - 1 , & z_arg_array , NULL ); \
849+ zval_dtor (& z_arg_array ); \
850+ return ; \
851+ } \
852+ } while (0 )
853+ #endif
831854
832855/* MGET will distribute the call to several nodes and regroup the values. */
833856PHP_METHOD (RedisArray , mget )
0 commit comments