[pypy-svn] r72488 - in pypy/trunk/pypy: interpreter/test module/thread/test rlib rlib/test rpython/lltypesystem rpython/module rpython/test rpython/tool translator/c translator/c/gcc translator/c/src translator/c/test translator/tool

arigo at codespeak.net arigo at codespeak.net
Sun Mar 21 12:14:33 CET 2010


Author: arigo
Date: Sun Mar 21 12:14:30 2010
New Revision: 72488

Added:
   pypy/trunk/pypy/translator/c/src/commondefs.h
      - copied unchanged from r72486, pypy/branch/kill-python-h/pypy/translator/c/src/commondefs.h
Removed:
   pypy/trunk/pypy/rlib/getaddrinfo.py
   pypy/trunk/pypy/rlib/getnameinfo.py
   pypy/trunk/pypy/translator/c/src/addrinfo.h
   pypy/trunk/pypy/translator/c/src/getaddrinfo.c
   pypy/trunk/pypy/translator/c/src/getnameinfo.c
Modified:
   pypy/trunk/pypy/interpreter/test/test_function.py
   pypy/trunk/pypy/module/thread/test/test_import_lock.py
   pypy/trunk/pypy/rlib/_rsocket_rffi.py
   pypy/trunk/pypy/rlib/rmmap.py
   pypy/trunk/pypy/rlib/rsocket.py
   pypy/trunk/pypy/rlib/test/test_rsocket.py
   pypy/trunk/pypy/rpython/lltypesystem/ll_str.py
   pypy/trunk/pypy/rpython/module/ll_os.py
   pypy/trunk/pypy/rpython/module/ll_os_stat.py
   pypy/trunk/pypy/rpython/module/ll_time.py
   pypy/trunk/pypy/rpython/test/test_rint.py
   pypy/trunk/pypy/rpython/tool/rffi_platform.py
   pypy/trunk/pypy/translator/c/gcc/trackgcroot.py
   pypy/trunk/pypy/translator/c/genc.py
   pypy/trunk/pypy/translator/c/src/g_include.h
   pypy/trunk/pypy/translator/c/src/g_prerequisite.h
   pypy/trunk/pypy/translator/c/src/main.h
   pypy/trunk/pypy/translator/c/src/obmalloc.c
   pypy/trunk/pypy/translator/c/src/stack.h
   pypy/trunk/pypy/translator/c/src/support.h
   pypy/trunk/pypy/translator/c/src/thread.h
   pypy/trunk/pypy/translator/c/src/thread_pthread.h
   pypy/trunk/pypy/translator/c/test/test_dlltool.py
   pypy/trunk/pypy/translator/c/test/test_math.py
   pypy/trunk/pypy/translator/c/test/test_standalone.py
   pypy/trunk/pypy/translator/tool/cbuild.py
Log:
Merge branch/kill-python-h:

Clean up the dependencies of the generated C files -- the main
result is to remove the dependency on Python.h or pyconfig.h.


Modified: pypy/trunk/pypy/interpreter/test/test_function.py
==============================================================================
--- pypy/trunk/pypy/interpreter/test/test_function.py	(original)
+++ pypy/trunk/pypy/interpreter/test/test_function.py	Sun Mar 21 12:14:30 2010
@@ -281,6 +281,14 @@
         raises(TypeError, type, 'Foo', (type(f),), {})
         raises(TypeError, type, 'Foo', (type(len),), {})
 
+    def test_lambda_docstring(self):
+        # Like CPython, (lambda:"foo") has a docstring of "foo".
+        # But let's not test that.  Just test that (lambda:42) does not
+        # have 42 as docstring.
+        f = lambda: 42
+        assert f.func_doc is None
+
+
 class AppTestMethod: 
     def test_simple_call(self):
         class A(object):

Modified: pypy/trunk/pypy/module/thread/test/test_import_lock.py
==============================================================================
--- pypy/trunk/pypy/module/thread/test/test_import_lock.py	(original)
+++ pypy/trunk/pypy/module/thread/test/test_import_lock.py	Sun Mar 21 12:14:30 2010
@@ -10,17 +10,19 @@
         cls.w_tmpdir = cls.space.wrap(tmpdir)
 
     def test_import_lock(self):
+        # XXX XXX XXX this test fails if run together with all other tests
+        # of this directory, but not when run alone
         import thread, imp
         assert not imp.lock_held()
         done = []
-        def f():
+        def f(i):
             print '[ENTER %d]' % i
             from imghdr import testall
             print '[LEAVE %d]' % i
             done.append(1)
         for i in range(5):
             print '[RUN %d]' % i
-            thread.start_new_thread(f, ())
+            thread.start_new_thread(f, (i,))
         self.waitfor(lambda: len(done) == 5)
         assert len(done) == 5
 

