def __generate_load_module(self, out: FileGenerator):
     out.put_line('void load_module(const char* shared_library_name)')
     with IndentScope(out):
         out.put_line(
             'if (!shared_library_name) throw std::runtime_error("Null library name was passed");'
         )
         if_def_then_else(
             out, '_WIN32',
             DynamicLoaderGenerator.__generate_load_module_windows,
             DynamicLoaderGenerator.__generate_load_module_posix)
         out.put_line('if (!handle)')
         with IndentScope(out):
             out.put_line('std::stringstream error_message;')
             out.put_line(
                 'error_message << "Can\'t load shared library " << shared_library_name;'
             )
             out.put_line('throw std::runtime_error(error_message.str());')
         for c_function in self.namespace_info.c_functions:
             self.cur_c_function_name = c_function.name
             if_def_then_else(
                 out, "{0}_load_function_call".format(c_function.name),
                 self.__generate_secure_load, self.__generate_open_load)
         generate_check_version(out,
                                self.namespace_info.namespace_name_array[0],
                                'shared_library_name')
     out.put_line('')
예제 #2
0
 def __generate_capi_defines(self, out: FileGenerator):
     self.cur_api_define = '{0}_API'.format(self.cur_namespace_name)
     self.cur_api_convention = '{0}_API_CONVENTION'.format(self.cur_namespace_name)
     self.cur_capi_prefix = '{0}_CAPI_PREFIX'.format(self.cur_namespace_name)
     if_def_then_else(out, '__cplusplus',
                      self.__generate_capi_c_prefix,
                      self.__generate_capi_prefix)
     out.put_line('')
     self.__put_api_define(out, 'dllimport')
 def __generate_destructor(self, out: FileGenerator):
     out.put_line('~Initialization()')
     with IndentScope(out):
         if_def_then_else(
             out, '_WIN32',
             DynamicLoaderGenerator.__generate_destructor_windows,
             DynamicLoaderGenerator.__generate_destructor_posix)
         for c_function in self.namespace_info.c_functions:
             self.cur_c_function_name = c_function.name
             if_def_then_else(
                 out, '{0}_zero_function_pointer'.format(c_function.name),
                 self.__generate_secure_zero, self.__generate_open_zero)
예제 #4
0
 def __put_define_apple_or_linux(self, out: FileGenerator):
     out.put_line('#if defined(__GNUC__) && __GNUC__ >= 4')
     with Indent(out):
         out.put_line('#define {0} {1} __attribute__ ((visibility ("default")))'.format(
             self.cur_api_define, self.cur_capi_prefix))
     out.put_line('#else')
     with Indent(out):
         out.put_line('#define {0} {1}'.format(self.cur_api_define, self.cur_capi_prefix))
     out.put_line('#endif')
     if_def_then_else(out, '__i386__',
                      self.__generate_posix_i386_attribute,
                      self.__generate_posix_non_i386_attribute)
 def generate(self, out: FileGenerator):
     out.put_line('')
     with IfDefScope(out, '__cplusplus'):
         out.put_line('#include <stdexcept>')
         out.put_line('#include <sstream>')
         out.put_line('')
         if_def_then_else(out, '_WIN32', self.__generate_windows_includes,
                          self.__generate_posix_includes)
         out.put_line('')
         # We always have at least one element
         out.put_line('namespace {0}'.format(
             self.namespace_info.namespace_name_array[0]))
         with IndentScope(out):
             self.__generate_body(out)
 def __generate_load_function(out: FileGenerator):
     out.put_line('template<class FunctionPointerType>')
     out.put_line(
         'void load_function(FunctionPointerType& to_init, const char* name)'
     )
     with IndentScope(out):
         if_def_then_else(
             out, '_WIN32',
             DynamicLoaderGenerator.__generate_load_function_windows,
             DynamicLoaderGenerator.__generate_load_function_posix)
         out.put_line('if (!to_init)')
         with IndentScope(out):
             out.put_line('std::stringstream error_message;')
             out.put_line(
                 'error_message << "Can\'t obtain function " << name;')
             out.put_line('throw std::runtime_error(error_message.str());')
     out.put_line('')
예제 #7
0
    def __generate_dynamic_capi(self, out: FileGenerator):
        out.put_line('')
        for c_function in self.cur_namespace_info.c_functions:
            self.cur_namespace_info.c_pointers.append(
                Pointer2CFunction(
                    c_function.path_to_namespace,
                    c_function.return_type,
                    c_function.name + '_function_type',
                    c_function.arguments
                )
            )
        self.__generate_callback_typedefs(out)
        if_def_then_else(out, self.cur_namespace_name + '_CAPI_DEFINE_FUNCTION_POINTERS',
                         self.__generate_function_pointer_definitions,
                         self.__generate_function_pointer_declarations)

        DynamicLoaderGenerator(self.cur_namespace_name, self.cur_namespace_info, self.params).generate(out)
        out.put_line('')
 def __generate_members(out: FileGenerator):
     if_def_then_else(out, '_WIN32',
                      DynamicLoaderGenerator.__generate_windows_members,
                      DynamicLoaderGenerator.__generate_posix_members)
     out.put_line('')
예제 #9
0
 def __generate_compiler_traits(self, out: FileGenerator):
     if self.params.enable_cpp11_features_in_wrap_code:
         with IfDefScope(out, '__cplusplus', False):
             with Indent(out):
                 if_def_then_else(out, '_MSC_VER', self.__generate_msvc_traits, self.__generate_non_msvc_traits)
         out.put_line('')