@@ -278,8 +278,6 @@ int call_user_function(HashTable *function_table, zval *object, zval *function_n
278
278
return FAILURE ;
279
279
}
280
280
281
- function_state .function_symbol_table = (HashTable * ) emalloc (sizeof (HashTable ));
282
- zend_hash_init (function_state .function_symbol_table , 0 , NULL , PVAL_PTR_DTOR , 0 );
283
281
284
282
for (i = 0 ; i < param_count ; i ++ ) {
285
283
zval * param ;
@@ -293,35 +291,38 @@ int call_user_function(HashTable *function_table, zval *object, zval *function_n
293
291
zend_ptr_stack_push (& EG (argument_stack ), param );
294
292
}
295
293
296
- if (object ) {
297
- zval * dummy = (zval * ) emalloc (sizeof (zval )), * * this_ptr ;
298
-
299
- var_uninit (dummy );
300
- dummy -> refcount = 1 ;
301
- dummy -> is_ref = 0 ;
302
- zend_hash_update_ptr (function_state .function_symbol_table , "this" , sizeof ("this" ), dummy , sizeof (zval * ), (void * * ) & this_ptr );
303
- zend_assign_to_variable_reference (NULL , this_ptr , & object , NULL ELS_CC );
304
- }
294
+ zend_ptr_stack_push (& EG (argument_stack ), (void * ) param_count );
305
295
306
- calling_symbol_table = EG (active_symbol_table );
307
- EG (active_symbol_table ) = function_state .function_symbol_table ;
308
296
var_uninit (retval );
309
297
if (function_state .function -> type == ZEND_USER_FUNCTION ) {
298
+ calling_symbol_table = EG (active_symbol_table );
299
+ EG (active_symbol_table ) = (HashTable * ) emalloc (sizeof (HashTable ));
300
+ zend_hash_init (EG (active_symbol_table ), 0 , NULL , PVAL_PTR_DTOR , 0 );
301
+ if (object ) {
302
+ zval * dummy = (zval * ) emalloc (sizeof (zval )), * * this_ptr ;
303
+
304
+ var_uninit (dummy );
305
+ dummy -> refcount = 1 ;
306
+ dummy -> is_ref = 0 ;
307
+ zend_hash_update_ptr (EG (active_symbol_table ), "this" , sizeof ("this" ), dummy , sizeof (zval * ), (void * * ) & this_ptr );
308
+ zend_assign_to_variable_reference (NULL , this_ptr , & object , NULL ELS_CC );
309
+ }
310
310
original_return_value = EG (return_value );
311
311
original_op_array = EG (active_op_array );
312
312
EG (return_value ) = retval ;
313
313
EG (active_op_array ) = (zend_op_array * ) function_state .function ;
314
314
original_opline_ptr = EG (opline_ptr );
315
315
zend_execute (EG (active_op_array ) ELS_CC );
316
+ zend_hash_destroy (EG (active_symbol_table ));
317
+ efree (EG (active_symbol_table ));
318
+ EG (active_symbol_table ) = calling_symbol_table ;
316
319
EG (active_op_array ) = original_op_array ;
317
320
EG (return_value )= original_return_value ;
318
321
EG (opline_ptr ) = original_opline_ptr ;
319
322
} else {
320
323
((zend_internal_function * ) function_state .function )-> handler (param_count , retval , & EG (regular_list ), & EG (persistent_list ));
321
324
}
322
- zend_hash_destroy (EG (active_symbol_table ));
323
- efree (EG (active_symbol_table ));
324
- EG (active_symbol_table ) = calling_symbol_table ;
325
+ zend_ptr_stack_clear_multiple (ELS_C );
325
326
EG (function_state_ptr ) = original_function_state_ptr ;
326
327
327
328
return SUCCESS ;
0 commit comments