[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