[pypy-svn] r46737 - in pypy/dist/pypy: rlib rpython/lltypesystem rpython/tool

arigo at codespeak.net arigo at codespeak.net
Wed Sep 19 17:27:10 CEST 2007


Author: arigo
Date: Wed Sep 19 17:27:10 2007
New Revision: 46737

Modified:
   pypy/dist/pypy/rlib/_rsocket_rffi.py
   pypy/dist/pypy/rlib/rsocket_rffi.py
   pypy/dist/pypy/rpython/lltypesystem/rffi.py
   pypy/dist/pypy/rpython/tool/rffi_platform.py
Log:
Minor progress.  I check this in while despairing about the
quantity of integer casts that might be needed...


Modified: pypy/dist/pypy/rlib/_rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/_rsocket_rffi.py	(original)
+++ pypy/dist/pypy/rlib/_rsocket_rffi.py	Wed Sep 19 17:27:10 2007
@@ -402,7 +402,8 @@
                             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)
+                           size_t, CCHARP, size_t, rffi.INT], rffi.INT,
+                           stringpolicy='noauto')
 
 htonl = external('htonl', [rffi.UINT], rffi.UINT)
 htons = external('htons', [rffi.USHORT], rffi.USHORT)

Modified: pypy/dist/pypy/rlib/rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/rsocket_rffi.py	(original)
+++ pypy/dist/pypy/rlib/rsocket_rffi.py	Wed Sep 19 17:27:10 2007
@@ -18,7 +18,7 @@
 from pypy.rlib import _rsocket_rffi as _c
 from pypy.rlib.rarithmetic import intmask
 from pypy.rpython.lltypesystem import lltype, rffi
-from pypy.rpython.lltypesystem.llmemory import sizeof
+from pypy.rpython.lltypesystem.rffi import sizeof
 
 
 constants = _c.constants
@@ -49,6 +49,10 @@
     class __metaclass__(type):
         def __new__(cls, name, bases, dict):
             family = dict.get('family')
+            if family is not None:
+                # lltype is picky about types...
+                family = rffi.cast(_c.sockaddr.c_sa_family, family)
+                dict['family'] = family
             A = type.__new__(cls, name, bases, dict)
             if family is not None:
                 _FAMILIES[family] = A
@@ -69,6 +73,7 @@
     def setdata(self, addr, addrlen):
         # initialize self.addr and self.addrlen.  'addr' can be a different
         # pointer type than exactly sockaddr_ptr, and we cast it for you.
+        assert not self.addr
         self.addr = rffi.cast(_c.sockaddr_ptr, addr)
         self.addrlen = addrlen
     setdata._annspecialcase_ = 'specialize:ll'
@@ -386,7 +391,7 @@
             addr = _c.sockaddr_nl(nl_family = AF_NETLINK)
             addr.nl_pid = pid
             addr.nl_groups = groups
-            self._addr_keepalive_netlink = addr
+            XXX; self._addr_keepalive_netlink = addr
             self.addr = cast(pointer(addr), _c.sockaddr_ptr).contents
             self.addrlen = sizeof(addr)
 
@@ -428,10 +433,13 @@
         result = instantiate(familyclass(family))
     elif result.family != family:
         raise RSocketError("address family mismatched")
-    ...
-    paddr = result._addr_keepalive0 = copy_buffer(cast(addrptr, POINTER(c_char)), addrlen)
-    result.addr = cast(paddr, _c.sockaddr_ptr).contents
-    result.addrlen = addrlen
+    # copy into a new buffer the address that 'addrptr' points to
+    addrlen = rffi.cast(lltype.Signed, addrlen)
+    buf = lltype.malloc(rffi.CCHARP.TO, addrlen, flavor='raw')
+    src = rffi.cast(rffi.CCHARP, addrptr)
+    for i in range(addrlen):
+        buf[i] = src[i]
+    result.setdata(buf, addrlen)
     return result
 
 def makeipv4addr(s_addr, result=None):
@@ -439,19 +447,16 @@
         result = instantiate(INETAddress)
     elif result.family != AF_INET:
         raise RSocketError("address family mismatched")
