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

llnl / dftracer-utils / 28398085302

29 Jun 2026 07:43PM UTC coverage: 50.067% (-2.2%) from 52.278%
28398085302

Pull #83

github

web-flow
Merge 9a615085e into 2efed6649
Pull Request #83: refactor and improve code QoL

16342 of 44293 branches covered (36.9%)

Branch coverage included in aggregate %.

613 of 1132 new or added lines in 52 files covered. (54.15%)

687 existing lines in 116 files now uncovered.

21698 of 31685 relevant lines covered (68.48%)

12958.83 hits per line

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

51.95
/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) {
252✔
10
    delete self->data;
252!
11
    Py_TYPE(self)->tp_free((PyObject *)self);
252✔
12
}
252✔
13

14
static int MemoryViewBatch_getbuffer(MemoryViewBatchObject *self,
1,151✔
15
                                     Py_buffer *view, int flags) {
16
    if (!self->data || self->data->buffer.empty()) {
1,151!
17
        PyErr_SetString(PyExc_BufferError, "MemoryViewBatch has no data");
×
18
        return -1;
×
19
    }
20
    return PyBuffer_FillInfo(view, (PyObject *)self, self->data->buffer.data(),
1,151✔
21
                             static_cast<Py_ssize_t>(self->data->buffer.size()),
1,151✔
22
                             1, flags);
1,151✔
23
}
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) {
1,151✔
31
    if (!self->data) {
1,151!
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());
1,151✔
36
    if (i < 0 || i >= n) {
1,151!
37
        PyErr_SetString(PyExc_IndexError, "MemoryViewBatch index out of range");
×
38
        return NULL;
×
39
    }
40

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

44
    Py_ssize_t start = static_cast<Py_ssize_t>(self->data->offsets[i]);
1,151✔
45
    Py_ssize_t stop = start + static_cast<Py_ssize_t>(self->data->lengths[i]);
1,151✔
46
    PyObject *lo = PyLong_FromSsize_t(start);
1,151✔
47
    PyObject *hi = PyLong_FromSsize_t(stop);
1,151✔
48
    PyObject *slice = (lo && hi) ? PySlice_New(lo, hi, NULL) : NULL;
1,151!
49
    Py_XDECREF(lo);
1,151✔
50
    Py_XDECREF(hi);
1,151✔
51
    if (!slice) {
1,151!
52
        Py_DECREF(full);
53
        return NULL;
×
54
    }
55
    PyObject *entry = PyObject_GetItem(full, slice);  // sub-view, shares buffer
1,151✔
56
    Py_DECREF(slice);
57
    Py_DECREF(full);
58
    return entry;
1,151✔
59
}
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) {
1✔
108
    if (register_type(m, &MemoryViewBatchType, "_MemoryViewBatch") < 0)
1!
UNCOV
109
        return -1;
×
110
    return 0;
1✔
111
}
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