Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r90573:7b9cf75b06d0 Date: 2017-03-05 21:34 +0100 http://bitbucket.org/pypy/pypy/changeset/7b9cf75b06d0/
Log: hg merge default 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 @@ -948,11 +948,11 @@ # If this also contains args[0], this returns the current # location too. arglocs = [self.loc(args[i]) for i in range(2, len(args))] - gcmap = self.get_gcmap() if op.type == 'v': # a plain COND_CALL. Calls the function when args[0] is # true. Often used just after a comparison operation. + gcmap = self.get_gcmap() self.load_condition_into_cc(op.getarg(0)) resloc = None else: @@ -969,6 +969,22 @@ resloc = self.rm.force_result_in_reg(op, args[0], forbidden_vars=args[2:]) + # Get the gcmap here, possibly including the spilled + # location, and always excluding the 'resloc' register. + # Some more details: the only interesting case is the case + # where we're doing the call (if we are not, the gcmap is + # not used); and in this case, the gcmap must include the + # spilled location (it contains a valid GC pointer to fix + # during the call if a GC occurs), and never 'resloc' + # (it will be overwritten with the result of the call, which + # is not computed yet if a GC occurs). + # + # (Note that the spilled value is always NULL at the moment + # if the call really occurs, but it's not worth the effort to + # not list it in the gcmap and get crashes if we tweak + # COND_CALL_VALUE_R in the future) + gcmap = self.get_gcmap([resloc]) + # Test the register for the result. self.assembler.test_location(resloc) self.assembler.guard_success_cc = rx86.Conditions['Z'] diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py --- a/rpython/memory/gc/incminimark.py +++ b/rpython/memory/gc/incminimark.py @@ -2124,7 +2124,8 @@ def _malloc_out_of_nursery(self, totalsize): """Allocate non-movable memory for an object of the given 'totalsize' that lives so far in the nursery.""" - if raw_malloc_usage(totalsize) <= self.small_request_threshold: + if (r_uint(raw_malloc_usage(totalsize)) <= + r_uint(self.small_request_threshold)): # most common path return self.ac.malloc(totalsize) else: @@ -2133,6 +2134,9 @@ _malloc_out_of_nursery._always_inline_ = True def _malloc_out_of_nursery_nonsmall(self, totalsize): + if r_uint(raw_malloc_usage(totalsize)) > r_uint(self.nursery_size): + out_of_memory("memory corruption: bad size for object in the " + "nursery") # 'totalsize' should be aligned. ll_assert(raw_malloc_usage(totalsize) & (WORD-1) == 0, "misaligned totalsize in _malloc_out_of_nursery_nonsmall") diff --git a/rpython/translator/platform/linux.py b/rpython/translator/platform/linux.py --- a/rpython/translator/platform/linux.py +++ b/rpython/translator/platform/linux.py @@ -14,7 +14,7 @@ extra_libs = ('-lrt',) cflags = tuple( ['-O3', '-pthread', '-fomit-frame-pointer', - '-Wall', '-Wno-unused'] + '-Wall', '-Wno-unused', '-Wno-address'] + os.environ.get('CFLAGS', '').split()) standalone_only = () shared_only = ('-fPIC',) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit