Author: Manuel Jacob
Branch: refactor-str-types
Changeset: r68684:0dcdafb5d639
Date: 2014-01-15 13:59 +0100
http://bitbucket.org/pypy/pypy/changeset/0dcdafb5d639/
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 call_initial_function(translator, initial_func, annhelper=None):
"""Before the program starts, call 'initial_func()'."""
from rpython.annotator import model as annmodel
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit