[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