Modified: pypy/trunk/pypy/rlib/_rsocket_rffi.py
==============================================================================
--- pypy/trunk/pypy/rlib/_rsocket_rffi.py	(original)
+++ pypy/trunk/pypy/rlib/_rsocket_rffi.py	Sun Mar 21 12:14:30 2010
@@ -448,13 +448,12 @@
 
 socketconnect = external('connect', [socketfd_type, sockaddr_ptr, socklen_t], rffi.INT)
 
-if not WIN32:
-    getaddrinfo = external('getaddrinfo', [CCHARP, CCHARP,
-                            addrinfo_ptr,
-                            lltype.Ptr(rffi.CArray(addrinfo_ptr))], rffi.INT)
-    freeaddrinfo = external('freeaddrinfo', [addrinfo_ptr], lltype.Void)
-    getnameinfo = external('getnameinfo', [sockaddr_ptr, socklen_t, CCHARP,
-                           size_t, CCHARP, size_t, rffi.INT], rffi.INT)
+getaddrinfo = external('getaddrinfo', [CCHARP, CCHARP,
+                        addrinfo_ptr,
+                        lltype.Ptr(rffi.CArray(addrinfo_ptr))], rffi.INT)
+freeaddrinfo = external('freeaddrinfo', [addrinfo_ptr], lltype.Void)
+getnameinfo = external('getnameinfo', [sockaddr_ptr, socklen_t, CCHARP,
+                       size_t, CCHARP, size_t, rffi.INT], rffi.INT)
 
 htonl = external('htonl', [rffi.UINT], rffi.UINT)
 htons = external('htons', [rffi.USHORT], rffi.USHORT)
@@ -563,78 +562,14 @@
 
     WSAGetLastError = external('WSAGetLastError', [], rffi.INT)
     geterrno = WSAGetLastError
-    
-    import errno
-    WIN32_ERROR_MESSAGES = {
-        errno.WSAEINTR:  "Interrupted system call",
-        errno.WSAEBADF:  "Bad file descriptor",
-        errno.WSAEACCES: "Permission denied",
-        errno.WSAEFAULT: "Bad address",
-        errno.WSAEINVAL: "Invalid argument",
-        errno.WSAEMFILE: "Too many open files",
-        errno.WSAEWOULDBLOCK:
-          "The socket operation could not complete without blocking",
-        errno.WSAEINPROGRESS: "Operation now in progress",
-        errno.WSAEALREADY: "Operation already in progress",
-        errno.WSAENOTSOCK: "Socket operation on non-socket",
-        errno.WSAEDESTADDRREQ: "Destination address required",
-        errno.WSAEMSGSIZE: "Message too long",
-        errno.WSAEPROTOTYPE: "Protocol wrong type for socket",
-        errno.WSAENOPROTOOPT: "Protocol not available",
-        errno.WSAEPROTONOSUPPORT: "Protocol not supported",
-        errno.WSAESOCKTNOSUPPORT: "Socket type not supported",
-        errno.WSAEOPNOTSUPP: "Operation not supported",
-        errno.WSAEPFNOSUPPORT: "Protocol family not supported",
-        errno.WSAEAFNOSUPPORT: "Address family not supported",
-        errno.WSAEADDRINUSE: "Address already in use",
-        errno.WSAEADDRNOTAVAIL: "Can't assign requested address",
-        errno.WSAENETDOWN: "Network is down",
-        errno.WSAENETUNREACH: "Network is unreachable",
-        errno.WSAENETRESET: "Network dropped connection on reset",
-        errno.WSAECONNABORTED: "Software caused connection abort",
-        errno.WSAECONNRESET: "Connection reset by peer",
-        errno.WSAENOBUFS: "No buffer space available",
-        errno.WSAEISCONN: "Socket is already connected",
-        errno.WSAENOTCONN: "Socket is not connected",
-        errno.WSAESHUTDOWN: "Can't send after socket shutdown",
-        errno.WSAETOOMANYREFS: "Too many references: can't splice",
-        errno.WSAETIMEDOUT: "Operation timed out",
-        errno.WSAECONNREFUSED: "Connection refused",
-        errno.WSAELOOP: "Too many levels of symbolic links",
-        errno.WSAENAMETOOLONG: "File name too long",
-        errno.WSAEHOSTDOWN: "Host is down",
-        errno.WSAEHOSTUNREACH: "No route to host",
-        errno.WSAENOTEMPTY: "Directory not empty",
-        errno.WSAEPROCLIM: "Too many processes",
-        errno.WSAEUSERS: "Too many users",
-        errno.WSAEDQUOT: "Disc quota exceeded",
-        errno.WSAESTALE: "Stale NFS file handle",
-        errno.WSAEREMOTE: "Too many levels of remote in path",
-        errno.WSASYSNOTREADY: "Network subsystem is unvailable",
-        errno.WSAVERNOTSUPPORTED: "WinSock version is not supported",
-        errno.WSANOTINITIALISED: "Successful WSAStartup() not yet performed",
-        errno.WSAEDISCON: "Graceful shutdown in progress",
-
-        # Resolver errors
-        # XXX Not exported by errno. Replace by the values in winsock.h
-        # errno.WSAHOST_NOT_FOUND: "No such host is known",
-        # errno.WSATRY_AGAIN: "Host not found, or server failed",
-        # errno.WSANO_RECOVERY: "Unexpected server error encountered",
-        # errno.WSANO_DATA: "Valid name without requested data",
-        # errno.WSANO_ADDRESS: "No address, look for MX record",
-
-        # select() errors
-        WSA_IO_PENDING: "WSA_IO_PENDING",
-        WSA_IO_INCOMPLETE: "WSA_IO_INCOMPLETE",
-        WSA_INVALID_HANDLE: "WSA_INVALID_HANDLE",
-        WSA_INVALID_PARAMETER: "WSA_INVALID_PARAMETER",
-        WSA_NOT_ENOUGH_MEMORY: "WSA_NOT_ENOUGH_MEMORY",
-        WSA_OPERATION_ABORTED: "WSA_OPERATION_ABORTED",
-        }
 
