Commit 2ebcf9c5 authored by Boxiang Sun's avatar Boxiang Sun

Let RestrictedPython become stubs.

parent 1e456686
...@@ -13,62 +13,62 @@ ...@@ -13,62 +13,62 @@
__version__='$Revision: 1.6 $'[11:-2] __version__='$Revision: 1.6 $'[11:-2]
from SelectCompiler import ast # from SelectCompiler import ast
ListType = type([]) ListType = type([])
TupleType = type(()) TupleType = type(())
SequenceTypes = (ListType, TupleType) SequenceTypes = (ListType, TupleType)
class MutatingWalker: # class MutatingWalker:
#
def __init__(self, visitor): # def __init__(self, visitor):
self.visitor = visitor # self.visitor = visitor
self._cache = {} # self._cache = {}
#
def defaultVisitNode(self, node, walker=None, exclude=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: # if exclude is not None and name in exclude:
continue # 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.
node.__dict__[name] = v # node.__dict__[name] = v
return node # return node
#
def visitSequence(self, seq): # def visitSequence(self, seq):
res = seq # res = seq
for idx in range(len(seq)): # for idx in range(len(seq)):
child = seq[idx] # child = seq[idx]
v = self.dispatchObject(child) # v = self.dispatchObject(child)
if v is not child: # if v is not child:
# Change the sequence. # # Change the sequence.
if type(res) is ListType: # if type(res) is ListType:
res[idx : idx + 1] = [v] # res[idx : idx + 1] = [v]
else: # else:
res = res[:idx] + (v,) + res[idx + 1:] # res = res[:idx] + (v,) + res[idx + 1:]
return res # return res
#
def dispatchObject(self, ob): # def dispatchObject(self, ob):
''' # '''
Expected to return either ob or something that will take # Expected to return either ob or something that will take
its place. # its place.
''' # '''
if isinstance(ob, ast.Node): # if isinstance(ob, ast.Node):
return self.dispatchNode(ob) # return self.dispatchNode(ob)
elif type(ob) in SequenceTypes: # elif type(ob) in SequenceTypes:
return self.visitSequence(ob) # return self.visitSequence(ob)
else: # else:
return ob # return ob
#
def dispatchNode(self, node): # def dispatchNode(self, node):
klass = node.__class__ # klass = node.__class__
meth = self._cache.get(klass, None) # meth = self._cache.get(klass, None)
if meth is None: # if meth is None:
className = klass.__name__ # className = klass.__name__
meth = getattr(self.visitor, 'visit' + className, # meth = getattr(self.visitor, 'visit' + className,
self.defaultVisitNode) # self.defaultVisitNode)
self._cache[klass] = meth # self._cache[klass] = meth
return meth(node, self) # return meth(node, self)
#
def walk(tree, visitor): # def walk(tree, visitor):
return MutatingWalker(visitor).dispatchNode(tree) # return MutatingWalker(visitor).dispatchNode(tree)
This diff is collapsed.
...@@ -14,10 +14,10 @@ ...@@ -14,10 +14,10 @@
""" """
# Use the compiler from the standard library. # Use the compiler from the standard library.
import compiler # import compiler
from compiler import ast # from compiler import ast
from compiler.transformer import parse # from compiler.transformer import parse
from compiler.consts import OP_ASSIGN, OP_DELETE, OP_APPLY # from compiler.consts import OP_ASSIGN, OP_DELETE, OP_APPLY
from RCompile import \ from RCompile import \
compile_restricted, \ compile_restricted, \
......
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