-    sin = _c.sockaddr_in(sin_family = AF_INET)   # PLAT sin_len
-    sin.sin_addr.s_addr = s_addr
-    paddr = cast(pointer(sin), _c.sockaddr_ptr)
-    result._addr_keepalive1 = sin
-    result.addr = paddr.contents
-    result.addrlen = sizeof(_c.sockaddr_in)
+    sin = rffi.make(_c.sockaddr_in, c_sin_family = AF_INET)   # PLAT sin_len
+    sin.c_sin_addr.s_addr = s_addr
+    result.setaddr(sin, sizeof(_c.sockaddr_in))
     return result
 
 def make_null_address(family):
     klass = familyclass(family)
     buf = create_string_buffer(klass.maxlen)
     result = instantiate(klass)
-    result._addr_keepalive2 = buf
+    XXX; result._addr_keepalive2 = buf
     result.addr = cast(buf, _c.sockaddr_ptr).contents
     result.addrlen = 0
     return result, len(buf)
@@ -1001,6 +1006,7 @@
                            canonname,
                            addr))
             info = info.c_ai_next
+            address_to_fill = None    # don't fill the same address repeatedly
     finally:
         _c.freeaddrinfo(res)
     return result
@@ -1024,14 +1030,20 @@
     return protoent.contents.p_proto
 
 def getnameinfo(addr, flags):
-    host = create_string_buffer(NI_MAXHOST)
-    serv = create_string_buffer(NI_MAXSERV)
-    error =_c.getnameinfo(pointer(addr.addr), addr.addrlen,
-                          host, len(host),
-                          serv, len(serv), flags)
-    if error:
-        raise GAIError(error)
-    return host.value, serv.value
+    host = lltype.malloc(rffi.CCHARP.TO, NI_MAXHOST, flavor='raw')
+    try:
+        serv = lltype.malloc(rffi.CCHARP.TO, NI_MAXSERV, flavor='raw')
+        try:
+            error =_c.getnameinfo(addr.addr, addr.addrlen,
+                                  host, NI_MAXHOST,
+                                  serv, NI_MAXSERV, flags)
+            if error:
+                raise GAIError(error)
+            return rffi.charp2str(host), rffi.charp2str(serv)
+        finally:
+            lltype.free(serv, flavor='raw')
+    finally:
+        lltype.free(host, flavor='raw')
 
 if hasattr(_c, 'inet_aton'):
     def inet_aton(ip):

Modified: pypy/dist/pypy/rpython/lltypesystem/rffi.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rffi.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rffi.py	Wed Sep 19 17:27:10 2007
@@ -311,11 +311,14 @@
     return size, unsigned
 
 def sizeof(tp):
-    # XXX see also llmemory.sizeof() for the symbolic size of structures.
-    # we could also extend the code below to return the computed size
-    # of structures as found by rffi_platform.
     if isinstance(tp, lltype.FixedSizeArray):
         return sizeof(tp.OF) * tp.length
+    if isinstance(tp, lltype.Struct):
+        # the hint is present in structures probed by rffi_platform.
+        size = tp._hints.get('size')
+        if size is None:
+            size = llmemory.sizeof(tp)    # a symbolic result in this case
+        return size
     if isinstance(tp, lltype.Ptr):
         tp = ULONG     # XXX!
     if tp is lltype.Char:

Modified: pypy/dist/pypy/rpython/tool/rffi_platform.py
==============================================================================
--- pypy/dist/pypy/rpython/tool/rffi_platform.py	(original)
+++ pypy/dist/pypy/rpython/tool/rffi_platform.py	Wed Sep 19 17:27:10 2007
@@ -421,6 +421,7 @@
 float_class = [rffi.DOUBLE]
 
 def _sizeof(tp):
+    # XXX don't use this!  internal purpose only, not really a sane logic
     if isinstance(tp, lltype.Struct):
         return sum([_sizeof(i) for i in tp._flds.values()])
     return rffi.sizeof(tp)



More information about the Pypy-commit mailing list