]> granicus.if.org Git - php/commitdiff
Merge remote-tracking branch 'origin/PHP-5.6'
authorBob Weinand <bobwei9@hotmail.com>
Tue, 28 Oct 2014 16:40:27 +0000 (17:40 +0100)
committerBob Weinand <bobwei9@hotmail.com>
Tue, 28 Oct 2014 16:40:27 +0000 (17:40 +0100)
Conflicts:
configure.in
main/php_version.h
sapi/phpdbg/phpdbg.c
sapi/phpdbg/phpdbg_bp.c
sapi/phpdbg/phpdbg_prompt.c

1  2 
sapi/phpdbg/phpdbg.c
sapi/phpdbg/phpdbg_bp.c
sapi/phpdbg/phpdbg_bp.h
sapi/phpdbg/phpdbg_out.c
sapi/phpdbg/phpdbg_prompt.c

index 43881a370f50401b8318879713b257b6762e28ab,5ebc203529bdf7949c18b82468dd9e6fcb05d80d..6e7e4ece34cfce4e183351ed54b49791760a22fa
@@@ -1516,21 -1502,7 +1489,11 @@@ phpdbg_main
                        PHPDBG_G(flags) |= PHPDBG_IS_STEPPING;
                }
  
-               if (phpdbg_startup_run) {
-                       zend_try {
-                               PHPDBG_COMMAND_HANDLER(run)(NULL TSRMLS_CC);
-                       } zend_end_try();
-                       if (phpdbg_startup_run > 1) {
-                               /* if -r is on the command line more than once just quit */
-                               goto phpdbg_out;
-                       }
-                       phpdbg_startup_run = 0;
-               }
 +/* #ifndef for making compiler shutting up */
 +#ifndef _WIN32
  phpdbg_interact:
 +#endif
++
                /* phpdbg main() */
                do {
                        zend_try {
index 440240483fb27fba8600798b71a294c14af2b981,33824d4fec4f80b4b164dcba5416ea6bd0aa55c0..311171f72c42581ecfbfc5aa2cc181edc78ada80
@@@ -103,23 -110,40 +103,34 @@@ PHPDBG_API void phpdbg_reset_breakpoint
  } /* }}} */
  
  PHPDBG_API void phpdbg_export_breakpoints(FILE *handle TSRMLS_DC) /* {{{ */
+ {
+       char *string;
+       phpdbg_export_breakpoints_to_string(&string TSRMLS_CC);
+       fputs(string, handle);
+ }
+ PHPDBG_API void phpdbg_export_breakpoints_to_string(char **str TSRMLS_DC) /* {{{ */
  {
 -      HashPosition position[2];
 -      HashTable **table = NULL;
 +      HashTable *table;
        zend_ulong id = 0L;
  
+       *str = "";
        if (zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP])) {
                phpdbg_notice("exportbreakpoint", "count=\"%d\"", "Exporting %d breakpoints", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP]));
 +
                /* this only looks like magic, it isn't */
 -              for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP], &position[0]);
 -                   zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP], (void **) &table, &position[0]) == SUCCESS;
 -                   zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP], &position[0])) {
 +              ZEND_HASH_FOREACH_NUM_KEY_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP], id, table) {
                        phpdbg_breakbase_t *brake;
  
 -                      zend_hash_get_current_key_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP], NULL, NULL, &id, 0, &position[0]);
 -
 -                      for (zend_hash_internal_pointer_reset_ex((*table), &position[1]);
 -                           zend_hash_get_current_data_ex((*table), (void**)&brake, &position[1]) == SUCCESS;
 -                           zend_hash_move_forward_ex((*table), &position[1])) {
 +                      ZEND_HASH_FOREACH_PTR(table, brake) {
                                if (brake->id == id) {
+                                       char *new_str = NULL;
                                        switch (brake->type) {
                                                case PHPDBG_BREAK_FILE: {
-                                                       fprintf(handle,
-                                                               "break %s:%lu\n",
+                                                       phpdbg_asprintf(&new_str,
+                                                               "%sbreak %s:%lu\n", *str,
                                                                ((phpdbg_breakfile_t*)brake)->filename,
                                                                ((phpdbg_breakfile_t*)brake)->line);
                                                } break;
                                                } break;
  
                                                case PHPDBG_BREAK_METHOD_OPLINE: {
-                                                       fprintf(handle,
-                                                               "break %s::%s#%llu\n",
+                                                       phpdbg_asprintf(&new_str,
 -                                                              "%sbreak %s::%s#%ld\n", *str,
++                                                              "%sbreak %s::%s#%llu\n", *str,
                                                                ((phpdbg_breakopline_t*)brake)->class_name,
                                                                ((phpdbg_breakopline_t*)brake)->func_name,
                                                                ((phpdbg_breakopline_t*)brake)->opline_num);
                                                } break;
  
                                                case PHPDBG_BREAK_FUNCTION_OPLINE: {
-                                                       fprintf(handle,
-                                                               "break %s#%llu\n",
+                                                       phpdbg_asprintf(&new_str,
 -                                                              "%sbreak %s#%ld\n", *str,
++                                                              "%sbreak %s#%llu\n", *str,
                                                                ((phpdbg_breakopline_t*)brake)->func_name,
                                                                ((phpdbg_breakopline_t*)brake)->opline_num);
                                                } break;
  
                                                case PHPDBG_BREAK_FILE_OPLINE: {
-                                                       fprintf(handle,
-                                                               "break %s:#%llu\n",
+                                                       phpdbg_asprintf(&new_str,
 -                                                              "%sbreak %s:#%ld\n", *str,
++                                                              "%sbreak %s:#%llu\n", *str,
                                                                ((phpdbg_breakopline_t*)brake)->class_name,
                                                                ((phpdbg_breakopline_t*)brake)->opline_num);
                                                } break;
                                                        }
                                                } break;
                                        }
+                                       if ((*str)[0]) {
+                                               efree(*str);
+                                       }
+                                       *str = new_str;
                                }
 -                      }
 -              }
 +                      } ZEND_HASH_FOREACH_END();
 +              } ZEND_HASH_FOREACH_END();
        }
