@@ -170,7 +170,7 @@ typedef struct {
170170} php_memc_t ;
171171
172172static inline php_memc_t * php_memc_fetch_object (zend_object * obj ) {
173- return (php_memc_t * )((char * )( obj ) - XtOffsetOf (php_memc_t , zo ));
173+ return (php_memc_t * )((char * )obj - XtOffsetOf (php_memc_t , zo ));
174174}
175175#define Z_MEMC_OBJ_P (zv ) php_memc_fetch_object(Z_OBJ_P(zv));
176176
@@ -356,20 +356,17 @@ char *php_memc_printable_func (zend_fcall_info *fci, zend_fcall_info_cache *fci_
356356static zend_bool php_memcached_on_new_callback (zval * object , zend_fcall_info * fci , zend_fcall_info_cache * fci_cache , zend_string * persistent_id )
357357{
358358 zend_bool ret = 1 ;
359- zval retval ;
360- zval params [2 ];
359+ zval retval , id ;
361360
362361 if (persistent_id ) {
363- ZVAL_STR (& params [ 1 ] , persistent_id );
362+ ZVAL_STR (& id , persistent_id );
364363 } else {
365- ZVAL_NULL (& params [ 1 ] );
364+ ZVAL_NULL (& id );
366365 }
367366
368- /* Call the cb */
369- ZVAL_COPY (& params [0 ], object );
367+ ZVAL_UNDEF (& retval );
370368
371- fci -> params = params ;
372- fci -> param_count = 2 ;
369+ zend_fcall_info_argn (fci , 2 , object , & id );
373370 fci -> retval = & retval ;
374371 fci -> no_separation = 1 ;
375372
@@ -379,10 +376,12 @@ static zend_bool php_memcached_on_new_callback(zval *object, zend_fcall_info *fc
379376 efree (buf );
380377 ret = 0 ;
381378 }
379+
380+ if (Z_TYPE (retval ) != IS_UNDEF )
381+ zval_ptr_dtor (& retval );
382+
383+ zend_fcall_info_args_clear (fci , 1 );
382384
383- zval_ptr_dtor (& params [0 ]);
384- zval_ptr_dtor (& params [1 ]);
385- zval_ptr_dtor (& retval );
386385 return ret ;
387386}
388387
@@ -407,7 +406,7 @@ static PHP_METHOD(Memcached, __construct)
407406 zend_fcall_info fci = {0 };
408407 zend_fcall_info_cache fci_cache ;
409408
410- if (zend_parse_parameters_throw (ZEND_NUM_ARGS (), "|S!f!S" , & persistent_id , & fci , & fci_cache , & conn_str ) == FAILURE ) {
409+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "|S!f!S" , & persistent_id , & fci , & fci_cache , & conn_str ) == FAILURE ) {
411410 return ;
412411 }
413412
@@ -3295,6 +3294,7 @@ zend_bool s_unserialize_value (enum memcached_serializer serializer, int val_typ
32953294
32963295 PHP_VAR_UNSERIALIZE_INIT (var_hash );
32973296 if (!php_var_unserialize (value , (const unsigned char * * )& payload_tmp , (const unsigned char * )payload_tmp + payload_len , & var_hash )) {
3297+ zval_ptr_dtor (value );
32983298 ZVAL_FALSE (value );
32993299 PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
33003300 php_error_docref (NULL , E_WARNING , "could not unserialize value" );
@@ -3529,6 +3529,7 @@ static memcached_return php_memc_do_cache_callback(zval *zmemc_obj, zend_fcall_i
35293529 fci -> param_count = 4 ;
35303530
35313531 result = zend_call_function (fci , fcc );
3532+
35323533 ZVAL_DUP (value , Z_REFVAL (z_val ));
35333534 expiration = Z_REFVAL (z_expiration );
35343535 if (result == SUCCESS && Z_TYPE (retval ) != IS_UNDEF ) {
@@ -3573,6 +3574,7 @@ static memcached_return php_memc_do_cache_callback(zval *zmemc_obj, zend_fcall_i
35733574 zval_ptr_dtor (& z_key );
35743575 zval_ptr_dtor (& z_val );
35753576 zval_ptr_dtor (& z_expiration );
3577+ zval_ptr_dtor (zmemc_obj );
35763578
35773579 return status ;
35783580}
@@ -3594,9 +3596,7 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci,
35943596 int rc = 0 ;
35953597 php_memc_t * i_obj = NULL ;
35963598
3597- ZVAL_COPY (& params [0 ], zmemc_obj );
35983599 fci -> retval = & retval ;
3599- fci -> params = params ;
36003600 fci -> param_count = 2 ;
36013601
36023602 payload = memcached_result_value (result );
@@ -3615,7 +3615,6 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci,
36153615 }
36163616
36173617 array_init (& z_result );
3618- ZVAL_COPY (& params [1 ], & z_result );
36193618 add_assoc_stringl_ex (& z_result , ZEND_STRL ("key" ), (char * )res_key , res_key_len );
36203619 add_assoc_zval_ex (& z_result , ZEND_STRL ("value" ), & value );
36213620 if (cas != 0 ) {
@@ -3625,16 +3624,19 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci,
36253624 add_assoc_long_ex (& z_result , ZEND_STRL ("flags" ), MEMC_VAL_GET_USER_FLAGS (flags ));
36263625 }
36273626
3627+ ZVAL_UNDEF (& retval );
3628+ zend_fcall_info_argn (fci , 2 , zmemc_obj , & z_result );
3629+
36283630 if (zend_call_function (fci , fcc ) == FAILURE ) {
36293631 php_error_docref (NULL , E_WARNING , "could not invoke result callback" );
36303632 rc = -1 ;
36313633 }
36323634
3633- if (& retval ) {
3635+ if (Z_TYPE ( retval ) != IS_UNDEF ) {
36343636 zval_ptr_dtor (& retval );
36353637 }
3636- zval_ptr_dtor ( & params [ 0 ]);
3637- zval_ptr_dtor ( & params [ 1 ] );
3638+
3639+ zend_fcall_info_args_clear ( fci , 1 );
36383640 zval_ptr_dtor (& z_result );
36393641
36403642 return rc ;
0 commit comments