[pypy-commit] pypy default: merged upstream
alex_gaynor
noreply at buildbot.pypy.org
Sun Jun 30 05:54:55 CEST 2013
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r65118:896493e4c586
Date: 2013-06-29 20:54 -0700
http://bitbucket.org/pypy/pypy/changeset/896493e4c586/
Log: merged upstream
diff --git a/lib_pypy/ctypes_config_cache/syslog.ctc.py b/lib_pypy/ctypes_config_cache/syslog.ctc.py
deleted file mode 100644
--- a/lib_pypy/ctypes_config_cache/syslog.ctc.py
+++ /dev/null
@@ -1,75 +0,0 @@
-"""
-'ctypes_configure' source for syslog.py.
-Run this to rebuild _syslog_cache.py.
-"""
-
-from ctypes_configure.configure import (configure,
- ExternalCompilationInfo, ConstantInteger, DefinedConstantInteger)
-import dumpcache
-
-
-_CONSTANTS = (
- 'LOG_EMERG',
- 'LOG_ALERT',
- 'LOG_CRIT',
- 'LOG_ERR',
- 'LOG_WARNING',
- 'LOG_NOTICE',
- 'LOG_INFO',
- 'LOG_DEBUG',
-
- 'LOG_PID',
- 'LOG_CONS',
- 'LOG_NDELAY',
-
- 'LOG_KERN',
- 'LOG_USER',
- 'LOG_MAIL',
- 'LOG_DAEMON',
- 'LOG_AUTH',
- 'LOG_LPR',
- 'LOG_LOCAL0',
- 'LOG_LOCAL1',
- 'LOG_LOCAL2',
- 'LOG_LOCAL3',
- 'LOG_LOCAL4',
- 'LOG_LOCAL5',
- 'LOG_LOCAL6',
- 'LOG_LOCAL7',
-)
-_OPTIONAL_CONSTANTS = (
- 'LOG_NOWAIT',
- 'LOG_PERROR',
-
- 'LOG_SYSLOG',
- 'LOG_CRON',
- 'LOG_UUCP',
- 'LOG_NEWS',
-)
-
-# Constant aliases if there are not defined
-_ALIAS = (
- ('LOG_SYSLOG', 'LOG_DAEMON'),
- ('LOG_CRON', 'LOG_DAEMON'),
- ('LOG_NEWS', 'LOG_MAIL'),
- ('LOG_UUCP', 'LOG_MAIL'),
-)
-
-class SyslogConfigure:
- _compilation_info_ = ExternalCompilationInfo(includes=['sys/syslog.h'])
-for key in _CONSTANTS:
- setattr(SyslogConfigure, key, ConstantInteger(key))
-for key in _OPTIONAL_CONSTANTS:
- setattr(SyslogConfigure, key, DefinedConstantInteger(key))
-
-config = configure(SyslogConfigure)
-for key in _OPTIONAL_CONSTANTS:
- if config[key] is None:
- del config[key]
-for alias, key in _ALIAS:
- config.setdefault(alias, config[key])
-
-all_constants = config.keys()
-all_constants.sort()
-config['ALL_CONSTANTS'] = tuple(all_constants)
-dumpcache.dumpcache2('syslog', config)
diff --git a/lib_pypy/grp.py b/lib_pypy/grp.py
--- a/lib_pypy/grp.py
+++ b/lib_pypy/grp.py
@@ -8,6 +8,7 @@
from ctypes import Structure, c_char_p, c_int, POINTER
from ctypes_support import standard_c_lib as libc
+import _structseq
try: from __pypy__ import builtinify
except ImportError: builtinify = lambda f: f
@@ -23,32 +24,13 @@
('gr_mem', POINTER(c_char_p)),
)
-class Group(object):
- def __init__(self, gr_name, gr_passwd, gr_gid, gr_mem):
- self.gr_name = gr_name
- self.gr_passwd = gr_passwd
- self.gr_gid = gr_gid
- self.gr_mem = gr_mem
+class struct_group:
+ __metaclass__ = _structseq.structseqtype
- def __getitem__(self, item):
- if item == 0:
- return self.gr_name
- elif item == 1:
- return self.gr_passwd
- elif item == 2:
- return self.gr_gid
- elif item == 3:
- return self.gr_mem
- else:
- raise IndexError(item)
-
- def __len__(self):
- return 4
-
- def __repr__(self):
- return str((self.gr_name, self.gr_passwd, self.gr_gid, self.gr_mem))
-
- # whatever else...
+ gr_name = _structseq.structseqfield(0)
+ gr_passwd = _structseq.structseqfield(1)
+ gr_gid = _structseq.structseqfield(2)
+ gr_mem = _structseq.structseqfield(3)
libc.getgrgid.argtypes = [gid_t]
libc.getgrgid.restype = POINTER(GroupStruct)
@@ -71,8 +53,8 @@
while res.contents.gr_mem[i]:
mem.append(res.contents.gr_mem[i])
i += 1
- return Group(res.contents.gr_name, res.contents.gr_passwd,
- res.contents.gr_gid, mem)
+ return struct_group((res.contents.gr_name, res.contents.gr_passwd,
+ res.contents.gr_gid, mem))
@builtinify
def getgrgid(gid):
diff --git a/lib_pypy/syslog.py b/lib_pypy/syslog.py
--- a/lib_pypy/syslog.py
+++ b/lib_pypy/syslog.py
@@ -1,3 +1,4 @@
+# this cffi version was rewritten based on the
# ctypes implementation: Victor Stinner, 2008-05-08
"""
This module provides an interface to the Unix syslog library routines.
@@ -9,34 +10,84 @@
if sys.platform == 'win32':
raise ImportError("No syslog on Windows")
-# load the platform-specific cache made by running syslog.ctc.py
-from ctypes_config_cache._syslog_cache import *
-
-from ctypes_support import standard_c_lib as libc
-from ctypes import c_int, c_char_p
+from cffi import FFI
try: from __pypy__ import builtinify
except ImportError: builtinify = lambda f: f
+ffi = FFI()
-# Real prototype is:
-# void syslog(int priority, const char *format, ...);
-# But we also need format ("%s") and one format argument (message)
-_syslog = libc.syslog
-_syslog.argtypes = (c_int, c_char_p, c_char_p)
-_syslog.restype = None
+ffi.cdef("""
+/* mandatory constants */
+#define LOG_EMERG ...
+#define LOG_ALERT ...
+#define LOG_CRIT ...
+#define LOG_ERR ...
+#define LOG_WARNING ...
+#define LOG_NOTICE ...
+#define LOG_INFO ...
+#define LOG_DEBUG ...
-_openlog = libc.openlog
-_openlog.argtypes = (c_char_p, c_int, c_int)
-_openlog.restype = None
+#define LOG_PID ...
+#define LOG_CONS ...
+#define LOG_NDELAY ...
-_closelog = libc.closelog
-_closelog.argtypes = None
-_closelog.restype = None
+#define LOG_KERN ...
+#define LOG_USER ...
+#define LOG_MAIL ...
+#define LOG_DAEMON ...
+#define LOG_AUTH ...
+#define LOG_LPR ...
+#define LOG_LOCAL0 ...
+#define LOG_LOCAL1 ...
+#define LOG_LOCAL2 ...
+#define LOG_LOCAL3 ...
+#define LOG_LOCAL4 ...
+#define LOG_LOCAL5 ...
+#define LOG_LOCAL6 ...
+#define LOG_LOCAL7 ...
-_setlogmask = libc.setlogmask
-_setlogmask.argtypes = (c_int,)
-_setlogmask.restype = c_int
+/* optional constants, gets defined to -919919 if missing */
+#define LOG_NOWAIT ...
+#define LOG_PERROR ...
+
+/* aliased constants, gets defined as some other constant if missing */
+#define LOG_SYSLOG ...
+#define LOG_CRON ...
+#define LOG_UUCP ...
+#define LOG_NEWS ...
+
+/* functions */
+void openlog(const char *ident, int option, int facility);
+void syslog(int priority, const char *format, const char *string);
+// NB. the signature of syslog() is specialized to the only case we use
+void closelog(void);
+int setlogmask(int mask);
+""")
+
+lib = ffi.verify("""
+#include <syslog.h>
+
+#ifndef LOG_NOWAIT
+#define LOG_NOWAIT -919919
+#endif
+#ifndef LOG_PERROR
+#define LOG_PERROR -919919
+#endif
+#ifndef LOG_SYSLOG
+#define LOG_SYSLOG LOG_DAEMON
+#endif
+#ifndef LOG_CRON
+#define LOG_CRON LOG_DAEMON
+#endif
+#ifndef LOG_UUCP
+#define LOG_UUCP LOG_MAIL
+#endif
+#ifndef LOG_NEWS
+#define LOG_NEWS LOG_MAIL
+#endif
+""")
+
_S_log_open = False
_S_ident_o = None
@@ -52,12 +103,17 @@
return None
@builtinify
-def openlog(ident=None, logoption=0, facility=LOG_USER):
+def openlog(ident=None, logoption=0, facility=lib.LOG_USER):
global _S_ident_o, _S_log_open
if ident is None:
ident = _get_argv()
- _S_ident_o = c_char_p(ident) # keepalive
- _openlog(_S_ident_o, logoption, facility)
+ if ident is None:
+ _S_ident_o = ffi.NULL
+ elif isinstance(ident, str):
+ _S_ident_o = ffi.new("char[]", ident) # keepalive
+ else:
+ raise TypeError("'ident' must be a string or None")
+ lib.openlog(_S_ident_o, logoption, facility)
_S_log_open = True
@builtinify
@@ -69,19 +125,19 @@
# if log is not opened, open it now
if not _S_log_open:
openlog()
- _syslog(priority, "%s", message)
+ lib.syslog(priority, "%s", message)
@builtinify
def closelog():
global _S_log_open, S_ident_o
if _S_log_open:
- _closelog()
+ lib.closelog()
_S_log_open = False
_S_ident_o = None
@builtinify
def setlogmask(mask):
- return _setlogmask(mask)
+ return lib.setlogmask(mask)
@builtinify
def LOG_MASK(pri):
@@ -91,8 +147,15 @@
def LOG_UPTO(pri):
return (1 << (pri + 1)) - 1
-__all__ = ALL_CONSTANTS + (
+__all__ = []
+
+for name in sorted(lib.__dict__):
+ if name.startswith('LOG_'):
+ value = getattr(lib, name)
+ if value != -919919:
+ globals()[name] = value
+ __all__.append(name)
+
+__all__ = tuple(__all__) + (
'openlog', 'syslog', 'closelog', 'setlogmask',
'LOG_MASK', 'LOG_UPTO')
-
-del ALL_CONSTANTS
diff --git a/pypy/module/_io/interp_iobase.py b/pypy/module/_io/interp_iobase.py
--- a/pypy/module/_io/interp_iobase.py
+++ b/pypy/module/_io/interp_iobase.py
@@ -101,6 +101,9 @@
raise OperationError(
space.w_ValueError, space.wrap(message))
+ def check_closed_w(self, space):
+ self._check_closed(space)
+
def closed_get_w(self, space):
return space.newbool(self.__IOBase_closed)
@@ -277,6 +280,7 @@
_checkReadable = interp2app(check_readable_w),
_checkWritable = interp2app(check_writable_w),
_checkSeekable = interp2app(check_seekable_w),
+ _checkClosed = interp2app(W_IOBase.check_closed_w),
closed = GetSetProperty(W_IOBase.closed_get_w),
__dict__ = GetSetProperty(descr_get_dict, descr_set_dict, cls=W_IOBase),
__weakref__ = make_weakref_descr(W_IOBase),
diff --git a/pypy/module/_io/test/test_io.py b/pypy/module/_io/test/test_io.py
--- a/pypy/module/_io/test/test_io.py
+++ b/pypy/module/_io/test/test_io.py
@@ -22,7 +22,9 @@
import io
with io.BufferedIOBase() as f:
assert not f.closed
+ f._checkClosed()
assert f.closed
+ raises(ValueError, f._checkClosed)
def test_iter(self):
import io
diff --git a/pypy/module/micronumpy/arrayimpl/scalar.py b/pypy/module/micronumpy/arrayimpl/scalar.py
--- a/pypy/module/micronumpy/arrayimpl/scalar.py
+++ b/pypy/module/micronumpy/arrayimpl/scalar.py
@@ -13,6 +13,9 @@
def next(self):
self.called_once = True
+ def next_skip_x(self, n):
+ self.called_once = True
+
def getitem(self):
return self.v.get_scalar_value()
diff --git a/pypy/module/micronumpy/iter.py b/pypy/module/micronumpy/iter.py
--- a/pypy/module/micronumpy/iter.py
+++ b/pypy/module/micronumpy/iter.py
@@ -37,7 +37,7 @@
we can go faster.
All the calculations happen in next()
-next_skip_x() tries to do the iteration for a number of steps at once,
+next_skip_x(steps) tries to do the iteration for a number of steps at once,
but then we cannot gaurentee that we only overflow one single shape
dimension, perhaps we could overflow times in one big step.
"""
diff --git a/pypy/module/micronumpy/test/test_iter.py b/pypy/module/micronumpy/test/test_iter.py
--- a/pypy/module/micronumpy/test/test_iter.py
+++ b/pypy/module/micronumpy/test/test_iter.py
@@ -1,4 +1,5 @@
from pypy.module.micronumpy.iter import MultiDimViewIterator
+from pypy.module.micronumpy.arrayimpl.scalar import ScalarIterator
class MockArray(object):
size = 1
@@ -8,7 +9,7 @@
#Let's get started, simple iteration in C order with
#contiguous layout => strides[-1] is 1
start = 0
- shape = [3, 5]
+ shape = [3, 5]
strides = [5, 1]
backstrides = [x * (y - 1) for x,y in zip(strides, shape)]
assert backstrides == [10, 4]
@@ -47,7 +48,7 @@
#iteration in C order with #contiguous layout => strides[-1] is 1
#skip less than the shape
start = 0
- shape = [3, 5]
+ shape = [3, 5]
strides = [5, 1]
backstrides = [x * (y - 1) for x,y in zip(strides, shape)]
assert backstrides == [10, 4]
@@ -89,3 +90,9 @@
assert i.indexes == [0,1]
assert i.offset == 3
assert i.done()
+
+ def test_scalar_iter(self):
+ i = ScalarIterator(MockArray)
+ i.next()
+ i.next_skip_x(3)
+ assert i.done()
diff --git a/pypy/module/test_lib_pypy/test_ctypes_config_cache.py b/pypy/module/test_lib_pypy/test_ctypes_config_cache.py
--- a/pypy/module/test_lib_pypy/test_ctypes_config_cache.py
+++ b/pypy/module/test_lib_pypy/test_ctypes_config_cache.py
@@ -32,14 +32,6 @@
return d
-def test_syslog():
- try:
- import lib_pypy.syslog
- except ImportError:
- py.test.skip('no syslog on this platform')
- d = run('syslog.ctc.py', '_syslog_cache.py')
- assert 'LOG_NOTICE' in d
-
def test_resource():
try:
import lib_pypy.resource
diff --git a/pypy/module/test_lib_pypy/test_grp_extra.py b/pypy/module/test_lib_pypy/test_grp_extra.py
--- a/pypy/module/test_lib_pypy/test_grp_extra.py
+++ b/pypy/module/test_lib_pypy/test_grp_extra.py
@@ -5,6 +5,22 @@
except ImportError:
py.test.skip("No grp module on this platform")
+def test_basic():
+ g = grp.getgrnam("root")
+ assert g.gr_gid == 0
+ assert g.gr_mem == ['root'] or g.gr_mem == []
+ assert g.gr_name == 'root'
+ assert isinstance(g.gr_passwd, str) # usually just 'x', don't hope :-)
+
def test_extra():
py.test.raises(TypeError, grp.getgrnam, False)
py.test.raises(TypeError, grp.getgrnam, None)
+
+def test_struct_group():
+ g = grp.struct_group((10, 20, 30, 40))
+ assert len(g) == 4
+ assert list(g) == [10, 20, 30, 40]
+ assert g.gr_name == 10
+ assert g.gr_passwd == 20
+ assert g.gr_gid == 30
+ assert g.gr_mem == 40
diff --git a/pypy/module/test_lib_pypy/test_syslog.py b/pypy/module/test_lib_pypy/test_syslog.py
--- a/pypy/module/test_lib_pypy/test_syslog.py
+++ b/pypy/module/test_lib_pypy/test_syslog.py
@@ -1,15 +1,15 @@
from __future__ import absolute_import
-import py
+import sys, py
try:
from lib_pypy import syslog
except ImportError:
py.test.skip('no syslog on this platform')
+except AssertionError:
+ if '__pypy__' in sys.builtin_module_names:
+ raise
+ py.test.skip('AssertionError during import (wrong cffi version?)')
# XXX very minimal test
-from lib_pypy.ctypes_config_cache import rebuild
-rebuild.rebuild_one('syslog.ctc.py')
-
-
def test_syslog():
assert hasattr(syslog, 'LOG_ALERT')
diff --git a/pypy/tool/release/package.py b/pypy/tool/release/package.py
--- a/pypy/tool/release/package.py
+++ b/pypy/tool/release/package.py
@@ -69,6 +69,7 @@
subprocess.check_call([str(pypy_c), '-c', 'import _sqlite3'])
if not sys.platform == 'win32':
subprocess.check_call([str(pypy_c), '-c', 'import _curses'])
+ subprocess.check_call([str(pypy_c), '-c', 'import syslog'])
if sys.platform == 'win32' and not rename_pypy_c.lower().endswith('.exe'):
rename_pypy_c += '.exe'
binaries = [(pypy_c, rename_pypy_c)]
More information about the pypy-commit
mailing list