-    assert len(WIN32_ERROR_MESSAGES) == 53 # detect duplicates
+    from pypy.rlib import rwin32
 
     def socket_strerror_str(errno):
-        return WIN32_ERROR_MESSAGES.get(errno, "winsock error %d" % errno)
+        return rwin32.FormatError(errno)
+    def gai_strerror_str(errno):
+        return rwin32.FormatError(errno)
 else:
     socket_strerror_str = os.strerror
+    def gai_strerror_str(errno):
+        return rffi.charp2str(gai_strerror(errno))

Modified: pypy/trunk/pypy/rlib/rmmap.py
==============================================================================
--- pypy/trunk/pypy/rlib/rmmap.py	(original)
+++ pypy/trunk/pypy/rlib/rmmap.py	Sun Mar 21 12:14:30 2010
@@ -32,9 +32,10 @@
 class CConfig:
     _compilation_info_ = ExternalCompilationInfo(
         includes=includes,
-        pre_include_bits=['#ifndef _GNU_SOURCE\n' +
-                          '#define _GNU_SOURCE\n' +
-                          '#endif']
+        #pre_include_bits=['#ifndef _GNU_SOURCE\n' +
+        #                  '#define _GNU_SOURCE\n' +
+        #                  '#endif']
+        # ^^^ _GNU_SOURCE is always defined by the ExternalCompilationInfo now
     )
     size_t = rffi_platform.SimpleType("size_t", rffi.LONG)
     off_t = rffi_platform.SimpleType("off_t", rffi.LONG)

Modified: pypy/trunk/pypy/rlib/rsocket.py
==============================================================================
--- pypy/trunk/pypy/rlib/rsocket.py	(original)
+++ pypy/trunk/pypy/rlib/rsocket.py	Sun Mar 21 12:14:30 2010
@@ -1040,8 +1040,7 @@
 class GAIError(SocketErrorWithErrno):
     applevelerrcls = 'gaierror'
     def get_msg(self):
-        # this method may be patched below
-        return rffi.charp2str(_c.gai_strerror(self.errno))
+        return _c.gai_strerror_str(self.errno)
 
 class HSocketError(SocketError):
     applevelerrcls = 'herror'
@@ -1334,17 +1333,3 @@
     if timeout < 0.0:
         timeout = -1.0
     defaults.timeout = timeout
-
-# _______________________________________________________________
-#
-# Patch module, for platforms without getaddrinfo / getnameinfo
-#
-
-if not getattr(_c, 'getaddrinfo', None):
-    from pypy.rlib.getaddrinfo import getaddrinfo
-    from pypy.rlib.getaddrinfo import GAIError_getmsg
-    GAIError.get_msg = GAIError_getmsg
-
-if not getattr(_c, 'getnameinfo', None):
-    from pypy.rlib.getnameinfo import getnameinfo
-    from pypy.rlib.getnameinfo import NI_NUMERICHOST, NI_NUMERICSERV

Modified: pypy/trunk/pypy/rlib/test/test_rsocket.py
==============================================================================
--- pypy/trunk/pypy/rlib/test/test_rsocket.py	(original)
+++ pypy/trunk/pypy/rlib/test/test_rsocket.py	Sun Mar 21 12:14:30 2010
@@ -281,7 +281,8 @@
             addr.get_port() == 80):
             found = True
     assert found, lst
-    py.test.raises(GAIError, getaddrinfo, 'www.very-invalidaddress.com', None)
+    e = py.test.raises(GAIError, getaddrinfo, 'www.very-invalidaddress.com', None)
+    assert isinstance(e.value.get_msg(), str)
 
 def test_getaddrinfo_codespeak():
     lst = getaddrinfo('codespeak.net', None)

