Author: Alex Gaynor <[email protected]>
Branch: kill-someobject
Changeset: r57884:bf2fa5d5c6d1
Date: 2012-10-08 11:05 +0200
http://bitbucket.org/pypy/pypy/changeset/bf2fa5d5c6d1/
Log: Merged default in.
diff --git a/pypy/doc/discussion/improve-rpython.rst
b/pypy/doc/discussion/improve-rpython.rst
--- a/pypy/doc/discussion/improve-rpython.rst
+++ b/pypy/doc/discussion/improve-rpython.rst
@@ -41,9 +41,6 @@
llexternal functions. For a typical usage, see
`pypy.rlib.rsocket.RSocket.getsockopt_int`.
-- Support context managers and the `with` statement. This could be a workaround
- before the previous point is available.
-
Extensible type system for llexternal
-------------------------------------
diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py
--- a/pypy/module/_file/interp_file.py
+++ b/pypy/module/_file/interp_file.py
@@ -185,7 +185,7 @@
return stream.readline()
else:
# very inefficient unless there is a peek()
- result = []
+ result = StringBuilder()
while size > 0:
# "peeks" on the underlying stream to see how many chars
# we can safely read without reading past an end-of-line
@@ -200,7 +200,7 @@
if c.endswith('\n'):
break
size -= len(c)
- return ''.join(result)
+ return result.build()
@unwrap_spec(size=int)
def direct_readlines(self, size=0):
diff --git a/pypy/module/_file/test/test_file.py
b/pypy/module/_file/test/test_file.py
--- a/pypy/module/_file/test/test_file.py
+++ b/pypy/module/_file/test/test_file.py
@@ -428,6 +428,18 @@
pass
assert f.subclass_closed
+ def test_readline_unbuffered_should_read_one_line_only(self):
+ import posix
+
+ with self.file(self.temppath, 'w') as f:
+ f.write('foo\nbar\n')
+
+ with self.file(self.temppath, 'r', 0) as f:
+ s = f.readline()
+ assert s == 'foo\n'
+ s = posix.read(f.fileno(), 10)
+ assert s == 'bar\n'
+
def test_flush_at_exit():
from pypy import conftest
from pypy.tool.option import make_config, make_objspace
diff --git a/pypy/rlib/rbigint.py b/pypy/rlib/rbigint.py
--- a/pypy/rlib/rbigint.py
+++ b/pypy/rlib/rbigint.py
@@ -644,8 +644,7 @@
# j = (m+) % SHIFT = (m+) - (i * SHIFT)
# (computed without doing "i * SHIFT", which might overflow)
j = size_b % 5
- if j != 0:
- j = 5 - j
+ j = _jmapping[j]
if not we_are_translated():
assert j == (size_b*SHIFT+4)//5*5 - size_b*SHIFT
#
@@ -866,6 +865,12 @@
ONENEGATIVERBIGINT = rbigint([ONEDIGIT], -1, 1)
NULLRBIGINT = rbigint()
+_jmapping = [(5 * SHIFT) % 5,
+ (4 * SHIFT) % 5,
+ (3 * SHIFT) % 5,
+ (2 * SHIFT) % 5,
+ (1 * SHIFT) % 5]
+
#_________________________________________________________________
# Helper Functions
diff --git a/pypy/rlib/rsre/rsre_re.py b/pypy/rlib/rsre/rsre_re.py
--- a/pypy/rlib/rsre/rsre_re.py
+++ b/pypy/rlib/rsre/rsre_re.py
@@ -75,7 +75,7 @@
else:
item = match.groups("")
matchlist.append(item)
- return matchlist
+ return matchlist
def finditer(self, string, pos=0, endpos=sys.maxint):
return iter(self.scanner(string, pos, endpos).search, None)
diff --git a/pypy/rlib/streamio.py b/pypy/rlib/streamio.py
--- a/pypy/rlib/streamio.py
+++ b/pypy/rlib/streamio.py
@@ -41,6 +41,7 @@
from pypy.rlib.objectmodel import specialize, we_are_translated
from pypy.rlib.rarithmetic import r_longlong, intmask
from pypy.rlib import rposix
+from pypy.rlib.rstring import StringBuilder
from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC
O_BINARY = getattr(os, "O_BINARY", 0)
@@ -141,8 +142,7 @@
def construct_stream_tower(stream, buffering, universal, reading, writing,
binary):
if buffering == 0: # no buffering
- if reading: # force some minimal buffering for readline()
- stream = ReadlineInputStream(stream)
+ pass
elif buffering == 1: # line-buffering
if writing:
stream = LineBufferingOutputStream(stream)
@@ -303,6 +303,26 @@
raise
# else try again
+ def readline(self):
+ # mostly inefficient, but not as laughably bad as with the default
+ # readline() from Stream
+ result = StringBuilder()
+ while True:
+ try:
+ c = os.read(self.fd, 1)
+ except OSError, e:
+ if e.errno != errno.EINTR:
+ raise
+ else:
+ continue # try again
+ if not c:
+ break
+ c = c[0]
+ result.append(c)
+ if c == '\n':
+ break
+ return result.build()
+
def write(self, data):
while data:
try:
@@ -700,113 +720,6 @@
flush_buffers=False)
-class ReadlineInputStream(Stream):
-
- """Minimal buffering input stream.
-
- Only does buffering for readline(). The other kinds of reads, and
- all writes, are not buffered at all.
- """
-
- bufsize = 2**13 # 8 K
-
- def __init__(self, base, bufsize=-1):
- self.base = base
- self.do_read = base.read # function to fill buffer some more
- self.do_seek = base.seek # seek to a byte offset
- if bufsize == -1: # Get default from the class
- bufsize = self.bufsize
- self.bufsize = bufsize # buffer size (hint only)
- self.buf = None # raw data (may contain "\n")
- self.bufstart = 0
-
- def flush_buffers(self):
- if self.buf is not None:
- try:
- self.do_seek(self.bufstart-len(self.buf), 1)
- except (MyNotImplementedError, OSError):
- pass
- else:
- self.buf = None
- self.bufstart = 0
-
- def readline(self):
- if self.buf is not None:
- i = self.buf.find('\n', self.bufstart)
- else:
- self.buf = ''
- i = -1
- #
- if i < 0:
- self.buf = self.buf[self.bufstart:]
- self.bufstart = 0
- while True:
- bufsize = max(self.bufsize, len(self.buf) >> 2)
- data = self.do_read(bufsize)
- if not data:
- result = self.buf # end-of-file reached
- self.buf = None
- return result
- startsearch = len(self.buf) # there is no '\n' in buf so far
- self.buf += data
- i = self.buf.find('\n', startsearch)
- if i >= 0:
- break
- #
- i += 1
- result = self.buf[self.bufstart:i]
- self.bufstart = i
- return result
-
- def peek(self):
- if self.buf is None:
- return ''
- if self.bufstart > 0:
- self.buf = self.buf[self.bufstart:]
- self.bufstart = 0
- return self.buf
-
- def tell(self):
- pos = self.base.tell()
- if self.buf is not None:
- pos -= (len(self.buf) - self.bufstart)
- return pos
-
- def readall(self):
- result = self.base.readall()
- if self.buf is not None:
- result = self.buf[self.bufstart:] + result
- self.buf = None
- self.bufstart = 0
- return result
-
- def read(self, n):
- if self.buf is None:
- return self.do_read(n)
- else:
- m = n - (len(self.buf) - self.bufstart)
- start = self.bufstart
- if m > 0:
- result = self.buf[start:] + self.do_read(m)
- self.buf = None
- self.bufstart = 0
- return result
- elif n >= 0:
- self.bufstart = start + n
- return self.buf[start : self.bufstart]
- else:
- return ''
-
- seek = PassThrough("seek", flush_buffers=True)
- write = PassThrough("write", flush_buffers=True)
- truncate = PassThrough("truncate", flush_buffers=True)
- flush = PassThrough("flush", flush_buffers=True)
- flushable = PassThrough("flushable", flush_buffers=False)
- close = PassThrough("close", flush_buffers=False)
- try_to_find_file_descriptor = PassThrough("try_to_find_file_descriptor",
- flush_buffers=False)
-
-
class BufferingOutputStream(Stream):
"""Standard buffering output stream.
diff --git a/pypy/rlib/test/test_rbigint.py b/pypy/rlib/test/test_rbigint.py
--- a/pypy/rlib/test/test_rbigint.py
+++ b/pypy/rlib/test/test_rbigint.py
@@ -396,6 +396,14 @@
v = two.pow(t, rbigint.fromint(n))
assert v.toint() == pow(2, t.tolong(), n)
+ def test_pow_lll_bug2(self):
+ x = rbigint.fromlong(2)
+ y =
rbigint.fromlong(5100894665148900058249470019412564146962964987365857466751243988156579407594163282788332839328303748028644825680244165072186950517295679131100799612871613064597)
+ z = rbigint.fromlong(538564)
+ expected = rbigint.fromlong(163464)
+ got = x.pow(y, z)
+ assert got.eq(expected)
+
def test_pow_lln(self):
x = 10L
y = 2L
diff --git a/pypy/rlib/test/test_streamio.py b/pypy/rlib/test/test_streamio.py
--- a/pypy/rlib/test/test_streamio.py
+++ b/pypy/rlib/test/test_streamio.py
@@ -1026,7 +1026,7 @@
base.tell = f
if not seek:
base.seek = f
- return streamio.ReadlineInputStream(base, bufsize)
+ return base
def test_readline(self):
for file in [self.makeStream(), self.makeStream(bufsize=2)]:
diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py
--- a/pypy/translator/c/genc.py
+++ b/pypy/translator/c/genc.py
@@ -545,7 +545,7 @@
localpath = py.path.local(g.filename)
pypkgpath = localpath.pypkgpath()
if pypkgpath:
- relpypath = localpath.relto(pypkgpath)
+ relpypath = localpath.relto(pypkgpath.dirname)
return relpypath.replace('.py', '.c')
return None
if hasattr(node.obj, 'graph'):
diff --git a/pypy/translator/c/test/test_dlltool.py
b/pypy/translator/c/test/test_dlltool.py
--- a/pypy/translator/c/test/test_dlltool.py
+++ b/pypy/translator/c/test/test_dlltool.py
@@ -28,4 +28,4 @@
d = DLLDef('lib', [(f, [int]), (b, [int])])
so = d.compile()
dirpath = py.path.local(so).dirpath()
- assert dirpath.join('translator_c_test_test_dlltool.c').check()
+ assert dirpath.join('pypy_translator_c_test_test_dlltool.c').check()
diff --git a/pypy/translator/c/test/test_standalone.py
b/pypy/translator/c/test/test_standalone.py
--- a/pypy/translator/c/test/test_standalone.py
+++ b/pypy/translator/c/test/test_standalone.py
@@ -57,9 +57,9 @@
# Verify that the generated C files have sane names:
gen_c_files = [str(f) for f in cbuilder.extrafiles]
- for expfile in ('rlib_rposix.c',
- 'rpython_lltypesystem_rstr.c',
- 'translator_c_test_test_standalone.c'):
+ for expfile in ('pypy_rlib_rposix.c',
+ 'pypy_rpython_lltypesystem_rstr.c',
+ 'pypy_translator_c_test_test_standalone.c'):
assert cbuilder.targetdir.join(expfile) in gen_c_files
def test_print(self):
diff --git a/pypy/translator/platform/__init__.py
b/pypy/translator/platform/__init__.py
--- a/pypy/translator/platform/__init__.py
+++ b/pypy/translator/platform/__init__.py
@@ -240,12 +240,15 @@
if sys.platform.startswith('linux'):
- from pypy.translator.platform.linux import Linux, Linux64
+ from pypy.translator.platform.linux import Linux, LinuxPIC
import platform
- if platform.architecture()[0] == '32bit':
+ # Only required on armhf and mips{,el}, not armel. But there's no way to
+ # detect armhf without shelling out
+ if (platform.architecture()[0] == '64bit'
+ or platform.machine().startswith(('arm', 'mips'))):
+ host_factory = LinuxPIC
+ else:
host_factory = Linux
- else:
- host_factory = Linux64
elif sys.platform == 'darwin':
from pypy.translator.platform.darwin import Darwin_i386, Darwin_x86_64,
Darwin_PowerPC
import platform
@@ -257,6 +260,13 @@
host_factory = Darwin_i386
else:
host_factory = Darwin_x86_64
+elif "gnukfreebsd" in sys.platform:
+ from pypy.translator.platform.freebsd import GNUkFreebsd, GNUkFreebsd_64
+ import platform
+ if platform.architecture()[0] == '32bit':
+ host_factory = GNUkFreebsd
+ else:
+ host_factory = GNUkFreebsd_64
elif "freebsd" in sys.platform:
from pypy.translator.platform.freebsd import Freebsd, Freebsd_64
import platform
diff --git a/pypy/translator/platform/freebsd.py
b/pypy/translator/platform/freebsd.py
--- a/pypy/translator/platform/freebsd.py
+++ b/pypy/translator/platform/freebsd.py
@@ -52,3 +52,9 @@
class Freebsd_64(Freebsd):
shared_only = ('-fPIC',)
+
+class GNUkFreebsd(Freebsd):
+ extra_libs = ('-lrt',)
+
+class GNUkFreebsd_64(Freebsd_64):
+ extra_libs = ('-lrt',)
diff --git a/pypy/translator/platform/linux.py
b/pypy/translator/platform/linux.py
--- a/pypy/translator/platform/linux.py
+++ b/pypy/translator/platform/linux.py
@@ -48,5 +48,5 @@
shared_only = () # it seems that on 32-bit linux, compiling with -fPIC
# gives assembler that asmgcc is not happy about.
-class Linux64(BaseLinux):
+class LinuxPIC(BaseLinux):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit