@@ -89,8 +89,7 @@ static void redis_array_free(RedisArray *ra) {
8989
9090 /* Redis objects */
9191 for (i = 0 ;i < ra -> count ;i ++ ) {
92- zval_dtor (ra -> redis [i ]);
93- efree (ra -> redis [i ]);
92+ zval_dtor (& ra -> redis [i ]);
9493 efree (ra -> hosts [i ]);
9594 }
9695 efree (ra -> redis );
@@ -488,7 +487,7 @@ PHP_METHOD(RedisArray, _target)
488487
489488 redis_inst = ra_find_node (ra , key , key_len , & i TSRMLS_CC );
490489 if (redis_inst ) {
491- ZVAL_STRING ( return_value , ra -> hosts [i ], 1 );
490+ RETURN_STRING ( ra -> hosts [i ]);
492491 } else {
493492 RETURN_NULL ();
494493 }
@@ -588,7 +587,7 @@ PHP_METHOD(RedisArray, _rehash)
588587
589588static void multihost_distribute (INTERNAL_FUNCTION_PARAMETERS , const char * method_name )
590589{
591- zval * object , z_fun , * z_tmp ;
590+ zval * object , z_fun , * z_tmp , * redis_inst ;
592591 int i ;
593592 RedisArray * ra ;
594593
@@ -610,8 +609,9 @@ static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *metho
610609 MAKE_STD_ZVAL (z_tmp );
611610
612611 /* Call each node in turn */
613- call_user_function (& redis_ce -> function_table , & ra -> redis [i ],
614- & z_fun , z_tmp , 0 , NULL TSRMLS_CC );
612+ redis_inst = & ra -> redis [i ];
613+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
614+ z_tmp , 0 , NULL TSRMLS_CC );
615615
616616 add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
617617 }
@@ -650,7 +650,7 @@ PHP_METHOD(RedisArray, bgsave)
650650
651651PHP_METHOD (RedisArray , keys )
652652{
653- zval * object , * z_args [1 ], * z_tmp , z_fun ;
653+ zval * object , * z_args [1 ], * z_tmp , z_fun , * redis_inst ;
654654 RedisArray * ra ;
655655 char * pattern ;
656656 int pattern_len , i ;
@@ -683,7 +683,9 @@ PHP_METHOD(RedisArray, keys)
683683 MAKE_STD_ZVAL (z_tmp );
684684
685685 /* Call KEYS on each node */
686- call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 1 , z_args TSRMLS_CC );
686+ redis_inst = & ra -> redis [i ];
687+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
688+ z_tmp , 1 , z_args TSRMLS_CC );
687689
688690 /* Add the result for this host */
689691 add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
@@ -695,7 +697,7 @@ PHP_METHOD(RedisArray, keys)
695697
696698PHP_METHOD (RedisArray , getOption )
697699{
698- zval * object , z_fun , * z_tmp , * z_args [1 ];
700+ zval * object , z_fun , * z_tmp , * z_args [1 ], * redis_inst ;
699701 int i ;
700702 RedisArray * ra ;
701703 long opt ;
@@ -722,8 +724,9 @@ PHP_METHOD(RedisArray, getOption)
722724 MAKE_STD_ZVAL (z_tmp );
723725
724726 /* Call each node in turn */
725- call_user_function (& redis_ce -> function_table , & ra -> redis [i ],
726- & z_fun , z_tmp , 1 , z_args TSRMLS_CC );
727+ redis_inst = & ra -> redis [i ];
728+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
729+ z_tmp , 1 , z_args TSRMLS_CC );
727730
728731 add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
729732 }
@@ -734,7 +737,7 @@ PHP_METHOD(RedisArray, getOption)
734737
735738PHP_METHOD (RedisArray , setOption )
736739{
737- zval * object , z_fun , * z_tmp , * z_args [2 ];
740+ zval * object , z_fun , * z_tmp , * z_args [2 ], * redis_inst ;
738741 int i ;
739742 RedisArray * ra ;
740743 long opt ;
@@ -765,8 +768,9 @@ PHP_METHOD(RedisArray, setOption)
765768 MAKE_STD_ZVAL (z_tmp );
766769
767770 /* Call each node in turn */
768- call_user_function (& redis_ce -> function_table , & ra -> redis [i ],
769- & z_fun , z_tmp , 2 , z_args TSRMLS_CC );
771+ redis_inst = & ra -> redis [i ];
772+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
773+ z_tmp , 2 , z_args TSRMLS_CC );
770774
771775 add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
772776 }
@@ -778,7 +782,7 @@ PHP_METHOD(RedisArray, setOption)
778782
779783PHP_METHOD (RedisArray , select )
780784{
781- zval * object , z_fun , * z_tmp , * z_args [2 ];
785+ zval * object , z_fun , * z_tmp , * z_args [2 ], * redis_inst ;
782786 int i ;
783787 RedisArray * ra ;
784788 long opt ;
@@ -801,12 +805,12 @@ PHP_METHOD(RedisArray, select)
801805
802806 array_init (return_value );
803807 for (i = 0 ; i < ra -> count ; ++ i ) {
804-
805808 MAKE_STD_ZVAL (z_tmp );
806809
807810 /* Call each node in turn */
808- call_user_function (& redis_ce -> function_table , & ra -> redis [i ],
809- & z_fun , z_tmp , 1 , z_args TSRMLS_CC );
811+ redis_inst = & ra -> redis [i ];
812+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
813+ z_tmp , 1 , z_args TSRMLS_CC );
810814
811815 add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
812816 }
@@ -852,7 +856,7 @@ PHP_METHOD(RedisArray, mget)
852856 RedisArray * ra ;
853857 int * pos , argc , * argc_each ;
854858 HashTable * h_keys ;
855- zval * * argv ;
859+ zval * * argv , * redis_inst ;
856860
857861 /* Multi/exec support */
858862 HANDLE_MULTI_EXEC ("MGET" );
@@ -938,8 +942,9 @@ PHP_METHOD(RedisArray, mget)
938942
939943 /* call MGET on the node */
940944 MAKE_STD_ZVAL (z_ret );
941- call_user_function (& redis_ce -> function_table , & ra -> redis [n ],
942- & z_fun , z_ret , 1 , & z_argarray TSRMLS_CC );
945+ redis_inst = & ra -> redis [n ];
946+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
947+ z_ret , 1 , & z_argarray TSRMLS_CC );
943948
944949 /* cleanup args array */
945950 zval_ptr_dtor (& z_argarray );
@@ -1055,10 +1060,6 @@ PHP_METHOD(RedisArray, mset)
10551060 for (n = 0 ; n < ra -> count ; ++ n ) { /* for each node */
10561061 int found = 0 ;
10571062
1058- /* prepare call */
1059- ZVAL_STRING (& z_fun , "MSET" , 0 );
1060- redis_inst = ra -> redis [n ];
1061-
10621063 /* copy args */
10631064 MAKE_STD_ZVAL (z_argarray );
10641065 array_init (z_argarray );
@@ -1083,13 +1084,16 @@ PHP_METHOD(RedisArray, mset)
10831084 continue ; /* don't run empty MSETs */
10841085 }
10851086
1087+ /* prepare call */
1088+ ZVAL_STRING (& z_fun , "MSET" , 0 );
1089+ redis_inst = & ra -> redis [n ];
10861090 if (ra -> index ) { /* add MULTI */
10871091 ra_index_multi (redis_inst , MULTI TSRMLS_CC );
10881092 }
10891093
10901094 /* call */
1091- call_user_function (& redis_ce -> function_table , & ra -> redis [ n ] ,
1092- & z_fun , & z_ret , 1 , & z_argarray TSRMLS_CC );
1095+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
1096+ & z_ret , 1 , & z_argarray TSRMLS_CC );
10931097
10941098 if (ra -> index ) {
10951099 ra_index_keys (z_argarray , redis_inst TSRMLS_CC ); /* use SADD to add keys to node index */
@@ -1194,7 +1198,6 @@ PHP_METHOD(RedisArray, del)
11941198 for (n = 0 ; n < ra -> count ; ++ n ) { /* for each node */
11951199
11961200 int found = 0 ;
1197- redis_inst = ra -> redis [n ];
11981201
11991202 /* copy args */
12001203 MAKE_STD_ZVAL (z_argarray );
@@ -1217,14 +1220,15 @@ PHP_METHOD(RedisArray, del)
12171220 continue ;
12181221 }
12191222
1223+ redis_inst = & ra -> redis [n ];
12201224 if (ra -> index ) { /* add MULTI */
12211225 ra_index_multi (redis_inst , MULTI TSRMLS_CC );
12221226 }
12231227
12241228 /* call */
12251229 MAKE_STD_ZVAL (z_ret );
1226- call_user_function (& redis_ce -> function_table , & redis_inst ,
1227- & z_fun , z_ret , 1 , & z_argarray TSRMLS_CC );
1230+ call_user_function (& redis_ce -> function_table , & redis_inst , & z_fun ,
1231+ z_ret , 1 , & z_argarray TSRMLS_CC );
12281232
12291233 if (ra -> index ) {
12301234 ra_index_del (z_argarray , redis_inst TSRMLS_CC ); /* use SREM to remove keys from node index */
0 commit comments