[pypy-svn] r46743 - in pypy/dist/pypy: annotation rlib rlib/test rpython rpython/lltypesystem

arigo at codespeak.net arigo at codespeak.net
Wed Sep 19 18:59:43 CEST 2007


Author: arigo
Date: Wed Sep 19 18:59:40 2007
New Revision: 46743

Modified:
   pypy/dist/pypy/annotation/policy.py
   pypy/dist/pypy/rlib/rsocket_rffi.py
   pypy/dist/pypy/rlib/test/test_rsocket_rffi.py
   pypy/dist/pypy/rpython/annlowlevel.py
   pypy/dist/pypy/rpython/lltypesystem/rffi.py
Log:
* A few tests pass!
* Added a new specialization policy: ll_and_arg(n), which uses
  the ll specialization rules but in addition specializes for
  the value of the argument n.


Modified: pypy/dist/pypy/annotation/policy.py
==============================================================================
--- pypy/dist/pypy/annotation/policy.py	(original)
+++ pypy/dist/pypy/annotation/policy.py	Wed Sep 19 18:59:40 2007
@@ -89,6 +89,10 @@
         from pypy.rpython.annlowlevel import LowLevelAnnotatorPolicy
         return LowLevelAnnotatorPolicy.default_specialize(*args)
 
+    def specialize__ll_and_arg(pol, *args):
+        from pypy.rpython.annlowlevel import LowLevelAnnotatorPolicy
+        return LowLevelAnnotatorPolicy.specialize__ll_and_arg(*args)
+
     def override__ignore(pol, *args):
         bk = getbookkeeper()
         return bk.immutablevalue(None)

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 18:59:40 2007
@@ -20,6 +20,10 @@
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rpython.lltypesystem.rffi import sizeof
 
+def castto(example, value):
+    return rffi.cast(lltype.typeOf(example), value)
+castto._annspecialcase_ = 'specialize:ll'
+
 
 constants = _c.constants
 locals().update(constants) # Define constants from _c
@@ -49,10 +53,6 @@
     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
@@ -82,7 +82,7 @@
         """Convert the address to an app-level object."""
         # If we don't know the address family, don't raise an
         # exception -- return it as a tuple.
-        family = self.addr.c_sa_family
+        family = rffi.cast(lltype.Signed, self.addr.c_sa_family)
         datalen = self.addrlen - llmemory.offsetof(_c.sockaddr, 'c_sa_data')
         rawdata = ''.join([self.addr.c_sa_data[i] for i in range(datalen)])
         return space.newtuple([space.wrap(family),
@@ -214,9 +214,10 @@
         result = instantiate(INETAddress)
         # store the malloc'ed data into 'result' as soon as possible
         # to avoid leaks if an exception occurs inbetween
-        sin = rffi.make(_c.sockaddr_in, c_sin_family = AF_INET)
+        sin = rffi.make(_c.sockaddr_in)
         result.setdata(sin, sizeof(_c.sockaddr_in))
         # PLAT sin_len
+        rffi.setintfield(sin, 'c_sin_family', AF_INET)
         rffi.structcopy(sin.c_sin_addr, in_addr)
         return result
     from_in_addr = staticmethod(from_in_addr)
@@ -312,8 +313,9 @@
         result = instantiate(INET6Address)
         # store the malloc'ed data into 'result' as soon as possible
         # to avoid leaks if an exception occurs inbetween
-        sin = rffi.make(_c.sockaddr_in6, c_sin6_family = AF_INET)
+        sin = rffi.make(_c.sockaddr_in6)
         result.setdata(sin, sizeof(_c.sockaddr_in6))
+        rffi.setintfield(sin, 'c_sin6_family', AF_INET)
         rffi.structcopy(sin.c_sin6_addr, in6_addr)
         return result
     from_in6_addr = staticmethod(from_in6_addr)
@@ -447,9 +449,10 @@
         result = instantiate(INETAddress)
     elif result.family != AF_INET:
         raise RSocketError("address family mismatched")
-    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))
+    sin = rffi.make(_c.sockaddr_in)
+    result.setdata(sin, sizeof(_c.sockaddr_in))
+    rffi.setintfield(sin, 'c_sin_family', AF_INET)   # PLAT sin_len
+    rffi.setintfield(sin.c_sin_addr, 'c_s_addr', s_addr)
     return result
 
 def make_null_address(family):

Modified: pypy/dist/pypy/rlib/test/test_rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/test/test_rsocket_rffi.py	(original)
+++ pypy/dist/pypy/rlib/test/test_rsocket_rffi.py	Wed Sep 19 18:59:40 2007
@@ -1,5 +1,4 @@
 import py, errno, sys
-py.test.skip("in-progress")
 from pypy.rlib import rsocket_rffi as rsocket
 from pypy.rlib.rsocket_rffi import *
 
@@ -21,12 +20,14 @@
     assert res == "<INETAddress 255.255.255.255:47002>"
 
 def test_unix_addr():
+    py.test.skip("in-progress")
     if getattr(rsocket, 'AF_UNIX', None) is None:
         py.test.skip('AF_UNIX not supported.')
     a = UNIXAddress("/tmp/socketname")
     assert a.get_path() == "/tmp/socketname"
 
 def test_netlink_addr():
+    py.test.skip("in-progress")
     if getattr(rsocket, 'AF_NETLINK', None) is None:
         py.test.skip('AF_NETLINK not supported.')
     pid = 1
@@ -36,6 +37,7 @@
     assert a.get_groups() == group_mask
     
 def test_gethostname():
+    py.test.skip("in-progress")
     s = gethostname()
     assert isinstance(s, str)
 
@@ -45,6 +47,7 @@
     assert a.get_host() == "127.0.0.1"
 
 def test_socketpair():
