[Zope-Checkins] CVS: Zope/lib/python/DocumentTemplate - DT_If.py:1.17 DT_Var.py:1.45 cDocumentTemplate.c:1.40

Matthew T. Kromer matt@zope.com
Fri, 26 Oct 2001 12:07:51 -0400


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

Modified Files:
	DT_If.py DT_Var.py cDocumentTemplate.c 
Log Message:
Document Template accelerations and additonal C Security Manager accelerations
from cAccessControl-review-branch.


=== Zope/lib/python/DocumentTemplate/DT_If.py 1.16 => 1.17 ===
         if elses is not None: sections.append(elses)
 
-        self.simple_form=tuple(sections)
+        self.simple_form=('i',)+tuple(sections)
 
 class Unless:
     name='unless'
@@ -204,7 +204,7 @@
         name,expr=name_param(args,'unless',1)
         if expr is None: cond=name
         else: cond=expr.eval
-        self.simple_form=(cond,None,section.blocks)
+        self.simple_form=('i',cond,None,section.blocks)
 
 class Else(Unless):
     # The else tag is included for backward compatibility and is deprecated.


=== Zope/lib/python/DocumentTemplate/DT_Var.py 1.44 => 1.45 ===
             if expr is None: expr=name
             else: expr=expr.eval
-            self.simple_form=expr,
+            self.simple_form=('v', expr)
+        elif len(args)==2  and fmt=='s' and args.has_key('html_quote'):
+            if expr is None: expr=name
+            else: expr=expr.eval
+            self.simple_form=('v', expr, 'h')
 
     def render(self, md):
         args=self.args
@@ -353,7 +357,7 @@
         name, expr = name_param(args,'call',1)
         if expr is None: expr=name
         else: expr=expr.eval
-        self.simple_form=expr,None
+        self.simple_form=('i', expr, None)
 
 
 def url_quote(v, name='(Unknown name)', md={}):


=== Zope/lib/python/DocumentTemplate/cDocumentTemplate.c 1.39 => 1.40 ===
 static PyObject *py_Unauthorized_fmt, *py_guarded_getattr;
 static PyObject *py__push, *py__pop, *py_aq_base, *py_renderNS;
-static PyObject *py___class__;
+static PyObject *py___class__, *html_quote;
 
 /* ----------------------------------------------------- */
 
@@ -398,13 +398,29 @@
 MM_cget(MM *self, PyObject *key, int call)
 {
   long i;
-  PyObject *e, *rr, *tb;
+  PyObject *e, *rr;
 
   UNLESS(-1 != (i=PyList_Size(self->data))) return NULL;
   while (--i >= 0)
     {
-      e=PyList_GetItem(self->data,i);
-      if ((e=PyObject_GetItem(e,key)))
+      e=PyList_GET_ITEM(self->data,i);
+      if (PyDict_Check(e))
+        {
+          e=PyDict_GetItem(e, key);
+          Py_XINCREF(e);
+        }
+      else
+        {
+          UNLESS (e=PyObject_GetItem(e,key)) 
+            {
+              if (PyErr_Occurred() == PyExc_KeyError)
+                PyErr_Clear();
+              else
+                return NULL;
+            }
+        }
+
+      if (e)
 	{
           if (!call) return e;
 
@@ -437,17 +453,8 @@
             }
 	  return e;
 	}
-      PyErr_Fetch(&e, &rr, &tb);
-      if (e != PyExc_KeyError)
-	{
-	  PyErr_Restore(e,rr,tb);
-	  return NULL;
-	}
-      Py_XDECREF(e);
-      Py_XDECREF(rr);
-      Py_XDECREF(tb);
     }
-  PyErr_SetObject(PyExc_KeyError,key);
+  PyErr_SetObject(PyExc_KeyError, key);
   return NULL;
 }
 
