[Pyrex] patch for STDCALL
Eric Devolder
eric.devolder at gmail.com
Fri Aug 3 22:17:52 CEST 2007
...not sure if the attachment was actually received in my previous
post. I'm sending it as text.
*** 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: stdcall.patch
Type: application/octet-stream
Size: 11289 bytes
Desc: not available
Url : http://lists.copyleft.no/pipermail/pyrex/attachments/20070803/4b9069d3/attachment-0001.obj
More information about the Pyrex
mailing list