[Zope-Checkins] CVS: Zope/lib/python/AccessControl - cAccessControl.c:1.10.12.4
Shane Hathaway
shane@digicool.com
Wed, 17 Oct 2001 16:58:17 -0400
Update of /cvs-repository/Zope/lib/python/AccessControl
In directory cvs.zope.org:/tmp/cvs-serv9863
Modified Files:
Tag: cAccessControl-review-branch
cAccessControl.c
Log Message:
Optimized frequent PyObject_CallFunction(), PyObject_CallMethod(), and
Py_BuildValue() calls.
=== Zope/lib/python/AccessControl/cAccessControl.c 1.10.12.3 => 1.10.12.4 ===
#define OBJECT(o) ((PyObject *) (o))
+static PyObject *
+callmethod1(PyObject *self, PyObject *name, PyObject *arg)
+{
+ UNLESS(self = PyObject_GetAttr(self,name)) return NULL;
+ name = PyTuple_New(1);
+ if (name == NULL) {
+ Py_DECREF(self);
+ return NULL;
+ }
+ Py_INCREF(arg);
+ PyTuple_SET_ITEM(name, 0, arg);
+ ASSIGN(self, PyObject_CallObject(self, name));
+ Py_DECREF(name);
+ return self;
+}
+
+static PyObject *
+callfunction2(PyObject *function, PyObject *arg0, PyObject *arg1)
+{
+ PyObject *t, *r;
+ t = PyTuple_New(2);
+ if (t == NULL)
+ return NULL;
+ Py_INCREF(arg0);
+ Py_INCREF(arg1);
+ PyTuple_SET_ITEM(t, 0, arg0);
+ PyTuple_SET_ITEM(t, 1, arg1);
+ r = PyObject_CallObject(function, t);
+ Py_DECREF(t);
+ return r;
+}
+
+
/*
** Structures
*/
@@ -109,6 +142,8 @@
static void imPermissionRole_dealloc(imPermissionRole *self);
static PyObject *rolesForPermissionOn(PyObject *self, PyObject *args);
+static PyObject *c_rolesForPermissionOn(PyObject *self, PyObject *perm,
+ PyObject *object, PyObject *deflt);
static PyObject *permissionName(PyObject *name);
@@ -313,6 +348,7 @@
static PyObject *imPermissionRoleObj = NULL;
static PyObject *defaultPermission = NULL;
static PyObject *__roles__ = NULL;
+static PyObject *__of__ = NULL;
static PyObject *__allow_access_to_unprotected_subobjects__ = NULL;
static PyObject *stack_str = NULL;
static PyObject *user_str = NULL;
@@ -341,6 +377,7 @@
UNLESS (defaultPermission = Py_BuildValue("(s)", "Manager")) return -1;
UNLESS (_what_not_even_god_should_do = Py_BuildValue("[]")) return -1;
UNLESS (__roles__ = PyString_FromString("__roles__")) return -1;
+ UNLESS (__of__ = PyString_FromString("__of__")) return -1;
UNLESS (Anonymous = PyString_FromString("Anonymous")) return -1;
UNLESS (stack_str = PyString_FromString("stack")) return -1;
UNLESS (user_str = PyString_FromString("user")) return -1;
@@ -521,8 +558,8 @@
*/
/** XXX do we need to incref this stuff? I dont think so */
- p = PyObject_CallFunction(Containers, "OO",
- container->ob_type, Py_None);
+ p = callfunction2(Containers, OBJECT(container->ob_type),
+ Py_None);
if (p == NULL)
goto err;
@@ -549,10 +586,9 @@
if (p == NULL)
PyErr_Clear();
} else {
- ASSIGN(p, PyObject_CallFunction(p,
- "OO", name, value));
- if (p == NULL)
- goto err;
+ ASSIGN(p, callfunction2(p, name, value));
+ if (p == NULL)
+ goto err;
}
}
}
@@ -675,9 +711,8 @@
if (owner != Py_None) {
owner = PyObject_GetAttr(owner, allowed_str);
- if (owner) ASSIGN(owner,
- PyObject_CallFunction(owner, "OO",
- value, roles));
+ if (owner)
+ ASSIGN(owner, callfunction2(owner, value, roles));
if (owner == NULL)
{
Py_DECREF(eo);
@@ -770,7 +805,7 @@
}
else
{
- ASSIGN(user, PyObject_CallFunction(user, "OO", value, roles));
+ ASSIGN(user, callfunction2(user, value, roles));
if (user == NULL) goto err;
if (PyObject_IsTrue(user))
{
@@ -819,7 +854,6 @@
PyObject *roles;
PyObject *result = NULL;
PyObject *user;
- PyObject *arg;
/*| def checkPermission(self, permission, object, context)
*/
@@ -830,12 +864,7 @@
/*| roles = rolesForPermissionOn(permission, object)
*/
- arg = Py_BuildValue("OO", permission, object);
- if (arg == NULL)
- return NULL;
- roles = rolesForPermissionOn(self, arg);
- Py_DECREF(arg);
-
+ roles = c_rolesForPermissionOn(self, permission, object, OBJECT(NULL));
if (roles == NULL)
return NULL;
@@ -844,20 +873,28 @@
*/
if (PyString_Check(roles)) {
- PyObject *r;
- r = Py_BuildValue("[O]", roles);
- Py_DECREF(roles);
- roles = r;
+ PyObject *r;
+
+ r = PyList_New(1);
+ if (r == NULL) {
+ Py_DECREF(roles);
+ return NULL;
+ }
+ /* Note: ref to roles is passed to the list object. */
+ PyList_SET_ITEM(r, 0, roles);
+ roles = r;
}
/*| return context.user.allowed(object, roles)
*/
- user = PyObject_GetAttrString(context, "user");
+ user = PyObject_GetAttr(context, user_str);
if (user != NULL) {
- result = PyObject_CallMethod(user,"allowed", "OO", object, roles);
-
- Py_DECREF(user);
+ ASSIGN(user, PyObject_GetAttr(user, allowed_str));
+ if (user != NULL) {
+ result = callfunction2(user, object, roles);
+ Py_DECREF(user);
+ }
}
Py_DECREF(roles);
@@ -961,7 +998,7 @@
if (aq_isWrapper(parent)) {
_p = aq_inner(parent);
- result = PyObject_CallMethod(OBJECT(r),"__of__","O", _p);
+ result = callmethod1(OBJECT(r), __of__, _p);
Py_DECREF(_p);
/* Dont need goto */
} else {
@@ -1211,8 +1248,7 @@
PyErr_SetString(PyExc_AttributeError, "_pa");
return -1;
}
- v = PyObject_CallMethod(OBJECT(self), "__of__",
- "O", pa);
+ v = callmethod1(OBJECT(self), __of__, pa);
if (v == NULL)
return -1;
self->_v = v;
@@ -1252,8 +1288,7 @@
PyErr_SetString(PyExc_AttributeError, "_pa");
return NULL;
}
- v = PyObject_CallMethod(OBJECT(self), "__of__",
- "O", pa);
+ v = callmethod1(OBJECT(self), __of__, pa);
if (v == NULL)
return NULL;
self->_v = v;
@@ -1293,23 +1328,31 @@
PyObject *perm = NULL;
PyObject *object = NULL;
PyObject *deflt = NULL;
- imPermissionRole *im = NULL;
- PyObject *result;
/*|def rolesForPermissionOn(perm, object, default=('Manager',)):
**|
**| """Return the roles that have the permisson on the given object"""
- **|
- **| im = imPermissionRole()
+ */
+
+ if (!PyArg_ParseTuple(args, "OO|O", &perm, &object, &deflt))
+ return NULL;
+ return c_rolesForPermissionOn(self, perm, object, deflt);
+}
+
+
+static PyObject *
+c_rolesForPermissionOn(PyObject *self, PyObject *perm, PyObject *object,
+ PyObject *deflt) {
+ imPermissionRole *im = NULL;
+ PyObject *result;
+
+ /*| im = imPermissionRole()
**|
**| im._p="_"+string.translate(perm, name_trans)+"_Permission"
**| im._d = default
**| return im.__of__(object)
*/
- if (!PyArg_ParseTuple(args, "OO|O", &perm, &object, &deflt))
- return NULL;
-
im = (imPermissionRole*)PyObject_CallObject(imPermissionRoleObj, NULL);
if (im == NULL)
return NULL;
@@ -1324,11 +1367,12 @@
im->__roles__ = deflt;
Py_INCREF(deflt);
- result = PyObject_CallMethod(OBJECT(im), "__of__", "O", object);
+ result = callmethod1(OBJECT(im), __of__, object);
Py_DECREF(im);
return result;
}
+
/*
** permissionName