static PageInfo* find_page_and_cell(GCObjectPtr ptr, uint32_t *cell_idx) { Arena *arena = find_arena(ptr); if (EJS_LIKELY (arena != NULL)) { SANITY(verify_arena(arena)); int page_index = PTR_TO_ARENA_PAGE_INDEX(ptr); if (page_index < 0 || page_index > arena->num_pages) { return NULL; } PageInfo *page = arena->page_infos[page_index]; if (!IS_ALIGNED_TO(ptr, page->cell_size)) { return NULL; // can't possibly point to allocated cells. } if (cell_idx) { *cell_idx = PTR_TO_CELL(ptr, page); EJS_ASSERT(*cell_idx >= 0 && *cell_idx < CELLS_IN_PAGE(page)); } return page; } // check if it's in the LOS LOCK_GC(); for (LargeObjectInfo *lobj = los_list; lobj; lobj = lobj->next) { if (lobj->page_info.page_start == ptr) { if (cell_idx) { *cell_idx = 0; } UNLOCK_GC(); return &lobj->page_info; } } UNLOCK_GC(); return NULL; }
uintptr_t ptr_to_arena_page_index(void* ptr) { return PTR_TO_ARENA_PAGE_INDEX(ptr); }