Modified: pypy/trunk/pypy/rpython/lltypesystem/ll_str.py
==============================================================================
--- pypy/trunk/pypy/rpython/lltypesystem/ll_str.py	(original)
+++ pypy/trunk/pypy/rpython/lltypesystem/ll_str.py	Sun Mar 21 12:14:30 2010
@@ -1,6 +1,6 @@
 from pypy.rpython.lltypesystem.lltype import GcArray, Array, Char, malloc
 from pypy.rpython.annlowlevel import llstr
-from pypy.rlib.rarithmetic import r_uint, formatd
+from pypy.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong, formatd
 
 CHAR_ARRAY = GcArray(Char)
 
@@ -8,6 +8,12 @@
     return ll_int2dec(i)
 ll_int_str._pure_function_ = True
 
+def ll_unsigned(i):
+    if isinstance(i, r_longlong) or isinstance(i, r_ulonglong):
+        return r_ulonglong(i)
+    else:
+        return r_uint(i)
+
 def ll_int2dec(i):
     from pypy.rpython.lltypesystem.rstr import mallocstr
     temp = malloc(CHAR_ARRAY, 20)
@@ -15,9 +21,9 @@
     sign = 0
     if i < 0:
         sign = 1
-        i = r_uint(-i)
+        i = ll_unsigned(-i)
     else:
-        i = r_uint(i)
+        i = ll_unsigned(i)
     if i == 0:
         len = 1
         temp[0] = '0'
@@ -52,9 +58,9 @@
     sign = 0
     if i < 0:
         sign = 1
-        i = r_uint(-i)
+        i = ll_unsigned(-i)
     else:
-        i = r_uint(i)
+        i = ll_unsigned(i)
     if i == 0:
         len = 1
         temp[0] = '0'
@@ -94,9 +100,9 @@
     sign = 0
     if i < 0:
         sign = 1
-        i = r_uint(-i)
+        i = ll_unsigned(-i)
     else:
-        i = r_uint(i)
+        i = ll_unsigned(i)
     while i:
         temp[len] = hex_chars[i & 0x7]
         i >>= 3

Modified: pypy/trunk/pypy/rpython/module/ll_os.py
==============================================================================
--- pypy/trunk/pypy/rpython/module/ll_os.py	(original)
+++ pypy/trunk/pypy/rpython/module/ll_os.py	Sun Mar 21 12:14:30 2010
@@ -88,31 +88,17 @@
     def __init__(self):
         self.configure(CConfig)
 
-        # on some platforms, e.g. OS X Leopard, the following constants which
-        # may be defined in pyconfig.h triggers "legacy" behaviour for functions
-        # like setpgrp():
-        #
-        #   _POSIX_C_SOURCE 200112L
-        #   _XOPEN_SOURCE 600
-        #   _DARWIN_C_SOURCE 1
-        #
-        # since the translation currently includes pyconfig.h, the checkcompiles
-        # call below include the pyconfig.h file so that the same behaviour is
-        # present in both the check and the final translation...
-
         if hasattr(os, 'getpgrp'):
             self.GETPGRP_HAVE_ARG = platform.checkcompiles(
                 "getpgrp(0)",
-                '#include "pyconfig.h"\n#include <unistd.h>',
-                [platform.get_python_include_dir()]
-                )
+                '#include <unistd.h>',
+                [])
 
         if hasattr(os, 'setpgrp'):
             self.SETPGRP_HAVE_ARG = platform.checkcompiles(
                 "setpgrp(0,0)",
-                '#include "pyconfig.h"\n#include <unistd.h>',
-                [platform.get_python_include_dir()]
-                )
+                '#include <unistd.h>',
+                [])
 
         # we need an indirection via c functions to get macro calls working on llvm XXX still?
         if hasattr(os, 'WCOREDUMP'):

Modified: pypy/trunk/pypy/rpython/module/ll_os_stat.py
==============================================================================
--- pypy/trunk/pypy/rpython/module/ll_os_stat.py	(original)
+++ pypy/trunk/pypy/rpython/module/ll_os_stat.py	Sun Mar 21 12:14:30 2010
@@ -136,7 +136,8 @@
 
 compilation_info = ExternalCompilationInfo(
     # This must be set to 64 on some systems to enable large file support.
-    pre_include_bits = ['#define _FILE_OFFSET_BITS 64'],
+    #pre_include_bits = ['#define _FILE_OFFSET_BITS 64'],
+    # ^^^ nowadays it's always set in all C files we produce.
     includes = INCLUDES
 )
 

Modified: pypy/trunk/pypy/rpython/module/ll_time.py
==============================================================================
--- pypy/trunk/pypy/rpython/module/ll_time.py	(original)
+++ pypy/trunk/pypy/rpython/module/ll_time.py	Sun Mar 21 12:14:30 2010
@@ -15,7 +15,8 @@
     TIME_H = 'time.h'
     FTIME = '_ftime64'
     STRUCT_TIMEB = 'struct __timeb64'
