Coverage Report

Created: 2017-04-15 07:07

/home/travis/build/MoarVM/MoarVM/src/6model/sc.h
Line
Count
Source (jump to first uncovered line)
1
/* SC manipulation functions. */
2
MVMObject * MVM_sc_create(MVMThreadContext *tc, MVMString *handle);
3
void MVM_sc_add_all_scs_entry(MVMThreadContext *tc, MVMSerializationContextBody *scb);
4
MVMString * MVM_sc_get_handle(MVMThreadContext *tc, MVMSerializationContext *sc);
5
MVMString * MVM_sc_get_description(MVMThreadContext *tc, MVMSerializationContext *sc);
6
void MVM_sc_set_description(MVMThreadContext *tc, MVMSerializationContext *sc, MVMString *desc);
7
MVMint64 MVM_sc_find_object_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj);
8
MVMint64 MVM_sc_find_object_idx_jit(MVMThreadContext *tc, MVMObject *sc, MVMObject *obj);
9
MVMint64 MVM_sc_find_stable_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st);
10
MVMint64 MVM_sc_find_code_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj);
11
MVMObject * MVM_sc_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx);
12
MVMObject * MVM_sc_try_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx);
13
void MVM_sc_set_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *obj);
14
MVMSTable * MVM_sc_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx);
15
MVMSTable * MVM_sc_try_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx);
16
void MVM_sc_set_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMSTable *st);
17
void MVM_sc_push_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st);
18
MVMObject * MVM_sc_get_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx);
19
MVMSerializationContext * MVM_sc_find_by_handle(MVMThreadContext *tc, MVMString *handle);
20
MVMSerializationContext * MVM_sc_get_sc(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep);
21
MVMObject * MVM_sc_get_sc_object(MVMThreadContext *tc, MVMCompUnit *cu,
22
                                 MVMint16 dep, MVMint64 idx);
23
void MVM_sc_disclaim(MVMThreadContext *tc, MVMSerializationContext *sc);
24
0
MVM_STATIC_INLINE MVMuint32 MVM_sc_get_idx_of_sc(MVMCollectable *col) {
25
0
    assert(!(col->flags & MVM_CF_FORWARDER_VALID));
26
0
#ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX
27
0
    if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED)
28
0
        return col->sc_forward_u.sci->sc_idx;
29
0
#endif
30
0
    return col->sc_forward_u.sc.sc_idx;
31
0
}
32
33
0
MVM_STATIC_INLINE MVMuint32 MVM_sc_get_idx_in_sc(MVMCollectable *col) {
34
0
    assert(!(col->flags & MVM_CF_FORWARDER_VALID));
35
0
#ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX
36
0
    if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED)
37
0
        return col->sc_forward_u.sci->idx;
38
0
    if (col->sc_forward_u.sc.idx == MVM_DIRECT_SC_IDX_SENTINEL)
39
0
        return ~0;
40
0
#endif
41
0
    return col->sc_forward_u.sc.idx;
42
0
}
43
44
0
MVM_STATIC_INLINE void MVM_sc_set_idx_in_sc(MVMCollectable *col, MVMuint32 i) {
45
0
    assert(!(col->flags & MVM_CF_FORWARDER_VALID));
46
0
    assert(i >= 0);
47
0
#ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX
48
0
    if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) {
49
0
        col->sc_forward_u.sci->idx = i;
50
0
    } else if (i >= MVM_DIRECT_SC_IDX_SENTINEL) {
51
0
        struct MVMSerializationIndex *const sci
52
0
            = MVM_malloc(sizeof(struct MVMSerializationIndex));
53
0
        sci->sc_idx = col->sc_forward_u.sc.sc_idx;
54
0
        sci->idx = i;
55
0
        col->sc_forward_u.sci = sci;
56
0
        col->flags |= MVM_CF_SERIALZATION_INDEX_ALLOCATED;
57
0
    } else
58
0
#endif
59
0
    {
60
0
        col->sc_forward_u.sc.idx = i;
61
0
    }
62
0
}
63
64
/* Gets a collectable's SC. */
65
0
MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_collectable_sc(MVMThreadContext *tc, MVMCollectable *col) {
66
0
    MVMuint32 sc_idx;
67
0
    assert(!(col->flags & MVM_CF_FORWARDER_VALID));
68
0
    sc_idx = MVM_sc_get_idx_of_sc(col);
69
0
    assert(sc_idx != ~0);
70
0
    return sc_idx > 0 ? tc->instance->all_scs[sc_idx]->sc : NULL;
71
0
}
72
73
/* Gets an object's SC. */
74
0
MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_obj_sc(MVMThreadContext *tc, MVMObject *obj) {
75
0
    return MVM_sc_get_collectable_sc(tc, &obj->header);
76
0
}
77
78
/* Gets a frame's SC. */
79
0
MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_frame_sc(MVMThreadContext *tc, MVMFrame *f) {
80
0
    return MVM_sc_get_collectable_sc(tc, &f->header);
81
0
}
82
83
/* Gets an STables's SC. */
84
0
MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_stable_sc(MVMThreadContext *tc, MVMSTable *st) {
85
0
    return MVM_sc_get_collectable_sc(tc, &st->header);
86
0
}
87
88
/* Sets a collectable's SC. */
89
0
MVM_STATIC_INLINE void MVM_sc_set_collectable_sc(MVMThreadContext *tc, MVMCollectable *col, MVMSerializationContext *sc) {
90
0
    assert(!(col->flags & MVM_CF_FORWARDER_VALID));
91
0
#ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX
92
0
    if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) {
93
0
        col->sc_forward_u.sci->sc_idx = sc->body->sc_idx;
94
0
        col->sc_forward_u.sci->idx    = ~0;
95
0
    } else
