]> granicus.if.org Git - php/commitdiff
Merge branch 'phpdbg' into PHP-5.6
authorJohannes Schlüter <johannes@php.net>
Sat, 18 Jan 2014 12:52:27 +0000 (13:52 +0100)
committerJohannes Schlüter <johannes@php.net>
Sat, 18 Jan 2014 12:52:27 +0000 (13:52 +0100)
phpdbg.c
phpdbg.h
phpdbg_cmd.c
phpdbg_opcode.c
phpdbg_prompt.c

index deb7be6e2bdd54979ba634a8255b1db78d6cf86e..e7f841c0bcacf0f88a5f6da035aaf450794705c4 100644 (file)
--- a/phpdbg.c
+++ b/phpdbg.c
@@ -653,8 +653,11 @@ static inline void phpdbg_sigint_handler(int signo) /* {{{ */
                        PHPDBG_G(flags) |= PHPDBG_IS_SIGNALED;
                }
        } else {
-               PHPDBG_G(flags) |= PHPDBG_IS_QUITTING;
-               zend_bailout();
+               /* we quit remote consoles on recv SIGINT */
+               if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) {
+                       PHPDBG_G(flags) |= PHPDBG_IS_QUITTING;
+                       zend_bailout();
+               }
        }
 } /* }}} */
 
@@ -1198,17 +1201,17 @@ phpdbg_main:
                } zend_end_try();
 
                /* initialize from file */
+               PHPDBG_G(flags) |= PHPDBG_IS_INITIALIZING;
                zend_try {
-                       PHPDBG_G(flags) |= PHPDBG_IS_INITIALIZING;
                        phpdbg_init(init_file, init_file_len, init_file_default TSRMLS_CC);
                        phpdbg_try_file_init(bp_tmp_file, strlen(bp_tmp_file), 0 TSRMLS_CC);
-                       PHPDBG_G(flags) &= ~PHPDBG_IS_INITIALIZING;
-               } zend_catch {
-                       PHPDBG_G(flags) &= ~PHPDBG_IS_INITIALIZING;
-                       if (PHPDBG_G(flags) & PHPDBG_IS_QUITTING) {
-                               goto phpdbg_out;
-                       }
                } zend_end_try();
+               PHPDBG_G(flags) &= ~PHPDBG_IS_INITIALIZING;
+               
+               /* quit if init says so */
+               if (PHPDBG_G(flags) & PHPDBG_IS_QUITTING) {
+                       goto phpdbg_out;
+               }
 
                /* step from here, not through init */
                if (step) {
@@ -1235,39 +1238,46 @@ phpdbg_interact:
                                        phpdbg_export_breakpoints(bp_tmp_fp TSRMLS_CC);
                                        fclose(bp_tmp_fp);
                                        cleaning = 1;
-                                       goto phpdbg_out;
                                } else {
                                        cleaning = 0;
                                }
-#ifndef _WIN32
-                               /* remote client disconnected */
-                               if ((PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED)) {
 
-                                       /* renegociate connections */
-                                       phpdbg_open_sockets(
-                                               address, listen, &server, &socket, streams);
+#ifndef _WIN32
+                               if (!cleaning) {
+                                       /* remote client disconnected */
+                                       if ((PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED)) {
                                        
-                                       /* set streams */
-                                       if (streams[0] && streams[1]) {
-                                               PHPDBG_G(flags) &= ~PHPDBG_IS_QUITTING;
+                                               if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) {
+                                                       /* renegociate connections */
+                                                       phpdbg_open_sockets(
+                                                               address, listen, &server, &socket, streams);
+                               
+                                                       /* set streams */
+                                                       if (streams[0] && streams[1]) {
+                                                               PHPDBG_G(flags) &= ~PHPDBG_IS_QUITTING;
+                                                       }
+                               
+                                                       /* this must be forced */
+                                                       CG(unclean_shutdown) = 0;
+                                               } else {
+                                                       /* local consoles cannot disconnect, ignore EOF */
+                                                       PHPDBG_G(flags) &= ~PHPDBG_IS_DISCONNECTED;
+                                               }
                                        }
-                                       
-                                       /* this must be forced */
-                                       CG(unclean_shutdown) = 0;
                                }
 #endif
-                               if (PHPDBG_G(flags) & PHPDBG_IS_QUITTING) {
-                                       goto phpdbg_out;
-                               }
                        } zend_end_try();
-               } while(!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING));
+               } while(!cleaning && !(PHPDBG_G(flags) & PHPDBG_IS_QUITTING));
                
                /* this must be forced */
                CG(unclean_shutdown) = 0;
                
+               /* this is just helpful */
+               PG(report_memleaks) = 0;
+               
 phpdbg_out:
 #ifndef _WIN32
