extern "C" int PyTuple_SetItem(PyObject* op, Py_ssize_t i, PyObject* newitem) noexcept { RELEASE_ASSERT(PyTuple_Check(op), ""); BoxedTuple* t = static_cast<BoxedTuple*>(op); RELEASE_ASSERT(i >= 0 && i < t->size(), ""); t->elts[i] = newitem; return 0; }
extern "C" PyObject* PyTuple_GetSlice(PyObject* p, Py_ssize_t low, Py_ssize_t high) noexcept { RELEASE_ASSERT(isSubclass(p->cls, tuple_cls), ""); BoxedTuple* t = static_cast<BoxedTuple*>(p); Py_ssize_t n = t->size(); if (low < 0) low = 0; if (high > n) high = n; if (high < low) high = low; if (low == 0 && high == n) return p; return BoxedTuple::create(high - low, &t->elts[low]); }
int BoxedTuple::Resize(BoxedTuple** pv, size_t newsize) noexcept { assert((*pv)->cls == tuple_cls); BoxedTuple* t = static_cast<BoxedTuple*>(*pv); if (newsize == t->size()) return 0; if (newsize < t->size()) { // XXX resize the box (by reallocating) smaller if it makes sense t->ob_size = newsize; return 0; } BoxedTuple* resized = new (newsize) BoxedTuple(); memmove(resized->elts, t->elts, sizeof(Box*) * t->size()); *pv = resized; return 0; }
void BoxedTuple::gcHandler(GCVisitor* v, Box* b) { Box::gcHandler(v, b); BoxedTuple* t = (BoxedTuple*)b; v->visitRange((void* const*)&t->elts[0], (void* const*)&t->elts[t->size()]); }