Commit:    2e7c695c05a9de133bc9c0660ede968ce2e2dc5e
Author:    Bob Weinand <bobw...@hotmail.com>         Fri, 29 Nov 2013 11:38:28 
+0100
Parents:   24585722b1a9acd87387285a301a6c5e084d21bc
Branches:  PHP-5.6

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=2e7c695c05a9de133bc9c0660ede968ce2e2dc5e

Log:
I give up

Changed paths:
  M  phpdbg_bp.c


Diff:
diff --git a/phpdbg_bp.c b/phpdbg_bp.c
index 11f2754..d22233a 100644
--- a/phpdbg_bp.c
+++ b/phpdbg_bp.c
@@ -266,7 +266,7 @@ PHPDBG_API void phpdbg_set_breakpoint_method(const char* 
class_name, const char*
 
 PHPDBG_API void phpdbg_save_oplines(zend_op_array *op_array TSRMLS_DC) {
        phpdbg_btree **branch = &PHPDBG_G(opline_btree);
-       int i = sizeof(zend_ulong) * 8 - 1;
+       int i = sizeof(void *) * 8 - 1;
 
        do {
                if (*branch == NULL) {
@@ -276,11 +276,12 @@ PHPDBG_API void phpdbg_save_oplines(zend_op_array 
*op_array TSRMLS_DC) {
        } while (i--);
 
        if (*branch == NULL) {
-               phpdbg_btree *memory = *branch = emalloc(i * 
sizeof(phpdbg_btree));
-               while (i--) {
+               phpdbg_btree *memory = *branch = emalloc((i + 2) * 
sizeof(phpdbg_btree));
+               do {
+                       (*branch)->branches[!(((zend_ulong)op_array->opcodes >> 
i) % 2)] = NULL;
                        branch = 
&(*branch)->branches[((zend_ulong)op_array->opcodes >> i) % 2];
                        *branch = ++memory;
-               }
+               } while (i--);
        }
 
        (*branch)->op_array = op_array;
@@ -288,24 +289,32 @@ PHPDBG_API void phpdbg_save_oplines(zend_op_array 
*op_array TSRMLS_DC) {
 
 PHPDBG_API void phpdbg_set_breakpoint_opline(zend_ulong opline TSRMLS_DC) /* 
{{{ */
 {
+       if (PHPDBG_G(opline_btree) == NULL) {
+               phpdbg_error("No oplines initialized yet");
+               return;
+       }
+
        if (!zend_hash_index_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 
opline)) {
                phpdbg_breakline_t new_break;
                phpdbg_breakopline_t opline_break;
-               int i = sizeof(zend_ulong) * 8 - 1, last_superior_i = -1;
+               int i = sizeof(void *) * 8 - 1, last_superior_i = -1;
                phpdbg_btree *branch = PHPDBG_G(opline_btree);
                HashTable *insert = &PHPDBG_G(bp)[PHPDBG_BREAK_FUNCTION_OPLINE];
                HashTable func_breaks, *func_table;
 
                do {
                        if ((opline >> i) % 2 == 0 && !branch->branches[0]) {
-                               if (last_superior_i != -1) {
-                                       i = sizeof(zend_ulong) * 8 - 1;
-                                       do {
-                                               branch = 
branch->branches[(opline >> i) % 2 == 1 && branch->branches[1]];
-                                       } while (i-- > last_superior_i);
-                                       do {
-                                               branch = 
branch->branches[!!branch->branches[1]];
-                                       } while (i--);
+                               if (last_superior_i == -1) {
+                                       goto error;
+                               }
+                               branch = PHPDBG_G(opline_btree);
+                               i = sizeof(void *) * 8 - 1;
+                               do {
+                                       branch = branch->branches[(opline >> i) 
% 2 == 1 && branch->branches[1]];
+                               } while (i-- > last_superior_i);
+                               branch = branch->branches[0];
+                               while (i--) {
+                                       branch = 
branch->branches[branch->branches[1] != NULL];
                                }
                                break;
                        }
@@ -317,11 +326,11 @@ PHPDBG_API void phpdbg_set_breakpoint_opline(zend_ulong 
opline TSRMLS_DC) /* {{{
                        } else {
                                branch = branch->branches[0];
                        }
-               } while (--i);
+               } while (i--);
 
-               if (i ||
-                   (zend_ulong)(branch->op_array + branch->op_array->last) <= 
opline ||
-                   (opline - (zend_ulong)branch->op_array) % sizeof(zend_op) > 
0) {
+               if ((zend_ulong)(branch->op_array->opcodes + 
branch->op_array->last) <= opline ||
+                   (opline - (zend_ulong)branch->op_array->opcodes) % 
sizeof(zend_op) > 0) {
+error:
                        phpdbg_error("No opline could be found at 0x%lx", 
opline);
                        return;
                }
@@ -421,7 +430,14 @@ PHPDBG_API void 
phpdbg_resolve_op_array_breaks(zend_op_array *op_array TSRMLS_DC
        for (zend_hash_internal_pointer_reset_ex(oplines_table, &position);
             zend_hash_get_current_data_ex(oplines_table, (void**) &brake, 
&position) == SUCCESS;
             zend_hash_move_forward_ex(oplines_table, &position)) {
-               phpdbg_resolve_op_array_break(brake, op_array TSRMLS_CC);
+               if (phpdbg_resolve_op_array_break(brake, op_array TSRMLS_CC) == 
SUCCESS) {
+                       phpdbg_breakline_t *opline_break;
+
+                       
zend_hash_internal_pointer_end(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]);
+                       
zend_hash_get_current_data(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void 
**)&opline_break);
+
+                       phpdbg_notice("Breakpoint #%d resolved at %s%s%s:%d 
(opline %#lx)", brake->id, brake->class_name?brake->class_name:"", 
brake->class_name?"::":"", brake->func_name, brake->opline, 
opline_break->opline);
+               }
        }
 }


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to