+       if (!(*str)[0]) {
+               *str = NULL;
+       }
  } /* }}} */
  
  PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */
        }
        path_len = strlen(path);
  
 -      if (!zend_hash_exists(&PHPDBG_G(file_sources), path, path_len)) {
+       phpdbg_debug("file path: %s, resolved path: %s, was compiled: %d\n", original_path, path, zend_hash_exists(&PHPDBG_G(file_sources), path, path_len));
 +      if (!zend_hash_str_exists(&PHPDBG_G(file_sources), path, path_len)) {
                if (php_stream_stat_path(path, &ssb) == FAILURE) {
                        if (original_path[0] == '/') {
                                phpdbg_error("breakpoint", "type=\"nofile\" add=\"fail\" file=\"%s\"", "Cannot stat %s, it does not exist", original_path);
                PHPDBG_BREAK_MAPPING(new_break.id, broken);
  
                if (pending) {
 -                      for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(file_sources), &position);
 -                           zend_hash_get_current_key_ex(&PHPDBG_G(file_sources), &file, &filelen, NULL, 0, &position) == HASH_KEY_IS_STRING;
 -                           zend_hash_move_forward_ex(&PHPDBG_G(file_sources), &position)) {
 +                      zend_string *file, *path_str = zend_string_init(path, path_len, 0);
 +                      ZEND_HASH_FOREACH_STR_KEY(&PHPDBG_G(file_sources), file) {
-                               if (!(pending = ((broken = phpdbg_resolve_pending_file_break_ex(file->val, file->len, path_str, broken TSRMLS_CC)) == NULL))) {
+                               HashTable *fileht;
+                               phpdbg_debug("Compare against loaded %s\n", file);
 -                              if (!(pending = ((fileht = phpdbg_resolve_pending_file_break_ex(file, filelen, path, path_len, broken TSRMLS_CC)) == NULL))) {
 -                                      phpdbg_breakfile_t *brake;
 -                                      zend_hash_index_find(fileht, line_num, (void **) &brake);
 -                                      new_break = *brake;
++                              if (!(pending = ((fileht = phpdbg_resolve_pending_file_break_ex(file->val, file->len, path_str, broken TSRMLS_CC)) == NULL))) {
 +                                      new_break = *(phpdbg_breakfile_t *) zend_hash_index_find_ptr(broken, line_num);
                                        break;
                                }
 -                      }
 +                      } ZEND_HASH_FOREACH_END();
 +                      zend_string_release(path_str);
                }
  
                if (pending) {
        }
  } /* }}} */
  
 -PHPDBG_API HashTable *phpdbg_resolve_pending_file_break_ex(const char *file, uint filelen, const char *cur, uint curlen, HashTable *fileht TSRMLS_DC) /* {{{ */
 +PHPDBG_API HashTable *phpdbg_resolve_pending_file_break_ex(const char *file, uint filelen, zend_string *cur, HashTable *fileht TSRMLS_DC) /* {{{ */
  {
-       if (cur->len < filelen && file[filelen - cur->len - 1] == '/' && !memcmp(file + filelen - cur->len, cur->val, cur->len)) {
+       phpdbg_debug("file: %s, filelen: %u, cur: %s, curlen %u, pos: %c, memcmp: %d\n", file, filelen, cur, curlen, filelen > curlen ? file[filelen - curlen - 1] : '?', filelen > curlen ? memcmp(file + filelen - curlen, cur, curlen) : 0);
 -      if (((curlen < filelen && file[filelen - curlen - 1] == '/') || filelen == curlen) && !memcmp(file + filelen - curlen, cur, curlen)) {
++      if (((cur->len < filelen && file[filelen - cur->len - 1] == '/') || filelen == cur->len) && !memcmp(file + filelen - cur->len, cur->val, cur->len)) {
                phpdbg_breakfile_t *brake, new_brake;
--              HashTable *master = NULL;
-               dtor_func_t dtor;
 -              HashPosition position;
++              HashTable *master;
  
                PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP;
  
 -              if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen, (void **) &master) == FAILURE) {
 +              if (!(master = zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen))) {
-                       dtor = PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor;
-                       PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor = NULL;
-                       fileht = zend_hash_str_add_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen, fileht, sizeof(HashTable));
+                       HashTable new_ht;
+                       zend_hash_init(&new_ht, 8, NULL, phpdbg_file_breaks_dtor, 0);
 -                      zend_hash_add(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen, &new_ht, sizeof(HashTable), (void **) &master);
++                      master = zend_hash_str_add_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen, &new_ht, sizeof(HashTable));
                }
  
 -              for (zend_hash_internal_pointer_reset_ex(fileht, &position);
 -                   zend_hash_get_current_data_ex(fileht, (void**)&brake, &position) == SUCCESS;
 -                   zend_hash_move_forward_ex(fileht, &position)) {
 +              ZEND_HASH_FOREACH_PTR(fileht, brake) {
                        new_brake = *brake;
                        new_brake.filename = estrndup(file, filelen);
                        PHPDBG_BREAK_UNMAPPING(brake->id);
  
                        if (master) {
 -                              zend_hash_index_update(master, brake->line, (void **) &new_brake, sizeof(phpdbg_breakfile_t), NULL);
 +                              zend_hash_index_update_mem(master, brake->line, &new_brake, sizeof(phpdbg_breakfile_t));
                                PHPDBG_BREAK_MAPPING(brake->id, master);
-                       } else {
-                               efree((char *) brake->filename);
-                               *brake = new_brake;
-                               PHPDBG_BREAK_MAPPING(brake->id, fileht);
                        }
 -              }
 +              } ZEND_HASH_FOREACH_END();
  
 -              zend_hash_del(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur, curlen);
 +              zend_hash_del(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur);
  
-               if (!master) {
-                       PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor = dtor;
-               }
                if (!zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING])) {
                        PHPDBG_G(flags) &= ~PHPDBG_HAS_PENDING_FILE_BP;
                }
  
  PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file TSRMLS_DC) /* {{{ */
  {
 -      HashPosition position;
        HashTable *fileht;
        uint filelen = strlen(file);
 +      zend_string *cur;
  
 -      zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], &position);
 -      while (zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], (void**) &fileht, &position) == SUCCESS) {
 -              const char *cur;
 -              uint curlen;
 -
 -              zend_hash_get_current_key_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], (char **) &cur, &curlen, NULL, 0, &position);
 -              zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], &position);
 -