96
0
#endif
97
0
    {
98
0
        col->sc_forward_u.sc.sc_idx = sc->body->sc_idx;
99
0
#ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX
100
0
        if (col->sc_forward_u.sc.sc_idx != sc->body->sc_idx) {
101
0
            struct MVMSerializationIndex *const sci
102
0
                = MVM_malloc(sizeof(struct MVMSerializationIndex));
103
0
            sci->sc_idx = sc->body->sc_idx;
104
0
            sci->idx = ~0;
105
0
            col->sc_forward_u.sci = sci;
106
0
            col->flags |= MVM_CF_SERIALZATION_INDEX_ALLOCATED;
107
0
        } else
108
0
#endif
109
0
        {
110
0
            col->sc_forward_u.sc.idx    = MVM_DIRECT_SC_IDX_SENTINEL;
111
0
        }
112
0
    }
113
0
}
114
115
/* Sets an object's SC. */
116
0
MVM_STATIC_INLINE void MVM_sc_set_obj_sc(MVMThreadContext *tc, MVMObject *obj, MVMSerializationContext *sc) {
117
0
    MVM_sc_set_collectable_sc(tc, &obj->header, sc);
118
0
}
119
120
/* Sets an frame's SC. */
121
0
MVM_STATIC_INLINE void MVM_sc_set_frame_sc(MVMThreadContext *tc, MVMFrame *f, MVMSerializationContext *sc) {
122
0
    MVM_sc_set_collectable_sc(tc, &f->header, sc);
123
0
}
124
125
/* Sets an STable's SC. */
126
0
MVM_STATIC_INLINE void MVM_sc_set_stable_sc(MVMThreadContext *tc, MVMSTable *st, MVMSerializationContext *sc) {
127
0
    MVM_sc_set_collectable_sc(tc, &st->header, sc);
128
0
}
129
130
/* Given an SC, an index and a code ref, store it and the index. */
131
0
MVM_STATIC_INLINE void MVM_sc_set_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *code) {
132
0
    MVMObject *roots = sc->body->root_codes;
133
0
    MVM_repr_bind_pos_o(tc, roots, idx, code);
134
0
    if (MVM_sc_get_idx_of_sc(&code->header) == sc->body->sc_idx)
135
0
        MVM_sc_set_idx_in_sc(&code->header, idx);
136
0
}
137
138
/* Sets the full list of code refs. */
139
0
MVM_STATIC_INLINE void MVM_sc_set_code_list(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *code_list) {
140
0
    MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_codes, code_list);
141
0
}
142
143
/* Gets the number of objects in the SC. */
144
0
MVM_STATIC_INLINE MVMuint64 MVM_sc_get_object_count(MVMThreadContext *tc, MVMSerializationContext *sc) {
145
0
    return sc->body->num_objects;
146
0
}
147
148
/* Given an SC and an object, push it onto the SC. */
149
0
MVM_STATIC_INLINE void MVM_sc_push_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj) {
150
0
    MVMuint32 idx = sc->body->num_objects;
151
0
    MVM_sc_set_object(tc, sc, idx, obj);
152
0
    if (MVM_sc_get_idx_of_sc(&obj->header) == sc->body->sc_idx)
153
0
        MVM_sc_set_idx_in_sc(&obj->header, idx);
154
0
}
155
156
/* SC repossession write barriers. */
157
void MVM_sc_wb_hit_obj(MVMThreadContext *tc, MVMObject *obj);
158
void MVM_sc_wb_hit_st(MVMThreadContext *tc, MVMSTable *st);
159
160
0
MVM_STATIC_INLINE void MVM_SC_WB_OBJ(MVMThreadContext *tc, MVMObject *obj) {
161
0
    assert(!(obj->header.flags & MVM_CF_FORWARDER_VALID));
162
0
    assert(MVM_sc_get_idx_of_sc(&obj->header) != ~0);
163
0
    if (MVM_sc_get_idx_of_sc(&obj->header) > 0)
164
0
        MVM_sc_wb_hit_obj(tc, obj);
165
0
}
166
167
0
MVM_STATIC_INLINE void MVM_SC_WB_ST(MVMThreadContext *tc, MVMSTable *st) {
168
0
    assert(!(st->header.flags & MVM_CF_FORWARDER_VALID));
169
0
    assert(MVM_sc_get_idx_of_sc(&st->header) != ~0);
170
0
    if (MVM_sc_get_idx_of_sc(&st->header) > 0)
171
0
        MVM_sc_wb_hit_st(tc, st);
172
0
}