From 2455b3949507ee6a5d2c53fcb4d52da190bb0053 Mon Sep 17 00:00:00 2001 From: DongHun Kwak Date: Thu, 31 Dec 2020 12:11:24 +0900 Subject: [PATCH] Imported Upstream version 0.29.21 --- .coveragerc | 7 - .editorconfig | 23 -- .gitignore | 43 --- .gitrev | 1 + .hgignore | 28 -- .hgtags | 55 --- .mailmap | 15 - .travis.yml | 171 --------- BUILD.bazel | 34 -- CHANGES.rst | 40 ++ Cython/Build/ipython-COPYING.rst | 74 ---- Cython/Compiler/Code.py | 37 +- Cython/Compiler/ExprNodes.py | 66 ++-- Cython/Compiler/FlowControl.py | 1 + Cython/Compiler/FusedNode.py | 6 + Cython/Compiler/ModuleNode.py | 77 +--- Cython/Compiler/Nodes.py | 13 +- Cython/Compiler/Options.py | 2 +- Cython/Compiler/StringEncoding.py | 28 ++ Cython/Compiler/Tests/TestStringEncoding.py | 44 +++ Cython/Compiler/TypeSlots.py | 44 +-- Cython/Includes/cpython/unicode.pxd | 11 + Cython/Includes/libcpp/unordered_map.pxd | 2 +- Cython/Shadow.py | 2 +- Cython/Shadow.pyi | 102 ----- Cython/Utility/Builtins.c | 3 + Cython/Utility/CythonFunction.c | 2 + Cython/Utility/ExtensionTypes.c | 53 --- Cython/Utility/ImportExport.c | 7 +- Cython/Utility/MemoryView_C.c | 22 +- Cython/Utility/ModuleSetupCode.c | 6 +- Cython/Utility/StringTools.c | 24 +- Demos/README.rst | 35 -- Doc/s5/Makefile | 17 - Doc/s5/cython-ep2008.txt | 401 -------------------- Doc/s5/ep2008/stupidlowercase.py | 9 - Doc/s5/ep2008/worker.py | 9 - Doc/s5/ui/default/blank.gif | Bin 49 -> 0 bytes Doc/s5/ui/default/bodybg.gif | Bin 10119 -> 0 bytes Doc/s5/ui/default/cython-logo64.png | Bin 3774 -> 0 bytes Doc/s5/ui/default/framing.css | 23 -- Doc/s5/ui/default/iepngfix.htc | 42 --- Doc/s5/ui/default/opera.css | 7 - Doc/s5/ui/default/outline.css | 15 - Doc/s5/ui/default/pretty.css | 163 -------- Doc/s5/ui/default/print.css | 24 -- Doc/s5/ui/default/s5-core.css | 9 - Doc/s5/ui/default/slides.css | 3 - Doc/s5/ui/default/slides.js | 552 ---------------------------- PKG-INFO | 54 +++ appveyor.yml | 94 ----- appveyor/install.ps1 | 108 ------ appveyor/run_with_env.cmd | 32 -- pyximport/README.rst | 71 ---- runtests.py | 2 + test-requirements-cpython.txt | 4 - test-requirements.txt | 3 - tests/compile/buildenv.pyx | 8 + tests/compile/tryfinally.pyx | 7 + tests/memoryview/relaxed_strides.pyx | 30 ++ tests/run/cpp_classes.pyx | 13 + tests/run/cpp_stl_cpp11.pyx | 15 + tests/run/cpp_unordered_map_helper.h | 13 + tests/run/exectest.pyx | 15 + tests/run/unicodeliterals.pyx | 23 +- tox.ini | 18 - 66 files changed, 467 insertions(+), 2395 deletions(-) delete mode 100644 .coveragerc delete mode 100644 .editorconfig delete mode 100644 .gitignore create mode 100644 .gitrev delete mode 100644 .hgignore delete mode 100644 .hgtags delete mode 100644 .mailmap delete mode 100644 .travis.yml delete mode 100644 BUILD.bazel delete mode 100644 Cython/Build/ipython-COPYING.rst create mode 100644 Cython/Compiler/Tests/TestStringEncoding.py delete mode 100644 Cython/Shadow.pyi delete mode 100644 Demos/README.rst delete mode 100644 Doc/s5/Makefile delete mode 100644 Doc/s5/cython-ep2008.txt delete mode 100644 Doc/s5/ep2008/stupidlowercase.py delete mode 100644 Doc/s5/ep2008/worker.py delete mode 100644 Doc/s5/ui/default/blank.gif delete mode 100644 Doc/s5/ui/default/bodybg.gif delete mode 100644 Doc/s5/ui/default/cython-logo64.png delete mode 100644 Doc/s5/ui/default/framing.css delete mode 100644 Doc/s5/ui/default/iepngfix.htc delete mode 100644 Doc/s5/ui/default/opera.css delete mode 100644 Doc/s5/ui/default/outline.css delete mode 100644 Doc/s5/ui/default/pretty.css delete mode 100644 Doc/s5/ui/default/print.css delete mode 100644 Doc/s5/ui/default/s5-core.css delete mode 100644 Doc/s5/ui/default/slides.css delete mode 100644 Doc/s5/ui/default/slides.js create mode 100644 PKG-INFO delete mode 100644 appveyor.yml delete mode 100644 appveyor/install.ps1 delete mode 100644 appveyor/run_with_env.cmd delete mode 100644 pyximport/README.rst delete mode 100644 test-requirements-cpython.txt delete mode 100644 test-requirements.txt create mode 100644 tests/run/cpp_unordered_map_helper.h delete mode 100644 tox.ini diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 9bc4ce4..0000000 --- a/.coveragerc +++ /dev/null @@ -1,7 +0,0 @@ -[run] -branch = True -parallel = True -concurrency = multiprocessing,thread -include = Cython/* -source = Cython -omit = Test* diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 55e1ad7..0000000 --- a/.editorconfig +++ /dev/null @@ -1,23 +0,0 @@ -# top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending every file -[*] -end_of_line = lf -insert_final_newline = true -max_line_length = 120 - -# 4 space indentation -[*.{py,pyx,pxi,pxd,c,cpp,h,hpp}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true - -# Tab indentation (no size specified) -[Makefile] -indent_style = tab - -# Matches the exact files either package.json or .travis.yml -[{package.json,.travis.yml}] -indent_style = space -indent_size = 2 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 46da36e..0000000 --- a/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -*.pyc -*.pyo -__pycache__ -*.so -*.o - -*.egg -*.egg-info - -Cython/Compiler/*.c -Cython/Plex/*.c -Cython/Runtime/refnanny.c -Cython/Tempita/*.c -Cython/*.c - -Tools/*.elc - -/TEST_TMP/ -/build/ -/wheelhouse*/ -!tests/build/ -/dist/ -.gitrev -.coverage -*.orig -*.rej -*.dep -*.swp -*~ - -.ipynb_checkpoints -docs/build - -tags -TAGS -MANIFEST - -.tox - -# Jetbrains IDE project files -/.idea -/*.iml - diff --git a/.gitrev b/.gitrev new file mode 100644 index 0000000..9852a62 --- /dev/null +++ b/.gitrev @@ -0,0 +1 @@ +976f5483c6df8570f34076ef25af7e7512dd9347 diff --git a/.hgignore b/.hgignore deleted file mode 100644 index b64af66..0000000 --- a/.hgignore +++ /dev/null @@ -1,28 +0,0 @@ -syntax: glob - -*.pyc -*.pyo -__pycache__ -*.egg -*.egg-info - -Cython/Compiler/*.c -Cython/Plex/*.c -Cython/Runtime/refnanny.c - -TEST_TMP/ -build/ -dist/ -.git/ -.gitrev -.coverage -*.orig -*.rej -*.dep -*.swp -*.so -*.o -*~ - -tags -TAGS diff --git a/.hgtags b/.hgtags deleted file mode 100644 index e9522be..0000000 --- a/.hgtags +++ /dev/null @@ -1,55 +0,0 @@ -966abe58538dfbdaccd53bd970d4998c78ea522e 0.9.6.14 -67ee5a34bfc662e4e3cf989c2c8bf78a412ae8f4 0.9.8rc1 -16a746d969e2654112fc0dc081690b891c496977 Version-0.9.8 -a09347d7b470290076b983aef98707921445a038 0.9.8.1 -82084a7b654e2a133ab64ceb47e03d6e7a204990 0.9.9.2.beta -a89b05b78236a27a654f3004bdffc7b8a56311a7 0.10 -ef9d2c680684d0df7d81f529cda29e9e1741f575 cython-0.10.1 -92baafe0edf3cea00deb7ce1e31e337bb485af1a 0.10.2 -cdf889c30e7a7053de20bae3a578dad09ebcbdf5 0.10.3 -59c67af0674bd93c5fd8958e08c76a9dab9aae37 sage-cythonizes -a4abf0156540db4d3ebaa95712b65811c43c5acb 0.11-beta -838a6b7cae62e01dc0ce663cccab1f93f649fdbd 0.11.rc -4497f635d5fdbd38ebb841be4869fbfa2bbfdbb6 0.11.1.alpha -7bc36a0f81723117a19f92ffde1676a0884fef65 0.11.1.beta -6454db601984145f38e28d34176fca8a3a22329c 0.11.1 -af6f1bed8cd40a2edefb57d3eacbc9274a8788b4 0.11.2.rc1 -15ad532e2127840ae09dfbe46ccc80ac8c562f99 0.11.2 -eb00d00a73c13b6aa8b440fe07cd7acb52a060e8 0.11.3.rc0 -7c695fe49fd6912f52d995fe512d66baacf90ee6 0.11.3 -4208042ceeae634f5c0999b8ab75f69faf46b6db 0.12.alpha0 -e77827f09af67560aa82a18feab778f71ca0a9d3 0.12.rc0 -fae19937e4945c59a5d9d62c63f1c3b09046c3a3 0.12 -e90c522631ae06f2170a751fb256cdea0e50fb21 0.12.1 -5ac2eaefcdc9c3a7a9c29a0bb8c3e4c6c016c64c 0.13.beta0 -14957f635a379c97d9966097276313e43491ed96 0.13.beta1 -32c957267b3ba3140fba4d1947fa98484d5e956b 0.13 -ef9d2c680684d0df7d81f529cda29e9e1741f575 0.10.1 -16a746d969e2654112fc0dc081690b891c496977 0.9.8 -16a746d969e2654112fc0dc081690b891c496977 Version-0.9.8 -0000000000000000000000000000000000000000 Version-0.9.8 -ef9d2c680684d0df7d81f529cda29e9e1741f575 cython-0.10.1 -0000000000000000000000000000000000000000 cython-0.10.1 -59c67af0674bd93c5fd8958e08c76a9dab9aae37 sage-cythonizes -0000000000000000000000000000000000000000 sage-cythonizes -478f57be445d18fe294db849d7ad317fe7d7658f 0.14.alpha0 -31b531a6c45b2c34ae5a1af8a2c09f152adea60d 0.14.beta1 -7fa84cb6d3d75eb3d015aeeb60bf8b642171fe93 0.14.beta2 -7fa84cb6d3d75eb3d015aeeb60bf8b642171fe93 0.14.beta2 -8412b39fbc3eb709a543e2f1e95c0c8881ea9ed4 0.14.beta2 -a6b9f0a6d02d23fc3d3a9d0587867faa3afb2fcd 0.14.rc0 -15bf34c9387444e262acb1de594405444dd571a4 0.14 -5320ddd8c3a60d00e0513f9f70d6846cd449409b 0.17.beta1 -275fb550c1d802da3df35ebae41e04eadc60e49e 0.17.2 -b0faba6967e74f652286a0de6d02d736845b0708 0.17.3 -c1a18ab6b0808e87f68d2f9d914c01934510aef5 0.18b1 -9a11631e0edb0394b17554cde8bec5d4784117e4 0.18rc1 -76f33728e8534e698267e097cf603ea59ade6f30 0.18 -4f782ac7b3fdf3b4408bbf9f2ed4c38f31e60920 0.19b1 -52beb5b16df5b8a92bb6c8c47faf42370d73cb0f 0.19b2 -4818f5b68eb4b4ea6ad7e415f6672b491e2461bc 0.19rc1 -48407fa3f3c9da84ab3dc103a6a2b1ca4c1beb2a 0.19 -58fc9a3feb83f571623a492256885d21945decb4 0.21.1 -58fc9a3feb83f571623a492256885d21945decb4 0.21.1 -d05a4acd45fca9bdc12cef82890ca569fbaae1a5 0.21.1 -ab1a3afb8775a09d37c0d478476987eee8e734a6 0.21.2 diff --git a/.mailmap b/.mailmap deleted file mode 100644 index c7d53f5..0000000 --- a/.mailmap +++ /dev/null @@ -1,15 +0,0 @@ -Stefan Behnel Stefan Behnel -Stefan Behnel scoder -Stefan Behnel Stefan Behnel -Robert Bradshaw Robert Bradshaw -Robert Bradshaw Robert Bradshaw -Robert Bradshaw robertwb -Robert Bradshaw Robert Bradshaw -Mark Florisson Mark -Mark Florisson Mark Florisson -Lars Buitinck Lars Buitinck -Danilo Freitas DaniloFreitas -Danilo Freitas daniloaf@daniloaf-PC -Danilo Freitas daniloaf -Lisandro Dalcin dalcinl -Christoph Gohlke cgohlke diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0bb8013..0000000 --- a/.travis.yml +++ /dev/null @@ -1,171 +0,0 @@ -os: linux -dist: trusty -language: python -# 'sudo' is enabled automatically by the 'apt' addon below. -#sudo: false - -addons: - apt: - packages: - - gdb - - python-dbg - - python3-dbg - - libzmq-dev # needed by IPython/Tornado - #- gcc-8 - #- g++-8 - -cache: - pip: true - directories: - - $HOME/.ccache - -env: - global: - - USE_CCACHE=1 - - CCACHE_SLOPPINESS=pch_defines,time_macros - - CCACHE_COMPRESS=1 - - CCACHE_MAXSIZE=250M - - PATH="/usr/lib/ccache:$HOME/miniconda/bin:$PATH" - - BACKEND=c,cpp - -matrix: - include: - - python: 2.7 - env: BACKEND=c - - python: 2.7 - env: BACKEND=cpp - - python: 3.7 - dist: xenial # Required for Python 3.7 - sudo: required # travis-ci/travis-ci#9069 - env: BACKEND=c - - python: 3.7 - dist: xenial # Required for Python 3.7 - sudo: required # travis-ci/travis-ci#9069 - env: BACKEND=cpp - - python: 2.6 - env: BACKEND=c - - python: 2.6 - env: BACKEND=cpp -# Disabled: coverage analysis takes excessively long, several times longer than without. -# - python: 3.7 -# dist: xenial # Required for Python 3.7 -# sudo: required # travis-ci/travis-ci#9069 -# env: COVERAGE=1 - - python: 3.7 - dist: xenial # Required for Python 3.7 - sudo: required # travis-ci/travis-ci#9069 - env: TEST_CODE_STYLE=1 - - python: 3.4 - env: BACKEND=c - - python: 3.4 - env: BACKEND=cpp - - python: 3.5 - env: BACKEND=c - - python: 3.5 - env: BACKEND=cpp - - python: 3.6 - env: BACKEND=c - - python: 3.6 - env: BACKEND=cpp - - python: 3.8 - dist: xenial # Required for Python 3.7 - sudo: required # travis-ci/travis-ci#9069 - env: BACKEND=c - - python: 3.8 - dist: xenial # Required for Python 3.7 - sudo: required # travis-ci/travis-ci#9069 - env: BACKEND=cpp - - python: 3.9-dev - dist: xenial # Required for Python 3.7 - sudo: required # travis-ci/travis-ci#9069 - env: BACKEND=c - - python: 3.9-dev - dist: xenial # Required for Python 3.7 - sudo: required # travis-ci/travis-ci#9069 - env: BACKEND=cpp - - os: osx - osx_image: xcode6.4 - env: PY=2 - python: 2 - language: c - compiler: clang - cache: false - - os: osx - osx_image: xcode6.4 - env: PY=3 - python: 3 - language: c - compiler: clang - cache: false - - python: pypy - env: BACKEND=c - - python: pypy3 - env: BACKEND=c - - env: STACKLESS=true BACKEND=c PY=2 - python: 2.7 - - env: STACKLESS=true BACKEND=c PY=3 - python: 3.6 - allow_failures: - - python: 3.9-dev - - python: pypy - - python: pypy3 - -branches: - only: - - master - - release - -before_install: - - | - if [ "$TRAVIS_OS_NAME" == "linux" ]; then - # adding apt repos in travis is really fragile => retry a couple of times. - for i in {1..10}; do travis_retry sudo apt-add-repository --yes 'ppa:ubuntu-toolchain-r/test' && break; sleep 2; done - for i in {1..10}; do travis_retry sudo apt-get update && travis_retry sudo apt-get install --yes gcc-8 $(if [ -z "${BACKEND##*cpp*}" ]; then echo -n "g++-8"; fi ) && break; sleep 2; done - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 60 $(if [ -z "${BACKEND##*cpp*}" ]; then echo " --slave /usr/bin/g++ g++ /usr/bin/g++-8"; fi) - sudo update-alternatives --set gcc /usr/bin/gcc-8 - export CC=gcc - if [ -z "${BACKEND##*cpp*}" ]; then sudo update-alternatives --set g++ /usr/bin/g++-8; export CXX=g++; fi - fi - - - | - if [ "$TRAVIS_OS_NAME" == "osx" -o "$STACKLESS" == "true" ]; then - echo "Installing Miniconda" - if [ "$TRAVIS_OS_NAME" == "osx" ]; then CONDA_PLATFORM=MacOSX; else CONDA_PLATFORM=Linux; fi - travis_retry wget -O miniconda.sh https://repo.continuum.io/miniconda/Miniconda$PY-latest-${CONDA_PLATFORM}-x86_64.sh || exit 1 - bash miniconda.sh -b -p $HOME/miniconda && rm miniconda.sh || exit 1 - conda --version || exit 1 - #conda install --quiet --yes nomkl --file=test-requirements.txt --file=test-requirements-cpython.txt - if [ "$TRAVIS_OS_NAME" == "osx" ]; then - which clang && clang --version && export CC=clang || true - which clang++ && clang++ --version && export CXX=clang++ || true - fi - fi - - - if [ -n "$CC" ]; then which $CC; $CC --version; fi - - if [ -n "$CXX" ]; then which $CXX; $CXX --version; fi - - - if [ "$STACKLESS" == "true" ]; then - conda config --add channels stackless; - travis_retry conda install --quiet --yes stackless; - fi - -install: - - python -c 'import sys; print("Python %s" % (sys.version,))' - - if [ -n "${TRAVIS_PYTHON_VERSION##*-dev}" -a -n "${TRAVIS_PYTHON_VERSION##2.6*}" ]; then pip install -r test-requirements.txt $( [ -z "${TRAVIS_PYTHON_VERSION##pypy*}" -o -z "${TRAVIS_PYTHON_VERSION##3.[478]*}" ] || echo " -r test-requirements-cpython.txt" ) ; fi -# - CFLAGS="-O2 -ggdb -Wall -Wextra $(python -c 'import sys; print("-fno-strict-aliasing" if sys.version_info[0] == 2 else "")')" python setup.py build - -before_script: ccache -s || true - -script: - - PYTHON_DBG="python$( python -c 'import sys; print("%d.%d" % sys.version_info[:2])' )-dbg" - - if [ "$TEST_CODE_STYLE" = "1" ]; then - STYLE_ARGS="--no-unit --no-doctest --no-file --no-pyregr --no-examples"; - else - STYLE_ARGS=--no-code-style; - if $PYTHON_DBG -V >&2; then CFLAGS="-O0 -ggdb" $PYTHON_DBG runtests.py -vv --no-code-style Debugger --backends=$BACKEND; fi; - if [ -z "${BACKEND##*cpp*}" -a -n "${TRAVIS_PYTHON_VERSION##*-dev}" ]; then pip install pythran; fi; - if [ "$BACKEND" != "cpp" -a -n "${TRAVIS_PYTHON_VERSION##2*}" -a -n "${TRAVIS_PYTHON_VERSION##*-dev}" -a -n "${TRAVIS_PYTHON_VERSION##*3.4}" ]; then pip install mypy; fi; - fi - - if [ "$COVERAGE" != "1" ]; then CFLAGS="-O2 -ggdb -Wall -Wextra $(python -c 'import sys; print("-fno-strict-aliasing" if sys.version_info[0] == 2 else "")')" python setup.py build_ext -i; fi - - CFLAGS="-O0 -ggdb -Wall -Wextra" python runtests.py -vv $STYLE_ARGS -x Debugger --backends=$BACKEND $(if [ "$COVERAGE" == "1" ]; then echo " --coverage"; fi) $(if [ -z "$TEST_CODE_STYLE" ]; then echo " -j7 "; fi) - - ccache -s || true diff --git a/BUILD.bazel b/BUILD.bazel deleted file mode 100644 index dc694c9..0000000 --- a/BUILD.bazel +++ /dev/null @@ -1,34 +0,0 @@ -# Bazel build file for inclusion as external dependency. -# -# Most useful is the pyx_library rule from //Tools:rules.bzl -# which mirrors py_library but compiles .pyx files. - -py_library( - name = "cython_lib", - srcs = glob( - ["Cython/**/*.py"], - exclude = [ - "**/Tests/*.py", - ], - ) + ["cython.py"], - data = glob([ - "Cython/**/*.pyx", - "Cython/Utility/*.*", - "Cython/Includes/**/*.pxd", - ]), - visibility = ["//visibility:public"], -) - -py_binary( - name = "cythonize", - srcs = ["cythonize.py"], - visibility = ["//visibility:public"], - deps = ["cython_lib"], -) - -py_binary( - name = "cython", - srcs = ["cython.py"], - visibility = ["//visibility:public"], - deps = ["cython_lib"], -) diff --git a/CHANGES.rst b/CHANGES.rst index 166dfee..96ae40c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,46 @@ Cython Changelog ================ +0.29.21 (2020-07-09) +==================== + +Bugs fixed +---------- + +* Fix a regression in 0.29.20 where ``__div__`` failed to be found in extension types. + (Github issue #3688) + +* Fix a regression in 0.29.20 where a call inside of a finally clause could fail to compile. + Patch by David Woods. (Github issue #3712) + +* Zero-sized buffers could fail to validate as C/Fortran-contiguous. + Patch by Clemens Hofreither. (Github issue #2093) + +* ``exec()`` did not allow recent Python syntax features in Py3.8+ due to + https://bugs.python.org/issue35975. + (Github issue #3695) + +* Binding staticmethods of Cython functions were not behaving like Python methods in Py3. + Patch by Jeroen Demeyer and Michał Górny. (Github issue #3106) + +* Pythran calls to NumPy methods no longer generate useless method lookup code. + +* The ``PyUnicode_GET_LENGTH()`` macro was missing from the ``cpython.*`` declarations. + Patch by Thomas Caswell. (Github issue #3692) + +* The deprecated ``PyUnicode_*()`` C-API functions are no longer used, except for Unicode + strings that contain lone surrogates. Unicode strings that contain non-BMP characters + or surrogate pairs now generate different C code on 16-bit Python 2.x Unicode deployments + (such as MS-Windows). Generating the C code on Python 3.x is recommended in this case. + Original patches by Inada Naoki and Victor Stinner. (Github issues #3677, #3721, #3697) + +* Some template parameters were missing from the C++ ``std::unordered_map`` declaration. + Patch by will. (Github issue #3685) + +* Several internal code generation issues regarding temporary variables were resolved. + (Github issue #3708) + + 0.29.20 (2020-06-10) ==================== diff --git a/Cython/Build/ipython-COPYING.rst b/Cython/Build/ipython-COPYING.rst deleted file mode 100644 index 07a5305..0000000 --- a/Cython/Build/ipython-COPYING.rst +++ /dev/null @@ -1,74 +0,0 @@ -============================= - The IPython licensing terms -============================= - -IPython is licensed under the terms of the Modified BSD License (also known as -New or Revised or 3-Clause BSD), as follows: - -- Copyright (c) 2008-2014, IPython Development Team -- Copyright (c) 2001-2007, Fernando Perez -- Copyright (c) 2001, Janko Hauser -- Copyright (c) 2001, Nathaniel Gray - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of the IPython Development Team nor the names of its -contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -About the IPython Development Team ----------------------------------- - -Fernando Perez began IPython in 2001 based on code from Janko Hauser - and Nathaniel Gray . Fernando is still -the project lead. - -The IPython Development Team is the set of all contributors to the IPython -project. This includes all of the IPython subprojects. A full list with -details is kept in the documentation directory, in the file -``about/credits.txt``. - -The core team that coordinates development on GitHub can be found here: -https://github.com/ipython/. - -Our Copyright Policy --------------------- - -IPython uses a shared copyright model. Each contributor maintains copyright -over their contributions to IPython. But, it is important to note that these -contributions are typically only changes to the repositories. Thus, the IPython -source code, in its entirety is not the copyright of any single person or -institution. Instead, it is the collective copyright of the entire IPython -Development Team. If individual contributors want to maintain a record of what -changes/contributions they have specific copyright on, they should indicate -their copyright in the commit message of the change, when they commit the -change to one of the IPython repositories. - -With this in mind, the following banner should be used in any source code file -to indicate the copyright and license terms: - -:: - - # Copyright (c) IPython Development Team. - # Distributed under the terms of the Modified BSD License. diff --git a/Cython/Compiler/Code.py b/Cython/Compiler/Code.py index 515a535..26fb8a1 100644 --- a/Cython/Compiler/Code.py +++ b/Cython/Compiler/Code.py @@ -718,9 +718,10 @@ class FunctionState(object): self.can_trace = False self.gil_owned = True - self.temps_allocated = [] # of (name, type, manage_ref, static) - self.temps_free = {} # (type, manage_ref) -> list of free vars with same type/managed status - self.temps_used_type = {} # name -> (type, manage_ref) + self.temps_allocated = [] # of (name, type, manage_ref, static) + self.temps_free = {} # (type, manage_ref) -> list of free vars with same type/managed status + self.temps_used_type = {} # name -> (type, manage_ref) + self.zombie_temps = set() # temps that must not be reused after release self.temp_counter = 0 self.closure_temps = None @@ -735,6 +736,20 @@ class FunctionState(object): self.should_declare_error_indicator = False self.uses_error_indicator = False + # safety checks + + def validate_exit(self): + # validate that all allocated temps have been freed + if self.temps_allocated: + leftovers = self.temps_in_use() + if leftovers: + msg = "TEMPGUARD: Temps left over at end of '%s': %s" % (self.scope.name, ', '.join([ + '%s [%s]' % (name, ctype) + for name, ctype, is_pytemp in sorted(leftovers)]), + ) + #print(msg) + raise RuntimeError(msg) + # labels def new_label(self, name=None): @@ -804,7 +819,7 @@ class FunctionState(object): # temp handling - def allocate_temp(self, type, manage_ref, static=False): + def allocate_temp(self, type, manage_ref, static=False, reusable=True): """ Allocates a temporary (which may create a new one or get a previously allocated and released one of the same type). Type is simply registered @@ -823,6 +838,8 @@ class FunctionState(object): This is only used when allocating backing store for a module-level C array literals. + if reusable=False, the temp will not be reused after release. + A C string referring to the variable is returned. """ if type.is_const and not type.is_reference: @@ -838,7 +855,7 @@ class FunctionState(object): manage_ref = False freelist = self.temps_free.get((type, manage_ref)) - if freelist is not None and freelist[0]: + if reusable and freelist is not None and freelist[0]: result = freelist[0].pop() freelist[1].remove(result) else: @@ -847,9 +864,11 @@ class FunctionState(object): result = "%s%d" % (Naming.codewriter_temp_prefix, self.temp_counter) if result not in self.names_taken: break self.temps_allocated.append((result, type, manage_ref, static)) + if not reusable: + self.zombie_temps.add(result) self.temps_used_type[result] = (type, manage_ref) if DebugFlags.debug_temp_code_comments: - self.owner.putln("/* %s allocated (%s) */" % (result, type)) + self.owner.putln("/* %s allocated (%s)%s */" % (result, type, "" if reusable else " - zombie")) if self.collect_temps_stack: self.collect_temps_stack[-1].add((result, type)) @@ -868,10 +887,12 @@ class FunctionState(object): self.temps_free[(type, manage_ref)] = freelist if name in freelist[1]: raise RuntimeError("Temp %s freed twice!" % name) - freelist[0].append(name) + if name not in self.zombie_temps: + freelist[0].append(name) freelist[1].add(name) if DebugFlags.debug_temp_code_comments: - self.owner.putln("/* %s released */" % name) + self.owner.putln("/* %s released %s*/" % ( + name, " - zombie" if name in self.zombie_temps else "")) def temps_in_use(self): """Return a list of (cname,type,manage_ref) tuples of temp names and their type diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index a0baadf..831575b 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -1623,17 +1623,23 @@ class UnicodeNode(ConstNode): def generate_evaluation_code(self, code): if self.type.is_pyobject: - if self.contains_surrogates(): - # surrogates are not really portable and cannot be + # FIXME: this should go away entirely! + # Since string_contains_lone_surrogates() returns False for surrogate pairs in Py2/UCS2, + # Py2 can generate different code from Py3 here. Let's hope we get away with claiming that + # the processing of surrogate pairs in code was always ambiguous and lead to different results + # on P16/32bit Unicode platforms. + if StringEncoding.string_contains_lone_surrogates(self.value): + # lone (unpaired) surrogates are not really portable and cannot be # decoded by the UTF-8 codec in Py3.3 self.result_code = code.get_py_const(py_object_type, 'ustring') - data_cname = code.get_pyunicode_ptr_const(self.value) + data_cname = code.get_string_const( + StringEncoding.BytesLiteral(self.value.encode('unicode_escape'))) const_code = code.get_cached_constants_writer(self.result_code) if const_code is None: return # already initialised const_code.mark_pos(self.pos) const_code.putln( - "%s = PyUnicode_FromUnicode(%s, (sizeof(%s) / sizeof(Py_UNICODE))-1); %s" % ( + "%s = PyUnicode_DecodeUnicodeEscape(%s, sizeof(%s) - 1, NULL); %s" % ( self.result_code, data_cname, data_cname, @@ -4334,6 +4340,7 @@ class BufferIndexNode(_IndexingBaseNode): pythran_indexing_code(self.indices), op, rhs.pythran_result())) + code.funcstate.release_temp(obj) return # Used from generate_assignment_code and InPlaceAssignmentNode @@ -4374,11 +4381,11 @@ class BufferIndexNode(_IndexingBaseNode): code.putln("%s = (PyObject *) *%s;" % (self.result(), self.buffer_ptr_code)) code.putln("__Pyx_INCREF((PyObject*)%s);" % self.result()) - def free_temps(self, code): + def free_subexpr_temps(self, code): for temp in self.index_temps: code.funcstate.release_temp(temp) self.index_temps = () - super(BufferIndexNode, self).free_temps(code) + super(BufferIndexNode, self).free_subexpr_temps(code) class MemoryViewIndexNode(BufferIndexNode): @@ -4655,6 +4662,7 @@ class MemoryCopyNode(ExprNode): self.dst.generate_evaluation_code(code) self._generate_assignment_code(rhs, code) self.dst.generate_disposal_code(code) + self.dst.free_temps(code) rhs.generate_disposal_code(code) rhs.free_temps(code) @@ -5558,7 +5566,7 @@ class SimpleCallNode(CallNode): env.add_include_file(pythran_get_func_include_file(function)) return NumPyMethodCallNode.from_node( self, - function=function, + function_cname=pythran_functor(function), arg_tuple=self.arg_tuple, type=PythranExpr(pythran_func_type(function, self.arg_tuple.args)), ) @@ -5963,13 +5971,13 @@ class SimpleCallNode(CallNode): code.funcstate.release_temp(self.opt_arg_struct) -class NumPyMethodCallNode(SimpleCallNode): +class NumPyMethodCallNode(ExprNode): # Pythran call to a NumPy function or method. # - # function ExprNode the function/method to call - # arg_tuple TupleNode the arguments as an args tuple + # function_cname string the function/method to call + # arg_tuple TupleNode the arguments as an args tuple - subexprs = ['function', 'arg_tuple'] + subexprs = ['arg_tuple'] is_temp = True may_return_none = True @@ -5977,7 +5985,6 @@ class NumPyMethodCallNode(SimpleCallNode): code.mark_pos(self.pos) self.allocate_temp_result(code) - self.function.generate_evaluation_code(code) assert self.arg_tuple.mult_factor is None args = self.arg_tuple.args for arg in args: @@ -5988,7 +5995,7 @@ class NumPyMethodCallNode(SimpleCallNode): code.putln("new (&%s) decltype(%s){%s{}(%s)};" % ( self.result(), self.result(), - pythran_functor(self.function), + self.function_cname, ", ".join(a.pythran_result() for a in args))) @@ -7277,6 +7284,8 @@ class AttributeNode(ExprNode): self.member.upper(), self.obj.result_as(self.obj.type), rhs.result_as(self.ctype()))) + rhs.generate_disposal_code(code) + rhs.free_temps(code) else: select_code = self.result() if self.type.is_pyobject and self.use_managed_ref: @@ -8127,20 +8136,18 @@ class ListNode(SequenceNode): return t def allocate_temp_result(self, code): - if self.type.is_array and self.in_module_scope: - self.temp_code = code.funcstate.allocate_temp( - self.type, manage_ref=False, static=True) - else: - SequenceNode.allocate_temp_result(self, code) - - def release_temp_result(self, env): if self.type.is_array: - # To be valid C++, we must allocate the memory on the stack - # manually and be sure not to reuse it for something else. - # Yes, this means that we leak a temp array variable. - pass + if self.in_module_scope: + self.temp_code = code.funcstate.allocate_temp( + self.type, manage_ref=False, static=True, reusable=False) + else: + # To be valid C++, we must allocate the memory on the stack + # manually and be sure not to reuse it for something else. + # Yes, this means that we leak a temp array variable. + self.temp_code = code.funcstate.allocate_temp( + self.type, manage_ref=False, reusable=False) else: - SequenceNode.release_temp_result(self, env) + SequenceNode.allocate_temp_result(self, code) def calculate_constant_result(self): if self.mult_factor: @@ -13076,9 +13083,18 @@ class PyTypeTestNode(CoercionNode): def generate_post_assignment_code(self, code): self.arg.generate_post_assignment_code(code) + def allocate_temp_result(self, code): + pass + + def release_temp_result(self, code): + pass + def free_temps(self, code): self.arg.free_temps(code) + def free_subexpr_temps(self, code): + self.arg.free_subexpr_temps(code) + class NoneCheckNode(CoercionNode): # This node is used to check that a Python object is not None and diff --git a/Cython/Compiler/FlowControl.py b/Cython/Compiler/FlowControl.py index 49f74a2..df04471 100644 --- a/Cython/Compiler/FlowControl.py +++ b/Cython/Compiler/FlowControl.py @@ -1198,6 +1198,7 @@ class ControlFlowAnalysis(CythonTransform): if self.flow.loops: self.flow.loops[-1].exceptions.append(descr) self.flow.block = body_block + body_block.add_child(entry_point) self.flow.nextblock() self._visit(node.body) self.flow.exceptions.pop() diff --git a/Cython/Compiler/FusedNode.py b/Cython/Compiler/FusedNode.py index 87a9ae2..26d6ffd 100644 --- a/Cython/Compiler/FusedNode.py +++ b/Cython/Compiler/FusedNode.py @@ -878,17 +878,23 @@ class FusedCFuncDefNode(StatListNode): (self.resulting_fused_function.result(), self.__signatures__.result())) code.put_giveref(self.__signatures__.result()) + self.__signatures__.generate_post_assignment_code(code) + self.__signatures__.free_temps(code) self.fused_func_assignment.generate_execution_code(code) # Dispose of results self.resulting_fused_function.generate_disposal_code(code) + self.resulting_fused_function.free_temps(code) self.defaults_tuple.generate_disposal_code(code) + self.defaults_tuple.free_temps(code) self.code_object.generate_disposal_code(code) + self.code_object.free_temps(code) for default in self.defaults: if default is not None: default.generate_disposal_code(code) + default.free_temps(code) def annotate(self, code): for stat in self.stats: diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index e1e9250..9733ea7 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -29,7 +29,7 @@ from . import Pythran from .Errors import error, warning from .PyrexTypes import py_object_type from ..Utils import open_new_file, replace_suffix, decode_filename, build_hex_version -from .Code import UtilityCode, IncludeCode, TempitaUtilityCode +from .Code import UtilityCode, IncludeCode from .StringEncoding import EncodedString from .Pythran import has_np_pythran @@ -1223,6 +1223,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): type = entry.type scope = type.scope if scope: # could be None if there was an error + if not scope.directives['c_api_binop_methods']: + error(self.pos, + "The 'c_api_binop_methods' directive is only supported for forward compatibility" + " and must be True.") self.generate_exttype_vtable(scope, code) self.generate_new_function(scope, code, entry) self.generate_dealloc_function(scope, code) @@ -1255,9 +1259,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): self.generate_dict_getter_function(scope, code) if scope.defines_any_special(TypeSlots.richcmp_special_methods): self.generate_richcmp_function(scope, code) - for slot in TypeSlots.PyNumberMethods: - if slot.is_binop and scope.defines_any_special(slot.user_methods): - self.generate_binop_function(scope, slot, code) self.generate_property_accessors(scope, code) self.generate_method_table(scope, code) self.generate_getset_table(scope, code) @@ -1897,64 +1898,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.putln("}") # switch code.putln("}") - def generate_binop_function(self, scope, slot, code): - func_name = scope.mangle_internal(slot.slot_name) - if scope.directives['c_api_binop_methods']: - code.putln('#define %s %s' % (func_name, slot.left_slot.slot_code(scope))) - return - else: - error(self.pos, - "The 'c_api_binop_methods' directive is only supported for forward compatibility" - " and must be True.") - - code.putln() - preprocessor_guard = slot.preprocessor_guard_code() - if preprocessor_guard: - code.putln(preprocessor_guard) - - if slot.left_slot.signature == TypeSlots.binaryfunc: - slot_type = 'binaryfunc' - extra_arg = extra_arg_decl = '' - elif slot.left_slot.signature == TypeSlots.ternaryfunc: - slot_type = 'ternaryfunc' - extra_arg = ', extra_arg' - extra_arg_decl = ', PyObject* extra_arg' - else: - error(entry.pos, "Unexpected type lost signature: %s" % slot) - - def has_slot_method(method_name): - entry = scope.lookup(method_name) - return bool(entry and entry.is_special and entry.func_cname) - def call_slot_method(method_name, reverse): - entry = scope.lookup(method_name) - if entry and entry.is_special and entry.func_cname: - return "%s(%s%s)" % ( - entry.func_cname, - "right, left" if reverse else "left, right", - extra_arg) - else: - return '%s_maybe_call_slot(%s, left, right %s)' % ( - func_name, - 'Py_TYPE(right)->tp_base' if reverse else 'Py_TYPE(left)->tp_base', - extra_arg) - - code.putln( - TempitaUtilityCode.load_as_string( - "BinopSlot", "ExtensionTypes.c", - context={ - "func_name": func_name, - "slot_name": slot.slot_name, - "overloads_left": int(has_slot_method(slot.left_slot.method_name)), - "call_left": call_slot_method(slot.left_slot.method_name, reverse=False), - "call_right": call_slot_method(slot.right_slot.method_name, reverse=True), - "type_cname": scope.parent_type.typeptr_cname, - "slot_type": slot_type, - "extra_arg": extra_arg, - "extra_arg_decl": extra_arg_decl, - })[1]) - if preprocessor_guard: - code.putln("#endif") - def generate_getattro_function(self, scope, code): # First try to get the attribute using __getattribute__, if defined, or # PyObject_GenericGetAttr. @@ -2715,6 +2658,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.putln('static void %s(CYTHON_UNUSED PyObject *self) {' % Naming.cleanup_cname) + code.enter_cfunc_scope(env) + if Options.generate_cleanup_code >= 2: code.putln("/*--- Global cleanup code ---*/") rev_entries = list(env.var_entries) @@ -3004,6 +2949,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): module.qualified_name, temp, code.error_goto(self.pos))) + code.put_gotref(temp) for entry in entries: if env is module: cname = entry.cname @@ -3014,7 +2960,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): 'if (__Pyx_ImportVoidPtr(%s, "%s", (void **)&%s, "%s") < 0) %s' % ( temp, entry.name, cname, signature, code.error_goto(self.pos))) - code.putln("Py_DECREF(%s); %s = 0;" % (temp, temp)) + code.put_decref_clear(temp, py_object_type) + code.funcstate.release_temp(temp) def generate_c_function_import_code_for_module(self, module, env, code): # Generate import code for all exported C functions in a cimported module. @@ -3032,6 +2979,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): module.qualified_name, temp, code.error_goto(self.pos))) + code.put_gotref(temp) for entry in entries: code.putln( 'if (__Pyx_ImportFunction(%s, "%s", (void (**)(void))&%s, "%s") < 0) %s' % ( @@ -3040,7 +2988,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): entry.cname, entry.type.signature_string(), code.error_goto(self.pos))) - code.putln("Py_DECREF(%s); %s = 0;" % (temp, temp)) + code.put_decref_clear(temp, py_object_type) + code.funcstate.release_temp(temp) def generate_type_init_code(self, env, code): # Generate type import code for extern extension types diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index d3e0590..dd79bd5 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -5866,6 +5866,7 @@ class DelStatNode(StatNode): arg.generate_evaluation_code(code) code.putln("delete %s;" % arg.result()) arg.generate_disposal_code(code) + arg.free_temps(code) # else error reported earlier def annotate(self, code): @@ -6410,6 +6411,8 @@ class SwitchStatNode(StatNode): # generate the switch statement, so shouldn't be bothered). code.putln("default: break;") code.putln("}") + self.test.generate_disposal_code(code) + self.test.free_temps(code) def generate_function_definitions(self, env, code): self.test.generate_function_definitions(env, code) @@ -7673,9 +7676,10 @@ class TryFinallyStatNode(StatNode): if self.func_return_type.is_pyobject: code.putln("%s = 0;" % ret_temp) code.funcstate.release_temp(ret_temp) - ret_temp = None if self.in_generator: self.put_error_uncatcher(code, exc_vars) + for cname in exc_vars: + code.funcstate.release_temp(cname) if not self.finally_clause.is_terminator: code.put_goto(old_label) @@ -8772,6 +8776,11 @@ class ParallelStatNode(StatNode, ParallelNode): self.begin_of_parallel_control_block_point = None self.begin_of_parallel_control_block_point_after_decls = None + if self.num_threads is not None: + # FIXME: is it the right place? should not normally produce code. + self.num_threads.generate_disposal_code(code) + self.num_threads.free_temps(code) + # Firstly, always prefer errors over returning, continue or break if self.error_label_used: c.putln("const char *%s = NULL; int %s = 0, %s = 0;" % self.parallel_pos_info) @@ -9151,7 +9160,7 @@ class ParallelRangeNode(ParallelStatNode): # And finally, release our privates and write back any closure # variables - for temp in start_stop_step + (self.chunksize, self.num_threads): + for temp in start_stop_step + (self.chunksize,): if temp is not None: temp.generate_disposal_code(code) temp.free_temps(code) diff --git a/Cython/Compiler/Options.py b/Cython/Compiler/Options.py index db497aa..48695db 100644 --- a/Cython/Compiler/Options.py +++ b/Cython/Compiler/Options.py @@ -178,7 +178,7 @@ _directive_defaults = { 'auto_pickle': None, 'cdivision': False, # was True before 0.12 'cdivision_warnings': False, - 'c_api_binop_methods': True, # Change for 3.0 + 'c_api_binop_methods': True, 'overflowcheck': False, 'overflowcheck.fold': True, 'always_allow_keywords': False, diff --git a/Cython/Compiler/StringEncoding.py b/Cython/Compiler/StringEncoding.py index af0b411..c37e8aa 100644 --- a/Cython/Compiler/StringEncoding.py +++ b/Cython/Compiler/StringEncoding.py @@ -154,6 +154,34 @@ def string_contains_surrogates(ustring): return False +def string_contains_lone_surrogates(ustring): + """ + Check if the unicode string contains lone surrogate code points + on a CPython platform with wide (UCS-4) or narrow (UTF-16) + Unicode, i.e. characters that would be spelled as two + separate code units on a narrow platform, but that do not form a pair. + """ + last_was_start = False + unicode_uses_surrogate_encoding = sys.maxunicode == 65535 + for c in map(ord, ustring): + # surrogates tend to be rare + if c < 0xD800 or c > 0xDFFF: + if last_was_start: + return True + elif not unicode_uses_surrogate_encoding: + # on 32bit Unicode platforms, there is never a pair + return True + elif c <= 0xDBFF: + if last_was_start: + return True # lone start + last_was_start = True + else: + if not last_was_start: + return True # lone end + last_was_start = False + return last_was_start + + class BytesLiteral(_bytes): # bytes subclass that is compatible with EncodedString encoding = None diff --git a/Cython/Compiler/Tests/TestStringEncoding.py b/Cython/Compiler/Tests/TestStringEncoding.py new file mode 100644 index 0000000..91d0993 --- /dev/null +++ b/Cython/Compiler/Tests/TestStringEncoding.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +import sys +import unittest + +import Cython.Compiler.StringEncoding as StringEncoding + + +class StringEncodingTest(unittest.TestCase): + """ + Test the StringEncoding module. + """ + def test_string_contains_lone_surrogates(self): + self.assertFalse(StringEncoding.string_contains_lone_surrogates(u"abc")) + self.assertFalse(StringEncoding.string_contains_lone_surrogates(u"\uABCD")) + self.assertFalse(StringEncoding.string_contains_lone_surrogates(u"\N{SNOWMAN}")) + + # This behaves differently in Py2 when freshly parsed and read from a .pyc file, + # but it seems to be a marshalling bug in Py2, which doesn't hurt us in Cython. + if sys.version_info[0] != 2: + self.assertTrue(StringEncoding.string_contains_lone_surrogates(u"\uD800\uDFFF")) + + # In Py2 with 16bit Unicode, the following is indistinguishable from the 32bit character. + obfuscated_surrogate_pair = (u"\uDFFF" + "\uD800")[::-1] + if sys.version_info[0] == 2 and sys.maxunicode == 65565: + self.assertFalse(StringEncoding.string_contains_lone_surrogates(obfuscated_surrogate_pair)) + else: + self.assertTrue(StringEncoding.string_contains_lone_surrogates(obfuscated_surrogate_pair)) + + self.assertTrue(StringEncoding.string_contains_lone_surrogates(u"\uD800")) + self.assertTrue(StringEncoding.string_contains_lone_surrogates(u"\uDFFF")) + self.assertTrue(StringEncoding.string_contains_lone_surrogates(u"\uDFFF\uD800")) + self.assertTrue(StringEncoding.string_contains_lone_surrogates(u"\uD800x\uDFFF")) + + def test_string_contains_surrogates(self): + self.assertFalse(StringEncoding.string_contains_surrogates(u"abc")) + self.assertFalse(StringEncoding.string_contains_surrogates(u"\uABCD")) + self.assertFalse(StringEncoding.string_contains_surrogates(u"\N{SNOWMAN}")) + + self.assertTrue(StringEncoding.string_contains_surrogates(u"\uD800")) + self.assertTrue(StringEncoding.string_contains_surrogates(u"\uDFFF")) + self.assertTrue(StringEncoding.string_contains_surrogates(u"\uD800\uDFFF")) + self.assertTrue(StringEncoding.string_contains_surrogates(u"\uDFFF\uD800")) + self.assertTrue(StringEncoding.string_contains_surrogates(u"\uD800x\uDFFF")) diff --git a/Cython/Compiler/TypeSlots.py b/Cython/Compiler/TypeSlots.py index 50e09cd..137ea4e 100644 --- a/Cython/Compiler/TypeSlots.py +++ b/Cython/Compiler/TypeSlots.py @@ -180,14 +180,13 @@ class SlotDescriptor(object): # ifdef Full #ifdef string that slot is wrapped in. Using this causes py3, py2 and flags to be ignored.) def __init__(self, slot_name, dynamic=False, inherited=False, - py3=True, py2=True, ifdef=None, is_binop=False): + py3=True, py2=True, ifdef=None): self.slot_name = slot_name self.is_initialised_dynamically = dynamic self.is_inherited = inherited self.ifdef = ifdef self.py3 = py3 self.py2 = py2 - self.is_binop = is_binop def preprocessor_guard_code(self): ifdef = self.ifdef @@ -406,17 +405,6 @@ class SyntheticSlot(InternalMethodSlot): return self.default_value -class BinopSlot(SyntheticSlot): - def __init__(self, signature, slot_name, left_method, **kargs): - assert left_method.startswith('__') - right_method = '__r' + left_method[2:] - SyntheticSlot.__init__( - self, slot_name, [left_method, right_method], "0", is_binop=True, **kargs) - # MethodSlot causes special method registration. - self.left_slot = MethodSlot(signature, "", left_method) - self.right_slot = MethodSlot(signature, "", right_method) - - class RichcmpSlot(MethodSlot): def slot_code(self, scope): entry = scope.lookup_here(self.method_name) @@ -740,23 +728,23 @@ property_accessor_signatures = { PyNumberMethods_Py3_GUARD = "PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)" PyNumberMethods = ( - BinopSlot(binaryfunc, "nb_add", "__add__"), - BinopSlot(binaryfunc, "nb_subtract", "__sub__"), - BinopSlot(binaryfunc, "nb_multiply", "__mul__"), - BinopSlot(binaryfunc, "nb_divide", "__div__", ifdef = PyNumberMethods_Py3_GUARD), - BinopSlot(binaryfunc, "nb_remainder", "__mod__"), - BinopSlot(binaryfunc, "nb_divmod", "__divmod__"), - BinopSlot(ternaryfunc, "nb_power", "__pow__"), + MethodSlot(binaryfunc, "nb_add", "__add__"), + MethodSlot(binaryfunc, "nb_subtract", "__sub__"), + MethodSlot(binaryfunc, "nb_multiply", "__mul__"), + MethodSlot(binaryfunc, "nb_divide", "__div__", ifdef = PyNumberMethods_Py3_GUARD), + MethodSlot(binaryfunc, "nb_remainder", "__mod__"), + MethodSlot(binaryfunc, "nb_divmod", "__divmod__"), + MethodSlot(ternaryfunc, "nb_power", "__pow__"), MethodSlot(unaryfunc, "nb_negative", "__neg__"), MethodSlot(unaryfunc, "nb_positive", "__pos__"), MethodSlot(unaryfunc, "nb_absolute", "__abs__"), MethodSlot(inquiry, "nb_nonzero", "__nonzero__", py3 = ("nb_bool", "__bool__")), MethodSlot(unaryfunc, "nb_invert", "__invert__"), - BinopSlot(binaryfunc, "nb_lshift", "__lshift__"), - BinopSlot(binaryfunc, "nb_rshift", "__rshift__"), - BinopSlot(binaryfunc, "nb_and", "__and__"), - BinopSlot(binaryfunc, "nb_xor", "__xor__"), - BinopSlot(binaryfunc, "nb_or", "__or__"), + MethodSlot(binaryfunc, "nb_lshift", "__lshift__"), + MethodSlot(binaryfunc, "nb_rshift", "__rshift__"), + MethodSlot(binaryfunc, "nb_and", "__and__"), + MethodSlot(binaryfunc, "nb_xor", "__xor__"), + MethodSlot(binaryfunc, "nb_or", "__or__"), EmptySlot("nb_coerce", ifdef = PyNumberMethods_Py3_GUARD), MethodSlot(unaryfunc, "nb_int", "__int__", fallback="__long__"), MethodSlot(unaryfunc, "nb_long", "__long__", fallback="__int__", py3 = ""), @@ -779,8 +767,8 @@ PyNumberMethods = ( # Added in release 2.2 # The following require the Py_TPFLAGS_HAVE_CLASS flag - BinopSlot(binaryfunc, "nb_floor_divide", "__floordiv__"), - BinopSlot(binaryfunc, "nb_true_divide", "__truediv__"), + MethodSlot(binaryfunc, "nb_floor_divide", "__floordiv__"), + MethodSlot(binaryfunc, "nb_true_divide", "__truediv__"), MethodSlot(ibinaryfunc, "nb_inplace_floor_divide", "__ifloordiv__"), MethodSlot(ibinaryfunc, "nb_inplace_true_divide", "__itruediv__"), @@ -788,7 +776,7 @@ PyNumberMethods = ( MethodSlot(unaryfunc, "nb_index", "__index__"), # Added in release 3.5 - BinopSlot(binaryfunc, "nb_matrix_multiply", "__matmul__", ifdef="PY_VERSION_HEX >= 0x03050000"), + MethodSlot(binaryfunc, "nb_matrix_multiply", "__matmul__", ifdef="PY_VERSION_HEX >= 0x03050000"), MethodSlot(ibinaryfunc, "nb_inplace_matrix_multiply", "__imatmul__", ifdef="PY_VERSION_HEX >= 0x03050000"), ) diff --git a/Cython/Includes/cpython/unicode.pxd b/Cython/Includes/cpython/unicode.pxd index 9060d8c..061be09 100644 --- a/Cython/Includes/cpython/unicode.pxd +++ b/Cython/Includes/cpython/unicode.pxd @@ -10,8 +10,19 @@ cdef extern from *: # Return the size of the object. o has to be a PyUnicodeObject # (not checked). + # + # Deprecated since version 3.3, will be removed in version 3.10: + # Part of the old-style Unicode API, please migrate to using + # PyUnicode_GET_LENGTH(). Py_ssize_t PyUnicode_GET_SIZE(object o) + # Return the length of the Unicode string, in code points. o has + # to be a Unicode object in the “canonical” representation (not + # checked). + # + # New in version 3.3. + Py_ssize_t PyUnicode_GET_LENGTH(object o) + # Return the size of the object's internal buffer in bytes. o has # to be a PyUnicodeObject (not checked). Py_ssize_t PyUnicode_GET_DATA_SIZE(object o) diff --git a/Cython/Includes/libcpp/unordered_map.pxd b/Cython/Includes/libcpp/unordered_map.pxd index 329c1ce..a00fbbe 100644 --- a/Cython/Includes/libcpp/unordered_map.pxd +++ b/Cython/Includes/libcpp/unordered_map.pxd @@ -1,7 +1,7 @@ from .utility cimport pair cdef extern from "" namespace "std" nogil: - cdef cppclass unordered_map[T, U]: + cdef cppclass unordered_map[T, U, HASH=*, PRED=*, ALLOCATOR=*]: ctypedef T key_type ctypedef U mapped_type ctypedef pair[const T, U] value_type diff --git a/Cython/Shadow.py b/Cython/Shadow.py index 1e123fd..dab8c49 100644 --- a/Cython/Shadow.py +++ b/Cython/Shadow.py @@ -1,7 +1,7 @@ # cython.* namespace for pure mode. from __future__ import absolute_import -__version__ = "0.29.20" +__version__ = "0.29.21" try: from __builtin__ import basestring diff --git a/Cython/Shadow.pyi b/Cython/Shadow.pyi deleted file mode 100644 index 42827a3..0000000 --- a/Cython/Shadow.pyi +++ /dev/null @@ -1,102 +0,0 @@ -from builtins import (int as py_int, float as py_float, - bool as py_bool, str as py_str, complex as py_complex) -from typing import (Union, Dict, Any, Sequence, Optional, - List, TypeVar, Type, Generic) - -int = py_int -long = py_int -longlong = py_int -short = py_int -char = py_int -sint = py_int -slong = py_int -slonglong = py_int -sshort = py_int -schar = py_int -uint = py_int -ulong = py_int -ulonglong = py_int -ushort = py_int -uchar = py_int -size_t = py_int -Py_ssize_t = py_int -Py_UCS4 = Union[py_int, str] -Py_UNICODE = Union[py_int, str] -float = py_float -double = py_float -longdouble = py_float -complex = py_complex -floatcomplex = py_complex -doublecomplex = py_complex -longdoublecomplex = py_complex -bint = py_bool -void = Union[None] -basestring = py_str -unicode = py_str - -gs: Dict[str, Any] # Should match the return type of globals() - -_T = TypeVar('_T') - -class _ArrayType(object, Generic[_T]): - is_array: bool - subtypes: Sequence[str] - dtype: _T - ndim: int - is_c_contig: bool - is_f_contig: bool - inner_contig: bool - broadcasting: Any - - # broadcasting is not used, so it's not clear about its type - def __init__(self, dtype: _T, ndim: int, is_c_contig: bool = ..., - is_f_contig: bool = ..., inner_contig: bool = ..., - broadcasting: Any = ...) -> None: ... - def __repr__(self) -> str: ... - -class CythonTypeObject(object): - ... - -class CythonType(CythonTypeObject): - ... - -class PointerType(CythonType, Generic[_T]): - def __init__( - self, - value: Optional[Union[ArrayType[_T], PointerType[_T], List[_T], int]] = ... - ) -> None: ... - def __getitem__(self, ix: int) -> _T: ... - def __setitem__(self, ix: int, value: _T) -> None: ... - def __eq__(self, value: object) -> bool: ... - def __repr__(self) -> str: ... - -class ArrayType(PointerType[_T]): - def __init__(self) -> None: ... - -#class StructType(CythonType, Generic[_T]): -# def __init__( -# self, -# value: List[Type[_T]] = ... -# ) -> None: ... - -def index_type( - base_type: _T, item: Union[tuple, slice, int]) -> _ArrayType[_T]: ... - -def pointer(basetype: _T) -> Type[PointerType[_T]]: ... - -def array(basetype: _T, n: int) -> Type[ArrayType[_T]]: ... - -#def struct(basetype: _T) -> Type[StructType[_T]]: ... - -class typedef(CythonType, Generic[_T]): - name: str - - def __init__(self, type: _T, name: Optional[str] = ...) -> None: ... - def __call__(self, *arg: Any) -> _T: ... - def __repr__(self) -> str: ... - __getitem__ = index_type - -#class _FusedType(CythonType, Generic[_T]): -# def __init__(self) -> None: ... - -#def fused_type(*args: Tuple[_T]) -> Type[FusedType[_T]]: ... diff --git a/Cython/Utility/Builtins.c b/Cython/Utility/Builtins.c index 3c0e491..eaf93c0 100644 --- a/Cython/Utility/Builtins.c +++ b/Cython/Utility/Builtins.c @@ -128,6 +128,9 @@ static PyObject* __Pyx_PyExec3(PyObject* o, PyObject* globals, PyObject* locals) } else { PyCompilerFlags cf; cf.cf_flags = 0; +#if PY_VERSION_HEX >= 0x030800A3 + cf.cf_feature_version = PY_MINOR_VERSION; +#endif if (PyUnicode_Check(o)) { cf.cf_flags = PyCF_SOURCE_IS_UTF8; s = PyUnicode_AsUTF8String(o); diff --git a/Cython/Utility/CythonFunction.c b/Cython/Utility/CythonFunction.c index a65c8ee..33d0a47 100644 --- a/Cython/Utility/CythonFunction.c +++ b/Cython/Utility/CythonFunction.c @@ -548,6 +548,7 @@ static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type) { +#if PY_MAJOR_VERSION < 3 __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) { @@ -563,6 +564,7 @@ static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObj if (obj == Py_None) obj = NULL; +#endif return __Pyx_PyMethod_New(func, obj, type); } diff --git a/Cython/Utility/ExtensionTypes.c b/Cython/Utility/ExtensionTypes.c index 85b262b..1b39c9e 100644 --- a/Cython/Utility/ExtensionTypes.c +++ b/Cython/Utility/ExtensionTypes.c @@ -278,56 +278,3 @@ __PYX_GOOD: Py_XDECREF(setstate_cython); return ret; } - -/////////////// BinopSlot /////////////// - -static CYTHON_INLINE PyObject *{{func_name}}_maybe_call_slot(PyTypeObject* type, PyObject *left, PyObject *right {{extra_arg_decl}}) { - {{slot_type}} slot; -#if CYTHON_USE_TYPE_SLOTS - slot = type->tp_as_number ? type->tp_as_number->{{slot_name}} : NULL; -#else - slot = ({{slot_type}}) PyType_GetSlot(type, Py_{{slot_name}}); -#endif - return slot ? slot(left, right {{extra_arg}}) : __Pyx_NewRef(Py_NotImplemented); -} - -static PyObject *{{func_name}}(PyObject *left, PyObject *right {{extra_arg_decl}}) { - PyObject *res; - int maybe_self_is_left, maybe_self_is_right = 0; - maybe_self_is_left = Py_TYPE(left) == Py_TYPE(right) -#if CYTHON_USE_TYPE_SLOTS - || (Py_TYPE(left)->tp_as_number && Py_TYPE(left)->tp_as_number->{{slot_name}} == &{{func_name}}) -#endif - || __Pyx_TypeCheck(left, {{type_cname}}); - // Optimize for the common case where the left operation is defined (and successful). - if (!{{overloads_left}}) { - maybe_self_is_right = Py_TYPE(left) == Py_TYPE(right) -#if CYTHON_USE_TYPE_SLOTS - || (Py_TYPE(right)->tp_as_number && Py_TYPE(right)->tp_as_number->{{slot_name}} == &{{func_name}}) -#endif - || __Pyx_TypeCheck(right, {{type_cname}}); - } - if (maybe_self_is_left) { - if (maybe_self_is_right && !{{overloads_left}}) { - res = {{call_right}}; - if (res != Py_NotImplemented) return res; - Py_DECREF(res); - // Don't bother calling it again. - maybe_self_is_right = 0; - } - res = {{call_left}}; - if (res != Py_NotImplemented) return res; - Py_DECREF(res); - } - if ({{overloads_left}}) { - maybe_self_is_right = Py_TYPE(left) == Py_TYPE(right) -#if CYTHON_USE_TYPE_SLOTS - || (Py_TYPE(right)->tp_as_number && Py_TYPE(right)->tp_as_number->{{slot_name}} == &{{func_name}}) -#endif - || PyType_IsSubtype(Py_TYPE(right), {{type_cname}}); - } - if (maybe_self_is_right) { - return {{call_right}}; - } - return __Pyx_NewRef(Py_NotImplemented); -} diff --git a/Cython/Utility/ImportExport.c b/Cython/Utility/ImportExport.c index 676bc4c..e3c0caf 100644 --- a/Cython/Utility/ImportExport.c +++ b/Cython/Utility/ImportExport.c @@ -152,11 +152,12 @@ __Pyx_import_all_from(PyObject *locals, PyObject *v) } if (skip_leading_underscores && #if PY_MAJOR_VERSION < 3 - PyString_Check(name) && + likely(PyString_Check(name)) && PyString_AS_STRING(name)[0] == '_') #else - PyUnicode_Check(name) && - PyUnicode_AS_UNICODE(name)[0] == '_') + likely(PyUnicode_Check(name)) && + likely(__Pyx_PyUnicode_GET_LENGTH(name)) && + __Pyx_PyUnicode_READ_CHAR(name, 0) == '_') #endif { Py_DECREF(name); diff --git a/Cython/Utility/MemoryView_C.c b/Cython/Utility/MemoryView_C.c index 9f4828d..0a5d8ee 100644 --- a/Cython/Utility/MemoryView_C.c +++ b/Cython/Utility/MemoryView_C.c @@ -347,18 +347,22 @@ static int __Pyx_ValidateAndInit_memviewslice( } /* Check axes */ - for (i = 0; i < ndim; i++) { - spec = axes_specs[i]; - if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) - goto fail; - if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + if (buf->len > 0) { + // 0-sized arrays do not undergo these checks since their strides are + // irrelevant and they are always both C- and F-contiguous. + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) + goto fail; + if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + goto fail; + } + + /* Check contiguity */ + if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) goto fail; } - /* Check contiguity */ - if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) - goto fail; - /* Initialize */ if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, new_memview != NULL) == -1)) { diff --git a/Cython/Utility/ModuleSetupCode.c b/Cython/Utility/ModuleSetupCode.c index 1c3e63d..aa3f368 100644 --- a/Cython/Utility/ModuleSetupCode.c +++ b/Cython/Utility/ModuleSetupCode.c @@ -532,7 +532,11 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 @@ -663,7 +667,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #endif #if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif diff --git a/Cython/Utility/StringTools.c b/Cython/Utility/StringTools.c index 68315d9..7a34262 100644 --- a/Cython/Utility/StringTools.c +++ b/Cython/Utility/StringTools.c @@ -66,6 +66,8 @@ static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 ch //////////////////// PyUCS4InUnicode //////////////////// +#if PY_VERSION_HEX < 0x03090000 +#if Py_UNICODE_SIZE == 2 static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { /* handle surrogate pairs for Py_UNICODE buffers in 16bit Unicode builds */ Py_UNICODE high_val, low_val; @@ -77,6 +79,7 @@ static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t l } return 0; } +#endif static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) { Py_UNICODE uchar; @@ -87,6 +90,7 @@ static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t } return 0; } +#endif static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) { #if CYTHON_PEP393_ENABLED @@ -100,19 +104,26 @@ static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 ch } return 0; } +#elif PY_VERSION_HEX >= 0x03090000 + #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings. #endif - if (Py_UNICODE_SIZE == 2 && unlikely(character > 65535)) { +#if PY_VERSION_HEX < 0x03090000 +#if Py_UNICODE_SIZE == 2 + if (unlikely(character > 65535)) { return __Pyx_PyUnicodeBufferContainsUCS4_SP( PyUnicode_AS_UNICODE(unicode), PyUnicode_GET_SIZE(unicode), character); - } else { + } else +#endif + { return __Pyx_PyUnicodeBufferContainsUCS4_BMP( PyUnicode_AS_UNICODE(unicode), PyUnicode_GET_SIZE(unicode), character); } +#endif } @@ -443,6 +454,7 @@ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( /////////////// decode_c_string /////////////// //@requires: IncludeStringH //@requires: decode_c_string_utf16 +//@substitute: naming /* duplicate code to avoid calling strlen() if start >= 0 and stop >= 0 */ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( @@ -467,7 +479,7 @@ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( stop += length; } if (unlikely(stop <= start)) - return PyUnicode_FromUnicode(NULL, 0); + return __Pyx_NewRef($empty_unicode); length = stop - start; cstring += start; if (decode_func) { @@ -486,6 +498,7 @@ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( /////////////// decode_c_bytes /////////////// //@requires: decode_c_string_utf16 +//@substitute: naming static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, @@ -503,7 +516,7 @@ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( if (stop > length) stop = length; if (unlikely(stop <= start)) - return PyUnicode_FromUnicode(NULL, 0); + return __Pyx_NewRef($empty_unicode); length = stop - start; cstring += start; if (decode_func) { @@ -543,6 +556,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop); /////////////// PyUnicode_Substring /////////////// +//@substitute: naming static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop) { @@ -559,7 +573,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( else if (stop > length) stop = length; if (stop <= start) - return PyUnicode_FromUnicode(NULL, 0); + return __Pyx_NewRef($empty_unicode); #if CYTHON_PEP393_ENABLED return PyUnicode_FromKindAndData(PyUnicode_KIND(text), PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start); diff --git a/Demos/README.rst b/Demos/README.rst deleted file mode 100644 index 959b71f..0000000 --- a/Demos/README.rst +++ /dev/null @@ -1,35 +0,0 @@ -To run demos do:: - - cd Demos - make test - -which runs ``run_primes.py``, ``run_numeric_demo.py``, ``run_spam.py``, -``integrate_timing.py``, ``callback/runcheese.py`` and ``embed/embedded`` - -For other demos:: - - cd libraries - python setup.py build_ext --inplace - python -c 'import call_mymath;print(call_mymath.call_sinc(1))' - -To run one of the benchmarks for 10 iterations to compare cython and python timings:: - - cd benchmarks - python setup.py build_ext --inplace - python nqueens.py -n 10 - python -c 'import nqueens;print(nqueens.test_n_queens(10))' - -To demo ``cython/bin/cython_freeze``:: - - make - ./nCr 10 5 - ./python - -* Build notes - - * benchmarks/chaos.py requires cython 0.24 or newer - - * embed and freeze work for python2, require cython 0.24 or higher - for python 3.5 - - diff --git a/Doc/s5/Makefile b/Doc/s5/Makefile deleted file mode 100644 index 6623db6..0000000 --- a/Doc/s5/Makefile +++ /dev/null @@ -1,17 +0,0 @@ - -SLIDES=$(subst .txt,.html,$(wildcard *.txt)) -SOURCES=$(subst .py,.c,$(subst .pyx,.c,$(wildcard */*.py */*.pyx))) - -slides: $(SLIDES) $(SOURCES) - -%.html: %.txt - rst2s5 --current-slide --language=en $< $@ - -%.c: %.py - cython --annotate $< - -%.c: %.pyx - cython --annotate $< - -clean: - rm -f *~ $(SLIDES) $(SOURCES) $(subst .c,.html,$(SOURCES)) diff --git a/Doc/s5/cython-ep2008.txt b/Doc/s5/cython-ep2008.txt deleted file mode 100644 index a29ca35..0000000 --- a/Doc/s5/cython-ep2008.txt +++ /dev/null @@ -1,401 +0,0 @@ -============================================== -The Cython Compiler for C-Extensions in Python -============================================== - -Dr. Stefan Behnel ------------------ - -.. class:: center - - http://www.cython.org/ - - cython-dev@codespeak.net - -.. footer:: Dr. Stefan Behnel, EuroPython 2008, Vilnius/Lietuva - -.. include:: - - -About myself -============ - -* Passionate Python developer since 2002 - - * after Basic, Logo, Pascal, Prolog, Scheme, Java, ... - -* CS studies in Germany, Ireland, France - -* PhD in distributed systems in 2007 - - * Language design for self-organising systems - - * Darmstadt University of Technologies, Germany - -* Current occupations: - - * Employed by Senacor Technologies AG, Germany - - * IT transformations, SOA design, Java-Development, ... - - * »lxml« OpenSource XML toolkit for Python - - * http://codespeak.net/lxml/ - - * Cython - - -What is Cython? -=============== - -Cython is - -* an Open-Source project - - * http://cython.org - -* a Python compiler (almost) - - * an enhanced, optimising fork of Pyrex - -* an extended Python language for - - * writing fast Python extension modules - - * interfacing Python with C libraries - - -A little bit of history -======================= - -* April 2002: release of Pyrex 0.1 by Greg Ewing - - * Greg considers Pyrex a language in design phase - - * Pyrex became a key language for many projects - - * over the years, many people patched their Pyrex - - * not all patches were answered by Greg (not in time) - -* minor forks and enhanced branches followed - - * March 2006: my fork of Pyrex for »lxml« XML toolkit - - * November 2006: »SageX« fork of Pyrex - - * by Robert Bradshaw, William Stein (Univ. Seattle, USA) - - * context: »Sage«, a free mathematics software package - -* 28th July 2007: official Cython launch - - * integration of lxml's Pyrex fork into SageX - - * the rest is in http://hg.cython.org/cython-devel/ - - -Major Cython Developers -======================= - -* Robert Bradshaw and Stefan Behnel - - * lead developers - -* Greg Ewing - - * main developer and maintainer of Pyrex - - * we happily share code and discuss ideas - -* Dag Sverre Seljebotn - - * Google Summer-of-Code developer - - * NumPy integration, many ideas and enhancements - -* many, *many* others - see - - * http://cython.org/ - - * the mailing list archives of Cython and Pyrex - - -How to use Cython -================= - -* you write Python code - - * Cython translates it into C code - - * your C compiler builds a shared library for CPython - - * you import your module - -* Cython has support for - - * compile-time includes/imports - - * with dependency tracking - - * distutils - - * *optionally* compile Python code from setup.py! - - -Example: compiling Python code -============================== - -.. sourcecode:: bash - - $ cat worker.py - -.. sourcecode:: python - - class HardWorker(object): - u"Almost Sisyphus" - def __init__(self, task): - self.task = task - - def work_hard(self): - for i in range(100): - self.task() - -.. sourcecode:: bash - - $ cython worker.py - -* translates to 842 line `.c file `_ (Cython 0.9.8) - - * lots of portability #define's - - * tons of helpful C comments with Python code snippets - - * a lot of code that you don't want to write yourself - - -Portable Code -============= - -* Cython compiler generates C code that compiles - - * with all major compilers (C and C++) - - * on all major platforms - - * in Python 2.3 to 3.0 beta1 - -* Cython language syntax follows Python 2.6 - - * optional Python 3 syntax support is on TODO list - - * get involved to get it quicker! - -\... the fastest way to port Python 2 code to Py3 ;-) - - -Python 2 feature support -======================== - -* most of Python 2 syntax is supported - - * top-level classes and functions - - * exceptions - - * object operations, arithmetic, ... - -* plus some Py3/2.6 features: - - * keyword-only arguments - - * unicode literals via ``__future__`` import - -* in recent developer branch: - - * ``with`` statement - - * closures (i.e. local classes and functions) are close! - - -Speed -===== - -Cython generates very efficient C code - -* according to PyBench: - - * conditions and loops run 2-8x faster than in Py2.5 - - * most benchmarks run 30%-80% faster - - * overall more than 30% faster for plain Python code - -* optional type declarations - - * let Cython generate plain C instead of C-API calls - - * make code several times faster than the above - - -Type declarations -================= - -* »cdef« keyword declares - - * local variables with C types - - * functions with C signatures - - * classes as builtin extension types - -* Example:: - - def stupid_lower_case(char* s): - cdef Py_ssize_t size, i - - size = len(s) - for i in range(size): - if s[i] >= 'A' and s[i] <= 'Z': - s[i] += 'a' - 'A' - return s - - -Why is this stupid? -=================== - -Ask Cython! - -.. sourcecode:: bash - - $ cat stupidlowercase.py - -:: - - def stupid_lower_case(char* s): - cdef Py_ssize_t size, i - - size = len(s) - for i in range(size): - if s[i] >= 'A' and s[i] <= 'Z': - s[i] += 'a' - 'A' - return s - -.. sourcecode:: bash - - $ cython --annotate stupidlowercase.py - -=> `stupidlowercase.html `_ - - -Calling C functions -=================== - -* Example:: - - cdef extern from "Python.h": - # copied from the Python C-API docs: - object PyUnicode_DecodeASCII( - char* s, Py_ssize_t size, char* errors) - - cdef extern from "string.h": - int strlen(char *s) - - - cdef slightly_better_lower_case(char* s): - cdef Py_ssize_t i, size = strlen(s) - for i in range(size): - if s[i] >= 'A' and s[i] <= 'Z': - s[i] += 'a' - 'A' - return PyUnicode_DecodeASCII(s, size, NULL) - - -Features in work -================ - -* Dynamic classes and functions with closures - - .. sourcecode:: python - - def factory(a,b): - def closure_function(c): - return a+b+c - return closure_function - -* Native support for new ``buffer`` protocol - - * part of NumPy integration by Dag Seljebotn - - .. sourcecode:: python - - def inplace_negative_grayscale_image( - ndarray[unsigned char, 2] image): - cdef int i, j - for i in range(image.shape[0]): - for j in range(image.shape[1]): - arr[i, j] = 255 - arr[i, j] - - -Huge pile of great ideas -======================== - -* Cython Enhancement Proposals (CEPs) - - * http://wiki.cython.org/enhancements - -* native pickle support for extension classes - -* meta-programming facilities - -* type inference strategies - -* compile-time assertions for optimisations - -* object-like C-array handling - -* improved C++ integration - -* ... - - -Conclusion -========== - -* Cython is a tool for - - * efficiently translating Python code to C - - * easily interfacing to external C libraries - -* Use it to - - * speed up existing Python modules - - * concentrate on optimisations, not rewrites! - - * write C extensions for CPython - - * don't change the language just to get fast code! - - * wrap C libraries *in Python* - - * concentrate on the mapping, not the glue! - - -... but Cython is also -====================== - -* a great project - -* a very open playground for great ideas! - - -Cython -====== - - **Cython** - - **C-Extensions in Python** - - \... use it, and join the project! - - http://cython.org/ diff --git a/Doc/s5/ep2008/stupidlowercase.py b/Doc/s5/ep2008/stupidlowercase.py deleted file mode 100644 index 8f2812d..0000000 --- a/Doc/s5/ep2008/stupidlowercase.py +++ /dev/null @@ -1,9 +0,0 @@ - -def stupid_lower_case(char* s): - cdef Py_ssize_t size, i - - size = len(s) - for i in range(size): - if s[i] >= 'A' and s[i] <= 'Z': - s[i] += 'a' - 'A' - return s diff --git a/Doc/s5/ep2008/worker.py b/Doc/s5/ep2008/worker.py deleted file mode 100644 index 2b26028..0000000 --- a/Doc/s5/ep2008/worker.py +++ /dev/null @@ -1,9 +0,0 @@ - -class HardWorker(object): - u"Almost Sisyphus" - def __init__(self, task): - self.task = task - - def work_hard(self): - for i in range(100): - self.task() diff --git a/Doc/s5/ui/default/blank.gif b/Doc/s5/ui/default/blank.gif deleted file mode 100644 index 75b945d2553848b8b6f41fe5e24599c0687b8472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49 zcmZ?wbhEHbWMp7unE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNY>Fh|Ltj$Y2csQN9XW diff --git a/Doc/s5/ui/default/bodybg.gif b/Doc/s5/ui/default/bodybg.gif deleted file mode 100644 index 5f448a16fe6dc7a03a4279fb19f9ba3af38eb634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10119 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 Duh@-b diff --git a/Doc/s5/ui/default/cython-logo64.png b/Doc/s5/ui/default/cython-logo64.png deleted file mode 100644 index 7ff4f6e927faf79f828a456aa6a0a7743be75ed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3774 zcmV;v4ngsWP)Px#24YJ`L;(K){{a7>y{D4^01jqJL_t(|+SQwTm=(p9z<+&b1_nl!*P<9y2%0DZ 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 diff --git a/Doc/s5/ui/default/framing.css b/Doc/s5/ui/default/framing.css deleted file mode 100644 index 2a5901a..0000000 --- a/Doc/s5/ui/default/framing.css +++ /dev/null @@ -1,23 +0,0 @@ -/* The following styles size, place, and layer the slide components. - Edit these if you want to change the overall slide layout. - The commented lines can be uncommented (and modified, if necessary) - to help you with the rearrangement process. */ - -/* target = 1024x768 */ - -div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} -div#header {top: 0; height: 3em; z-index: 1;} -div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;} -.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;} -div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} -div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; - margin: 0;} -#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;} -html>body #currentSlide {position: fixed;} - -/* -div#header {background: #FCC;} -div#footer {background: #CCF;} -div#controls {background: #BBD;} -div#currentSlide {background: #FFC;} -*/ diff --git a/Doc/s5/ui/default/iepngfix.htc b/Doc/s5/ui/default/iepngfix.htc deleted file mode 100644 index 4d90c87..0000000 --- a/Doc/s5/ui/default/iepngfix.htc +++ /dev/null @@ -1,42 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Doc/s5/ui/default/opera.css b/Doc/s5/ui/default/opera.css deleted file mode 100644 index 9e9d2a3..0000000 --- a/Doc/s5/ui/default/opera.css +++ /dev/null @@ -1,7 +0,0 @@ -/* DO NOT CHANGE THESE unless you really want to break Opera Show */ -.slide { - visibility: visible !important; - position: static !important; - page-break-before: always; -} -#slide0 {page-break-before: avoid;} diff --git a/Doc/s5/ui/default/outline.css b/Doc/s5/ui/default/outline.css deleted file mode 100644 index 62db519..0000000 --- a/Doc/s5/ui/default/outline.css +++ /dev/null @@ -1,15 +0,0 @@ -/* don't change this unless you want the layout stuff to show up in the outline view! */ - -.layout div, #footer *, #controlForm * {display: none;} -#footer, #controls, #controlForm, #navLinks, #toggle { - display: block; visibility: visible; margin: 0; padding: 0;} -#toggle {float: right; padding: 0.5em;} -html>body #toggle {position: fixed; top: 0; right: 0;} - -/* making the outline look pretty-ish */ - -#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} -#slide0 h1 {padding-top: 1.5em;} -.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em; - border-top: 1px solid #888; border-bottom: 1px solid #AAA;} -#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} diff --git a/Doc/s5/ui/default/pretty.css b/Doc/s5/ui/default/pretty.css deleted file mode 100644 index b0e58c6..0000000 --- a/Doc/s5/ui/default/pretty.css +++ /dev/null @@ -1,163 +0,0 @@ -/* Following are the presentation styles -- edit away! */ - -/* body {background: #FFF url(cython.png) 1em 1em no-repeat; color: #000; font-size: 2em;} */ -:link, :visited {text-decoration: none; color: #545454;} -#controls :active {color: #545454 !important;} -#controls :focus {outline: 1px dotted #545454;} -h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} -ul, pre {margin: 0; line-height: 1em;} -html, body {margin: 0; padding: 0;} - -blockquote, q {font-style: italic;} -blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;} -blockquote p {margin: 2em;} -blockquote p strong {font-size: 1.5em;} -blockquote i {font-style: normal;} -blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;} -blockquote b i {font-style: italic;} - -kbd {font-weight: bold; font-size: 1em;} -sup {font-size: smaller; line-height: 1px;} - -.slide {padding-top: 3em; } - -.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;} -.slide code.bad, code del {color: red;} -.slide code.old {color: silver;} -.slide .pre {padding: 0; margin: 0 0 0 0; color: #533; font-size: 80%;} -.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;} -/* .slide pre {padding: 0; margin: 0 0 0 0; color: #533; font-size: 90%;} */ -.slide pre code {display: block;} -.slide div > ul {padding-left: 0; margin-left: 0; list-style: disc; } -.slide li {margin-top: 0.75em; margin-right: 0;} -.slide ul ul {line-height: 1; padding-left: 1em; margin-left: 2%; margin-right: 5%; list-style: disc; } -.slide ul ul li {margin: .4em; font-size: 85%; list-style: square;} -.slide img.leader {display: block; margin: 0 auto;} - -div#header, div#footer {background: #f0f0f0; color: #545454; - font-family: Verdana, Helvetica, sans-serif; padding: 0;} -div#header {background: #f0f0f0 url(cython-logo64.png) 1ex 0.2ex no-repeat; - line-height: 1px; border-bottom: solid #545454 4px; height: 2.4em;} -div#footer {font-size: 0.5em; font-weight: bold; padding: 0.6em 0; - border-top: solid #545454 3px;} -#footer h1, #footer h2 {display: block; padding: 0 1.5ex;} -#footer h2 {font-style: italic;} -#footer a {color: #545454;} - -div.long {font-size: 0.75em;} -.slide h1 {position: absolute; top: 0.2em; left: 87px; z-index: 1; - margin: 0; padding: 0.3ex 0 0 25px; white-space: nowrap; - font: bold 150%/1em Helvetica, sans-serif; /* text-transform: capitalize; */ - color: #646464; background: #f0f0f0;} -.slide h3 {font-size: 130%;} -h1 abbr {font-variant: small-caps;} - -div#controls {position: absolute; left: 50%; bottom: 0; - width: 50%; - text-align: right; font: bold 0.7em Verdana, Helvetica, sans-serif;} -html>body div#controls {position: fixed; padding: 0 0 1em 0; - top: auto;} -div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; - margin: 0; padding: 0;} -#controls #navLinks a {padding: 0; margin: 0 0.5em; - background: #f0f0f0; border: none; color: #545454; - cursor: pointer;} -#controls #navList {height: 1em;} -#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #f0f0f0; color: black;} - -#currentSlide {text-align: center; font-size: 0.5em; color: #545454; left: 90%; bottom: 2px;} - -#slide0 {padding-top: 3em; font-size: 90%;} -#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; - font: bold 2em Helvetica, sans-serif; white-space: normal; - color: #000; background: transparent;} -#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 1.25em;} -#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} -#slide0 h4 {margin-top: 0; font-size: 1em;} - -ul.urls {list-style: none; display: inline; margin: 0;} -.urls li {display: inline; margin: 0;} -.note {display: none;} -.external {border-bottom: 1px dotted gray;} -html>body .external {border-bottom: none;} -/* .external:after {content: " \274F"; font-size: smaller; color: #7B7;} */ - -/* .incremental, .incremental *, .incremental *:after {color: #545454; visibility: visible;} */ -.incremental, .incremental *, .incremental *:after {visibility: hidden;} -img.incremental {visibility: hidden;} -.slide .current {color: #B02;} - -.center {text-align: center; } -.right {text-align: right; } -.small {font-size: 60%; } -img.center {display: block; margin-left: auto; margin-right: auto; } - -.slide .syntax {padding: 2px 0.25em; font-weight: bold; color: #533; font-size:85%; } - -/* diagnostics - -li:after {content: " [" attr(class) "]"; color: #F88;} - */ - -/* Syntax highlighting */ - -/* .syntax { background: #f0f0f0; } */ -.syntax .c { color: #60a0b0; font-style: italic } /* Comment */ -.syntax .err { border: 1px solid #FF0000 } /* Error */ -.syntax .k { color: #007020; font-weight: bold } /* Keyword */ -.syntax .o { color: #666666 } /* Operator */ -.syntax .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */ -.syntax .cp { color: #007020 } /* Comment.Preproc */ -.syntax .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */ -.syntax .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */ -.syntax .gd { color: #A00000 } /* Generic.Deleted */ -.syntax .ge { font-style: italic } /* Generic.Emph */ -.syntax .gr { color: #FF0000 } /* Generic.Error */ -.syntax .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.syntax .gi { color: #00A000 } /* Generic.Inserted */ -.syntax .go { color: #404040 } /* Generic.Output */ -.syntax .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ -.syntax .gs { font-weight: bold } /* Generic.Strong */ -.syntax .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.syntax .gt { color: #0040D0 } /* Generic.Traceback */ -.syntax .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ -.syntax .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ -.syntax .kp { color: #007020 } /* Keyword.Pseudo */ -.syntax .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ -.syntax .kt { color: #902000 } /* Keyword.Type */ -.syntax .m { color: #40a070 } /* Literal.Number */ -.syntax .s { color: #4070a0 } /* Literal.String */ -.syntax .na { color: #4070a0 } /* Name.Attribute */ -.syntax .nb { color: #007020 } /* Name.Builtin */ -.syntax .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ -.syntax .no { color: #60add5 } /* Name.Constant */ -.syntax .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.syntax .ni { color: #d55537; font-weight: bold } /* Name.Entity */ -.syntax .ne { color: #007020 } /* Name.Exception */ -.syntax .nf { color: #06287e } /* Name.Function */ -.syntax .nl { color: #002070; font-weight: bold } /* Name.Label */ -.syntax .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.syntax .nt { color: #062873; font-weight: bold } /* Name.Tag */ -.syntax .nv { color: #bb60d5 } /* Name.Variable */ -.syntax .ow { color: #007020; font-weight: bold } /* Operator.Word */ -.syntax .w { color: #bbbbbb } /* Text.Whitespace */ -.syntax .mf { color: #40a070 } /* Literal.Number.Float */ -.syntax .mh { color: #40a070 } /* Literal.Number.Hex */ -.syntax .mi { color: #40a070 } /* Literal.Number.Integer */ -.syntax .mo { color: #40a070 } /* Literal.Number.Oct */ -.syntax .sb { color: #4070a0 } /* Literal.String.Backtick */ -.syntax .sc { color: #4070a0 } /* Literal.String.Char */ -.syntax .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ -.syntax .s2 { color: #4070a0 } /* Literal.String.Double */ -.syntax .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ -.syntax .sh { color: #4070a0 } /* Literal.String.Heredoc */ -.syntax .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ -.syntax .sx { color: #c65d09 } /* Literal.String.Other */ -.syntax .sr { color: #235388 } /* Literal.String.Regex */ -.syntax .s1 { color: #4070a0 } /* Literal.String.Single */ -.syntax .ss { color: #517918 } /* Literal.String.Symbol */ -.syntax .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.syntax .vc { color: #bb60d5 } /* Name.Variable.Class */ -.syntax .vg { color: #bb60d5 } /* Name.Variable.Global */ -.syntax .vi { color: #bb60d5 } /* Name.Variable.Instance */ -.syntax .il { color: #40a070 } /* Literal.Number.Integer.Long */ diff --git a/Doc/s5/ui/default/print.css b/Doc/s5/ui/default/print.css deleted file mode 100644 index 4a3554d..0000000 --- a/Doc/s5/ui/default/print.css +++ /dev/null @@ -1,24 +0,0 @@ -/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ -.slide, ul {page-break-inside: avoid; visibility: visible !important;} -h1 {page-break-after: avoid;} - -body {font-size: 12pt; background: white;} -* {color: black;} - -#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} -#slide0 h3 {margin: 0; padding: 0;} -#slide0 h4 {margin: 0 0 0.5em; padding: 0;} -#slide0 {margin-bottom: 3em;} - -h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} -.extra {background: transparent !important;} -div.extra, pre.extra, .example {font-size: 10pt; color: #333;} -ul.extra a {font-weight: bold;} -p.example {display: none;} - -#header {display: none;} -#footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} -#footer h2, #controls {display: none;} - -/* The following rule keeps the layout stuff out of print. Remove at your own risk! */ -.layout, .layout * {display: none !important;} diff --git a/Doc/s5/ui/default/s5-core.css b/Doc/s5/ui/default/s5-core.css deleted file mode 100644 index 304c07f..0000000 --- a/Doc/s5/ui/default/s5-core.css +++ /dev/null @@ -1,9 +0,0 @@ -/* Do not edit or override these styles! The system will likely break if you do. */ - -div#header, div#footer, div#controls, .slide {position: absolute;} -html>body div#header, html>body div#footer, - html>body div#controls, html>body .slide {position: fixed;} -.handout {display: none;} -.layout {display: block;} -.slide, .hideme, .incremental {visibility: hidden;} -#slide0 {visibility: visible;} diff --git a/Doc/s5/ui/default/slides.css b/Doc/s5/ui/default/slides.css deleted file mode 100644 index 0786d7d..0000000 --- a/Doc/s5/ui/default/slides.css +++ /dev/null @@ -1,3 +0,0 @@ -@import url(s5-core.css); /* required to make the slide show run at all */ -@import url(framing.css); /* sets basic placement and size of slide components */ -@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file diff --git a/Doc/s5/ui/default/slides.js b/Doc/s5/ui/default/slides.js deleted file mode 100644 index 4522035..0000000 --- a/Doc/s5/ui/default/slides.js +++ /dev/null @@ -1,552 +0,0 @@ -// S5 v1.1 slides.js -- released into the Public Domain -// -// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information -// about all the wonderful and talented contributors to this code! - -var undef; -var slideCSS = ''; -var snum = 0; -var smax = 1; -var incpos = 0; -var number = undef; -var s5mode = true; -var defaultView = 'slideshow'; -var controlVis = 'visible'; - -var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0; -var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; -var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; - -function hasClass(object, className) { - if (!object.className) return false; - return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); -} - -function hasValue(object, value) { - if (!object) return false; - return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); -} - -function removeClass(object,className) { - if (!object) return; - object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); -} - -function addClass(object,className) { - if (!object || hasClass(object, className)) return; - if (object.className) { - object.className += ' '+className; - } else { - object.className = className; - } -} - -function GetElementsWithClassName(elementName,className) { - var allElements = document.getElementsByTagName(elementName); - var elemColl = new Array(); - for (var i = 0; i< allElements.length; i++) { - if (hasClass(allElements[i], className)) { - elemColl[elemColl.length] = allElements[i]; - } - } - return elemColl; -} - -function isParentOrSelf(element, id) { - if (element == null || element.nodeName=='BODY') return false; - else if (element.id == id) return true; - else return isParentOrSelf(element.parentNode, id); -} - -function nodeValue(node) { - var result = ""; - if (node.nodeType == 1) { - var children = node.childNodes; - for (var i = 0; i < children.length; ++i) { - result += nodeValue(children[i]); - } - } - else if (node.nodeType == 3) { - result = node.nodeValue; - } - return(result); -} - -function slideLabel() { - var slideColl = GetElementsWithClassName('*','slide'); - var list = document.getElementById('jumplist'); - smax = slideColl.length; - for (var n = 0; n < smax; n++) { - var obj = slideColl[n]; - - var did = 'slide' + n.toString(); - obj.setAttribute('id',did); - if (isOp) continue; - - var otext = ''; - var menu = obj.firstChild; - if (!menu) continue; // to cope with empty slides - while (menu && menu.nodeType == 3) { - menu = menu.nextSibling; - } - if (!menu) continue; // to cope with slides with only text nodes - - var menunodes = menu.childNodes; - for (var o = 0; o < menunodes.length; o++) { - otext += nodeValue(menunodes[o]); - } - list.options[list.length] = new Option(n + ' : ' + otext, n); - } -} - -function currentSlide() { - var cs; - if (document.getElementById) { - cs = document.getElementById('currentSlide'); - } else { - cs = document.currentSlide; - } - cs.innerHTML = '' + snum + '<\/span> ' + - '\/<\/span> ' + - '' + (smax-1) + '<\/span>'; - if (snum == 0) { - cs.style.visibility = 'hidden'; - } else { - cs.style.visibility = 'visible'; - } -} - -function go(step) { - if (document.getElementById('slideProj').disabled || step == 0) return; - var jl = document.getElementById('jumplist'); - var cid = 'slide' + snum; - var ce = document.getElementById(cid); - if (incrementals[snum].length > 0) { - for (var i = 0; i < incrementals[snum].length; i++) { - removeClass(incrementals[snum][i], 'current'); - removeClass(incrementals[snum][i], 'incremental'); - } - } - if (step != 'j') { - snum += step; - lmax = smax - 1; - if (snum > lmax) snum = lmax; - if (snum < 0) snum = 0; - } else - snum = parseInt(jl.value); - var nid = 'slide' + snum; - var ne = document.getElementById(nid); - if (!ne) { - ne = document.getElementById('slide0'); - snum = 0; - } - if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} - if (incrementals[snum].length > 0 && incpos == 0) { - for (var i = 0; i < incrementals[snum].length; i++) { - if (hasClass(incrementals[snum][i], 'current')) - incpos = i + 1; - else - addClass(incrementals[snum][i], 'incremental'); - } - } - if (incrementals[snum].length > 0 && incpos > 0) - addClass(incrementals[snum][incpos - 1], 'current'); - ce.style.visibility = 'hidden'; - ne.style.visibility = 'visible'; - jl.selectedIndex = snum; - currentSlide(); - number = 0; -} - -function goTo(target) { - if (target >= smax || target == snum) return; - go(target - snum); -} - -function subgo(step) { - if (step > 0) { - removeClass(incrementals[snum][incpos - 1],'current'); - removeClass(incrementals[snum][incpos], 'incremental'); - addClass(incrementals[snum][incpos],'current'); - incpos++; - } else { - incpos--; - removeClass(incrementals[snum][incpos],'current'); - addClass(incrementals[snum][incpos], 'incremental'); - addClass(incrementals[snum][incpos - 1],'current'); - } -} - -function toggle() { - var slideColl = GetElementsWithClassName('*','slide'); - var slides = document.getElementById('slideProj'); - var outline = document.getElementById('outlineStyle'); - if (!slides.disabled) { - slides.disabled = true; - outline.disabled = false; - s5mode = false; - fontSize('1em'); - for (var n = 0; n < smax; n++) { - var slide = slideColl[n]; - slide.style.visibility = 'visible'; - } - } else { - slides.disabled = false; - outline.disabled = true; - s5mode = true; - fontScale(); - for (var n = 0; n < smax; n++) { - var slide = slideColl[n]; - slide.style.visibility = 'hidden'; - } - slideColl[snum].style.visibility = 'visible'; - } -} - -function showHide(action) { - var obj = GetElementsWithClassName('*','hideme')[0]; - switch (action) { - case 's': obj.style.visibility = 'visible'; break; - case 'h': obj.style.visibility = 'hidden'; break; - case 'k': - if (obj.style.visibility != 'visible') { - obj.style.visibility = 'visible'; - } else { - obj.style.visibility = 'hidden'; - } - break; - } -} - -// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) -function keys(key) { - if (!key) { - key = event; - key.which = key.keyCode; - } - if (key.which == 84) { - toggle(); - return; - } - if (s5mode) { - switch (key.which) { - case 10: // return - case 13: // enter - if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; - if (key.target && isParentOrSelf(key.target, 'controls')) return; - if(number != undef) { - goTo(number); - break; - } - case 32: // spacebar - case 34: // page down - case 39: // rightkey - case 40: // downkey - if(number != undef) { - go(number); - } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { - go(1); - } else { - subgo(1); - } - break; - case 33: // page up - case 37: // leftkey - case 38: // upkey - if(number != undef) { - go(-1 * number); - } else if (!incrementals[snum] || incpos <= 0) { - go(-1); - } else { - subgo(-1); - } - break; - case 36: // home - goTo(0); - break; - case 35: // end - goTo(smax-1); - break; - case 67: // c - showHide('k'); - break; - } - if (key.which < 48 || key.which > 57) { - number = undef; - } else { - if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; - if (key.target && isParentOrSelf(key.target, 'controls')) return; - number = (((number != undef) ? number : 0) * 10) + (key.which - 48); - } - } - return false; -} - -function clicker(e) { - number = undef; - var target; - if (window.event) { - target = window.event.srcElement; - e = window.event; - } else target = e.target; - if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true; - if (!e.which || e.which == 1) { - if (!incrementals[snum] || incpos >= incrementals[snum].length) { - go(1); - } else { - subgo(1); - } - } -} - -function findSlide(hash) { - var target = null; - var slides = GetElementsWithClassName('*','slide'); - for (var i = 0; i < slides.length; i++) { - var targetSlide = slides[i]; - if ( (targetSlide.name && targetSlide.name == hash) - || (targetSlide.id && targetSlide.id == hash) ) { - target = targetSlide; - break; - } - } - while(target != null && target.nodeName != 'BODY') { - if (hasClass(target, 'slide')) { - return parseInt(target.id.slice(5)); - } - target = target.parentNode; - } - return null; -} - -function slideJump() { - if (window.location.hash == null) return; - var sregex = /^#slide(\d+)$/; - var matches = sregex.exec(window.location.hash); - var dest = null; - if (matches != null) { - dest = parseInt(matches[1]); - } else { - dest = findSlide(window.location.hash.slice(1)); - } - if (dest != null) - go(dest - snum); -} - -function fixLinks() { - var thisUri = window.location.href; - thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); - var aelements = document.getElementsByTagName('A'); - for (var i = 0; i < aelements.length; i++) { - var a = aelements[i].href; - var slideID = a.match('\#slide[0-9]{1,2}'); - if ((slideID) && (slideID[0].slice(0,1) == '#')) { - var dest = findSlide(slideID[0].slice(1)); - if (dest != null) { - if (aelements[i].addEventListener) { - aelements[i].addEventListener("click", new Function("e", - "if (document.getElementById('slideProj').disabled) return;" + - "go("+dest+" - snum); " + - "if (e.preventDefault) e.preventDefault();"), true); - } else if (aelements[i].attachEvent) { - aelements[i].attachEvent("onclick", new Function("", - "if (document.getElementById('slideProj').disabled) return;" + - "go("+dest+" - snum); " + - "event.returnValue = false;")); - } - } - } - } -} - -function externalLinks() { - if (!document.getElementsByTagName) return; - var anchors = document.getElementsByTagName('a'); - for (var i=0; i' + - '