@@ -6290,9 +6290,7 @@ static int call_attribute_constructor(
6290
6290
zval * args , uint32_t argc , HashTable * named_params , zend_string * filename )
6291
6291
{
6292
6292
zend_function * ctor = ce -> constructor ;
6293
- zend_execute_data * prev_execute_data , dummy_frame ;
6294
- zend_function dummy_func ;
6295
- zend_op dummy_opline ;
6293
+ zend_execute_data * call = NULL ;
6296
6294
ZEND_ASSERT (ctor != NULL );
6297
6295
6298
6296
if (!(ctor -> common .fn_flags & ZEND_ACC_PUBLIC )) {
@@ -6303,31 +6301,43 @@ static int call_attribute_constructor(
6303
6301
if (filename ) {
6304
6302
/* Set up dummy call frame that makes it look like the attribute was invoked
6305
6303
* from where it occurs in the code. */
6306
- memset (& dummy_frame , 0 , sizeof (zend_execute_data ));
6307
- memset (& dummy_func , 0 , sizeof (zend_function ));
6308
- memset (& dummy_opline , 0 , sizeof (zend_op ));
6304
+ zend_function dummy_func ;
6305
+ zend_op * opline ;
6309
6306
6310
- prev_execute_data = EG (current_execute_data );
6311
- dummy_frame .prev_execute_data = prev_execute_data ;
6312
- dummy_frame .func = & dummy_func ;
6313
- dummy_frame .opline = & dummy_opline ;
6307
+ memset (& dummy_func , 0 , sizeof (zend_function ));
6314
6308
6315
- dummy_func .type = ZEND_USER_FUNCTION ;
6316
- dummy_func .common .fn_flags =
6309
+ call = zend_vm_stack_push_call_frame_ex (
6310
+ ZEND_MM_ALIGNED_SIZE_EX (sizeof (zend_execute_data ), sizeof (zval )) +
6311
+ ZEND_MM_ALIGNED_SIZE_EX (sizeof (zend_op ), sizeof (zval )) +
6312
+ ZEND_MM_ALIGNED_SIZE_EX (sizeof (zend_function ), sizeof (zval )),
6313
+ 0 , & dummy_func , 0 , NULL );
6314
+
6315
+ opline = (zend_op * )(call + 1 );
6316
+ memset (opline , 0 , sizeof (zend_op ));
6317
+ opline -> opcode = ZEND_DO_FCALL ;
6318
+ opline -> lineno = attr -> lineno ;
6319
+
6320
+ call -> opline = opline ;
6321
+ call -> call = NULL ;
6322
+ call -> return_value = NULL ;
6323
+ call -> func = (zend_function * )(call -> opline + 1 );
6324
+ call -> prev_execute_data = EG (current_execute_data );
6325
+
6326
+ memset (call -> func , 0 , sizeof (zend_function ));
6327
+ call -> func -> type = ZEND_USER_FUNCTION ;
6328
+ call -> func -> op_array .fn_flags =
6317
6329
attr -> flags & ZEND_ATTRIBUTE_STRICT_TYPES ? ZEND_ACC_STRICT_TYPES : 0 ;
6318
- dummy_func .common .fn_flags |= ZEND_ACC_CALL_VIA_TRAMPOLINE ;
6319
- dummy_func .op_array .filename = filename ;
6320
-
6321
- dummy_opline .opcode = ZEND_DO_FCALL ;
6322
- dummy_opline .lineno = attr -> lineno ;
6330
+ call -> func -> op_array .fn_flags |= ZEND_ACC_CALL_VIA_TRAMPOLINE ;
6331
+ call -> func -> op_array .filename = filename ;
6323
6332
6324
- EG (current_execute_data ) = & dummy_frame ;
6333
+ EG (current_execute_data ) = call ;
6325
6334
}
6326
6335
6327
6336
zend_call_known_function (ctor , obj , obj -> ce , NULL , argc , args , named_params );
6328
6337
6329
6338
if (filename ) {
6330
- EG (current_execute_data ) = prev_execute_data ;
6339
+ EG (current_execute_data ) = call -> prev_execute_data ;
6340
+ zend_vm_stack_free_call_frame (call );
6331
6341
}
6332
6342
6333
6343
if (EG (exception )) {
0 commit comments