@@ -112,14 +112,14 @@ static void pdo_sqlite_cleanup_callbacks(pdo_sqlite_db_handle *H)
112
112
}
113
113
114
114
efree ((char * )func -> funcname );
115
- if (! Z_ISUNDEF (func -> func )) {
116
- zval_ptr_dtor (& func -> func );
115
+ if (ZEND_FCC_INITIALIZED (func -> func )) {
116
+ zend_fcc_dtor (& func -> func );
117
117
}
118
- if (! Z_ISUNDEF (func -> step )) {
119
- zval_ptr_dtor (& func -> step );
118
+ if (ZEND_FCC_INITIALIZED (func -> step )) {
119
+ zend_fcc_dtor (& func -> step );
120
120
}
121
- if (! Z_ISUNDEF (func -> fini )) {
122
- zval_ptr_dtor (& func -> fini );
121
+ if (ZEND_FCC_INITIALIZED (func -> fini )) {
122
+ zend_fcc_dtor (& func -> fini );
123
123
}
124
124
efree (func );
125
125
}
@@ -139,8 +139,8 @@ static void pdo_sqlite_cleanup_callbacks(pdo_sqlite_db_handle *H)
139
139
}
140
140
141
141
efree ((char * )collation -> name );
142
- if (! Z_ISUNDEF (collation -> callback )) {
143
- zval_ptr_dtor (& collation -> callback );
142
+ if (ZEND_FCC_INITIALIZED (collation -> callback )) {
143
+ zend_fcc_dtor (& collation -> callback );
144
144
}
145
145
efree (collation );
146
146
}
@@ -309,12 +309,12 @@ typedef struct {
309
309
zend_long row ;
310
310
} aggregate_context ;
311
311
312
- static int do_callback (struct pdo_sqlite_fci * fc , zval * cb , int argc , sqlite3_value * * argv , sqlite3_context * context , int is_agg )
312
+ static int do_callback (zend_fcall_info_cache * fcc , int argc , sqlite3_value * * argv , sqlite3_context * context , int is_agg )
313
313
{
314
314
zval * zargs = NULL ;
315
315
zval retval ;
316
316
int i ;
317
- int ret ;
317
+ int ret = SUCCESS ;
318
318
int fake_argc ;
319
319
aggregate_context * agg_context = NULL ;
320
320
@@ -324,14 +324,7 @@ static int do_callback(struct pdo_sqlite_fci *fc, zval *cb, int argc, sqlite3_va
324
324
325
325
fake_argc = argc + is_agg ;
326
326
327
- fc -> fci .size = sizeof (fc -> fci );
328
- ZVAL_COPY_VALUE (& fc -> fci .function_name , cb );
329
- fc -> fci .object = NULL ;
330
- fc -> fci .retval = & retval ;
331
- fc -> fci .param_count = fake_argc ;
332
-
333
327
/* build up the params */
334
-
335
328
if (fake_argc ) {
336
329
zargs = safe_emalloc (fake_argc , sizeof (zval ), 0 );
337
330
}
@@ -372,11 +365,7 @@ static int do_callback(struct pdo_sqlite_fci *fc, zval *cb, int argc, sqlite3_va
372
365
}
373
366
}
374
367
375
- fc -> fci .params = zargs ;
376
-
377
- if ((ret = zend_call_function (& fc -> fci , & fc -> fcc )) == FAILURE ) {
378
- php_error_docref (NULL , E_WARNING , "An error occurred while invoking the callback" );
379
- }
368
+ zend_call_known_fcc (fcc , & retval , fake_argc , zargs , /* named_params */ NULL );
380
369
381
370
/* clean up the params */
382
371
if (zargs ) {
@@ -445,41 +434,33 @@ static void php_sqlite3_func_step_callback(sqlite3_context *context, int argc, s
445
434
{
446
435
struct pdo_sqlite_func * func = (struct pdo_sqlite_func * )sqlite3_user_data (context );
447
436
448
- do_callback (& func -> astep , & func -> step , argc , argv , context , 1 );
437
+ do_callback (& func -> step , argc , argv , context , 1 );
449
438
}
450
439
451
440
static void php_sqlite3_func_final_callback (sqlite3_context * context )
452
441
{
453
442
struct pdo_sqlite_func * func = (struct pdo_sqlite_func * )sqlite3_user_data (context );
454
443
455
- do_callback (& func -> afini , & func -> fini , 0 , NULL , context , 1 );
444
+ do_callback (& func -> fini , 0 , NULL , context , 1 );
456
445
}
457
446
458
447
static int php_sqlite3_collation_callback (void * context , int string1_len , const void * string1 , int string2_len , const void * string2 )
459
448
{
460
- int ret ;
449
+ int ret = 0 ;
461
450
zval zargs [2 ];
462
451
zval retval ;
463
452
struct pdo_sqlite_collation * collation = (struct pdo_sqlite_collation * ) context ;
464
453
465
- collation -> fc .fci .size = sizeof (collation -> fc .fci );
466
- ZVAL_COPY_VALUE (& collation -> fc .fci .function_name , & collation -> callback );
467
- collation -> fc .fci .object = NULL ;
468
- collation -> fc .fci .retval = & retval ;
469
-
470
454
/* Prepare the arguments. */
471
455
ZVAL_STRINGL (& zargs [0 ], (char * ) string1 , string1_len );
472
456
ZVAL_STRINGL (& zargs [1 ], (char * ) string2 , string2_len );
473
- collation -> fc .fci .param_count = 2 ;
474
- collation -> fc .fci .params = zargs ;
475
457
476
- if (( ret = zend_call_function ( & collation -> fc . fci , & collation -> fc . fcc )) == FAILURE ) {
477
- php_error_docref ( NULL , E_WARNING , "An error occurred while invoking the callback" );
478
- } else if (!Z_ISUNDEF (retval )) {
458
+ zend_call_known_fcc ( & collation -> callback , & retval , /* argc */ 2 , zargs , /* named_params */ NULL );
459
+
460
+ if (!Z_ISUNDEF (retval )) {
479
461
if (Z_TYPE (retval ) != IS_LONG ) {
480
462
convert_to_long (& retval );
481
463
}
482
- ret = 0 ;
483
464
if (Z_LVAL (retval ) > 0 ) {
484
465
ret = 1 ;
485
466
} else if (Z_LVAL (retval ) < 0 ) {
@@ -498,7 +479,7 @@ static void php_sqlite3_func_callback(sqlite3_context *context, int argc, sqlite
498
479
{
499
480
struct pdo_sqlite_func * func = (struct pdo_sqlite_func * )sqlite3_user_data (context );
500
481
501
- do_callback (& func -> afunc , & func -> func , argc , argv , context , 0 );
482
+ do_callback (& func -> func , argc , argv , context , 0 );
502
483
}
503
484
504
485
void pdo_sqlite_create_function_internal (INTERNAL_FUNCTION_PARAMETERS )
@@ -516,7 +497,7 @@ void pdo_sqlite_create_function_internal(INTERNAL_FUNCTION_PARAMETERS)
516
497
517
498
ZEND_PARSE_PARAMETERS_START (2 , 4 )
518
499
Z_PARAM_STRING (func_name , func_name_len )
519
- Z_PARAM_FUNC (fci , fcc )
500
+ Z_PARAM_FUNC_NO_TRAMPOLINE_FREE (fci , fcc )
520
501
Z_PARAM_OPTIONAL
521
502
Z_PARAM_LONG (argc )
522
503
Z_PARAM_LONG (flags )
@@ -533,7 +514,7 @@ void pdo_sqlite_create_function_internal(INTERNAL_FUNCTION_PARAMETERS)
533
514
if (ret == SQLITE_OK ) {
534
515
func -> funcname = estrdup (func_name );
535
516
536
- ZVAL_COPY (& func -> func , & fci . function_name );
517
+ zend_fcc_dup (& func -> func , & fcc );
537
518
538
519
func -> argc = argc ;
539
520
@@ -544,6 +525,7 @@ void pdo_sqlite_create_function_internal(INTERNAL_FUNCTION_PARAMETERS)
544
525
}
545
526
546
527
efree (func );
528
+ zend_release_fcall_info_cache (& fcc );
547
529
RETURN_FALSE ;
548
530
}
549
531
@@ -566,14 +548,15 @@ void pdo_sqlite_create_aggregate_internal(INTERNAL_FUNCTION_PARAMETERS)
566
548
pdo_dbh_t * dbh ;
567
549
pdo_sqlite_db_handle * H ;
568
550
int ret ;
551
+ bool is_throw = false;
569
552
570
553
ZEND_PARSE_PARAMETERS_START (3 , 4 )
571
554
Z_PARAM_STRING (func_name , func_name_len )
572
- Z_PARAM_FUNC (step_fci , step_fcc )
573
- Z_PARAM_FUNC (fini_fci , fini_fcc )
555
+ Z_PARAM_FUNC_NO_TRAMPOLINE_FREE (step_fci , step_fcc )
556
+ Z_PARAM_FUNC_NO_TRAMPOLINE_FREE (fini_fci , fini_fcc )
574
557
Z_PARAM_OPTIONAL
575
558
Z_PARAM_LONG (argc )
576
- ZEND_PARSE_PARAMETERS_END ( );
559
+ ZEND_PARSE_PARAMETERS_END_EX ( is_throw = true; goto error ; );
577
560
578
561
dbh = Z_PDO_DBH_P (ZEND_THIS );
579
562
PDO_CONSTRUCT_CHECK ;
@@ -587,9 +570,9 @@ void pdo_sqlite_create_aggregate_internal(INTERNAL_FUNCTION_PARAMETERS)
587
570
if (ret == SQLITE_OK ) {
588
571
func -> funcname = estrdup (func_name );
589
572
590
- ZVAL_COPY (& func -> step , & step_fci . function_name );
573
+ zend_fcc_dup (& func -> step , & step_fcc );
591
574
592
- ZVAL_COPY (& func -> fini , & fini_fci . function_name );
575
+ zend_fcc_dup (& func -> fini , & fini_fcc );
593
576
594
577
func -> argc = argc ;
595
578
@@ -600,6 +583,18 @@ void pdo_sqlite_create_aggregate_internal(INTERNAL_FUNCTION_PARAMETERS)
600
583
}
601
584
602
585
efree (func );
586
+
587
+ error :
588
+ if (ZEND_FCC_INITIALIZED (step_fcc )) {
589
+ zend_release_fcall_info_cache (& step_fcc );
590
+ }
591
+ if (ZEND_FCC_INITIALIZED (fini_fcc )) {
592
+ zend_release_fcall_info_cache (& fini_fcc );
593
+ }
594
+
595
+ if (is_throw ) {
596
+ RETURN_THROWS ();
597
+ }
603
598
RETURN_FALSE ;
604
599
}
605
600
@@ -641,7 +636,7 @@ void pdo_sqlite_create_collation_internal(INTERNAL_FUNCTION_PARAMETERS, pdo_sqli
641
636
642
637
ZEND_PARSE_PARAMETERS_START (2 , 2 )
643
638
Z_PARAM_STRING (collation_name , collation_name_len )
644
- Z_PARAM_FUNC (fci , fcc )
639
+ Z_PARAM_FUNC_NO_TRAMPOLINE_FREE (fci , fcc )
645
640
ZEND_PARSE_PARAMETERS_END ();
646
641
647
642
dbh = Z_PDO_DBH_P (ZEND_THIS );
@@ -655,14 +650,16 @@ void pdo_sqlite_create_collation_internal(INTERNAL_FUNCTION_PARAMETERS, pdo_sqli
655
650
if (ret == SQLITE_OK ) {
656
651
collation -> name = estrdup (collation_name );
657
652
658
- ZVAL_COPY (& collation -> callback , & fci . function_name );
653
+ zend_fcc_dup (& collation -> callback , & fcc );
659
654
660
655
collation -> next = H -> collations ;
661
656
H -> collations = collation ;
662
657
663
658
RETURN_TRUE ;
664
659
}
665
660
661
+ zend_release_fcall_info_cache (& fcc );
662
+
666
663
if (UNEXPECTED (EG (exception ))) {
667
664
RETURN_THROWS ();
668
665
}
@@ -706,15 +703,23 @@ static void pdo_sqlite_get_gc(pdo_dbh_t *dbh, zend_get_gc_buffer *gc_buffer)
706
703
707
704
struct pdo_sqlite_func * func = H -> funcs ;
708
705
while (func ) {
709
- zend_get_gc_buffer_add_zval (gc_buffer , & func -> func );
710
- zend_get_gc_buffer_add_zval (gc_buffer , & func -> step );
711
- zend_get_gc_buffer_add_zval (gc_buffer , & func -> fini );
706
+ if (ZEND_FCC_INITIALIZED (func -> func )) {
707
+ zend_get_gc_buffer_add_fcc (gc_buffer , & func -> func );
708
+ }
709
+ if (ZEND_FCC_INITIALIZED (func -> step )) {
710
+ zend_get_gc_buffer_add_fcc (gc_buffer , & func -> step );
711
+ }
712
+ if (ZEND_FCC_INITIALIZED (func -> fini )) {
713
+ zend_get_gc_buffer_add_fcc (gc_buffer , & func -> fini );
714
+ }
712
715
func = func -> next ;
713
716
}
714
717
715
718
struct pdo_sqlite_collation * collation = H -> collations ;
716
719
while (collation ) {
717
- zend_get_gc_buffer_add_zval (gc_buffer , & collation -> callback );
720
+ if (ZEND_FCC_INITIALIZED (collation -> callback )) {
721
+ zend_get_gc_buffer_add_fcc (gc_buffer , & collation -> callback );
722
+ }
718
723
collation = collation -> next ;
719
724
}
720
725
}
0 commit comments