[pypy-svn] r75914 - in pypy/branch/fast-forward: . lib_pypy pypy/annotation pypy/annotation/test pypy/jit/backend/llsupport pypy/jit/backend/llsupport/test pypy/jit/backend/x86 pypy/module/_locale pypy/module/test_lib_pypy/ctypes_tests pypy/rpython/memory

benjamin at codespeak.net benjamin at codespeak.net
Tue Jul 6 16:18:29 CEST 2010


Author: benjamin
Date: Tue Jul  6 16:18:27 2010
New Revision: 75914

Modified:
   pypy/branch/fast-forward/   (props changed)
   pypy/branch/fast-forward/lib_pypy/__init__.py
   pypy/branch/fast-forward/pypy/annotation/model.py
   pypy/branch/fast-forward/pypy/annotation/test/test_model.py
   pypy/branch/fast-forward/pypy/jit/backend/llsupport/descr.py
   pypy/branch/fast-forward/pypy/jit/backend/llsupport/llmodel.py
   pypy/branch/fast-forward/pypy/jit/backend/llsupport/symbolic.py
   pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_descr.py
   pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_symbolic.py
   pypy/branch/fast-forward/pypy/jit/backend/x86/assembler.py
   pypy/branch/fast-forward/pypy/jit/backend/x86/regalloc.py
   pypy/branch/fast-forward/pypy/module/_locale/interp_locale.py
   pypy/branch/fast-forward/pypy/module/test_lib_pypy/ctypes_tests/   (props changed)
   pypy/branch/fast-forward/pypy/rpython/memory/lltypelayout.py
Log:
merge from trunk

Modified: pypy/branch/fast-forward/lib_pypy/__init__.py
==============================================================================
--- pypy/branch/fast-forward/lib_pypy/__init__.py	(original)
+++ pypy/branch/fast-forward/lib_pypy/__init__.py	Tue Jul  6 16:18:27 2010
@@ -1,4 +1,5 @@
 # This __init__.py shows up in PyPy's app-level standard library.
 # Let's try to prevent that confusion...
+import sys; print sys.path
 if __name__ != 'lib_pypy':
     raise ImportError, '__init__'

Modified: pypy/branch/fast-forward/pypy/annotation/model.py
==============================================================================
--- pypy/branch/fast-forward/pypy/annotation/model.py	(original)
+++ pypy/branch/fast-forward/pypy/annotation/model.py	Tue Jul  6 16:18:27 2010
@@ -34,7 +34,7 @@
 from pypy.tool.pairtype import pair, extendabletype
 from pypy.tool.tls import tlsobject
 from pypy.rlib.rarithmetic import r_uint, r_ulonglong, base_int
-from pypy.rlib.rarithmetic import r_singlefloat
+from pypy.rlib.rarithmetic import r_singlefloat, isnan
 import inspect, weakref
 
 DEBUG = False    # set to False to disable recording of debugging information
@@ -162,6 +162,13 @@
                         # pretend it's a float.
     immutable = True
 
+    def __eq__(self, other):
+        # NaN unpleasantness.
+        if (self.is_constant() and other.is_constant() and
+            isnan(self.const) and isnan(other.const)):
+            return True
+        return super(SomeFloat, self).__eq__(other)
+
     def can_be_none(self):
         return False
 

Modified: pypy/branch/fast-forward/pypy/annotation/test/test_model.py
==============================================================================
--- pypy/branch/fast-forward/pypy/annotation/test/test_model.py	(original)
+++ pypy/branch/fast-forward/pypy/annotation/test/test_model.py	Tue Jul  6 16:18:27 2010
@@ -200,6 +200,15 @@
     s2.const=cls
     assert s1.contains(s2)
 
+def test_nan():
+    f1 = SomeFloat()
+    f1.const = float("nan")
+    f2 = SomeFloat()
+    f2.const = float("nan")
+    assert f1.contains(f1)
+    assert f2.contains(f1)
+    assert f1.contains(f2)
+
 if __name__ == '__main__':
     for name, value in globals().items():
         if name.startswith('test_'):

Modified: pypy/branch/fast-forward/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/fast-forward/pypy/jit/backend/llsupport/descr.py	(original)
+++ pypy/branch/fast-forward/pypy/jit/backend/llsupport/descr.py	Tue Jul  6 16:18:27 2010
@@ -151,7 +151,6 @@
     def repr_of_descr(self):
         return '<%s>' % self._clsname
 