-    includes = [TIME_H, 'windows.h', 'sys/types.h', 'sys/timeb.h']
+    includes = ['winsock2.h', 'windows.h',
+                TIME_H, 'sys/types.h', 'sys/timeb.h']
 else:
     TIME_H = 'sys/time.h'
     FTIME = 'ftime'

Modified: pypy/trunk/pypy/rpython/test/test_rint.py
==============================================================================
--- pypy/trunk/pypy/rpython/test/test_rint.py	(original)
+++ pypy/trunk/pypy/rpython/test/test_rint.py	Sun Mar 21 12:14:30 2010
@@ -1,3 +1,4 @@
+import py
 import sys, operator
 from pypy.translator.translator import TranslationContext
 from pypy.annotation import model as annmodel
@@ -105,6 +106,16 @@
         res = self.ll_to_string(res)
         assert res == '-' + oct(sys.maxint+1).replace('L', '').replace('l', '')
 
+    def test_str_of_longlong(self):
+        def f(i):
+            return str(i)
+
+        res = self.interpret(f, [r_longlong(0)])
+        assert self.ll_to_string(res) == '0'
+
+        res = self.interpret(f, [r_longlong(413974738222117)])
+        assert self.ll_to_string(res) == '413974738222117'
+
     def test_unsigned(self):
         bigvalue = sys.maxint + 17
         def dummy(i):

Modified: pypy/trunk/pypy/rpython/tool/rffi_platform.py
==============================================================================
--- pypy/trunk/pypy/rpython/tool/rffi_platform.py	(original)
+++ pypy/trunk/pypy/rpython/tool/rffi_platform.py	Sun Mar 21 12:14:30 2010
@@ -8,7 +8,6 @@
 from pypy.translator.tool.cbuild import ExternalCompilationInfo
 from pypy.translator.platform import CompilationError
 from pypy.tool.udir import udir
-import distutils
 
 # ____________________________________________________________
 #
@@ -18,7 +17,7 @@
     if include_dirs is None:
         include_dirs = []
     return ExternalCompilationInfo(
-        pre_include_bits=[c_header_source],
+        post_include_bits=[c_header_source],
         include_dirs=include_dirs
     )
 
@@ -563,11 +562,6 @@
 
 # ____________________________________________________________
 
