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('')
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)
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('')
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('')
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('')