@@ -71,6 +71,48 @@ static void nr_drupal8_add_method_callback(const zend_class_entry* ce,
71
71
}
72
72
}
73
73
74
+ #if ZEND_MODULE_API_NO >= ZEND_8_0_X_API_NO \
75
+ && !defined OVERWRITE_ZEND_EXECUTE_DATA
76
+ static void nr_drupal8_add_method_callback_before_after_clean (
77
+ const zend_class_entry * ce ,
78
+ const char * method ,
79
+ size_t method_len ,
80
+ nrspecialfn_t before_callback ,
81
+ nrspecialfn_t after_callback ,
82
+ nrspecialfn_t clean_callback ) {
83
+ zend_function * function = NULL ;
84
+
85
+ if (NULL == ce ) {
86
+ nrl_verbosedebug (NRL_FRAMEWORK , "Drupal 8: got NULL class entry in %s" ,
87
+ __func__ );
88
+ return ;
89
+ }
90
+
91
+ function = nr_php_find_class_method (ce , method );
92
+ if (NULL == function ) {
93
+ nrl_verbosedebug (NRL_FRAMEWORK ,
94
+ "Drupal 8+: cannot get zend_function entry for %.*s::%.*s" ,
95
+ NRSAFELEN (nr_php_class_entry_name_length (ce )),
96
+ nr_php_class_entry_name (ce ), NRSAFELEN (method_len ),
97
+ method );
98
+ return ;
99
+ }
100
+
101
+ if (NULL == nr_php_get_wraprec (function )) {
102
+ char * class_method = nr_formatf (
103
+ "%.*s::%.*s" , NRSAFELEN (nr_php_class_entry_name_length (ce )),
104
+ nr_php_class_entry_name (ce ), NRSAFELEN (method_len ), method );
105
+
106
+ nr_php_wrap_user_function_before_after_clean_with_transience (
107
+ class_method , nr_strlen (class_method ),
108
+ before_callback , after_callback , clean_callback ,
109
+ NR_WRAPREC_NOT_TRANSIENT );
110
+
111
+ nr_free (class_method );
112
+ }
113
+ }
114
+ #endif // OAPI
115
+
74
116
/*
75
117
* Purpose : Check if the given function or method is in the current call
76
118
* stack.
@@ -383,18 +425,10 @@ NR_PHP_WRAPPER(nr_drupal8_post_implements_hook) {
383
425
}
384
426
NR_PHP_WRAPPER_END
385
427
386
- /*
387
- * Temporary exclusion via #if defined OVERWRITE_ZEND_EXECUTE_DATA
388
- * This needs to be excluded for now because the hooks handling was changed
389
- * for oapi so the hook vars this is referencing do not exist.
390
- *
391
- */
392
- #if defined OVERWRITE_ZEND_EXECUTE_DATA
393
428
/*
394
429
* Purpose : Handles ModuleHandlerInterface::invokeAllWith()'s callback
395
430
* and ensure that the relevant module_hook function is instrumented.
396
431
*/
397
-
398
432
NR_PHP_WRAPPER (nr_drupal94_invoke_all_with_callback ) {
399
433
zval * module = NULL ;
400
434
@@ -406,9 +440,24 @@ NR_PHP_WRAPPER(nr_drupal94_invoke_all_with_callback) {
406
440
goto leave ;
407
441
}
408
442
443
+ #if ZEND_MODULE_API_NO >= ZEND_8_0_X_API_NO \
444
+ && !defined OVERWRITE_ZEND_EXECUTE_DATA
445
+ zval * curr_hook
446
+ = (zval * )nr_stack_get_top (& NRPRG (drupal_invoke_all_hooks ));
447
+ if (UNEXPECTED (!nr_php_is_zval_non_empty_string (curr_hook ))) {
448
+ nrl_verbosedebug (NRL_FRAMEWORK ,
449
+ "%s: cannot extract hook name from global stack" ,
450
+ __func__ );
451
+ goto leave ;
452
+ }
409
453
nr_drupal_hook_instrument (Z_STRVAL_P (module ), Z_STRLEN_P (module ),
410
- NRPRG (drupal_module_invoke_all_hook ),
411
- NRPRG (drupal_module_invoke_all_hook_len ) TSRMLS_CC );
454
+ Z_STRVAL_P (curr_hook ), Z_STRLEN_P (curr_hook ));
455
+ #else
456
+ nr_drupal_hook_instrument (Z_STRVAL_P (module ), Z_STRLEN_P (module ),
457
+ NRPRG (drupal_invoke_all_hook ),
458
+ NRPRG (drupal_invoke_all_hook_len ) TSRMLS_CC );
459
+ #endif // OAPI
460
+
412
461
leave :
413
462
NR_PHP_WRAPPER_CALL ;
414
463
nr_php_arg_release (& module );
@@ -424,52 +473,77 @@ NR_PHP_WRAPPER_END
424
473
NR_PHP_WRAPPER (nr_drupal94_invoke_all_with ) {
425
474
zval * callback = NULL ;
426
475
zval * hook = NULL ;
476
+ #if ZEND_MODULE_API_NO < ZEND_8_0_X_API_NO \
477
+ || defined OVERWRITE_ZEND_EXECUTE_DATA
427
478
char * prev_hook = NULL ;
428
479
int prev_hook_len ;
480
+ #endif // not OAPI
429
481
430
482
(void )wraprec ;
431
483
432
484
NR_PHP_WRAPPER_REQUIRE_FRAMEWORK (NR_FW_DRUPAL8 );
433
485
434
486
hook = nr_php_arg_get (1 , NR_EXECUTE_ORIG_ARGS TSRMLS_CC );
435
487
if (!nr_php_is_zval_non_empty_string (hook )) {
488
+ #if ZEND_MODULE_API_NO >= ZEND_8_0_X_API_NO \
489
+ && !defined OVERWRITE_ZEND_EXECUTE_DATA
490
+ nr_php_arg_release (& hook );
491
+ #endif // OAPI
436
492
goto leave ;
437
493
}
438
494
439
- prev_hook = NRPRG (drupal_module_invoke_all_hook );
440
- prev_hook_len = NRPRG (drupal_module_invoke_all_hook_len );
441
- NRPRG (drupal_module_invoke_all_hook )
495
+ #if ZEND_MODULE_API_NO >= ZEND_8_0_X_API_NO \
496
+ && !defined OVERWRITE_ZEND_EXECUTE_DATA
497
+ nr_drupal_invoke_all_hook_stacks_push (hook );
498
+ #else
499
+ prev_hook = NRPRG (drupal_invoke_all_hook );
500
+ prev_hook_len = NRPRG (drupal_invoke_all_hook_len );
501
+ NRPRG (drupal_invoke_all_hook )
442
502
= nr_strndup (Z_STRVAL_P (hook ), Z_STRLEN_P (hook ));
443
- NRPRG (drupal_module_invoke_all_hook_len ) = Z_STRLEN_P (hook );
444
-
503
+ NRPRG (drupal_invoke_all_hook_len ) = Z_STRLEN_P (hook );
504
+ #endif // OAPI
445
505
callback = nr_php_arg_get (2 , NR_EXECUTE_ORIG_ARGS TSRMLS_CC );
506
+
446
507
/* This instrumentation will fail if callback has already been wrapped
447
508
* with a special instrumentation callback in a different context.
448
509
* In this scenario, we will be unable to instrument hooks and modules for
449
510
* this particular call */
450
-
451
- /*
452
- * Temporary exclusion via #if defined OVERWRITE_ZEND_EXECUTE_DATA
453
- * This needs to be excluded for now because the hooks handling was changed
454
- * for oapi so the hook vars this is referencing do not exist.
455
- *
456
- */
457
- #if defined OVERWRITE_ZEND_EXECUTE_DATA
458
511
nr_php_wrap_generic_callable (callback ,
459
512
nr_drupal94_invoke_all_with_callback TSRMLS_CC );
460
- #endif
461
513
NR_PHP_WRAPPER_CALL ;
462
514
463
515
nr_php_arg_release (& callback );
464
- nr_free (NRPRG (drupal_module_invoke_all_hook ));
465
- NRPRG (drupal_module_invoke_all_hook ) = prev_hook ;
466
- NRPRG (drupal_module_invoke_all_hook_len ) = prev_hook_len ;
467
-
468
- leave :
516
+ #if ZEND_MODULE_API_NO < ZEND_8_0_X_API_NO \
517
+ || defined OVERWRITE_ZEND_EXECUTE_DATA
518
+ nr_free (NRPRG (drupal_invoke_all_hook ));
519
+ NRPRG (drupal_invoke_all_hook ) = prev_hook ;
520
+ NRPRG (drupal_invoke_all_hook_len ) = prev_hook_len ;
521
+ #endif // not OAPI
522
+
523
+ leave : ;
524
+ #if ZEND_MODULE_API_NO < ZEND_8_0_X_API_NO \
525
+ || defined OVERWRITE_ZEND_EXECUTE_DATA
526
+ /* for OAPI, the _after callback handles this free */
469
527
nr_php_arg_release (& hook );
528
+ #endif // not OAPI
529
+ }
530
+ NR_PHP_WRAPPER_END
531
+
532
+ #if ZEND_MODULE_API_NO >= ZEND_8_0_X_API_NO \
533
+ && !defined OVERWRITE_ZEND_EXECUTE_DATA
534
+ NR_PHP_WRAPPER (nr_drupal94_invoke_all_with_after ) {
535
+ (void )wraprec ;
536
+ nr_drupal_invoke_all_hook_stacks_pop ();
537
+ }
538
+ NR_PHP_WRAPPER_END
539
+
540
+ NR_PHP_WRAPPER (nr_drupal94_invoke_all_with_clean ) {
541
+ (void )wraprec ;
542
+ nr_drupal_invoke_all_hook_stacks_pop ();
470
543
}
471
544
NR_PHP_WRAPPER_END
472
- #endif /* temporary: defined OVERWRITE_ZEND_EXECUTE_DATA */
545
+ #endif // OAPI
546
+
473
547
/*
474
548
* Purpose : Wrap the invoke() method of the module handler instance in use.
475
549
*/
@@ -502,13 +576,14 @@ NR_PHP_WRAPPER(nr_drupal8_module_handler) {
502
576
nr_drupal8_add_method_callback (ce , NR_PSTR ("implementshook" ),
503
577
nr_drupal8_post_implements_hook TSRMLS_CC );
504
578
/* Drupal 9.4 introduced a replacement method for getImplentations */
505
- /*
506
- * Temporary exclusion via #if defined OVERWRITE_ZEND_EXECUTE_DATA
507
- * This needs to be excluded for now because the hooks handling was changed
508
- * for oapi so the hook vars this is referencing do not exist.
509
- *
510
- */
511
- #if defined OVERWRITE_ZEND_EXECUTE_DATA
579
+ #if ZEND_MODULE_API_NO >= ZEND_8_0_X_API_NO \
580
+ && !defined OVERWRITE_ZEND_EXECUTE_DATA
581
+ nr_drupal8_add_method_callback_before_after_clean (
582
+ ce , NR_PSTR ("invokeallwith" ),
583
+ nr_drupal94_invoke_all_with ,
584
+ nr_drupal94_invoke_all_with_after ,
585
+ nr_drupal94_invoke_all_with_clean );
586
+ #else
512
587
nr_drupal8_add_method_callback (ce , NR_PSTR ("invokeallwith" ),
513
588
nr_drupal94_invoke_all_with TSRMLS_CC );
514
589
#endif
0 commit comments