-               if (PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED) {
+               if ((PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED)) {
                        PHPDBG_G(flags) &= ~PHPDBG_IS_DISCONNECTED;
                        goto phpdbg_interact;
                }
@@ -1316,7 +1326,7 @@ phpdbg_out:
        if (cleaning || remote) {
                goto phpdbg_main;
        }
-
+       
 #ifdef ZTS
        /* bugggy */
        /* tsrm_shutdown(); */
index 66b4f6995758d5eb95f58a9a58afdc954daa163e..6b7afb23704c664266bc997b6796655e73ba428e 100644 (file)
--- a/phpdbg.h
+++ b/phpdbg.h
 #define PHPDBG_AUTHORS "Felipe Pena, Joe Watkins and Bob Weinand" /* Ordered by last name */
 #define PHPDBG_URL "http://phpdbg.com"
 #define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues"
-#define PHPDBG_VERSION "0.3.0"
+#define PHPDBG_VERSION "0.3.1"
 #define PHPDBG_INIT_FILENAME ".phpdbginit"
 /* }}} */
 
index 36a9d26dc21f6896de178226367d10bfe15bb689..29424d00fe7fbee4dc31d2cc2bb031f735ef6114 100644 (file)
@@ -467,32 +467,43 @@ PHPDBG_API phpdbg_input_t *phpdbg_read_input(char *buffered TSRMLS_DC) /* {{{ */
                }
 
                if (buffered == NULL) {
-#ifndef HAVE_LIBREADLINE
-                       char buf[PHPDBG_MAX_CMD];
-                       if ((!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE) && !phpdbg_write(phpdbg_get_prompt(TSRMLS_C))) ||
-                               !fgets(buf, PHPDBG_MAX_CMD, PHPDBG_G(io)[PHPDBG_STDIN])) {
-                               /* the user has gone away */
-                               phpdbg_error("Failed to read console!");
+disconnect:
+                       if (0) {
                                PHPDBG_G(flags) |= (PHPDBG_IS_QUITTING|PHPDBG_IS_DISCONNECTED);
                                zend_bailout();
                                return NULL;
                        }
 
+#ifndef HAVE_LIBREADLINE
+                       char buf[PHPDBG_MAX_CMD];
+                       if (!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
+                               if (!phpdbg_write(phpdbg_get_prompt(TSRMLS_C))) {
+                                       goto disconnect;
+                               }
+                       }
+                       
+                       /* note: EOF is ignored */
+readline:      
+                       if (!fgets(buf, PHPDBG_MAX_CMD, PHPDBG_G(io)[PHPDBG_STDIN])) {
+                               /* the user has gone away */
+                               if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
+                                       goto disconnect;
+                               } else goto readline;
+                       }
+
                        cmd = buf;
 #else
+                       /* note: EOF makes readline write prompt again in local console mode */
+readline:
                        if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
                                char buf[PHPDBG_MAX_CMD];
                                if (fgets(buf, PHPDBG_MAX_CMD, PHPDBG_G(io)[PHPDBG_STDIN])) {
                                        cmd = buf;
-                               } else cmd = NULL;
+                               } else goto disconnect;
                        } else cmd = readline(phpdbg_get_prompt(TSRMLS_C));
 
                        if (!cmd) {
-                               /* the user has gone away */
-                               phpdbg_error("Failed to read console!");
-                               PHPDBG_G(flags) |= (PHPDBG_IS_QUITTING|PHPDBG_IS_DISCONNECTED);
-                               zend_bailout();
-                               return NULL;
+                               goto readline;
                        }
 
                        if (!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
index 7e64d16d92aa59978d544fd907f28f0d60ab2fa5..50073eb22bbdb3f7564f79490ddedaa2580c2e58 100644 (file)
@@ -52,13 +52,15 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, zend_uint
                case IS_VAR:
                case IS_TMP_VAR: {
                        zend_ulong id = 0, *pid = NULL;
-                       if (zend_hash_index_find(vars, (zend_ulong) ops->vars - op->var, (void**) &pid) != SUCCESS) {
-                               id = zend_hash_num_elements(vars);
-                               zend_hash_index_update(
-                                       vars, (zend_ulong) ops->vars - op->var,
-                                       (void**) &id,
-                                       sizeof(zend_ulong), NULL);
-                       } else id = *pid;
+                       if (vars != NULL) {
+                               if (zend_hash_index_find(vars, (zend_ulong) ops->vars - op->var, (void**) &pid) != SUCCESS) {
+                                       id = zend_hash_num_elements(vars);
+                                       zend_hash_index_update(
+                                               vars, (zend_ulong) ops->vars - op->var,
+                                               (void**) &id,
+                                               sizeof(zend_ulong), NULL);
+                               } else id = *pid;
+                       }
                        asprintf(&decode, "@%lu", id);
                } break;
 
index bb26556f5ce644c0dd2d33422f0a5d654cf763e1..cb46407957cd34368d74f30c9510645281cdb791 100644 (file)
@@ -551,7 +551,8 @@ PHPDBG_COMMAND(run) /* {{{ */
                zend_op **orig_opline = EG(opline_ptr);
                zend_op_array *orig_op_array = EG(active_op_array);
                zval **orig_retval_ptr = EG(return_value_ptr_ptr);
-
+               zend_bool restore = 1;
+               
                if (!PHPDBG_G(ops)) {
                        if (phpdbg_compile(TSRMLS_C) == FAILURE) {
                                phpdbg_error("Failed to compile %s, cannot run", PHPDBG_G(exec));
@@ -586,18 +587,19 @@ PHPDBG_COMMAND(run) /* {{{ */
 
                        if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) {
                                phpdbg_error("Caught exit/error from VM");
-                               goto out;
+                               restore = 0;
                        }
                } zend_end_try();
 
-               if (EG(exception)) {
-                       phpdbg_handle_exception(TSRMLS_C);
-               }
-
-               EG(active_op_array) = orig_op_array;
-               EG(opline_ptr) = orig_opline;
-               EG(return_value_ptr_ptr) = orig_retval_ptr;
+               if (restore) {
+                       if (EG(exception)) {
+                               phpdbg_handle_exception(TSRMLS_C);
+                       }
 
+                       EG(active_op_array) = orig_op_array;
+                       EG(opline_ptr) = orig_opline;
+                       EG(return_value_ptr_ptr) = orig_retval_ptr;
+               }
        } else {
                phpdbg_error("Nothing to execute!");
        }