Commit 477604d0 authored by Evan Simpson's avatar Evan Simpson

Add test and fix for default argument processing in sub-functions.

parent 8d61d0d4
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
# #
############################################################################## ##############################################################################
__version__='$Revision: 1.2 $'[11:-2] __version__='$Revision: 1.3 $'[11:-2]
from compiler import ast from compiler import ast
...@@ -97,8 +97,10 @@ class MutatingWalker: ...@@ -97,8 +97,10 @@ class MutatingWalker:
self.visitor = visitor self.visitor = visitor
self._cache = {} self._cache = {}
def defaultVisitNode(self, node, walker=None): def defaultVisitNode(self, node, walker=None, exclude=None):
for name, child in node.__dict__.items(): for name, child in node.__dict__.items():
if exclude is not None and name in exclude:
continue
v = self.dispatchObject(child) v = self.dispatchObject(child)
if v is not child: if v is not child:
# Replace the node. # Replace the node.
......
...@@ -87,7 +87,7 @@ RestrictionMutator modifies a tree produced by ...@@ -87,7 +87,7 @@ RestrictionMutator modifies a tree produced by
compiler.transformer.Transformer, restricting and enhancing the compiler.transformer.Transformer, restricting and enhancing the
code in various ways before sending it to pycodegen. code in various ways before sending it to pycodegen.
''' '''
__version__='$Revision: 1.6 $'[11:-2] __version__='$Revision: 1.7 $'[11:-2]
from compiler import ast from compiler import ast
from compiler.transformer import parse from compiler.transformer import parse
...@@ -206,10 +206,11 @@ class RestrictionMutator: ...@@ -206,10 +206,11 @@ class RestrictionMutator:
self.checkName(node, node.name) self.checkName(node, node.name)
for argname in node.argnames: for argname in node.argnames:
self.checkName(node, argname) self.checkName(node, argname)
walker.visitSequence(node.defaults)
former_funcinfo = self.funcinfo former_funcinfo = self.funcinfo
self.funcinfo = FuncInfo() self.funcinfo = FuncInfo()
node = walker.defaultVisitNode(node) node = walker.defaultVisitNode(node, exclude=('defaults',))
self.prepBody(node.code.nodes) self.prepBody(node.code.nodes)
self.funcinfo = former_funcinfo self.funcinfo = former_funcinfo
return node return node
......
...@@ -42,6 +42,11 @@ def allowed_read(ob): ...@@ -42,6 +42,11 @@ def allowed_read(ob):
print len(ob) print len(ob)
return printed return printed
def allowed_default_args(ob):
def f(a=ob.allowed, s=ob.s):
return a, s
def allowed_simple(): def allowed_simple():
q = {'x':'a'} q = {'x':'a'}
q['y'] = 'b' q['y'] = 'b'
...@@ -72,6 +77,10 @@ def denied_getattr(ob): ...@@ -72,6 +77,10 @@ def denied_getattr(ob):
ob.disallowed = 1 ob.disallowed = 1
return ob.disallowed return ob.disallowed
def denied_default_args(ob):
def f(d=ob.disallowed):
return d
def denied_setattr(ob): def denied_setattr(ob):
ob.allowed = -1 ob.allowed = -1
......
...@@ -204,6 +204,9 @@ class RestrictionTests(unittest.TestCase): ...@@ -204,6 +204,9 @@ class RestrictionTests(unittest.TestCase):
def checkAllowedWrite(self): def checkAllowedWrite(self):
self.execFunc('allowed_write', RestrictedObject()) self.execFunc('allowed_write', RestrictedObject())
def checkAllowedArgs(self):
self.execFunc('allowed_default_args', RestrictedObject())
def checkDenied(self): def checkDenied(self):
for k in rmodule.keys(): for k in rmodule.keys():
if k[:6] == 'denied': if k[:6] == 'denied':
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment