@@ -6522,9 +6522,7 @@ static int call_attribute_constructor(
6522
6522
zval * args , uint32_t argc , HashTable * named_params , zend_string * filename )
6523
6523
{
6524
6524
zend_function * ctor = ce -> constructor ;
6525
- zend_execute_data * prev_execute_data , dummy_frame ;
6526
- zend_function dummy_func ;
6527
- zend_op dummy_opline ;
6525
+ zend_execute_data * call = NULL ;
6528
6526
ZEND_ASSERT (ctor != NULL );
6529
6527
6530
6528
if (!(ctor -> common .fn_flags & ZEND_ACC_PUBLIC )) {
@@ -6535,31 +6533,43 @@ static int call_attribute_constructor(
6535
6533
if (filename ) {
6536
6534
/* Set up dummy call frame that makes it look like the attribute was invoked
6537
6535
* from where it occurs in the code. */
6538
- memset (& dummy_frame , 0 , sizeof (zend_execute_data ));
6539
- memset (& dummy_func , 0 , sizeof (zend_function ));
6540
- memset (& dummy_opline , 0 , sizeof (zend_op ));
6536
+ zend_function dummy_func ;
6537
+ zend_op * opline ;
6541
6538
6542
- prev_execute_data = EG (current_execute_data );
6543
- dummy_frame .prev_execute_data = prev_execute_data ;
6544
- dummy_frame .func = & dummy_func ;
6545
- dummy_frame .opline = & dummy_opline ;
6539
+ memset (& dummy_func , 0 , sizeof (zend_function ));
6546
6540
6547
- dummy_func .type = ZEND_USER_FUNCTION ;
6548
- dummy_func .common .fn_flags =
6541
+ call = zend_vm_stack_push_call_frame_ex (
6542
+ ZEND_MM_ALIGNED_SIZE_EX (sizeof (zend_execute_data ), sizeof (zval )) +
6543
+ ZEND_MM_ALIGNED_SIZE_EX (sizeof (zend_op ), sizeof (zval )) +
6544
+ ZEND_MM_ALIGNED_SIZE_EX (sizeof (zend_function ), sizeof (zval )),
6545
+ 0 , & dummy_func , 0 , NULL );
6546
+
6547
+ opline = (zend_op * )(call + 1 );
6548
+ memset (opline , 0 , sizeof (zend_op ));
6549
+ opline -> opcode = ZEND_DO_FCALL ;
6550
+ opline -> lineno = attr -> lineno ;
6551
+
6552
+ call -> opline = opline ;
6553
+ call -> call = NULL ;
6554
+ call -> return_value = NULL ;
6555
+ call -> func = (zend_function * )(call -> opline + 1 );
6556
+ call -> prev_execute_data = EG (current_execute_data );
6557
+
6558
+ memset (call -> func , 0 , sizeof (zend_function ));
6559
+ call -> func -> type = ZEND_USER_FUNCTION ;
6560
+ call -> func -> op_array .fn_flags =
6549
6561
attr -> flags & ZEND_ATTRIBUTE_STRICT_TYPES ? ZEND_ACC_STRICT_TYPES : 0 ;
6550
- dummy_func .common .fn_flags |= ZEND_ACC_CALL_VIA_TRAMPOLINE ;
6551
- dummy_func .op_array .filename = filename ;
6552
-
6553
- dummy_opline .opcode = ZEND_DO_FCALL ;
6554
- dummy_opline .lineno = attr -> lineno ;
6562
+ call -> func -> op_array .fn_flags |= ZEND_ACC_CALL_VIA_TRAMPOLINE ;
6563
+ call -> func -> op_array .filename = filename ;
6555
6564
6556
- EG (current_execute_data ) = & dummy_frame ;
6565
+ EG (current_execute_data ) = call ;
6557
6566
}
6558
6567
6559
6568
zend_call_known_function (ctor , obj , obj -> ce , NULL , argc , args , named_params );
6560
6569
6561
6570
if (filename ) {
6562
- EG (current_execute_data ) = prev_execute_data ;
6571
+ EG (current_execute_data ) = call -> prev_execute_data ;
6572
+ zend_vm_stack_free_call_frame (call );
6563
6573
}
6564
6574
6565
6575
if (EG (exception )) {
0 commit comments