(chunk_addr, set_id = 0)
| 790 | -----------------------------------------------------------------------------*/ |
| 791 | // set ids: 0 = OLD_TO_NEW, 1 = 0 = OLD_TO_OLD |
| 792 | function print_remembered_set(chunk_addr, set_id = 0) { |
| 793 | if (!chunk_addr) { |
| 794 | if (isolate_address == 0) { |
| 795 | print("Please call !set_iso(isolate_address) or provide chunk address."); |
| 796 | return; |
| 797 | } |
| 798 | |
| 799 | let iso = cast(isolate_address, "v8::internal::Isolate"); |
| 800 | let h = iso.heap_; |
| 801 | let chunks = []; |
| 802 | get_chunks_space('old', h.old_space_.memory_chunk_list_.front_, chunks); |
| 803 | get_chunks_space('lo', h.lo_space_.memory_chunk_list_.front_, chunks); |
| 804 | for (let c of chunks) { |
| 805 | try { |
| 806 | print_remembered_set(c.address); |
| 807 | } |
| 808 | catch (e) { |
| 809 | print(`failed to process chunk ${hex(c.address)} due to ${e.message}`); |
| 810 | } |
| 811 | } |
| 812 | return; |
| 813 | } |
| 814 | |
| 815 | print(`Remembered set in chunk ${hex(chunk_addr)}`); |
| 816 | let chunk = cast(chunk_addr, "v8::internal::MemoryChunk"); |
| 817 | |
| 818 | // chunk.slot_set_ is an array of SlotSet's. For standard pages there is 0 or |
| 819 | // 1 item in the array, but for large pages there will be more. |
| 820 | const page_size = 256 * 1024; |
| 821 | const sets_count = Math.floor((chunk.size_ + page_size - 1) / page_size); |
| 822 | let rs = chunk.slot_set_[set_id]; |
| 823 | if (rs.isNull) { |
| 824 | print(` <empty>`); |
| 825 | return; |
| 826 | } |
| 827 | if (rs[0].page_start_ != chunk_addr) { |
| 828 | print(`page_start_ [${hex(rs.page_start_)}] doesn't match chunk_addr!`); |
| 829 | return; |
| 830 | } |
| 831 | |
| 832 | const ptr_size = tagged_size(); |
| 833 | let count = 0; |
| 834 | for (let s = 0; s < sets_count; s++){ |
| 835 | const buckets_count = rs[s].buckets_.Count(); |
| 836 | for (let b = 0; b < buckets_count; b++) { |
| 837 | let bucket = rs[s].buckets_[b]; |
| 838 | if (bucket.isNull) continue; |
| 839 | // there are 32 cells in each bucket, cell's size is 32 bits |
| 840 | print(` bucket ${hex(bucket.address.asNumber())}:`); |
| 841 | const first_cell = bucket.address.asNumber(); |
| 842 | for (let c = 0; c < 32; c++) { |
| 843 | let cell = host.memory.readMemoryValues( |
| 844 | first_cell + c * 4, 1, 4 /*size to read*/)[0]; |
| 845 | if (cell == 0) continue; |
| 846 | let mask = 1; |
| 847 | for (let bit = 0; bit < 32; bit++){ |
| 848 | if (cell & mask) { |
| 849 | count++; |
nothing calls this directly
no test coverage detected