@@ -345,7 +345,7 @@ PHP_METHOD(RedisArray, __construct)
345345static void
346346ra_forward_call (INTERNAL_FUNCTION_PARAMETERS , RedisArray * ra , const char * cmd , int cmd_len , zval * z_args , zval * z_new_target ) {
347347
348- zval z_tmp , z_fun , * redis_inst , * z_callargs , * zp_tmp ;
348+ zval z_fun , * redis_inst , * z_callargs , * zp_tmp ;
349349 char * key = NULL ; /* set to avoid "unused-but-set-variable" */
350350 int i , key_len = 0 , argc ;
351351 HashTable * h_args ;
@@ -358,10 +358,12 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
358358 redis_inst = ra -> z_multi_exec ; /* we already have the instance */
359359 } else {
360360 /* extract key and hash it. */
361- if (!( key = ra_find_key ( ra , z_args , cmd , & key_len )) ) {
361+ if (( zp_tmp = zend_hash_index_find ( h_args , 0 )) == NULL || Z_TYPE_P ( zp_tmp ) != IS_STRING ) {
362362 php_error_docref (NULL TSRMLS_CC , E_ERROR , "Could not find key" );
363363 RETURN_FALSE ;
364- }
364+ }
365+ key = Z_STRVAL_P (zp_tmp );
366+ key_len = Z_STRLEN_P (zp_tmp );
365367
366368 /* find node */
367369 redis_inst = ra_find_node (ra , key , key_len , NULL TSRMLS_CC );
@@ -371,9 +373,6 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
371373 }
372374 }
373375
374- /* check if write cmd */
375- b_write_cmd = ra_is_write_cmd (ra , cmd , cmd_len );
376-
377376 /* pass call through */
378377 ZVAL_STRINGL (& z_fun , cmd , cmd_len ); /* method name */
379378 z_callargs = ecalloc (argc + 1 , sizeof (zval ));
@@ -387,20 +386,23 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
387386
388387 /* multi/exec */
389388 if (ra -> z_multi_exec ) {
390- call_user_function (& redis_ce -> function_table , ra -> z_multi_exec , & z_fun , & z_tmp , argc , z_callargs );
389+ call_user_function (& redis_ce -> function_table , ra -> z_multi_exec , & z_fun , return_value , argc , z_callargs );
390+ zval_dtor (return_value );
391391 zval_dtor (& z_fun );
392- zval_dtor (& z_tmp );
393392 efree (z_callargs );
394393 RETURN_ZVAL (getThis (), 1 , 0 );
395394 }
396395
396+ /* check if write cmd */
397+ b_write_cmd = ra_is_write_cmd (ra , cmd , cmd_len );
398+
397399 /* CALL! */
398400 if (ra -> index && b_write_cmd ) {
399401 /* add MULTI + SADD */
400402 ra_index_multi (redis_inst , MULTI TSRMLS_CC );
401403 /* call using discarded temp value and extract exec results after. */
402- call_user_function (& redis_ce -> function_table , redis_inst , & z_fun , & z_tmp , argc , z_callargs );
403- zval_dtor (& z_tmp );
404+ call_user_function (& redis_ce -> function_table , redis_inst , & z_fun , return_value , argc , z_callargs );
405+ zval_dtor (return_value );
404406
405407 /* add keys to index. */
406408 ra_index_key (key , key_len , redis_inst TSRMLS_CC );
0 commit comments