|
|
@@ -37,6 +37,51 @@ class ModelverseKernel(object):
|
|
|
|
|
|
self.debug_info = defaultdict(list)
|
|
|
|
|
|
+ def try_to_protect(self, var):
|
|
|
+ if isinstance(var, dict) and "id" in var and var['id'] is not None:
|
|
|
+ return set([var['id']])
|
|
|
+ elif type(var) == int:
|
|
|
+ return set([var])
|
|
|
+ elif isinstance(var, dict):
|
|
|
+ protect = set()
|
|
|
+ for v in var.values():
|
|
|
+ protect |= self.try_to_protect(v)
|
|
|
+ return protect
|
|
|
+ elif isinstance(var, list):
|
|
|
+ protect = set()
|
|
|
+ for v in var:
|
|
|
+ protect |= self.try_to_protect(v)
|
|
|
+ return protect
|
|
|
+ elif isinstance(var, set):
|
|
|
+ protect = set()
|
|
|
+ for v in var:
|
|
|
+ protect |= self.try_to_protect(v)
|
|
|
+ return protect
|
|
|
+ return set()
|
|
|
+
|
|
|
+ def protect_temporary_variables(self, taskname):
|
|
|
+ generators = []
|
|
|
+ for h in self.request_handlers.values():
|
|
|
+ for handler in h.values():
|
|
|
+ for generator in handler.generator_stack:
|
|
|
+ generators.append(generator)
|
|
|
+
|
|
|
+ to_protect = set()
|
|
|
+ for gen in generators:
|
|
|
+ variables = gen.gi_frame.f_locals
|
|
|
+ for var in variables.values():
|
|
|
+ to_protect |= self.try_to_protect(var)
|
|
|
+
|
|
|
+ # Create the node to which everything is attached
|
|
|
+ self.fixed_node, = yield [("CN", [])]
|
|
|
+ yield [("CE", [self.root, self.fixed_node])]
|
|
|
+ yield [("CE", [self.fixed_node, node]) for node in to_protect]
|
|
|
+ yield [("RETURN", [None])]
|
|
|
+
|
|
|
+ def unprotect_temporary_variables(self, taskname):
|
|
|
+ yield [("DN", [self.fixed_node])]
|
|
|
+ yield [("RETURN", [None])]
|
|
|
+
|
|
|
def execute_yields(self, taskname, operation, params, reply):
|
|
|
self.taskname = taskname
|
|
|
if taskname not in self.request_handlers:
|