Skip to content

Commit

Permalink
Add test and fix for default argument processing in sub-functions.
Browse files Browse the repository at this point in the history
  • Loading branch information
Evan Simpson committed Nov 13, 2001
1 parent b29912c commit 29dca9b
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 4 deletions.
6 changes: 4 additions & 2 deletions MutatingWalker.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
#
##############################################################################

__version__='$Revision: 1.2 $'[11:-2]
__version__='$Revision: 1.3 $'[11:-2]

from compiler import ast

Expand All @@ -97,8 +97,10 @@ def __init__(self, visitor):
self.visitor = visitor
self._cache = {}

def defaultVisitNode(self, node, walker=None):
def defaultVisitNode(self, node, walker=None, exclude=None):
for name, child in node.__dict__.items():
if exclude is not None and name in exclude:
continue
v = self.dispatchObject(child)
if v is not child:
# Replace the node.
Expand Down
5 changes: 3 additions & 2 deletions RestrictionMutator.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
compiler.transformer.Transformer, restricting and enhancing the
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.transformer import parse
Expand Down Expand Up @@ -206,10 +206,11 @@ def visitFunction(self, node, walker):
self.checkName(node, node.name)
for argname in node.argnames:
self.checkName(node, argname)
walker.visitSequence(node.defaults)

former_funcinfo = self.funcinfo
self.funcinfo = FuncInfo()
node = walker.defaultVisitNode(node)
node = walker.defaultVisitNode(node, exclude=('defaults',))
self.prepBody(node.code.nodes)
self.funcinfo = former_funcinfo
return node
Expand Down
9 changes: 9 additions & 0 deletions tests/restricted_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ def allowed_read(ob):
print len(ob)
return printed

def allowed_default_args(ob):
def f(a=ob.allowed, s=ob.s):
return a, s


def allowed_simple():
q = {'x':'a'}
q['y'] = 'b'
Expand Down Expand Up @@ -72,6 +77,10 @@ def denied_getattr(ob):
ob.disallowed = 1
return ob.disallowed

def denied_default_args(ob):
def f(d=ob.disallowed):
return d

def denied_setattr(ob):
ob.allowed = -1

Expand Down
3 changes: 3 additions & 0 deletions tests/testRestrictions.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,9 @@ def checkAllowedRead(self):
def checkAllowedWrite(self):
self.execFunc('allowed_write', RestrictedObject())

def checkAllowedArgs(self):
self.execFunc('allowed_default_args', RestrictedObject())

def checkDenied(self):
for k in rmodule.keys():
if k[:6] == 'denied':
Expand Down

0 comments on commit 29dca9b

Please sign in to comment.