diff options
author | RaNaN <Mast3rRaNaN@hotmail.de> | 2011-05-10 21:23:46 +0200 |
---|---|---|
committer | RaNaN <Mast3rRaNaN@hotmail.de> | 2011-05-10 21:23:46 +0200 |
commit | 60ae0ee3dce4715621b9964c91ad96e08e123204 (patch) | |
tree | 251aeb85742a32a8f3711879e4071a66e59bdc26 /module/lib/SafeEval.py | |
parent | fixes netload free (diff) | |
download | pyload-60ae0ee3dce4715621b9964c91ad96e08e123204.tar.xz |
Diffstat (limited to 'module/lib/SafeEval.py')
-rw-r--r-- | module/lib/SafeEval.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/module/lib/SafeEval.py b/module/lib/SafeEval.py new file mode 100644 index 000000000..8ec9766e6 --- /dev/null +++ b/module/lib/SafeEval.py @@ -0,0 +1,70 @@ +## {{{ http://code.activestate.com/recipes/364469/ (r2) +import compiler + +class Unsafe_Source_Error(Exception): + def __init__(self,error,descr = None,node = None): + self.error = error + self.descr = descr + self.node = node + self.lineno = getattr(node,"lineno",None) + + def __repr__(self): + return "Line %d. %s: %s" % (self.lineno, self.error, self.descr) + __str__ = __repr__ + +class SafeEval(object): + + def visit(self, node,**kw): + cls = node.__class__ + meth = getattr(self,'visit'+cls.__name__,self.default) + return meth(node, **kw) + + def default(self, node, **kw): + for child in node.getChildNodes(): + return self.visit(child, **kw) + + visitExpression = default + + def visitConst(self, node, **kw): + return node.value + + def visitDict(self,node,**kw): + return dict([(self.visit(k),self.visit(v)) for k,v in node.items]) + + def visitTuple(self,node, **kw): + return tuple(self.visit(i) for i in node.nodes) + + def visitList(self,node, **kw): + return [self.visit(i) for i in node.nodes] + +class SafeEvalWithErrors(SafeEval): + + def default(self, node, **kw): + raise Unsafe_Source_Error("Unsupported source construct", + node.__class__,node) + + def visitName(self,node, **kw): + if node.name == "None": + return None + elif node.name == "True": + return True + elif node.name == "False": + return False + else: + raise Unsafe_Source_Error("Strings must be quoted", + node.name, node) + + # Add more specific errors if desired + + +def safe_eval(source, fail_on_error = True): + walker = fail_on_error and SafeEvalWithErrors() or SafeEval() + try: + ast = compiler.parse(source,"eval") + except SyntaxError, err: + raise + try: + return walker.visit(ast) + except Unsafe_Source_Error, err: + raise +## end of http://code.activestate.com/recipes/364469/ }}} |