@@ -726,7 +733,7 @@
 render_blocks_(PyObject *blocks, PyObject *rendered,
 	       PyObject *md, PyObject *mda)
 {
-  PyObject *block;
+  PyObject *block, *t;
   int l, i, k=0, append;
 
   if ((l=PyList_Size(blocks)) < 0) return -1;
@@ -735,95 +742,123 @@
       block=PyList_GET_ITEM(((PyListObject*)blocks), i);
       append=1;
 
-      if (PyTuple_Check(block))
+      if (PyTuple_Check(block) 
+          && PyTuple_GET_SIZE(block) > 1 
+          && PyTuple_GET_ITEM(block, 0)
+          && PyString_Check(PyTuple_GET_ITEM(block, 0)))
 	{
-	  int bs;
+          switch (PyString_AS_STRING(PyTuple_GET_ITEM(block, 0))[0])
+            {
+            case 'v': /* var  */
+	      t=PyTuple_GET_ITEM(block,1);
 
-	  bs=((PyTupleObject*)block)->ob_size;
-	  
-	  if (bs==1)
-	    {
-	      /* Simple var */
-	      block=PyTuple_GET_ITEM(block,0);
-	      if (PyString_Check(block)) block=PyObject_GetItem(md,block);
-	      else block=PyObject_CallObject(block,mda);
-	      if (block) ASSIGN(block, PyObject_Str(block));
-	      UNLESS(block) return -1;
-	    }
-	  else
-	    {
-	      /* if */
-	      int icond, m;
-	      PyObject *cond, *n, *cache;
-
-	      UNLESS(cache=PyDict_New()) return -1;
-	      cond=PyObject_GetAttr(md,py__push);
-	      if (cond) ASSIGN(cond, PyObject_CallFunction(cond,"O",cache));
-	      Py_DECREF(cache);
-	      if (cond) Py_DECREF(cond);
-	      else return -1;
+	      if (t == NULL) return -1;
+
+	      if (PyString_Check(t)) t=PyObject_GetItem(md, t);
+	      else t=PyObject_CallObject(t, mda);
+
+              if (t == NULL || (! PyString_Check(t)))
+                {
+                  if (t) ASSIGN(t, PyObject_Str(t));
+                  UNLESS(t) return -1;
+                }
+
+              if (PyString_Check(t) 
+                  && PyTuple_GET_SIZE(block) == 3) /* html_quote */
+                {
+                  if (strchr(PyString_AS_STRING(t), '&')
+                      && strchr(PyString_AS_STRING(t), '<')
+                      && strchr(PyString_AS_STRING(t), '>')
+                      && strchr(PyString_AS_STRING(t), '"')
+                      )
+                    ASSIGN(t, PyObject_CallFunction(html_quote, "O", t));
+		    if (t == NULL) return -1;
+                }
+                  
+              block = t;
+              break;
+            case 'i': /* if */
+              {
+                int icond, m, bs;
+                PyObject *cond, *n, *cache;
+
+                bs = PyTuple_GET_SIZE(block) - 1; /* subtract code */
+
+                UNLESS(cache=PyDict_New()) return -1;
+                cond=PyObject_GetAttr(md,py__push);
+                if (cond) ASSIGN(cond, PyObject_CallFunction(cond,"O",cache));
+                Py_DECREF(cache);
+                if (cond) Py_DECREF(cond);
+                else return -1;
 	      
-	      append=0;
-	      m=bs-1;
-	      for (icond=0; icond < m; icond += 2)
-		{
-		  cond=PyTuple_GET_ITEM(block,icond);
-		  if (PyString_Check(cond))
-		    {
-		      /* We have to be careful to handle key errors here */
-		      n=cond;
-		      if ((cond=PyObject_GetItem(md,cond)))
-			{
-			  if (PyDict_SetItem(cache, n, cond) < 0)
-			    {
-			      Py_DECREF(cond);
-			      return if_finally(md,1);
-			    }
-			}
-		      else
-			{
-			  PyObject *t, *v, *tb;
-
-			  PyErr_Fetch(&t, &v, &tb);
-			  if (t != PyExc_KeyError || PyObject_Compare(v,n))
-			    {
-			      PyErr_Restore(t,v,tb);
-			      return if_finally(md,1);
-			    }
-			  Py_XDECREF(t);
-			  Py_XDECREF(v);
-			  Py_XDECREF(tb);
-			  cond=Py_None;
-			  Py_INCREF(cond);
-			}
-		    }
-		  else
-		    UNLESS(cond=PyObject_CallObject(cond,mda))
-		       return if_finally(md,1);
-
-		  if (PyObject_IsTrue(cond))
-		    {
-		      Py_DECREF(cond);
-		      block=PyTuple_GET_ITEM(block,icond+1);
-		      if (block!=Py_None &&
-			 render_blocks_(block, rendered, md, mda) < 0)
-			return if_finally(md,1);
-		      m=-1;
-		      break;
-		    }
-		  else Py_DECREF(cond);
-		}
+                append=0;
+                m=bs-1;
+                for (icond=0; icond < m; icond += 2)
+                  {
+                    cond=PyTuple_GET_ITEM(block,icond+1);
+                    if (PyString_Check(cond))
+                      {
+                        /* We have to be careful to handle key errors here */
+                        n=cond;
+                        if ((cond=PyObject_GetItem(md,cond)))
+                          {
+                            if (PyDict_SetItem(cache, n, cond) < 0)
+                              {
+                                Py_DECREF(cond);
+                                return if_finally(md,1);
+                              }
+                          }
+                        else
+                          {
+                            PyObject *t, *v, *tb;
+                            
+                            PyErr_Fetch(&t, &v, &tb);
+                            if (t != PyExc_KeyError || PyObject_Compare(v,n))
+                              {
+                                PyErr_Restore(t,v,tb);
+                                return if_finally(md,1);
+                              }
+                            Py_XDECREF(t);
+                            Py_XDECREF(v);
+                            Py_XDECREF(tb);
+                            cond=Py_None;
+                            Py_INCREF(cond);
+                          }
+                      }
+                    else
+                      UNLESS(cond=PyObject_CallObject(cond,mda))
+                        return if_finally(md,1);
+                    
+                    if (PyObject_IsTrue(cond))
+                      {
+                        Py_DECREF(cond);
+                        block=PyTuple_GET_ITEM(block,icond+1+1);
+                        if (block!=Py_None &&
+                            render_blocks_(block, rendered, md, mda) < 0)
+                          return if_finally(md,1);
+                        m=-1;
+                        break;
+                      }
+                    else Py_DECREF(cond);
+                  }
 		if (icond==m)
 		  {
-		    block=PyTuple_GET_ITEM(block,icond);
+		    block=PyTuple_GET_ITEM(block,icond+1);
 		    if (block!=Py_None &&
-		       render_blocks_(block, rendered, md, mda) < 0)
+                        render_blocks_(block, rendered, md, mda) < 0)
 		      return if_finally(md,1);
 		  }
-
+                
 		if (if_finally(md,0) == -2) return -1;
-	    }
-	}
+              }
+              break;
+            default:
+              PyErr_Format(PyExc_ValueError,
+                           "Invalid DTML command code, %s",
+                           PyString_AS_STRING(PyTuple_GET_ITEM(block, 0)));
+              return -1;
+            }
+        }
       else if (PyString_Check(block))
 	{
 	  Py_INCREF(block);
@@ -908,6 +943,10 @@
 
   DictInstanceType.ob_type=&PyType_Type;
 
+  UNLESS (html_quote = PyImport_ImportModule("html_quote")) return;
+  ASSIGN(html_quote, PyObject_GetAttrString(html_quote, "html_quote"));
+  UNLESS (html_quote) return;
+
   UNLESS(py_isDocTemp=PyString_FromString("isDocTemp")) return;
   UNLESS(py_renderNS=PyString_FromString("__render_with_namespace__")) return;
   UNLESS(py_blocks=PyString_FromString("blocks")) return;
@@ -946,6 +985,4 @@
   PyDict_SetItemString(d, "__version__",
 		       PyString_FromStringAndSize(rev+11,strlen(rev+11)-2));
 
-  if (PyErr_Occurred())
-    Py_FatalError("can't initialize module cDocumentTemplate");
 }