//------------------------------------------------------------------------------------- PyObject* FixedArray::__py_pop(PyObject* self, PyObject* args, PyObject* kwargs) { FixedArray* ary = static_cast<FixedArray*>(self); std::vector<PyObject*>& values = ary->getValues(); if (values.empty()) { PyErr_SetString(PyExc_IndexError, "FixedArray.pop: empty array"); return NULL; } PyObject* pyItem = PyTuple_GetItem(args, 0); int index = PyLong_AsLong(pyItem); if (index < 0) index += values.size(); if (uint32(index) >= values.size()) { PyErr_SetString(PyExc_IndexError, "FixedArray.pop: index out of range"); return NULL; } PyObject* pyValue = values[index]; PyObject* pyTuple = PyTuple_New(0); if (seq_ass_slice(self, index, index + 1, &*pyTuple) != 0) return NULL; Py_INCREF(pyValue); return pyValue; }
//------------------------------------------------------------------------------------- PyObject* FixedArray::__py_reduce_ex__(PyObject* self, PyObject* protocol) { FixedArray* arr = static_cast<FixedArray*>(self); PyObject* args = PyTuple_New(2); PyObject* unpickleMethod = script::Pickler::getUnpickleFunc("FixedArray"); PyTuple_SET_ITEM(args, 0, unpickleMethod); int len = arr->length(); PyObject* args1 = PyTuple_New(2); PyObject* pyList = PyList_New(len); if(len > 0) { std::vector<PyObject*>& values = arr->getValues(); for(int i=0; i<len; ++i) { Py_INCREF(values[i]); PyList_SET_ITEM(pyList, i, values[i]); } } PyTuple_SET_ITEM(args1, 0, PyLong_FromLongLong(arr->getDataType()->id())); PyTuple_SET_ITEM(args1, 1, pyList); PyTuple_SET_ITEM(args, 1, args1); if(unpickleMethod == NULL){ Py_DECREF(args); return NULL; } return args; }