|
@@ -262,19 +262,23 @@ class ModelverseJit(object):
|
|
|
tree_ir.LoadGlobalInstruction(target_type.__name__),
|
|
|
[tree_ir.ReadValueInstruction(a)])))
|
|
|
|
|
|
- def jit_parameters(self, body_id):
|
|
|
- """Acquires the parameter list for the given body id node."""
|
|
|
+ def jit_signature(self, body_id):
|
|
|
+ """Acquires the signature for the given body id node, which consists of the
|
|
|
+ parameter variables, parameter name and a flag that tells if the given function
|
|
|
+ is mutable."""
|
|
|
if body_id not in self.jitted_parameters:
|
|
|
- signature_id, = yield [("RRD", [body_id, "body"])]
|
|
|
+ signature_id, = yield [("RRD", [body_id, jit_runtime.FUNCTION_BODY_KEY])]
|
|
|
signature_id = signature_id[0]
|
|
|
- param_set_id, = yield [("RD", [signature_id, "params"])]
|
|
|
+ param_set_id, is_mutable = yield [
|
|
|
+ ("RD", [signature_id, "params"]),
|
|
|
+ ("RD", [signature_id, jit_runtime.MUTABLE_FUNCTION_KEY])]
|
|
|
if param_set_id is None:
|
|
|
- self.jitted_parameters[body_id] = ([], [])
|
|
|
+ self.jitted_parameters[body_id] = ([], [], is_mutable)
|
|
|
else:
|
|
|
param_name_ids, = yield [("RDK", [param_set_id])]
|
|
|
param_names = yield [("RV", [n]) for n in param_name_ids]
|
|
|
param_vars = yield [("RD", [param_set_id, k]) for k in param_names]
|
|
|
- self.jitted_parameters[body_id] = (param_vars, param_names)
|
|
|
+ self.jitted_parameters[body_id] = (param_vars, param_names, is_mutable)
|
|
|
|
|
|
raise primitive_functions.PrimitiveFinished(self.jitted_parameters[body_id])
|
|
|
|
|
@@ -307,7 +311,8 @@ class ModelverseJit(object):
|
|
|
self.jitted_entry_points[body_id] = function_name
|
|
|
self.jit_globals[function_name] = None
|
|
|
|
|
|
- (parameter_ids, parameter_list), = yield [("CALL_ARGS", [self.jit_parameters, (body_id,)])]
|
|
|
+ (parameter_ids, parameter_list, is_mutable), = yield [
|
|
|
+ ("CALL_ARGS", [self.jit_signature, (body_id,)])]
|
|
|
|
|
|
param_dict = dict(zip(parameter_ids, parameter_list))
|
|
|
body_param_dict = dict(zip(parameter_ids, [p + "_ptr" for p in parameter_list]))
|
|
@@ -331,6 +336,10 @@ class ModelverseJit(object):
|
|
|
# Try to analyze the function's body.
|
|
|
yield [("TRY", [])]
|
|
|
yield [("CATCH", [JitCompilationFailedException, handle_jit_exception])]
|
|
|
+ if is_mutable:
|
|
|
+ # We can't just JIT mutable functions. That'd be dangerous.
|
|
|
+ raise JitCompilationFailedException(
|
|
|
+ "Function was marked '%s'." % jit_runtime.MUTABLE_FUNCTION_KEY)
|
|
|
state = AnalysisState(
|
|
|
self, body_id, user_root, body_param_dict,
|
|
|
self.max_instructions)
|
|
@@ -880,7 +889,7 @@ class AnalysisState(object):
|
|
|
"""Tries to analyze a direct 'call' instruction."""
|
|
|
self.register_function_var(callee_id)
|
|
|
|
|
|
- body_id, = yield [("RD", [callee_id, "body"])]
|
|
|
+ body_id, = yield [("RD", [callee_id, jit_runtime.FUNCTION_BODY_KEY])]
|
|
|
|
|
|
# Make this function dependent on the callee.
|
|
|
if body_id in self.jit.compilation_dependencies:
|