@@ -27,6 +27,7 @@ typedef struct _zend_partial {
27
27
zval This ;
28
28
zend_function func ;
29
29
zend_function trampoline ;
30
+ zend_class_entry * type ;
30
31
uint32_t argc ;
31
32
zval * argv ;
32
33
zend_array * named ;
@@ -440,10 +441,25 @@ ZEND_NAMED_FUNCTION(zend_partial_call_magic)
440
441
fci .params = ecalloc (sizeof (zval ), fci .param_count );
441
442
fcc .function_handler = & partial -> func ;
442
443
443
- if (!Z_ISUNDEF (partial -> This )) {
444
+
445
+ if (Z_TYPE (partial -> This ) == IS_OBJECT ) {
444
446
fci .object =
445
447
fcc .object =
446
448
zend_partial_this (Z_OBJ (partial -> This ));
449
+ } else if (partial -> type ) {
450
+ zval instance ;
451
+
452
+ if (partial -> type -> create_object ) {
453
+ ZVAL_OBJ (& instance ,
454
+ partial -> type -> create_object (partial -> type ));
455
+ } else {
456
+ ZVAL_OBJ (& instance , zend_objects_new (partial -> type ));
457
+ }
458
+
459
+ fci .object =
460
+ fcc .object =
461
+ Z_OBJ (instance );
462
+ GC_ADD_FLAGS (fci .object , IS_OBJ_DESTRUCTOR_CALLED );
447
463
}
448
464
449
465
memcpy (fci .params , partial -> argv , partial -> argc * sizeof (zval ));
@@ -503,8 +519,7 @@ ZEND_NAMED_FUNCTION(zend_partial_call_magic)
503
519
partial -> func .internal_function .handler == zend_pass_function .handler )) {
504
520
zval_ptr_dtor (return_value );
505
521
506
- RETVAL_OBJ (
507
- Z_OBJ (partial -> This ));
522
+ RETVAL_OBJ (fci .object );
508
523
}
509
524
510
525
if (!fcc .function_handler ) {
@@ -577,7 +592,18 @@ void zend_partial_apply(zval *result, zend_execute_data *call) {
577
592
}
578
593
}
579
594
580
- ZVAL_COPY (& partial -> This , & call -> This );
595
+ if (function -> common .fn_flags & ZEND_ACC_CTOR ) {
596
+ partial -> type = Z_OBJCE (call -> This );
597
+
598
+ GC_ADD_FLAGS (
599
+ Z_OBJ (call -> This ), IS_OBJ_DESTRUCTOR_CALLED );
600
+ OBJ_RELEASE (Z_OBJ (call -> This ));
601
+
602
+ ZVAL_UNDEF (& partial -> This );
603
+ } else {
604
+ ZVAL_COPY (& partial -> This , & call -> This );
605
+ }
606
+
581
607
582
608
memcpy (& partial -> func , function ,
583
609
function -> type == ZEND_INTERNAL_FUNCTION ?
@@ -592,8 +618,7 @@ void zend_partial_apply(zval *result, zend_execute_data *call) {
592
618
}
593
619
594
620
if (partial -> func .common .fn_flags & ZEND_ACC_CTOR ) {
595
- GC_ADD_FLAGS (
596
- Z_OBJ (partial -> This ), IS_OBJ_DESTRUCTOR_CALLED );
621
+
597
622
}
598
623
599
624
if (partial -> func .type == ZEND_USER_FUNCTION ) {
0 commit comments