• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

llnl / dftracer-utils / 28693295402

04 Jul 2026 03:17AM UTC coverage: 52.408% (+0.1%) from 52.278%
28693295402

push

github

hariharan-devarajan
feat: silence noisy warnings on aarch64

37318 of 92666 branches covered (40.27%)

Branch coverage included in aggregate %.

33462 of 42389 relevant lines covered (78.94%)

20557.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

62.2
/src/dftracer/utils/python/memoryview_batch.cpp
1
#define PY_SSIZE_T_CLEAN
2
#include <dftracer/utils/python/memoryview_batch.h>
3
#include <dftracer/utils/python/py_type_helpers.h>
4

5
#include <cstring>
6

7
namespace dftracer::utils::python {
8

9
static void MemoryViewBatch_dealloc(MemoryViewBatchObject *self) {
504✔
10
    delete self->data;
504✔
11
    Py_TYPE(self)->tp_free((PyObject *)self);
504✔
12
}
504✔
13

14
static int MemoryViewBatch_getbuffer(MemoryViewBatchObject *self,
2,302✔
15
                                     Py_buffer *view, int flags) {
16
    if (!self->data || self->data->buffer.empty()) {
2,302!
17
        PyErr_SetString(PyExc_BufferError, "MemoryViewBatch has no data");
×
18
        return -1;
×
19
    }
20
    return PyBuffer_FillInfo(view, (PyObject *)self, self->data->buffer.data(),
3,453✔
21
                             static_cast<Py_ssize_t>(self->data->buffer.size()),
2,302✔
22
                             1, flags);
2,302✔
23
}
1,151✔
24

25
static Py_ssize_t MemoryViewBatch_length(MemoryViewBatchObject *self) {
×
26
    if (!self->data) return 0;
×
27
    return static_cast<Py_ssize_t>(self->data->num_entries());
×
28
}
29

30
PyObject *MemoryViewBatch_item(MemoryViewBatchObject *self, Py_ssize_t i) {
2,302✔
31
    if (!self->data) {
2,302✔
32
        PyErr_SetString(PyExc_IndexError, "MemoryViewBatch has no data");
×
33
        return NULL;
×
34
    }
35
    Py_ssize_t n = static_cast<Py_ssize_t>(self->data->num_entries());
2,302✔
36
    if (i < 0 || i >= n) {
2,302!
37
        PyErr_SetString(PyExc_IndexError, "MemoryViewBatch index out of range");
×
38
        return NULL;
×
39
    }
40

41
    PyObject *full = PyMemoryView_FromObject((PyObject *)self);
2,302✔
42
    if (!full) return NULL;
2,302✔
43

44
    Py_ssize_t start = static_cast<Py_ssize_t>(self->data->offsets[i]);
2,302✔
45
    Py_ssize_t stop = start + static_cast<Py_ssize_t>(self->data->lengths[i]);
2,302✔
46
    PyObject *lo = PyLong_FromSsize_t(start);
2,302✔
47
    PyObject *hi = PyLong_FromSsize_t(stop);
2,302✔
48
    PyObject *slice = (lo && hi) ? PySlice_New(lo, hi, NULL) : NULL;
2,302!
49
    Py_XDECREF(lo);
2,302✔
50
    Py_XDECREF(hi);
2,302✔
51
    if (!slice) {
2,302✔
52
        Py_DECREF(full);
53
        return NULL;
×
54
    }
55
    PyObject *entry = PyObject_GetItem(full, slice);  // sub-view, shares buffer
2,302✔
56
    Py_DECREF(slice);
1,151✔
57
    Py_DECREF(full);
1,151✔
58
    return entry;
2,302✔
59
}
1,151✔
60

61
static PyBufferProcs MemoryViewBatch_as_buffer = {
62
    (getbufferproc)MemoryViewBatch_getbuffer,
63
    NULL,
64
};
65

66
static PySequenceMethods MemoryViewBatch_as_sequence = {
67
    (lenfunc)MemoryViewBatch_length,
68
    NULL,
69
    NULL,
70
    (ssizeargfunc)MemoryViewBatch_item,
71
};
72

73
static PyObject *MemoryViewBatch_get_num_entries(MemoryViewBatchObject *self,
×
74
                                                 void *) {
75
    if (!self->data) return PyLong_FromLong(0);
×
76
    return PyLong_FromSsize_t(
×
77
        static_cast<Py_ssize_t>(self->data->num_entries()));
×
78
}
79

80
static PyObject *MemoryViewBatch_get_num_bytes(MemoryViewBatchObject *self,
×
81
                                               void *) {
82
    if (!self->data) return PyLong_FromLong(0);
×
83
    return PyLong_FromSsize_t(
×
84
        static_cast<Py_ssize_t>(self->data->buffer.size()));
×
85
}
86

87
static PyGetSetDef MemoryViewBatch_getsetters[] = {
88
    {"num_entries", (getter)MemoryViewBatch_get_num_entries, NULL,
89
     "Number of entries", NULL},
90
    {"num_bytes", (getter)MemoryViewBatch_get_num_bytes, NULL,
91
     "Total buffer size in bytes", NULL},
92
    {NULL}};
93

94
PyTypeObject MemoryViewBatchType = {
95
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0).tp_name =
96
        "dftracer_utils_ext._MemoryViewBatch",
97
    .tp_basicsize = sizeof(MemoryViewBatchObject),
98
    .tp_itemsize = 0,
99
    .tp_dealloc = (destructor)MemoryViewBatch_dealloc,
100
    .tp_as_sequence = &MemoryViewBatch_as_sequence,
101
    .tp_as_buffer = &MemoryViewBatch_as_buffer,
102
    .tp_flags = Py_TPFLAGS_DEFAULT,
103
    .tp_doc = "Zero-copy batch of byte entries backed by a contiguous buffer",
104
    .tp_getset = MemoryViewBatch_getsetters,
105
};
106

107
int init_memoryview_batch(PyObject *m) {
2✔
108
    if (register_type(m, &MemoryViewBatchType, "_MemoryViewBatch") < 0)
2✔
109
        return -1;
×
110
    return 0;
2✔
111
}
1✔
112

113
}  // namespace dftracer::utils::python
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc