@@ -1500,7 +1500,7 @@ PHP_REDIS_API void cluster_bulk_raw_resp(INTERNAL_FUNCTION_PARAMETERS,
15001500 if (c -> flags -> mode != MULTI ) {
15011501 RETURN_FALSE ;
15021502 } else {
1503- add_next_index_bool (c -> multi_resp , 0 );
1503+ add_next_index_bool (& c -> multi_resp , 0 );
15041504 return ;
15051505 }
15061506 }
@@ -1530,11 +1530,14 @@ PHP_REDIS_API void cluster_bulk_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
15301530 CLUSTER_RETURN_STRING (c , resp , c -> reply_len );
15311531 }
15321532 } else {
1533- zval * z = NULL ;
1533+ zval zv , * z = & zv ;
1534+ #if (PHP_MAJOR_VERSION < 7 )
1535+ z = NULL ;
1536+ #endif
15341537 if (redis_unserialize (c -> flags , resp , c -> reply_len , & z TSRMLS_CC )) {
1535- add_next_index_zval (c -> multi_resp , z );
1538+ add_next_index_zval (& c -> multi_resp , z );
15361539 } else {
1537- add_next_index_stringl (c -> multi_resp , resp , c -> reply_len );
1540+ add_next_index_stringl (& c -> multi_resp , resp , c -> reply_len );
15381541 }
15391542 }
15401543 efree (resp );
@@ -1641,31 +1644,28 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
16411644 void * ctx )
16421645{
16431646 subscribeContext * sctx = (subscribeContext * )ctx ;
1644- zval * z_tab , * z_tmp , * z_ret ;
1647+ zval z_tab , * z_tmp , * z_ret ;
16451648 int pull = 0 ;
16461649
16471650
16481651 // Consume each MULTI BULK response (one per channel/pattern)
16491652 while (sctx -> argc -- ) {
1650- z_tab = cluster_zval_mbulk_resp (INTERNAL_FUNCTION_PARAM_PASSTHRU , c ,
1651- pull , mbulk_resp_loop_raw );
1652-
1653- if (!z_tab ) {
1653+ if (!cluster_zval_mbulk_resp (INTERNAL_FUNCTION_PARAM_PASSTHRU , c ,
1654+ pull , mbulk_resp_loop_raw , & z_tab )
1655+ ) {
16541656 efree (sctx );
16551657 RETURN_FALSE ;
16561658 }
16571659
1658- if ((z_tmp = zend_hash_index_find (Z_ARRVAL_P (z_tab ), 0 )) == NULL ||
1660+ if ((z_tmp = zend_hash_index_find (Z_ARRVAL (z_tab ), 0 )) == NULL ||
16591661 strcasecmp (Z_STRVAL_P (z_tmp ), sctx -> kw ) != 0
16601662 ) {
1661- zval_dtor (z_tab );
1662- FREE_ZVAL (z_tab );
1663+ zval_dtor (& z_tab );
16631664 efree (sctx );
16641665 RETURN_FALSE ;
16651666 }
16661667
1667- zval_dtor (z_tab );
1668- efree (z_tab );
1668+ zval_dtor (& z_tab );
16691669 pull = 1 ;
16701670 }
16711671
@@ -1690,10 +1690,9 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
16901690 int tab_idx = 1 , is_pmsg ;
16911691
16921692 // Get the next subscribe response
1693- z_tab = cluster_zval_mbulk_resp (INTERNAL_FUNCTION_PARAM_PASSTHRU , c ,
1694- 1 , mbulk_resp_loop );
1695-
1696- if (!z_tab || (z_type = zend_hash_index_find (Z_ARRVAL_P (z_tab ), 0 )) == NULL ) {
1693+ if (!cluster_zval_mbulk_resp (INTERNAL_FUNCTION_PARAM_PASSTHRU , c , 1 , mbulk_resp_loop , & z_tab ) ||
1694+ (z_type = zend_hash_index_find (Z_ARRVAL (z_tab ), 0 )) == NULL
1695+ ) {
16971696 break ;
16981697 }
16991698
@@ -1703,18 +1702,17 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
17031702 ) {
17041703 is_pmsg = * Z_STRVAL_P (z_type ) == 'p' ;
17051704 } else {
1706- zval_dtor (z_tab );
1707- efree (z_tab );
1705+ zval_dtor (& z_tab );
17081706 continue ;
17091707 }
17101708
1711- if (is_pmsg && (z_pat = zend_hash_index_find (Z_ARRVAL_P (z_tab ), tab_idx ++ )) == NULL ) {
1709+ if (is_pmsg && (z_pat = zend_hash_index_find (Z_ARRVAL (z_tab ), tab_idx ++ )) == NULL ) {
17121710 break ;
17131711 }
17141712
17151713 // Extract channel and data
1716- if ((z_chan = zend_hash_index_find (Z_ARRVAL_P (z_tab ), tab_idx ++ )) == NULL ||
1717- (z_data = zend_hash_index_find (Z_ARRVAL_P (z_tab ), tab_idx ++ )) == NULL
1714+ if ((z_chan = zend_hash_index_find (Z_ARRVAL (z_tab ), tab_idx ++ )) == NULL ||
1715+ (z_data = zend_hash_index_find (Z_ARRVAL (z_tab ), tab_idx ++ )) == NULL
17181716 ) {
17191717 break ;
17201718 }
@@ -1759,19 +1757,15 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
17591757 // If we have a return value, free it
17601758 if (z_ret ) zval_ptr_dtor (& z_ret );
17611759
1762- zval_dtor (z_tab );
1763- efree (z_tab );
1760+ zval_dtor (& z_tab );
17641761 }
17651762
17661763 // We're no longer subscribing, due to an error
17671764 c -> subscribed_slot = -1 ;
17681765
17691766 // Cleanup
1767+ zval_dtor (& z_tab );
17701768 efree (sctx );
1771- if (z_tab ) {
1772- zval_dtor (z_tab );
1773- efree (z_tab );
1774- }
17751769
17761770 // Failure
17771771 RETURN_FALSE ;
@@ -1782,33 +1776,28 @@ PHP_REDIS_API void cluster_unsub_resp(INTERNAL_FUNCTION_PARAMETERS,
17821776 redisCluster * c , void * ctx )
17831777{
17841778 subscribeContext * sctx = (subscribeContext * )ctx ;
1785- zval * z_tab , * z_chan , * z_flag ;
1779+ zval z_tab , * z_chan , * z_flag ;
17861780 int pull = 0 , argc = sctx -> argc ;
17871781
17881782 efree (sctx );
17891783 array_init (return_value );
17901784
17911785 // Consume each response
17921786 while (argc -- ) {
1793- z_tab = cluster_zval_mbulk_resp (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
1794- c , pull , mbulk_resp_loop_raw );
1795-
17961787 // Fail if we didn't get an array or can't find index 1
1797- if (!z_tab || (z_chan = zend_hash_index_find (Z_ARRVAL_P (z_tab ), 1 )) == NULL ) {
1798- if (z_tab ) {
1799- zval_dtor (z_tab );
1800- efree (z_tab );
1801- }
1788+ if (!cluster_zval_mbulk_resp (INTERNAL_FUNCTION_PARAM_PASSTHRU , c , pull , mbulk_resp_loop_raw , & z_tab ) ||
1789+ (z_chan = zend_hash_index_find (Z_ARRVAL (z_tab ), 1 )) == NULL
1790+ ) {
1791+ zval_dtor (& z_tab );
18021792 zval_dtor (return_value );
18031793 RETURN_FALSE ;
18041794 }
18051795
18061796 // Find the flag for this channel/pattern
1807- if ((z_flag = zend_hash_index_find (Z_ARRVAL_P (z_tab ), 2 )) == NULL ||
1797+ if ((z_flag = zend_hash_index_find (Z_ARRVAL (z_tab ), 2 )) == NULL ||
18081798 Z_STRLEN_P (z_flag ) != 2
18091799 ) {
1810- zval_dtor (z_tab );
1811- efree (z_tab );
1800+ zval_dtor (& z_tab );
18121801 zval_dtor (return_value );
18131802 RETURN_FALSE ;
18141803 }
@@ -1819,8 +1808,7 @@ PHP_REDIS_API void cluster_unsub_resp(INTERNAL_FUNCTION_PARAMETERS,
18191808 // Add result
18201809 add_assoc_bool (return_value , Z_STRVAL_P (z_chan ), flag [1 ]== '1' );
18211810
1822- zval_dtor (z_tab );
1823- efree (z_tab );
1811+ zval_dtor (& z_tab );
18241812 pull = 1 ;
18251813 }
18261814}
@@ -1866,7 +1854,7 @@ PHP_REDIS_API void cluster_variant_resp(INTERNAL_FUNCTION_PARAMETERS, redisClust
18661854 void * ctx )
18671855{
18681856 clusterReply * r ;
1869- zval * z_arr ;
1857+ zval zv , * z_arr = & zv ;
18701858 int i ;
18711859
18721860 // Make sure we can read it
@@ -1890,15 +1878,12 @@ PHP_REDIS_API void cluster_variant_resp(INTERNAL_FUNCTION_PARAMETERS, redisClust
18901878 RETVAL_STRINGL (r -> str , r -> len );
18911879 break ;
18921880 case TYPE_MULTIBULK :
1893- MAKE_STD_ZVAL (z_arr );
18941881 array_init (z_arr );
18951882
18961883 for (i = 0 ;i < r -> elements ;i ++ ) {
18971884 cluster_mbulk_variant_resp (r -> element [i ], z_arr );
18981885 }
1899-
1900- * return_value = * z_arr ;
1901- efree (z_arr );
1886+ RETVAL_ZVAL (z_arr , 1 , 0 );
19021887 break ;
19031888 default :
19041889 RETVAL_FALSE ;
@@ -1907,23 +1892,23 @@ PHP_REDIS_API void cluster_variant_resp(INTERNAL_FUNCTION_PARAMETERS, redisClust
19071892 } else {
19081893 switch (r -> type ) {
19091894 case TYPE_INT :
1910- add_next_index_long (c -> multi_resp , r -> integer );
1895+ add_next_index_long (& c -> multi_resp , r -> integer );
19111896 break ;
19121897 case TYPE_ERR :
1913- add_next_index_bool (c -> multi_resp , 0 );
1898+ add_next_index_bool (& c -> multi_resp , 0 );
19141899 break ;
19151900 case TYPE_LINE :
1916- add_next_index_bool (c -> multi_resp , 1 );
1901+ add_next_index_bool (& c -> multi_resp , 1 );
19171902 break ;
19181903 case TYPE_BULK :
1919- add_next_index_stringl (c -> multi_resp , r -> str , r -> len );
1904+ add_next_index_stringl (& c -> multi_resp , r -> str , r -> len );
19201905 efree (r -> str );
19211906 break ;
19221907 case TYPE_MULTIBULK :
1923- cluster_mbulk_variant_resp (r , c -> multi_resp );
1908+ cluster_mbulk_variant_resp (r , & c -> multi_resp );
19241909 break ;
19251910 default :
1926- add_next_index_bool (c -> multi_resp , 0 );
1911+ add_next_index_bool (& c -> multi_resp , 0 );
19271912 break ;
19281913 }
19291914 }
@@ -1965,7 +1950,7 @@ PHP_REDIS_API void cluster_gen_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
19651950 if (CLUSTER_IS_ATOMIC (c )) {
19661951 RETVAL_ZVAL (z_result , 0 , 1 );
19671952 } else {
1968- add_next_index_zval (c -> multi_resp , z_result );
1953+ add_next_index_zval (& c -> multi_resp , z_result );
19691954 }
19701955}
19711956
@@ -2047,7 +2032,7 @@ PHP_REDIS_API void cluster_info_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
20472032 if (CLUSTER_IS_ATOMIC (c )) {
20482033 RETVAL_ZVAL (z_result , 0 , 1 );
20492034 } else {
2050- add_next_index_zval (c -> multi_resp , z_result );
2035+ add_next_index_zval (& c -> multi_resp , z_result );
20512036 }
20522037}
20532038
@@ -2056,6 +2041,7 @@ PHP_REDIS_API void cluster_client_list_resp(INTERNAL_FUNCTION_PARAMETERS, redisC
20562041 void * ctx )
20572042{
20582043 char * info ;
2044+ zval zv , * z_result = & zv ;
20592045
20602046 /* Read the bulk response */
20612047 info = redis_sock_read_bulk_reply (c -> cmd_sock , c -> reply_len TSRMLS_CC );
@@ -2064,10 +2050,7 @@ PHP_REDIS_API void cluster_client_list_resp(INTERNAL_FUNCTION_PARAMETERS, redisC
20642050 }
20652051
20662052#if (PHP_MAJOR_VERSION < 7 )
2067- zval * z_result ;
20682053 MAKE_STD_ZVAL (z_result );
2069- #else
2070- zval zv , * z_result = & zv ;
20712054#endif
20722055
20732056 /* Parse it and free the bulk string */
@@ -2077,16 +2060,14 @@ PHP_REDIS_API void cluster_client_list_resp(INTERNAL_FUNCTION_PARAMETERS, redisC
20772060 if (CLUSTER_IS_ATOMIC (c )) {
20782061 RETVAL_ZVAL (z_result , 0 , 1 );
20792062 } else {
2080- add_next_index_zval (c -> multi_resp , z_result );
2063+ add_next_index_zval (& c -> multi_resp , z_result );
20812064 }
20822065}
20832066
20842067/* MULTI BULK response loop where we might pull the next one */
20852068PHP_REDIS_API zval * cluster_zval_mbulk_resp (INTERNAL_FUNCTION_PARAMETERS ,
2086- redisCluster * c , int pull , mbulk_cb cb )
2069+ redisCluster * c , int pull , mbulk_cb cb , zval * z_ret )
20872070{
2088- zval * z_result ;
2089-
20902071 // Pull our next response if directed
20912072 if (pull ) {
20922073 if (cluster_check_response (c , & c -> reply_type TSRMLS_CC )< 0 )
@@ -2100,25 +2081,23 @@ PHP_REDIS_API zval *cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
21002081 return NULL ;
21012082 }
21022083
2103- MAKE_STD_ZVAL (z_result );
2104- array_init (z_result );
2084+ array_init (z_ret );
21052085
21062086 // Call our callback
2107- if (cb (c -> cmd_sock , z_result , c -> reply_len , NULL TSRMLS_CC )== FAILURE ) {
2108- zval_dtor (z_result );
2109- FREE_ZVAL (z_result );
2087+ if (cb (c -> cmd_sock , z_ret , c -> reply_len , NULL TSRMLS_CC )== FAILURE ) {
2088+ zval_dtor (z_ret );
21102089 return NULL ;
21112090 }
21122091
2113- return z_result ;
2092+ return z_ret ;
21142093}
21152094
21162095/* MULTI MULTI BULK reply (for EXEC) */
21172096PHP_REDIS_API void cluster_multi_mbulk_resp (INTERNAL_FUNCTION_PARAMETERS ,
21182097 redisCluster * c , void * ctx )
21192098{
2120- MAKE_STD_ZVAL ( c -> multi_resp ) ;
2121- array_init (c -> multi_resp );
2099+ zval * multi_resp = & c -> multi_resp ;
2100+ array_init (multi_resp );
21222101
21232102 clusterFoldItem * fi = c -> multi_head ;
21242103 while (fi ) {
@@ -2131,23 +2110,21 @@ PHP_REDIS_API void cluster_multi_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
21312110 c -> cmd_sock = SLOT_SOCK (c , fi -> slot );
21322111
21332112 if (cluster_check_response (c , & c -> reply_type TSRMLS_CC )< 0 ) {
2134- zval_dtor (c -> multi_resp );
2135- efree (c -> multi_resp );
2113+ zval_dtor (multi_resp );
21362114 RETURN_FALSE ;
21372115 }
21382116
21392117 fi -> callback (INTERNAL_FUNCTION_PARAM_PASSTHRU , c , fi -> ctx );
21402118 } else {
21412119 /* Just add false */
2142- add_next_index_bool (c -> multi_resp , 0 );
2120+ add_next_index_bool (multi_resp , 0 );
21432121 }
21442122 fi = fi -> next ;
21452123 }
21462124
21472125 // Set our return array
21482126 zval_dtor (return_value );
2149- * return_value = * c -> multi_resp ;
2150- efree (c -> multi_resp );
2127+ RETVAL_ZVAL (multi_resp , 0 , 1 );
21512128}
21522129
21532130/* Generic handler for MGET */
@@ -2176,7 +2153,7 @@ PHP_REDIS_API void cluster_mbulk_mget_resp(INTERNAL_FUNCTION_PARAMETERS,
21762153 * return_value = * (mctx -> z_multi );
21772154 efree (mctx -> z_multi );
21782155 } else {
2179- add_next_index_zval (c -> multi_resp , mctx -> z_multi );
2156+ add_next_index_zval (& c -> multi_resp , mctx -> z_multi );
21802157 }
21812158 }
21822159
@@ -2212,7 +2189,7 @@ PHP_REDIS_API void cluster_msetnx_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluste
22122189 * return_value = * (mctx -> z_multi );
22132190 efree (mctx -> z_multi );
22142191 } else {
2215- add_next_index_zval (c -> multi_resp , mctx -> z_multi );
2192+ add_next_index_zval (& c -> multi_resp , mctx -> z_multi );
22162193 }
22172194 }
22182195
@@ -2241,7 +2218,7 @@ PHP_REDIS_API void cluster_del_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
22412218 if (CLUSTER_IS_ATOMIC (c )) {
22422219 ZVAL_LONG (return_value , Z_LVAL_P (mctx -> z_multi ));
22432220 } else {
2244- add_next_index_long (c -> multi_resp , Z_LVAL_P (mctx -> z_multi ));
2221+ add_next_index_long (& c -> multi_resp , Z_LVAL_P (mctx -> z_multi ));
22452222 }
22462223 efree (mctx -> z_multi );
22472224 }
@@ -2269,9 +2246,9 @@ PHP_REDIS_API void cluster_mset_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
22692246 // Set our return if it's the last call
22702247 if (mctx -> last ) {
22712248 if (CLUSTER_IS_ATOMIC (c )) {
2272- ZVAL_BOOL (return_value , Z_BVAL_P (mctx -> z_multi ));
2249+ ZVAL_BOOL (return_value , Z_LVAL_P (mctx -> z_multi ));
22732250 } else {
2274- add_next_index_bool (c -> multi_resp , Z_BVAL_P (mctx -> z_multi ));
2251+ add_next_index_bool (& c -> multi_resp , Z_LVAL_P (mctx -> z_multi ));
22752252 }
22762253 efree (mctx -> z_multi );
22772254 }
0 commit comments