Make MakePy<name> less error prone

Reviewers: ipaljak

Reviewed By: ipaljak

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D2696
This commit is contained in:
Teon Banek 2020-02-28 11:22:12 +01:00
parent eed83a210e
commit f5a94d6e29

View File

@ -34,7 +34,7 @@ struct PyVerticesIterator {
PyGraph *py_graph; PyGraph *py_graph;
}; };
PyObject *MakePyVertex(mgp_vertex *vertex, PyGraph *py_graph); PyObject *MakePyVertex(const mgp_vertex &vertex, PyGraph *py_graph);
void PyVerticesIteratorDealloc(PyVerticesIterator *self) { void PyVerticesIteratorDealloc(PyVerticesIterator *self) {
CHECK(self->it); CHECK(self->it);
@ -54,8 +54,7 @@ PyObject *PyVerticesIteratorGet(PyVerticesIterator *self,
CHECK(self->py_graph->graph); CHECK(self->py_graph->graph);
const auto *vertex = mgp_vertices_iterator_get(self->it); const auto *vertex = mgp_vertices_iterator_get(self->it);
if (!vertex) Py_RETURN_NONE; if (!vertex) Py_RETURN_NONE;
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory), return MakePyVertex(*vertex, self->py_graph);
self->py_graph);
} }
PyObject *PyVerticesIteratorNext(PyVerticesIterator *self, PyObject *PyVerticesIteratorNext(PyVerticesIterator *self,
@ -65,8 +64,7 @@ PyObject *PyVerticesIteratorNext(PyVerticesIterator *self,
CHECK(self->py_graph->graph); CHECK(self->py_graph->graph);
const auto *vertex = mgp_vertices_iterator_next(self->it); const auto *vertex = mgp_vertices_iterator_next(self->it);
if (!vertex) Py_RETURN_NONE; if (!vertex) Py_RETURN_NONE;
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory), return MakePyVertex(*vertex, self->py_graph);
self->py_graph);
} }
static PyMethodDef PyVerticesIteratorMethods[] = { static PyMethodDef PyVerticesIteratorMethods[] = {
@ -94,7 +92,7 @@ struct PyEdgesIterator {
PyGraph *py_graph; PyGraph *py_graph;
}; };
PyObject *MakePyEdge(mgp_edge *edge, PyGraph *py_graph); PyObject *MakePyEdge(const mgp_edge &edge, PyGraph *py_graph);
void PyEdgesIteratorDealloc(PyEdgesIterator *self) { void PyEdgesIteratorDealloc(PyEdgesIterator *self) {
CHECK(self->it); CHECK(self->it);
@ -114,8 +112,7 @@ PyObject *PyEdgesIteratorGet(PyEdgesIterator *self,
CHECK(self->py_graph->graph); CHECK(self->py_graph->graph);
const auto *edge = mgp_edges_iterator_get(self->it); const auto *edge = mgp_edges_iterator_get(self->it);
if (!edge) Py_RETURN_NONE; if (!edge) Py_RETURN_NONE;
return MakePyEdge(mgp_edge_copy(edge, self->py_graph->memory), return MakePyEdge(*edge, self->py_graph);
self->py_graph);
} }
PyObject *PyEdgesIteratorNext(PyEdgesIterator *self, PyObject *PyEdgesIteratorNext(PyEdgesIterator *self,
@ -125,8 +122,7 @@ PyObject *PyEdgesIteratorNext(PyEdgesIterator *self,
CHECK(self->py_graph->graph); CHECK(self->py_graph->graph);
const auto *edge = mgp_edges_iterator_next(self->it); const auto *edge = mgp_edges_iterator_next(self->it);
if (!edge) Py_RETURN_NONE; if (!edge) Py_RETURN_NONE;
return MakePyEdge(mgp_edge_copy(edge, self->py_graph->memory), return MakePyEdge(*edge, self->py_graph);
self->py_graph);
} }
static PyMethodDef PyEdgesIteratorMethods[] = { static PyMethodDef PyEdgesIteratorMethods[] = {
@ -165,7 +161,7 @@ PyObject *PyGraphGetVertexById(PyGraph *self, PyObject *args) {
"Unable to find the vertex with given ID."); "Unable to find the vertex with given ID.");
return nullptr; return nullptr;
} }
return MakePyVertex(mgp_vertex_copy(vertex, self->memory), self); return MakePyVertex(*vertex, self);
} }
PyObject *PyGraphIterVertices(PyGraph *self, PyObject *Py_UNUSED(ignored)) { PyObject *PyGraphIterVertices(PyGraph *self, PyObject *Py_UNUSED(ignored)) {
@ -212,6 +208,7 @@ static PyTypeObject PyGraphType = {
}; };
PyObject *MakePyGraph(const mgp_graph *graph, mgp_memory *memory) { PyObject *MakePyGraph(const mgp_graph *graph, mgp_memory *memory) {
CHECK(!graph || (graph && memory));
auto *py_graph = PyObject_New(PyGraph, &PyGraphType); auto *py_graph = PyObject_New(PyGraph, &PyGraphType);
if (!py_graph) return nullptr; if (!py_graph) return nullptr;
py_graph->graph = graph; py_graph->graph = graph;
@ -234,6 +231,7 @@ static PyTypeObject PyCypherTypeType = {
}; };
PyObject *MakePyCypherType(const mgp_type *type) { PyObject *MakePyCypherType(const mgp_type *type) {
CHECK(type);
auto *py_type = PyObject_New(PyCypherType, &PyCypherTypeType); auto *py_type = PyObject_New(PyCypherType, &PyCypherTypeType);
if (!py_type) return nullptr; if (!py_type) return nullptr;
py_type->type = type; py_type->type = type;
@ -417,6 +415,7 @@ static PyTypeObject PyQueryModuleType = {
}; };
PyObject *MakePyQueryModule(mgp_module *module) { PyObject *MakePyQueryModule(mgp_module *module) {
CHECK(module);
auto *py_query_module = PyObject_New(PyQueryModule, &PyQueryModuleType); auto *py_query_module = PyObject_New(PyQueryModule, &PyQueryModuleType);
if (!py_query_module) return nullptr; if (!py_query_module) return nullptr;
py_query_module->module = module; py_query_module->module = module;
@ -541,8 +540,7 @@ PyObject *PyEdgeFromVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) {
CHECK(self->py_graph->graph); CHECK(self->py_graph->graph);
const auto *vertex = mgp_edge_get_from(self->edge); const auto *vertex = mgp_edge_get_from(self->edge);
CHECK(vertex); CHECK(vertex);
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory), return MakePyVertex(*vertex, self->py_graph);
self->py_graph);
} }
PyObject *PyEdgeToVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) { PyObject *PyEdgeToVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) {
@ -552,8 +550,7 @@ PyObject *PyEdgeToVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) {
CHECK(self->py_graph->graph); CHECK(self->py_graph->graph);
const auto *vertex = mgp_edge_get_to(self->edge); const auto *vertex = mgp_edge_get_to(self->edge);
CHECK(vertex); CHECK(vertex);
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory), return MakePyVertex(*vertex, self->py_graph);
self->py_graph);
} }
void PyEdgeDealloc(PyEdge *self) { void PyEdgeDealloc(PyEdge *self) {
@ -598,17 +595,22 @@ static PyTypeObject PyEdgeType = {
/// Create an instance of `_mgp.Edge` class. /// Create an instance of `_mgp.Edge` class.
/// ///
/// The ownership of the edge is given to the created instance and will be
/// destroyed once the instance itself is destroyed, taking care that the
/// execution context is still valid.
///
/// The created instance references an existing `_mgp.Graph` instance, which /// The created instance references an existing `_mgp.Graph` instance, which
/// marks the execution context. /// marks the execution context.
PyObject *MakePyEdge(mgp_edge *edge, PyGraph *py_graph) { PyObject *MakePyEdge(const mgp_edge &edge, PyGraph *py_graph) {
CHECK(edge->GetMemoryResource() == py_graph->memory->impl); CHECK(py_graph);
CHECK(py_graph->graph && py_graph->memory);
auto *edge_copy = mgp_edge_copy(&edge, py_graph->memory);
if (!edge_copy) {
PyErr_SetString(PyExc_MemoryError, "Unable to allocate mgp_edge.");
return nullptr;
}
auto *py_edge = PyObject_New(PyEdge, &PyEdgeType); auto *py_edge = PyObject_New(PyEdge, &PyEdgeType);
if (!py_edge) return nullptr; if (!py_edge) {
py_edge->edge = edge; mgp_edge_destroy(edge_copy);
return nullptr;
}
py_edge->edge = edge_copy;
py_edge->py_graph = py_graph; py_edge->py_graph = py_graph;
Py_INCREF(py_graph); Py_INCREF(py_graph);
return PyObject_Init(reinterpret_cast<PyObject *>(py_edge), &PyEdgeType); return PyObject_Init(reinterpret_cast<PyObject *>(py_edge), &PyEdgeType);
@ -764,11 +766,20 @@ static PyTypeObject PyVertexType = {
.tp_richcompare = PyVertexRichCompare, .tp_richcompare = PyVertexRichCompare,
}; };
PyObject *MakePyVertex(mgp_vertex *vertex, PyGraph *py_graph) { PyObject *MakePyVertex(const mgp_vertex &vertex, PyGraph *py_graph) {
CHECK(vertex->GetMemoryResource() == py_graph->memory->impl); CHECK(py_graph);
CHECK(py_graph->graph && py_graph->memory);
auto *vertex_copy = mgp_vertex_copy(&vertex, py_graph->memory);
if (!vertex_copy) {
PyErr_SetString(PyExc_MemoryError, "Unable to allocate mgp_vertex.");
return nullptr;
}
auto *py_vertex = PyObject_New(PyVertex, &PyVertexType); auto *py_vertex = PyObject_New(PyVertex, &PyVertexType);
if (!py_vertex) return nullptr; if (!py_vertex) {
py_vertex->vertex = vertex; mgp_vertex_destroy(vertex_copy);
return nullptr;
}
py_vertex->vertex = vertex_copy;
py_vertex->py_graph = py_graph; py_vertex->py_graph = py_graph;
Py_INCREF(py_graph); Py_INCREF(py_graph);
return PyObject_Init(reinterpret_cast<PyObject *>(py_vertex), &PyVertexType); return PyObject_Init(reinterpret_cast<PyObject *>(py_vertex), &PyVertexType);
@ -902,14 +913,8 @@ py::Object MgpValueToPyObject(const mgp_value &value, PyGraph *py_graph) {
case MGP_VALUE_TYPE_VERTEX: case MGP_VALUE_TYPE_VERTEX:
throw utils::NotYetImplemented("MgpValueToPyObject"); throw utils::NotYetImplemented("MgpValueToPyObject");
case MGP_VALUE_TYPE_EDGE: { case MGP_VALUE_TYPE_EDGE: {
// Copy the edge and pass the ownership to the created _mgp.Edge const auto *e = mgp_value_get_edge(&value);
// instance. return py::Object(reinterpret_cast<PyObject *>(MakePyEdge(*e, py_graph)));
auto *e = mgp_edge_copy(mgp_value_get_edge(&value), py_graph->memory);
if (!e) {
PyErr_NoMemory();
return py::Object();
}
return py::Object(reinterpret_cast<PyObject *>(MakePyEdge(e, py_graph)));
} }
case MGP_VALUE_TYPE_PATH: case MGP_VALUE_TYPE_PATH:
throw utils::NotYetImplemented("MgpValueToPyObject"); throw utils::NotYetImplemented("MgpValueToPyObject");