Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
 """
 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)