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

Let RestrictedPython become stubs.

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