fixed more unittests

--HG--
branch : trunk
diff --git a/jinja2/_speedups.c b/jinja2/_speedups.c
index 6aad8ec..36a1404 100644
--- a/jinja2/_speedups.c
+++ b/jinja2/_speedups.c
@@ -115,7 +115,7 @@
 escape(PyObject *self, PyObject *args)
 {
 	PyObject *text = NULL, *s = NULL, *rv = NULL;
-	if (!PyArg_UnpackTuple(args, "escape", 1, 2, &text))
+	if (!PyArg_UnpackTuple(args, "escape", 1, 1, &text))
 		return NULL;
 
 	/* we don't have to escape integers, bools or floats */
diff --git a/jinja2/environment.py b/jinja2/environment.py
index 1ed0464..35b01e7 100644
--- a/jinja2/environment.py
+++ b/jinja2/environment.py
@@ -182,7 +182,10 @@
     """Represents a template."""
 
     def __init__(self, environment, code, globals, uptodate=None):
-        namespace = {'environment': environment}
+        namespace = {
+            'environment':          environment,
+            '__jinja_template__':   self
+        }
         exec code in namespace
         self.environment = environment
         self.name = namespace['name']
@@ -191,18 +194,27 @@
         self.blocks = namespace['blocks']
         self.globals = globals
 
-        # debug helpers
+        # debug and loader helpers
         self._get_debug_info = namespace['get_debug_info']
         self._uptodate = uptodate
-        namespace['__jinja_template__'] = self
 
     def render(self, *args, **kwargs):
         """Render the template into a string."""
-        return u''.join(self.generate(*args, **kwargs))
+        try:
+            return u''.join(self.generate(*args, **kwargs))
+        except:
+            # hide the `generate` frame
+            exc_type, exc_value, tb = sys.exc_info()
+            raise exc_type, exc_value, tb.tb_next
 
     def stream(self, *args, **kwargs):
         """Return a `TemplateStream` that generates the template."""
-        return TemplateStream(self.generate(*args, **kwargs))
+        try:
+            return TemplateStream(self.generate(*args, **kwargs))
+        except:
+            # hide the `generate` frame
+            exc_type, exc_value, tb = sys.exc_info()
+            raise exc_type, exc_value, tb.tb_next
 
     def generate(self, *args, **kwargs):
         """Return a generator that generates the template."""
diff --git a/jinja2/loaders.py b/jinja2/loaders.py
index b621bbf..dc3ccfb 100644
--- a/jinja2/loaders.py
+++ b/jinja2/loaders.py
@@ -39,10 +39,12 @@
     """
 
     def __init__(self, cache_size=50, auto_reload=True):
-        if cache_size > 0:
-            self.cache = LRUCache(cache_size)
-        else:
+        if cache_size == 0:
             self.cache = None
+        elif cache_size < 0:
+            self.cache = {}
+        else:
+            self.cache = LRUCache(cache_size)
         self.auto_reload = auto_reload
 
     def get_source(self, environment, template):
@@ -134,7 +136,8 @@
 class DictLoader(BaseLoader):
     """Loads a template from a python dict.  Used for unittests mostly."""
 
-    def __init__(self, mapping):
+    def __init__(self, mapping, cache_size=50):
+        BaseLoader.__init__(self, cache_size, False)
         self.mapping = mapping
 
     def get_source(self, environment, template):
diff --git a/jinja2/runtime.py b/jinja2/runtime.py
index e1bf486..e0630cc 100644
--- a/jinja2/runtime.py
+++ b/jinja2/runtime.py
@@ -277,7 +277,7 @@
                     self._undefined_name
                 )
             else:
-                hint = '%r object has no attribute %s' % (
+                hint = '%r object has no attribute %r' % (
                     self._undefined_obj.__class__.__name__,
                     self._undefined_name
                 )