Hello community, here is the log from the commit of package python-greenlet for openSUSE:Factory checked in at 2016-09-16 11:00:27 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-greenlet (Old) and /work/SRC/openSUSE:Factory/.python-greenlet.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-greenlet" Changes: -------- --- /work/SRC/openSUSE:Factory/python-greenlet/python-greenlet.changes 2016-04-22 16:25:41.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-greenlet.new/python-greenlet.changes 2016-09-16 11:00:28.000000000 +0200 @@ -1,0 +2,9 @@ +Fri Sep 2 21:10:46 UTC 2016 - tbecht...@suse.com + +- update to 4.10.0: + - Added missing files to manifest + - Added workaround for ppc32 on Linux + - Start building binary manylinux1 wheels +- Use pypi.io as Source url + +------------------------------------------------------------------- Old: ---- greenlet-0.4.9.tar.gz New: ---- greenlet-0.4.10.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-greenlet.spec ++++++ --- /var/tmp/diff_new_pack.3fs1wl/_old 2016-09-16 11:00:29.000000000 +0200 +++ /var/tmp/diff_new_pack.3fs1wl/_new 2016-09-16 11:00:29.000000000 +0200 @@ -18,13 +18,13 @@ Name: python-greenlet -Version: 0.4.9 +Version: 0.4.10 Release: 0 Url: http://pypi.python.org/pypi/greenlet Summary: Lightweight in-process concurrent programming License: MIT Group: Development/Libraries/Python -Source0: http://pypi.python.org/packages/source/g/greenlet/greenlet-%{version}.tar.gz +Source0: https://pypi.io/packages/source/g/greenlet/greenlet-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: gcc-c++ BuildRequires: python-Sphinx ++++++ greenlet-0.4.9.tar.gz -> greenlet-0.4.10.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/.travis.yml new/greenlet-0.4.10/.travis.yml --- old/greenlet-0.4.9/.travis.yml 2015-05-31 15:02:31.000000000 +0200 +++ new/greenlet-0.4.10/.travis.yml 2016-04-02 20:26:46.000000000 +0200 @@ -1,4 +1,5 @@ language: python +sudo: false python: - 2.6 @@ -6,8 +7,8 @@ - 3.2 - 3.3 - 3.4 + - 3.5 install: python setup.py build_ext -i script: python run-tests.py - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/MANIFEST.in new/greenlet-0.4.10/MANIFEST.in --- old/greenlet-0.4.9/MANIFEST.in 2015-05-31 15:02:31.000000000 +0200 +++ new/greenlet-0.4.10/MANIFEST.in 2016-06-11 20:39:14.000000000 +0200 @@ -5,8 +5,11 @@ include MANIFEST.in include NEWS include README.rst +include appveyor.yml +include appveyor/run_with_env.cmd include benchmarks/chain.py include conftest.py +include dev-requirements.txt include doc/Makefile include doc/conf.py include doc/greenlet.txt @@ -14,11 +17,13 @@ include doc/make.bat include greenlet.c include greenlet.h +include make-manylinux include make-win-release include my_build_ext.py include platform/switch_aarch64_gcc.h include platform/switch_amd64_unix.h include platform/switch_arm32_gcc.h +include platform/switch_arm32_ios.h include platform/switch_m68k_gcc.h include platform/switch_mips_unix.h include platform/switch_ppc64_linux.h @@ -49,6 +54,7 @@ include tests/test_generator_nested.py include tests/test_greenlet.py include tests/test_leaks.py +include tests/test_stack_saved.py include tests/test_throw.py include tests/test_tracing.py include tests/test_version.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/NEWS new/greenlet-0.4.10/NEWS --- old/greenlet-0.4.9/NEWS 2015-08-30 20:00:33.000000000 +0200 +++ new/greenlet-0.4.10/NEWS 2016-06-11 19:23:58.000000000 +0200 @@ -1,3 +1,9 @@ +0.4.10 +====== +- Added missing files to manifest +- Added workaround for ppc32 on Linux +- Start building binary manylinux1 wheels + 0.4.9 ===== - Fixed Windows builds diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/PKG-INFO new/greenlet-0.4.10/PKG-INFO --- old/greenlet-0.4.9/PKG-INFO 2015-08-30 20:04:39.000000000 +0200 +++ new/greenlet-0.4.10/PKG-INFO 2016-06-11 20:39:23.000000000 +0200 @@ -1,13 +1,13 @@ -Metadata-Version: 1.1 +Metadata-Version: 1.0 Name: greenlet -Version: 0.4.9 +Version: 0.4.10 Summary: Lightweight in-process concurrent programming Home-page: https://github.com/python-greenlet/greenlet Author: Alexey Borzenkov Author-email: sna...@gmail.com License: MIT License Description: .. image:: https://secure.travis-ci.org/python-greenlet/greenlet.png - :target: http://travis-ci.org/python-greenlet/greenlet + :target: http://travis-ci.org/python-greenlet/greenlet The greenlet package is a spin-off of Stackless, a version of CPython that supports micro-threads called "tasklets". Tasklets run @@ -37,9 +37,9 @@ There are several libraries that use Greenlet as a more flexible alternative to Python's built in coroutine support: - - `Concurrence`_ - - `Eventlet`_ - - `Gevent`_ + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ .. _Concurrence: http://opensource.hyves.org/concurrence/ .. _Eventlet: http://eventlet.net/ @@ -51,8 +51,8 @@ The easiest way to get Greenlet is to install it with pip or easy_install:: - pip install greenlet - easy_install greenlet + pip install greenlet + easy_install greenlet Source code archives and windows installers are available on the @@ -62,7 +62,7 @@ https://github.com/python-greenlet/greenlet Documentation is available on readthedocs.org: - https://greenlet.readthedocs.org + https://greenlet.readthedocs.io Platform: any Classifier: Intended Audience :: Developers @@ -81,5 +81,6 @@ Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 Classifier: Operating System :: OS Independent Classifier: Topic :: Software Development :: Libraries :: Python Modules diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/README.rst new/greenlet-0.4.10/README.rst --- old/greenlet-0.4.9/README.rst 2015-05-31 15:02:31.000000000 +0200 +++ new/greenlet-0.4.10/README.rst 2016-06-11 12:53:14.000000000 +0200 @@ -54,4 +54,4 @@ https://github.com/python-greenlet/greenlet Documentation is available on readthedocs.org: -https://greenlet.readthedocs.org +https://greenlet.readthedocs.io diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/appveyor/run_with_env.cmd new/greenlet-0.4.10/appveyor/run_with_env.cmd --- old/greenlet-0.4.9/appveyor/run_with_env.cmd 1970-01-01 01:00:00.000000000 +0100 +++ new/greenlet-0.4.10/appveyor/run_with_env.cmd 2016-06-11 14:37:49.000000000 +0200 @@ -0,0 +1,88 @@ +:: To build extensions for 64 bit Python 3, we need to configure environment +:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of: +:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1) +:: +:: To build extensions for 64 bit Python 2, we need to configure environment +:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of: +:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0) +:: +:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific +:: environment configurations. +:: +:: Note: this script needs to be run with the /E:ON and /V:ON flags for the +:: cmd interpreter, at least for (SDK v7.0) +:: +:: More details at: +:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows +:: http://stackoverflow.com/a/13751649/163740 +:: +:: Author: Olivier Grisel +:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ +:: +:: Notes about batch files for Python people: +:: +:: Quotes in values are literally part of the values: +:: SET FOO="bar" +:: FOO is now five characters long: " b a r " +:: If you don't want quotes, don't include them on the right-hand side. +:: +:: The CALL lines at the end of this file look redundant, but if you move them +:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y +:: case, I don't know why. +@ECHO OFF + +SET COMMAND_TO_RUN=%* +SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows +SET WIN_WDK=c:\Program Files (x86)\Windows Kits\10\Include\wdf + +:: Extract the major and minor versions, and allow for the minor version to be +:: more than 9. This requires the version number to have two dots in it. +SET MAJOR_PYTHON_VERSION=%PYTHON_VERSION:~0,1% +IF "%PYTHON_VERSION:~3,1%" == "." ( + SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,1% +) ELSE ( + SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,2% +) + +:: Based on the Python version, determine what SDK version to use, and whether +:: to set the SDK for 64-bit. +IF %MAJOR_PYTHON_VERSION% == 2 ( + SET WINDOWS_SDK_VERSION="v7.0" + SET SET_SDK_64=Y +) ELSE ( + IF %MAJOR_PYTHON_VERSION% == 3 ( + SET WINDOWS_SDK_VERSION="v7.1" + IF %MINOR_PYTHON_VERSION% LEQ 4 ( + SET SET_SDK_64=Y + ) ELSE ( + SET SET_SDK_64=N + IF EXIST "%WIN_WDK%" ( + :: See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/ + REN "%WIN_WDK%" 0wdf + ) + ) + ) ELSE ( + ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%" + EXIT 1 + ) +) + +IF %PYTHON_ARCH% == 64 ( + IF %SET_SDK_64% == Y ( + ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture + SET DISTUTILS_USE_SDK=1 + SET MSSdk=1 + "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION% + "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 + ) ELSE ( + ECHO Using default MSVC build environment for 64 bit architecture + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 + ) +) ELSE ( + ECHO Using default MSVC build environment for 32 bit architecture + ECHO Executing: %COMMAND_TO_RUN% + call %COMMAND_TO_RUN% || EXIT 1 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/appveyor.yml new/greenlet-0.4.10/appveyor.yml --- old/greenlet-0.4.9/appveyor.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/greenlet-0.4.10/appveyor.yml 2016-06-11 14:37:49.000000000 +0200 @@ -0,0 +1,76 @@ +version: 0.4.10.{build} +environment: + global: + # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the + # /E:ON and /V:ON options are not enabled in the batch script intepreter + # See: http://stackoverflow.com/a/13751649/163740 + CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\appveyor\\run_with_env.cmd" + + matrix: + # http://www.appveyor.com/docs/installed-software#python + - PYTHON_ROOT: "C:\\Python26" + PYTHON_ARCH: "32" + PYTHON_VERSION: "2.6.x" + + - PYTHON_ROOT: "C:\\Python26-x64" + PYTHON_ARCH: "64" + PYTHON_VERSION: "2.6.x" + + - PYTHON_ROOT: "C:\\Python27" + PYTHON_ARCH: "32" + PYTHON_VERSION: "2.7.x" + + - PYTHON_ROOT: "C:\\Python27-x64" + PYTHON_ARCH: "64" + PYTHON_VERSION: "2.7.x" + + - PYTHON_ROOT: "C:\\Python33" + PYTHON_ARCH: "32" + PYTHON_VERSION: "3.3.x" + + - PYTHON_ROOT: "C:\\Python33-x64" + PYTHON_ARCH: "64" + PYTHON_VERSION: "3.3.x" + + - PYTHON_ROOT: "C:\\Python34" + PYTHON_ARCH: "32" + PYTHON_VERSION: "3.4.x" + + - PYTHON_ROOT: "C:\\Python34-x64" + PYTHON_ARCH: "64" + PYTHON_VERSION: "3.4.x" + + - PYTHON_ROOT: "C:\\Python35" + PYTHON_ARCH: "32" + PYTHON_VERSION: "3.5.x" + + - PYTHON_ROOT: "C:\\Python35-x64" + PYTHON_ARCH: "64" + PYTHON_VERSION: "3.5.x" + +install: + - "SET PATH=%PYTHON_ROOT%;%PYTHON_ROOT%\\Scripts;%PATH%" + - "python --version" + - "python -c \"import struct; print(struct.calcsize('P') * 8)\"" + + # Copy current pip.exe away, so the file is not locked on upgrade + - "copy %PYTHON_ROOT%\\Scripts\\pip.exe %PYTHON_ROOT%\\Scripts\\pip-old.exe" + + # Upgrade pip to the latest version + - "pip-old install --disable-pip-version-check --upgrade pip" + + # Install requirements for running tests and building artifacts + - "%CMD_IN_ENV% pip install --upgrade -r dev-requirements.txt" + +build_script: + - "%CMD_IN_ENV% python setup.py build" + +test_script: + - "%CMD_IN_ENV% python setup.py test" + +after_test: + - "%CMD_IN_ENV% python setup.py bdist_wheel" + - "%CMD_IN_ENV% python setup.py bdist_egg" + +artifacts: + - path: dist\* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/dev-requirements.txt new/greenlet-0.4.10/dev-requirements.txt --- old/greenlet-0.4.9/dev-requirements.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/greenlet-0.4.10/dev-requirements.txt 2016-06-11 14:37:49.000000000 +0200 @@ -0,0 +1,2 @@ +setuptools +wheel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/doc/greenlet.txt new/greenlet-0.4.10/doc/greenlet.txt --- old/greenlet-0.4.9/doc/greenlet.txt 2015-05-31 15:02:31.000000000 +0200 +++ new/greenlet-0.4.10/doc/greenlet.txt 2016-04-02 20:26:46.000000000 +0200 @@ -113,7 +113,7 @@ suspended. Jumping between greenlets is called "switching". When you create a greenlet, it gets an initially empty stack; when you -first switch to it, it starts the run a specified function, which may call +first switch to it, it starts to run a specified function, which may call other functions, switch out of the greenlet, etc. When eventually the outermost function finishes its execution, the greenlet's stack becomes empty again and the greenlet is "dead". Greenlets can also die of an diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/greenlet.h new/greenlet-0.4.10/greenlet.h --- old/greenlet-0.4.9/greenlet.h 2015-08-30 20:01:07.000000000 +0200 +++ new/greenlet-0.4.10/greenlet.h 2016-06-11 19:28:00.000000000 +0200 @@ -11,7 +11,7 @@ extern "C" { #endif -#define GREENLET_VERSION "0.4.9" +#define GREENLET_VERSION "0.4.10" typedef struct _greenlet { PyObject_HEAD diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/make-manylinux new/greenlet-0.4.10/make-manylinux --- old/greenlet-0.4.9/make-manylinux 1970-01-01 01:00:00.000000000 +0100 +++ new/greenlet-0.4.10/make-manylinux 2016-04-02 20:27:10.000000000 +0200 @@ -0,0 +1,15 @@ +#!/bin/bash +set -e + +if [ -d /greenlet -a -d /opt/python ]; then + # Running inside docker + cd /greenlet + for version in cp27-cp27mu cp34-cp34m cp35-cp35m; do + /opt/python/${version}/bin/pip wheel greenlet + auditwheel repair greenlet*${version}*.whl + rm greenlet*${version}*whl + done + exit 0 +fi + +docker run --rm -ti -v "$(pwd):/greenlet" quay.io/pypa/manylinux1_x86_64 /greenlet/make-manylinux diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/make-win-release new/greenlet-0.4.10/make-win-release --- old/greenlet-0.4.9/make-win-release 2015-05-31 15:02:31.000000000 +0200 +++ new/greenlet-0.4.10/make-win-release 2016-04-02 20:26:46.000000000 +0200 @@ -12,6 +12,8 @@ "Python33x64": common_dist, "Python34": common_dist, "Python34x64": common_dist, + "Python35": common_dist, + "Python35x64": common_dist, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/platform/switch_arm32_ios.h new/greenlet-0.4.10/platform/switch_arm32_ios.h --- old/greenlet-0.4.9/platform/switch_arm32_ios.h 1970-01-01 01:00:00.000000000 +0100 +++ new/greenlet-0.4.10/platform/switch_arm32_ios.h 2015-05-31 18:06:02.000000000 +0200 @@ -0,0 +1,67 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 31-May-15 iOS support. Ported from arm32. Proton <feisu...@163.com> + * + * NOTES + * + * It is not possible to detect if fp is used or not, so the supplied + * switch function needs to support it, so that you can remove it if + * it does not apply to you. + * + * POSSIBLE ERRORS + * + * "fp cannot be used in asm here" + * + * - Try commenting out "fp" in REGS_TO_SAVE. + * + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 +#define REG_SP "sp" +#define REG_SPSP "sp,sp" +#define REG_FP "r7" +#define REG_FPFP "r7,r7" +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r10", "r11", "lr" +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ + "d12", "d13", "d14", "d15" + +static int +#ifdef __GNUC__ +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +slp_switch(void) +{ + void *fp; + register int *stackref, stsizediff, result; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("str " REG_FP ",%0" : "=m" (fp)); + __asm__ ("mov %0," REG_SP : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add " REG_SPSP ",%0\n" + "add " REG_FPFP ",%0\n" + : + : "r" (stsizediff) + : REGS_TO_SAVE /* Clobber registers, force compiler to + * recalculate address of void *fp from REG_SP or REG_FP */ + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ( + "ldr " REG_FP ", %1\n\t" + "mov %0, #0" + : "=r" (result) + : "m" (fp) + : REGS_TO_SAVE /* Force compiler to restore saved registers after this */ + ); + return result; +} + +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/setup.py new/greenlet-0.4.10/setup.py --- old/greenlet-0.4.9/setup.py 2015-08-30 20:00:42.000000000 +0200 +++ new/greenlet-0.4.10/setup.py 2016-06-11 19:24:34.000000000 +0200 @@ -5,10 +5,12 @@ # workaround segfaults on openbsd and RHEL 3 / CentOS 3 . see # https://bitbucket.org/ambroff/greenlet/issue/11/segfault-on-openbsd-i386 # https://github.com/python-greenlet/greenlet/issues/4 +# https://github.com/python-greenlet/greenlet/issues/94 if ((sys.platform == "openbsd4" and os.uname()[-1] == "i386") or ("-with-redhat-3." in platform.platform() and platform.machine() == 'i686') or (sys.platform == "sunos5" and os.uname()[-1] == "sun4v") - or ("SunOS" in platform.platform() and platform.machine() == "sun4v")): + or ("SunOS" in platform.platform() and platform.machine() == "sun4v") + or (sys.platform == "linux" and platform.machine() == "ppc")): os.environ["CFLAGS"] = ("%s %s" % (os.environ.get("CFLAGS", ""), "-Os")).lstrip() try: @@ -68,7 +70,7 @@ setup( name="greenlet", - version='0.4.9', + version='0.4.10', description='Lightweight in-process concurrent programming', long_description=readfile("README.rst"), maintainer="Alexey Borzenkov", @@ -96,6 +98,7 @@ 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', 'Operating System :: OS Independent', 'Topic :: Software Development :: Libraries :: Python Modules'], **setuptools_args) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-0.4.9/tests/test_stack_saved.py new/greenlet-0.4.10/tests/test_stack_saved.py --- old/greenlet-0.4.9/tests/test_stack_saved.py 1970-01-01 01:00:00.000000000 +0100 +++ new/greenlet-0.4.10/tests/test_stack_saved.py 2015-05-31 15:02:31.000000000 +0200 @@ -0,0 +1,19 @@ +import greenlet +import unittest + + +class Test(unittest.TestCase): + + def test_stack_saved(self): + main = greenlet.getcurrent() + self.assertEqual(main._stack_saved, 0) + + def func(): + main.switch(main._stack_saved) + + g = greenlet.greenlet(func) + x = g.switch() + assert x > 0, x + assert g._stack_saved > 0, g._stack_saved + g.switch() + assert g._stack_saved == 0, g._stack_saved