Skip to content

Commit

Permalink
Rect.contains() optimization (#2570)
Browse files Browse the repository at this point in the history
* made Rect/Frect contains fastcall

* fix

* address review

* fixes
  • Loading branch information
itzpr3d4t0r authored Nov 18, 2023
1 parent 26be6b5 commit 4677afb
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 11 deletions.
4 changes: 2 additions & 2 deletions src_c/rect.c
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ static struct PyMethodDef pg_rect_methods[] = {
METH_VARARGS | METH_KEYWORDS, DOC_RECT_COLLIDEOBJECTSALL},
{"collideobjects", (PyCFunction)pg_rect_collideobjects,
METH_VARARGS | METH_KEYWORDS, DOC_RECT_COLLIDEOBJECTS},
{"contains", (PyCFunction)pg_rect_contains, METH_VARARGS,
{"contains", (PyCFunction)pg_rect_contains, METH_FASTCALL,
DOC_RECT_CONTAINS},
{"__reduce__", (PyCFunction)pg_rect_reduce, METH_NOARGS, NULL},
{"__copy__", (PyCFunction)pg_rect_copy, METH_NOARGS, NULL},
Expand Down Expand Up @@ -552,7 +552,7 @@ static struct PyMethodDef pg_frect_methods[] = {
METH_VARARGS | METH_KEYWORDS, DOC_RECT_COLLIDEOBJECTSALL},
{"collideobjects", (PyCFunction)pg_frect_collideobjects,
METH_VARARGS | METH_KEYWORDS, DOC_RECT_COLLIDEOBJECTS},
{"contains", (PyCFunction)pg_frect_contains, METH_VARARGS,
{"contains", (PyCFunction)pg_frect_contains, METH_FASTCALL,
DOC_RECT_CONTAINS},
{"__reduce__", (PyCFunction)pg_frect_reduce, METH_NOARGS, NULL},
{"__copy__", (PyCFunction)pg_frect_copy, METH_NOARGS, NULL},
Expand Down
21 changes: 12 additions & 9 deletions src_c/rect_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -500,9 +500,10 @@ RectExport_collidedictall(RectObject *self, PyObject *args, PyObject *kwargs);
static PyObject *
RectExport_clip(RectObject *self, PyObject *const *args, Py_ssize_t nargs);
static int
RectExport_contains_internal(RectObject *self, PyObject *arg);
RectExport_contains_internal(RectObject *self, PyObject *const *args,
Py_ssize_t nargs);
static PyObject *
RectExport_contains(RectObject *self, PyObject *arg);
RectExport_contains(RectObject *self, PyObject *const *args, Py_ssize_t nargs);
static int
RectExport_containsSeq(RectObject *self, PyObject *arg);
static PyObject *
Expand Down Expand Up @@ -1782,12 +1783,14 @@ RectExport_clipline(RectObject *self, PyObject *const *args, Py_ssize_t nargs)
}

static int
RectExport_contains_internal(RectObject *self, PyObject *arg)
RectExport_contains_internal(RectObject *self, PyObject *const *args,
Py_ssize_t nargs)
{
InnerRect *argrect, temp_arg;
if (!(argrect = RectFromObject((PyObject *)arg, &temp_arg))) {
if (!(argrect = RectFromFastcallArgs(args, nargs, &temp_arg))) {
return -1;
}

return (self->r.x <= argrect->x) && (self->r.y <= argrect->y) &&
(self->r.x + self->r.w >= argrect->x + argrect->w) &&
(self->r.y + self->r.h >= argrect->y + argrect->h) &&
Expand All @@ -1796,13 +1799,13 @@ RectExport_contains_internal(RectObject *self, PyObject *arg)
}

static PyObject *
RectExport_contains(RectObject *self, PyObject *arg)
RectExport_contains(RectObject *self, PyObject *const *args, Py_ssize_t nargs)
{
int ret = RectExport_contains_internal(self, arg);
if (ret < 0) {
int result = RectExport_contains_internal(self, args, nargs);
if (result == -1) {
return RAISE(PyExc_TypeError, "Argument must be rect style object");
}
return PyBool_FromLong(ret);
return PyBool_FromLong(result);
}

static int
Expand All @@ -1813,7 +1816,7 @@ RectExport_containsSeq(RectObject *self, PyObject *arg)
return coord == self->r.x || coord == self->r.y ||
coord == self->r.w || coord == self->r.h;
}
int ret = RectExport_contains_internal(self, arg);
int ret = RectExport_contains_internal(self, (PyObject *const *)&arg, 1);
if (ret < 0) {
PyErr_SetString(PyExc_TypeError, "'in <" ObjectName
">' requires rect style object"
Expand Down

0 comments on commit 4677afb

Please sign in to comment.