[pypy-commit] pypy stmgc-c4: merge heads

arigo noreply at buildbot.pypy.org
Sat Sep 7 18:15:56 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c4
Changeset: r66836:17f62ee163f2
Date: 2013-09-07 18:14 +0200
http://bitbucket.org/pypy/pypy/changeset/17f62ee163f2/

Log:	merge heads

diff --git a/lib_pypy/_tkinter/tklib.py b/lib_pypy/_tkinter/tklib.py
--- a/lib_pypy/_tkinter/tklib.py
+++ b/lib_pypy/_tkinter/tklib.py
@@ -1,6 +1,7 @@
 # C bindings with libtcl and libtk.
 
 from cffi import FFI
+import sys
 
 tkffi = FFI()
 
@@ -102,6 +103,17 @@
 int Tk_GetNumMainWindows();
 """)
 
+# XXX find a better way to detect paths
+# XXX pick up CPPFLAGS and LDFLAGS and add to these paths?
+if sys.platform.startswith("openbsd"):
+    incdirs = ['/usr/local/include/tcl8.5', '/usr/local/include/tk8.5', '/usr/X11R6/include']
+    linklibs = ['tk85', 'tcl85']
+    libdirs = ['/usr/local/lib', '/usr/X11R6/lib']
+else:
+    incdirs=['/usr/include/tcl'],
+    linklibs=['tcl', 'tk'],
+    libdirs = []
+
 tklib = tkffi.verify("""
 #include <tcl.h>
 #include <tk.h>
@@ -109,6 +121,7 @@
 char *get_tk_version() { return TK_VERSION; }
 char *get_tcl_version() { return TCL_VERSION; }
 """,
-include_dirs=['/usr/include/tcl'],
-libraries=['tcl', 'tk'],
+include_dirs=incdirs,
+libraries=linklibs,
+library_dirs = libdirs
 )
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -77,12 +77,12 @@
         raise NotImplementedError("only for interp-level user subclasses "
                                   "from typedef.py")
 
-    def getname(self, space, default='?'):
+    def getname(self, space):
         try:
             return space.str_w(space.getattr(self, space.wrap('__name__')))
         except OperationError, e:
             if e.match(space, space.w_TypeError) or e.match(space, space.w_AttributeError):
-                return default
+                return '?'
             raise
 
     def getaddrstring(self, space):
diff --git a/pypy/interpreter/function.py b/pypy/interpreter/function.py
--- a/pypy/interpreter/function.py
+++ b/pypy/interpreter/function.py
@@ -482,17 +482,16 @@
                 space.abstract_isinstance_w(w_firstarg, self.w_class)):
             pass  # ok
         else:
-            clsdescr = self.w_class.getname(space, "")
-            if clsdescr:
+            clsdescr = self.w_class.getname(space)
+            if clsdescr and clsdescr != '?':
                 clsdescr += " instance"
             else:
                 clsdescr = "instance"
             if w_firstarg is None:
                 instdescr = "nothing"
             else:
-                instname = space.abstract_getclass(w_firstarg).getname(space,
-                                                                       "")
-                if instname:
+                instname = space.abstract_getclass(w_firstarg).getname(space)
+                if instname and instname != '?':
                     instdescr = instname + " instance"
                 else:
                     instdescr = "instance"
diff --git a/pypy/interpreter/test/test_argument.py b/pypy/interpreter/test/test_argument.py
--- a/pypy/interpreter/test/test_argument.py
+++ b/pypy/interpreter/test/test_argument.py
@@ -128,7 +128,7 @@
 
     def type(self, obj):
         class Type:
-            def getname(self, space, default='?'):
+            def getname(self, space):
                 return type(obj).__name__
         return Type()
 
diff --git a/pypy/module/_minimal_curses/fficurses.py b/pypy/module/_minimal_curses/fficurses.py
--- a/pypy/module/_minimal_curses/fficurses.py
+++ b/pypy/module/_minimal_curses/fficurses.py
@@ -26,6 +26,9 @@
 def try_ldflags():
     yield ExternalCompilationInfo(libraries=['curses'])
     yield ExternalCompilationInfo(libraries=['curses', 'tinfo'])
+    yield ExternalCompilationInfo(libraries=['ncurses'])
+    yield ExternalCompilationInfo(libraries=['ncurses'],
+                                  library_dirs=['/usr/lib64'])
 
 def try_tools():
     try:
diff --git a/pypy/module/_weakref/interp__weakref.py b/pypy/module/_weakref/interp__weakref.py
--- a/pypy/module/_weakref/interp__weakref.py
+++ b/pypy/module/_weakref/interp__weakref.py
@@ -175,8 +175,8 @@
             state = '; dead'
         else:
             typename = space.type(w_obj).getname(space)
-            objname = w_obj.getname(space, '')
-            if objname:
+            objname = w_obj.getname(space)
+            if objname and objname != '?':
                 state = "; to '%s' (%s)" % (typename, objname)
             else:
                 state = "; to '%s'" % (typename,)
diff --git a/pypy/objspace/descroperation.py b/pypy/objspace/descroperation.py
--- a/pypy/objspace/descroperation.py
+++ b/pypy/objspace/descroperation.py
@@ -597,8 +597,8 @@
         if num1 != num2:
             lt = num1      # if obj1 is a number, it is Lower Than obj2
         else:
-            name1 = w_typ1.getname(space, "")
-            name2 = w_typ2.getname(space, "")
+            name1 = w_typ1.getname(space)
+            name2 = w_typ2.getname(space)
             if name1 != name2:
                 lt = name1 < name2
             else:
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -502,6 +502,12 @@
         else:
             return w_self.name
 
+    def getname(w_self, space):
+        name = w_self.name
+        if name is None:
+            name = '?'
+        return name
+
     def add_subclass(w_self, w_subclass):
         space = w_self.space
         if not space.config.translation.rweakref:
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -37,6 +37,7 @@
 from rpython.jit.backend.x86 import stmtlocal
 from rpython.rlib import rstm
 from rpython.memory.gc.stmgc import StmGC
+from rpython.jit.backend.llsupport.gc import STMBarrierDescr
 
 
 class Assembler386(BaseAssembler):
@@ -301,13 +302,15 @@
         Before using such a relative address, call 
         self._stm_tl_segment_prefix_if_necessary."""
         if self.cpu.gc_ll_descr.stm and we_are_translated():
