]> granicus.if.org Git - php/commitdiff
Fix run command args passing when inmidst execution
authorBob Weinand <bobwei9@hotmail.com>
Sun, 2 Oct 2016 11:45:20 +0000 (12:45 +0100)
committerBob Weinand <bobwei9@hotmail.com>
Sun, 2 Oct 2016 11:45:20 +0000 (12:45 +0100)
sapi/phpdbg/phpdbg.c
sapi/phpdbg/phpdbg.h
sapi/phpdbg/phpdbg_lexer.c
sapi/phpdbg/phpdbg_lexer.l
sapi/phpdbg/phpdbg_parser.c
sapi/phpdbg/phpdbg_parser.y
sapi/phpdbg/phpdbg_prompt.c
sapi/phpdbg/phpdbg_prompt.h
sapi/phpdbg/tests/run_002.phpt [new file with mode: 0644]

index 234d0f912e4d32821ba5f7a86c40f73f4a76078d..618a72f4294f44814a985e2c452103e15174b9a2 100644 (file)
@@ -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 */
index 1879e622520774dbbec74bb6bd2c4d00964ccf41..94c5471e22d8e4b35a5d310c51f7ef4a459de10f 100644 (file)
@@ -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 */
 
index 281f882b62d9a945d2932e2ef93a98fb2727d446..d93c66f94dd5549ccaa5b9f7d915f1a3a529e404 100644 (file)
@@ -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;
                }
        }
 }
index b9c247a494a64252c9e32037bc12fb3fea8f027a..820eac7f845b7ee16062bd0a59f66158a3d72409 100644 (file)
@@ -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;
 
index c5222a0289144e6ff1ee3ba52beb64c433729053..d68c0ff4414aa60e6cbd1f24967a02a887401e9b 100644 (file)
@@ -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();
index df9be36eee78039d3142fc4fa1400a0d1883bf5f..527c321f4cc0e625ee6db148452b488b56ef804b 100644 (file)
@@ -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();
index 7315ff2afe2a67999dc636209cc15d8665ac689d..97f9a711f74cec162498948369b8f5811defdd8e 100644 (file)
@@ -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: \
index c17e7185ce3f346b95d05db15da9fa071c4d0940..c93beeba03e5d493235c221e93c0394333641d41 100644 (file)
@@ -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 (file)
index 0000000..02f6889
--- /dev/null
@@ -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";