Lines Matching refs:watch

134 #define HT_WATCH_HT(watch) HT_PTR_HT((watch)->addr.ptr)  argument
219 phpdbg_watchpoint_t *watch; in phpdbg_check_for_watchpoint() local
226 watch = result->ptr; in phpdbg_check_for_watchpoint()
229 …undary(watch->addr.ptr) > (char *) addr || (char *) phpdbg_get_page_boundary(watch->addr.ptr) + ph… in phpdbg_check_for_watchpoint()
234 return watch; in phpdbg_check_for_watchpoint()
237 static void phpdbg_change_watchpoint_access(phpdbg_watchpoint_t *watch, int access) { in phpdbg_change_watchpoint_access() argument
238 void *page_addr = phpdbg_get_page_boundary(watch->addr.ptr); in phpdbg_change_watchpoint_access()
239 size_t size = phpdbg_get_total_page_size(watch->addr.ptr, watch->size); in phpdbg_change_watchpoint_access()
272 static inline void phpdbg_activate_watchpoint(phpdbg_watchpoint_t *watch) { in phpdbg_activate_watchpoint() argument
273 phpdbg_change_watchpoint_access(watch, PROT_READ); in phpdbg_activate_watchpoint()
276 static inline void phpdbg_deactivate_watchpoint(phpdbg_watchpoint_t *watch) { in phpdbg_deactivate_watchpoint() argument
277 phpdbg_change_watchpoint_access(watch, PROT_READ | PROT_WRITE); in phpdbg_deactivate_watchpoint()
335 static inline void phpdbg_store_watchpoint_btree(phpdbg_watchpoint_t *watch) { argument
337 …_btree_find(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr)) == NULL || res->ptr == watc…
338 phpdbg_btree_insert(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr, watch);
341 static inline void phpdbg_remove_watchpoint_btree(phpdbg_watchpoint_t *watch) { argument
342 phpdbg_btree_delete(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr);
346 void phpdbg_set_addr_watchpoint(void *addr, size_t size, phpdbg_watchpoint_t *watch) { argument
347 watch->addr.ptr = addr;
348 watch->size = size;
349 watch->ref = NULL;
350 watch->coll = NULL;
351 zend_hash_init(&watch->elements, 8, brml, NULL, 0);
354 void phpdbg_set_zval_watchpoint(zval *zv, phpdbg_watchpoint_t *watch) { argument
355 phpdbg_set_addr_watchpoint(zv, sizeof(zval) - sizeof(uint32_t), watch);
356 watch->type = WATCH_ON_ZVAL;
359 void phpdbg_set_bucket_watchpoint(Bucket *bucket, phpdbg_watchpoint_t *watch) { argument
360 phpdbg_set_addr_watchpoint(bucket, sizeof(Bucket), watch);
361 watch->type = WATCH_ON_BUCKET;
364 void phpdbg_set_ht_watchpoint(HashTable *ht, phpdbg_watchpoint_t *watch) { argument
365 …g_set_addr_watchpoint(((char *) ht) + HT_WATCH_OFFSET, sizeof(HashTable) - HT_WATCH_OFFSET, watch);
366 watch->type = WATCH_ON_HASHTABLE;
369 void phpdbg_watch_backup_data(phpdbg_watchpoint_t *watch) { argument
370 switch (watch->type) {
374 memcpy(&watch->backup, watch->addr.ptr, watch->size);
377 if (watch->backup.str) {
378 zend_string_release(watch->backup.str);
380watch->backup.str = zend_string_init((char *) watch->addr.ptr + XtOffsetOf(zend_string, val) - XtO…
381 GC_MAKE_PERSISTENT_LOCAL(watch->backup.str);
384 memcpy((char *) &watch->backup + HT_WATCH_OFFSET, watch->addr.ptr, watch->size);
392 void phpdbg_delete_watch_collision(phpdbg_watchpoint_t *watch) { argument
394 if ((coll = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref))) {
395 zend_hash_index_del(&coll->parents, (zend_ulong) watch);
411 zend_hash_index_del(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref);
418 void phpdbg_update_watch_ref(phpdbg_watchpoint_t *watch) { argument
421 ZEND_ASSERT(watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET);
422 if (Z_REFCOUNTED_P(watch->addr.zv)) {
423 if (Z_COUNTED_P(watch->addr.zv) == watch->ref) {
427 if (watch->ref != NULL) {
428 phpdbg_delete_watch_collision(watch);
431 watch->ref = Z_COUNTED_P(watch->addr.zv);
433 if (!(coll = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref))) {
436 phpdbg_set_addr_watchpoint(Z_COUNTED_P(watch->addr.zv), sizeof(uint32_t), &coll->ref);
442 if (Z_ISREF_P(watch->addr.zv)) {
443 phpdbg_set_zval_watchpoint(Z_REFVAL_P(watch->addr.zv), &coll->reference);
449 } else if (Z_TYPE_P(watch->addr.zv) == IS_STRING) {
451 …_addr_watchpoint(&Z_STRLEN_P(watch->addr.zv), XtOffsetOf(zend_string, val) - XtOffsetOf(zend_strin…
462 zend_hash_index_add_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref, coll);
464 zend_hash_index_add_ptr(&coll->parents, (zend_long) watch, watch);
465 } else if (Z_TYPE_P(watch->addr.zv) == IS_INDIRECT) {
466 if ((zend_refcounted *) Z_INDIRECT_P(watch->addr.zv) == watch->ref) {
470 if (watch->ref != NULL) {
471 phpdbg_delete_watch_collision(watch);
474 watch->ref = (zend_refcounted *) Z_INDIRECT_P(watch->addr.zv);
476 if (!(coll = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref))) {
478 phpdbg_set_zval_watchpoint(Z_INDIRECT_P(watch->addr.zv), &coll->ref);
486 zend_hash_index_add_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref, coll);
488 zend_hash_index_add_ptr(&coll->parents, (zend_long) watch, watch);
489 } else if (watch->ref) {
490 phpdbg_delete_watch_collision(watch);
491 watch->ref = NULL;
500 void phpdbg_remove_watchpoint(phpdbg_watchpoint_t *watch);
503 phpdbg_watch_element *phpdbg_add_watch_element(phpdbg_watchpoint_t *watch, phpdbg_watch_element *el… argument
505 if ((res = phpdbg_btree_find(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr)) == NULL) {
507 *mem = *watch;
508 watch = mem;
509 phpdbg_store_watchpoint_btree(watch);
510 if (watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) {
511 phpdbg_update_watch_ref(watch);
513 phpdbg_activate_watchpoint(watch);
514 phpdbg_watch_backup_data(watch);
517 watch = res->ptr;
518 if ((old_element = zend_hash_find_ptr(&watch->elements, element->str))) {
526 element->watch = watch;
527 zend_hash_add_ptr(&watch->elements, element->str, element);
537 phpdbg_watchpoint_t watch; local
538 phpdbg_set_bucket_watchpoint(bucket, &watch);
539 element = phpdbg_add_watch_element(&watch, element);
545 phpdbg_watchpoint_t watch; local
553 phpdbg_set_ht_watchpoint(ht, &watch);
554 return phpdbg_add_watch_element(&watch, element);
561 if (element->watch->addr.ptr == ptr) {
589 child->parent_container = HT_WATCH_HT(element->watch);
598 if (element->watch->type == WATCH_ON_ZVAL || element->watch->type == WATCH_ON_BUCKET) {
599 zv = element->watch->addr.zv;
635 ZEND_ASSERT(element->watch->type == WATCH_ON_HASHTABLE);
636 ZEND_HASH_FOREACH_KEY_VAL(HT_WATCH_HT(element->watch), idx, str, zv) {
643 if (element->watch->type == WATCH_ON_BUCKET) {
673 if (element->watch && element->watch->type == WATCH_ON_BUCKET) {
784 …ZEND_ASSERT(element->parent->watch->type == WATCH_ON_ZVAL || element->parent->watch->type == WATCH…
785 zv = element->parent->watch->addr.zv;
864 …memcpy(&element->backup, &element->watch->backup, /* element->watch->size */ sizeof(element->backu…
922 ZEND_ASSERT(element->watch->type == WATCH_ON_ZVAL || element->watch->type == WATCH_ON_BUCKET);
937 void phpdbg_update_watch_collision_elements(phpdbg_watchpoint_t *watch) { argument
941 ZEND_HASH_MAP_FOREACH_PTR(&watch->coll->parents, parent) {
952 void phpdbg_remove_watchpoint(phpdbg_watchpoint_t *watch) { argument
955 phpdbg_remove_watchpoint_btree(watch);
956 phpdbg_deactivate_watchpoint(watch);
957 phpdbg_delete_watch_collision(watch);
959 if (watch->coll) {
960 phpdbg_update_watch_collision_elements(watch);
964 watch->elements.nNumOfElements++; /* dirty hack to avoid double free */
965 ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) {
968 zend_hash_destroy(&watch->elements);
970 efree(watch);
976 if (element->watch) {
977 HashTable *elements = &element->watch->elements;
980 phpdbg_remove_watchpoint(element->watch);
986 zend_string *phpdbg_watchpoint_change_collision_name(phpdbg_watchpoint_t *watch) { argument
990 if (watch->coll) {
991 ZEND_HASH_MAP_FOREACH_PTR(&watch->coll->parents, parent) {
999 ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) {
1001 …if ((watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) && Z_TYPE(watch->backup.zv) >…
1014 void phpdbg_check_watchpoint(phpdbg_watchpoint_t *watch) { argument
1018 if (watch->type == WATCH_ON_HASHTABLE) {
1023 ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) {
1025 …tree_result *res = phpdbg_btree_find(&PHPDBG_G(watch_HashTables), (zend_ulong) HT_WATCH_HT(watch));
1028 ZEND_HASH_REVERSE_FOREACH_KEY_VAL(HT_WATCH_HT(watch), idx, str, zv) {
1038 ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) {
1052 if (watch->type == WATCH_ON_HASHDATA) {
1056 switch (watch->type) {
1058 comparePtr = &ZSTR_LEN(watch->backup.str);
1061 comparePtr = (char *) &watch->backup.ht + HT_WATCH_OFFSET;
1064 comparePtr = &watch->backup;
1066 if (!phpdbg_check_watch_diff(watch->type, comparePtr, watch->addr.ptr)) {
1069 if (watch->type == WATCH_ON_REFCOUNTED && !(PHPDBG_G(flags) & PHPDBG_SHOW_REFCOUNTS)) {
1070 phpdbg_watch_backup_data(watch);
1073 if (watch->type == WATCH_ON_BUCKET) {
1074 …if (watch->backup.bucket.key != watch->addr.bucket->key || (watch->backup.bucket.key != NULL && wa…
1078 ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) {
1087 phpdbg_remove_watchpoint(watch);
1091 phpdbg_remove_watchpoint_btree(watch);
1092 phpdbg_deactivate_watchpoint(watch);
1093 watch->addr.zv = new;
1094 phpdbg_store_watchpoint_btree(watch);
1095 phpdbg_activate_watchpoint(watch);
1097 if (!phpdbg_check_watch_diff(WATCH_ON_ZVAL, &watch->backup.bucket.val, watch->addr.ptr)) {
1098 phpdbg_watch_backup_data(watch);
1101 } else if (Z_TYPE_P(watch->addr.zv) == IS_UNDEF) {
1103 phpdbg_remove_watchpoint(watch);
1108 name = phpdbg_watchpoint_change_collision_name(watch);
1111 phpdbg_print_watch_diff(watch->type, name, comparePtr, watch->addr.ptr);
1115 if (watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) {
1117 phpdbg_update_watch_ref(watch);
1118 ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) {
1125 phpdbg_watch_backup_data(watch);
1131 phpdbg_watchpoint_t *watch; local
1137 watch = res->ptr;
1138 if ((char *) page < (char *) watch->addr.ptr + watch->size) {
1163 phpdbg_watchpoint_t *watch; local
1180 watch = res->ptr;
1181 phpdbg_check_watchpoint(watch);
1184 watch = res->ptr;
1185 if ((char *) page < (char *) watch->addr.ptr + watch->size) {
1186 phpdbg_check_watchpoint(watch);
1213 phpdbg_watchpoint_t *watch = result->ptr; local
1214 if (watch->type != WATCH_ON_HASHDATA) {
1215 phpdbg_remove_watchpoint(watch);
1219 phpdbg_watch_ht_info *hti = (phpdbg_watch_ht_info *) watch;
1223 phpdbg_remove_watchpoint(element->watch);
1233 phpdbg_watchpoint_t *watch = result->ptr; local
1234 if (watch->type == WATCH_ON_HASHTABLE) {
1235 phpdbg_remove_watchpoint(watch);
1342 …_G(watch_tmp) && Z_ISREF_P(PHPDBG_G(watch_tmp)->watch->addr.zv) && Z_REFVAL_P(PHPDBG_G(watch_tmp)-…