From 6ba5f9c63df75c030f97d672b7ad5be01c1c7f8d Mon Sep 17 00:00:00 2001 From: John Boehr Date: Fri, 9 Feb 2024 17:31:01 -0800 Subject: [PATCH] Require visitors to provide a name --- php_vyrtue.h | 10 +++++----- src/debug.c | 6 +++--- src/extension.c | 43 +++++++++++++++++++++++++++++++++++++++---- src/preprocess.c | 10 +++++----- src/private.h | 1 + src/visitor.c | 21 ++++++++++++--------- 6 files changed, 65 insertions(+), 26 deletions(-) diff --git a/php_vyrtue.h b/php_vyrtue.h index 5d9302c..92129d6 100644 --- a/php_vyrtue.h +++ b/php_vyrtue.h @@ -78,8 +78,8 @@ typedef zend_ast *(*vyrtue_ast_callback)(zend_ast *ast, struct vyrtue_preprocess ZEND_BEGIN_MODULE_GLOBALS(vyrtue) HashTable attribute_visitors; - HashTable kind_hooks; - HashTable function_hooks; + HashTable function_visitors; + HashTable kind_visitors; ZEND_END_MODULE_GLOBALS(vyrtue) ZEND_EXTERN_MODULE_GLOBALS(vyrtue); @@ -92,13 +92,13 @@ VYRTUE_ATTR_NONNULL_ALL void vyrtue_ast_process_file(zend_ast *ast); VYRTUE_PUBLIC -void vyrtue_register_attribute_visitor(zend_string *attribute_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave); +void vyrtue_register_attribute_visitor(const char *visitor_name, zend_string *attribute_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave); VYRTUE_PUBLIC -void vyrtue_register_function_visitor(zend_string *function_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave); +void vyrtue_register_function_visitor(const char *visitor_name, zend_string *function_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave); VYRTUE_PUBLIC -void vyrtue_register_kind_visitor(enum _zend_ast_kind kind, vyrtue_ast_callback enter, vyrtue_ast_callback leave); +void vyrtue_register_kind_visitor(const char *visitor_name, enum _zend_ast_kind kind, vyrtue_ast_callback enter, vyrtue_ast_callback leave); VYRTUE_PUBLIC VYRTUE_ATTR_NONNULL_ALL diff --git a/src/debug.c b/src/debug.c index 891d52f..1bcd7a4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -76,15 +76,15 @@ VYRTUE_LOCAL PHP_MINIT_FUNCTION(vyrtue_debug) zend_string *tmp; tmp = zend_string_init_interned(ZEND_STRL("VyrtueExt\\Debug\\sample_replacement_function"), 1); - vyrtue_register_function_visitor(tmp, vyrtue_debug_sample_replacement_enter, vyrtue_debug_sample_replacement_leave); + vyrtue_register_function_visitor("vyrtue internal debug", tmp, vyrtue_debug_sample_replacement_enter, vyrtue_debug_sample_replacement_leave); zend_string_release(tmp); tmp = zend_string_init_interned(ZEND_STRL("VyrtueExt\\Debug\\sample_function"), 1); - vyrtue_register_function_visitor(tmp, vyrtue_debug_sample_function_enter, vyrtue_debug_sample_function_leave); + vyrtue_register_function_visitor("vyrtue internal debug", tmp, vyrtue_debug_sample_function_enter, vyrtue_debug_sample_function_leave); zend_string_release(tmp); tmp = zend_string_init_interned(ZEND_STRL("VyrtueExt\\Debug\\SampleAttribute"), 1); - vyrtue_register_attribute_visitor(tmp, vyrtue_debug_sample_attribute_enter, vyrtue_debug_sample_attribute_leave); + vyrtue_register_attribute_visitor("vyrtue internal debug", tmp, vyrtue_debug_sample_attribute_enter, vyrtue_debug_sample_attribute_leave); zend_string_release(tmp); return SUCCESS; diff --git a/src/extension.c b/src/extension.c index 982e84c..6f0f67f 100644 --- a/src/extension.c +++ b/src/extension.c @@ -101,8 +101,43 @@ static PHP_MINFO_FUNCTION(vyrtue) php_info_print_table_row(2, "Version", PHP_VYRTUE_VERSION); php_info_print_table_row(2, "Released", PHP_VYRTUE_RELEASE); php_info_print_table_row(2, "Authors", PHP_VYRTUE_AUTHORS); + php_info_print_table_end(); DISPLAY_INI_ENTRIES(); + + php_info_print_table_start(); + + const struct vyrtue_visitor_array *visitors; + zend_ulong num_key; + zend_string *str_key; + char buffer[1000]; + + ZEND_HASH_FOREACH_NUM_KEY_PTR(&VYRTUE_G(kind_visitors), num_key, visitors) + { + for (size_t i = 0; i < visitors->length; i++) { + snprintf(buffer, sizeof(buffer) - 1, "%lu", num_key); + php_info_print_table_row(2, buffer, visitors->data[i].name); + } + } + ZEND_HASH_FOREACH_END(); + + ZEND_HASH_FOREACH_STR_KEY_PTR(&VYRTUE_G(function_visitors), str_key, visitors) + { + for (size_t i = 0; i < visitors->length; i++) { + php_info_print_table_row(2, ZSTR_VAL(str_key), visitors->data[i].name); + } + } + ZEND_HASH_FOREACH_END(); + + ZEND_HASH_FOREACH_STR_KEY_PTR(&VYRTUE_G(attribute_visitors), str_key, visitors) + { + for (size_t i = 0; i < visitors->length; i++) { + php_info_print_table_row(2, ZSTR_VAL(str_key), visitors->data[i].name); + } + } + ZEND_HASH_FOREACH_END(); + + php_info_print_table_end(); } static PHP_GINIT_FUNCTION(vyrtue) @@ -112,15 +147,15 @@ static PHP_GINIT_FUNCTION(vyrtue) #endif memset(vyrtue_globals, 0, sizeof(zend_vyrtue_globals)); zend_hash_init(&vyrtue_globals->attribute_visitors, 16, NULL, NULL, 1); - zend_hash_init(&vyrtue_globals->function_hooks, 16, NULL, NULL, 1); - zend_hash_init(&vyrtue_globals->kind_hooks, 16, NULL, NULL, 1); + zend_hash_init(&vyrtue_globals->function_visitors, 16, NULL, NULL, 1); + zend_hash_init(&vyrtue_globals->kind_visitors, 16, NULL, NULL, 1); } static PHP_GSHUTDOWN_FUNCTION(vyrtue) { zend_hash_destroy(&vyrtue_globals->attribute_visitors); - zend_hash_destroy(&vyrtue_globals->function_hooks); - zend_hash_destroy(&vyrtue_globals->kind_hooks); + zend_hash_destroy(&vyrtue_globals->function_visitors); + zend_hash_destroy(&vyrtue_globals->kind_visitors); } const zend_function_entry vyrtue_functions[] = { diff --git a/src/preprocess.c b/src/preprocess.c index 33d0337..470dd70 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -501,11 +501,11 @@ void vyrtue_ast_process_file(zend_ast *ast) VYRTUE_LOCAL PHP_MINIT_FUNCTION(vyrtue_preprocess) { - vyrtue_register_kind_visitor(ZEND_AST_USE, vyrtue_ast_process_use_enter, NULL); - vyrtue_register_kind_visitor(ZEND_AST_GROUP_USE, vyrtue_ast_process_group_use_enter, vyrtue_ast_process_group_use_leave); - vyrtue_register_kind_visitor(ZEND_AST_NAMESPACE, vyrtue_ast_process_namespace_enter, vyrtue_ast_process_namespace_leave); - vyrtue_register_kind_visitor(ZEND_AST_CALL, vyrtue_ast_process_call_enter, vyrtue_ast_process_call_leave); - vyrtue_register_kind_visitor(ZEND_AST_CLASS, vyrtue_ast_process_class_enter, vyrtue_ast_process_class_leave); + vyrtue_register_kind_visitor("vyrtue internal", ZEND_AST_USE, vyrtue_ast_process_use_enter, NULL); + vyrtue_register_kind_visitor("vyrtue internal", ZEND_AST_GROUP_USE, vyrtue_ast_process_group_use_enter, vyrtue_ast_process_group_use_leave); + vyrtue_register_kind_visitor("vyrtue internal", ZEND_AST_NAMESPACE, vyrtue_ast_process_namespace_enter, vyrtue_ast_process_namespace_leave); + vyrtue_register_kind_visitor("vyrtue internal", ZEND_AST_CALL, vyrtue_ast_process_call_enter, vyrtue_ast_process_call_leave); + vyrtue_register_kind_visitor("vyrtue internal", ZEND_AST_CLASS, vyrtue_ast_process_class_enter, vyrtue_ast_process_class_leave); return SUCCESS; } diff --git a/src/private.h b/src/private.h index f1f23cd..dd8fb50 100644 --- a/src/private.h +++ b/src/private.h @@ -31,6 +31,7 @@ struct vyrtue_preprocess_context struct vyrtue_visitor { + const char *name; vyrtue_ast_callback enter; vyrtue_ast_callback leave; }; diff --git a/src/visitor.c b/src/visitor.c index e3b200e..80e040c 100644 --- a/src/visitor.c +++ b/src/visitor.c @@ -38,9 +38,10 @@ static const struct vyrtue_visitor_array EMPTY_VISITOR_ARRAY = { }; VYRTUE_PUBLIC -void vyrtue_register_attribute_visitor(zend_string *attribute_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave) +void vyrtue_register_attribute_visitor(const char *visitor_name, zend_string *attribute_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave) { struct vyrtue_visitor visitor = { + .name = visitor_name, .enter = enter, .leave = leave, }; @@ -64,14 +65,15 @@ void vyrtue_register_attribute_visitor(zend_string *attribute_name, vyrtue_ast_c } VYRTUE_PUBLIC -void vyrtue_register_function_visitor(zend_string *function_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave) +void vyrtue_register_function_visitor(const char *visitor_name, zend_string *function_name, vyrtue_ast_callback enter, vyrtue_ast_callback leave) { struct vyrtue_visitor visitor = { + .name = visitor_name, .enter = enter, .leave = leave, }; - struct vyrtue_visitor_array *arr = zend_hash_find_ptr(&VYRTUE_G(function_hooks), function_name); + struct vyrtue_visitor_array *arr = zend_hash_find_ptr(&VYRTUE_G(function_visitors), function_name); if (!arr) { size_t size = sizeof(*arr) + sizeof(arr->data[0]); arr = pemalloc(size, 1); @@ -86,18 +88,19 @@ void vyrtue_register_function_visitor(zend_string *function_name, vyrtue_ast_cal arr->data[arr->length] = visitor; arr->length++; - zend_hash_update_ptr(&VYRTUE_G(function_hooks), function_name, arr); + zend_hash_update_ptr(&VYRTUE_G(function_visitors), function_name, arr); } VYRTUE_PUBLIC -void vyrtue_register_kind_visitor(enum _zend_ast_kind kind, vyrtue_ast_callback enter, vyrtue_ast_callback leave) +void vyrtue_register_kind_visitor(const char *visitor_name, enum _zend_ast_kind kind, vyrtue_ast_callback enter, vyrtue_ast_callback leave) { struct vyrtue_visitor visitor = { + .name = visitor_name, .enter = enter, .leave = leave, }; - struct vyrtue_visitor_array *arr = zend_hash_index_find_ptr(&VYRTUE_G(kind_hooks), (zend_ulong) kind); + struct vyrtue_visitor_array *arr = zend_hash_index_find_ptr(&VYRTUE_G(kind_visitors), (zend_ulong) kind); if (!arr) { size_t size = sizeof(*arr) + sizeof(arr->data[0]); arr = pemalloc(size, 1); @@ -112,7 +115,7 @@ void vyrtue_register_kind_visitor(enum _zend_ast_kind kind, vyrtue_ast_callback arr->data[arr->length] = visitor; arr->length++; - zend_hash_index_update_ptr(&VYRTUE_G(kind_hooks), (zend_ulong) kind, arr); + zend_hash_index_update_ptr(&VYRTUE_G(kind_visitors), (zend_ulong) kind, arr); } VYRTUE_PUBLIC @@ -135,7 +138,7 @@ VYRTUE_ATTR_RETURNS_NONNULL VYRTUE_ATTR_WARN_UNUSED_RESULT const struct vyrtue_visitor_array *vyrtue_get_function_visitors(zend_string *function_name) { - const struct vyrtue_visitor_array *arr = zend_hash_find_ptr(&VYRTUE_G(function_hooks), function_name); + const struct vyrtue_visitor_array *arr = zend_hash_find_ptr(&VYRTUE_G(function_visitors), function_name); if (arr) { return arr; } else { @@ -149,7 +152,7 @@ VYRTUE_ATTR_RETURNS_NONNULL VYRTUE_ATTR_WARN_UNUSED_RESULT const struct vyrtue_visitor_array *vyrtue_get_kind_visitors(enum _zend_ast_kind kind) { - const struct vyrtue_visitor_array *arr = zend_hash_index_find_ptr(&VYRTUE_G(kind_hooks), (zend_ulong) kind); + const struct vyrtue_visitor_array *arr = zend_hash_index_find_ptr(&VYRTUE_G(kind_visitors), (zend_ulong) kind); if (arr) { return arr; } else {