Author: Manuel Jacob Branch: llvm-translation-backend Changeset: r68676:a6fecf78f85c Date: 2014-01-14 17:15 +0100 http://bitbucket.org/pypy/pypy/changeset/a6fecf78f85c/
Log: hg merge default diff --git a/lib_pypy/_ctypes/array.py b/lib_pypy/_ctypes/array.py --- a/lib_pypy/_ctypes/array.py +++ b/lib_pypy/_ctypes/array.py @@ -20,10 +20,13 @@ # we don't want to have buffers here if len(val) > self._length_: raise ValueError("%r too long" % (val,)) - for i in range(len(val)): - self[i] = val[i] + if isinstance(val, str): + _rawffi.rawstring2charp(self._buffer.buffer, val) + else: + for i in range(len(val)): + self[i] = val[i] if len(val) < self._length_: - self[len(val)] = '\x00' + self._buffer[len(val)] = '\x00' res.value = property(getvalue, setvalue) def getraw(self): @@ -33,8 +36,7 @@ def setraw(self, buffer): if len(buffer) > self._length_: raise ValueError("%r too long" % (buffer,)) - for i in range(len(buffer)): - self[i] = buffer[i] + _rawffi.rawstring2charp(self._buffer.buffer, buffer) res.raw = property(getraw, setraw) elif subletter == 'u': def getvalue(self): @@ -45,10 +47,14 @@ # we don't want to have buffers here if len(val) > self._length_: raise ValueError("%r too long" % (val,)) + if isinstance(val, unicode): + target = self._buffer + else: + target = self for i in range(len(val)): - self[i] = val[i] + target[i] = val[i] if len(val) < self._length_: - self[len(val)] = '\x00' + target[len(val)] = u'\x00' res.value = property(getvalue, setvalue) if '_length_' in typedict: diff --git a/pypy/module/_rawffi/__init__.py b/pypy/module/_rawffi/__init__.py --- a/pypy/module/_rawffi/__init__.py +++ b/pypy/module/_rawffi/__init__.py @@ -19,6 +19,7 @@ 'wcharp2unicode' : 'interp_rawffi.wcharp2unicode', 'charp2rawstring' : 'interp_rawffi.charp2rawstring', 'wcharp2rawunicode' : 'interp_rawffi.wcharp2rawunicode', + 'rawstring2charp' : 'interp_rawffi.rawstring2charp', 'CallbackPtr' : 'callback.W_CallbackPtr', '_num_of_allocated_objects' : 'tracker.num_of_allocated_objects', 'get_libc' : 'interp_rawffi.get_libc', diff --git a/pypy/module/_rawffi/interp_rawffi.py b/pypy/module/_rawffi/interp_rawffi.py --- a/pypy/module/_rawffi/interp_rawffi.py +++ b/pypy/module/_rawffi/interp_rawffi.py @@ -579,6 +579,13 @@ s = rffi.wcharpsize2unicode(rffi.cast(rffi.CWCHARP, address), maxlength) return space.wrap(s) +@unwrap_spec(address=r_uint, newcontent=str) +def rawstring2charp(space, address, newcontent): + from rpython.rtyper.annlowlevel import llstr + from rpython.rtyper.lltypesystem.rstr import copy_string_to_raw + array = rffi.cast(rffi.CCHARP, address) + copy_string_to_raw(llstr(newcontent), array, 0, len(newcontent)) + if _MS_WINDOWS: @unwrap_spec(code=int) def FormatError(space, code): diff --git a/pypy/module/_rawffi/test/test__rawffi.py b/pypy/module/_rawffi/test/test__rawffi.py --- a/pypy/module/_rawffi/test/test__rawffi.py +++ b/pypy/module/_rawffi/test/test__rawffi.py @@ -323,6 +323,14 @@ assert res == u'xx' a.free() + def test_rawstring2charp(self): + import _rawffi + A = _rawffi.Array('c') + a = A(10, 'x'*10) + _rawffi.rawstring2charp(a.buffer, "foobar") + assert ''.join([a[i] for i in range(10)]) == "foobarxxxx" + a.free() + def test_raw_callable(self): import _rawffi lib = _rawffi.CDLL(self.lib_name) diff --git a/pypy/module/test_lib_pypy/ctypes_tests/support.py b/pypy/module/test_lib_pypy/ctypes_tests/support.py --- a/pypy/module/test_lib_pypy/ctypes_tests/support.py +++ b/pypy/module/test_lib_pypy/ctypes_tests/support.py @@ -31,8 +31,10 @@ import gc for _ in range(4): gc.collect() - cls.old_num = _rawffi._num_of_allocated_objects() - + try: + cls.old_num = _rawffi._num_of_allocated_objects() + except RuntimeError: + pass def teardown_class(cls): if sys.pypy_translation_info['translation.gc'] == 'boehm': diff --git a/pypy/tool/gdb_pypy.py b/pypy/tool/gdb_pypy.py --- a/pypy/tool/gdb_pypy.py +++ b/pypy/tool/gdb_pypy.py @@ -38,9 +38,9 @@ if len(names) == 1: return val[names[0]] elif len(names) == 0: - raise KeyError, "cannot find field *%s" % suffix + raise KeyError("cannot find field *%s" % suffix) else: - raise KeyError, "too many matching fields: %s" % ', '.join(names) + raise KeyError("too many matching fields: %s" % ', '.join(names)) def lookup(val, suffix): """ @@ -76,10 +76,14 @@ def invoke(self, arg, from_tty): # some magic code to automatically reload the python file while developing from pypy.tool import gdb_pypy - reload(gdb_pypy) + try: + reload(gdb_pypy) + except: + import imp + imp.reload(gdb_pypy) gdb_pypy.RPyType.prog2typeids = self.prog2typeids # persist the cache self.__class__ = gdb_pypy.RPyType - print self.do_invoke(arg, from_tty) + print (self.do_invoke(arg, from_tty).decode('latin-1')) def do_invoke(self, arg, from_tty): try: @@ -88,7 +92,7 @@ obj = self.gdb.parse_and_eval(arg) hdr = lookup(obj, '_gcheader') tid = hdr['h_tid'] - if sys.maxint < 2**32: + if sys.maxsize < 2**32: offset = tid & 0xFFFF # 32bit else: offset = tid & 0xFFFFFFFF # 64bit @@ -147,13 +151,13 @@ if linenum in self.line2offset: return self.line2offset[linenum] line = self.lines[linenum] - member, descr = map(str.strip, line.split(None, 1)) - if sys.maxint < 2**32: + member, descr = [x.strip() for x in line.split(None, 1)] + if sys.maxsize < 2**32: TIDT = "int*" else: TIDT = "char*" expr = ("((%s)(&pypy_g_typeinfo.%s)) - (%s)&pypy_g_typeinfo" - % (TIDT, member, TIDT)) + % (TIDT, member.decode("latin-1"), TIDT)) offset = int(self.gdb.parse_and_eval(expr)) self.line2offset[linenum] = offset self.offset2descr[offset] = descr @@ -164,7 +168,7 @@ # binary search through the lines, asking gdb to parse stuff lazily if offset in self.offset2descr: return self.offset2descr[offset] - if not (0 < offset < sys.maxint): + if not (0 < offset < sys.maxsize): return None linerange = (0, len(self.lines)) while linerange[0] < linerange[1]: diff --git a/rpython/jit/metainterp/optimizeopt/earlyforce.py b/rpython/jit/metainterp/optimizeopt/earlyforce.py --- a/rpython/jit/metainterp/optimizeopt/earlyforce.py +++ b/rpython/jit/metainterp/optimizeopt/earlyforce.py @@ -28,8 +28,5 @@ value.force_box(self) self.emit_operation(op) - def new(self): - return OptEarlyForce() - def setup(self): self.optimizer.optearlyforce = self diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -184,9 +184,6 @@ self.postponed_op = None self.next_optimization.propagate_forward(postponed_op) - def new(self): - return OptHeap() - def produce_potential_short_preamble_ops(self, sb): descrkeys = self.cached_fields.keys() if not we_are_translated(): diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py --- a/rpython/jit/metainterp/optimizeopt/intbounds.py +++ b/rpython/jit/metainterp/optimizeopt/intbounds.py @@ -13,9 +13,6 @@ """Keeps track of the bounds placed on integers by guards and remove redundant guards""" - def new(self): - return OptIntBounds() - def propagate_forward(self, op): dispatch_opt(self, op) diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -323,10 +323,6 @@ def force_at_end_of_preamble(self): pass - # It is too late to force stuff here, it must be done in force_at_end_of_preamble - def new(self): - raise NotImplementedError - # Called after last operation has been propagated to flush out any posponed ops def flush(self): pass @@ -390,16 +386,6 @@ for o in self.optimizations: o.flush() - def new(self): - new = Optimizer(self.metainterp_sd, self.loop) - return self._new(new) - - def _new(self, new): - optimizations = [o.new() for o in self.optimizations] - new.set_optimizations(optimizations) - new.quasi_immutable_deps = self.quasi_immutable_deps - return new - def produce_potential_short_preamble_ops(self, sb): for opt in self.optimizations: opt.produce_potential_short_preamble_ops(sb) diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py --- a/rpython/jit/metainterp/optimizeopt/pure.py +++ b/rpython/jit/metainterp/optimizeopt/pure.py @@ -85,10 +85,6 @@ def flush(self): assert self.postponed_op is None - def new(self): - assert self.postponed_op is None - return OptPure() - def setup(self): self.optimizer.optpure = self diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -20,9 +20,6 @@ self.loop_invariant_results = {} self.loop_invariant_producer = {} - def new(self): - return OptRewrite() - def produce_potential_short_preamble_ops(self, sb): for op in self.loop_invariant_producer.values(): sb.add_potential(op) diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py --- a/rpython/jit/metainterp/optimizeopt/unroll.py +++ b/rpython/jit/metainterp/optimizeopt/unroll.py @@ -41,10 +41,6 @@ self.emitted_guards += 1 # FIXME: can we use counter in self._emit_operation? self._emit_operation(op) - def new(self): - new = UnrollableOptimizer(self.metainterp_sd, self.loop) - return self._new(new) - class UnrollOptimizer(Optimization): """Unroll the loop into two iterations. The first one will diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py --- a/rpython/jit/metainterp/optimizeopt/virtualize.py +++ b/rpython/jit/metainterp/optimizeopt/virtualize.py @@ -497,9 +497,6 @@ _last_guard_not_forced_2 = None - def new(self): - return OptVirtualize() - def make_virtual(self, known_class, box, source_op=None): vvalue = VirtualValue(self.optimizer.cpu, known_class, box, source_op) self.make_equal_to(box, vvalue) diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py --- a/rpython/jit/metainterp/optimizeopt/vstring.py +++ b/rpython/jit/metainterp/optimizeopt/vstring.py @@ -388,8 +388,6 @@ class OptString(optimizer.Optimization): "Handling of strings and unicodes." - def new(self): - return OptString() def make_vstring_plain(self, box, source_op, mode): vvalue = VStringPlainValue(box, source_op, mode) diff --git a/rpython/rtyper/lltypesystem/rstr.py b/rpython/rtyper/lltypesystem/rstr.py --- a/rpython/rtyper/lltypesystem/rstr.py +++ b/rpython/rtyper/lltypesystem/rstr.py @@ -624,6 +624,7 @@ i += 1 return count + @signature(types.any(), types.any(), types.int(), types.int(), returns=types.int()) def ll_find(s1, s2, start, end): if start < 0: start = 0 @@ -638,6 +639,7 @@ return LLHelpers.ll_search(s1, s2, start, end, FAST_FIND) + @signature(types.any(), types.any(), types.int(), types.int(), returns=types.int()) def ll_rfind(s1, s2, start, end): if start < 0: start = 0 diff --git a/rpython/translator/unsimplify.py b/rpython/translator/unsimplify.py --- a/rpython/translator/unsimplify.py +++ b/rpython/translator/unsimplify.py @@ -132,11 +132,6 @@ block.exitswitch = None return link -def split_block_at_start(annotator, block): - # split before the first op, preserve order and inputargs - # in the second block! - return split_block(annotator, block, 0, _forcelink=block.inputargs) - def remove_double_links(annotator, graph): """This can be useful for code generators: it ensures that no block has more than one incoming links from one and the same other block. It allows _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit