*** Pyrex-0.9.5.1a/Pyrex/Compiler/ModuleNode.py 2007-01-27 05:21:03.000000000 +0100 --- Pyrex-0.9.5.1a-new/Pyrex/Compiler/ModuleNode.py 2007-08-02 14:45:02.421875000 +0200 *************** *** 51,56 **** --- 51,58 ---- h_code = Code.CCodeWriter(open_new_file(result.h_file)) i_code = Code.PyrexCodeWriter(result.i_file) self.generate_extern_c_macro_definition(h_code) + self.generate_stdcall_macro_definition(h_code) + self.generate_cdecl_macro_definition(h_code) for entry in public_vars_and_funcs: h_code.putln("%s %s;" % ( Naming.extern_c_macro, *************** *** 135,140 **** --- 137,144 ---- code.putln(" #define PY_LONG_LONG LONG_LONG") code.putln("#endif") self.generate_extern_c_macro_definition(code) + self.generate_stdcall_macro_definition(code) + self.generate_cdecl_macro_definition(code) code.putln("%s double pow(double, double);" % Naming.extern_c_macro) self.generate_includes(env, cimported_modules, code) #for filename in env.include_files: *************** *** 163,168 **** --- 167,188 ---- code.putln("#define %s extern" % name) code.putln("#endif") + def generate_stdcall_macro_definition(self, code): + name = Naming.stdcall_macro + code.putln("#ifdef WIN32") + code.putln("#define %s __stdcall" % name) + code.putln("#else") + code.putln("#define %s" % name) + code.putln("#endif") + + def generate_cdecl_macro_definition(self, code): + name = Naming.cdecl_macro + code.putln("#ifdef WIN32") + code.putln("#define %s __cdecl" % name) + code.putln("#else") + code.putln("#define %s" % name) + code.putln("#endif") + def generate_includes(self, env, cimported_modules, code): includes = env.include_files[:] for module in cimported_modules: *************** *** 365,372 **** storage_class = "%s " % Naming.extern_c_macro else: storage_class = "static " ! code.putln("%s%s; /*proto*/" % ( storage_class, header)) def generate_typeobj_definitions(self, env, code): --- 385,401 ---- storage_class = "%s " % Naming.extern_c_macro else: storage_class = "static " ! ! if entry.callingconv == '__stdcall': ! calling_convention = "%s " % Naming.stdcall_macro ! elif entry.callingconv == '__cdecl': ! calling_convention = "%s " % Naming.cdecl_macro ! else: ! calling_convention = '' ! ! code.putln("%s%s%s; /*proto*/" % ( storage_class, + calling_convention, header)) def generate_typeobj_definitions(self, env, code): *** Pyrex-0.9.5.1a/Pyrex/Compiler/Naming.py 2007-01-27 05:21:03.000000000 +0100 --- Pyrex-0.9.5.1a-new/Pyrex/Compiler/Naming.py 2007-08-02 14:45:34.890625000 +0200 *************** *** 52,54 **** --- 52,56 ---- vtabslot_cname = pyrex_prefix + "vtab" extern_c_macro = pyrex_prefix.upper() + "EXTERN_C" + stdcall_macro = pyrex_prefix.upper() + "STDCALL" + cdecl_macro = pyrex_prefix.upper() + "CDECL" *** Pyrex-0.9.5.1a/Pyrex/Compiler/Nodes.py 2007-01-30 11:15:40.000000000 +0100 --- Pyrex-0.9.5.1a-new/Pyrex/Compiler/Nodes.py 2007-08-02 14:47:41.953125000 +0200 *************** *** 347,352 **** --- 347,353 ---- # C variable definition or forward/extern function declaration. # # visibility 'private' or 'public' or 'extern' + # callingconv None , '__cdecl' or '__stdcall' # base_type CBaseTypeNode # declarators [CDeclaratorNode] *************** *** 367,373 **** cname = name_declarator.cname if type.is_cfunction: dest_scope.declare_cfunction(name, type, declarator.pos, ! cname = cname, visibility = self.visibility) else: dest_scope.declare_var(name, type, declarator.pos, cname = cname, visibility = self.visibility, is_cdef = 1) --- 368,374 ---- cname = name_declarator.cname if type.is_cfunction: dest_scope.declare_cfunction(name, type, declarator.pos, ! cname = cname, visibility = self.visibility, callingconv = self.callingconv) else: dest_scope.declare_var(name, type, declarator.pos, cname = cname, visibility = self.visibility, is_cdef = 1) *************** *** 592,597 **** --- 593,599 ---- # C function definition. # # visibility 'private' or 'public' or 'extern' + # callingconv None (default) or '__stdcall' or '__cdecl' # base_type CBaseTypeNode # declarator CDeclaratorNode # body StatListNode *************** *** 616,622 **** cname = name_declarator.cname self.entry = env.declare_cfunction( name, type, self.pos, ! cname = cname, visibility = self.visibility, defining = self.body is not None) self.return_type = type.return_type --- 618,624 ---- cname = name_declarator.cname self.entry = env.declare_cfunction( name, type, self.pos, ! cname = cname, visibility = self.visibility, callingconv = self.callingconv, defining = self.body is not None) self.return_type = type.return_type *** Pyrex-0.9.5.1a/Pyrex/Compiler/Parsing.py 2007-01-27 05:21:03.000000000 +0100 --- Pyrex-0.9.5.1a-new/Pyrex/Compiler/Parsing.py 2007-08-02 14:50:26.515625000 +0200 *************** *** 1451,1457 **** s.expect_newline('Expected a newline') return node else: ! return p_c_func_or_var_declaration(s, level, pos, visibility) def p_cdef_extern_block(s, level, pos): include_file = None --- 1451,1458 ---- s.expect_newline('Expected a newline') return node else: ! callingconv = p_callingconv(s) ! return p_c_func_or_var_declaration(s, level, pos, visibility, callingconv) def p_cdef_extern_block(s, level, pos): include_file = None *************** *** 1555,1561 **** s.next() return visibility ! def p_c_func_or_var_declaration(s, level, pos, visibility = 'private'): cmethod_flag = level in ('c_class', 'c_class_pxd') base_type = p_c_base_type(s) declarator = p_c_declarator(s, cmethod_flag = cmethod_flag) --- 1556,1570 ---- s.next() return visibility ! def p_callingconv(s): ! callingconv = None ! pos = s.position() ! if s.sy == 'IDENT' and s.systring in ('__stdcall', '__cdecl'): ! callingconv = s.systring ! s.next() ! return callingconv ! ! def p_c_func_or_var_declaration(s, level, pos, visibility = 'private', callingconv = None): cmethod_flag = level in ('c_class', 'c_class_pxd') base_type = p_c_base_type(s) declarator = p_c_declarator(s, cmethod_flag = cmethod_flag) *************** *** 1565,1570 **** --- 1574,1580 ---- suite = p_suite(s, 'function') result = Nodes.CFuncDefNode(pos, visibility = visibility, + callingconv = callingconv, base_type = base_type, declarator = declarator, body = suite) *************** *** 1583,1589 **** result = Nodes.CVarDefNode(pos, visibility = visibility, base_type = base_type, ! declarators = declarators) return result def p_ctypedef_statement(s, level, visibility = 'private'): --- 1593,1600 ---- result = Nodes.CVarDefNode(pos, visibility = visibility, base_type = base_type, ! declarators = declarators, ! callingconv = callingconv ) return result def p_ctypedef_statement(s, level, visibility = 'private'): *** Pyrex-0.9.5.1a/Pyrex/Compiler/Symtab.py 2007-01-27 05:21:03.000000000 +0100 --- Pyrex-0.9.5.1a-new/Pyrex/Compiler/Symtab.py 2007-08-02 14:52:09.140625000 +0200 *************** *** 24,29 **** --- 24,30 ---- # doc string Doc string # init string Initial value # visibility 'private' or 'public' or 'extern' + # callingconv None or '__stdcall' or '__cdecl' # is_builtin boolean Is a Python builtin name # is_cglobal boolean Is a C global variable # is_pyglobal boolean Is a Python module-level variable *************** *** 66,71 **** --- 67,73 ---- borrowed = 0 init = "" visibility = 'private' + callingconv = None is_builtin = 0 is_cglobal = 0 is_pyglobal = 0 *************** *** 303,324 **** self.pyfunc_entries.append(entry) def declare_cfunction(self, name, type, pos, ! cname = None, visibility = 'private', defining = 0): # Add an entry for a C function. if not cname: if visibility <> 'private': cname = name else: cname = self.mangle(Naming.func_prefix, name) ! entry = self.add_cfunction(name, type, pos, cname, visibility) entry.func_cname = cname return entry ! def add_cfunction(self, name, type, pos, cname, visibility): # Add a C function entry without giving it a func_cname. entry = self.declare(name, cname, type, pos) entry.is_cfunction = 1 entry.visibility = visibility self.cfunc_entries.append(entry) return entry --- 305,327 ---- self.pyfunc_entries.append(entry) def declare_cfunction(self, name, type, pos, ! cname = None, visibility = 'private', defining = 0, callingconv = None ): # Add an entry for a C function. if not cname: if visibility <> 'private': cname = name else: cname = self.mangle(Naming.func_prefix, name) ! entry = self.add_cfunction(name, type, pos, cname, visibility, callingconv) entry.func_cname = cname return entry ! def add_cfunction(self, name, type, pos, cname, visibility, callingconv): # Add a C function entry without giving it a func_cname. entry = self.declare(name, cname, type, pos) entry.is_cfunction = 1 entry.visibility = visibility + entry.callingconv = callingconv self.cfunc_entries.append(entry) return entry