Lines Matching refs:watch

127 #define HT_WATCH_HT(watch) HT_PTR_HT((watch)->addr.ptr)  argument
212 phpdbg_watchpoint_t *watch; in phpdbg_check_for_watchpoint() local
219 watch = result->ptr; in phpdbg_check_for_watchpoint()
222 …undary(watch->addr.ptr) > (char *) addr || (char *) phpdbg_get_page_boundary(watch->addr.ptr) + ph… in phpdbg_check_for_watchpoint()
227 return watch; in phpdbg_check_for_watchpoint()
230 static void phpdbg_change_watchpoint_access(phpdbg_watchpoint_t *watch, int access) { in phpdbg_change_watchpoint_access() argument
232 …mprotect(phpdbg_get_page_boundary(watch->addr.ptr), phpdbg_get_total_page_size(watch->addr.ptr, wa… in phpdbg_change_watchpoint_access()
235 static inline void phpdbg_activate_watchpoint(phpdbg_watchpoint_t *watch) { in phpdbg_activate_watchpoint() argument
236 phpdbg_change_watchpoint_access(watch, PROT_READ); in phpdbg_activate_watchpoint()
239 static inline void phpdbg_deactivate_watchpoint(phpdbg_watchpoint_t *watch) { in phpdbg_deactivate_watchpoint() argument
240 phpdbg_change_watchpoint_access(watch, PROT_READ | PROT_WRITE); in phpdbg_deactivate_watchpoint()
272 static inline void phpdbg_store_watchpoint_btree(phpdbg_watchpoint_t *watch) { argument
274 …_btree_find(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr)) == NULL || res->ptr == watc…
275 phpdbg_btree_insert(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr, watch);
278 static inline void phpdbg_remove_watchpoint_btree(phpdbg_watchpoint_t *watch) { argument
279 phpdbg_btree_delete(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr);
283 void phpdbg_set_addr_watchpoint(void *addr, size_t size, phpdbg_watchpoint_t *watch) { argument
284 watch->addr.ptr = addr;
285 watch->size = size;
286 watch->ref = NULL;
287 watch->coll = NULL;
288 zend_hash_init(&watch->elements, 8, brml, NULL, 0);
291 void phpdbg_set_zval_watchpoint(zval *zv, phpdbg_watchpoint_t *watch) { argument
292 phpdbg_set_addr_watchpoint(zv, sizeof(zval) - sizeof(uint32_t), watch);
293 watch->type = WATCH_ON_ZVAL;
296 void phpdbg_set_bucket_watchpoint(Bucket *bucket, phpdbg_watchpoint_t *watch) { argument
297 phpdbg_set_addr_watchpoint(bucket, sizeof(Bucket), watch);
298 watch->type = WATCH_ON_BUCKET;
301 void phpdbg_set_ht_watchpoint(HashTable *ht, phpdbg_watchpoint_t *watch) { argument
302 …g_set_addr_watchpoint(((char *) ht) + HT_WATCH_OFFSET, sizeof(HashTable) - HT_WATCH_OFFSET, watch);
303 watch->type = WATCH_ON_HASHTABLE;
306 void phpdbg_watch_backup_data(phpdbg_watchpoint_t *watch) { argument
307 switch (watch->type) {
311 memcpy(&watch->backup, watch->addr.ptr, watch->size);
314 if (watch->backup.str) {
315 zend_string_release(watch->backup.str);
317watch->backup.str = zend_string_init((char *) watch->addr.ptr + XtOffsetOf(zend_string, val) - XtO…
318 GC_MAKE_PERSISTENT_LOCAL(watch->backup.str);
321 memcpy((char *) &watch->backup + HT_WATCH_OFFSET, watch->addr.ptr, watch->size);
329 void phpdbg_delete_watch_collision(phpdbg_watchpoint_t *watch) { argument
331 if ((coll = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref))) {
332 zend_hash_index_del(&coll->parents, (zend_ulong) watch);
348 zend_hash_index_del(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref);
355 void phpdbg_update_watch_ref(phpdbg_watchpoint_t *watch) { argument
358 ZEND_ASSERT(watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET);
359 if (Z_REFCOUNTED_P(watch->addr.zv)) {
360 if (Z_COUNTED_P(watch->addr.zv) == watch->ref) {
364 if (watch->ref != NULL) {
365 phpdbg_delete_watch_collision(watch);
368 watch->ref = Z_COUNTED_P(watch->addr.zv);
370 if (!(coll = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref))) {
373 phpdbg_set_addr_watchpoint(Z_COUNTED_P(watch->addr.zv), sizeof(uint32_t), &coll->ref);
379 if (Z_ISREF_P(watch->addr.zv)) {
380 phpdbg_set_zval_watchpoint(Z_REFVAL_P(watch->addr.zv), &coll->reference);
386 } else if (Z_TYPE_P(watch->addr.zv) == IS_STRING) {
388 …_addr_watchpoint(&Z_STRLEN_P(watch->addr.zv), XtOffsetOf(zend_string, val) - XtOffsetOf(zend_strin…
399 zend_hash_index_add_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref, coll);
401 zend_hash_index_add_ptr(&coll->parents, (zend_long) watch, watch);
402 } else if (Z_TYPE_P(watch->addr.zv) == IS_INDIRECT) {
403 if ((zend_refcounted *) Z_INDIRECT_P(watch->addr.zv) == watch->ref) {
407 if (watch->ref != NULL) {
408 phpdbg_delete_watch_collision(watch);
411 watch->ref = (zend_refcounted *) Z_INDIRECT_P(watch->addr.zv);
413 if (!(coll = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref))) {
415 phpdbg_set_zval_watchpoint(Z_INDIRECT_P(watch->addr.zv), &coll->ref);
423 zend_hash_index_add_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref, coll);
425 zend_hash_index_add_ptr(&coll->parents, (zend_long) watch, watch);
426 } else if (watch->ref) {
427 phpdbg_delete_watch_collision(watch);
428 watch->ref = NULL;
437 void phpdbg_remove_watchpoint(phpdbg_watchpoint_t *watch);
440 phpdbg_watch_element *phpdbg_add_watch_element(phpdbg_watchpoint_t *watch, phpdbg_watch_element *el… argument
442 if ((res = phpdbg_btree_find(&PHPDBG_G(watchpoint_tree), (zend_ulong) watch->addr.ptr)) == NULL) {
444 *mem = *watch;
445 watch = mem;
446 phpdbg_store_watchpoint_btree(watch);
447 if (watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) {
448 phpdbg_update_watch_ref(watch);
450 phpdbg_activate_watchpoint(watch);
451 phpdbg_watch_backup_data(watch);
454 watch = res->ptr;
455 if ((old_element = zend_hash_find_ptr(&watch->elements, element->str))) {
461 element->watch = watch;
462 zend_hash_add_ptr(&watch->elements, element->str, element);
472 phpdbg_watchpoint_t watch; local
473 phpdbg_set_bucket_watchpoint(bucket, &watch);
474 element = phpdbg_add_watch_element(&watch, element);
480 phpdbg_watchpoint_t watch; local
488 phpdbg_set_ht_watchpoint(ht, &watch);
489 return phpdbg_add_watch_element(&watch, element);
496 if (element->watch->addr.ptr == ptr) {
524 child->parent_container = HT_WATCH_HT(element->watch);
533 if (element->watch->type == WATCH_ON_ZVAL || element->watch->type == WATCH_ON_BUCKET) {
534 zv = element->watch->addr.zv;
570 ZEND_ASSERT(element->watch->type == WATCH_ON_HASHTABLE);
571 ZEND_HASH_FOREACH_KEY_VAL(HT_WATCH_HT(element->watch), idx, str, zv) {
578 if (element->watch->type == WATCH_ON_BUCKET) {
608 if (element->watch->type == WATCH_ON_BUCKET) {
719 …ZEND_ASSERT(element->parent->watch->type == WATCH_ON_ZVAL || element->parent->watch->type == WATCH…
720 zv = element->parent->watch->addr.zv;
799 …memcpy(&element->backup, &element->watch->backup, /* element->watch->size */ sizeof(element->backu…
857 ZEND_ASSERT(element->watch->type == WATCH_ON_ZVAL || element->watch->type == WATCH_ON_BUCKET);
872 void phpdbg_update_watch_collision_elements(phpdbg_watchpoint_t *watch) { argument
876 ZEND_HASH_FOREACH_PTR(&watch->coll->parents, parent) {
887 void phpdbg_remove_watchpoint(phpdbg_watchpoint_t *watch) { argument
890 phpdbg_deactivate_watchpoint(watch);
891 phpdbg_remove_watchpoint_btree(watch);
892 phpdbg_delete_watch_collision(watch);
894 if (watch->coll) {
895 phpdbg_update_watch_collision_elements(watch);
899 watch->elements.nNumOfElements++; /* dirty hack to avoid double free */
900 ZEND_HASH_FOREACH_PTR(&watch->elements, element) {
903 zend_hash_destroy(&watch->elements);
905 efree(watch);
909 HashTable *elements = &element->watch->elements;
913 phpdbg_remove_watchpoint(element->watch);
918 zend_string *phpdbg_watchpoint_change_collision_name(phpdbg_watchpoint_t *watch) { argument
922 if (watch->coll) {
923 ZEND_HASH_FOREACH_PTR(&watch->coll->parents, parent) {
931 ZEND_HASH_FOREACH_PTR(&watch->elements, element) {
933 …if ((watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) && Z_TYPE(watch->backup.zv) >…
946 void phpdbg_check_watchpoint(phpdbg_watchpoint_t *watch) { argument
950 if (watch->type == WATCH_ON_HASHTABLE) {
955 ZEND_HASH_FOREACH_PTR(&watch->elements, element) {
957 …tree_result *res = phpdbg_btree_find(&PHPDBG_G(watch_HashTables), (zend_ulong) HT_WATCH_HT(watch));
960 ZEND_HASH_REVERSE_FOREACH_KEY_VAL(HT_WATCH_HT(watch), idx, str, zv) {
970 ZEND_HASH_FOREACH_PTR(&watch->elements, element) {
984 if (watch->type == WATCH_ON_HASHDATA) {
988 switch (watch->type) {
990 comparePtr = &ZSTR_LEN(watch->backup.str);
993 comparePtr = (char *) &watch->backup.ht + HT_WATCH_OFFSET;
996 comparePtr = &watch->backup;
998 if (!phpdbg_check_watch_diff(watch->type, comparePtr, watch->addr.ptr)) {
1001 if (watch->type == WATCH_ON_REFCOUNTED && !(PHPDBG_G(flags) & PHPDBG_SHOW_REFCOUNTS)) {
1002 phpdbg_watch_backup_data(watch);
1005 if (watch->type == WATCH_ON_BUCKET) {
1006 …if (watch->backup.bucket.key != watch->addr.bucket->key || (watch->backup.bucket.key != NULL && wa…
1010 ZEND_HASH_FOREACH_PTR(&watch->elements, element) {
1019 phpdbg_remove_watchpoint(watch);
1023 phpdbg_deactivate_watchpoint(watch);
1024 phpdbg_remove_watchpoint_btree(watch);
1025 watch->addr.zv = new;
1026 phpdbg_store_watchpoint_btree(watch);
1027 phpdbg_activate_watchpoint(watch);
1029 if (!phpdbg_check_watch_diff(WATCH_ON_ZVAL, &watch->backup.bucket.val, watch->addr.ptr)) {
1030 phpdbg_watch_backup_data(watch);
1033 } else if (Z_TYPE_P(watch->addr.zv) == IS_UNDEF) {
1035 phpdbg_remove_watchpoint(watch);
1040 name = phpdbg_watchpoint_change_collision_name(watch);
1043 phpdbg_print_watch_diff(watch->type, name, comparePtr, watch->addr.ptr);
1047 if (watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) {
1049 phpdbg_update_watch_ref(watch);
1050 ZEND_HASH_FOREACH_PTR(&watch->elements, element) {
1057 phpdbg_watch_backup_data(watch);
1063 phpdbg_watchpoint_t *watch; local
1069 watch = res->ptr;
1070 if ((char *) page < (char *) watch->addr.ptr + watch->size) {
1081 phpdbg_watchpoint_t *watch; local
1098 watch = res->ptr;
1099 phpdbg_check_watchpoint(watch);
1102 watch = res->ptr;
1103 if ((char *) page < (char *) watch->addr.ptr + watch->size) {
1104 phpdbg_check_watchpoint(watch);
1131 phpdbg_watchpoint_t *watch = result->ptr; local
1132 if (watch->type != WATCH_ON_HASHDATA) {
1133 phpdbg_remove_watchpoint(watch);
1137 phpdbg_watch_ht_info *hti = (phpdbg_watch_ht_info *) watch;
1141 phpdbg_remove_watchpoint(element->watch);
1151 phpdbg_watchpoint_t *watch = result->ptr; local
1152 if (watch->type == WATCH_ON_HASHTABLE) {
1153 phpdbg_remove_watchpoint(watch);
1260 …_G(watch_tmp) && Z_ISREF_P(PHPDBG_G(watch_tmp)->watch->addr.zv) && Z_REFVAL_P(PHPDBG_G(watch_tmp)-…