diff options
author | Bob Weinand <bobwei9@hotmail.com> | 2016-10-02 12:45:20 +0100 |
---|---|---|
committer | Bob Weinand <bobwei9@hotmail.com> | 2016-10-02 12:45:20 +0100 |
commit | 417a8ef6b45ed8510faf5ebfb7b4f8c76cb97934 (patch) | |
tree | 6e92374e9258aeb296a52f64340109516b1bbb91 | |
parent | 9d537951c5e4af5e453dd4d60e74dad039856b80 (diff) | |
download | php-git-417a8ef6b45ed8510faf5ebfb7b4f8c76cb97934.tar.gz |
Fix run command args passing when inmidst execution
-rw-r--r-- | sapi/phpdbg/phpdbg.c | 26 | ||||
-rw-r--r-- | sapi/phpdbg/phpdbg.h | 3 | ||||
-rw-r--r-- | sapi/phpdbg/phpdbg_lexer.c | 362 | ||||
-rw-r--r-- | sapi/phpdbg/phpdbg_lexer.l | 2 | ||||
-rw-r--r-- | sapi/phpdbg/phpdbg_parser.c | 65 | ||||
-rw-r--r-- | sapi/phpdbg/phpdbg_parser.y | 5 | ||||
-rw-r--r-- | sapi/phpdbg/phpdbg_prompt.c | 27 | ||||
-rw-r--r-- | sapi/phpdbg/phpdbg_prompt.h | 2 | ||||
-rw-r--r-- | sapi/phpdbg/tests/run_002.phpt | 50 |
9 files changed, 288 insertions, 254 deletions
diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index 234d0f912e..618a72f429 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -834,7 +834,7 @@ static void php_sapi_phpdbg_log_message(char *message) /* {{{ */ } do { - switch (phpdbg_interactive(1)) { + switch (phpdbg_interactive(1, NULL)) { case PHPDBG_LEAVE: case PHPDBG_FINISH: case PHPDBG_UNTIL: @@ -942,7 +942,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; @@ -974,18 +974,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); } /* }}} */ @@ -1318,6 +1321,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; @@ -1800,7 +1804,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; @@ -1886,7 +1889,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 */ @@ -1897,7 +1904,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; @@ -1955,6 +1962,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; @@ -2006,6 +2018,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]); @@ -2013,6 +2026,9 @@ phpdbg_out: if (PHPDBG_G(prompt)[1]) { free(PHPDBG_G(prompt)[1]); } + if (PHPDBG_G(cur_command)) { + free(PHPDBG_G(cur_command)); + } } /* hack to restore mm_heap->use_custom_heap in order to receive memory leak info */ diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h index 1879e62252..94c5471e22 100644 --- a/sapi/phpdbg/phpdbg.h +++ b/sapi/phpdbg/phpdbg.h @@ -232,6 +232,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 */ @@ -242,6 +244,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 7315ff2afe..97f9a711f7 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -385,7 +385,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)) { @@ -394,6 +394,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; } @@ -424,7 +429,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; @@ -438,7 +443,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; } @@ -676,7 +681,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; } @@ -730,6 +735,7 @@ PHPDBG_COMMAND(run) /* {{{ */ goto free_cmd; } efree(buf); + phpdbg_register_file_handles(); break; } @@ -744,7 +750,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++); @@ -833,7 +839,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!"); } @@ -1337,7 +1343,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>"); @@ -1406,10 +1412,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; @@ -1419,7 +1424,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; } @@ -1509,7 +1514,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 c17e7185ce..c93beeba03 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"; |