+       phpdbg_debug("was compiled: %s\n", file);
 -              phpdbg_resolve_pending_file_break_ex(file, filelen, cur, curlen, fileht TSRMLS_CC);
 -      }
 -}
 +      ZEND_HASH_FOREACH_STR_KEY_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur, fileht) {
+               phpdbg_debug("check bp: %s\n", cur);
 +              phpdbg_resolve_pending_file_break_ex(file, filelen, cur, fileht TSRMLS_CC);
 +      } ZEND_HASH_FOREACH_END();
 +} /* }}} */
  
  PHPDBG_API void phpdbg_set_breakpoint_symbol(const char *name, size_t name_len TSRMLS_DC) /* {{{ */
  {
@@@ -815,8 -903,21 +841,21 @@@ static inline phpdbg_breakbase_t *phpdb
  {
        HashTable *breaks;
        phpdbg_breakbase_t *brake;
 -      const char *path = op_array->filename;
+       size_t path_len;
+       char realpath[MAXPATHLEN];
++      const char *path = op_array->filename->val;
+       if (VCWD_REALPATH(path, realpath)) {
+               path = realpath;
+       }
+       path_len = strlen(path);
+ #if 0
+       phpdbg_debug("Op at: %.*s %d\n", path_len, path, (*EG(opline_ptr))->lineno);
+ #endif
  
-       if (!(breaks = zend_hash_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], op_array->filename))) {
 -      if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], path, path_len, (void**)&breaks) == FAILURE) {
++      if (!(breaks = zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], path, path_len))) {
                return NULL;
        }
  