-            # also not during tests
+            # only for STM and not during tests
             result = adr - stmtlocal.threadlocal_base()
             assert rx86.fits_in_32bits(result)
             return result
         return adr
 
-    def _stm_tl_segment_prefix_if_necessary(self, mc):
+    def _tl_segment_if_stm(self, mc):
+        """Insert segment prefix for thread-local memory if we run
+        in STM and not during testing."""
         if self.cpu.gc_ll_descr.stm and we_are_translated():
             stmtlocal.tl_segment_prefix(mc)
         
@@ -346,7 +349,7 @@
             mc.ADD_ri(esp.value, WORD)
         #
         ea = self._get_stm_tl(self.cpu.pos_exception())
-        self._stm_tl_segment_prefix_if_necessary(mc)
+        self._tl_segment_if_stm(mc)
         mc.MOV(eax, heap(ea))
         mc.TEST_rr(eax.value, eax.value)
         mc.J_il8(rx86.Conditions['NZ'], 0)
@@ -900,11 +903,9 @@
         that gives the address of the stack top.  If this integer doesn't
         fit in 32 bits, it will be loaded in r11.
         """
-        rst = self._get_root_stack_top_addr()
+        rst = self._get_stm_tl(gcrootmap.get_root_stack_top_addr())
         if rx86.fits_in_32bits(rst):
-            if gcrootmap.is_stm and we_are_translated():
-                # during testing, it will be an absolute address
-                stmtlocal.tl_segment_prefix(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV_rj(ebx.value, rst)            # MOV ebx, [rootstacktop]
         else:
             mc.MOV_ri(X86_64_SCRATCH_REG.value, rst) # MOV r11, rootstacktop
@@ -932,9 +933,7 @@
         self.mc.ADD_ri(ebx.value, WORD)
         
         if rx86.fits_in_32bits(rst):
-            if gcrootmap.is_stm and we_are_translated():
-                # during testing, it will be an absolute address
-                stmtlocal.tl_segment_prefix(self.mc)
+            self._tl_segment_if_stm(self.mc)
             self.mc.MOV_jr(rst, ebx.value)            # MOV [rootstacktop], ebx
         else:
             # The integer 'rst' doesn't fit in 32 bits, so we know that
@@ -944,12 +943,9 @@
                            ebx.value) # MOV [r11], ebx
 
     def _call_footer_shadowstack(self, gcrootmap):
-        rst = self._get_root_stack_top_addr()
-        
+        rst = self._get_stm_tl(gcrootmap.get_root_stack_top_addr())
         if rx86.fits_in_32bits(rst):
-            if gcrootmap.is_stm and we_are_translated():
-                # during testing, it will be an absolute address
-                stmtlocal.tl_segment_prefix(self.mc)
+            self._tl_segment_if_stm(self.mc)
             self.mc.SUB_ji8(rst, WORD)       # SUB [rootstacktop], WORD
         else:
             self.mc.MOV_ri(ebx.value, rst)           # MOV ebx, rootstacktop
@@ -1262,25 +1258,12 @@
         cb = callbuilder.CallBuilder(self, fnloc, arglocs)
         cb.emit_no_collect()
 
-    def _get_root_stack_top_addr(self):
-        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
-        
-        rst = gcrootmap.get_root_stack_top_addr()
-        if gcrootmap.is_stm and we_are_translated():
-            # during testing, we return an absolute address
-            rst = rst - stmtlocal.threadlocal_base()
-            assert rx86.fits_in_32bits(rst)
-        return rst
-            
     def _reload_frame_if_necessary(self, mc, align_stack=False):
         gc_ll_descr = self.cpu.gc_ll_descr
         gcrootmap = gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
-            rst = self._get_root_stack_top_addr()
-
-            if gcrootmap.is_stm and we_are_translated():
-                # during testing, it will be an absolute address
-                stmtlocal.tl_segment_prefix(mc)
+            rst = self._get_stm_tl(gcrootmap.get_root_stack_top_addr())
+            self._tl_segment_if_stm(mc)
             mc.MOV(ecx, heap(rst))
             mc.MOV(ebp, mem(ecx, -WORD))
         #
@@ -1809,7 +1792,7 @@
     def genop_guard_guard_no_exception(self, ign_1, guard_op, guard_token,
                                        locs, ign_2):
         ea = self._get_stm_tl(self.cpu.pos_exception())
-        self._stm_tl_segment_prefix_if_necessary(self.mc)
+        self._tl_segment_if_stm(self.mc)
         self.mc.CMP(heap(ea), imm0)
         self.implement_guard(guard_token, 'NZ')
 
@@ -1824,7 +1807,7 @@
         loc = locs[0]
         loc1 = locs[1]
         ea = self._get_stm_tl(self.cpu.pos_exception())
-        self._stm_tl_segment_prefix_if_necessary(self.mc)
+        self._tl_segment_if_stm(self.mc)
         self.mc.MOV(loc1, heap(ea))
         self.mc.CMP(loc1, loc)
         self.implement_guard(guard_token, 'NE')
@@ -1838,7 +1821,7 @@
         eva = self._get_stm_tl(self.cpu.pos_exc_value())
         ea = self._get_stm_tl(self.cpu.pos_exception())
         #
-        self._stm_tl_segment_prefix_if_necessary(mc)
+        self._tl_segment_if_stm(mc)
         if excvalloc is not None:
             assert excvalloc.is_core_reg()
             mc.MOV(excvalloc, heap(eva))
@@ -1849,28 +1832,28 @@
         #
         if exctploc is not None:
             assert exctploc.is_core_reg()
-            self._stm_tl_segment_prefix_if_necessary(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV(exctploc, heap(ea))
         #
-        self._stm_tl_segment_prefix_if_necessary(mc)
+        self._tl_segment_if_stm(mc)
         mc.MOV(heap(ea), imm0)
-        self._stm_tl_segment_prefix_if_necessary(mc)
+        self._tl_segment_if_stm(mc)
         mc.MOV(heap(eva), imm0)
 
     def _restore_exception(self, mc, excvalloc, exctploc, tmploc=None):
         eva = self._get_stm_tl(self.cpu.pos_exc_value())
         ea = self._get_stm_tl(self.cpu.pos_exception())
         if excvalloc is not None:
-            self._stm_tl_segment_prefix_if_necessary(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV(heap(eva), excvalloc)
         else:
             assert tmploc is not None
             ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
             mc.MOV(tmploc, RawEbpLoc(ofs))
             mc.MOV_bi(ofs, 0)
-            self._stm_tl_segment_prefix_if_necessary(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV(heap(eva), tmploc)
-        self._stm_tl_segment_prefix_if_necessary(mc)
+        self._tl_segment_if_stm(mc)
         mc.MOV(heap(ea), exctploc)
 
     def _gen_guard_overflow(self, guard_op, guard_token):
@@ -2072,11 +2055,11 @@
             # We might have an exception pending.  Load it into ebx...
             eva = self._get_stm_tl(self.cpu.pos_exc_value())
             ea = self._get_stm_tl(self.cpu.pos_exception())
-            self._stm_tl_segment_prefix_if_necessary(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV(ebx, heap(eva))
-            self._stm_tl_segment_prefix_if_necessary(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV(heap(ea), imm0)
-            self._stm_tl_segment_prefix_if_necessary(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV(heap(eva), imm0)
             # ...and save ebx into 'jf_guard_exc'
             offset = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
@@ -2394,24 +2377,14 @@
             mc.overwrite(j_ok3 - 1, chr(offset))
 
     def _get_stm_private_rev_num_addr(self):
-        assert self.cpu.gc_ll_descr.stm
-        rn = rstm.get_adr_of_private_rev_num()
-        rn = rn - stmtlocal.threadlocal_base()
-        assert rx86.fits_in_32bits(rn)
-        return rn
+        return self._get_stm_tl(rstm.get_adr_of_private_rev_num())
 
     def _get_stm_read_barrier_cache_addr(self):
-        assert self.cpu.gc_ll_descr.stm
-        rbc = rstm.get_adr_of_read_barrier_cache()
-        rbc = rbc - stmtlocal.threadlocal_base()
-        assert rx86.fits_in_32bits(rbc)
-        return rbc
+        return self._get_stm_tl(rstm.get_adr_of_read_barrier_cache())
         
     def _stm_barrier_fastpath(self, mc, descr, arglocs, is_frame=False,
                               align_stack=False):
         assert self.cpu.gc_ll_descr.stm
-        from rpython.jit.backend.llsupport.gc import (
-            STMBarrierDescr, STMReadBarrierDescr, STMWriteBarrierDescr)
         if we_are_translated():
             # tests use a a mock class, but translation needs it
             assert isinstance(descr, STMBarrierDescr)
@@ -2442,7 +2415,7 @@
         if we_are_translated():
             # during tests, _get_stm_private_rev_num_addr returns
             # an absolute address, not a tl-offset
-            stmtlocal.tl_segment_prefix(mc)
+            self._tl_segment_if_stm(mc)
             mc.MOV_rj(X86_64_SCRATCH_REG.value, rn)
         else: # testing:
             mc.MOV(X86_64_SCRATCH_REG, heap(rn))
@@ -2472,7 +2445,7 @@
             if we_are_translated():
                 # during tests, _get_stm_rbca returns
                 # an absolute address, not a tl-offset
-                stmtlocal.tl_segment_prefix(mc)
+                self._tl_segment_if_stm(mc)
                 mc.ADD_rj(X86_64_SCRATCH_REG.value, rbc)
             else: # testing:
                 mc.PUSH_r(eax.value)
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -28,6 +28,7 @@
 from rpython.rlib.rarithmetic import r_longlong, r_uint
 from rpython.rtyper.lltypesystem.lloperation import llop
 from rpython.rtyper.lltypesystem import lltype, rffi, rstr
+from rpython.rtyper.lltypesystem.lloperation import llop
 
 
 class X86RegisterManager(RegisterManager):
diff --git a/rpython/jit/backend/x86/test/test_stm_integration.py b/rpython/jit/backend/x86/test/test_stm_integration.py
--- a/rpython/jit/backend/x86/test/test_stm_integration.py
+++ b/rpython/jit/backend/x86/test/test_stm_integration.py
@@ -531,7 +531,9 @@
                         ResOperation(rop.FINISH, [i], None, 
                                      descr=finaldescr)
                         )
+                    print operations
 
+                    
                     # COMPILE & EXECUTE LOOP:
                     inputargs = [p for p in (p1, p2) 
                                  if not isinstance(p, Const)]
@@ -541,9 +543,6 @@
 
                     args = [s for i, s in enumerate((s1, s2))
                             if not isinstance((p1, p2)[i], Const)] + [7]
-                    print "======"
-                    print "inputargs:", inputargs+[i1], args
-                    print "\n".join(map(str,c_loop[1]))
                                         
                     frame = self.cpu.execute_token(looptoken, *args)
                     frame = rffi.cast(JITFRAMEPTR, frame)
@@ -692,9 +691,6 @@
                                   looptoken)
         
         args = []
-        print "======"
-        print "inputargs:", inputargs, args
-        print "\n".join(map(str,c_loop[1]))
         
         frame = self.cpu.execute_token(looptoken, *args)
 
@@ -742,7 +738,6 @@
         looptoken = JitCellToken()
         looptoken.outermost_jitdriver_sd = FakeJitDriverSD()
         c_loop = cpu.compile_loop(None, inputargs, ops, looptoken)
-        print "\n".join(map(str,c_loop[1]))
         
         ARGS = [lltype.Signed] * 10
         RES = lltype.Signed
@@ -766,7 +761,6 @@
         othertoken = JitCellToken()
         cpu.done_with_this_frame_descr_int = BasicFinalDescr()
         c_loop = cpu.compile_loop(None, [], ops, othertoken)
-        print "\n".join(map(str,c_loop[1]))
         
         deadframe = cpu.execute_token(othertoken)
         frame = rffi.cast(JITFRAMEPTR, deadframe)
diff --git a/rpython/rtyper/test/test_rclass.py b/rpython/rtyper/test/test_rclass.py
--- a/rpython/rtyper/test/test_rclass.py
+++ b/rpython/rtyper/test/test_rclass.py
@@ -1192,3 +1192,19 @@
 
         assert self.interpret(f, [True]) == f(True)
         assert self.interpret(f, [False]) == f(False)
+
+    def test_init_with_star_args(self):
+        class Base(object):
+            def __init__(self, a, b):
+                self.a = a
+                self.b = b
+        class A(Base):
+            def __init__(self, *args):
+                Base.__init__(self, *args)
+                self.c = -1
+        cls = [Base, A]
+
+        def f(k, a, b):
+            return cls[k](a, b).b
+
+        assert self.interpret(f, [1, 4, 7]) == 7
diff --git a/rpython/translator/c/src/debug_print.c b/rpython/translator/c/src/debug_print.c
--- a/rpython/translator/c/src/debug_print.c
+++ b/rpython/translator/c/src/debug_print.c
@@ -19,8 +19,8 @@
 FILE *pypy_debug_file = NULL;   /* XXX make it thread-local too? */
 static unsigned char debug_ready = 0;
 static unsigned char debug_profile = 0;
-__thread_if_stm static char debug_start_colors_1[32];
-__thread_if_stm static char debug_start_colors_2[28];
+static __thread_if_stm char debug_start_colors_1[32];
+static __thread_if_stm char debug_start_colors_2[28];
 __thread_if_stm char pypy_debug_threadid[16] = {0};
 static char *debug_stop_colors = "";
 static char *debug_prefix = NULL;


More information about the pypy-commit mailing list