def method_wrapper(self, act_as_func_def: FuncDef, target_func_def: FuncDef, is_dynamic: bool, is_wrapper_class: bool) -> FuncDef: """Construct a method wrapper. It acts as a specific method (with the same signature), coerces arguments, calls the target method and finally coerces the return value. """ is_override = act_as_func_def.info != target_func_def.info # Determine suffixes. target_suffix = self.tf.type_suffix(target_func_def) wrapper_suffix = self.get_wrapper_suffix(act_as_func_def, is_dynamic) # Determine function signatures. target_sig = self.get_target_sig(act_as_func_def, target_func_def, is_dynamic, is_wrapper_class) wrapper_sig = self.get_wrapper_sig(act_as_func_def, is_dynamic) call_sig = self.get_call_sig(act_as_func_def, target_func_def.info, is_dynamic, is_wrapper_class, is_override) if is_wrapper_class: bound_sig = cast(Callable, translate_type_vars_to_bound_vars(target_sig)) else: bound_sig = None call_stmt = self.call_wrapper(act_as_func_def, is_dynamic, is_wrapper_class, target_sig, call_sig, target_suffix, bound_sig) wrapper_args = self.get_wrapper_args(act_as_func_def, is_dynamic) wrapper_func_def = FuncDef(act_as_func_def.name() + wrapper_suffix, wrapper_args, act_as_func_def.arg_kinds, [None] * len(wrapper_args), Block([call_stmt]), wrapper_sig) self.tf.add_line_mapping(target_func_def, wrapper_func_def) if is_wrapper_class and not is_dynamic: self.tf.prepend_generic_function_tvar_args(wrapper_func_def) return wrapper_func_def
""" is_override = act_as_func_def.info != target_func_def.info # Determine suffixes. target_suffix = self.tf.type_suffix(target_func_def) wrapper_suffix = self.get_wrapper_suffix(act_as_func_def, is_dynamic) # Determine function signatures. target_sig = self.get_target_sig(act_as_func_def, target_func_def, is_dynamic, is_wrapper_class) wrapper_sig = self.get_wrapper_sig(act_as_func_def, is_dynamic) call_sig = self.get_call_sig(act_as_func_def, target_func_def.info, is_dynamic, is_wrapper_class, is_override) if is_wrapper_class: bound_sig = (Callable)translate_type_vars_to_bound_vars(target_sig) else: bound_sig = None call_stmt = self.call_wrapper(act_as_func_def, is_dynamic, is_wrapper_class, target_sig, call_sig, target_suffix, bound_sig) wrapper_args = self.get_wrapper_args(act_as_func_def, is_dynamic) wrapper_func_def = FuncDef(act_as_func_def.name() + wrapper_suffix, wrapper_args, act_as_func_def.arg_kinds, <Node> [None] * len(wrapper_args), Block([call_stmt]), wrapper_sig)