]> granicus.if.org Git - php/commitdiff
+compile
authorkrakjoe <joe.watkins@live.co.uk>
Sun, 10 Nov 2013 11:35:59 +0000 (11:35 +0000)
committerkrakjoe <joe.watkins@live.co.uk>
Sun, 10 Nov 2013 11:35:59 +0000 (11:35 +0000)
phpdbg.c
phpdbg.h
phpdbg_help.c
phpdbg_help.h
phpdbg_prompt.c

index 88d6eaddaebf65dc8a1bafe28c77a147899645de..b416a54fa640146902d0f8db9722dbcff8c3af55 100644 (file)
--- a/phpdbg.c
+++ b/phpdbg.c
@@ -22,6 +22,7 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg);
 
 static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) {
   pg->exec = NULL;
+  pg->ops = NULL;
 }
 
 static PHP_MINIT_FUNCTION(phpdbg) {
@@ -42,9 +43,15 @@ static PHP_RINIT_FUNCTION(phpdbg) {
 
 static PHP_RSHUTDOWN_FUNCTION(phpdbg) {
   zend_hash_destroy(&PHPDBG_G(breaks));
+  
   if (PHPDBG_G(exec)) {
     efree(PHPDBG_G(exec));
   }
+  
+  if (PHPDBG_G(ops)) {
+    destroy_op_array(PHPDBG_G(ops) TSRMLS_CC);
+    efree(PHPDBG_G(ops));
+  }
 }
 
 static zend_module_entry sapi_phpdbg_module_entry = {
index 94ee7201b84d670bc553c29e03a09eaabdc44bd6..ba3ea5d53383980c125bfb5da8b1dd8896c4fe50 100644 (file)
--- a/phpdbg.h
+++ b/phpdbg.h
@@ -38,8 +38,9 @@
 
 ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
   HashTable breaks;
-  char *exec;       /* file to execute */
-  size_t exec_len;  /* size of exec */
+  char *exec;             /* file to execute */
+  size_t exec_len;        /* size of exec */
+  zend_op_array *ops;     /* op_array */
 ZEND_END_MODULE_GLOBALS(phpdbg)
 
 #include "phpdbg_prompt.h"
index 586cd68cf4f7636d40fe28973aa42de9ed247c2e..48d32a2db346da4b3b9a5cd91311eb88ef506194 100644 (file)
 
 PHPDBG_HELP(exec) /* {{{ */
 {
-  printf("doing exec help: %s\n", expr);
-  
+  printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n");
+  printf("The execution context must be set before execution can take place\n");
+  return SUCCESS;
+} /* }}} */
+
+PHPDBG_HELP(compile) /* {{{ */
+{
+  printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n");
+  printf("The execution context must be set for compilation to succeed\n");
+  printf("If errors occur during compilation they must be resolved before execution can take place.\n");
+  printf("You do not need to exit phpdbg to retry compilation\n");
   return SUCCESS;
 } /* }}} */
 
 PHPDBG_HELP(print) /* {{{ */ 
 {
-  printf("doing print help: %s\n", expr);
+  printf("By default, print will show information about the current execution environment\n");
+  printf("To show specific information pass an expression to print, for example:\n");
+  printf("\tprint opcodes[0]\n");
+  printf("Will show the opline @ 0\n");
+  printf("Available print commands:\n");
+  printf("\tNone\n");
   
   return SUCCESS;
 } /* }}} */
 
 PHPDBG_HELP(brake) /* {{{ */
 {
-    printf("doing brake help: %s\n", expr);
-    
-    return SUCCESS;
+  printf("doing brake help: %s\n", expr);
+  
+  return SUCCESS;
 } /* }}} */
index b3dfb228fdfb17b780d351c721477ca1d7ff492a..87462ca1354cb51080ea4ba155c90652ac84f026 100644 (file)
@@ -32,6 +32,7 @@
  * Helper Forward Declarations
  */
 PHPDBG_HELP(exec);
+PHPDBG_HELP(compile);
 PHPDBG_HELP(print);
 PHPDBG_HELP(brake);
 
@@ -39,9 +40,10 @@ PHPDBG_HELP(brake);
  * Commands
  */
 static const phpdbg_command_t phpdbg_help_commands[] = {
-  PHPDBG_HELP_D(exec,  "the execution context should be a valid phpdbg path"),
-  PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"),
-  PHPDBG_HELP_D(brake, "brake points allow execution interruption"),
+  PHPDBG_HELP_D(exec,     "the execution context should be a valid phpdbg path"),
+  PHPDBG_HELP_D(compile,  "pre-compilation allows inspection of code before execution"),
+  PHPDBG_HELP_D(print,    "printing allows inspection of the execution environment"),
+  PHPDBG_HELP_D(brake,    "brake points allow execution interruption"),
   {NULL, 0, 0}
 };
 
index 6fc59a050671a8f30dab5d3653ca8f0a18ce6795..809273886b63cdcd0f503177ccbe763ac32b0ab7 100644 (file)
@@ -32,6 +32,15 @@ static PHPDBG_COMMAND(exec) { /* {{{ */
     printf(
       "Unsetting old execution context: %s\n", PHPDBG_G(exec));
     efree(PHPDBG_G(exec));
+    PHPDBG_G(exec) = NULL;
+  }
+  
+  if (PHPDBG_G(ops)) {
+    printf(
+      "Destroying compiled opcodes\n");
+    destroy_op_array(PHPDBG_G(ops) TSRMLS_CC);
+    efree(PHPDBG_G(ops));
+    PHPDBG_G(ops) = NULL;
   }
   
   PHPDBG_G(exec) = estrndup(
@@ -39,11 +48,51 @@ static PHPDBG_COMMAND(exec) { /* {{{ */
     
   printf(
     "Set execution context: %s\n", PHPDBG_G(exec));
+    
+  return SUCCESS;
+} /* }}} */
+
+static PHPDBG_COMMAND(compile) { /* {{{ */
+  zend_file_handle fh;
+  
+  if (PHPDBG_G(exec)) {
+    
+    if (PHPDBG_G(ops)) {
+      printf("Destroying compiled opcodes\n");
+      destroy_op_array(PHPDBG_G(ops) TSRMLS_CC);
+      efree(PHPDBG_G(ops));
+    }
+    
+    printf("Attempting compilation of %s\n", PHPDBG_G(exec));
+    if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) {
+      PHPDBG_G(ops) = zend_compile_file(
+        &fh, ZEND_INCLUDE TSRMLS_CC);
+      zend_destroy_file_handle(&fh TSRMLS_CC);
+      printf("Success\n");
+      return SUCCESS;
+    } else {
+      printf("Could not open file %s\n", PHPDBG_G(exec));
+      return FAILURE;
+    }
+  } else {
+    printf("No execution context\n");
+    return FAILURE;
+  }
 } /* }}} */
 
 static PHPDBG_COMMAND(print) { /* {{{ */
-  printf(
-    "%s\n", expr);
+  if (!expr_len) {
+    printf("Showing Execution Context Information:\n");
+    printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none");
+    printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no");
+    if (PHPDBG_G(ops)) {
+      printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last-1);
+      printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1);
+    }
+  } else {
+    printf(
+      "%s\n", expr);
+  }
 
   return SUCCESS;
 } /* }}} */
@@ -93,11 +142,12 @@ static PHPDBG_COMMAND(help) /* {{{ */
 } /* }}} */
 
 static const phpdbg_command_t phpdbg_prompt_commands[] = {
-  PHPDBG_COMMAND_D(exec,  "set execution context"),
-  PHPDBG_COMMAND_D(print, "print something"),
-       PHPDBG_COMMAND_D(brake, "set brake point"),
-       PHPDBG_COMMAND_D(help,  "show help menu"),
-       PHPDBG_COMMAND_D(quit,  "exit phpdbg"),
+  PHPDBG_COMMAND_D(exec,      "set execution context"),
+  PHPDBG_COMMAND_D(compile,   "attempt to pre-compile execution context"),
+  PHPDBG_COMMAND_D(print,     "print something"),
+       PHPDBG_COMMAND_D(brake,     "set brake point"),
+       PHPDBG_COMMAND_D(help,      "show help menu"),
+       PHPDBG_COMMAND_D(quit,      "exit phpdbg"),
        {NULL, 0, 0}
 };