watch 94 sapi/phpdbg/phpdbg_prompt.c PHPDBG_COMMAND_D(watch, "set watchpoint", 'w', phpdbg_watch_commands, "|ss", 0), watch 1326 sapi/phpdbg/phpdbg_prompt.c PHPDBG_COMMAND(watch) /* {{{ */ watch 58 sapi/phpdbg/phpdbg_prompt.h PHPDBG_COMMAND(watch); watch 97 sapi/phpdbg/phpdbg_watch.c #define HT_WATCH_HT(watch) HT_PTR_HT((watch)->addr.ptr) watch 111 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch; watch 118 sapi/phpdbg/phpdbg_watch.c watch = result->ptr; watch 121 sapi/phpdbg/phpdbg_watch.c if ((char *) phpdbg_get_page_boundary(watch->addr.ptr) > (char *) addr || (char *) phpdbg_get_page_boundary(watch->addr.ptr) + phpdbg_get_total_page_size(watch->addr.ptr, watch->size) < (char *) addr) { watch 126 sapi/phpdbg/phpdbg_watch.c return watch; watch 129 sapi/phpdbg/phpdbg_watch.c static void phpdbg_change_watchpoint_access(phpdbg_watchpoint_t *watch, int access) { watch 131 sapi/phpdbg/phpdbg_watch.c mprotect(phpdbg_get_page_boundary(watch->addr.ptr), phpdbg_get_total_page_size(watch->addr.ptr, watch->size), access); watch 134 sapi/phpdbg/phpdbg_watch.c static inline void phpdbg_activate_watchpoint(phpdbg_watchpoint_t *watch) { watch 135 sapi/phpdbg/phpdbg_watch.c phpdbg_change_watchpoint_access(watch, PROT_READ); watch 138 sapi/phpdbg/phpdbg_watch.c static inline void phpdbg_deactivate_watchpoint(phpdbg_watchpoint_t *watch) { watch 139 sapi/phpdbg/phpdbg_watch.c phpdbg_change_watchpoint_access(watch, PROT_READ | PROT_WRITE); watch 142 sapi/phpdbg/phpdbg_watch.c static inline void phpdbg_store_watchpoint(phpdbg_watchpoint_t *watch) { watch 143 sapi/phpdbg/phpdbg_watch.c phpdbg_btree_insert(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr, watch); watch 146 sapi/phpdbg/phpdbg_watch.c static inline void phpdbg_remove_watchpoint(phpdbg_watchpoint_t *watch) { watch 147 sapi/phpdbg/phpdbg_watch.c phpdbg_btree_delete(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr); watch 150 sapi/phpdbg/phpdbg_watch.c void phpdbg_create_addr_watchpoint(void *addr, size_t size, phpdbg_watchpoint_t *watch) { watch 151 sapi/phpdbg/phpdbg_watch.c watch->addr.ptr = addr; watch 152 sapi/phpdbg/phpdbg_watch.c watch->size = size; watch 155 sapi/phpdbg/phpdbg_watch.c void phpdbg_create_zval_watchpoint(zval *zv, phpdbg_watchpoint_t *watch) { watch 156 sapi/phpdbg/phpdbg_watch.c phpdbg_create_addr_watchpoint(zv, sizeof(zval), watch); watch 157 sapi/phpdbg/phpdbg_watch.c watch->type = WATCH_ON_ZVAL; watch 160 sapi/phpdbg/phpdbg_watch.c void phpdbg_create_ht_watchpoint(HashTable *ht, phpdbg_watchpoint_t *watch) { watch 161 sapi/phpdbg/phpdbg_watch.c phpdbg_create_addr_watchpoint(((char *) ht) + HT_WATCH_OFFSET, sizeof(HashTable) - HT_WATCH_OFFSET, watch); watch 162 sapi/phpdbg/phpdbg_watch.c watch->type = WATCH_ON_HASHTABLE; watch 163 sapi/phpdbg/phpdbg_watch.c watch->implicit_ht_count = 0; watch 166 sapi/phpdbg/phpdbg_watch.c static int phpdbg_create_recursive_ht_watch(phpdbg_watchpoint_t *watch); watch 167 sapi/phpdbg/phpdbg_watch.c static int phpdbg_create_recursive_zval_watch(phpdbg_watchpoint_t *watch); watch 171 sapi/phpdbg/phpdbg_watch.c static void phpdbg_free_watch(phpdbg_watchpoint_t *watch) { watch 172 sapi/phpdbg/phpdbg_watch.c zend_string_release(watch->str); watch 173 sapi/phpdbg/phpdbg_watch.c zend_string_release(watch->name_in_parent); watch 177 sapi/phpdbg/phpdbg_watch.c static void phpdbg_delete_ht_watchpoints_recursive(phpdbg_watchpoint_t *watch); watch 178 sapi/phpdbg/phpdbg_watch.c static void phpdbg_delete_zval_watchpoints_recursive(phpdbg_watchpoint_t *watch); watch 179 sapi/phpdbg/phpdbg_watch.c static void phpdbg_delete_watchpoints_recursive(phpdbg_watchpoint_t *watch); watch 183 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch = emalloc(sizeof(phpdbg_watchpoint_t)); watch 184 sapi/phpdbg/phpdbg_watch.c watch->flags = parent->flags; watch 185 sapi/phpdbg/phpdbg_watch.c watch->parent = parent; watch 186 sapi/phpdbg/phpdbg_watch.c watch->str = parent->str; watch 188 sapi/phpdbg/phpdbg_watch.c phpdbg_create_addr_watchpoint(&GC_REFCOUNT(ref), sizeof(uint32_t), watch); watch 189 sapi/phpdbg/phpdbg_watch.c watch->type = WATCH_ON_REFCOUNTED; watch 191 sapi/phpdbg/phpdbg_watch.c return watch; watch 195 sapi/phpdbg/phpdbg_watch.c static void phpdbg_add_watch_collision(phpdbg_watchpoint_t *watch) { watch 199 sapi/phpdbg/phpdbg_watch.c ZEND_ASSERT(((watch->flags & PHPDBG_WATCH_RECURSIVE) == 0) ^ ((watch->flags & (PHPDBG_WATCH_IMPLICIT | PHPDBG_WATCH_SIMPLE)) == 0)); watch 201 sapi/phpdbg/phpdbg_watch.c if ((cur = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->addr.ref))) { watch 204 sapi/phpdbg/phpdbg_watch.c if ((old = zend_hash_find_ptr(&cur->watches, watch->str)) || (old = zend_hash_find_ptr(&cur->implicit_watches, watch->str))) { watch 205 sapi/phpdbg/phpdbg_watch.c if (((old->flags ^ watch->flags) & (PHPDBG_WATCH_NORMAL|PHPDBG_WATCH_IMPLICIT)) == 0) { watch 212 sapi/phpdbg/phpdbg_watch.c if (!(watch->flags & PHPDBG_WATCH_RECURSIVE) && !--cur->refs) { watch 213 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_watchpoints_recursive(watch); watch 217 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&cur->watches, watch->str); watch 219 sapi/phpdbg/phpdbg_watch.c cur->watch = Z_PTR_P(zend_hash_get_current_data_ex(&cur->watches, NULL)); watch 221 sapi/phpdbg/phpdbg_watch.c cur->watch = Z_PTR_P(zend_hash_get_current_data_ex(&cur->implicit_watches, NULL)); watch 225 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&cur->implicit_watches, watch->str); watch 228 sapi/phpdbg/phpdbg_watch.c old->flags = watch->flags; watch 229 sapi/phpdbg/phpdbg_watch.c phpdbg_free_watch(watch); watch 230 sapi/phpdbg/phpdbg_watch.c efree(watch); watch 231 sapi/phpdbg/phpdbg_watch.c watch = old; watch 233 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_RECURSIVE) { watch 235 sapi/phpdbg/phpdbg_watch.c phpdbg_create_recursive_zval_watch(watch->parent); watch 240 sapi/phpdbg/phpdbg_watch.c coll.refs = (watch->flags & PHPDBG_WATCH_RECURSIVE) != 0; watch 241 sapi/phpdbg/phpdbg_watch.c coll.watch = watch; watch 244 sapi/phpdbg/phpdbg_watch.c cur = zend_hash_index_add_mem(&PHPDBG_G(watch_collisions), (zend_ulong) watch->addr.ref, &coll, sizeof(phpdbg_watch_collision)); watch 245 sapi/phpdbg/phpdbg_watch.c phpdbg_store_watchpoint(cur->watch); watch 246 sapi/phpdbg/phpdbg_watch.c phpdbg_activate_watchpoint(cur->watch); watch 248 sapi/phpdbg/phpdbg_watch.c phpdbg_create_recursive_zval_watch(watch->parent); watch 252 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_NORMAL) { watch 253 sapi/phpdbg/phpdbg_watch.c cur->watch = watch; watch 254 sapi/phpdbg/phpdbg_watch.c zend_hash_add_ptr(&cur->watches, watch->str, watch->parent); watch 256 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_IMPLICIT) { watch 257 sapi/phpdbg/phpdbg_watch.c zend_hash_add_ptr(&cur->implicit_watches, watch->str, watch->parent); watch 261 sapi/phpdbg/phpdbg_watch.c static void phpdbg_remove_watch_collision(phpdbg_watchpoint_t *watch) { watch 263 sapi/phpdbg/phpdbg_watch.c if ((cur = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) Z_COUNTED_P(watch->addr.zv)))) { watch 265 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_watchpoints_recursive(watch); watch 268 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&cur->watches, watch->str); watch 269 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&cur->implicit_watches, watch->str); watch 272 sapi/phpdbg/phpdbg_watch.c cur->watch = Z_PTR_P(zend_hash_get_current_data_ex(&cur->watches, NULL)); watch 274 sapi/phpdbg/phpdbg_watch.c cur->watch = Z_PTR_P(zend_hash_get_current_data_ex(&cur->implicit_watches, NULL)); watch 276 sapi/phpdbg/phpdbg_watch.c phpdbg_deactivate_watchpoint(cur->watch); watch 277 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watchpoint(cur->watch); watch 279 sapi/phpdbg/phpdbg_watch.c zend_hash_index_del(&PHPDBG_G(watch_collisions), (zend_ulong) Z_COUNTED_P(watch->addr.zv)); watch 284 sapi/phpdbg/phpdbg_watch.c static phpdbg_watchpoint_t *phpdbg_create_watchpoint(phpdbg_watchpoint_t *watch); watch 286 sapi/phpdbg/phpdbg_watch.c static phpdbg_watchpoint_t *phpdbg_create_reference_watch(phpdbg_watchpoint_t *watch) { watch 288 sapi/phpdbg/phpdbg_watch.c watch->reference = ref; watch 289 sapi/phpdbg/phpdbg_watch.c ref->flags = watch->flags; watch 290 sapi/phpdbg/phpdbg_watch.c ref->str = watch->str; watch 292 sapi/phpdbg/phpdbg_watch.c ref->parent = watch; watch 294 sapi/phpdbg/phpdbg_watch.c phpdbg_create_zval_watchpoint(Z_REFVAL_P(watch->addr.zv), ref); watch 322 sapi/phpdbg/phpdbg_watch.c static phpdbg_watchpoint_t *phpdbg_create_watchpoint(phpdbg_watchpoint_t *watch) { watch 323 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *ret = watch; watch 325 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_ZVAL) { watch 326 sapi/phpdbg/phpdbg_watch.c switch (Z_TYPE_P(watch->addr.zv)) { watch 331 sapi/phpdbg/phpdbg_watch.c memset(watch->addr.zv, 0, sizeof(zend_value)); watch 336 sapi/phpdbg/phpdbg_watch.c if (!watch->parent || watch->parent->type != WATCH_ON_ZVAL || watch->type == WATCH_ON_HASHTABLE) { watch 337 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *old_watch = zend_hash_find_ptr(&PHPDBG_G(watchpoints), watch->str); watch 345 sapi/phpdbg/phpdbg_watch.c if (watch != old_watch) { \ watch 346 sapi/phpdbg/phpdbg_watch.c phpdbg_free_watch(watch); \ watch 347 sapi/phpdbg/phpdbg_watch.c efree(watch); \ watch 351 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_RECURSIVE) { watch 361 sapi/phpdbg/phpdbg_watch.c old_watch->flags |= watch->flags & (PHPDBG_WATCH_IMPLICIT | PHPDBG_WATCH_SIMPLE); watch 366 sapi/phpdbg/phpdbg_watch.c if (watch->parent && watch->parent->type == WATCH_ON_HASHTABLE) { watch 367 sapi/phpdbg/phpdbg_watch.c watch->parent->implicit_ht_count++; watch 369 sapi/phpdbg/phpdbg_watch.c zend_hash_add_ptr(&PHPDBG_G(watchpoints), watch->str, watch); watch 373 sapi/phpdbg/phpdbg_watch.c phpdbg_store_watchpoint(watch); watch 375 sapi/phpdbg/phpdbg_watch.c if (watch->parent && watch->parent->type == WATCH_ON_ZVAL && Z_REFCOUNTED_P(watch->parent->addr.zv)) { watch 376 sapi/phpdbg/phpdbg_watch.c phpdbg_add_watch_collision(phpdbg_create_refcounted_watchpoint(watch, Z_COUNTED_P(watch->parent->addr.zv))); watch 379 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_ZVAL) { watch 380 sapi/phpdbg/phpdbg_watch.c if (watch->parent_container) { watch 383 sapi/phpdbg/phpdbg_watch.c if (!(find = phpdbg_btree_find(&PHPDBG_G(watch_HashTables), (zend_ulong) watch->parent_container))) { watch 385 sapi/phpdbg/phpdbg_watch.c hti->dtor = watch->parent_container->pDestructor; watch 388 sapi/phpdbg/phpdbg_watch.c phpdbg_btree_insert(&PHPDBG_G(watch_HashTables), (zend_ulong) watch->parent_container, hti); watch 389 sapi/phpdbg/phpdbg_watch.c watch->parent_container->pDestructor = (dtor_func_t) phpdbg_watch_HashTable_dtor; watch 393 sapi/phpdbg/phpdbg_watch.c zend_hash_add_ptr(ht_watches, watch->name_in_parent, watch); watch 396 sapi/phpdbg/phpdbg_watch.c if (Z_ISREF_P(watch->addr.zv)) { watch 397 sapi/phpdbg/phpdbg_watch.c ret = phpdbg_create_reference_watch(watch); watch 401 sapi/phpdbg/phpdbg_watch.c phpdbg_activate_watchpoint(watch); watch 406 sapi/phpdbg/phpdbg_watch.c static int phpdbg_create_simple_watchpoint(phpdbg_watchpoint_t *watch) { watch 407 sapi/phpdbg/phpdbg_watch.c watch->flags |= PHPDBG_WATCH_SIMPLE; watch 409 sapi/phpdbg/phpdbg_watch.c phpdbg_create_watchpoint(watch); watch 416 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch = emalloc(sizeof(phpdbg_watchpoint_t)); watch 419 sapi/phpdbg/phpdbg_watch.c watch->parent = zv_watch; watch 425 sapi/phpdbg/phpdbg_watch.c phpdbg_create_ht_watchpoint(ht, watch); watch 427 sapi/phpdbg/phpdbg_watch.c if (phpdbg_create_watchpoint(watch) == NULL) { watch 432 sapi/phpdbg/phpdbg_watch.c watch->flags |= PHPDBG_WATCH_ARRAY; watch 434 sapi/phpdbg/phpdbg_watch.c watch->flags |= PHPDBG_WATCH_OBJECT; watch 437 sapi/phpdbg/phpdbg_watch.c phpdbg_add_watch_collision(phpdbg_create_refcounted_watchpoint(watch, Z_COUNTED_P(zv))); watch 442 sapi/phpdbg/phpdbg_watch.c static int phpdbg_create_recursive_watchpoint(phpdbg_watchpoint_t *watch) { watch 443 sapi/phpdbg/phpdbg_watch.c if (watch->type != WATCH_ON_ZVAL) { watch 447 sapi/phpdbg/phpdbg_watch.c watch->flags |= PHPDBG_WATCH_RECURSIVE; watch 448 sapi/phpdbg/phpdbg_watch.c watch = phpdbg_create_watchpoint(watch); watch 453 sapi/phpdbg/phpdbg_watch.c static int phpdbg_create_recursive_ht_watch(phpdbg_watchpoint_t *watch) { watch 458 sapi/phpdbg/phpdbg_watch.c ZEND_ASSERT(watch->type == WATCH_ON_HASHTABLE); watch 460 sapi/phpdbg/phpdbg_watch.c ZEND_HASH_FOREACH_KEY_VAL(HT_WATCH_HT(watch), h, key, zv) { watch 464 sapi/phpdbg/phpdbg_watch.c new_watch->parent = watch; watch 465 sapi/phpdbg/phpdbg_watch.c new_watch->parent_container = HT_WATCH_HT(watch); watch 474 sapi/phpdbg/phpdbg_watch.c new_watch->str = strpprintf(0, "%.*s%s%s%s", (int) ZSTR_LEN(watch->str) - 2, ZSTR_VAL(watch->str), (watch->flags & PHPDBG_WATCH_ARRAY) ? "[" : "->", phpdbg_get_property_key(ZSTR_VAL(new_watch->name_in_parent)), (watch->flags & PHPDBG_WATCH_ARRAY) ? "]" : ""); watch 488 sapi/phpdbg/phpdbg_watch.c static int phpdbg_create_recursive_zval_watch(phpdbg_watchpoint_t *watch) { watch 492 sapi/phpdbg/phpdbg_watch.c ZEND_ASSERT(watch->type == WATCH_ON_ZVAL); watch 494 sapi/phpdbg/phpdbg_watch.c zvp = watch->addr.zv; watch 501 sapi/phpdbg/phpdbg_watch.c new_watch->parent = watch; watch 502 sapi/phpdbg/phpdbg_watch.c new_watch->parent_container = watch->parent_container; watch 503 sapi/phpdbg/phpdbg_watch.c new_watch->name_in_parent = watch->name_in_parent; watch 505 sapi/phpdbg/phpdbg_watch.c new_watch->str = strpprintf(0, "%.*s[]", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str)); watch 523 sapi/phpdbg/phpdbg_watch.c static void phpdbg_delete_implicit_parents(phpdbg_watchpoint_t *watch) { watch 524 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *parent = watch->parent; watch 538 sapi/phpdbg/phpdbg_watch.c if (parent->type == WATCH_ON_ZVAL && Z_REFCOUNTED_P(watch->addr.zv)) { watch 546 sapi/phpdbg/phpdbg_watch.c static int phpdbg_delete_watchpoint_recursive(phpdbg_watchpoint_t *watch, zend_bool user_request) { watch 547 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_HASHTABLE) { watch 549 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_ht_watchpoints_recursive(watch); watch 554 sapi/phpdbg/phpdbg_watch.c ht = HT_FROM_ZVP(watch->addr.zv); watch 560 sapi/phpdbg/phpdbg_watch.c } else if (watch->type == WATCH_ON_ZVAL) { watch 561 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_zval_watchpoints_recursive(watch); watch 564 sapi/phpdbg/phpdbg_watch.c return zend_hash_del(&PHPDBG_G(watchpoints), watch->str); watch 567 sapi/phpdbg/phpdbg_watch.c static void phpdbg_delete_ht_watchpoints_recursive(phpdbg_watchpoint_t *watch) { watch 572 sapi/phpdbg/phpdbg_watch.c ZEND_HASH_FOREACH_KEY(HT_WATCH_HT(watch), numkey, strkey) { watch 574 sapi/phpdbg/phpdbg_watch.c str = strpprintf(0, "%.*s%s%s%s", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str), (watch->flags & PHPDBG_WATCH_ARRAY) ? "[" : "->", phpdbg_get_property_key(ZSTR_VAL(strkey)), (watch->flags & PHPDBG_WATCH_ARRAY) ? "]" : ""); watch 576 sapi/phpdbg/phpdbg_watch.c str = strpprintf(0, "%.*s%s" ZEND_LONG_FMT "%s", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str), (watch->flags & PHPDBG_WATCH_ARRAY) ? "[" : "->", numkey, (watch->flags & PHPDBG_WATCH_ARRAY) ? "]" : ""); watch 587 sapi/phpdbg/phpdbg_watch.c static void phpdbg_delete_zval_watchpoints_recursive(phpdbg_watchpoint_t *watch) { watch 588 sapi/phpdbg/phpdbg_watch.c if (Z_REFCOUNTED_P(watch->addr.zv)) { watch 589 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watch_collision(watch); watch 594 sapi/phpdbg/phpdbg_watch.c static void phpdbg_delete_watchpoints_recursive(phpdbg_watchpoint_t *watch) { watch 595 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_ZVAL) { watch 596 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_zval_watchpoints_recursive(watch); watch 597 sapi/phpdbg/phpdbg_watch.c } else if (watch->type == WATCH_ON_HASHTABLE) { watch 598 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_ht_watchpoints_recursive(watch); watch 604 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch; watch 611 sapi/phpdbg/phpdbg_watch.c watch = result->ptr; watch 613 sapi/phpdbg/phpdbg_watch.c if (!(watch->flags & PHPDBG_WATCH_NORMAL) || (watch->parent && (watch->parent->flags & PHPDBG_WATCH_RECURSIVE))) { watch 617 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_RECURSIVE) { watch 618 sapi/phpdbg/phpdbg_watch.c ret = phpdbg_delete_watchpoint_recursive(watch, 1); watch 620 sapi/phpdbg/phpdbg_watch.c ret = zend_hash_del(&PHPDBG_G(watchpoints), watch->str); watch 631 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch = ecalloc(1, sizeof(phpdbg_watchpoint_t)); watch 632 sapi/phpdbg/phpdbg_watch.c watch->str = zend_string_init(name, namelen, 0); watch 633 sapi/phpdbg/phpdbg_watch.c watch->name_in_parent = zend_string_init(key, keylen, 0); watch 634 sapi/phpdbg/phpdbg_watch.c watch->parent_container = parent; watch 635 sapi/phpdbg/phpdbg_watch.c phpdbg_create_zval_watchpoint(zv, watch); watch 637 sapi/phpdbg/phpdbg_watch.c ret = callback(watch); watch 643 sapi/phpdbg/phpdbg_watch.c phpdbg_free_watch(watch); watch 644 sapi/phpdbg/phpdbg_watch.c efree(watch); watch 657 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch; watch 659 sapi/phpdbg/phpdbg_watch.c if ((watch = zend_hash_str_find_ptr(&PHPDBG_G(watchpoints), name, namelen))) { watch 660 sapi/phpdbg/phpdbg_watch.c watch->flags |= PHPDBG_WATCH_IMPLICIT; watch 661 sapi/phpdbg/phpdbg_watch.c PHPDBG_G(watch_tmp) = watch; watch 665 sapi/phpdbg/phpdbg_watch.c watch = ecalloc(1, sizeof(phpdbg_watchpoint_t)); watch 666 sapi/phpdbg/phpdbg_watch.c watch->flags = PHPDBG_WATCH_IMPLICIT; watch 667 sapi/phpdbg/phpdbg_watch.c watch->str = zend_string_init(name, namelen, 0); watch 668 sapi/phpdbg/phpdbg_watch.c watch->name_in_parent = zend_string_init(key, keylen, 0); watch 669 sapi/phpdbg/phpdbg_watch.c watch->parent_container = parent; watch 670 sapi/phpdbg/phpdbg_watch.c watch->parent = PHPDBG_G(watch_tmp); watch 671 sapi/phpdbg/phpdbg_watch.c phpdbg_create_zval_watchpoint(zv, watch); watch 673 sapi/phpdbg/phpdbg_watch.c phpdbg_create_watchpoint(watch); watch 678 sapi/phpdbg/phpdbg_watch.c PHPDBG_G(watch_tmp) = watch; watch 758 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch = result->ptr; watch 760 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_NORMAL) { watch 763 sapi/phpdbg/phpdbg_watch.c phpdbg_notice("watchdelete", "variable=\"%.*s\" recursive=\"%s\"", "%.*s was removed, removing watchpoint%s", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str), (watch->flags & PHPDBG_WATCH_RECURSIVE) ? " recursively" : ""); watch 766 sapi/phpdbg/phpdbg_watch.c if ((result = phpdbg_btree_find(&PHPDBG_G(watch_HashTables), (zend_ulong) watch->parent_container))) { watch 769 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&hti->watches, watch->name_in_parent); watch 771 sapi/phpdbg/phpdbg_watch.c watch->parent_container->pDestructor = hti->dtor; watch 773 sapi/phpdbg/phpdbg_watch.c phpdbg_btree_delete(&PHPDBG_G(watch_HashTables), (zend_ulong) watch->parent_container); watch 780 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_RECURSIVE) { watch 781 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_watchpoint_recursive(watch, 0); watch 783 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&PHPDBG_G(watchpoints), watch->str); watch 811 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch; watch 814 sapi/phpdbg/phpdbg_watch.c watch = phpdbg_check_for_watchpoint( watch 822 sapi/phpdbg/phpdbg_watch.c if (watch == NULL) { watch 826 sapi/phpdbg/phpdbg_watch.c page = phpdbg_get_page_boundary(watch->addr.ptr); watch 827 sapi/phpdbg/phpdbg_watch.c size = phpdbg_get_total_page_size(watch->addr.ptr, watch->size); watch 850 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch = (phpdbg_watchpoint_t *) Z_PTR_P(pDest); watch 852 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_IMPLICIT) { watch 853 sapi/phpdbg/phpdbg_watch.c watch->flags = PHPDBG_WATCH_SIMPLE; // tiny hack for delete_implicit_parents watch 855 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_ZVAL) { watch 856 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_zval_watchpoints_recursive(watch); watch 857 sapi/phpdbg/phpdbg_watch.c } else if (watch->type == WATCH_ON_HASHTABLE) { watch 860 sapi/phpdbg/phpdbg_watch.c watch->implicit_ht_count++; watch 862 sapi/phpdbg/phpdbg_watch.c ZEND_HASH_FOREACH_PTR(&((phpdbg_watch_ht_info *) phpdbg_btree_find(&PHPDBG_G(watch_HashTables), (zend_ulong) HT_WATCH_HT(watch))->ptr)->watches, watchpoint) { watch 868 sapi/phpdbg/phpdbg_watch.c phpdbg_delete_implicit_parents(watch); watch 870 sapi/phpdbg/phpdbg_watch.c phpdbg_deactivate_watchpoint(watch); watch 871 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watchpoint(watch); watch 873 sapi/phpdbg/phpdbg_watch.c phpdbg_free_watch(watch); watch 874 sapi/phpdbg/phpdbg_watch.c efree(watch); watch 920 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch = result->ptr; watch 921 sapi/phpdbg/phpdbg_watch.c void *oldPtr = (char *) &dump->data + ((size_t) watch->addr.ptr - (size_t) dump->page); watch 925 sapi/phpdbg/phpdbg_watch.c if ((size_t) watch->addr.ptr < (size_t) dump->page || (size_t) watch->addr.ptr + watch->size > (size_t) dump->page + dump->size) { watch 930 sapi/phpdbg/phpdbg_watch.c if ((watch->type == WATCH_ON_HASHTABLE || watch->type == WATCH_ON_ZVAL) && watch->parent_container) { watch 931 sapi/phpdbg/phpdbg_watch.c if ((curTest = zend_symtable_find(watch->parent_container, watch->name_in_parent))) { watch 936 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_HASHTABLE) { watch 947 sapi/phpdbg/phpdbg_watch.c if (curTest != watch->addr.ptr) { watch 948 sapi/phpdbg/phpdbg_watch.c phpdbg_deactivate_watchpoint(watch); watch 949 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watchpoint(watch); watch 950 sapi/phpdbg/phpdbg_watch.c watch->addr.ptr = curTest; watch 951 sapi/phpdbg/phpdbg_watch.c phpdbg_store_watchpoint(watch); watch 952 sapi/phpdbg/phpdbg_watch.c phpdbg_activate_watchpoint(watch); watch 965 sapi/phpdbg/phpdbg_watch.c switch (watch->type) { watch 967 sapi/phpdbg/phpdbg_watch.c do_break = memcmp(oldPtr, watch->addr.zv, sizeof(zend_value) + sizeof(uint32_t) /* value + typeinfo */) != 0; watch 973 sapi/phpdbg/phpdbg_watch.c do_break = zend_hash_num_elements(HT_PTR_HT(oldPtr)) != zend_hash_num_elements(HT_WATCH_HT(watch)); watch 979 sapi/phpdbg/phpdbg_watch.c do_break = memcmp(oldPtr, watch->addr.ref, sizeof(uint32_t) /* no zend_refcounted metadata info */) != 0; watch 989 sapi/phpdbg/phpdbg_watch.c if (!(watch->flags & PHPDBG_WATCH_NORMAL)) { watch 996 sapi/phpdbg/phpdbg_watch.c phpdbg_notice("watchhit", "variable=\"%s\"", "Breaking on watchpoint %.*s", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str)); watch 1000 sapi/phpdbg/phpdbg_watch.c switch (watch->type) { watch 1002 sapi/phpdbg/phpdbg_watch.c zend_bool show_value = memcmp(oldPtr, watch->addr.zv, sizeof(zend_value) + sizeof(uint32_t) /* no metadata info */) != 0; watch 1004 sapi/phpdbg/phpdbg_watch.c if ((watch->flags & PHPDBG_WATCH_NORMAL) && (removed || show_value)) { watch 1019 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_NORMAL) { watch 1020 sapi/phpdbg/phpdbg_watch.c phpdbg_notice("watchdelete", "variable=\"%.*s\"", "Watchpoint %.*s was unset, removing watchpoint", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str)); watch 1022 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&PHPDBG_G(watchpoints), watch->str); watch 1027 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watch_collision(watch); watch 1032 sapi/phpdbg/phpdbg_watch.c if ((watch->flags & PHPDBG_WATCH_NORMAL) && show_value) { watch 1033 sapi/phpdbg/phpdbg_watch.c phpdbg_out("New value%s: ", Z_ISREF_P(watch->addr.zv) ? " (reference)" : ""); watch 1034 sapi/phpdbg/phpdbg_watch.c phpdbg_xml("<watchvalue %r%s type=\"new\">", Z_ISREF_P(watch->addr.zv) ? " reference=\"reference\"" : ""); watch 1035 sapi/phpdbg/phpdbg_watch.c zend_print_flat_zval_r(watch->addr.zv); watch 1041 sapi/phpdbg/phpdbg_watch.c if (Z_PTR_P(watch->addr.zv) != Z_PTR_P((zval *) oldPtr) || Z_TYPE_P(watch->addr.zv) != Z_TYPE_P((zval *) oldPtr)) { watch 1043 sapi/phpdbg/phpdbg_watch.c zval *new_zv = watch->addr.zv; watch 1044 sapi/phpdbg/phpdbg_watch.c watch->addr.ptr = oldPtr; watch 1045 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watch_collision(watch); watch 1046 sapi/phpdbg/phpdbg_watch.c watch->addr.zv = new_zv; watch 1048 sapi/phpdbg/phpdbg_watch.c if (Z_REFCOUNTED_P(watch->addr.zv)) { watch 1049 sapi/phpdbg/phpdbg_watch.c if ((watch->flags & PHPDBG_WATCH_NORMAL) && (PHPDBG_G(flags) & PHPDBG_SHOW_REFCOUNTS)) { watch 1050 sapi/phpdbg/phpdbg_watch.c phpdbg_writeln("watchrefcount", "type=\"new\" refcount=\"%d\"", "New refcount: %d", Z_REFCOUNT_P(watch->addr.zv)); watch 1052 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_RECURSIVE) { watch 1053 sapi/phpdbg/phpdbg_watch.c phpdbg_create_recursive_watchpoint(watch); watch 1054 sapi/phpdbg/phpdbg_watch.c } else if (Z_ISREF_P(watch->addr.zv)) { watch 1055 sapi/phpdbg/phpdbg_watch.c phpdbg_create_reference_watch(watch); watch 1064 sapi/phpdbg/phpdbg_watch.c elementDiff = zend_hash_num_elements(HT_PTR_HT(oldPtr)) - zend_hash_num_elements(HT_WATCH_HT(watch)); watch 1065 sapi/phpdbg/phpdbg_watch.c if ((watch->flags & PHPDBG_WATCH_NORMAL) && elementDiff) { watch 1073 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_RECURSIVE) { watch 1074 sapi/phpdbg/phpdbg_watch.c phpdbg_create_recursive_ht_watch(watch); watch 1076 sapi/phpdbg/phpdbg_watch.c if ((watch->flags & PHPDBG_WATCH_NORMAL) && HT_WATCH_HT(watch)->nInternalPointer != HT_PTR_HT(oldPtr)->nInternalPointer) { watch 1081 sapi/phpdbg/phpdbg_watch.c if ((watch->flags & PHPDBG_WATCH_NORMAL) && (PHPDBG_G(flags) & PHPDBG_SHOW_REFCOUNTS)) { watch 1083 sapi/phpdbg/phpdbg_watch.c phpdbg_writeln("watchrefcount", "type=\"new\" refcount=\"%d\"", "New refcount: %d", GC_REFCOUNT(watch->addr.ref)); watch 1122 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch; watch 1126 sapi/phpdbg/phpdbg_watch.c ZEND_HASH_FOREACH_PTR(&PHPDBG_G(watchpoints), watch) { watch 1127 sapi/phpdbg/phpdbg_watch.c if (watch->flags & PHPDBG_WATCH_NORMAL) { watch 1128 sapi/phpdbg/phpdbg_watch.c phpdbg_writeln("watchvariable", "variable=\"%.*s\" on=\"%s\" type=\"%s\"", "%.*s (%s, %s)", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str), watch->type == WATCH_ON_HASHTABLE ? "array" : watch->type == WATCH_ON_REFCOUNTED ? "refcount" : "variable", watch->flags == PHPDBG_WATCH_RECURSIVE ? "recursive" : "simple"); watch 1141 sapi/phpdbg/phpdbg_watch.c phpdbg_watchpoint_t *watch = result->ptr; watch 1143 sapi/phpdbg/phpdbg_watch.c if ((size_t) watch->addr.ptr + watch->size > (size_t) ptr) { watch 1144 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_REFCOUNTED) { watch 1146 sapi/phpdbg/phpdbg_watch.c phpdbg_deactivate_watchpoint(watch); watch 1147 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watchpoint(watch); watch 1149 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_ZVAL) { watch 1150 sapi/phpdbg/phpdbg_watch.c phpdbg_remove_watch_collision(watch); watch 1152 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_HASHTABLE && (watch->flags & PHPDBG_WATCH_SIMPLE)) { watch 1154 sapi/phpdbg/phpdbg_watch.c phpdbg_notice("watchdelete", "variable=\"%.*s\" recursive=\"%s\"", "Array %.*s was removed, removing watchpoint%s", (int) ZSTR_LEN(watch->str), ZSTR_VAL(watch->str), (watch->flags & PHPDBG_WATCH_RECURSIVE) ? " recursively" : ""); watch 1156 sapi/phpdbg/phpdbg_watch.c if (watch->type == WATCH_ON_HASHTABLE || watch->parent == NULL || watch->parent->type != WATCH_ON_ZVAL) { /* no references */ watch 1157 sapi/phpdbg/phpdbg_watch.c zend_hash_del(&PHPDBG_G(watchpoints), watch->str); watch 80 sapi/phpdbg/phpdbg_watch.h phpdbg_watchpoint_t *watch; watch 99 sapi/phpdbg/phpdbg_watch.h void phpdbg_create_addr_watchpoint(void *addr, size_t size, phpdbg_watchpoint_t *watch); watch 100 sapi/phpdbg/phpdbg_watch.h void phpdbg_create_zval_watchpoint(zval *zv, phpdbg_watchpoint_t *watch);