]> granicus.if.org Git - php/commitdiff
info classes + help
authorkrakjoe <joe.watkins@live.co.uk>
Sun, 17 Nov 2013 18:26:56 +0000 (18:26 +0000)
committerkrakjoe <joe.watkins@live.co.uk>
Sun, 17 Nov 2013 18:26:56 +0000 (18:26 +0000)
phpdbg_help.c
phpdbg_help.h
phpdbg_info.c
phpdbg_info.h

index fd09432de572c69fefd586326855f62f57d7b591..c5d769095c607470c85f8e979c8a201fcbf5e754 100644 (file)
@@ -23,6 +23,7 @@
 #include "phpdbg_utils.h"
 #include "phpdbg_break.h"
 #include "phpdbg_list.h"
+#include "phpdbg_info.h"
 
 ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
 
@@ -213,6 +214,28 @@ PHPDBG_HELP(clear) /* {{{ */
     return SUCCESS;
 } /* }}} */
 
+PHPDBG_HELP(info) /* {{{ */
+{
+    phpdbg_help_header();
+    phpdbg_writeln("info commands provides quick access to various types of information about the PHP environment");
+    phpdbg_writeln("Specific info commands are show below:");
+       phpdbg_notice("Commands");
+       {
+           const phpdbg_command_t *info_command = phpdbg_info_commands;
+
+        phpdbg_writeln("\tAlias\tCommand\t\tPurpose");
+           while (info_command && info_command->name) {
+                       if (info_command->alias) {
+                           phpdbg_writeln("\t[%c]\t%s\t\t%s", info_command->alias, info_command->name, info_command->tip);
+                       } else phpdbg_writeln("\t[-]\t%s\t\t%s", info_command->name, info_command->tip);
+                       ++info_command;
+               }
+       }
+       
+    phpdbg_help_footer();
+    return SUCCESS;
+} /* }}} */
+
 PHPDBG_HELP(quiet) /* {{{ */
 {
     phpdbg_help_header();
index e73782b4d1dca5f7f2f272989bdfa3547db6e104..445b84fc907b6257fa432f63993db4ae4bfe1822 100644 (file)
@@ -47,6 +47,7 @@ PHPDBG_HELP(print);
 PHPDBG_HELP(break);
 PHPDBG_HELP(clean);
 PHPDBG_HELP(clear);
+PHPDBG_HELP(info);
 PHPDBG_HELP(back);
 PHPDBG_HELP(quiet);
 PHPDBG_HELP(list);
@@ -69,6 +70,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = {
        PHPDBG_HELP_D(break,    "breakpoints allow execution interruption", 'b'),
        PHPDBG_HELP_D(clean,    "resetting the environment is useful while debugging and recompiling", 'X'),
        PHPDBG_HELP_D(clear,    "clearing breakpoints allows you to run code without interruption", 'c'),
+       PHPDBG_HELP_D(info,             "quick access to useful information on the console", 'i'),
        PHPDBG_HELP_D(back,     "show debug backtrace information during execution", 't'),
     PHPDBG_HELP_D(quiet,    "be quiet during execution", 's'),
        PHPDBG_HELP_D(list,     "listing code gives you quick access to code while executing", 'l'),
index c396f15bfad929b734f6d88c3d4fefb832608614..1b3770eca6fcb39f2afdceb7418b581faeb9177a 100644 (file)
@@ -38,3 +38,68 @@ PHPDBG_INFO(files) /* {{{ */
 
        return SUCCESS;
 } /* }}} */
+
+static inline void phpdbg_print_class_name(zend_class_entry **ce TSRMLS_DC) { /* {{{ */
+       phpdbg_write(
+               "%s %s %s (%d)",
+               ((*ce)->type == ZEND_USER_CLASS) ? 
+                       "User" : "Internal",
+        ((*ce)->ce_flags & ZEND_ACC_INTERFACE) ? 
+                       "Interface" :
+                               ((*ce)->ce_flags & ZEND_ACC_ABSTRACT) ?
+                               "Abstract Class" :
+                                       "Class", 
+               (*ce)->name, zend_hash_num_elements(&(*ce)->function_table));
+} /* }}} */
+
+PHPDBG_INFO(classes) /* {{{ */
+{
+    HashPosition position;
+       zend_class_entry **ce;
+       HashTable classes;
+       
+       zend_hash_init(&classes, 8, NULL, NULL, 0);
+
+       for (zend_hash_internal_pointer_reset_ex(EG(class_table), &position);   
+               zend_hash_get_current_data_ex(EG(class_table), (void**)&ce, &position) == SUCCESS;
+               zend_hash_move_forward_ex(EG(class_table), &position)) {
+
+        if ((*ce)->type == ZEND_USER_CLASS) {
+               zend_hash_next_index_insert(
+                       &classes, ce, sizeof(ce), NULL);
+        }
+       }
+       
+       phpdbg_notice("User Classes (%d)",
+               zend_hash_num_elements(&classes));
+
+       for (zend_hash_internal_pointer_reset_ex(&classes, &position);  
+               zend_hash_get_current_data_ex(&classes, (void**)&ce, &position) == SUCCESS;
+               zend_hash_move_forward_ex(&classes, &position)) {
+
+               phpdbg_print_class_name(ce TSRMLS_CC);
+               phpdbg_writeln(EMPTY);
+               
+               if ((*ce)->parent) {
+                       zend_class_entry *pce = (*ce)->parent;
+                       do {
+                               phpdbg_write("|-------- ");
+                               phpdbg_print_class_name(&pce TSRMLS_CC);
+                               phpdbg_writeln(EMPTY);
+                       } while(pce = pce->parent);
+               }
+               
+        if ((*ce)->info.user.filename) {
+               phpdbg_writeln(
+                       "|---- in %s on line %lu", 
+                       (*ce)->info.user.filename,
+                       (*ce)->info.user.line_start);
+       } else phpdbg_writeln("|---- no source code");
+       }
+
+       zend_hash_destroy(&classes);
+       
+       return SUCCESS;
+} /* }}} */
+
+
index 1e967b07395469f945d594d9d37d00b44a36f1a5..0223ed9f3a6331173feb2be75c9e2408dd65b5f1 100644 (file)
        int PHPDBG_INFO_HANDLER(name)(phpdbg_param_t *param TSRMLS_DC)
 
 PHPDBG_INFO(files);
+PHPDBG_INFO(classes);
 
 static const phpdbg_command_t phpdbg_info_commands[] = {
-    PHPDBG_INFO_EX_D(files,     "lists included files", 'f'),
+    PHPDBG_INFO_EX_D(files,     "lists included files", 'F'),
+    PHPDBG_INFO_EX_D(classes,   "lists loaded classes", 'c'),
     PHPDBG_END_COMAND
 };