index 83c8bbcada2baa5bcd0bdfe63086d6521a9f9549,63a9961d2a876f88b85617aa309366ca77586a60..99c4eb6011970eb4a68f13f0b476e53964fbcb3c
@@@ -154,9 -154,10 +154,10 @@@ PHPDBG_API void phpdbg_disable_breakpoi
  
  /* {{{ Breakbase API */
  PHPDBG_API phpdbg_breakbase_t *phpdbg_find_breakbase(zend_ulong id TSRMLS_DC);
 -PHPDBG_API phpdbg_breakbase_t *phpdbg_find_breakbase_ex(zend_ulong id, HashTable ***table, HashPosition *position TSRMLS_DC); /* }}} */
 +PHPDBG_API phpdbg_breakbase_t *phpdbg_find_breakbase_ex(zend_ulong id, HashTable **table, zend_ulong *numkey, zend_string **strkey TSRMLS_DC); /* }}} */
  
  /* {{{ Breakpoint Exportation API */
- PHPDBG_API void phpdbg_export_breakpoints(FILE *handle TSRMLS_DC); /* }}} */
+ PHPDBG_API void phpdbg_export_breakpoints(FILE *handle TSRMLS_DC);
+ PHPDBG_API void phpdbg_export_breakpoints_to_string(char **str TSRMLS_DC); /* }}} */
  
  #endif /* PHPDBG_BP_H */
Simple merge
index 16807c640290753907db08715957510182efa8e4,c1fcb59a0860798685d42a3f42c42f974674e512..60c9a2e0a0682a3f88773916b9aa037bc6b3f987
@@@ -634,10 -702,14 +664,10 @@@ PHPDBG_COMMAND(run) /* {{{ *
                        if (EG(exception)) {
                                phpdbg_handle_exception(TSRMLS_C);
                        }
--
-                       phpdbg_clean(1 TSRMLS_CC);
 -                      EG(active_op_array) = orig_op_array;
 -                      EG(opline_ptr) = orig_opline;
 -                      EG(return_value_ptr_ptr) = orig_retval_ptr;
                }
  
+               phpdbg_clean(1 TSRMLS_CC);
                PHPDBG_G(flags) &= ~PHPDBG_IS_RUNNING;
        } else {
                phpdbg_error("inactive", "type=\"nocontext\"", "Nothing to execute!");