[Zope-Checkins] CVS: Zope/lib/python/Products/PageTemplates - Expressions.py:1.40 PageTemplate.py:1.29 PythonExpr.py:1.10 TALES.py:1.33

Florent Guillaume fg@nuxeo.com
Thu, 19 Sep 2002 10:39:25 -0400


Update of /cvs-repository/Zope/lib/python/Products/PageTemplates
In directory cvs.zope.org:/tmp/cvs-serv12623/lib/python/Products/PageTemplates

Modified Files:
	Expressions.py PageTemplate.py PythonExpr.py TALES.py 
Log Message:
Merged Fred's latest TAL/ZPT optimizations from Zope27 into HEAD.
The merge point in Zope27 will be tagged mergepoint-to-Zope26.


=== Zope/lib/python/Products/PageTemplates/Expressions.py 1.39 => 1.40 ===
--- Zope/lib/python/Products/PageTemplates/Expressions.py:1.39	Wed Sep 18 11:49:00 2002
+++ Zope/lib/python/Products/PageTemplates/Expressions.py	Thu Sep 19 10:39:24 2002
@@ -46,6 +46,8 @@
 
 if sys.modules.has_key('Zope'):
     import AccessControl
+    import AccessControl.cAccessControl
+    acquisition_security_filter = AccessControl.cAccessControl.aq_validate
     from AccessControl import getSecurityManager
     from AccessControl.ZopeGuards import guarded_getattr
     try:
@@ -65,6 +67,12 @@
         from zExceptions import Unauthorized
     except ImportError:
         Unauthorized = "Unauthorized"
+
+    def acquisition_security_filter(orig, inst, name, v, real_validate):
+        if real_validate(orig, inst, name, v):
+            return 1
+        raise Unauthorized, name
+
     def call_with_ns(f, ns, arg=1):
         if arg==2:
             return f(None, ns)
@@ -279,28 +287,27 @@
         return 'defer:%s' % `self._s`
 
 
-def restrictedTraverse(self, path, securityManager,
+def restrictedTraverse(object, path, securityManager,
                        get=getattr, has=hasattr, N=None, M=[],
                        TupleType=type(()) ):
 
-    REQUEST = {'path': path}
-    REQUEST['TraversalRequestNameStack'] = path = path[:] # Copy!
     if not path[0]:
         # If the path starts with an empty string, go to the root first.
-        self = self.getPhysicalRoot()
-        if not securityManager.validateValue(self):
+        object = object.getPhysicalRoot()
+        if not securityManager.validateValue(object):
             raise Unauthorized, name
         path.pop(0)
 
+    REQUEST = {'path': path}
+    REQUEST['TraversalRequestNameStack'] = path = path[:] # Copy!
     path.reverse()
     validate = securityManager.validate
-    object = self
+    __traceback_info__ = REQUEST
     while path:
-        __traceback_info__ = REQUEST
         name = path.pop()
 
         if isinstance(name, TupleType):
-            object = apply(object, name)
+            object = object(*name)
             continue
 
         if name[0] == '_':
@@ -363,9 +370,3 @@
         object = o
 
     return object
-
-
-def validate2(orig, inst, name, v, real_validate):
-    if not real_validate(orig, inst, name, v):
-        raise Unauthorized, name
-    return 1


=== Zope/lib/python/Products/PageTemplates/PageTemplate.py 1.28 => 1.29 ===
--- Zope/lib/python/Products/PageTemplates/PageTemplate.py:1.28	Wed Sep 18 11:12:46 2002
+++ Zope/lib/python/Products/PageTemplates/PageTemplate.py	Thu Sep 19 10:39:24 2002
@@ -22,10 +22,9 @@
 from TAL.TALParser import TALParser
 from TAL.HTMLTALParser import HTMLTALParser
 from TAL.TALGenerator import TALGenerator
-from TAL.TALInterpreter import TALInterpreter
-from Expressions import getEngine
 # Do not use cStringIO here!  It's not unicode aware. :(
-from StringIO import StringIO
+from TAL.TALInterpreter import TALInterpreter, FasterStringIO
+from Expressions import getEngine
 from ExtensionClass import Base
 from ComputedAttribute import ComputedAttribute
 
@@ -47,7 +46,7 @@
     def StringIO(self):
         # Third-party products wishing to provide a full Unicode-aware
         # StringIO can do so by monkey-patching this method.
-        return StringIO()
+        return FasterStringIO()
 
     def macros(self):
         return self.pt_macros()


=== Zope/lib/python/Products/PageTemplates/PythonExpr.py 1.9 => 1.10 ===
--- Zope/lib/python/Products/PageTemplates/PythonExpr.py:1.9	Wed Sep 18 11:12:46 2002
+++ Zope/lib/python/Products/PageTemplates/PythonExpr.py	Thu Sep 19 10:39:24 2002
@@ -43,18 +43,19 @@
             if vname[0] not in '$_':
                 vnames.append(vname)
 
-    def _bind_used_names(self, econtext):
+    def _bind_used_names(self, econtext, _marker=[]):
         # Bind template variables
         names = {}
         vars = econtext.vars
         getType = econtext._engine.getTypes().get
         for vname in self._f_varnames:
-            has, val = vars.has_get(vname)
-            if not has:
+            val = vars.get(vname, _marker)
+            if val is _marker:
                 has = val = getType(vname)
                 if has:
                     val = ExprTypeProxy(vname, val, econtext)
-            if has:
+                    names[vname] = val
+            else:
                 names[vname] = val
         return names
 


=== Zope/lib/python/Products/PageTemplates/TALES.py 1.32 => 1.33 ===
--- Zope/lib/python/Products/PageTemplates/TALES.py:1.32	Wed Sep 18 11:12:46 2002
+++ Zope/lib/python/Products/PageTemplates/TALES.py	Thu Sep 19 10:39:24 2002
@@ -44,8 +44,6 @@
     '''Retain Default'''
 Default = Default()
 
-_marker = []
-
 class SafeMapping(MultiMapping):
     '''Mapping with security declarations and limited method exposure.
 
@@ -60,9 +58,6 @@
     _push = MultiMapping.push
     _pop = MultiMapping.pop
 
-    def has_get(self, key, _marker=[]):
-        v = self.get(key, _marker)
-        return v is not _marker, v
 
 class Iterator(ZTUtils.Iterator):
     def __init__(self, name, seq, context):
@@ -216,8 +211,7 @@
             expression = self._engine.compile(expression)
         __traceback_supplement__ = (
             TALESTracebackSupplement, self, expression)
-        v = expression(self)
-        return v
+        return expression(self)
 
     evaluateValue = evaluate
 
@@ -257,7 +251,6 @@
             domain, msgid, mapping=mapping,
             context=context, target_language=target_language)
 
-
 class TALESTracebackSupplement:
     """Implementation of ITracebackSupplement"""
     def __init__(self, context, expression):
@@ -276,8 +269,6 @@
         else:
             from cgi import escape
             return '<b>Names:</b><pre>%s</pre>' % (escape(s))
-        return None
-
 
 
 class SimpleExpr:
@@ -289,4 +280,3 @@
         return self._name, self._expr
     def __repr__(self):
         return '<SimpleExpr %s %s>' % (self._name, `self._expr`)
-