[Zope-Checkins] CVS: Zope/lib/python/AccessControl - ImplPython.py:1.1.2.1.2.1 cAccessControl.c:1.20.2.6.2.1

Jim Fulton jim at zope.com
Fri Jan 16 14:43:18 EST 2004


Update of /cvs-repository/Zope/lib/python/AccessControl
In directory cvs.zope.org:/tmp/cvs-serv30669/lib/python/AccessControl

Modified Files:
      Tag: caz_dict_list_redo
	ImplPython.py cAccessControl.c 
Log Message:
Changed the strategy for handling special list and dict methods.

See the doc string for SimpleObjectPolicies.

Changed guarded_getattr to use the new strategy.


=== Zope/lib/python/AccessControl/ImplPython.py 1.1.2.1 => 1.1.2.1.2.1 ===
--- Zope/lib/python/AccessControl/ImplPython.py:1.1.2.1	Thu Jan  8 18:33:43 2004
+++ Zope/lib/python/AccessControl/ImplPython.py	Fri Jan 16 14:43:16 2004
@@ -526,32 +526,22 @@
     if name[:1] != '_':
         # Try to get the attribute normally so that unusual
         # exceptions are caught early.
-        try: v = getattr(inst, name)
+        try:
+            v = getattr(inst, name)
         except AttributeError:
             if default is not _marker:
                 return default
             raise
 
         assertion = Containers(type(inst))
-        if isinstance(assertion, dict):
-            # We got a table that lets us reason about individual
-            # attrs
-            assertion = assertion.get(name)
-            if assertion:
-                # There's an entry, but it may be a function.
-                if callable(assertion):
-                    return assertion(inst, name)
-
-                # Nope, it's boolean
-                return v
-            raise Unauthorized, name
-
-        elif assertion:
-            # So the entry in the outer table is not a dict
-            # It's allowed to be a vetoing function:
+        if assertion:
             if callable(assertion):
-                assertion(name, v)
-            # No veto, so we can return
+                factory = assertion(name, v)
+                if callable(factory):
+                    return factory(inst, name)
+                assert factory == 1
+            else:
+                assert assertion == 1
             return v
 
         validate = SecurityManagement.getSecurityManager().validate


=== Zope/lib/python/AccessControl/cAccessControl.c 1.20.2.6 => 1.20.2.6.2.1 ===
--- Zope/lib/python/AccessControl/cAccessControl.c:1.20.2.6	Wed Jan 14 13:58:03 2004
+++ Zope/lib/python/AccessControl/cAccessControl.c	Fri Jan 16 14:43:16 2004
@@ -2114,73 +2114,37 @@
         }
 
       /*
-            assertion = Containers(type(inst))
-            if type(assertion) is DictType:
-                # We got a table that lets us reason about individual
-                # attrs
-                assertion = assertion.get(name)
-                if assertion:
-                    # There's an entry, but it may be a function.
-                    if callable(assertion):
-                        return assertion(inst, name)
-
-                    # Nope, it's boolean
-                    return v
-                raise Unauthorized, name
-            
-            elif assertion:
-                # So the entry in the outer table is not a dict 
-                # It's allowed to be a vetoing function:
-                if callable(assertion):
-                    assertion(name, v)
-                # No veto, so we can return
-                return v
+
+        assertion = Containers(type(inst))
+        if assertion:
+            if callable(assertion):
+                factory = assertion(name, v)
+                if callable(factory):
+                    return factory(inst, name)
+                assert factory == 1
+            assert callable == 1
+            return v
+
       */
       t = PyDict_GetItem(ContainerAssertions, OBJECT(inst->ob_type));
       if (t != NULL)
         {
-          if (PyDict_Check(t))
+          if (PyCallable_Check(t))
             {
-              PyObject *attrv;
-              
-              attrv = PyDict_GetItem(t, name);
-              if (attrv != NULL)
-                {
-                  i=PyObject_IsTrue(attrv);
-                  if (i < 0) goto err;
-                  if (i) 
-                    {
-                      if (attrv->ob_type->tp_call)
-                        {
-                          Py_DECREF(v);
-                          v = callfunction2(attrv, inst, name);
-                          return v;
-                        }
-                      return v;
-                    }
-                }
-              Py_DECREF(v);
-              goto unauth;
-            }
-          
-          i = PyObject_IsTrue(t);
-          if (i < 0) goto err;
-          if (i)
-            {
-              if (t->ob_type->tp_call)
+              PyObject *factory;
+
+              factory = callfunction2(t, name, v);
+              if (factory == NULL) 
+                goto err;
+
+              if (PyCallable_Check(factory))
                 {
-                  PyObject *ignored;
-                  ignored = callfunction2(t, name, v);
-                  if (ignored == NULL)
-                    {
-                      /* veto */
-                      Py_DECREF(v);
-                      return NULL;
-                    }
-                  Py_DECREF(ignored);
+                  Py_DECREF(v);
+                  v = callfunction2(factory, inst, name);
                 }
-              return v;
+              Py_DECREF(factory);
             }
+          return v;
         }
 
       /*
@@ -2212,7 +2176,6 @@
       return NULL;
     }
 
- unauth:
   /* raise Unauthorized, name */
   PyErr_SetObject(Unauthorized, name);
   return NULL;




More information about the Zope-Checkins mailing list