Author: Alex Gaynor <alex.gay...@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)] _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit