summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Weinand <bobwei9@hotmail.com>2016-10-02 12:46:22 +0100
committerBob Weinand <bobwei9@hotmail.com>2016-10-02 12:46:22 +0100
commitf58cf8b24dc01d79a07035a794531bedc1b0b3f3 (patch)
treede5771069561214d803fa2d02bfe8553fb11ad06
parent3fe1010ceebe231afcee8aceae6782c18da23539 (diff)
parent417a8ef6b45ed8510faf5ebfb7b4f8c76cb97934 (diff)
downloadphp-git-f58cf8b24dc01d79a07035a794531bedc1b0b3f3.tar.gz
Merge branch 'PHP-7.0' into PHP-7.1
-rw-r--r--sapi/phpdbg/phpdbg.c26
-rw-r--r--sapi/phpdbg/phpdbg.h3
-rw-r--r--sapi/phpdbg/phpdbg_lexer.c362
-rw-r--r--sapi/phpdbg/phpdbg_lexer.l2
-rw-r--r--sapi/phpdbg/phpdbg_parser.c65
-rw-r--r--sapi/phpdbg/phpdbg_parser.y5
-rw-r--r--sapi/phpdbg/phpdbg_prompt.c27
-rw-r--r--sapi/phpdbg/phpdbg_prompt.h2
-rw-r--r--sapi/phpdbg/tests/run_002.phpt50
9 files changed, 288 insertions, 254 deletions
diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c
index 0e891f3869..5a1bd3a6b4 100644
--- a/sapi/phpdbg/phpdbg.c
+++ b/sapi/phpdbg/phpdbg.c
@@ -866,7 +866,7 @@ static void php_sapi_phpdbg_log_message(char *message, int syslog_type_int) /* {
}
do {
- switch (phpdbg_interactive(1)) {
+ switch (phpdbg_interactive(1, NULL)) {
case PHPDBG_LEAVE:
case PHPDBG_FINISH:
case PHPDBG_UNTIL:
@@ -972,7 +972,7 @@ static inline void php_sapi_phpdbg_flush(void *context) /* {{{ */
} /* }}} */
/* copied from sapi/cli/php_cli.c cli_register_file_handles */
-static void phpdbg_register_file_handles(void) /* {{{ */
+void phpdbg_register_file_handles(void) /* {{{ */
{
zval zin, zout, zerr;
php_stream *s_in, *s_out, *s_err;
@@ -1004,18 +1004,21 @@ static void phpdbg_register_file_handles(void) /* {{{ */
ic.flags = CONST_CS;
ic.name = zend_string_init(ZEND_STRL("STDIN"), 0);
ic.module_number = 0;
+ zend_hash_del(EG(zend_constants), ic.name);
zend_register_constant(&ic);
oc.value = zout;
oc.flags = CONST_CS;
oc.name = zend_string_init(ZEND_STRL("STDOUT"), 0);
oc.module_number = 0;
+ zend_hash_del(EG(zend_constants), oc.name);
zend_register_constant(&oc);
ec.value = zerr;
ec.flags = CONST_CS;
ec.name = zend_string_init(ZEND_STRL("STDERR"), 0);
ec.module_number = 0;
+ zend_hash_del(EG(zend_constants), ec.name);
zend_register_constant(&ec);
}
/* }}} */
@@ -1344,6 +1347,7 @@ int main(int argc, char **argv) /* {{{ */
zend_bool ini_ignore;
char *ini_override;
char *exec = NULL;
+ char *first_command = NULL;
char *init_file;
size_t init_file_len;
zend_bool init_file_default;
@@ -1813,7 +1817,6 @@ phpdbg_main:
/* set default prompt */
phpdbg_set_prompt(PHPDBG_DEFAULT_PROMPT);
-/* refactor to preserve run commands on force run command */
{
php_stream_wrapper *wrapper = zend_hash_str_find_ptr(php_stream_get_url_stream_wrappers_hash(), ZEND_STRL("php"));
PHPDBG_G(orig_url_wrap_php) = wrapper->wops->stream_opener;
@@ -1899,7 +1902,11 @@ phpdbg_interact:
PHPDBG_G(flags) |= PHPDBG_IS_INTERACTIVE;
}
zend_try {
- PHPDBG_COMMAND_HANDLER(run)(NULL);
+ if (first_command) {
+ phpdbg_interactive(1, estrdup(first_command));
+ } else {
+ PHPDBG_COMMAND_HANDLER(run)(NULL);
+ }
} zend_end_try();
if (quit_immediately) {
/* if -r is on the command line more than once just quit */
@@ -1910,7 +1917,7 @@ phpdbg_interact:
}
CG(unclean_shutdown) = 0;
- phpdbg_interactive(1);
+ phpdbg_interactive(1, NULL);
} zend_catch {
if ((PHPDBG_G(flags) & PHPDBG_IS_CLEANING)) {
char *bp_tmp_str;
@@ -1968,6 +1975,11 @@ phpdbg_out:
phpdbg_out:
#endif
+ if (first_command) {
+ free(first_command);
+ first_command = NULL;
+ }
+
if (cleaning <= 0) {
PHPDBG_G(flags) &= ~PHPDBG_IS_CLEANING;
cleaning = -1;
@@ -2023,6 +2035,7 @@ phpdbg_out:
settings->input_buflen = PHPDBG_G(input_buflen);
memcpy(settings->input_buffer, PHPDBG_G(input_buffer), settings->input_buflen);
settings->flags = PHPDBG_G(flags) & PHPDBG_PRESERVE_FLAGS_MASK;
+ first_command = PHPDBG_G(cur_command);
} else {
if (PHPDBG_G(prompt)[0]) {
free(PHPDBG_G(prompt)[0]);
@@ -2030,6 +2043,9 @@ phpdbg_out:
if (PHPDBG_G(prompt)[1]) {
free(PHPDBG_G(prompt)[1]);
}
+ if (PHPDBG_G(cur_command)) {
+ free(PHPDBG_G(cur_command));
+ }
}
if (exit_status == 0) {
diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h
index 3a1ff0e723..84041b125c 100644
--- a/sapi/phpdbg/phpdbg.h
+++ b/sapi/phpdbg/phpdbg.h
@@ -235,6 +235,8 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input);
}
+void phpdbg_register_file_handles(void);
+
/* {{{ structs */
ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
HashTable bp[PHPDBG_BREAK_TABLES]; /* break points */
@@ -245,6 +247,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
phpdbg_frame_t frame; /* frame */
uint32_t last_line; /* last executed line */
+ char *cur_command; /* current command */
phpdbg_lexer_data lexer; /* lexer data */
phpdbg_param_t *parser_stack; /* param stack during lexer / parser phase */
diff --git a/sapi/phpdbg/phpdbg_lexer.c b/sapi/phpdbg/phpdbg_lexer.c
index 281f882b62..d93c66f94d 100644
--- a/sapi/phpdbg/phpdbg_lexer.c
+++ b/sapi/phpdbg/phpdbg_lexer.c
@@ -1659,7 +1659,7 @@ yyc_RAW:
232, 236, 0, 232, 232, 236, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
- 236, 232, 32, 224, 232, 232, 232, 64,
+ 236, 232, 32, 224, 232, 232, 232, 128,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
232, 232, 232, 232, 232, 232, 232, 232,
@@ -1793,23 +1793,27 @@ yy179:
YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(180, *YYCURSOR);
- if (yybm[0+yych] & 8) {
+ if (yybm[0+yych] & 16) {
+ goto yy179;
+ }
+ if (yych <= '!') {
+ if (yych <= 0x00) goto yy172;
+ if (yych == '\n') goto yy172;
+ goto yy177;
+ } else {
+ if (yych <= '"') goto yy211;
+ if (yych == '\'') goto yy193;
goto yy177;
}
- if (yych <= '\n') goto yy172;
- if (yych <= '"') goto yy190;
- if (yych <= '#') goto yy172;
- if (yych <= '\'') goto yy191;
- goto yy179;
yy181:
YYDEBUG(181, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- if (yybm[0+yych] & 64) {
- goto yy187;
+ if (yybm[0+yych] & 128) {
+ goto yy207;
}
- if (yych >= '#') goto yy189;
+ if (yych >= '#') goto yy209;
yy182:
YYDEBUG(182, *YYCURSOR);
YYCURSOR = YYMARKER;
@@ -1840,124 +1844,66 @@ yy186:
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- if (yych == '\'') goto yy184;
- if (yych == '\\') goto yy184;
- goto yy182;
-yy187:
YYDEBUG(187, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(188, *YYCURSOR);
- if (yybm[0+yych] & 64) {
- goto yy187;
+ if (yybm[0+yych] & 32) {
+ goto yy184;
}
if (yych <= '\n') goto yy182;
- if (yych <= '"') goto yy177;
-yy189:
- YYDEBUG(189, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yych == '"') goto yy187;
- if (yych == '\\') goto yy187;
- goto yy182;
-yy190:
- YYDEBUG(190, *YYCURSOR);
+ if (yych >= '(') goto yy186;
+yy188:
+ YYDEBUG(188, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
+ YYDEBUG(189, *YYCURSOR);
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
- goto yy205;
+ goto yy188;
} else {
if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy205;
- goto yy181;
+ if (yych <= '!') goto yy188;
+ goto yy192;
}
} else {
if (yych <= '\'') {
- if (yych <= '#') goto yy187;
- if (yych <= '&') goto yy205;
- goto yy207;
+ if (yych <= '#') goto yy184;
+ if (yych <= '&') goto yy188;
+ goto yy193;
} else {
- if (yych == '\\') goto yy208;
- goto yy205;
+ if (yych != '\\') goto yy188;
}
}
-yy191:
- YYDEBUG(191, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
+yy190:
+ YYDEBUG(190, *YYCURSOR);
+ ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- if (yych <= '"') {
- if (yych <= '\t') {
- if (yych <= 0x00) goto yy172;
- } else {
- if (yych <= '\n') goto yy172;
- if (yych >= '"') goto yy194;
- }
+ YYDEBUG(191, *YYCURSOR);
+ if (yych <= '!') {
+ if (yych <= 0x00) goto yy172;
+ if (yych == '\n') goto yy172;
+ goto yy188;
} else {
- if (yych <= '\'') {
- if (yych <= '#') goto yy184;
- if (yych >= '\'') goto yy183;
- } else {
- if (yych == '\\') goto yy195;
- }
+ if (yych <= '"') goto yy203;
+ if (yych == '\\') goto yy190;
+ goto yy188;
}
yy192:
YYDEBUG(192, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(193, *YYCURSOR);
- if (yych <= '"') {
- if (yych <= '\t') {
- if (yych <= 0x00) goto yy172;
- goto yy192;
- } else {
- if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy192;
- }
- } else {
- if (yych <= '\'') {
- if (yych <= '#') goto yy184;
- if (yych <= '&') goto yy192;
- goto yy191;
- } else {
- if (yych == '\\') goto yy195;
- goto yy192;
- }
- }
-yy194:
- YYDEBUG(194, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy200;
+ if (yybm[0+yych] & 64) {
+ goto yy196;
}
if (yych <= '\n') goto yy182;
if (yych <= '"') goto yy184;
- if (yych <= '\'') goto yy205;
- goto yy210;
-yy195:
- YYDEBUG(195, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy177;
- }
- if (yych <= '\n') goto yy172;
- if (yych <= '"') goto yy190;
- if (yych <= '#') goto yy172;
- if (yych <= '\'') goto yy192;
- YYDEBUG(196, *YYCURSOR);
+ if (yych <= '\'') goto yy194;
+ goto yy198;
+yy193:
+ YYDEBUG(193, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
@@ -1965,81 +1911,96 @@ yy195:
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
- goto yy192;
+ goto yy188;
} else {
if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy192;
+ if (yych <= '!') goto yy188;
+ goto yy192;
}
} else {
if (yych <= '\'') {
if (yych <= '#') goto yy184;
- if (yych <= '&') goto yy192;
- goto yy191;
+ if (yych <= '&') goto yy188;
+ goto yy183;
} else {
- if (yych == '\\') goto yy195;
- goto yy192;
+ if (yych == '\\') goto yy190;
+ goto yy188;
}
}
-yy197:
- YYDEBUG(197, *YYCURSOR);
+yy194:
+ YYDEBUG(194, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
+ YYDEBUG(195, *YYCURSOR);
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
+ goto yy194;
} else {
if (yych <= '\n') goto yy172;
- if (yych >= '"') goto yy194;
+ if (yych <= '!') goto yy194;
+ goto yy211;
}
} else {
if (yych <= '\'') {
- if (yych <= '#') goto yy200;
- if (yych >= '\'') goto yy202;
+ if (yych <= '#') goto yy207;
+ if (yych <= '&') goto yy194;
+ goto yy206;
} else {
- if (yych == '\\') goto yy203;
+ if (yych == '\\') goto yy212;
+ goto yy194;
}
}
+yy196:
+ YYDEBUG(196, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(1);
+ yych = *YYCURSOR;
+ YYDEBUG(197, *YYCURSOR);
+ if (yybm[0+yych] & 64) {
+ goto yy196;
+ }
+ if (yych <= '\n') goto yy182;
+ if (yych <= '"') goto yy188;
+ if (yych <= '\'') goto yy194;
yy198:
YYDEBUG(198, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(1);
+ yych = *YYCURSOR;
+ YYDEBUG(199, *YYCURSOR);
+ if (yybm[0+yych] & 64) {
+ goto yy196;
+ }
+ if (yych <= '\n') goto yy182;
+ if (yych >= '(') goto yy198;
+yy200:
+ YYDEBUG(200, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(199, *YYCURSOR);
+ YYDEBUG(201, *YYCURSOR);
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
- goto yy198;
+ goto yy200;
} else {
if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy198;
- goto yy197;
+ if (yych <= '!') goto yy200;
+ goto yy203;
}
} else {
if (yych <= '\'') {
- if (yych <= '#') goto yy200;
- if (yych <= '&') goto yy198;
- goto yy202;
+ if (yych <= '#') goto yy196;
+ if (yych <= '&') goto yy200;
} else {
- if (yych == '\\') goto yy203;
- goto yy198;
+ if (yych == '\\') goto yy204;
+ goto yy200;
}
}
-yy200:
- YYDEBUG(200, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- YYDEBUG(201, *YYCURSOR);
- if (yybm[0+yych] & 128) {
- goto yy200;
- }
- if (yych <= '\n') goto yy182;
- if (yych <= '"') goto yy192;
- if (yych <= '\'') goto yy205;
- goto yy210;
yy202:
YYDEBUG(202, *YYCURSOR);
yyaccept = 0;
@@ -2049,34 +2010,23 @@ yy202:
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
- goto yy198;
+ goto yy200;
} else {
if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy198;
- goto yy197;
+ if (yych <= '!') goto yy200;
}
} else {
if (yych <= '\'') {
- if (yych <= '#') goto yy200;
- if (yych <= '&') goto yy198;
- goto yy207;
+ if (yych <= '#') goto yy196;
+ if (yych <= '&') goto yy200;
+ goto yy206;
} else {
- if (yych != '\\') goto yy198;
+ if (yych == '\\') goto yy204;
+ goto yy200;
}
}
yy203:
YYDEBUG(203, *YYCURSOR);
- ++YYCURSOR;
- YYFILL(1);
- yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy177;
- }
- if (yych <= '\n') goto yy172;
- if (yych <= '"') goto yy205;
- if (yych <= '#') goto yy172;
- if (yych <= '\'') goto yy192;
- YYDEBUG(204, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
@@ -2084,72 +2034,71 @@ yy203:
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
- goto yy198;
+ goto yy200;
} else {
if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy198;
- goto yy197;
+ if (yych <= '!') goto yy200;
+ goto yy192;
}
} else {
if (yych <= '\'') {
- if (yych <= '#') goto yy200;
- if (yych <= '&') goto yy198;
+ if (yych <= '#') goto yy196;
+ if (yych <= '&') goto yy200;
goto yy202;
} else {
- if (yych == '\\') goto yy203;
- goto yy198;
+ if (yych != '\\') goto yy200;
}
}
-yy205:
- YYDEBUG(205, *YYCURSOR);
- yyaccept = 0;
- YYMARKER = ++YYCURSOR;
+yy204:
+ YYDEBUG(204, *YYCURSOR);
+ ++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- YYDEBUG(206, *YYCURSOR);
- if (yych <= '"') {
- if (yych <= '\t') {
- if (yych <= 0x00) goto yy172;
- goto yy205;
- } else {
- if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy205;
- goto yy190;
- }
+ YYDEBUG(205, *YYCURSOR);
+ if (yych <= '\n') {
+ if (yych <= 0x00) goto yy172;
+ if (yych <= '\t') goto yy200;
+ goto yy172;
} else {
- if (yych <= '\'') {
- if (yych <= '#') goto yy187;
- if (yych <= '&') goto yy205;
- } else {
- if (yych == '\\') goto yy208;
- goto yy205;
- }
+ if (yych == '\\') goto yy204;
+ goto yy200;
+ }
+yy206:
+ YYDEBUG(206, *YYCURSOR);
+ ++YYCURSOR;
+ YYFILL(1);
+ yych = *YYCURSOR;
+ if (yybm[0+yych] & 64) {
+ goto yy196;
}
+ if (yych <= '\n') goto yy182;
+ if (yych <= '"') goto yy188;
+ if (yych >= '(') goto yy198;
yy207:
YYDEBUG(207, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
+ YYDEBUG(208, *YYCURSOR);
if (yybm[0+yych] & 128) {
- goto yy200;
+ goto yy207;
}
if (yych <= '\n') goto yy182;
- if (yych <= '"') goto yy192;
- if (yych <= '\'') goto yy187;
- goto yy210;
-yy208:
- YYDEBUG(208, *YYCURSOR);
+ if (yych <= '"') goto yy177;
+yy209:
+ YYDEBUG(209, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
- if (yybm[0+yych] & 8) {
- goto yy177;
+ YYDEBUG(210, *YYCURSOR);
+ if (yybm[0+yych] & 128) {
+ goto yy207;
}
- if (yych <= '\n') goto yy172;
- if (yych <= '"') goto yy205;
- if (yych <= '#') goto yy172;
- if (yych <= '\'') goto yy191;
- YYDEBUG(209, *YYCURSOR);
+ if (yych <= '\n') goto yy182;
+ if (yych <= '"') goto yy194;
+ goto yy209;
+yy211:
+ YYDEBUG(211, *YYCURSOR);
yyaccept = 0;
YYMARKER = ++YYCURSOR;
YYFILL(1);
@@ -2157,34 +2106,35 @@ yy208:
if (yych <= '"') {
if (yych <= '\t') {
if (yych <= 0x00) goto yy172;
- goto yy205;
+ goto yy194;
} else {
if (yych <= '\n') goto yy172;
- if (yych <= '!') goto yy205;
- goto yy190;
+ if (yych <= '!') goto yy194;
+ goto yy181;
}
} else {
if (yych <= '\'') {
- if (yych <= '#') goto yy187;
- if (yych <= '&') goto yy205;
- goto yy202;
+ if (yych <= '#') goto yy207;
+ if (yych <= '&') goto yy194;
+ goto yy206;
} else {
- if (yych == '\\') goto yy208;
- goto yy205;
+ if (yych != '\\') goto yy194;
}
}
-yy210:
- YYDEBUG(210, *YYCURSOR);
+yy212:
+ YYDEBUG(212, *YYCURSOR);
++YYCURSOR;
YYFILL(1);
yych = *YYCURSOR;
+ YYDEBUG(213, *YYCURSOR);
if (yych <= '&') {
- if (yych == '"') goto yy187;
- goto yy182;
+ if (yych <= 0x00) goto yy172;
+ if (yych == '\n') goto yy172;
+ goto yy194;
} else {
- if (yych <= '\'') goto yy184;
- if (yych == '\\') goto yy200;
- goto yy182;
+ if (yych <= '\'') goto yy202;
+ if (yych == '\\') goto yy212;
+ goto yy194;
}
}
}
diff --git a/sapi/phpdbg/phpdbg_lexer.l b/sapi/phpdbg/phpdbg_lexer.l
index b9c247a494..820eac7f84 100644
--- a/sapi/phpdbg/phpdbg_lexer.l
+++ b/sapi/phpdbg/phpdbg_lexer.l
@@ -82,7 +82,7 @@ ID [^ \r\n\t:#\000]+
GENERIC_ID ([^ \r\n\t:#\000"']|":\\")+|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+[']
ADDR [0][x][a-fA-F0-9]+
OPCODE (ZEND_|zend_)([A-Za-z])+
-INPUT ([^\n\000#"']|"\\"["']|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+['])+
+INPUT ("\\"[#"']|["]("\\\\"|"\\"["]|[^\n\000"])+["]|[']("\\"[']|"\\\\"|[^\n\000'])+[']|[^\n\000#"'])+
<!*> := yyleng = (size_t) YYCURSOR - (size_t) yytext;
diff --git a/sapi/phpdbg/phpdbg_parser.c b/sapi/phpdbg/phpdbg_parser.c
index c5222a0289..d68c0ff441 100644
--- a/sapi/phpdbg/phpdbg_parser.c
+++ b/sapi/phpdbg/phpdbg_parser.c
@@ -70,7 +70,7 @@
/* Copy the first part of user declarations. */
/* Line 371 of yacc.c */
-#line 1 "sapi/phpdbg/phpdbg_parser.y"
+#line 1 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
/*
@@ -134,7 +134,7 @@ extern int phpdbg_debug;
#endif
/* "%code requires" blocks. */
/* Line 387 of yacc.c */
-#line 36 "sapi/phpdbg/phpdbg_parser.y"
+#line 36 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
#include "phpdbg.h"
#ifndef YY_TYPEDEF_YY_SCANNER_T
@@ -1469,49 +1469,49 @@ yyreduce:
{
case 2:
/* Line 1802 of yacc.c */
-#line 71 "sapi/phpdbg/phpdbg_parser.y"
+#line 71 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 3:
/* Line 1802 of yacc.c */
-#line 72 "sapi/phpdbg/phpdbg_parser.y"
+#line 72 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ phpdbg_stack_separate((yyvsp[(1) - (3)]).top); (yyval) = (yyvsp[(3) - (3)]); }
break;
case 5:
/* Line 1802 of yacc.c */
-#line 77 "sapi/phpdbg/phpdbg_parser.y"
+#line 77 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval).top = PHPDBG_G(parser_stack)->top; }
break;
case 6:
/* Line 1802 of yacc.c */
-#line 78 "sapi/phpdbg/phpdbg_parser.y"
+#line 78 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ phpdbg_stack_push(PHPDBG_G(parser_stack), &(yyvsp[(1) - (1)])); (yyval).top = PHPDBG_G(parser_stack)->top; }
break;
case 7:
/* Line 1802 of yacc.c */
-#line 82 "sapi/phpdbg/phpdbg_parser.y"
+#line 82 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ phpdbg_stack_push(PHPDBG_G(parser_stack), &(yyvsp[(1) - (1)])); (yyval).top = PHPDBG_G(parser_stack)->top; }
break;
case 8:
/* Line 1802 of yacc.c */
-#line 83 "sapi/phpdbg/phpdbg_parser.y"
+#line 83 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ phpdbg_stack_push(PHPDBG_G(parser_stack), &(yyvsp[(2) - (2)])); (yyval).top = PHPDBG_G(parser_stack)->top; }
break;
case 9:
/* Line 1802 of yacc.c */
-#line 84 "sapi/phpdbg/phpdbg_parser.y"
+#line 84 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (2)]); }
break;
case 10:
/* Line 1802 of yacc.c */
-#line 88 "sapi/phpdbg/phpdbg_parser.y"
+#line 88 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = FILE_PARAM;
(yyval).file.name = (yyvsp[(2) - (3)]).str;
@@ -1521,7 +1521,7 @@ yyreduce:
case 11:
/* Line 1802 of yacc.c */
-#line 93 "sapi/phpdbg/phpdbg_parser.y"
+#line 93 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = NUMERIC_FILE_PARAM;
(yyval).file.name = (yyvsp[(1) - (4)]).str;
@@ -1531,7 +1531,7 @@ yyreduce:
case 12:
/* Line 1802 of yacc.c */
-#line 98 "sapi/phpdbg/phpdbg_parser.y"
+#line 98 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = FILE_PARAM;
(yyval).file.name = malloc((yyvsp[(1) - (4)]).len + (yyvsp[(2) - (4)]).len + 1);
@@ -1546,7 +1546,7 @@ yyreduce:
case 13:
/* Line 1802 of yacc.c */
-#line 108 "sapi/phpdbg/phpdbg_parser.y"
+#line 108 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = NUMERIC_FILE_PARAM;
(yyval).file.name = malloc((yyvsp[(1) - (5)]).len + (yyvsp[(2) - (5)]).len + 1);
@@ -1561,7 +1561,7 @@ yyreduce:
case 14:
/* Line 1802 of yacc.c */
-#line 118 "sapi/phpdbg/phpdbg_parser.y"
+#line 118 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = METHOD_PARAM;
(yyval).method.class = (yyvsp[(1) - (3)]).str;
@@ -1571,7 +1571,7 @@ yyreduce:
case 15:
/* Line 1802 of yacc.c */
-#line 123 "sapi/phpdbg/phpdbg_parser.y"
+#line 123 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = NUMERIC_METHOD_PARAM;
(yyval).method.class = (yyvsp[(1) - (5)]).str;
@@ -1582,7 +1582,7 @@ yyreduce:
case 16:
/* Line 1802 of yacc.c */
-#line 129 "sapi/phpdbg/phpdbg_parser.y"
+#line 129 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = NUMERIC_FUNCTION_PARAM;
(yyval).str = (yyvsp[(1) - (3)]).str;
@@ -1593,7 +1593,7 @@ yyreduce:
case 17:
/* Line 1802 of yacc.c */
-#line 135 "sapi/phpdbg/phpdbg_parser.y"
+#line 135 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = COND_PARAM;
(yyval).str = (yyvsp[(2) - (2)]).str;
@@ -1603,55 +1603,55 @@ yyreduce:
case 18:
/* Line 1802 of yacc.c */
-#line 140 "sapi/phpdbg/phpdbg_parser.y"
+#line 140 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 19:
/* Line 1802 of yacc.c */
-#line 141 "sapi/phpdbg/phpdbg_parser.y"
+#line 141 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 20:
/* Line 1802 of yacc.c */
-#line 142 "sapi/phpdbg/phpdbg_parser.y"
+#line 142 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 21:
/* Line 1802 of yacc.c */
-#line 143 "sapi/phpdbg/phpdbg_parser.y"
+#line 143 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 22:
/* Line 1802 of yacc.c */
-#line 144 "sapi/phpdbg/phpdbg_parser.y"
+#line 144 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 23:
/* Line 1802 of yacc.c */
-#line 145 "sapi/phpdbg/phpdbg_parser.y"
+#line 145 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 24:
/* Line 1802 of yacc.c */
-#line 146 "sapi/phpdbg/phpdbg_parser.y"
+#line 146 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 25:
/* Line 1802 of yacc.c */
-#line 150 "sapi/phpdbg/phpdbg_parser.y"
+#line 150 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{ PHPDBG_G(req_id) = (yyvsp[(1) - (1)]).num; }
break;
case 27:
/* Line 1802 of yacc.c */
-#line 155 "sapi/phpdbg/phpdbg_parser.y"
+#line 155 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = EVAL_PARAM;
(yyval).str = (yyvsp[(3) - (3)]).str;
@@ -1661,7 +1661,7 @@ yyreduce:
case 28:
/* Line 1802 of yacc.c */
-#line 160 "sapi/phpdbg/phpdbg_parser.y"
+#line 160 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = SHELL_PARAM;
(yyval).str = (yyvsp[(3) - (3)]).str;
@@ -1671,7 +1671,7 @@ yyreduce:
case 29:
/* Line 1802 of yacc.c */
-#line 165 "sapi/phpdbg/phpdbg_parser.y"
+#line 165 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = RUN_PARAM;
(yyval).len = 0;
@@ -1680,7 +1680,7 @@ yyreduce:
case 30:
/* Line 1802 of yacc.c */
-#line 169 "sapi/phpdbg/phpdbg_parser.y"
+#line 169 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
{
(yyval).type = RUN_PARAM;
(yyval).str = (yyvsp[(3) - (3)]).str;
@@ -1922,7 +1922,7 @@ yyreturn:
/* Line 2050 of yacc.c */
-#line 176 "sapi/phpdbg/phpdbg_parser.y"
+#line 176 "/Users/Bob/php-src-X/sapi/phpdbg/phpdbg_parser.y"
static int yyerror(const char *msg) {
@@ -1944,6 +1944,11 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input) {
return 0;
}
+ if (PHPDBG_G(cur_command)) {
+ free(PHPDBG_G(cur_command));
+ }
+ PHPDBG_G(cur_command) = strdup(input);
+
phpdbg_init_lexer(stack, input);
return yyparse();
diff --git a/sapi/phpdbg/phpdbg_parser.y b/sapi/phpdbg/phpdbg_parser.y
index df9be36eee..527c321f4c 100644
--- a/sapi/phpdbg/phpdbg_parser.y
+++ b/sapi/phpdbg/phpdbg_parser.y
@@ -194,6 +194,11 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input) {
return 0;
}
+ if (PHPDBG_G(cur_command)) {
+ free(PHPDBG_G(cur_command));
+ }
+ PHPDBG_G(cur_command) = strdup(input);
+
phpdbg_init_lexer(stack, input);
return yyparse();
diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c
index 4ade755877..de81450eac 100644
--- a/sapi/phpdbg/phpdbg_prompt.c
+++ b/sapi/phpdbg/phpdbg_prompt.c
@@ -384,7 +384,7 @@ void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default) /
}
/* }}} */
-void phpdbg_clean(zend_bool full) /* {{{ */
+void phpdbg_clean(zend_bool full, zend_bool resubmit) /* {{{ */
{
/* this is implicitly required */
if (PHPDBG_G(ops)) {
@@ -393,6 +393,11 @@ void phpdbg_clean(zend_bool full) /* {{{ */
PHPDBG_G(ops) = NULL;
}
+ if (!resubmit && PHPDBG_G(cur_command)) {
+ free(PHPDBG_G(cur_command));
+ PHPDBG_G(cur_command) = NULL;
+ }
+
if (full) {
PHPDBG_G(flags) |= PHPDBG_IS_CLEANING;
}
@@ -423,7 +428,7 @@ PHPDBG_COMMAND(exec) /* {{{ */
if (PHPDBG_G(ops)) {
phpdbg_notice("exec", "type=\"unsetops\"", "Destroying compiled opcodes");
- phpdbg_clean(0);
+ phpdbg_clean(0, 0);
}
PHPDBG_G(exec) = res;
@@ -437,7 +442,7 @@ PHPDBG_COMMAND(exec) /* {{{ */
phpdbg_notice("exec", "type=\"set\" context=\"%s\"", "Set execution context: %s", PHPDBG_G(exec));
if (PHPDBG_G(in_execution)) {
- phpdbg_clean(1);
+ phpdbg_clean(1, 0);
return SUCCESS;
}
@@ -675,7 +680,7 @@ PHPDBG_COMMAND(run) /* {{{ */
if (PHPDBG_G(in_execution)) {
if (phpdbg_ask_user_permission("Do you really want to restart execution?") == SUCCESS) {
phpdbg_startup_run++;
- phpdbg_clean(1);
+ phpdbg_clean(1, 1);
}
return SUCCESS;
}
@@ -729,6 +734,7 @@ PHPDBG_COMMAND(run) /* {{{ */
goto free_cmd;
}
efree(buf);
+ phpdbg_register_file_handles();
break;
}
@@ -743,7 +749,7 @@ PHPDBG_COMMAND(run) /* {{{ */
p++;
}
while (*p && *p != sep) {
- if (*p == '\\' && (p[1] == sep || p[1] == '\\')) {
+ if (*p == '\\' && (p[1] == sep || p[1] == '\\' || (p[1] == '#' && sep == ' '))) {
p++;
}
*(q++) = *(p++);
@@ -832,7 +838,7 @@ free_cmd:
PHPDBG_G(flags) &= ~PHPDBG_IS_RUNNING;
- phpdbg_clean(1);
+ phpdbg_clean(1, 0);
} else {
phpdbg_error("inactive", "type=\"nocontext\"", "Nothing to execute!");
}
@@ -1384,7 +1390,7 @@ PHPDBG_COMMAND(clean) /* {{{ */
phpdbg_writeln("clean", "constants=\"%d\"", "Constants %d", zend_hash_num_elements(EG(zend_constants)));
phpdbg_writeln("clean", "includes=\"%d\"", "Includes %d", zend_hash_num_elements(&EG(included_files)));
- phpdbg_clean(1);
+ phpdbg_clean(1, 0);
phpdbg_xml("</cleaninfo>");
@@ -1451,10 +1457,9 @@ PHPDBG_COMMAND(watch) /* {{{ */
return SUCCESS;
} /* }}} */
-int phpdbg_interactive(zend_bool allow_async_unsafe) /* {{{ */
+int phpdbg_interactive(zend_bool allow_async_unsafe, char *input) /* {{{ */
{
int ret = SUCCESS;
- char *input = NULL;
phpdbg_param_t stack;
PHPDBG_G(flags) |= PHPDBG_IS_INTERACTIVE;
@@ -1464,7 +1469,7 @@ int phpdbg_interactive(zend_bool allow_async_unsafe) /* {{{ */
zend_bailout();
}
- if (!(input = phpdbg_read_input(NULL))) {
+ if (!input && !(input = phpdbg_read_input(NULL))) {
break;
}
@@ -1554,7 +1559,7 @@ int phpdbg_interactive(zend_bool allow_async_unsafe) /* {{{ */
efree(file); \
} \
\
- switch (phpdbg_interactive(allow_async_unsafe)) { \
+ switch (phpdbg_interactive(allow_async_unsafe, NULL)) { \
zval zv; \
case PHPDBG_LEAVE: \
case PHPDBG_FINISH: \
diff --git a/sapi/phpdbg/phpdbg_prompt.h b/sapi/phpdbg/phpdbg_prompt.h
index fbfbe0af1c..e5a0286af1 100644
--- a/sapi/phpdbg/phpdbg_prompt.h
+++ b/sapi/phpdbg/phpdbg_prompt.h
@@ -25,7 +25,7 @@
void phpdbg_string_init(char *buffer);
void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default);
void phpdbg_try_file_init(char *init_file, size_t init_file_len, zend_bool free_init);
-int phpdbg_interactive(zend_bool allow_async_unsafe);
+int phpdbg_interactive(zend_bool allow_async_unsafe, char *input);
int phpdbg_compile(void);
void phpdbg_force_interruption(void);
/* }}} */
diff --git a/sapi/phpdbg/tests/run_002.phpt b/sapi/phpdbg/tests/run_002.phpt
new file mode 100644
index 0000000000..02f6889d6d
--- /dev/null
+++ b/sapi/phpdbg/tests/run_002.phpt
@@ -0,0 +1,50 @@
+--TEST--
+Stdin and escaped args being passed to run command
+--CLEAN--
+<?php
+@unlink("run_002_tmp.fixture");
+?>
+--PHPDBG--
+ev file_put_contents("run_002_tmp.fixture", "stdin\ndata")
+b 6
+r <run_002_tmp.fixture
+r arg1 '_ \' arg2 "' < run_002_tmp.fixture
+y
+c
+q
+--EXPECTF--
+[Successful compilation of %s]
+prompt> 10
+prompt> [Breakpoint #0 added at %s:6]
+prompt> array(1) {
+ [0]=>
+ string(%d) "%s"
+}
+string(10) "stdin
+data"
+[Breakpoint #0 at %s:6, hits: 1]
+>00006: echo "ok\n";
+ 00007:
+prompt> Do you really want to restart execution? (type y or n): array(3) {
+ [0]=>
+ string(%d) "%s"
+ [1]=>
+ string(4) "arg1"
+ [2]=>
+ string(10) "_ ' arg2 ""
+}
+string(10) "stdin
+data"
+[Breakpoint #0 at %s:6, hits: 1]
+>00006: echo "ok\n";
+ 00007:
+prompt> ok
+[Script ended normally]
+prompt>
+--FILE--
+<?php
+
+var_dump($argv);
+var_dump(stream_get_contents(STDIN));
+
+echo "ok\n";