diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-11-22 21:15:36 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-11-22 21:15:36 +0000 |
| commit | 8f21e61d2c5f2f7726ace7b585b882ab704df6ae (patch) | |
| tree | 33323ff75ea644107b14eba81411f7c1cfb78861 | |
| parent | aa84c7d54e782732f98a1a989137f8a27ea91801 (diff) | |
| download | external_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.py | 2 | ||||
| -rw-r--r-- | lib/mako/codegen.py | 12 | ||||
| -rw-r--r-- | lib/mako/runtime.py | 13 |
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): |
