[pypy-commit] pypy quiet-rpython: hg merge default
Aquana
noreply at buildbot.pypy.org
Tue Jan 29 13:16:16 CET 2013
Author: Alexander Hesse <webmaster at aquanasoft.de>
Branch: quiet-rpython
Changeset: r60671:f169915b9457
Date: 2013-01-29 13:15 +0100
http://bitbucket.org/pypy/pypy/changeset/f169915b9457/
Log: hg merge default
diff --git a/lib-python/conftest.py b/lib-python/conftest.py
--- a/lib-python/conftest.py
+++ b/lib-python/conftest.py
@@ -61,7 +61,7 @@
usemodules = '',
skip=None):
self.basename = basename
- self._usemodules = usemodules.split() + ['signal']
+ self._usemodules = usemodules.split() + ['signal', 'rctime', 'itertools', '_socket']
self._compiler = compiler
self.core = core
self.skip = skip
@@ -93,63 +93,57 @@
m.test_main()
''' % locals())
-if sys.platform == 'win32':
- skip_win32 = "Not supported on Windows"
- only_win32 = False
-else:
- skip_win32 = False
- only_win32 = "Only on Windows"
-
testmap = [
RegrTest('test___all__.py', core=True),
RegrTest('test___future__.py', core=True),
- RegrTest('test__locale.py', skip=skip_win32),
+ RegrTest('test__locale.py', usemodules='_locale'),
RegrTest('test_abc.py'),
RegrTest('test_abstract_numbers.py'),
- RegrTest('test_aepack.py', skip=True),
+ RegrTest('test_aepack.py'),
RegrTest('test_aifc.py'),
- RegrTest('test_argparse.py'),
- RegrTest('test_al.py', skip=True),
- RegrTest('test_ast.py', core=True),
- RegrTest('test_anydbm.py'),
- RegrTest('test_applesingle.py', skip=True),
- RegrTest('test_array.py', core=True, usemodules='struct array'),
+ RegrTest('test_al.py'),
+ RegrTest('test_anydbm.py', usemodules='struct'),
+ RegrTest('test_applesingle.py'),
+ RegrTest('test_argparse.py', usemodules='binascii'),
+ RegrTest('test_array.py', core=True, usemodules='struct array binascii'),
RegrTest('test_ascii_formatd.py'),
- RegrTest('test_asynchat.py', usemodules='thread'),
- RegrTest('test_asyncore.py'),
+ RegrTest('test_ast.py', core=True, usemodules='struct'),
+ RegrTest('test_asynchat.py', usemodules='select fcntl'),
+ RegrTest('test_asyncore.py', usemodules='select fcntl'),
RegrTest('test_atexit.py', core=True),
- RegrTest('test_audioop.py', skip=True),
+ RegrTest('test_audioop.py', skip="unsupported extension module"),
RegrTest('test_augassign.py', core=True),
- RegrTest('test_base64.py'),
+ RegrTest('test_base64.py', usemodules='struct'),
RegrTest('test_bastion.py'),
+ RegrTest('test_bigaddrspace.py'),
+ RegrTest('test_bigmem.py'),
RegrTest('test_binascii.py', usemodules='binascii'),
-
RegrTest('test_binhex.py'),
-
RegrTest('test_binop.py', core=True),
RegrTest('test_bisect.py', core=True, usemodules='_bisect'),
RegrTest('test_bool.py', core=True),
- RegrTest('test_bsddb.py', skip="unsupported extension module"),
- RegrTest('test_bsddb185.py', skip="unsupported extension module"),
- RegrTest('test_bsddb3.py', skip="unsupported extension module"),
+ RegrTest('test_bsddb.py'),
+ RegrTest('test_bsddb185.py'),
+ RegrTest('test_bsddb3.py'),
RegrTest('test_buffer.py'),
RegrTest('test_bufio.py', core=True),
- RegrTest('test_builtin.py', core=True),
- RegrTest('test_bytes.py'),
+ RegrTest('test_builtin.py', core=True, usemodules='binascii'),
+ RegrTest('test_bytes.py', usemodules='struct binascii'),
RegrTest('test_bz2.py', usemodules='bz2'),
RegrTest('test_calendar.py'),
RegrTest('test_call.py', core=True),
RegrTest('test_capi.py', skip="not applicable"),
- RegrTest('test_cd.py', skip=True),
+ RegrTest('test_cd.py'),
RegrTest('test_cfgparser.py'),
-
RegrTest('test_cgi.py'),
RegrTest('test_charmapcodec.py', core=True),
- RegrTest('test_cl.py', skip=True),
+ RegrTest('test_cl.py'),
RegrTest('test_class.py', core=True),
RegrTest('test_cmath.py', core=True),
RegrTest('test_cmd.py'),
+ RegrTest('test_cmd_line.py'),
RegrTest('test_cmd_line_script.py'),
+ RegrTest('test_code.py', core=True),
RegrTest('test_codeccallbacks.py', core=True),
RegrTest('test_codecencodings_cn.py', usemodules='_multibytecodec'),
RegrTest('test_codecencodings_hk.py', usemodules='_multibytecodec'),
@@ -157,7 +151,6 @@
RegrTest('test_codecencodings_jp.py', usemodules='_multibytecodec'),
RegrTest('test_codecencodings_kr.py', usemodules='_multibytecodec'),
RegrTest('test_codecencodings_tw.py', usemodules='_multibytecodec'),
-
RegrTest('test_codecmaps_cn.py', usemodules='_multibytecodec'),
RegrTest('test_codecmaps_hk.py', usemodules='_multibytecodec'),
RegrTest('test_codecmaps_jp.py', usemodules='_multibytecodec'),
@@ -165,6 +158,7 @@
RegrTest('test_codecmaps_tw.py', usemodules='_multibytecodec'),
RegrTest('test_codecs.py', core=True, usemodules='_multibytecodec'),
RegrTest('test_codeop.py', core=True),
+ RegrTest('test_coding.py', core=True),
RegrTest('test_coercion.py', core=True),
RegrTest('test_collections.py'),
RegrTest('test_colorsys.py'),
@@ -174,22 +168,24 @@
RegrTest('test_compileall.py'),
RegrTest('test_compiler.py', core=False, skip="slowly deprecating compiler"),
RegrTest('test_complex.py', core=True),
-
+ RegrTest('test_complex_args.py'),
RegrTest('test_contains.py', core=True),
+ RegrTest('test_contextlib.py', usemodules="thread"),
RegrTest('test_cookie.py'),
RegrTest('test_cookielib.py'),
RegrTest('test_copy.py', core=True),
RegrTest('test_copy_reg.py', core=True),
RegrTest('test_cpickle.py', core=True),
- RegrTest('test_cprofile.py'),
- RegrTest('test_crypt.py', usemodules='crypt', skip=skip_win32),
+ RegrTest('test_cprofile.py'),
+ RegrTest('test_crypt.py', usemodules='crypt'),
RegrTest('test_csv.py', usemodules='_csv'),
-
- RegrTest('test_curses.py', skip="unsupported extension module"),
+ RegrTest('test_ctypes.py', usemodules="_rawffi thread"),
+ RegrTest('test_curses.py'),
RegrTest('test_datetime.py'),
RegrTest('test_dbm.py'),
RegrTest('test_decimal.py'),
RegrTest('test_decorators.py', core=True),
+ RegrTest('test_defaultdict.py', usemodules='_collections'),
RegrTest('test_deque.py', core=True, usemodules='_collections'),
RegrTest('test_descr.py', core=True, usemodules='_weakref'),
RegrTest('test_descrtut.py', core=True),
@@ -200,7 +196,7 @@
RegrTest('test_dircache.py', core=True),
RegrTest('test_dis.py'),
RegrTest('test_distutils.py', skip=True),
- RegrTest('test_dl.py', skip=True),
+ RegrTest('test_dl.py'),
RegrTest('test_doctest.py', usemodules="thread"),
RegrTest('test_doctest2.py'),
RegrTest('test_docxmlrpc.py'),
@@ -208,20 +204,22 @@
RegrTest('test_dummy_thread.py', core=True),
RegrTest('test_dummy_threading.py', core=True),
RegrTest('test_email.py'),
-
RegrTest('test_email_codecs.py'),
+ RegrTest('test_email_renamed.py'),
RegrTest('test_enumerate.py', core=True),
RegrTest('test_eof.py', core=True),
RegrTest('test_epoll.py'),
RegrTest('test_errno.py', usemodules="errno"),
+ RegrTest('test_exception_variations.py'),
RegrTest('test_exceptions.py', core=True),
RegrTest('test_extcall.py', core=True),
- RegrTest('test_fcntl.py', usemodules='fcntl', skip=skip_win32),
+ RegrTest('test_fcntl.py', usemodules='fcntl'),
RegrTest('test_file.py', usemodules="posix", core=True),
RegrTest('test_file2k.py', usemodules="posix", core=True),
RegrTest('test_filecmp.py', core=True),
RegrTest('test_fileinput.py', core=True),
RegrTest('test_fileio.py'),
+ RegrTest('test_float.py', core=True),
RegrTest('test_fnmatch.py', core=True),
RegrTest('test_fork1.py', usemodules="thread"),
RegrTest('test_format.py', core=True),
@@ -230,6 +228,7 @@
RegrTest('test_frozen.py', skip="unsupported extension module"),
RegrTest('test_ftplib.py'),
RegrTest('test_funcattrs.py', core=True),
+ RegrTest('test_functools.py'),
RegrTest('test_future.py', core=True),
RegrTest('test_future1.py', core=True),
RegrTest('test_future2.py', core=True),
@@ -239,41 +238,37 @@
RegrTest('test_future_builtins.py'),
RegrTest('test_gc.py', usemodules='_weakref', skip="implementation detail"),
RegrTest('test_gdb.py', skip="not applicable"),
- RegrTest('test_gdbm.py', skip="unsupported extension module"),
+ RegrTest('test_gdbm.py'),
RegrTest('test_generators.py', core=True, usemodules='thread _weakref'),
RegrTest('test_genericpath.py'),
RegrTest('test_genexps.py', core=True, usemodules='_weakref'),
- RegrTest('test_getargs.py', skip="unsupported extension module"),
- RegrTest('test_getargs2.py', skip="unsupported extension module"),
-
+ RegrTest('test_getargs.py'),
+ RegrTest('test_getargs2.py', usemodules='binascii', skip=True),
RegrTest('test_getopt.py', core=True),
RegrTest('test_gettext.py'),
-
- RegrTest('test_gl.py', skip=True),
+ RegrTest('test_gl.py'),
RegrTest('test_glob.py', core=True),
RegrTest('test_global.py', core=True),
RegrTest('test_grammar.py', core=True),
- RegrTest('test_grp.py', skip=skip_win32),
-
- RegrTest('test_gzip.py'),
+ RegrTest('test_grp.py'),
+ RegrTest('test_gzip.py', usemodules='zlib'),
RegrTest('test_hash.py', core=True),
RegrTest('test_hashlib.py', core=True),
-
RegrTest('test_heapq.py', core=True),
RegrTest('test_hmac.py'),
RegrTest('test_hotshot.py', skip="unsupported extension module"),
-
RegrTest('test_htmllib.py'),
RegrTest('test_htmlparser.py'),
RegrTest('test_httplib.py'),
RegrTest('test_httpservers.py'),
- RegrTest('test_imageop.py', skip="unsupported extension module"),
+ RegrTest('test_imageop.py'),
RegrTest('test_imaplib.py'),
- RegrTest('test_imgfile.py', skip="unsupported extension module"),
+ RegrTest('test_imgfile.py'),
RegrTest('test_imp.py', core=True, usemodules='thread'),
RegrTest('test_import.py', core=True),
RegrTest('test_importhooks.py', core=True),
RegrTest('test_importlib.py'),
+ RegrTest('test_index.py'),
RegrTest('test_inspect.py'),
RegrTest('test_int.py', core=True),
RegrTest('test_int_literal.py', core=True),
@@ -296,7 +291,7 @@
RegrTest('test_long_future.py', core=True),
RegrTest('test_longexp.py', core=True),
RegrTest('test_macos.py'),
- RegrTest('test_macostools.py', skip=True),
+ RegrTest('test_macostools.py'),
RegrTest('test_macpath.py'),
RegrTest('test_mailbox.py'),
RegrTest('test_marshal.py', core=True),
@@ -307,30 +302,29 @@
RegrTest('test_mhlib.py'),
RegrTest('test_mimetools.py'),
RegrTest('test_mimetypes.py'),
- RegrTest('test_MimeWriter.py', core=False),
+ RegrTest('test_MimeWriter.py', core=False, usemodules='binascii'),
RegrTest('test_minidom.py'),
RegrTest('test_mmap.py', usemodules="mmap"),
RegrTest('test_module.py', core=True),
RegrTest('test_modulefinder.py'),
- RegrTest('test_msilib.py', skip=only_win32),
+ RegrTest('test_msilib.py'),
RegrTest('test_multibytecodec.py', usemodules='_multibytecodec'),
- RegrTest('test_multibytecodec_support.py', skip="not a test"),
RegrTest('test_multifile.py'),
- RegrTest('test_multiprocessing.py', skip="FIXME leaves subprocesses"),
+ RegrTest('test_multiprocessing.py', skip=True),
RegrTest('test_mutants.py', core="possibly"),
RegrTest('test_mutex.py'),
RegrTest('test_netrc.py'),
RegrTest('test_new.py', core=True),
- RegrTest('test_nis.py', skip="unsupported extension module"),
+ RegrTest('test_nis.py'),
RegrTest('test_normalization.py'),
RegrTest('test_ntpath.py'),
+ RegrTest('test_old_mailbox.py'),
RegrTest('test_opcodes.py', core=True),
RegrTest('test_openpty.py'),
RegrTest('test_operator.py', core=True),
RegrTest('test_optparse.py'),
-
RegrTest('test_os.py', core=True),
- RegrTest('test_ossaudiodev.py', skip="unsupported extension module"),
+ RegrTest('test_ossaudiodev.py'),
RegrTest('test_parser.py', skip="slowly deprecating compiler"),
RegrTest('test_pdb.py'),
RegrTest('test_peepholer.py'),
@@ -338,14 +332,16 @@
RegrTest('test_pep263.py'),
RegrTest('test_pep277.py'),
RegrTest('test_pep292.py'),
+ RegrTest('test_pep352.py'),
RegrTest('test_pickle.py', core=True),
RegrTest('test_pickletools.py', core=False),
RegrTest('test_pipes.py'),
RegrTest('test_pkg.py', core=True),
RegrTest('test_pkgimport.py', core=True),
RegrTest('test_pkgutil.py'),
- RegrTest('test_plistlib.py', skip="unsupported module"),
- RegrTest('test_poll.py', skip=skip_win32),
+ RegrTest('test_platform.py'),
+ RegrTest('test_plistlib.py'),
+ RegrTest('test_poll.py'),
RegrTest('test_popen.py'),
RegrTest('test_popen2.py'),
RegrTest('test_poplib.py'),
@@ -357,8 +353,8 @@
RegrTest('test_profile.py'),
RegrTest('test_property.py', core=True),
RegrTest('test_pstats.py'),
- RegrTest('test_pty.py', skip="unsupported extension module"),
- RegrTest('test_pwd.py', usemodules="pwd", skip=skip_win32),
+ RegrTest('test_pty.py', usemodules='fcntl termios select'),
+ RegrTest('test_pwd.py', usemodules="pwd"),
RegrTest('test_py3kwarn.py'),
RegrTest('test_py_compile.py'),
RegrTest('test_pyclbr.py'),
@@ -370,15 +366,15 @@
RegrTest('test_re.py', core=True),
RegrTest('test_readline.py'),
RegrTest('test_repr.py', core=True),
- RegrTest('test_resource.py', skip=skip_win32),
+ RegrTest('test_resource.py'),
RegrTest('test_rfc822.py'),
RegrTest('test_richcmp.py', core=True),
RegrTest('test_rlcompleter.py'),
-
RegrTest('test_robotparser.py'),
+ RegrTest('test_runpy.py'),
RegrTest('test_sax.py'),
RegrTest('test_scope.py', core=True),
- RegrTest('test_scriptpackages.py', skip="unsupported extension module"),
+ RegrTest('test_scriptpackages.py'),
RegrTest('test_select.py'),
RegrTest('test_set.py', core=True),
RegrTest('test_sets.py'),
@@ -389,64 +385,59 @@
RegrTest('test_shlex.py'),
RegrTest('test_shutil.py'),
RegrTest('test_signal.py'),
- RegrTest('test_SimpleHTTPServer.py'),
+ RegrTest('test_SimpleHTTPServer.py', usemodules='binascii'),
RegrTest('test_site.py', core=False),
RegrTest('test_slice.py', core=True),
RegrTest('test_smtplib.py'),
RegrTest('test_smtpnet.py'),
RegrTest('test_socket.py', usemodules='thread _weakref'),
-
RegrTest('test_socketserver.py', usemodules='thread'),
-
RegrTest('test_softspace.py', core=True),
RegrTest('test_sort.py', core=True),
+ RegrTest('test_sqlite.py', usemodules="thread _rawffi zlib"),
RegrTest('test_ssl.py', usemodules='_ssl _socket select'),
+ RegrTest('test_startfile.py'),
RegrTest('test_str.py', core=True),
-
RegrTest('test_strftime.py'),
RegrTest('test_string.py', core=True),
- RegrTest('test_StringIO.py', core=True, usemodules='cStringIO'),
+ RegrTest('test_StringIO.py', core=True, usemodules='cStringIO array'),
RegrTest('test_stringprep.py'),
RegrTest('test_strop.py', skip="deprecated"),
-
RegrTest('test_strptime.py'),
RegrTest('test_strtod.py'),
RegrTest('test_struct.py', usemodules='struct'),
RegrTest('test_structmembers.py', skip="CPython specific"),
RegrTest('test_structseq.py'),
RegrTest('test_subprocess.py', usemodules='signal'),
- RegrTest('test_sunaudiodev.py', skip=True),
+ RegrTest('test_sunaudiodev.py'),
RegrTest('test_sundry.py'),
RegrTest('test_symtable.py', skip="implementation detail"),
RegrTest('test_syntax.py', core=True),
RegrTest('test_sys.py', core=True, usemodules='struct'),
+ RegrTest('test_sys_setprofile.py', core=True),
RegrTest('test_sys_settrace.py', core=True),
- RegrTest('test_sys_setprofile.py', core=True),
RegrTest('test_sysconfig.py'),
- RegrTest('test_tcl.py', skip="unsupported extension module"),
RegrTest('test_tarfile.py'),
+ RegrTest('test_tcl.py'),
RegrTest('test_telnetlib.py'),
RegrTest('test_tempfile.py'),
-
RegrTest('test_textwrap.py'),
RegrTest('test_thread.py', usemodules="thread", core=True),
RegrTest('test_threaded_import.py', usemodules="thread", core=True),
RegrTest('test_threadedtempfile.py',
usemodules="thread", core=False),
-
RegrTest('test_threading.py', usemodules="thread", core=True),
RegrTest('test_threading_local.py', usemodules="thread", core=True),
RegrTest('test_threadsignals.py', usemodules="thread"),
-
RegrTest('test_time.py', core=True),
RegrTest('test_timeout.py'),
RegrTest('test_tk.py'),
- RegrTest('test_ttk_guionly.py'),
- RegrTest('test_ttk_textonly.py'),
RegrTest('test_tokenize.py'),
RegrTest('test_trace.py'),
RegrTest('test_traceback.py', core=True),
RegrTest('test_transformer.py', core=True),
+ RegrTest('test_ttk_guionly.py'),
+ RegrTest('test_ttk_textonly.py'),
RegrTest('test_tuple.py', core=True),
RegrTest('test_typechecks.py'),
RegrTest('test_types.py', core=True),
@@ -462,6 +453,7 @@
RegrTest('test_unpack.py', core=True),
RegrTest('test_urllib.py'),
RegrTest('test_urllib2.py'),
+ RegrTest('test_urllib2_localnet.py', usemodules="thread"),
RegrTest('test_urllib2net.py'),
RegrTest('test_urllibnet.py'),
RegrTest('test_urlparse.py'),
@@ -469,61 +461,38 @@
RegrTest('test_userlist.py', core=True),
RegrTest('test_userstring.py', core=True),
RegrTest('test_uu.py'),
-
- RegrTest('test_warnings.py', core=True),
- RegrTest('test_wave.py', skip="unsupported extension module"),
- RegrTest('test_weakref.py', core=True, usemodules='_weakref'),
- RegrTest('test_weakset.py'),
-
- RegrTest('test_whichdb.py'),
- RegrTest('test_winreg.py', skip=only_win32),
- RegrTest('test_winsound.py', skip="unsupported extension module"),
- RegrTest('test_xmllib.py'),
- RegrTest('test_xmlrpc.py'),
-
- RegrTest('test_xpickle.py'),
- RegrTest('test_xrange.py', core=True),
- RegrTest('test_zipfile.py'),
- RegrTest('test_zipimport.py', usemodules='zlib zipimport'),
- RegrTest('test_zipimport_support.py', usemodules='zlib zipimport'),
- RegrTest('test_zlib.py', usemodules='zlib'),
-
- RegrTest('test_bigaddrspace.py'),
- RegrTest('test_bigmem.py'),
- RegrTest('test_cmd_line.py'),
- RegrTest('test_code.py'),
- RegrTest('test_coding.py'),
- RegrTest('test_complex_args.py'),
- RegrTest('test_contextlib.py', usemodules="thread"),
- RegrTest('test_ctypes.py', usemodules="_rawffi thread"),
- RegrTest('test_defaultdict.py', usemodules='_collections'),
- RegrTest('test_email_renamed.py'),
- RegrTest('test_exception_variations.py'),
- RegrTest('test_float.py'),
- RegrTest('test_functools.py'),
- RegrTest('test_index.py'),
- RegrTest('test_old_mailbox.py'),
- RegrTest('test_pep352.py'),
- RegrTest('test_platform.py'),
- RegrTest('test_runpy.py'),
- RegrTest('test_sqlite.py', usemodules="thread _rawffi zlib"),
- RegrTest('test_startfile.py', skip="bogus test"),
- RegrTest('test_structmembers.py', skip="depends on _testcapi"),
- RegrTest('test_urllib2_localnet.py', usemodules="thread"),
RegrTest('test_uuid.py'),
RegrTest('test_wait3.py', usemodules="thread"),
RegrTest('test_wait4.py', usemodules="thread"),
+ RegrTest('test_warnings.py', core=True),
+ RegrTest('test_wave.py'),
+ RegrTest('test_weakref.py', core=True, usemodules='_weakref'),
+ RegrTest('test_weakset.py'),
+ RegrTest('test_whichdb.py'),
+ RegrTest('test_winreg.py'),
+ RegrTest('test_winsound.py'),
RegrTest('test_with.py'),
RegrTest('test_wsgiref.py'),
RegrTest('test_xdrlib.py'),
RegrTest('test_xml_etree.py'),
RegrTest('test_xml_etree_c.py'),
+ RegrTest('test_xmllib.py'),
+ RegrTest('test_xmlrpc.py'),
+ RegrTest('test_xpickle.py'),
+ RegrTest('test_xrange.py', core=True),
+ RegrTest('test_zipfile.py'),
RegrTest('test_zipfile64.py'),
+ RegrTest('test_zipimport.py', usemodules='zlib zipimport'),
+ RegrTest('test_zipimport_support.py', usemodules='zlib zipimport'),
+ RegrTest('test_zlib.py', usemodules='zlib'),
]
def check_testmap_complete():
listed_names = dict.fromkeys([regrtest.basename for regrtest in testmap])
- listed_names['test_support.py'] = True # ignore this
+ assert len(listed_names) == len(testmap)
+ # names to ignore
+ listed_names['test_support.py'] = True
+ listed_names['test_multibytecodec_support.py'] = True
missing = []
for path in testdir.listdir(fil='test_*.py'):
name = path.basename
@@ -578,7 +547,7 @@
def getinvocation(self, regrtest):
fspath = regrtest.getfspath()
python = sys.executable
- pypy_script = pypydir.join('bin', 'py.py')
+ pypy_script = pypydir.join('bin', 'pyinteractive.py')
alarm_script = pypydir.join('tool', 'alarm.py')
if sys.platform == 'win32':
watchdog_name = 'watchdog_nt.py'
diff --git a/pypy/interpreter/executioncontext.py b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -343,9 +343,13 @@
signal, the tick counter is set to -1 by C code in signals.h.
"""
assert isinstance(action, PeriodicAsyncAction)
- self._periodic_actions.append(action)
+ # hack to put the release-the-GIL one at the end of the list,
+ # and the report-the-signals one at the start of the list.
if use_bytecode_counter:
+ self._periodic_actions.append(action)
self.has_bytecode_counter = True
+ else:
+ self._periodic_actions.insert(0, action)
self._rebuild_action_dispatcher()
def getcheckinterval(self):
@@ -419,15 +423,6 @@
The action must have been registered at space initalization time."""
self.space.actionflag.fire(self)
- def fire_after_thread_switch(self):
- """Bit of a hack: fire() the action but only the next time the GIL
- is released and re-acquired (i.e. after a potential thread switch).
- Don't call this if threads are not enabled. Currently limited to
- one action (i.e. reserved for CheckSignalAction from module/signal).
- """
- from pypy.module.thread.gil import spacestate
- spacestate.action_after_thread_switch = self
-
def perform(self, executioncontext, frame):
"""To be overridden."""
diff --git a/pypy/module/_multiprocessing/test/test_connection.py b/pypy/module/_multiprocessing/test/test_connection.py
--- a/pypy/module/_multiprocessing/test/test_connection.py
+++ b/pypy/module/_multiprocessing/test/test_connection.py
@@ -68,7 +68,7 @@
assert rhandle.readable
class AppTestWinpipeConnection(BaseConnectionTest):
- spaceconfig = dict(usemodules=('_multiprocessing', 'thread'))
+ spaceconfig = dict(usemodules=('_multiprocessing', 'thread', 'signal'))
def setup_class(cls):
if sys.platform != "win32":
diff --git a/pypy/module/_socket/interp_socket.py b/pypy/module/_socket/interp_socket.py
--- a/pypy/module/_socket/interp_socket.py
+++ b/pypy/module/_socket/interp_socket.py
@@ -181,7 +181,8 @@
try:
self.close()
except SocketError, e:
- raise converted_error(space, e)
+ # cpython doesn't return any errors on close
+ pass
def connect_w(self, space, w_addr):
"""connect(address)
@@ -448,7 +449,7 @@
w_addr = space.w_None
return space.newtuple([space.wrap(readlgt), w_addr])
except SocketError, e:
- raise converted_error(space, e)
+ raise converted_error(space, e)
@unwrap_spec(cmd=int)
def ioctl_w(self, space, cmd, w_option):
diff --git a/pypy/module/_socket/test/test_sock_app.py b/pypy/module/_socket/test/test_sock_app.py
--- a/pypy/module/_socket/test/test_sock_app.py
+++ b/pypy/module/_socket/test/test_sock_app.py
@@ -362,13 +362,15 @@
assert isinstance(s.fileno(), int)
def test_socket_close(self):
- import _socket
+ import _socket, os
s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0)
fileno = s.fileno()
assert s.fileno() >= 0
s.close()
assert s.fileno() < 0
s.close()
+ if os.name != 'nt':
+ raises(OSError, os.close, fileno)
def test_socket_close_error(self):
import _socket, os
@@ -376,7 +378,7 @@
skip("Windows sockets are not files")
s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0)
os.close(s.fileno())
- raises(_socket.error, s.close)
+ s.close()
def test_socket_connect(self):
import _socket, os
diff --git a/pypy/module/crypt/test/test_crypt.py b/pypy/module/crypt/test/test_crypt.py
--- a/pypy/module/crypt/test/test_crypt.py
+++ b/pypy/module/crypt/test/test_crypt.py
@@ -1,6 +1,12 @@
+import os
+import py
+
+if os.name != 'posix':
+ py.test.skip('crypt module only available on unix')
+
class AppTestCrypt:
spaceconfig = dict(usemodules=['crypt'])
-
+
def test_crypt(self):
import crypt
res = crypt.crypt("pass", "ab")
diff --git a/pypy/module/fcntl/test/test_fcntl.py b/pypy/module/fcntl/test/test_fcntl.py
--- a/pypy/module/fcntl/test/test_fcntl.py
+++ b/pypy/module/fcntl/test/test_fcntl.py
@@ -1,9 +1,9 @@
import os
+import py
from rpython.tool.udir import udir
-if os.name == "nt":
- from py.test import skip
- skip("fcntl module is not available on Windows")
+if os.name != 'posix':
+ py.test.skip("fcntl module only available on unix")
def teardown_module(mod):
for i in "abcde":
diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -823,14 +823,19 @@
if hasattr(os, 'chmod'):
def test_chmod(self):
+ import sys
os = self.posix
os.unlink(self.path)
raises(OSError, os.chmod, self.path, 0600)
f = open(self.path, "w")
f.write("this is a test")
f.close()
- os.chmod(self.path, 0200)
- assert (os.stat(self.path).st_mode & 0777) == 0200
+ if sys.platform == 'win32':
+ os.chmod(self.path, 0400)
+ assert (os.stat(self.path).st_mode & 0600) == 0400
+ else:
+ os.chmod(self.path, 0200)
+ assert (os.stat(self.path).st_mode & 0777) == 0200
if hasattr(os, 'fchmod'):
def test_fchmod(self):
diff --git a/pypy/module/pwd/test/test_pwd.py b/pypy/module/pwd/test/test_pwd.py
--- a/pypy/module/pwd/test/test_pwd.py
+++ b/pypy/module/pwd/test/test_pwd.py
@@ -1,3 +1,9 @@
+import os
+import py
+
+if os.name != 'posix':
+ py.test.skip('pwd module only available on unix')
+
class AppTestPwd:
spaceconfig = dict(usemodules=['pwd'])
diff --git a/pypy/module/signal/interp_signal.py b/pypy/module/signal/interp_signal.py
--- a/pypy/module/signal/interp_signal.py
+++ b/pypy/module/signal/interp_signal.py
@@ -8,7 +8,8 @@
PeriodicAsyncAction)
from pypy.interpreter.gateway import unwrap_spec
-from rpython.rlib import jit, rposix
+from rpython.rlib import jit, rposix, rgc
+from rpython.rlib.objectmodel import we_are_translated
from rpython.rlib.rarithmetic import intmask
from rpython.rlib.rsignal import *
from rpython.rtyper.lltypesystem import lltype, rffi
@@ -31,6 +32,11 @@
p = pypysig_getaddr_occurred()
p.c_value = value
+ @staticmethod
+ def rearm_ticker():
+ p = pypysig_getaddr_occurred()
+ p.c_value = -1
+
def decrement_ticker(self, by):
p = pypysig_getaddr_occurred()
value = p.c_value
@@ -46,41 +52,63 @@
class CheckSignalAction(PeriodicAsyncAction):
"""An action that is automatically invoked when a signal is received."""
+ # Note that this is a PeriodicAsyncAction: it means more precisely
+ # that it is called whenever the C-level ticker becomes < 0.
+ # Without threads, it is only ever set to -1 when we receive a
+ # signal. With threads, it also decrements steadily (but slowly).
+
def __init__(self, space):
+ "NOT_RPYTHON"
AsyncAction.__init__(self, space)
self.handlers_w = {}
- self.emulated_sigint = False
+ self.pending_signal = -1
+ self.fire_in_main_thread = False
+ if self.space.config.objspace.usemodules.thread:
+ from pypy.module.thread import gil
+ gil.after_thread_switch = self._after_thread_switch
+
+ @rgc.no_collect
+ def _after_thread_switch(self):
+ if self.fire_in_main_thread:
+ if self.space.threadlocals.ismainthread():
+ self.fire_in_main_thread = False
+ SignalActionFlag.rearm_ticker()
+ # this occurs when we just switched to the main thread
+ # and there is a signal pending: we force the ticker to
+ # -1, which should ensure perform() is called quickly.
@jit.dont_look_inside
def perform(self, executioncontext, frame):
- if self.space.config.objspace.usemodules.thread:
- main_ec = self.space.threadlocals.getmainthreadvalue()
- in_main = executioncontext is main_ec
- else:
- in_main = True
- # If we are in the main thread, poll and report the signals now.
- if in_main:
- if self.emulated_sigint:
- self.emulated_sigint = False
- self._report_signal(cpy_signal.SIGINT)
- while True:
- n = pypysig_poll()
- if n < 0:
- break
+ # Poll for the next signal, if any
+ n = self.pending_signal
+ if n < 0: n = pypysig_poll()
+ while n >= 0:
+ if self.space.config.objspace.usemodules.thread:
+ in_main = self.space.threadlocals.ismainthread()
+ else:
+ in_main = True
+ if in_main:
+ # If we are in the main thread, report the signal now,
+ # and poll more
+ self.pending_signal = -1
self._report_signal(n)
- else:
- # Otherwise, don't call pypysig_poll() at all. Instead,
- # arrange for perform() to be called again after a thread
- # switch. It might be called again and again, until we
- # land in the main thread.
- self.fire_after_thread_switch()
+ n = self.pending_signal
+ if n < 0: n = pypysig_poll()
+ else:
+ # Otherwise, arrange for perform() to be called again
+ # after we switch to the main thread.
+ self.pending_signal = n
+ self.fire_in_main_thread = True
+ break
- @jit.dont_look_inside
def set_interrupt(self):
"Simulates the effect of a SIGINT signal arriving"
- ec = self.space.getexecutioncontext()
- self.emulated_sigint = True
- self.perform(ec, None)
+ if not we_are_translated():
+ self.pending_signal = cpy_signal.SIGINT
+ # ^^^ may override another signal, but it's just for testing
+ else:
+ pypysig_pushback(cpy_signal.SIGINT)
+ self.fire_in_main_thread = True
def _report_signal(self, n):
try:
diff --git a/pypy/module/termios/test/test_termios.py b/pypy/module/termios/test/test_termios.py
--- a/pypy/module/termios/test/test_termios.py
+++ b/pypy/module/termios/test/test_termios.py
@@ -1,9 +1,12 @@
-
+import os
+import sys
import py
-import sys
from pypy.conftest import pypydir
from rpython.tool.udir import udir
+if os.name != 'posix':
+ py.test.skip('termios module only available on unix')
+
class TestTermios(object):
def setup_class(cls):
try:
diff --git a/pypy/module/thread/gil.py b/pypy/module/thread/gil.py
--- a/pypy/module/thread/gil.py
+++ b/pypy/module/thread/gil.py
@@ -62,22 +62,7 @@
do_yield_thread()
-class SpaceState:
-
- def _cleanup_(self):
- self.action_after_thread_switch = None
- # ^^^ set by AsyncAction.fire_after_thread_switch()
-
- def after_thread_switch(self):
- # this is support logic for the signal module, to help it deliver
- # signals to the main thread.
- action = self.action_after_thread_switch
- if action is not None:
- self.action_after_thread_switch = None
- action.fire()
-
-spacestate = SpaceState()
-spacestate._cleanup_()
+after_thread_switch = lambda: None # hook for signal.py
# Fragile code below. We have to preserve the C-level errno manually...
@@ -94,7 +79,7 @@
e = get_errno()
thread.gil_acquire()
thread.gc_thread_run()
- spacestate.after_thread_switch()
+ after_thread_switch()
set_errno(e)
after_external_call._gctransformer_hint_cannot_collect_ = True
after_external_call._dont_reach_me_in_del_ = True
@@ -112,7 +97,7 @@
# the same thread).
if thread.gil_yield_thread():
thread.gc_thread_run()
- spacestate.after_thread_switch()
+ after_thread_switch()
do_yield_thread._gctransformer_hint_close_stack_ = True
do_yield_thread._dont_reach_me_in_del_ = True
do_yield_thread._dont_inline_ = True
diff --git a/pypy/module/thread/threadlocals.py b/pypy/module/thread/threadlocals.py
--- a/pypy/module/thread/threadlocals.py
+++ b/pypy/module/thread/threadlocals.py
@@ -48,6 +48,9 @@
ident = self._mainthreadident
return self._valuedict.get(ident, None)
+ def ismainthread(self):
+ return thread.get_ident() == self._mainthreadident
+
def getallvalues(self):
return self._valuedict
diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -113,6 +113,9 @@
if policy is None:
from rpython.annotator.policy import AnnotatorPolicy
policy = AnnotatorPolicy()
+ # XXX hack
+ annmodel.TLS.check_str_without_nul = (
+ self.translator.config.translation.check_str_without_nul)
graph, inputcells = self.get_call_parameters(function, args_s, policy)
self.build_graph_types(graph, inputcells, complete_now=False)
self.complete_helpers(policy)
diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py
--- a/rpython/annotator/binaryop.py
+++ b/rpython/annotator/binaryop.py
@@ -446,7 +446,8 @@
class __extend__(pairtype(SomeChar, SomeChar)):
def union((chr1, chr2)):
- return SomeChar()
+ no_nul = chr1.no_nul and chr2.no_nul
+ return SomeChar(no_nul=no_nul)
class __extend__(pairtype(SomeChar, SomeUnicodeCodePoint),
@@ -664,14 +665,14 @@
def getitem((str1, int2)):
getbookkeeper().count("str_getitem", int2)
- return SomeChar()
+ return SomeChar(no_nul=str1.no_nul)
getitem.can_only_throw = []
getitem_key = getitem
def getitem_idx((str1, int2)):
getbookkeeper().count("str_getitem", int2)
- return SomeChar()
+ return SomeChar(no_nul=str1.no_nul)
getitem_idx.can_only_throw = [IndexError]
getitem_idx_key = getitem_idx
diff --git a/rpython/annotator/test/test_annrpython.py b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -2068,7 +2068,23 @@
s = a.build_types(f, [annmodel.SomeString(no_nul=True)])
assert isinstance(s, annmodel.SomeString)
assert s.no_nul
-
+
+ def test_getitem_str0(self):
+ def f(s, n):
+ if n == 1:
+ return s[0]
+ elif n == 2:
+ return s[1]
+ elif n == 3:
+ return s[1:]
+ return s
+ a = self.RPythonAnnotator()
+ a.translator.config.translation.check_str_without_nul = True
+
+ s = a.build_types(f, [annmodel.SomeString(no_nul=True),
+ annmodel.SomeInteger()])
+ assert isinstance(s, annmodel.SomeString)
+ assert s.no_nul
def test_non_none_and_none_with_isinstance(self):
class A(object):
diff --git a/rpython/rlib/rcomplex.py b/rpython/rlib/rcomplex.py
--- a/rpython/rlib/rcomplex.py
+++ b/rpython/rlib/rcomplex.py
@@ -566,3 +566,6 @@
def c_isnan(r, i):
return isnan(r) or isnan(i)
+
+def c_isfinite(r, i):
+ return isfinite(r) and isfinite(i)
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -247,6 +247,20 @@
else:
return nt._getfullpathname(path.as_bytes())
+ at specialize.argtype(0, 1)
+def putenv(name, value):
+ if isinstance(name, str):
+ os.environ[name] = value
+ else:
+ os.environ[name.as_bytes()] = value.as_bytes()
+
+ at specialize.argtype(0)
+def unsetenv(name):
+ if isinstance(name, str):
+ del os.environ[name]
+ else:
+ del os.environ[name.as_bytes()]
+
if os.name == 'nt':
from rpython.rlib import rwin32
os_kill = rwin32.os_kill
diff --git a/rpython/rlib/rsignal.py b/rpython/rlib/rsignal.py
--- a/rpython/rlib/rsignal.py
+++ b/rpython/rlib/rsignal.py
@@ -80,6 +80,8 @@
pypysig_poll = external('pypysig_poll', [], rffi.INT, threadsafe=False)
# don't bother releasing the GIL around a call to pypysig_poll: it's
# pointless and a performance issue
+pypysig_pushback = external('pypysig_pushback', [rffi.INT], lltype.Void,
+ threadsafe=False)
# don't use rffi.LONGP because the JIT doesn't support raw arrays so far
struct_name = 'pypysig_long_struct'
diff --git a/rpython/rlib/test/test_jit.py b/rpython/rlib/test/test_jit.py
--- a/rpython/rlib/test/test_jit.py
+++ b/rpython/rlib/test/test_jit.py
@@ -35,8 +35,8 @@
assert driver.reds == ['a', 'b']
assert driver.numreds == 2
- at py.test.mark.xfail(reason="@inline off: see skipped failures in test_warmspot.")
def test_jitdriver_inline():
+ py.test.skip("@inline off: see skipped failures in test_warmspot.")
driver = JitDriver(greens=[], reds='auto')
calls = []
def foo(a, b):
@@ -55,8 +55,8 @@
('bar', 40, 2),
]
- at py.test.mark.xfail(reason="@inline off: see skipped failures in test_warmspot.")
def test_jitdriver_clone():
+ py.test.skip("@inline off: see skipped failures in test_warmspot.")
def bar(): pass
def foo(): pass
driver = JitDriver(greens=[], reds=[])
diff --git a/rpython/rlib/test/test_rcomplex.py b/rpython/rlib/test/test_rcomplex.py
--- a/rpython/rlib/test/test_rcomplex.py
+++ b/rpython/rlib/test/test_rcomplex.py
@@ -260,3 +260,24 @@
rAssertAlmostEqual(expected[1], actual[1],
abs_err=real_abs_err,
msg=error_message)
+
+def test_isnan():
+ assert not c.c_isnan(0, 0)
+ assert c.c_isnan(float('nan'), 0)
+ assert c.c_isnan(1, float('nan'))
+ assert not c.c_isnan(float('inf'), 0)
+
+def test_isinf():
+ assert not c.c_isinf(0, 0)
+ assert c.c_isinf(float('inf'), 0)
+ assert c.c_isinf(float('-inf'), 0)
+ assert c.c_isinf(1, float('inf'))
+ assert not c.c_isinf(float('nan'), 0)
+
+def test_isfinite():
+ assert c.c_isfinite(0, 0)
+ assert not c.c_isfinite(float('nan'), 0)
+ assert not c.c_isfinite(float('-inf'), 0)
+ assert not c.c_isfinite(0, float('nan'))
+ assert not c.c_isfinite(0, float('-inf'))
+
diff --git a/rpython/rlib/test/test_rposix.py b/rpython/rlib/test/test_rposix.py
--- a/rpython/rlib/test/test_rposix.py
+++ b/rpython/rlib/test/test_rposix.py
@@ -141,3 +141,10 @@
assert rposix.is_valid_fd(fd) == 1
fid.close()
assert rposix.is_valid_fd(fd) == 0
+
+ def test_putenv(self):
+ def f():
+ rposix.putenv(self.path, self.path)
+ rposix.unsetenv(self.path)
+
+ interpret(f, []) # does not crash
diff --git a/rpython/rlib/test/test_signature.py b/rpython/rlib/test/test_signature.py
--- a/rpython/rlib/test/test_signature.py
+++ b/rpython/rlib/test/test_signature.py
@@ -9,6 +9,7 @@
def annotate_at(f, policy=None):
t = TranslationContext()
+ t.config.translation.check_str_without_nul = True
a = t.buildannotator(policy=policy)
a.annotate_helper(f, [model.s_ImpossibleValue]*f.func_code.co_argcount, policy=policy)
return a
@@ -112,6 +113,12 @@
return len(u)
assert getsig(f) == [model.SomeUnicodeString(), model.SomeInteger()]
+def test_str0():
+ @signature(types.unicode0(), returns=types.str0())
+ def f(u):
+ return 'str'
+ assert getsig(f) == [model.SomeUnicodeString(no_nul=True),
+ model.SomeString(no_nul=True)]
def test_ptr():
policy = LowLevelAnnotatorPolicy()
diff --git a/rpython/rlib/types.py b/rpython/rlib/types.py
--- a/rpython/rlib/types.py
+++ b/rpython/rlib/types.py
@@ -24,9 +24,15 @@
def unicode():
return model.SomeUnicodeString()
+def unicode0():
+ return model.SomeUnicodeString(no_nul=True)
+
def str():
return model.SomeString()
+def str0():
+ return model.SomeString(no_nul=True)
+
def char():
return model.SomeChar()
diff --git a/rpython/rtyper/lltypesystem/ll2ctypes.py b/rpython/rtyper/lltypesystem/ll2ctypes.py
--- a/rpython/rtyper/lltypesystem/ll2ctypes.py
+++ b/rpython/rtyper/lltypesystem/ll2ctypes.py
@@ -32,6 +32,15 @@
except ImportError:
class tlsobject(object):
pass
+try:
+ from threading import RLock
+except ImportError:
+ class RLock(object):
+ def __enter__(self):
+ pass
+ def __exit__(self, *args):
+ pass
+rlock = RLock()
_POSIX = os.name == "posix"
_MS_WINDOWS = os.name == "nt"
@@ -694,10 +703,11 @@
return None
def lltype2ctypes(llobj, normalize=True):
- """Convert the lltype object 'llobj' to its ctypes equivalent.
- 'normalize' should only be False in tests, where we want to
- inspect the resulting ctypes object manually.
- """
+ """Convert the lltype object 'llobj' to its ctypes equivalent.
+ 'normalize' should only be False in tests, where we want to
+ inspect the resulting ctypes object manually.
+ """
+ with rlock:
if isinstance(llobj, lltype._uninitialized):
return uninitialized2ctypes(llobj.TYPE)
if isinstance(llobj, llmemory.AddressAsInt):
@@ -875,9 +885,10 @@
return llobj
def ctypes2lltype(T, cobj):
- """Convert the ctypes object 'cobj' to its lltype equivalent.
- 'T' is the expected lltype type.
- """
+ """Convert the ctypes object 'cobj' to its lltype equivalent.
+ 'T' is the expected lltype type.
+ """
+ with rlock:
if T is lltype.Void:
return None
if isinstance(T, lltype.Typedef):
@@ -1176,10 +1187,11 @@
#self.funcptr = ... set later
def __call__(self, *argvalues):
- if self.trampoline is None:
- # lazily build the corresponding ctypes function object
- cfunc = get_ctypes_callable(self.funcptr, self.calling_conv)
- self.trampoline = get_ctypes_trampoline(self.FUNCTYPE, cfunc)
+ with rlock:
+ if self.trampoline is None:
+ # lazily build the corresponding ctypes function object
+ cfunc = get_ctypes_callable(self.funcptr, self.calling_conv)
+ self.trampoline = get_ctypes_trampoline(self.FUNCTYPE, cfunc)
# perform the call
return self.trampoline(*argvalues)
@@ -1215,8 +1227,9 @@
return ctypes2lltype(RESULT, cres)
return invoke_via_ctypes
+
def force_cast(RESTYPE, value):
- """Cast a value to a result type, trying to use the same rules as C."""
+ with rlock:
if not isinstance(RESTYPE, lltype.LowLevelType):
raise TypeError("rffi.cast() first arg should be a TYPE")
if isinstance(value, llmemory.AddressAsInt):
diff --git a/rpython/rtyper/lltypesystem/rffi.py b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -867,6 +867,8 @@
array[len(l)] = lltype.nullptr(CCHARP.TO)
return array
liststr2charpp._annenforceargs_ = [[annmodel.s_Str0]] # List of strings
+# Make a copy for the ll_os.py module
+ll_liststr2charpp = func_with_new_name(liststr2charpp, 'll_liststr2charpp')
def free_charpp(ref):
""" frees list of char**, NULL terminated
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -306,7 +306,7 @@
rffi.INT, compilation_info = eci)
def execv_llimpl(path, args):
- l_args = rffi.liststr2charpp(args)
+ l_args = rffi.ll_liststr2charpp(args)
os_execv(path, l_args)
rffi.free_charpp(l_args)
raise OSError(rposix.get_errno(), "execv failed")
@@ -332,8 +332,8 @@
envstr = "%s=%s" % item
envstrs.append(envstr)
- l_args = rffi.liststr2charpp(args)
- l_env = rffi.liststr2charpp(envstrs)
+ l_args = rffi.ll_liststr2charpp(args)
+ l_env = rffi.ll_liststr2charpp(envstrs)
os_execve(path, l_args, l_env)
# XXX untested
@@ -357,7 +357,7 @@
def spawnv_llimpl(mode, path, args):
mode = rffi.cast(rffi.INT, mode)
- l_args = rffi.liststr2charpp(args)
+ l_args = rffi.ll_liststr2charpp(args)
childpid = os_spawnv(mode, path, l_args)
rffi.free_charpp(l_args)
if childpid == -1:
@@ -380,8 +380,8 @@
envstrs.append("%s=%s" % item)
mode = rffi.cast(rffi.INT, mode)
- l_args = rffi.liststr2charpp(args)
- l_env = rffi.liststr2charpp(envstrs)
+ l_args = rffi.ll_liststr2charpp(args)
+ l_env = rffi.ll_liststr2charpp(envstrs)
childpid = os_spawnve(mode, path, l_args, l_env)
rffi.free_charpp(l_env)
rffi.free_charpp(l_args)
diff --git a/rpython/rtyper/rstr.py b/rpython/rtyper/rstr.py
--- a/rpython/rtyper/rstr.py
+++ b/rpython/rtyper/rstr.py
@@ -80,7 +80,7 @@
assert s is not None
bytes = self.runicode_encode_utf_8(
s, len(s), 'strict',
- errorhandler=self.ll_raise_unicode_exception_decode,
+ errorhandler=self.ll_raise_unicode_exception_encode,
allow_surrogates=False)
return self.ll.llstr(bytes)
diff --git a/rpython/rtyper/test/test_runicode.py b/rpython/rtyper/test/test_runicode.py
--- a/rpython/rtyper/test/test_runicode.py
+++ b/rpython/rtyper/test/test_runicode.py
@@ -106,6 +106,12 @@
assert self.ll_to_string(self.interpret(f, [38])) == f(38)
+ def g(n):
+ x = u'\ud800' + unichr(n)
+ return x.encode('utf-8')
+
+ self.interpret_raises(UnicodeEncodeError, g, [38])
+
def test_utf_8_encoding_annotation(self):
from rpython.rlib.runicode import unicode_encode_utf_8
def errorhandler(errors, encoding, msg, u,
diff --git a/rpython/tool/stdlib_opcode.py b/rpython/tool/stdlib_opcode.py
--- a/rpython/tool/stdlib_opcode.py
+++ b/rpython/tool/stdlib_opcode.py
@@ -71,10 +71,14 @@
def to_globals(self, globals_dict):
"""NOT_RPYTHON. Add individual opcodes to the module constants."""
- globals_dict.update(self.opmap)
- globals_dict['SLICE'] = self.opmap["SLICE+0"]
- globals_dict['STORE_SLICE'] = self.opmap["STORE_SLICE+0"]
- globals_dict['DELETE_SLICE'] = self.opmap["DELETE_SLICE+0"]
+ for name, value in self.opmap.iteritems():
+ # Rename 'STORE_SLICE+0' opcodes
+ if name.endswith('+0'):
+ name = name[:-2]
+ # Ignore 'STORE_SLICE+1' opcodes
+ elif name.endswith(('+1', '+2', '+3')):
+ continue
+ globals_dict[name] = value
def __str__(self):
return "<%s bytecode>" % (self.name,)
@@ -83,4 +87,4 @@
from opcode import opmap, HAVE_ARGUMENT
-host_bytecode_spec = BytecodeSpec('host', opmap, HAVE_ARGUMENT)
\ No newline at end of file
+host_bytecode_spec = BytecodeSpec('host', opmap, HAVE_ARGUMENT)
diff --git a/rpython/translator/c/src/signals.c b/rpython/translator/c/src/signals.c
--- a/rpython/translator/c/src/signals.c
+++ b/rpython/translator/c/src/signals.c
@@ -71,7 +71,7 @@
#endif
}
-static void signal_setflag_handler(int signum)
+void pypysig_pushback(int signum)
{
if (0 <= signum && signum < NSIG)
{
@@ -79,6 +79,11 @@
pypysig_occurred = 1;
pypysig_counter.value = -1;
}
+}
+
+static void signal_setflag_handler(int signum)
+{
+ pypysig_pushback(signum);
if (wakeup_fd != -1)
{
diff --git a/rpython/translator/c/src/signals.h b/rpython/translator/c/src/signals.h
--- a/rpython/translator/c/src/signals.h
+++ b/rpython/translator/c/src/signals.h
@@ -11,6 +11,7 @@
/* utility to poll for signals that arrived */
int pypysig_poll(void); /* => signum or -1 */
+void pypysig_pushback(int signum);
/* When a signal is received, pypysig_counter is set to -1. */
/* This is a struct for the JIT. See rsignal.py. */
More information about the pypy-commit
mailing list