/home/travis/build/MoarVM/MoarVM/src/gc/wb.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* Functions for if the write barriers are hit. */ |
2 | | MVM_PUBLIC void MVM_gc_write_barrier_hit(MVMThreadContext *tc, MVMCollectable *update_root); |
3 | | |
4 | | /* Ensures that if a generation 2 object comes to hold a reference to a |
5 | | * nursery object, then the generation 2 object becomes an inter-generational |
6 | | * root. */ |
7 | 0 | MVM_STATIC_INLINE void MVM_gc_write_barrier(MVMThreadContext *tc, MVMCollectable *update_root, const MVMCollectable *referenced) { |
8 | 0 | if (((update_root->flags & MVM_CF_SECOND_GEN) && referenced && !(referenced->flags & MVM_CF_SECOND_GEN))) |
9 | 0 | MVM_gc_write_barrier_hit(tc, update_root); |
10 | 0 | } |
11 | | |
12 | | /* Does an assignment, but makes sure the write barrier MVM_WB is applied |
13 | | * first. Takes the root object, the address within it we're writing to, and |
14 | | * the thing we're writing. Note that update_addr is not involved in the |
15 | | * write barrier. */ |
16 | | #if MVM_GC_DEBUG |
17 | | #define MVM_ASSIGN_REF(tc, update_root, update_addr, referenced) \ |
18 | | { \ |
19 | | void *_r = referenced; \ |
20 | | if (_r && ((MVMCollectable *)_r)->owner == 0) \ |
21 | | MVM_panic(1, "Invalid assignment (maybe of heap frame to stack frame?)"); \ |
22 | | MVM_ASSERT_NOT_FROMSPACE(tc, _r); \ |
23 | | MVM_gc_write_barrier(tc, update_root, (MVMCollectable *)_r); \ |
24 | | update_addr = _r; \ |
25 | | } |
26 | | #else |
27 | | #define MVM_ASSIGN_REF(tc, update_root, update_addr, referenced) \ |
28 | | { \ |
29 | | void *_r = referenced; \ |
30 | | MVM_gc_write_barrier(tc, update_root, (MVMCollectable *)_r); \ |
31 | | update_addr = _r; \ |
32 | | } |
33 | | #endif |