fixed recursion problem with properties. However, this does not fix the problem, that things that are used like properties (closures with different inputs) still are not properly executed, due to recursion detection.

This commit is contained in:
David Halter
2012-08-10 23:29:26 +02:00
parent 1843293624
commit 76eb3e53e7
2 changed files with 11 additions and 5 deletions

View File

@@ -137,7 +137,7 @@ class Instance(Executable):
def __init__(self, base, var_args=parsing.Array(None, None)): def __init__(self, base, var_args=parsing.Array(None, None)):
super(Instance, self).__init__(base, var_args) super(Instance, self).__init__(base, var_args)
if str(base.name) in ['list', 'set'] \ if str(base.name) in ['list', 'set'] \
and builtin.Builtin.name == base.get_parent_until().path: and builtin.Builtin.scope == base.get_parent_until():
# compare the module path with the builtin name. # compare the module path with the builtin name.
self.var_args = dynamic.check_array_instances(self) self.var_args = dynamic.check_array_instances(self)
else: else:

View File

@@ -1,6 +1,9 @@
import copy
import parsing import parsing
import debug import debug
import copy import builtin
class RecursionDecorator(object): class RecursionDecorator(object):
""" A decorator to detect recursions in statements """ """ A decorator to detect recursions in statements """
@@ -10,11 +13,14 @@ class RecursionDecorator(object):
self.current = None self.current = None
def __call__(self, stmt, *args, **kwargs): def __call__(self, stmt, *args, **kwargs):
# don't check param instances, they are not causing recursions r = RecursionNode(stmt, self.current)
if isinstance(stmt, parsing.Param):
# Don't check param instances, they are not causing recursions
# The same's true for the builtins, because the builtins are really
# simple.
if isinstance(stmt, parsing.Param) or r.script == builtin.Builtin.scope:
return self.func(stmt, *args, **kwargs) return self.func(stmt, *args, **kwargs)
r = RecursionNode(stmt, self.current)
if self.check_recursion(r): if self.check_recursion(r):
debug.warning('catched recursion', stmt, args, kwargs) debug.warning('catched recursion', stmt, args, kwargs)
return [] return []