-def get_python_include_dir():
-    from distutils import sysconfig
-    gcv = sysconfig.get_config_vars()
-    return gcv.get('INCLUDEPY', '.') # this is for running on top of pypy-c
-
 def configure_external_library(name, eci, configurations,
                                symbol=None, _cache={}):
     """try to find the external library.

Modified: pypy/trunk/pypy/translator/c/gcc/trackgcroot.py
==============================================================================
--- pypy/trunk/pypy/translator/c/gcc/trackgcroot.py	(original)
+++ pypy/trunk/pypy/translator/c/gcc/trackgcroot.py	Sun Mar 21 12:14:30 2010
@@ -331,6 +331,11 @@
                     label = label2
         if label is None:
             k = call.lineno
+            if self.format == 'msvc':
+                # Some header files (ws2tcpip.h) define STDCALL functions
+                funcname = self.funcname.split('@')[0]
+            else:
+                funcname = self.funcname
             while 1:
                 label = '__gcmap_%s__%s_%d' % (self.filetag, self.funcname, k)
                 if label not in self.labels:

Modified: pypy/trunk/pypy/translator/c/genc.py
==============================================================================
--- pypy/trunk/pypy/translator/c/genc.py	(original)
+++ pypy/trunk/pypy/translator/c/genc.py	Sun Mar 21 12:14:30 2010
@@ -115,12 +115,8 @@
         self.eci = self.get_eci()
 
     def get_eci(self):
-        from distutils import sysconfig
-        python_inc = sysconfig.get_python_inc() # XXX refactor remaining dependencies
-                                                # like obmalloc into separately compilable
-                                                # modules etc.
         pypy_include_dir = py.path.local(autopath.pypydir).join('translator', 'c')
-        include_dirs = [python_inc, pypy_include_dir]
+        include_dirs = [pypy_include_dir]
         return ExternalCompilationInfo(include_dirs=include_dirs)
 
     def build_database(self):
@@ -306,6 +302,12 @@
     _module = None
     _wrapper = None
 
+    def get_eci(self):
+        from distutils import sysconfig
+        python_inc = sysconfig.get_python_inc()
+        eci = ExternalCompilationInfo(include_dirs=[python_inc])
+        return eci.merge(CBuilder.get_eci(self))
+
     def getentrypointptr(self): # xxx
         if self._wrapper is None:
             self._wrapper = new_wrapper(self.entrypoint, self.translator)
@@ -740,16 +742,7 @@
         print >> f
 
 
-def gen_size_check(f):
-    from pypy.rlib.rarithmetic import LONG_BIT
-    print >> f, '#if 8 * SIZEOF_LONG != %d' % (LONG_BIT,)
-    print >> f, '#  error "C files are generated for a %d-bit platform"' % (
-        LONG_BIT,)
-    print >> f, '#endif'
-    print >> f
-
 def gen_structdef(f, database):
-    gen_size_check(f)
     structdeflist = database.getstructdeflist()
     print >> f, '/***********************************************************/'
     print >> f, '/***  Structure definitions                              ***/'
@@ -835,6 +828,10 @@
     print >> f, '\treturn error;'
     print >> f, '}'
 
+def commondefs(defines):
+    from pypy.rlib.rarithmetic import LONG_BIT
+    defines['PYPY_LONG_BIT'] = LONG_BIT
+
 def gen_source_standalone(database, modulename, targetdir, eci,
                           entrypointname, defines={}): 
     assert database.standalone
@@ -850,16 +847,11 @@
     #
     print >> f, '#include "common_header.h"'
     print >> f
+    commondefs(defines)
     defines['PYPY_STANDALONE'] = entrypointname
     for key, value in defines.items():
         print >> fi, '#define %s %s' % (key, value)
 
-    if sys.platform == 'win32':
-        print >> fi, '#define Py_BUILD_CORE /* avoid pulling python libs in */'
-        print >> fi, '#define WIN32_LEAN_AND_MEAN /* winsock/winsock2 mess */'
-
-    print >> fi, '#include "pyconfig.h"'
-
     eci.write_c_header(fi)
     print >> fi, '#include "src/g_prerequisite.h"'
 
@@ -907,14 +899,10 @@
     #
     print >> f, '#include "common_header.h"'
     print >> f
+    commondefs(defines)
     for key, value in defines.items():
         print >> fi, '#define %s %s' % (key, value)
 
-    if sys.platform == 'win32':
-        print >> fi, '#define WIN32_LEAN_AND_MEAN /* winsock/winsock2 mess */'
-
-    print >> fi, '#include "pyconfig.h"'
-
     eci.write_c_header(fi)
     print >> fi, '#include "src/g_prerequisite.h"'
 

Modified: pypy/trunk/pypy/translator/c/src/g_include.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/g_include.h	(original)
+++ pypy/trunk/pypy/translator/c/src/g_include.h	Sun Mar 21 12:14:30 2010
@@ -54,9 +54,6 @@
 #ifndef AVR
 #  include "src/ll_os.h"
 #  include "src/ll_strtod.h"
-#  ifdef RPyExc_thread_error
-#    include "src/ll_thread.h"
-#  endif
 #endif
 #endif
 

Modified: pypy/trunk/pypy/translator/c/src/g_prerequisite.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/g_prerequisite.h	(original)
+++ pypy/trunk/pypy/translator/c/src/g_prerequisite.h	Sun Mar 21 12:14:30 2010
@@ -2,19 +2,18 @@
 /**************************************************************/
 /***  this is included before any code produced by genc.py  ***/
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE  /* this must be defined before including other headers
-                        in order to get a few extra functions like mremap() */
-#endif
 
-/* XXX for now we always include Python.h even to produce stand-alone
- * executables (which are *not* linked against CPython then),
- * to get the convenient macro definitions
- */
-#ifndef AVR
-#include "Python.h"
+#ifdef PYPY_STANDALONE
+#  include "src/commondefs.h"
+#else
+#  include "Python.h"
+#endif
 
+#ifdef _WIN32
+#  include <io.h>   /* needed, otherwise _lseeki64 truncates to 32-bits (??) */
+#endif
 
+#ifndef AVR
 #include "thread.h"   /* needs to be included early to define the
                          struct RPyOpaque_ThreadLock */
 #endif

Modified: pypy/trunk/pypy/translator/c/src/main.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/main.h	(original)
+++ pypy/trunk/pypy/translator/c/src/main.h	Sun Mar 21 12:14:30 2010
@@ -23,6 +23,12 @@
 
     instrument_setup();
 
+    if (sizeof(void*) != SIZEOF_LONG) {
+        errmsg = "only support platforms where sizeof(void*) == sizeof(long),"
+                 " for now";
+        goto error;
+    }
+
     errmsg = RPython_StartupCode();
     if (errmsg) goto error;
 

Modified: pypy/trunk/pypy/translator/c/src/obmalloc.c
==============================================================================
--- pypy/trunk/pypy/translator/c/src/obmalloc.c	(original)
+++ pypy/trunk/pypy/translator/c/src/obmalloc.c	Sun Mar 21 12:14:30 2010
@@ -1,4 +1,3 @@
-#include "Python.h"
 
 #ifdef WITH_PYMALLOC
 

Modified: pypy/trunk/pypy/translator/c/src/stack.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/stack.h	(original)
+++ pypy/trunk/pypy/translator/c/src/stack.h	Sun Mar 21 12:14:30 2010
@@ -7,7 +7,8 @@
 #endif
 
 /* This include must be done in any case to initialise
- * the header dependencies early (thread -> winsock2, before windows.h) */
+ * the header dependencies early (winsock2, before windows.h).
+ * It is needed to have RPyThreadStaticTLS, too. */
 #include "thread.h"
 
 void LL_stack_unwind(void);

Modified: pypy/trunk/pypy/translator/c/src/support.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/support.h	(original)
+++ pypy/trunk/pypy/translator/c/src/support.h	Sun Mar 21 12:14:30 2010
@@ -2,6 +2,7 @@
 /************************************************************/
  /***  C header subsection: support functions              ***/
 
+#include <stdio.h>
 
 /*** misc ***/
 

Modified: pypy/trunk/pypy/translator/c/src/thread.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/thread.h	(original)
+++ pypy/trunk/pypy/translator/c/src/thread.h	Sun Mar 21 12:14:30 2010
@@ -9,20 +9,13 @@
 #include "thread_nt.h"
 #else
 
-#include <unistd.h>
-
-#ifndef _POSIX_THREADS
-/* This means pthreads are not implemented in libc headers, hence the macro
-   not present in unistd.h. But they still can be implemented as an external
-   library (e.g. gnu pth in pthread emulation) */
-# ifdef HAVE_PTHREAD_H
-#  include <pthread.h> /* _POSIX_THREADS */
-# endif
-#endif
-
-#ifdef _POSIX_THREADS
+/* We should check if unistd.h defines _POSIX_THREADS, but sometimes
+   it is not defined even though the system implements them as an
+   external library (e.g. gnu pth in pthread emulation).  So we just
+   always go ahead and use them, assuming they are supported on all
+   platforms for which we care.  If not, do some detecting again.
+*/
 #include "thread_pthread.h"
-#endif
 
 #endif /* !_WIN32 */
 

Modified: pypy/trunk/pypy/translator/c/src/thread_pthread.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/thread_pthread.h	(original)
+++ pypy/trunk/pypy/translator/c/src/thread_pthread.h	Sun Mar 21 12:14:30 2010
@@ -1,10 +1,24 @@
 
 /* Posix threads interface (from CPython) */
 
+/* XXX needs to detect HAVE_BROKEN_POSIX_SEMAPHORES properly; currently
+   it is set only if _POSIX_SEMAPHORES == -1.  Seems to be only for
+   SunOS/5.8 and AIX/5.
+*/
+
+#include <unistd.h>   /* for the _POSIX_xxx and _POSIX_THREAD_xxx defines */
+#include <stdlib.h>
 #include <pthread.h>
+#include <signal.h>
 #include <stdio.h>
 #include <errno.h>
 
+/* The following is hopefully equivalent to what CPython does
+   (which is trying to compile a snippet of code using it) */
+#ifdef PTHREAD_SCOPE_SYSTEM
+#  define PTHREAD_SYSTEM_SCHED_SUPPORTED
+#endif
+
 /* The POSIX spec says that implementations supporting the sem_*
    family of functions must indicate this by defining
    _POSIX_SEMAPHORES. */   
@@ -114,11 +128,11 @@
 	volatile pthread_t threadid;
 	/* Jump through some hoops for Alpha OSF/1 */
 	threadid = pthread_self();
-#if SIZEOF_PTHREAD_T <= SIZEOF_LONG
-	return (long) threadid;
-#else
-	return (long) *(long *) &threadid;
-#endif
+
+	if (sizeof(pthread_t) <= sizeof(long))
+		return (long) threadid;
+	else
+		return (long) *(long *) &threadid;
 }
 
 static long _pypythread_stacksize = 0;
@@ -171,11 +185,10 @@
 
         pthread_detach(th);
 
-#if SIZEOF_PTHREAD_T <= SIZEOF_LONG
-	return (long) th;
-#else
-	return (long) *(long *) &th;
-#endif
+	if (sizeof(pthread_t) <= sizeof(long))
+		return (long) th;
+	else
+		return (long) *(long *) &th;
 }
 
 long RPyThreadGetStackSize(void)

Modified: pypy/trunk/pypy/translator/c/test/test_dlltool.py
==============================================================================
--- pypy/trunk/pypy/translator/c/test/test_dlltool.py	(original)
+++ pypy/trunk/pypy/translator/c/test/test_dlltool.py	Sun Mar 21 12:14:30 2010
@@ -2,6 +2,7 @@
 from pypy.translator.c.dlltool import DLLDef
 from ctypes import CDLL
 import py
+py.test.skip("fix this if needed")
 
 class TestDLLTool(object):
     def test_basic(self):

Modified: pypy/trunk/pypy/translator/c/test/test_math.py
==============================================================================
--- pypy/trunk/pypy/translator/c/test/test_math.py	(original)
+++ pypy/trunk/pypy/translator/c/test/test_math.py	Sun Mar 21 12:14:30 2010
@@ -1,6 +1,6 @@
 import py, math
 from pypy.module.math.test import test_direct
-from pypy.translator.c.test.test_genc import compile
+from pypy.translator.c.test.test_standalone import StandaloneTests
 
 
 def get_test_case((fnname, args, expected)):
@@ -25,18 +25,30 @@
 
 testfnlist = [get_test_case(testcase)
               for testcase in test_direct.MathTests.TESTCASES]
+reprlist = [repr(testcase)
+            for testcase in test_direct.MathTests.TESTCASES]
 
-def fn():
+def fn(args):
+    err = False
     for i in range(len(testfnlist)):
         testfn = testfnlist[i]
         if not testfn():
-            return i
-    return -42  # ok
+            print "error:", reprlist[i]
+            err = True
+    if not err:
+        print "all ok"
+    return 0
 
-def test_math():
-    f = compile(fn, [])
-    res = f()
-    if res >= 0:
-        py.test.fail(repr(test_direct.MathTests.TESTCASES[res]))
-    else:
-        assert res == -42
+
+class TestMath(StandaloneTests):
+
+    def test_math(self, debug=True):
+        t, cbuilder = self.compile(fn, debug=debug)
+        data = cbuilder.cmdexec('')
+        if "error:" in data:
+            py.test.fail(data.strip())
+        else:
+            assert "all ok" in data
+
+    def test_math_nodebug(self):
+        self.test_math(debug=False)

Modified: pypy/trunk/pypy/translator/c/test/test_standalone.py
==============================================================================
--- pypy/trunk/pypy/translator/c/test/test_standalone.py	(original)
+++ pypy/trunk/pypy/translator/c/test/test_standalone.py	Sun Mar 21 12:14:30 2010
@@ -205,16 +205,13 @@
         #py.process.cmdexec(exe)
 
     def test_standalone_large_files(self):
-        from pypy.module.posix.test.test_posix2 import need_sparse_files
-        need_sparse_files()
         filename = str(udir.join('test_standalone_largefile'))
         r4800000000 = r_longlong(4800000000L)
         def entry_point(argv):
             fd = os.open(filename, os.O_RDWR | os.O_CREAT, 0644)
             os.lseek(fd, r4800000000, 0)
-            os.write(fd, "$")
             newpos = os.lseek(fd, 0, 1)
-            if newpos == r4800000000 + 1:
+            if newpos == r4800000000:
                 print "OK"
             else:
                 print "BAD POS"
@@ -674,7 +671,10 @@
         def entry_point(argv):
             os.write(1, "hello world\n")
             error = ll_thread.set_stacksize(int(argv[1]))
-            assert error == 0
+            if error != 0:
+                os.write(2, "set_stacksize(%d) returned %d\n" % (
+                    int(argv[1]), error))
+                raise AssertionError
             # malloc a bit
             s1 = State(); s2 = State(); s3 = State()
             s1.x = 0x11111111; s2.x = 0x22222222; s3.x = 0x33333333

Modified: pypy/trunk/pypy/translator/tool/cbuild.py
==============================================================================
--- pypy/trunk/pypy/translator/tool/cbuild.py	(original)
+++ pypy/trunk/pypy/translator/tool/cbuild.py	Sun Mar 21 12:14:30 2010
@@ -225,6 +225,7 @@
         return ExternalCompilationInfo(**attrs)
 
     def write_c_header(self, fileobj):
+        print >> fileobj, STANDARD_DEFINES
         for piece in self.pre_include_bits:
             print >> fileobj, piece
         for path in self.includes:
@@ -254,8 +255,6 @@
             f = filename.open("w")
             if being_main:
                 f.write("#define PYPY_NOT_MAIN_FILE\n")
-            if sys.platform == 'win32':
-                f.write("#define WIN32_LEAN_AND_MEAN\n")
             self.write_c_header(f)
             source = str(source)
             f.write(source)
@@ -292,3 +291,28 @@
         d['separate_module_files'] = ()
         d['separate_module_sources'] = ()
         return ExternalCompilationInfo(**d)
+
+
+# ____________________________________________________________
+#
+# This is extracted from pyconfig.h from CPython.  It sets the macros
+# that affect the features we get from system include files.
+
+STANDARD_DEFINES = '''
+/* Define on Darwin to activate all library features */
+#define _DARWIN_C_SOURCE 1
+/* This must be set to 64 on some systems to enable large file support. */
+#define _FILE_OFFSET_BITS 64
+/* Define on Linux to activate all library features */
+#define _GNU_SOURCE 1
+/* This must be defined on some systems to enable large file support. */
+#define _LARGEFILE_SOURCE 1
+/* Define on NetBSD to activate all library features */
+#define _NETBSD_SOURCE 1
+/* Define to activate features from IEEE Stds 1003.1-2001 */
+#define _POSIX_C_SOURCE 200112L
+/* Define on FreeBSD to activate all library features */
+#define __BSD_VISIBLE 1
+/* Windows: winsock/winsock2 mess */
+#define WIN32_LEAN_AND_MEAN
+'''



More information about the Pypy-commit mailing list