diff --git a/phpdbg_info.c b/phpdbg_info.c index b67d8fbbce1..f1700cf85ef 100644 --- a/phpdbg_info.c +++ b/phpdbg_info.c @@ -149,3 +149,41 @@ PHPDBG_INFO(classes) /* {{{ */ return SUCCESS; } /* }}} */ + +PHPDBG_INFO(funcs) /* {{{ */ +{ + HashPosition position; + zend_function *zf, **pzf; + HashTable functions; + + zend_hash_init(&functions, 8, NULL, NULL, 0); + + for (zend_hash_internal_pointer_reset_ex(EG(function_table), &position); + zend_hash_get_current_data_ex(EG(function_table), (void**)&zf, &position) == SUCCESS; + zend_hash_move_forward_ex(EG(function_table), &position)) { + + if (zf->type == ZEND_USER_FUNCTION) { + zend_hash_next_index_insert( + &functions, (void**) &zf, sizeof(zend_function), NULL); + } + } + + phpdbg_notice("User Functions (%d)", + zend_hash_num_elements(&functions)); + + for (zend_hash_internal_pointer_reset_ex(&functions, &position); + zend_hash_get_current_data_ex(&functions, (void**)&pzf, &position) == SUCCESS; + zend_hash_move_forward_ex(&functions, &position)) { + zend_op_array *op_array = &((*pzf)->op_array); + + phpdbg_writeln( + "|-------- %s in %s on line %d", + op_array->function_name ? op_array->function_name : "{main}", + op_array->filename ? op_array->filename : "(no source code)", + op_array->line_start); + } + + zend_hash_destroy(&functions); + + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_info.h b/phpdbg_info.h index 583627674b3..87da3ce0ddd 100644 --- a/phpdbg_info.h +++ b/phpdbg_info.h @@ -38,12 +38,14 @@ PHPDBG_INFO(files); PHPDBG_INFO(classes); +PHPDBG_INFO(funcs); PHPDBG_INFO(error); PHPDBG_INFO(vars); static const phpdbg_command_t phpdbg_info_commands[] = { PHPDBG_INFO_EX_D(files, "lists included files", 'F'), PHPDBG_INFO_EX_D(classes, "lists loaded classes", 'c'), + PHPDBG_INFO_EX_D(funcs, "lists loaded classes", 'f'), PHPDBG_INFO_EX_D(error, "show the last error", 'e'), PHPDBG_INFO_EX_D(vars, "show active variables", 'v'), PHPDBG_END_COMAND