aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-11-22 21:15:36 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-11-22 21:15:36 +0000
commit8f21e61d2c5f2f7726ace7b585b882ab704df6ae (patch)
tree33323ff75ea644107b14eba81411f7c1cfb78861
parentaa84c7d54e782732f98a1a989137f8a27ea91801 (diff)
downloadexternal_python_mako-8f21e61d2c5f2f7726ace7b585b882ab704df6ae.tar.gz
external_python_mako-8f21e61d2c5f2f7726ace7b585b882ab704df6ae.tar.bz2
external_python_mako-8f21e61d2c5f2f7726ace7b585b882ab704df6ae.zip
speed adjustments...the cheetah test setting the bar pretty high....
-rw-r--r--examples/bench/basic.py2
-rw-r--r--lib/mako/codegen.py12
-rw-r--r--lib/mako/runtime.py13
3 files changed, 18 insertions, 9 deletions
diff --git a/examples/bench/basic.py b/examples/bench/basic.py
index 79f21b3..26ed9be 100644
--- a/examples/bench/basic.py
+++ b/examples/bench/basic.py
@@ -70,7 +70,7 @@ def mako(dirname, verbose=False):
def render():
return template.render(title="Just a test", user="joe", list_items=[u'Number %d' % num for num in range(1,15)])
if verbose:
- print render()
+ print template.code + render()
return render
def cheetah(dirname, verbose=False):
diff --git a/lib/mako/codegen.py b/lib/mako/codegen.py
index 1656a53..261553b 100644
--- a/lib/mako/codegen.py
+++ b/lib/mako/codegen.py
@@ -26,6 +26,7 @@ class Compiler(object):
printer.writeline("_magic_number = %s" % repr(MAGIC_NUMBER))
printer.writeline("_modified_time = %s" % repr(time.time()))
printer.writeline("_template_filename=%s" % repr(self.filename))
+ printer.writeline("UNDEFINED = runtime.UNDEFINED")
printer.write("\n\n")
module_code = []
@@ -76,7 +77,7 @@ class _GenerateRenderMethod(object):
printer.writeline("def %s(%s):" % (name, ','.join(args)))
self.identifiers = identifiers.branch(node)
- if len(self.identifiers.locally_declared) > 0:
+ if len(self.identifiers.locally_assigned) > 0:
printer.writeline("__locals = {}")
self.write_variable_declares(self.identifiers)
@@ -124,7 +125,7 @@ class _GenerateRenderMethod(object):
else:
self.write_inline_component(comp, identifiers)
else:
- self.printer.writeline("%s = context.get(%s, runtime.UNDEFINED)" % (ident, repr(ident)))
+ self.printer.writeline("%s = context.get(%s, UNDEFINED)" % (ident, repr(ident)))
def write_source_comment(self, node):
if self.last_source_line != node.lineno:
@@ -136,7 +137,7 @@ class _GenerateRenderMethod(object):
funcname = node.function_decl.funcname
namedecls = node.function_decl.get_argument_expressions()
nameargs = node.function_decl.get_argument_expressions(include_defaults=False)
- if len(self.identifiers.locally_declared) > 0:
+ if len(self.identifiers.locally_assigned) > 0:
nameargs.insert(0, 'context.locals_(__locals)')
else:
nameargs.insert(0, 'context')
@@ -268,6 +269,10 @@ class _Identifiers(object):
# list as well if they are referenced before declared
self.locally_declared = util.Set()
+ # assignments made in explicit python blocks. these will be propigated to
+ # the context of local component calls.
+ self.locally_assigned = util.Set()
+
# things that are declared in the argument signature of the component callable
self.argument_declared = util.Set()
@@ -302,6 +307,7 @@ class _Identifiers(object):
def visitCode(self, node):
if not node.ismodule:
self.check_declared(node)
+ self.locally_assigned = self.locally_assigned.union(node.declared_identifiers())
def visitComponentTag(self, node):
if node.is_root():
self.toplevelcomponents.add(node)
diff --git a/lib/mako/runtime.py b/lib/mako/runtime.py
index 16ee627..c1f2d94 100644
--- a/lib/mako/runtime.py
+++ b/lib/mako/runtime.py
@@ -16,10 +16,7 @@ class Context(object):
self.stack = [data]
# the Template instance currently rendering with this context.
self.with_template = template
- class AttrFacade(object):
- def __getattr__(s, key):
- return self.stack[-1][key]
- data.setdefault('args', AttrFacade())
+ data['args'] = _AttrFacade(self)
def __getitem__(self, key):
return self.stack[-1][key]
def get(self, key, default=None):
@@ -36,7 +33,13 @@ class Context(object):
c = Context(self.with_template, self.buffer, **self.stack[-1])
c.stack[-1].update(**d)
return c
-
+
+class _AttrFacade(object):
+ def __init__(self, ctx):
+ self.ctx = ctx
+ def __getattr__(self, key):
+ return self.ctx[key]
+
class Undefined(object):
"""represtents undefined values"""
def __str__(self):