-
 class NonGcPtrArrayDescr(BaseArrayDescr):
     _clsname = 'NonGcPtrArrayDescr'
     def get_item_size(self, translate_support_code):
@@ -161,17 +160,45 @@
     _clsname = 'GcPtrArrayDescr'
     _is_array_of_pointers = True
 
+_CA = rffi.CArray(lltype.Signed)
+
+class BaseArrayNoLengthDescr(BaseArrayDescr):
+    def get_base_size(self, translate_support_code):
+        basesize, _, _ = symbolic.get_array_token(_CA, translate_support_code)
+        return basesize
+
+    def get_ofs_length(self, translate_support_code):
+        _, _, ofslength = symbolic.get_array_token(_CA, translate_support_code)
+        return ofslength
+
+class NonGcPtrArrayNoLengthDescr(BaseArrayNoLengthDescr):
+    _clsname = 'NonGcPtrArrayNoLengthDescr'
+    def get_item_size(self, translate_support_code):
+        return symbolic.get_size_of_ptr(translate_support_code)
+
+class GcPtrArrayNoLengthDescr(NonGcPtrArrayNoLengthDescr):
+    _clsname = 'GcPtrArrayNoLengthDescr'
+    _is_array_of_pointers = True
+
 def getArrayDescrClass(ARRAY):
     return getDescrClass(ARRAY.OF, BaseArrayDescr, GcPtrArrayDescr,
                          NonGcPtrArrayDescr, 'Array', 'get_item_size',
                          '_is_array_of_floats')
 
+def getArrayNoLengthDescrClass(ARRAY):
+    return getDescrClass(ARRAY.OF, BaseArrayNoLengthDescr, GcPtrArrayNoLengthDescr,
+                         NonGcPtrArrayNoLengthDescr, 'ArrayNoLength', 'get_item_size',
+                         '_is_array_of_floats')
+
 def get_array_descr(gccache, ARRAY):
     cache = gccache._cache_array
     try:
         return cache[ARRAY]
     except KeyError:
-        arraydescr = getArrayDescrClass(ARRAY)()
+        if ARRAY._hints.get('nolength', False):
+            arraydescr = getArrayNoLengthDescrClass(ARRAY)()
+        else:
+            arraydescr = getArrayDescrClass(ARRAY)()
         # verify basic assumption that all arrays' basesize and ofslength
         # are equal
         basesize, itemsize, ofslength = symbolic.get_array_token(ARRAY, False)

Modified: pypy/branch/fast-forward/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/fast-forward/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/fast-forward/pypy/jit/backend/llsupport/llmodel.py	Tue Jul  6 16:18:27 2010
@@ -250,6 +250,7 @@
         ofs = arraydescr.get_ofs_length(self.translate_support_code)
         return rffi.cast(rffi.CArrayPtr(lltype.Signed), array)[ofs/WORD]
 
