From 2977840a4a1325ba5d94f20ac8adc1ffecd3a54c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 14:43:46 +0000 Subject: [PATCH] eval() --- phpdbg.c | 1 + phpdbg_help.c | 6 ++++++ phpdbg_help.h | 2 ++ phpdbg_prompt.c | 23 ++++++++++++++++++++++- test.php | 3 +++ 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index 1379b6b7bf..282588967f 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -27,6 +27,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { pg->exec = NULL; pg->ops = NULL; pg->stepping = 0; + pg->vmret = 0; } static PHP_MINIT_FUNCTION(phpdbg) { diff --git a/phpdbg_help.c b/phpdbg_help.c index a72f53fd13..b397198841 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -72,6 +72,12 @@ PHPDBG_HELP(run) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(eval) /* {{{ */ +{ + printf("Access to eval() allows you to change the environment during execution, careful though !!"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(break) /* {{{ */ { printf("doing break help: %s\n", expr); diff --git a/phpdbg_help.h b/phpdbg_help.h index 69b710f782..7359812b70 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -36,6 +36,7 @@ PHPDBG_HELP(compile); PHPDBG_HELP(step); PHPDBG_HELP(next); PHPDBG_HELP(run); +PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); @@ -48,6 +49,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), PHPDBG_HELP_D(next, "execute the next opcode"), PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), + PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 0dfe14b1be..326aa442a0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -115,11 +115,27 @@ static PHPDBG_COMMAND(run) { /* {{{ */ return SUCCESS; } else { - printf("Nothing to execute !"); + printf("Nothing to execute !\n"); return FAILURE; } } /* }}} */ +static PHPDBG_COMMAND(eval) { /* {{{ */ + zval retval; + + if (expr) { + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { + printf("Success\n"); + zval_dtor(&retval); + } + } else { + printf("No expression provided !\n"); + return FAILURE; + } + + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(print) { /* {{{ */ if (!expr_len) { printf("Showing Execution Context Information:\n"); @@ -132,6 +148,10 @@ static PHPDBG_COMMAND(print) { /* {{{ */ printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); } else printf("Variables\tNone\n"); } + printf("Executing\t:%s\n", EG(in_execution) ? "yes" : "no"); + if (EG(in_execution)) { + printf("VM Return\t%d\n", PHPDBG_G(vmret)); + } } else { printf( "%s\n", expr); @@ -190,6 +210,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(step, "step through execution"), PHPDBG_COMMAND_D(next, "next opcode"), PHPDBG_COMMAND_D(run, "attempt execution"), + PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(help, "show help menu"), diff --git a/test.php b/test.php index 2f3600c6a0..cbb2641e4f 100644 --- a/test.php +++ b/test.php @@ -1,3 +1,6 @@ -- 2.50.1