+    py.test.skip("in-progress")
     if sys.platform == "win32":
         py.test.skip('No socketpair on Windows')
     s1, s2 = socketpair()
@@ -59,6 +62,7 @@
     s2.close()
 
 def test_simple_tcp():
+    py.test.skip("in-progress")
     import thread
     sock = RSocket()
     try_ports = [1023] + range(20000, 30000, 437)
@@ -97,6 +101,7 @@
     s2.close()
 
 def test_simple_udp():
+    py.test.skip("in-progress")
     s1 = RSocket(AF_INET, SOCK_DGRAM)
     try_ports = [1023] + range(20000, 30000, 437)
     for port in try_ports:
@@ -128,6 +133,7 @@
     s2.close()
 
 def test_nonblocking():
+    py.test.skip("in-progress")
     sock = RSocket()
     sock.setblocking(False)
     try_ports = [1023] + range(20000, 30000, 437)
@@ -204,6 +210,7 @@
     assert found, lst
 
 def test_getaddrinfo_no_reverse_lookup():
+    py.test.skip("in-progress")
     # It seems that getaddrinfo never runs a reverse lookup on Linux.
     # Python2.3 on Windows returns the hostname.
     lst = getaddrinfo('134.99.112.214', None, flags=AI_CANONNAME)
@@ -216,6 +223,7 @@
     assert found, lst
 
 def test_connect_ex():
+    py.test.skip("in-progress")
     s = RSocket()
     err = s.connect_ex(INETAddress('0.0.0.0', 0))   # should not work
     assert err in (errno.ECONNREFUSED, errno.EADDRNOTAVAIL)
@@ -251,6 +259,7 @@
     assert reuseptr[0] != 0
 
 def test_dup():
+    py.test.skip("in-progress")
     if sys.platform == "win32":
         skip("dup does not work on Windows")
     s = RSocket(AF_INET, SOCK_STREAM)
@@ -261,6 +270,7 @@
     assert s.getsockname().eq(s2.getsockname())
 
 def test_inet_aton():
+    py.test.skip("in-progress")
     assert inet_aton('1.2.3.4') == '\x01\x02\x03\x04'
     assert inet_aton('127.0.0.1') == '\x7f\x00\x00\x01'
     tests = ["127.0.0.256", "127.0.0.255555555555555555", "127.2b.0.0",
@@ -281,6 +291,7 @@
     HOST = 'localhost'
 
     def setup_method(self, method):
+        py.test.skip("in-progress")
         self.serv = RSocket(AF_INET, SOCK_STREAM)
         self.serv.setsockopt_int(SOL_SOCKET, SO_REUSEADDR, 1)
         self.serv.bind(INETAddress(self.HOST, self.PORT))

Modified: pypy/dist/pypy/rpython/annlowlevel.py
==============================================================================
--- pypy/dist/pypy/rpython/annlowlevel.py	(original)
+++ pypy/dist/pypy/rpython/annlowlevel.py	Wed Sep 19 18:59:40 2007
@@ -38,11 +38,14 @@
     def __init__(pol, rtyper=None):
         pol.rtyper = rtyper
 
-    def default_specialize(funcdesc, args_s):
+    def lowlevelspecialize(funcdesc, args_s, key_for_args):
         key = []
         new_args_s = []
-        for s_obj in args_s:
-            if isinstance(s_obj, annmodel.SomePBC):
+        for i, s_obj in enumerate(args_s):
+            if i in key_for_args:
+                key.append(key_for_args[i])
+                new_args_s.append(s_obj)
+            elif isinstance(s_obj, annmodel.SomePBC):
                 assert s_obj.is_constant(), "ambiguous low-level helper specialization"
                 key.append(KeyComp(s_obj.const))
                 new_args_s.append(s_obj)
@@ -57,6 +60,10 @@
         flowgraph = funcdesc.cachedgraph(tuple(key))
         args_s[:] = new_args_s
         return flowgraph
+    lowlevelspecialize = staticmethod(lowlevelspecialize)
+
+    def default_specialize(funcdesc, args_s):
+        return LowLevelAnnotatorPolicy.lowlevelspecialize(funcdesc, args_s, {})
     default_specialize = staticmethod(default_specialize)
 
     def override__init_opaque_object(pol, s_opaqueptr, s_value):
@@ -97,6 +104,14 @@
     
     specialize__ll = default_specialize
 
+    def specialize__ll_and_arg(funcdesc, args_s, *argindices):
+        keys = {}
+        for i in argindices:
+            keys[i] = args_s[i].const
+        return LowLevelAnnotatorPolicy.lowlevelspecialize(funcdesc, args_s,
+                                                          keys)
+    specialize__ll_and_arg = staticmethod(specialize__ll_and_arg)
+
 def annotate_lowlevel_helper(annotator, ll_function, args_s, policy=None):
     if policy is None:
         policy= LowLevelAnnotatorPolicy()

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 18:59:40 2007
@@ -391,3 +391,16 @@
     else:
         raise NotImplementedError('structcopy: type %r' % (PDST.TO,))
 _get_structcopy_fn._annspecialcase_ = 'specialize:memo'
+
+
+def setintfield(pdst, fieldname, value):
+    """Maybe temporary: a helper to set an integer field into a structure,
+    transparently casting between the various integer types.
+    """
+    STRUCT = lltype.typeOf(pdst).TO
+    TSRC = lltype.typeOf(value)
+    TDST = getattr(STRUCT, fieldname)
+    assert isinstance(TSRC, lltype.Number)
+    assert isinstance(TDST, lltype.Number)
+    setattr(pdst, fieldname, cast(TDST, value))
+setintfield._annspecialcase_ = 'specialize:ll_and_arg(1)'



More information about the Pypy-commit mailing list