+    @specialize.argtype(2)
     def bh_getarrayitem_gc_i(self, arraydescr, gcref, itemindex):
         ofs, size = self.unpack_arraydescr_size(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
@@ -272,6 +273,7 @@
         # --- end of GC unsafe code ---
         return pval
 
+    @specialize.argtype(2)
     def bh_getarrayitem_gc_f(self, arraydescr, gcref, itemindex):
         ofs = self.unpack_arraydescr(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
@@ -281,6 +283,7 @@
         # --- end of GC unsafe code ---
         return fval
 
+    @specialize.argtype(2)
     def bh_setarrayitem_gc_i(self, arraydescr, gcref, itemindex, newvalue):
         ofs, size = self.unpack_arraydescr_size(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
@@ -303,6 +306,7 @@
         items[itemindex] = self.cast_gcref_to_int(newvalue)
         # --- end of GC unsafe code ---
 
+    @specialize.argtype(2)
     def bh_setarrayitem_gc_f(self, arraydescr, gcref, itemindex, newvalue):
         ofs = self.unpack_arraydescr(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
@@ -311,6 +315,12 @@
         items[itemindex] = newvalue
         # --- end of GC unsafe code ---
 
+    bh_setarrayitem_raw_i = bh_setarrayitem_gc_i
+    bh_setarrayitem_raw_f = bh_setarrayitem_gc_f
+
+    bh_getarrayitem_raw_i = bh_getarrayitem_gc_i
+    bh_getarrayitem_raw_f = bh_getarrayitem_gc_f
+
     def bh_strlen(self, string):
         s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
         return len(s.chars)

Modified: pypy/branch/fast-forward/pypy/jit/backend/llsupport/symbolic.py
==============================================================================
--- pypy/branch/fast-forward/pypy/jit/backend/llsupport/symbolic.py	(original)
+++ pypy/branch/fast-forward/pypy/jit/backend/llsupport/symbolic.py	Tue Jul  6 16:18:27 2010
@@ -36,8 +36,11 @@
             ofs_length = (llmemory.offsetof(T, T._arrayfld) +
                           llmemory.ArrayLengthOffset(SUBARRAY))
         else:
+            if T._hints.get('nolength', None):
+                ofs_length = -1
+            else:
+                ofs_length = llmemory.ArrayLengthOffset(T)
             itemsize = llmemory.sizeof(T.OF)
-            ofs_length = llmemory.ArrayLengthOffset(T)
     else:
         if isinstance(T, lltype.Struct):
             assert T._arrayfld is not None, "%r is not variable-sized" % (T,)
@@ -48,8 +51,11 @@
         else:
             before_array_part = 0
         carray = ll2ctypes.get_ctypes_type(T)
-        assert carray.length.size == WORD
-        ofs_length = before_array_part + carray.length.offset
+        if T._hints.get('nolength', None):
+            ofs_length = -1
+        else:
+            assert carray.length.size == WORD
+            ofs_length = before_array_part + carray.length.offset
         basesize = before_array_part + carray.items.offset
         carrayitem = ll2ctypes.get_ctypes_type(T.OF)
         itemsize = ctypes.sizeof(carrayitem)

Modified: pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_descr.py
==============================================================================
--- pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_descr.py	(original)
+++ pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_descr.py	Tue Jul  6 16:18:27 2010
@@ -140,7 +140,25 @@
     assert isinstance(descr2.get_item_size(True), Symbolic)
     assert isinstance(descr3.get_item_size(True), Symbolic)
     assert isinstance(descr4.get_item_size(True), Symbolic)
-
+    CA = rffi.CArray(lltype.Signed)
+    descr = get_array_descr(c0, CA)
+    assert not descr.is_array_of_floats()
+    assert descr.get_base_size(False) == 0
+    assert descr.get_ofs_length(False) == -1
+    CA = rffi.CArray(lltype.Ptr(lltype.GcStruct('S')))
+    descr = get_array_descr(c0, CA)
+    assert descr.is_array_of_pointers()
+    assert descr.get_base_size(False) == 0
+    assert descr.get_ofs_length(False) == -1
+    CA = rffi.CArray(lltype.Ptr(lltype.Struct('S')))
+    descr = get_array_descr(c0, CA)
+    assert descr.get_base_size(False) == 0
+    assert descr.get_ofs_length(False) == -1
+    CA = rffi.CArray(lltype.Float)
+    descr = get_array_descr(c0, CA)
+    assert descr.is_array_of_floats()
+    assert descr.get_base_size(False) == 0
+    assert descr.get_ofs_length(False) == -1
 
 def test_get_call_descr_not_translated():
     c0 = GcCache(False)

Modified: pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_symbolic.py
==============================================================================
--- pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_symbolic.py	(original)
+++ pypy/branch/fast-forward/pypy/jit/backend/llsupport/test/test_symbolic.py	Tue Jul  6 16:18:27 2010
@@ -61,6 +61,12 @@
         assert basesize >= WORD # at least the 'length', maybe some gc headers
         assert itemsize == WORD
         assert ofs_length == basesize - WORD
+        A = rffi.CArray(lltype.Signed)
+        arraytok = get_array_token(A, translate_support_code)
+        basesize, itemsize, ofs_length = convert(arraytok)
+        assert basesize == 0
+        assert itemsize == WORD
+        assert ofs_length == -1
 
 def test_varsized_struct_size():    
     S1 = lltype.GcStruct('S1', ('parent', S),

Modified: pypy/branch/fast-forward/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/fast-forward/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/fast-forward/pypy/jit/backend/x86/assembler.py	Tue Jul  6 16:18:27 2010
@@ -815,6 +815,7 @@
                 raise NotImplementedError()
 
     genop_getarrayitem_gc_pure = genop_getarrayitem_gc
+    genop_getarrayitem_raw = genop_getarrayitem_gc
 
     def genop_discard_setfield_gc(self, op, arglocs):
         base_loc, ofs_loc, size_loc, value_loc = arglocs

Modified: pypy/branch/fast-forward/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/fast-forward/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/branch/fast-forward/pypy/jit/backend/x86/regalloc.py	Tue Jul  6 16:18:27 2010
@@ -867,6 +867,7 @@
         result_loc = self.force_allocate_reg(op.result)
         self.Perform(op, [base_loc, ofs_loc, imm(scale), imm(ofs)], result_loc)
 
+    consider_getarrayitem_raw = consider_getarrayitem_gc
     consider_getarrayitem_gc_pure = consider_getarrayitem_gc
 
     def consider_int_is_true(self, op, guard_op):

Modified: pypy/branch/fast-forward/pypy/module/_locale/interp_locale.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_locale/interp_locale.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_locale/interp_locale.py	Tue Jul  6 16:18:27 2010
@@ -129,7 +129,13 @@
        space.is_true(space.isinstance(w_s2, space.w_str)):
 
         s1, s2 = space.str_w(w_s1), space.str_w(w_s2)
-        return space.wrap(_strcoll(rffi.str2charp(s1), rffi.str2charp(s2)))
+        s1_c = rffi.str2charp(s1)
+        s2_c = rffi.str2charp(s2)
+        try:
+            return space.wrap(_strcoll(s1_c, s2_c))
+        finally:
+            rffi.free_charp(s1_c)
+            rffi.free_charp(s2_c)
 
     #if not space.is_true(space.isinstance(w_s1, space.w_unicode)) and \
     #   not space.is_true(space.isinstance(w_s2, space.w_unicode)):
@@ -140,7 +146,12 @@
 
     s1_c = rffi.unicode2wcharp(s1)
     s2_c = rffi.unicode2wcharp(s2)
-    result = _wcscoll(s1_c, s2_c)
+    try:
+        result = _wcscoll(s1_c, s2_c)
+    finally:
+        rffi.free_wcharp(s1_c)
+        rffi.free_wcharp(s2_c)
+
     return space.wrap(result)
 
 strcoll.unwrap_spec = [ObjSpace, W_Root, W_Root]
@@ -153,13 +164,21 @@
     n1 = len(s) + 1
 
     buf = lltype.malloc(rffi.CCHARP.TO, n1, flavor="raw", zero=True)
-    n2 = _strxfrm(buf, rffi.str2charp(s), n1) + 1
+    s_c = rffi.str2charp(s)
+    try:
+        n2 = _strxfrm(buf, s_c, n1) + 1
+    finally:
+        rffi.free_charp(s_c)
     if n2 > n1:
         # more space needed
         lltype.free(buf, flavor="raw")
         buf = lltype.malloc(rffi.CCHARP.TO, intmask(n2),
                             flavor="raw", zero=True)
-        _strxfrm(buf, rffi.str2charp(s), n2)
+        s_c = rffi.str2charp(s)
+        try:
+            _strxfrm(buf, s_c, n2)
+        finally:
+            rffi.free_charp(s_c)
 
     val = rffi.charp2str(buf)
     lltype.free(buf, flavor="raw")
@@ -191,7 +210,11 @@
     def gettext(space, msg):
         """gettext(msg) -> string
         Return translation of msg."""
-        return space.wrap(rffi.charp2str(_gettext(rffi.str2charp(msg))))
+        msg_c = rffi.str2charp(msg)
+        try:
+            return space.wrap(rffi.charp2str(_gettext(msg_c)))
+        finally:
+            rffi.free_charp(msg_c)
 
     gettext.unwrap_spec = [ObjSpace, str]
 
@@ -202,10 +225,20 @@
         Return translation of msg in domain."""
         if space.is_w(w_domain, space.w_None):
             domain = None
-            result = _dgettext(domain, rffi.str2charp(msg))
+            msg_c = rffi.str2charp(msg)
+            try:
+                result = _dgettext(domain, msg_c)
+            finally:
+                rffi.free_charp(msg_c)
         else:
             domain = space.str_w(w_domain)
-            result = _dgettext(rffi.str2charp(domain), rffi.str2charp(msg))
+            domain_c = rffi.str2charp(domain)
+            msg_c = rffi.str2charp(msg)
+            try:
+                result = _dgettext(domain_c, msg_c)
+            finally:
+                rffi.free_charp(domain_c)
+                rffi.free_charp(msg_c)
 
         return space.wrap(rffi.charp2str(result))
 
@@ -220,12 +253,21 @@
 
         if space.is_w(w_domain, space.w_None):
             domain = None
-            result = _dcgettext(domain, rffi.str2charp(msg),
-                                rffi.cast(rffi.INT, category))
+            msg_c = rffi.str2charp(msg)
+            try:
+                result = _dcgettext(domain, msg_c, rffi.cast(rffi.INT, category))
+            finally:
+                rffi.free_charp(msg_c)
         else:
             domain = space.str_w(w_domain)
-            result = _dcgettext(rffi.str2charp(domain), rffi.str2charp(msg),
-                                rffi.cast(rffi.INT, category))
+            domain_c = rffi.str2charp(domain)
+            msg_c = rffi.str2charp(msg)
+            try:
+                result = _dcgettext(domain_c, msg_c,
+                                    rffi.cast(rffi.INT, category))
+            finally:
+                rffi.free_charp(domain_c)
+                rffi.free_charp(msg_c)
 
         return space.wrap(rffi.charp2str(result))
 
@@ -243,7 +285,11 @@
             result = _textdomain(domain)
         else:
             domain = space.str_w(w_domain)
-            result = _textdomain(rffi.str2charp(domain))
+            domain_c = rffi.str2charp(domain)
+            try:
+                result = _textdomain(domain_c)
+            finally:
+                rffi.free_charp(domain_c)
 
         return space.wrap(rffi.charp2str(result))
 
@@ -258,11 +304,20 @@
 
         if space.is_w(w_dir, space.w_None):
             dir = None
-            dirname = _bindtextdomain(rffi.str2charp(domain), dir)
+            domain_c = rffi.str2charp(domain)
+            try:
+                dirname = _bindtextdomain(domain_c, dir)
+            finally:
+                rffi.free_charp(domain_c)
         else:
             dir = space.str_w(w_dir)
-            dirname = _bindtextdomain(rffi.str2charp(domain),
-                                        rffi.str2charp(dir))
+            domain_c = rffi.str2charp(domain)
+            dir_c = rffi.str2charp(dir)
+            try:
+                dirname = _bindtextdomain(domain_c, dir_c)
+            finally:
+                rffi.free_charp(domain_c)
+                rffi.free_charp(dir_c)
 
         if not dirname:
             errno = rposix.get_errno()
@@ -281,12 +336,20 @@
 
             if space.is_w(w_codeset, space.w_None):
                 codeset = None
-                result = _bind_textdomain_codeset(
-                                            rffi.str2charp(domain), codeset)
+                domain_c = rffi.str2charp(domain)
+                try:
+                    result = _bind_textdomain_codeset(domain_c, codeset)
+                finally:
+                    rffi.free_charp(domain_c)
             else:
                 codeset = space.str_w(w_codeset)
-                result = _bind_textdomain_codeset(rffi.str2charp(domain),
-                                                rffi.str2charp(codeset))
+                domain_c = rffi.str2charp(domain)
+                codeset_c = rffi.str2charp(codeset)
+                try:
+                    result = _bind_textdomain_codeset(domain_c, codeset_c)
+                finally:
+                    rffi.free_charp(domain_c)
+                    rffi.free_charp(codeset_c)
 
             if not result:
                 return space.w_None

Modified: pypy/branch/fast-forward/pypy/rpython/memory/lltypelayout.py
==============================================================================
--- pypy/branch/fast-forward/pypy/rpython/memory/lltypelayout.py	(original)
+++ pypy/branch/fast-forward/pypy/rpython/memory/lltypelayout.py	Tue Jul  6 16:18:27 2010
@@ -111,6 +111,8 @@
     elif isinstance(offset, llmemory.ItemOffset):
         return sizeof(offset.TYPE) * offset.repeat
     elif isinstance(offset, llmemory.ArrayItemsOffset):
+        if offset.TYPE._hints.get('nolength', None):
+            return 0
         return get_fixed_size(lltype.Signed)
     elif isinstance(offset, llmemory.GCHeaderOffset):
         return sizeof(offset.gcheaderbuilder.HDR)



More information about the Pypy-commit mailing list