diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..9c5a967f5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,304 @@ +name: CI + +on: + push: + branches: master + paths-ignore: + - 'CHANGES*' + - 'Doc/**' + pull_request: + branches: master + paths-ignore: + - 'CHANGES*' + - 'Doc/**' + +jobs: + build: + + runs-on: ${{ matrix.os || 'ubuntu-20.04' }} + + # By default, the name of the build is just the language used, but matrix + # entries can define the additional "desc" field with any additional + # information to include in the name. + name: ${{ matrix.SWIGLANG || 'none' }}${{ matrix.PY3 }} ${{ matrix.ENGINE}} ${{ matrix.VER }} ${{ matrix.desc }} + + strategy: + matrix: + include: + - SWIGLANG: "" + desc: gcc + - SWIGLANG: "" + GCC: 7 + desc: gcc7 + - SWIGLANG: "" + GCC: 8 + desc: gcc8 + - SWIGLANG: "" + GCC: 9 + desc: gcc9 + - SWIGLANG: "" + GCC: 10 + desc: gcc10 + - SWIGLANG: "" + compiler: clang + desc: clang + - SWIGLANG: csharp + # D support can't be enabled because dmd 2.066 fails to build anything + # under Ubuntu 18.04 due to its standard library (libphobos2.a) not + # being compiled with -FPIC, but system gcc using -fpie by default, + # resulting in linking errors for any output. And later versions, such + # as 2.086.1, are not supported and result in errors in SWIG test suite. + # + # - SWIGLANG: d + # VER: '2.066.0' + # os: ubuntu-18.04 # This dlang version doesn't work under 20.04. + - SWIGLANG: go + VER: '1.3' + - SWIGLANG: go + VER: '1.6' + - SWIGLANG: go + VER: '1.8' + - SWIGLANG: go + VER: '1.12' + CSTD: gnu99 + - SWIGLANG: go + VER: '1.16' + CSTD: gnu99 + - SWIGLANG: guile + - SWIGLANG: java + - SWIGLANG: javascript + ENGINE: node + VER: '12' + CPP11: 1 + - SWIGLANG: javascript + ENGINE: node + VER: '14' + CPP11: 1 + - SWIGLANG: javascript + ENGINE: node + VER: '16' + CPP14: 1 + - SWIGLANG: javascript + ENGINE: jsc + os: ubuntu-18.04 # libwebkitgtk-dev dependency not available in 20.04. + - SWIGLANG: javascript + ENGINE: v8 + os: ubuntu-18.04 # libv8-dev only actually provides v8 in 18.04. + - SWIGLANG: lua + - SWIGLANG: lua + VER: '5.3' + - SWIGLANG: octave + CPP11: 1 + - SWIGLANG: perl5 + - SWIGLANG: php + VER: '7.4' + - SWIGLANG: php + VER: '8.0' + - SWIGLANG: python + - SWIGLANG: python + PY3: 3 + VER: '3.2' + os: ubuntu-18.04 # Python < 3.5 not available for 20.04. + - SWIGLANG: python + PY3: 3 + VER: '3.3' + os: ubuntu-18.04 # Python < 3.5 not available for 20.04. + - SWIGLANG: python + PY3: 3 + VER: '3.4' + os: ubuntu-18.04 # Python < 3.5 not available for 20.04. + - SWIGLANG: python + PY3: 3 + VER: '3.5' + - SWIGLANG: python + PY3: 3 + VER: '3.6' + - SWIGLANG: python + PY3: 3 + VER: '3.7' + - SWIGLANG: python + PY3: 3 + VER: '3.8' + - SWIGLANG: python + PY3: 3 + VER: '3.9' + - SWIGLANG: python + SWIG_FEATURES: -builtin + desc: builtin + - SWIGLANG: python + SWIG_FEATURES: -builtin -O + desc: builtin optimized + - SWIGLANG: python + PY3: 3 + SWIG_FEATURES: -builtin + desc: builtin + - SWIGLANG: python + PY3: 3 + SWIG_FEATURES: -builtin -O + desc: builtin optimized + - SWIGLANG: r + - SWIGLANG: ruby + VER: '1.9' + os: ubuntu-18.04 + - SWIGLANG: ruby + VER: '2.0' + os: ubuntu-18.04 + - SWIGLANG: ruby + VER: '2.1' + os: ubuntu-18.04 + - SWIGLANG: ruby + VER: '2.2' + os: ubuntu-18.04 + - SWIGLANG: ruby + VER: '2.3' + os: ubuntu-18.04 + - SWIGLANG: ruby + VER: '2.4' + - SWIGLANG: ruby + VER: '2.5' + - SWIGLANG: ruby + VER: '2.6' + - SWIGLANG: ruby + VER: '2.7' + - SWIGLANG: ruby + VER: '3.0' + CSTD: c99 + CPP11: 1 + - SWIGLANG: tcl + # let's run all of them, as opposed to aborting when one fails + fail-fast: false + + env: + SWIGLANG: ${{ matrix.SWIGLANG }} + PY3: ${{ matrix.PY3 }} + VER: ${{ matrix.VER }} + ENGINE: ${{ matrix.ENGINE }} + SWIG_FEATURES: ${{ matrix.SWIG_FEATURES }} + CSTD: ${{ matrix.CSTD }} + CPP11: ${{ matrix.CPP11 }} + CPP14: ${{ matrix.CPP14 }} + CPP17: ${{ matrix.CPP17 }} + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Install CCache + uses: hendrikmuhs/ccache-action@v1 + with: + key: ${{ matrix.os || 'ubuntu-20.04' }}-${{ matrix.compiler || 'gcc' }}${{ matrix.GCC }} + + - name: Configure + run: | + set -x + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + echo PATH="$PATH" >> $GITHUB_ENV + + source Tools/GHA-linux-install.sh + + if test '${{ matrix.compiler }}' = 'clang'; then + CC="clang" + CXX="clang++" + + CFLAGS="$CFLAGS -fPIE" + CXXFLAGS="$CXXFLAGS -fPIE" + elif test -n "$GCC"; then + CC="gcc-$GCC" + CXX="g++-$GCC" + else + CC="gcc" + CXX="g++" + fi + + export CC CXX + + echo CC="$CC" >> $GITHUB_ENV + echo CXX="$CXX" >> $GITHUB_ENV + + echo "Compiler used:" + ls -la $(which $CC) $(which $CXX) + $CC --version + $CXX --version + + if test -n '${{ matrix.CONFIGOPTS }}'; then + CONFIGOPTS=${{ matrix.CONFIGOPTS }} + fi + if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++11 $CXXFLAGS" "CFLAGS=-std=c11 $CFLAGS") && export CSTD=c11 && export CPPSTD=c++11; fi + if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++14 $CXXFLAGS" "CFLAGS=-std=c11 $CFLAGS") && export CSTD=c11 && export CPPSTD=c++14; fi + if test -n "$CPP17"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++17 $CXXFLAGS" "CFLAGS=-std=c17 $CFLAGS") && export CSTD=c17 && export CPPSTD=c++17; fi + if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi + echo "${CONFIGOPTS[@]}" + ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}" + + case $(uname) in + Linux) + cpu_count=$(nproc) + ;; + + Darwin) + cpu_count=$(sysctl -n hw.ncpu) + ;; + + *) + cpu_count=1 + ;; + esac + if [[ $cpu_count != 1 ]]; then + echo SWIGJOBS=-j$cpu_count >> $GITHUB_ENV + fi + + - name: Build + working-directory: build/build + run: | + set -x + make $SWIGJOBS + ./swig -version && ./swig -pcreversion + if test -z "$SWIGLANG"; then make $SWIGJOBS check-ccache; fi + if test -z "$SWIGLANG"; then make $SWIGJOBS check-errors-test-suite; fi + echo 'Installing...' + if test -z "$SWIGLANG"; then sudo make install && swig -version && ccache-swig -V; fi + + - name: Test + working-directory: build/build + run: | + case "$SWIGLANG" in + javascript) + case "$ENGINE" in + node) + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" + nvm use ${VER} + ;; + *) + # Running tests using v8 or jsc involves creating a custom + # interpreter in Tools/javascript, which is currently broken + # for parallel builds (we attempt to update this interpreter + # while running, resulting in "Text file busy" error). + unset SWIGJOBS + esac + ;; + + ruby) + source $HOME/.rvm/scripts/rvm + ;; + esac + + set -x + if test -n "$CPP11"; then export CPPSTD=c++11; fi + if test -n "$CPP14"; then export CPPSTD=c++14; fi + if test -n "$CPP17"; then export CPPSTD=c++17; fi + # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic. + if test -n "$SWIGLANG"; then cflags=$($GITHUB_WORKSPACE/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi + if test -n "$SWIGLANG"; then cxxflags=$($GITHUB_WORKSPACE/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi + if test -n "$SWIGLANG"; then make check-$SWIGLANG-version; fi + if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi + if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi + if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi + + - name: Clean + working-directory: build/build + run: | + set -x + make check-maintainer-clean && ../../configure $CONFIGOPTS diff --git a/.gitignore b/.gitignore index 1f1561475..b51da0fdf 100644 --- a/.gitignore +++ b/.gitignore @@ -150,6 +150,8 @@ Examples/guile/*/my-guile # Java Examples/test-suite/java/*/ +Examples/test-suite/java/expected.txt +Examples/test-suite/java/got.txt Examples/java/*/*.java !Examples/java/*/runme.java Examples/java/doxygen/javadocs @@ -173,6 +175,8 @@ Examples/ocaml/**/swigp4.ml # Octave swigexample*.oct Examples/test-suite/octave/*.oct +Examples/test-suite/octave/octheaders.hpp +Examples/test-suite/octave/octheaders.hpp.gch # Perl5 Examples/test-suite/perl5/*.pm @@ -180,11 +184,8 @@ Examples/perl5/*/*.pm # PHP Examples/test-suite/php/php_*.h -Examples/test-suite/php/*.php -!Examples/test-suite/php/*runme.php -!Examples/test-suite/php/skel.php Examples/php/*/php_*.h -Examples/php/*/example.php +Examples/php/pragmas/example.php # Python # Based on https://github.com/github/gitignore/blob/master/Python.gitignore diff --git a/.travis.yml b/.travis.yml index c9cbd7862..c11479fed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,476 +4,464 @@ matrix: - compiler: clang os: linux env: SWIGLANG= - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG= - sudo: required + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG= BUILDSYSTEM=cmake dist: xenial - os: linux env: SWIGLANG= GCC=4.4 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.6 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.7 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.8 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.9 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=6 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=7 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=8 - sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=9 - sudo: required dist: xenial + - os: linux + env: SWIGLANG= GCC=10 + dist: focal - compiler: gcc os: linux env: SWIGLANG=csharp - sudo: required dist: xenial - compiler: gcc os: linux - env: SWIGLANG=d - sudo: required + env: SWIGLANG=d VER=2.066.0 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=d VER=2.086.1 dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.3 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.8 - sudo: required dist: xenial - compiler: gcc os: linux - env: SWIGLANG=go VER=1.12 - sudo: required + env: SWIGLANG=go VER=1.12 CSTD=gnu99 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=go VER=1.16 CSTD=gnu99 dist: xenial - compiler: gcc os: linux env: SWIGLANG=guile - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=java - sudo: required - dist: xenial - - compiler: gcc - os: linux - env: SWIGLANG=javascript ENGINE=node VER=0.10 - sudo: required - dist: xenial - - compiler: gcc - os: linux - env: SWIGLANG=javascript ENGINE=node VER=4 CPP11=1 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=6 CPP11=1 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=8 CPP11=1 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=10 CPP11=1 - sudo: required + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=javascript ENGINE=node VER=12 CPP11=1 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=javascript ENGINE=node VER=14 CPP11=1 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=javascript ENGINE=node VER=16 CPP14=1 dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=jsc - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=v8 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=lua - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=lua VER=5.3 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=mzscheme - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ocaml - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 - sudo: required - dist: xenial + dist: xenial # Octave v4.0.0 + - compiler: gcc + os: linux + env: SWIGLANG=octave SWIGJOBS=-j2 CPP11=1 + dist: bionic # Octave v4.2.2 - compiler: gcc os: linux env: SWIGLANG=perl5 - sudo: required dist: xenial - compiler: gcc os: linux - env: SWIGLANG=php VER=7.0 - sudo: required + env: SWIGLANG=php VER=7.4 dist: xenial - compiler: gcc os: linux - env: SWIGLANG=php VER=7.1 - sudo: required + env: SWIGLANG=php VER=8.0 dist: xenial - compiler: gcc os: linux - env: SWIGLANG=php VER=7.2 - sudo: required - dist: xenial + env: SWIGLANG=php VER=7.0 CONFIGOPTS=--enable-cpp11-testing CPPSTD=c++11 + dist: bionic - compiler: gcc os: linux - env: SWIGLANG=php VER=7.3 - sudo: required - dist: xenial + env: SWIGLANG=php VER=7.1 CONFIGOPTS=--enable-cpp11-testing CPPSTD=c++11 + dist: bionic + - compiler: gcc + os: linux + env: SWIGLANG=php VER=7.2 CONFIGOPTS=--enable-cpp11-testing CPPSTD=c++11 + dist: bionic + - compiler: gcc + os: linux + env: SWIGLANG=php VER=7.3 CONFIGOPTS=--enable-cpp11-testing CPPSTD=c++11 + dist: bionic + - compiler: gcc + os: linux + env: SWIGLANG=php VER=7.4 CONFIGOPTS=--enable-cpp11-testing CPPSTD=c++11 + dist: bionic + - compiler: gcc + os: linux + env: SWIGLANG=php VER=8.0 CONFIGOPTS=--enable-cpp11-testing CPPSTD=c++11 + dist: bionic - compiler: gcc os: linux env: SWIGLANG=python # 2.7 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.2 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.3 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.4 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.5 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.6 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.7 - sudo: required + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=python PY3=3 VER=3.8 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=python PY3=3 VER=3.9 dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES="-builtin -O" - sudo: required dist: xenial - os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin GCC=6 CPP11=1 - sudo: required dist: xenial - os: linux - env: SWIGLANG=python SWIG_FEATURES=-builtin GCC=6 CPP11=1 PY3=3 VER=3.7 - sudo: required + env: SWIGLANG=python SWIG_FEATURES=-builtin GCC=6 CPP11=1 PY3=3 VER=3.9 dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.4 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.7 - sudo: required dist: xenial - compiler: gcc os: linux - env: SWIGLANG=python SWIG_FEATURES="-builtin -O" PY3=3 VER=3.7 - sudo: required + env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.8 dist: xenial - compiler: gcc os: linux - env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.7 SWIGOPTPY3= - sudo: required + env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.9 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES="-builtin -O" PY3=3 VER=3.9 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.9 SWIGOPTPY3= dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-O - sudo: required dist: xenial - compiler: gcc os: linux - env: SWIGLANG=python SWIG_FEATURES=-O PY3=3 VER=3.7 - sudo: required + env: SWIGLANG=python SWIG_FEATURES=-O PY3=3 VER=3.9 dist: xenial - compiler: gcc os: linux env: SWIGLANG=r - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=1.9 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.0 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.1 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.2 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.3 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.4 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.5 - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.6 - sudo: required + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=ruby VER=2.7 + dist: xenial + - compiler: gcc + os: linux + env: SWIGLANG=ruby VER=3.0 CSTD=c99 dist: xenial - compiler: gcc os: linux env: SWIGLANG=scilab - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=tcl - sudo: required dist: xenial - os: linux env: SWIGLANG=csharp CPP11=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=go VER=1.6 CPP11=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=java CPP11=1 - sudo: required dist: xenial - - compiler: gcc - os: linux - env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.4 CPP11=1 - sudo: required - dist: trusty - os: linux env: SWIGLANG=python CPP11=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=r CPP11=1 # Note: making 'R CMD SHLIB' use a different compiler is non-trivial - sudo: required dist: xenial - os: linux env: SWIGLANG=ruby CPP11=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=tcl CPP11=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=6 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=go VER=1.6 GCC=6 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=6 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=6 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=ruby GCC=6 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=tcl GCC=6 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=7 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=7 CPP14=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=8 CPP17=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=8 CPP17=1 - sudo: required dist: xenial - os: linux - env: SWIGLANG=python GCC=8 CPP17=1 PY3=3 VER=3.7 - sudo: required + env: SWIGLANG=python GCC=8 CPP17=1 PY3=3 VER=3.9 dist: xenial - os: linux env: SWIGLANG=csharp GCC=9 CPP17=1 - sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=9 CPP17=1 - sudo: required dist: xenial - os: linux - env: SWIGLANG=python GCC=9 CPP17=1 PY3=3 VER=3.7 - sudo: required + env: SWIGLANG=python GCC=9 CPP17=1 PY3=3 VER=3.9 + dist: xenial + - os: linux + arch: s390x + env: SWIGLANG=ruby CPP11=1 dist: xenial - compiler: gcc os: osx + osx_image: xcode12.2 env: SWIGLANG= - compiler: clang os: osx + osx_image: xcode12.2 + env: SWIGLANG= BUILDSYSTEM=cmake + - compiler: clang + os: osx + osx_image: xcode12.2 env: SWIGLANG= - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=csharp - compiler: clang os: osx - env: SWIGLANG=go + osx_image: xcode12.2 + env: SWIGLANG=go CSTD=gnu99 - compiler: clang os: osx - env: SWIGLANG=guile + osx_image: xcode12.2 + env: SWIGLANG=guile CSTD=c11 - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=java - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=lua +# octave-6.1 not working +# - compiler: clang +# os: osx +# osx_image: xcode12.2 +# env: SWIGLANG=octave SWIGJOBS=-j2 CPP11=1 - compiler: clang os: osx - env: SWIGLANG=octave SWIGJOBS=-j2 - - compiler: clang - os: osx + osx_image: xcode12.2 env: SWIGLANG=perl5 - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=python - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=python PY3=3 - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=ruby - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=tcl - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=java CPP17=1 - osx_image: xcode10.2 - compiler: clang os: osx + osx_image: xcode12.2 env: SWIGLANG=python PY3=3 CPP17=1 - osx_image: xcode10.2 allow_failures: - # seg fault in director_basic testcase + # Newer version of D not yet working/supported - compiler: gcc os: linux - env: SWIGLANG=php VER=7.2 - sudo: required + env: SWIGLANG=d VER=2.086.1 dist: xenial - # Sometimes hits the Travis 50 minute time limit - - compiler: clang - os: osx - env: SWIGLANG=octave SWIGJOBS=-j2 # Experimental languages - compiler: gcc os: linux env: SWIGLANG=mzscheme - sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ocaml - sudo: required dist: xenial before_install: - date -u - uname -a - - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu && cat /proc/cpuinfo | grep "model name" && cat /proc/meminfo | grep MemTotal; fi + - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu; grep "model name" /proc/cpuinfo || echo 'Unknown CPU model'; grep "MemTotal" /proc/meminfo || echo 'Unknown system memory amount'; fi - if test "$TRAVIS_OS_NAME" = "osx"; then sysctl -a | grep brand_string; fi # Travis overrides CC environment with compiler predefined values - if test -n "$GCC"; then export CC="gcc-$GCC" && export CXX="g++-$GCC"; fi @@ -482,10 +470,11 @@ install: - if test "$TRAVIS_OS_NAME" = "osx"; then source Tools/travis-osx-install.sh; fi - ls -la $(which $CC) $(which $CXX) && $CC --version && $CXX --version script: + - if test "$BUILDSYSTEM" = "cmake"; then cmake --version && mkdir -p build/build && cd build/build && CXXFLAGS="-Wall -Wextra -Werror" CFLAGS="-Wall -Wextra -Werror" cmake -DCMAKE_INSTALL_PREFIX=~/.local ../.. && make install && ctest --output-on-failure -V && exit 0; fi - echo 'Configuring...' && echo -en 'travis_fold:start:script.1\\r' - - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++11 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++11; fi - - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++14 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++14; fi - - if test -n "$CPP17"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++17 -Wall -Wextra" "CFLAGS=-std=c17 -Wall -Wextra") && export CSTD=c17 && export CPPSTD=c++17; fi + - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++11 $CXXFLAGS" "CFLAGS=-std=c11 $CFLAGS") && export CSTD=c11 && export CPPSTD=c++11; fi + - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++14 $CXXFLAGS" "CFLAGS=-std=c11 $CFLAGS") && export CSTD=c11 && export CPPSTD=c++14; fi + - if test -n "$CPP17"; then CONFIGOPTS+=(--enable-cpp11-testing "CXXFLAGS=-std=c++17 $CXXFLAGS" "CFLAGS=-std=c17 $CFLAGS") && export CSTD=c17 && export CPPSTD=c++17; fi - if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi - echo "${CONFIGOPTS[@]}" - ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}" @@ -505,5 +494,6 @@ script: - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - echo 'Cleaning...' && echo -en 'travis_fold:start:script.3\\r' - - make check-maintainer-clean && ../../configure $CONFIGOPTS + # Skip on osx as often fails with: rm: Resource temporarily unavailable + - if test "$TRAVIS_OS_NAME" != "osx"; then make check-maintainer-clean && ../../configure $CONFIGOPTS; fi - echo -en 'travis_fold:end:script.3\\r' diff --git a/ANNOUNCE b/ANNOUNCE index b83921cc4..e50bcd463 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,8 +1,8 @@ -*** ANNOUNCE: SWIG 4.0.1 (in progress) *** +*** ANNOUNCE: SWIG 4.1.0 (in progress) *** http://www.swig.org -We're pleased to announce SWIG-4.0.1, the latest SWIG release. +We're pleased to announce SWIG-4.1.0, the latest SWIG release. What is SWIG? ============= @@ -25,11 +25,11 @@ Availability ============ The release is available for download on Sourceforge at - http://prdownloads.sourceforge.net/swig/swig-4.0.1.tar.gz + http://prdownloads.sourceforge.net/swig/swig-4.1.0.tar.gz A Windows version is also available at - http://prdownloads.sourceforge.net/swig/swigwin-4.0.1.zip + http://prdownloads.sourceforge.net/swig/swigwin-4.1.0.zip Please report problems with this release to the swig-devel mailing list, details at http://www.swig.org/mail.html. diff --git a/CCache/configure.ac b/CCache/configure.ac index e1c761860..2db3553ce 100644 --- a/CCache/configure.ac +++ b/CCache/configure.ac @@ -1,12 +1,12 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT([ccache-swig], [0.0]) # Get version from SWIG in ccache_swig_config.h.in -AC_PREREQ(2.52) +AC_INIT([ccache-swig],[0.0]) # Get version from SWIG in ccache_swig_config.h.in +AC_PREREQ([2.60]) AC_CONFIG_SRCDIR([ccache.h]) AC_MSG_NOTICE([Configuring ccache]) -AC_CONFIG_HEADER(config.h) +AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([config_win32.h]) dnl Checks for programs. @@ -41,7 +41,7 @@ else fi AC_HEADER_DIRENT -AC_HEADER_TIME + AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(ctype.h strings.h stdlib.h string.h pwd.h sys/time.h) @@ -51,19 +51,16 @@ AC_CHECK_FUNCS(gethostname getpwuid) AC_CHECK_FUNCS(utimes) AC_CACHE_CHECK([for compar_fn_t in stdlib.h],ccache_cv_COMPAR_FN_T, [ - AC_TRY_COMPILE( -[#include ], -[ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ void test_fn(void) { qsort(NULL, 0, 0, (__compar_fn_t)NULL); } -], - ccache_cv_COMPAR_FN_T=yes,ccache_cv_COMPAR_FN_T=no)]) +]])],[ccache_cv_COMPAR_FN_T=yes],[ccache_cv_COMPAR_FN_T=no])]) if test x"$ccache_cv_COMPAR_FN_T" = x"yes"; then AC_DEFINE(HAVE_COMPAR_FN_T, 1, [ ]) fi dnl Note: This could be replaced by AC_FUNC_SNPRINTF() in the autoconf macro archive AC_CACHE_CHECK([for C99 vsnprintf],ccache_cv_HAVE_C99_VSNPRINTF,[ -AC_TRY_RUN([ +AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include void foo(const char *format, ...) { @@ -81,8 +78,7 @@ void foo(const char *format, ...) { exit(0); } main() { foo("hello"); } -], -ccache_cv_HAVE_C99_VSNPRINTF=yes,ccache_cv_HAVE_C99_VSNPRINTF=no,ccache_cv_HAVE_C99_VSNPRINTF=cross)]) +]])],[ccache_cv_HAVE_C99_VSNPRINTF=yes],[ccache_cv_HAVE_C99_VSNPRINTF=no],[ccache_cv_HAVE_C99_VSNPRINTF=cross])]) if test x"$ccache_cv_HAVE_C99_VSNPRINTF" = x"yes"; then AC_DEFINE(HAVE_C99_VSNPRINTF, 1, [ ]) fi diff --git a/CHANGES b/CHANGES index 7fd6b6da2..05834910a 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,290 @@ See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ +Version 4.0.2 (8 Jun 2020) +========================== + +2020-06-07 vigsterkr + [Ruby] #1717 Nil fix mangling strings + +2020-06-07 vadz + #1748 Fix doxygen comments quoting issue + +2020-06-07 munoah + #1800 Escape spaces in file paths for dependencies (-M -MM etc) + +2020-06-06 andreas-schwab + [Ruby] #1801 Fix encoding on big endian systems when wrapping std::wstring. + +2020-05-31 kwwette + [Octave] #1789 error handling improvements and return error code on exit for SWIG wrapped modules. + +2020-05-30 msteinbeck + [D] #1593 Replace broken imports when using newer versions of D. + +2020-05-29: ZackerySpytz + [Python] #1716 Performance improvements converting strings when using Python >= 3.3. + +2020-05-28: ZackerySpytz + #1776 Quite dramatically decrease run times when generating very large interface files by changing + some internal memory pool sizes. + +2020-05-28: mcfarljm + #1788 Fix handling of Doxygen \endlink command. + +2020-05-24: vapier + [Javascript] #1796 Fix pkg-config invocation in configure. + +2020-04-30: kwwette + [Octave] Fix exception raising for newer Octave versions + Since (at least) Octave 5.1.0, the Octave error() function now raises a C++ exception, + which if uncaught immediately exits a SWIG wrapper function, bypassing any cleanup code + that may appear after a "fail:" label. This patch adds a "try { ... } catch(...) { }" + block around the contents of SWIG wrapper functions to first execute the cleanup code + before rethrowing any exception raised. It is backward compatible with earlier versions + of Octave where error() does not raise an exception, which will still branch to the + "fail:" block to execute cleanup code if an error is encountered. + + Note that the new "try { ... } catch(...) { }" block will localise any local variables + used in typemaps that were NOT declared through SWIG's %typemap(...) syntax, so it's + possible this could break existing SWIG wrappers which were implicitly sharing local + variables between typemaps. This can be fixed, however, by declaring local variables + which need to be shared between typemaps through SWIG's %typemap(...) syntax. + +2020-02-18: ryannevell + [Lua] #1728 Add support for LUA lightuserdata to SWIG_Lua_ConvertPtr. + +2020-02-18: dmach + [Ruby] #1725 Fix gcc -Wcatch-value warnings. + +2020-02-14: treitmayr + #1724 Fix wrapping of abstract user-defined conversion operators. + +2020-02-13: ddurham2 + [Python] #1512 Fix memleak when using STL containers of shared_ptr objects. + +2020-02-06: wsfulton + [Python] #1673 #1674 Fix setting 'this' when extending a proxy class with __slots__. + +2020-01-31: vadz + [Ruby] #1651 Add std::auto_ptr<> typemaps. + +2020-01-31: ZackerySpytz + [Python] #1700 More robust error checking for failures in calls to Python C API: + PyBytes_AsStringAndSize() and PyString_AsStringAndSize(). + +2020-01-31: vadz + [Python] #1710 Fix crash parsing empty docstrings. + +2020-01-30: Alzathar + [R] #910 #914 Fix R memory leak on exception. + +2020-01-30: richardbeare + [R] #1511 Fix bug wrapping functions. These were previously incorrectly wrapped as if + they were variables. This happened when 'get' or 'set' was in the name of the function + or method, but sometimes also in some other circumstances. If you were using R + attribute syntax to access these methods, you'll need to switch to calling them as R + methods. + + *** POTENTIAL INCOMPATIBILITY *** + +2020-01-24: etse-dignitas, wsfulton + [C#, D, Java] #1533 Fix upcasting for shared_ptr's of templated types. + +2020-01-16: mcfarljm + #1643 #1654 When using -doxygen, fix segfault when nameless parameters or vararg parameters + are used. + +2020-01-16: mcfarljm + #1632 #1659 Fix newline handling for doxygen "///" comments. + +2020-01-14: mcfarljm + #1647 #1656 Fix crash handling empty doxygen comments. + +2020-01-14: mcfarljm + #1608 Improve doxygen support. + - Add support for \param[] commands such as: \param[in]. + - Optional arguments are marked as 'optional' in pydoc. + - Improve support for \code commands so that other languages are supported as code blocks. + Support added for java, c and py. For example Python: \code{.py} ... \endcode + - Fix doxygen handling of \em and \p tags for Python. + +2020-01-13: wsfulton + [Python] #1595 Python -builtin constructors silently ignored keyword arguments. + Instead of silenty ignoring them, now a "TypeError: f() takes no keyword arguments" + exception is thrown if keyword arguments are used. Hence constructors and normal methods/ + functions behave in the same way. Note, -keyword should be used with -builtin to obtain + keyword argument support. + +2020-01-05: jschueller shadchin + [Python] #1670 #1696 Add missing field initializers introduced in python 3.8: + tp_vectorcall and tp_print. + +2020-01-05: friedrichatgc + [Octave] #1688 Change swig_this() to use size_t instead of long for compatibility + with Windows 64 bit. + +2020-01-05: treitmayr + [Ruby] #1692 #1689 Add support for Ruby 2.7 + +2019-12-30: treitmayr + [Ruby] #1653 #1668 Fix code generated when using -globalmodule option. + +2019-12-29: ZackerySpytz + [OCaml] #1686 Fix compilation errors with OCaml 4.09.0. + +2019-12-10: wsfulton + #1679 Fix parsing of C++11 identifiers with special meaning (final and override) when + they are used as part of the scope name of an identifier, such as a namespace name. + +2019-11-26: wsfulton + [C#] #1628 'out' or 'ref' used in a cstype typemap was not always stripped out in parts + of director code generation. + +2019-11-01: wsfulton + [Python] #1595 Fix bug in support for keyword arguments (kwargs feature or -keyword) + when using -builtin. The fix is in the argument error checking when wrapping zero + argument constructors only. + +Version 4.0.1 (21 Aug 2019) +=========================== + +2019-08-20: TekuConcept + [Javascript] #1535 Add %native support to Javascript. + +2019-08-20: bkotzz + [Java] #1616 Add SWIG_JavaIllegalStateException to support throwing + java.lang.IllegalStateException from JNI code. + +2019-08-19: sjml + [Lua] #1596 tostring output changes to show the underlying C/C++ pointer. + +2019-08-08: rokups + [C#, Java] #1601 Fix invalid code generated for "%constant enum EnumType. + +2019-08-07: wsfulton + [Python] Fix method overloading of methods that take STL containers of different + types. The following usage (using std::vector) would fail when using -builtin: + + %include + %include + + %inline %{ + struct X {}; + %} + + %template(VectorX) std::vector; + %template(VectorInt) std::vector; + + %inline %{ + using namespace std; + string VectorOverload(vector v); + string VectorOverload(vector v); + %} + + The following would incorrectly fail: + + s = VectorOverload([1, 2, 3]) + + With: + + Traceback (most recent call last): + File "runme3.py", line 20, in + ret = VectorOverload([1, 2, 3]) + TypeError: Wrong number or type of arguments for overloaded function 'VectorOverload'. + Possible C/C++ prototypes are: + VectorOverload(std::vector< Number,std::allocator< Number > >) + VectorOverload(std::vector< int,std::allocator< int > >) + + The problem was due to some error handling that was not cleared during typehecking. + In this case an error was not cleared when the elements in the list failed the + typecheck for converting to X. Only occurs in Python 3+. + + In some combinations of overloaded methods, the following type of error message would + occur: + + RuntimeError: in sequence element 0 + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "runme3.py", line 23, in + check(VectorOverload(v), "vector") + SystemError: returned a result with an error set + +2019-08-01: wsfulton + #1602 Fix regression in 4.0.0 where a template function containing a parameter + with the same name as the function name led to the parameter name used in the + target language being incorrectly modified. + +2019-07-29: wsfulton + Remove all generated files on error. Previously generated files were not removed, + potentially breaking Makefiles using file dependencies, especially when -Werror + (warnings as errors) was used. + +2019-07-23: smithx + [C#] #1530 #1532 Fix marshalling of std::wstring to C#. + +2019-07-18: gicmo + [Python] #1587 Python 3.8 support - remove use of deprecated PyObject_GC_UnTrack. + +2019-07-18: cher-nov + [Python] #1573 Generated Python code uses consistent string quoting style - double + quotes. + +2019-07-16: geefr + [C#] #616 #1576 Fix C# bool INPUT[], bool OUTPUT[], bool INOUT[] typemaps to marshall + as 1-byte. + +2019-07-12: vadz + [C#, Java] #1568 #1583 Fix std::set<> typemaps for primitive types. + +2019-07-12: vadz + #1566 #1584 Regression in 4.0.0 - fix missing value for first item of enums with + trailing comma. + +2019-07-11: mcfarljm + #1548 #1578 Fix segfault in Doxygen parser parsing empty lines in some commands like + \code. + +2019-07-09: IsaacPascual + [C#, Java] #1570 Fix name of generated C#/Java classes for %interface macros + in swiginterface.i when wrapping nested C++ classes. + +2019-07-05: wsfulton + [Python] #1547 Whitespace fixes in Doxygen translated comments into pydoc comments + for Sphinx compatibility. + +2019-06-28: wsfulton + [MzScheme, OCaml] #1559 $arg and $input were incorrectly substituted in the + argout typemap when two or more arguments were present. + +2019-06-24: wsfulton + [Python, Ruby] #1538 Remove the UnknownExceptionHandler class in order to be + C++17 compliant as it uses std::unexpected_handler which was removed in C++17. + This class was intended for director exception handling but was never used by + SWIG and was never documented. + + *** POTENTIAL INCOMPATIBILITY *** + +2019-06-06: bkotzz + [Java] #1552 Improve performance in Java std::vector constructor wrapper that takes + a native Java array as input. + +2019-06-03: olly + [Python] Fix regression in implicit_conv handling of tuples, + introduced in SWIG 4.0.0. Fixes #1553, reported by Alexandre + Duret-Lutz. + +2019-05-24: wsfulton + [Octave] Fix detection of Octave on MacOS. + +2019-05-24: opoplawski + [Octave] #1522 Adapt OCTAVE_LDFLAGS for Octave 5.1. + +2019-05-22: ferdynator + [PHP] #1528 Don't add a closing '?>' PHP tag to generated files. + PSR-2 says it MUST be omitted for files containing only PHP. Version 4.0.0 (27 Apr 2019) =========================== diff --git a/CHANGES.current b/CHANGES.current index 3b9634726..6bafec31c 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -4,69 +4,282 @@ See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ -Version 4.0.1 (in progress) +Version 4.1.0 (in progress) =========================== -2019-07-23: smithx - [C#] #1530 #1532 Fix marshalling of std::wstring to C#. +2021-10-03: ajrh1 + [Perl] #2074: Avoid -Wmisleading-indentation in generated code + when using gcc11. -2019-07-18: gicmo - [Python] #1587 Python 3.8 support - remove use of deprecated PyObject_GC_UnTrack. +2021-10-03: jschueller + [CMake] #2065: Add option to enable or disable PCRE support. -2019-07-18: cher-nov - [Python] #1573 Generated Python code uses consistent string quoting style - double - quotes. +2021-09-16: ianlancetaylor + [Go] Improved _cgo_panic implementation. -2019-07-16: geefr - [C#] #616 #1576 Fix C# bool INPUT[], bool OUTPUT[], bool INOUT[] typemaps to marshall - as 1-byte. +2021-09-16: ianlancetaylor + [Go] Don't use crosscall2 for panicking. Instead rely on documented + and exported interfaces. -2019-07-12: vadz - [C#, Java] #1568 #1583 Fix std::set<> typemaps for primitive types. +2021-09-14: ianlancetaylor + [Go] Remove -no-cgo option (long unsupported in Go) -2019-07-12: vadz - #1566 #1584 Regression in 4.0.0 - fix missing value for first item of enums with - trailing comma. +2021-05-04: olly + [PHP] #2014 Throw PHP exceptions instead of using PHP errors -2019-07-11: mcfarljm - #1548 #1578 Fix segfault in Doxygen parser parsing empty lines in some commands like - \code. + PHP exceptions can be caught and handled if desired, but if they + aren't caught then PHP exits in much the same way as it does for a + PHP error. -2019-07-09: IsaacPascual - [C#, Java] #1570 Fix name of generated C#/Java classes for %interface macros - in swiginterface.i when wrapping nested C++ classes. + In particular this means parameter type errors and some other cases + in SWIG-generated wrappers now throw a PHP exception, which matches + how PHP's native parameter handling deals with similar situations. -2019-07-05: wsfulton - [Python] #1547 Whitespace fixes in Doxygen translated comments into pydoc comments - for Sphinx compatibility. + `SWIG_ErrorCode()`, `SWIG_ErrorMsg()`, `SWIG_FAIL()` and `goto thrown;` + are no longer supported (these are really all internal implementation + details and none are documented aside from brief mentions in CHANGES + for the first three). I wasn't able to find any uses in user interface + files at least in FOSS code via code search tools. -2019-06-28: wsfulton - [MzScheme, OCaml] #1559 $arg and $input were incorrectly substituted in the - argout typemap when two or more arguments were present. + If you are using these: -2019-06-24: wsfulton - [Python, Ruby] #1538 Remove the UnknownExceptionHandler class in order to be - C++17 compliant as it uses std::unexpected_handler which was removed in C++17. - This class was intended for director exception handling but was never used by - SWIG and was never documented. + Use `SWIG_PHP_Error(code,msg);` instead of `SWIG_ErrorCode(code); + SWIG_ErrorMsg(msg);` (which will throw a PHP exception in SWIG >= 4.1 + and do the same as the individual calls in older SWIG). - *** POTENTIAL INCOMPATIBILITY *** + `SWIG_FAIL();` and `goto thrown;` can typically be replaced with + `SWIG_fail;`. This will probably also work with older SWIG, but + please test with your wrappers if this is important to you. -2019-06-06: bkotzz - [Java] #1552 Improve performance in Java std::vector constructor wrapper that takes - a native Java array as input. + *** POTENTIAL INCOMPATIBILITY *** -2019-06-03: olly - [Python] Fix regression in implicit_conv handling of tuples, - introduced in SWIG 4.0.0. Fixes #1553, reported by Alexandre - Duret-Lutz. +2021-05-17: adr26 + [Python] #1985 Fix memory leaks: -2019-05-24: wsfulton - [Octave] Fix detection of Octave on MacOS. + 1. Python object references were being incorrectly retained by + SwigPyClientData, causing swig_varlink_dealloc() never to run / free + memory. SwigPyClientData_New() / SwigPyClientData_Del() were updated + to fix the object reference counting, causing swig_varlink_dealloc() + to run and the memory swig_varlink owns to be freed. -2019-05-24: opoplawski - [Octave] #1522 Adapt OCTAVE_LDFLAGS for Octave 5.1. + 2. SwigPyClientData itself was not freed by SwigPyClientData_Del(), + causing another heap leak. The required free() was added to + SwigPyClientData_Del() -2019-05-22: ferdynator - [PHP] #1528 Don't add a closing '?>' PHP tag to generated files. - PSR-2 says it MUST be omitted for files containing only PHP. + 3. Fix reference counting/leak of python cached type query + + 4. Fix reference counting/leak of SwigPyObject dict (-builtin) + + 5. Python object reference counting fixes for out-of-memory + scenarios were added to: SWIG_Python_RaiseOrModifyTypeError(), + SWIG_Python_AppendOutput(), SwigPyClientData_New(), + SwigPyObject_get___dict__() and SwigPyObject_format() + + 6. Add error handling for PyModule_AddObject() to + SWIG_Python_SetModule() (failure could be caused by OOM or a name + clash caused by malicious code) + +2021-05-13: olly + [UFFI] #2009 Remove code for Common Lisp UFFI. We dropped support + for it in SWIG 4.0.0 and nobody has stepped forward to revive it in + over 2 years. + +2021-05-13: olly + [S-EXP] #2009 Remove code for Common Lisp S-Exp. We dropped + support for it in SWIG 4.0.0 and nobody has stepped forward to + revive it in over 2 years. + +2021-05-13: olly + [Pike] #2009 Remove code for Pike. We dropped support for it in + SWIG 4.0.0 and nobody has stepped forward to revive it in over 2 + years. + +2021-05-13: olly + [Modula3] #2009 Remove code for Modula3. We dropped support for it + in SWIG 4.0.0 and nobody has stepped forward to revive it in over 2 + years. + +2021-05-13: olly + [CLISP] #2009 Remove code for GNU Common Lisp. We dropped support + for it in SWIG 4.0.0 and nobody has stepped forward to revive it in + over 2 years. + +2021-05-13: olly + [Chicken] #2009 Remove code for Chicken. We dropped support for it + in SWIG 4.0.0 and nobody has stepped forward to revive it in over 2 + years. + +2021-05-13: olly + [Allegrocl] #2009 Remove code for Allegro Common Lisp. We dropped + support for it in SWIG 4.0.0 and nobody has stepped forward to + revive it in over 2 years. + +2021-05-04: olly + [PHP] #1982 #1457 https://sourceforge.net/p/swig/bugs/1339/ + SWIG now only use PHP's C API to implement its wrappers, and no + longer generates PHP code to define classes. The wrappers should + be almost entirely compatible with those generated before, but + faster and without some previously hard-to-fix bugs. + + The main notable difference is SWIG no longer generates a .php + wrapper at all by default (only if %pragma(php) code=... or + %pragma(php) include=... are specified in the interface file). + This also means you need to load the module via extension=... + in php.ini, rather than letting the dl() in the generated + .php wrapper load it (but dl() has only worked for command-line + PHP for some years now). + + *** POTENTIAL INCOMPATIBILITY *** + +2021-04-30: olly + #1984 Remove support for $source and $target. + These were officially deprecated in 2001, and attempts to use them have + resulted in a warning (including a pointer to what to update them to) + for most if not all of that time. + +2021-04-27: wsfulton + #1987 [Java] Fix %interface family of macros for returning by const + pointer reference. + +2021-04-19: olly + Fix use of uninitialised variable in the generated code for an + empty typecheck typemap, such as the dummy one we include for + std::initializer_list. + +2021-04-12: olly + #1777 [Python] Specifying -py3 now generates a check for Python + version >= 3.0. + +2021-03-26: olly + [PHP] Add PHP keywords 'fn' (added in 7.4) and 'match' (added in + 8.0) to the list SWIG knows to automatically rename. + +2021-03-23: wsfulton + #1942 [Python] Fix compilation error in wrappers when using -builtin + and wrapping varargs in constructors. + +2021-03-22: goto40 + #1977 Fix handling of template template parameters. + +2021-03-21: olly + #1929, #1978 [PHP] Add support for PHP 8. + +2021-03-19: wsfulton + #1610 Remove -ansi from default compilation flags. + +2021-03-19: dot-asm + #1934 [Java] Clean up typemaps for long long arrays. + +2021-03-19: olly + #1527 [PHP] Improve PHP object creation in directorin case. + Reportedly the code we were using in this case gave segfaults in + PHP 7.2 and later - we've been unable to reproduce these, but the + new approach is also simpler and should be bit faster too. + +2021-03-18: olly + #1655 [PHP] Fix char* typecheck typemap to accept PHP Null like the + corresponding in typemap does. + +2021-03-18: olly + #1900, #1905 [PHP] Fix wrapping of overloaded directed methods with + non-void return. + +2021-03-11: murillo128 + #1498 [Javascript] Support type conversion. + +2021-03-06: nshmyrev + #872 [Javascript] Various typemap issues in arrays_javascript.i fixed. + +2021-03-03: vaughamhong + #577 [Javascript] Implemented SetModule/GetModule for JSC to allow type sharing + across modules. + +2021-03-01: xantares, Oliver Buchtala, geographika + #1040 Add support for building SWIG with CMake. See documentation in Windows.html. + +2021-03-01: vadz + #1952 Fix incorrect warning "Unknown Doxygen command: ." + +2021-02-28: p2k + #969 [Javascript] v8/node - prevent crash calling a constructor without new keyword. + +2021-02-28: alecmev + #405 #1121 [Javascript] Fix OUTPUT typemaps on methods that don't return void. + The output value is appended to the return value. + +2021-02-26: murillo128, wsfulton + #1269 [Javascript] Fix handling of large positive unsigned long and + unsigned long long values. + +2021-02-24: tomleavy, yegorich, tungntpham + #1746 [Javascript] Add support for Node v12, v14 and v16. + SWIG support for Node is now for v6 and later only. + +2020-02-09: ZackerySpytz + #1872 Fix typos in attribute2ref macros. + +2020-10-10: wsfulton + [Javascript] Fix so that ccomplex.i interface to file can be used. + +2020-10-10: wsfulton + #252 complex can now be used as a C identifier and doesn't give a syntax error. + +2020-10-10: lpsinger + #1770 Correct C complex support. + _Complex is now parsed as a keyword rather than complex as per the C99 standard. + The complex macro is available in the ccomplex.i library file along with other + complex number handling provided by the complex.h header. + +2020-10-07: ZackerySpytz + [Python] #1812 Fix the error handling for the PyObject_GetBuffer() calls in + pybuffer.i. + +2020-10-07: treitmayr + #1824 Add missing space in director method declaration returning + const pointer. + +2020-10-07: adelva1984 + #1859 Remove all (two) exceptions from SWIG executable. + +2020-09-25: wsfulton + [C#, Java] #1874 Add ability to change the modifiers for the interface + generated when using the %interface macros. + + For C# use the 'csinterfacemodifiers' typemap. + For Java use the 'javainterfacemodifiers' typemap. + + For example: + + %typemap(csinterfacemodifiers) X "internal interface" + + +2020-09-24: geefr + [C#] #1868 Fix wchar_t* csvarout typemap for member variable wrappers. + +2020-08-28: wsfulton + [Java] #1862 Fix crashes in swig_connect_director during director class construction + when using the director class from multiple threads - a race condition initialising + block scope static variables. The fix is guaranteed when using C++11, but most + compilers also fix it when using C++03/C++98. + +2020-08-16: wsfulton + [Python] Add missing initializer for member ‘_heaptypeobject::ht_module’ when using + -builtin to complete Python 3.9 support. + +2020-08-16: wsfulton + [Python] Remove PyEval_InitThreads() call for Python 3.7 and later as Python calls + it automatically now. This removes a deprecation warning when using Python 3.9. + +2020-08-15: wsfulton + [Python] All Python examples and tests are written to be Python 2 and Python 3 + compatible, removing the need for 2to3 to run the examples or test-suite. + +2020-08-13: wsfulton + [C#] Add support for void *VOID_INT_PTR for member variables. + +2020-07-29: chrisburr + #1843 [Python] Compilation error fix in SwigPyBuiltin_SetMetaType when using PyPy. + +2020-06-14: ZackerySpytz + #1642 #1809 Fix virtual comparison operators in director classes - remove incorrect + space in the function name, for example, operator= = is now operator==. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..8a195de54 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,166 @@ +cmake_minimum_required (VERSION 3.2) + +if (NOT DEFINED CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE Release CACHE STRING "Build type") +endif () + +project (swig) + +if (POLICY CMP0074) + cmake_policy (SET CMP0074 NEW) +endif() + +file (STRINGS configure.ac line LIMIT_COUNT 1 REGEX "AC_INIT\\(.*\\)" ) +if (line MATCHES "AC_INIT\\(\\[(.*)\\],[ \t]*\\[(.*)\\],[ \t]*\\[(.*)\\]\\)" ) + set (SWIG_VERSION ${CMAKE_MATCH_2}) + set (PACKAGE_BUGREPORT ${CMAKE_MATCH_3}) +else () + message (SEND_ERROR "Could not parse version from configure.ac") +endif () + +set (SWIG_ROOT ${PROJECT_SOURCE_DIR}) + +set (SWIG_LIB share/swig/${SWIG_VERSION}) + +# Project wide configuration variables +# ------------------------------------ + +set (SWIG_SOURCE_DIR ${SWIG_ROOT}/Source CACHE INTERNAL "Path of swig sources" FORCE) + +set (PACKAGE_NAME swig) +set (PACKAGE_VERSION ${SWIG_VERSION}) + +# Configure +# --------- + +list (APPEND CMAKE_MODULE_PATH ${SWIG_ROOT}/Tools/cmake) + +include (CheckIncludeFiles) +include (CheckIncludeFile) +include (CheckIncludeFileCXX) +include (CheckTypeSize) +include (CheckSymbolExists) +include (CheckFunctionExists) +include (CheckLibraryExists) +include (CheckCSourceCompiles) + +# HACK: didn't get the bool check working for Visual Studio 2008 +if (MSVC) + set(HAVE_BOOL 1) +else() + set (CMAKE_EXTRA_INCLUDE_FILES stdbool.h) + check_type_size ("bool" HAVE_BOOL) + set (CMAKE_EXTRA_INCLUDE_FILES) +endif() + +check_include_file ("inttypes.h" HAVE_INTTYPES_H) +check_include_file ("stddef.h" HAVE_STDDEF_H) +check_include_file ("stdint.h" HAVE_STDINT_H) +check_include_file ("stdio.h" HAVE_STDIO_H) +check_include_file ("stdlib.h" HAVE_STDLIB_H) +check_include_file ("string.h" HAVE_STRING_H) +check_include_file ("strings.h" HAVE_STRINGS_H) +check_include_file ("sys/stat.h" HAVE_SYS_STAT_H) +check_include_file ("sys/types.h" HAVE_SYS_TYPES_H) +check_include_file ("unistd.h" HAVE_UNISTD_H) +check_include_files ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) + +check_include_file_cxx ("boost/shared_ptr.hpp" HAVE_BOOST) +check_library_exists (dl dlopen "" HAVE_LIBDL) +check_function_exists (popen HAVE_POPEN) + +if (MSVC) + set (CMAKE_CXX_FLAGS "/EHsc ${CMAKE_CXX_FLAGS}") +endif () + +option (WITH_PCRE "Enable pcre" ON) +if (WITH_PCRE) + find_package (PCRE REQUIRED) + set (HAVE_PCRE 1) + include_directories (${PCRE_INCLUDE_DIRS}) +endif() + +if (WIN32) + file (TO_NATIVE_PATH ${CMAKE_INSTALL_PREFIX}/${SWIG_LIB} SWIG_LIB_WIN_UNIX) + string (REGEX REPLACE "\\\\" "\\\\\\\\" SWIG_LIB_WIN_UNIX "${SWIG_LIB_WIN_UNIX}") +endif () +configure_file (${SWIG_ROOT}/Tools/cmake/swigconfig.h.in + ${CMAKE_CURRENT_BINARY_DIR}/Source/Include/swigconfig.h) + +find_package (BISON REQUIRED) + + +# Compiler flags +# -------------- + +include_directories ( + ${SWIG_SOURCE_DIR}/CParse + ${SWIG_SOURCE_DIR}/Include + ${SWIG_SOURCE_DIR}/DOH + ${SWIG_SOURCE_DIR}/Swig + ${SWIG_SOURCE_DIR}/Preprocessor + ${SWIG_SOURCE_DIR}/Modules + ${PROJECT_BINARY_DIR}/Source/Include + ${PROJECT_BINARY_DIR}/Source/CParse + ${PROJECT_SOURCE_DIR}/Source/Doxygen +) + +# generate the parser source code (depends on bison) +file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/Source/CParse) + +BISON_TARGET (swig_parser + ${SWIG_SOURCE_DIR}/CParse/parser.y + ${PROJECT_BINARY_DIR}/Source/CParse/parser.c +) + +# generate swigwarn.swg +file (READ ${SWIG_SOURCE_DIR}/Include/swigwarn.h SWIG_WARN_H) +string (REGEX REPLACE "#define WARN([^ \\t]*)[ \\t]*([0-9]+)" "%define SWIGWARN\\1 \\2 %enddef" SWIG_WARN_SWG ${SWIG_WARN_H}) +file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/swigwarn.swg ${SWIG_WARN_SWG}) +set_property (SOURCE ${CMAKE_CURRENT_BINARY_DIR}/swigwarn.swg PROPERTY GENERATED 1) + +# install lib +install (DIRECTORY ${SWIG_ROOT}/Lib/ DESTINATION ${SWIG_LIB}) +install (FILES ${CMAKE_CURRENT_BINARY_DIR}/swigwarn.swg DESTINATION ${SWIG_LIB}) + +# sources +# --------- +file (GLOB DOH_SOURCES ${SWIG_SOURCE_DIR}/DOH/*.c) +file (GLOB CPARSE_SOURCES ${SWIG_SOURCE_DIR}/CParse/*.c) +list (APPEND CPARSE_SOURCES) +file (GLOB PREPROCESSOR_SOURCES ${SWIG_SOURCE_DIR}/Preprocessor/*.c) +file (GLOB CORE_SOURCES ${SWIG_SOURCE_DIR}/Swig/*.c) +file (GLOB DOXYGEN_SOURCES ${SWIG_SOURCE_DIR}/Doxygen/*.cxx) +file (GLOB MODULES_SOURCES ${SWIG_SOURCE_DIR}/Modules/*.cxx) + +add_executable (swig + ${CPARSE_SOURCES} + ${DOH_SOURCES} + ${DOXYGEN_SOURCES} + ${MODULES_SOURCES} + ${CORE_SOURCES} + ${PREPROCESSOR_SOURCES} + ${PROJECT_BINARY_DIR}/Source/Include/swigconfig.h + ${SWIG_SOURCE_DIR}/Include/swigwarn.h + ${PROJECT_BINARY_DIR}/Source/CParse/parser.c + ${PROJECT_BINARY_DIR}/Source/CParse/parser.h +) +if (PCRE_FOUND) + target_link_libraries (swig ${PCRE_LIBRARIES}) +endif () +install (TARGETS swig DESTINATION bin) + +# 'make package-source' creates tarballs +set (CPACK_PACKAGE_NAME ${PACKAGE_NAME}) +set (CPACK_SOURCE_GENERATOR "TGZ;TBZ2") +set (CPACK_SOURCE_IGNORE_FILES "/.git;/build;.*~;${CPACK_SOURCE_IGNORE_FILES}") +set (CPACK_SOURCE_PACKAGE_FILE_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION}) +include (CPack) + +# few tests +enable_testing () +add_test (NAME cmd_version COMMAND swig -version) +add_test (NAME cmd_swiglib COMMAND swig -swiglib) +add_test (NAME cmd_external_runtime COMMAND swig -external-runtime ext_rt.h) +set_tests_properties(cmd_external_runtime PROPERTIES ENVIRONMENT "SWIG_LIB=${PROJECT_SOURCE_DIR}/Lib") + diff --git a/Doc/Manual/Allegrocl.html b/Doc/Manual/Allegrocl.html deleted file mode 100644 index 4069ecd8b..000000000 --- a/Doc/Manual/Allegrocl.html +++ /dev/null @@ -1,2150 +0,0 @@ - - - -SWIG and Allegro Common Lisp - - - - - - -

20 SWIG and Allegro Common Lisp

- - - - - - -

-This chapter describes SWIG's support of Allegro Common Lisp. Allegro -CL is a full-featured implementation of the Common Lisp language -standard that includes many vendor-specific enhancements and add-on -modules for increased usability. -

- -

-One such module included in Allegro CL is the Foreign Functions -Interface (FFI). This module, tailored primarily toward interfacing -with C/C++ and, historically, Fortran, provides a means by which -compiled foreign code can be loaded into a running lisp -environment and executed. The interface supports the calling of -foreign functions and methods, allows for executing lisp routines -from foreign code (callbacks), and the passing of data between foreign -and lisp code. -

- -

-The goal of this module is to make it possible to quickly generate the -necessary foreign function definitions so one can make use of C/C++ -foreign libraries directly from lisp without the tedium of having to -code them by hand. When necessary, it will also generate further C/C++ -code that will need to be linked with the intended library for proper -interfacing from lisp. It has been designed with an eye toward -flexibility. Some foreign function calls may release the heap, while -other should not. Some foreign functions should automatically convert -lisp strings into native strings, while others should not. These -adjustments and many more are possible with the current module. -

- -

-It is significant to note that, while this is a vendor-specific -module, we would like to acknowledge the current and ongoing -work by developers in the open source lisp community that are -working on similar interfaces to implementation-independent -foreign function interfaces (CFFI, for example). Such -work can only benefit the lisp community, and we would not -be unhappy to see some enterprising folk use this work to add -to it. -

- -

20.1 Basics

- - -

20.1.1 Running SWIG

- - -

-If you're reading this, you must have some library you need to -generate an interface for. In order for SWIG to do this work, however, -it needs a bit of information about how it should go about creating -your interface, and what you are interfacing to. -

- -

-SWIG expects a description of what in the foreign interface you wish -to connect to. It must consisting of C/C++ declarations and special -SWIG directives. SWIG can be furnished with a header file, but an -interface can also be generated without library headers by supplying a -simple text file--called the interface file, which is typically named -with a .i extension--containing any foreign declarations of -identifiers you wish to use. The most common approach is to use an -interface file with directives to parse the needed headers. A straight -parse of library headers will result in usable code, but SWIG -directives provides much freedom in how a user might tailor the -generated code to their needs or style of coding. -

- -

-Note that SWIG does not require any function definitions; the -declarations of those functions is all that is necessary. Be careful -when tuning the interface as it is quite possible to generate code -that will not load or compile. -

- -

-An example interface file is shown below. It makes use of two SWIG -directives, one of which requests that the declarations in a header -file be used to generate part of the interface, and also includes an -additional declaration to be added.

- -
example.i -
-%module example
-
-%include "header.h"
-
-int fact(int n);
-
-
- -

The contents of header.h are very simple:

-
header.h -
-int fact(char *statement);   // pass it a fact, and it will rate it.
-
-
- -

The contents of example.cl will look like this:

- -
example.cl -
-(defpackage :example
-  (:use :common-lisp :swig :ff :excl))
-
-  ... helper routines for defining the interface ...
-
-(swig-in-package ())
-
-(swig-defun ("fact")
-  ((PARM0_statement cl:string (* :char) ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_statement))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-defun ("fact")
-  ((PARM0_n cl:integer :int ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_n))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-dispatcher ("fact" :type :function :arities (1)))
-
-
- -

-The generated file contains calls to internal swig helper -functions. In this case there are two calls to swig-defun. -These calls will expand into code that will make the appropriate -definitions using the Allegro FFI. Note also, that this code is -erroneous. Function overloading is not supported in C, and this -code will not compile even though SWIG did not complain. -

- -

-In order to generate a C interface to Allegro CL using this code run -swig using the -allegrocl option, as below: -

- -
-
-% swig -allegrocl example.i
-
-
- -

-When building an interface to C++ code, include the -c++ option: -

- -
-
-% swig -allegrocl -c++ example.i
-
-
- -

-As a result of running one of the above commands, a file named example.cl -will be generated containing the lisp side of the interface. As well, a file -example_wrap.cxx is also generated, containing C/C++ wrapper code to -facilitate access to C++ methods, enumeration values, and constant values. -Wrapper functions are necessary in C++ due to the lack of a standard for mangling -the names of symbols across all C++ compilers. These wrapper functions are -exported from the shared library as appropriate, using the C name mangling -convention. The lisp code that is generated will interface to your foreign -library through these wrappers. -

- -

-It is possible to disable the creation of the .cxx file when generating a C -interface by using the -nocwrap command-line argument. For interfaces that -don't contain complex enum or constant expressions, contain nested struct/union -declarations, or doesn't need to use many of the SWIG customization featuers, -this will result in a more streamlined, direct interface to the -intended module. -

- -

-The generated wrapper file is below. It contains very simple -wrappers by default, that simply pass the arguments to the -actual function. -

- -
example_wrap.i -
-  ... lots of SWIG internals ...
-
-EXPORT int ACL___fact__SWIG_0 (char *larg1) {
-  int lresult = (int)0 ;
-  char *arg1 = (char *) 0 ;
-  int result;
-
-  arg1 = larg1;
-  try {
-    result = (int)fact(arg1);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (int)0;
-  }
-}
-
-
-EXPORT int ACL___fact__SWIG_1 (int larg1) {
-  int lresult = (int)0 ;
-  int arg1 ;
-  int result;
-
-  arg1 = larg1;
-  try {
-    result = (int)fact(arg1);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (int)0;
-  }
-}
-
-
- -

-And again, the generated lisp code. Note that it differs from -what is generated when parsing C code: -

- -
-
-  ...
-
-(swig-in-package ())
-
-(swig-defmethod ("fact" "ACL___fact__SWIG_0" :type :function :arity 1)
-  ((PARM0_statement cl:string (* :char) ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_statement))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-defmethod ("fact" "ACL___fact__SWIG_1" :type :function :arity 1)
-  ((PARM0_n cl:integer :int ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_n))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-dispatcher ("fact" :type :function :arities (1)))
-
-
- -

In this case, the interface generates two swig-defmethod forms and -a swig-dispatcher form. This provides a single functional interface for -all overloaded routines. A more detailed description of this features -is to be found in the section titled Function overloading/Parameter defaulting. - -

-In order to load a C++ interface, you will need to build a shared library -from example_wrap.cxx. Be sure to link in the actual library you created -the interface for, as well as any other dependent shared libraries. For -example, if you intend to be able to call back into lisp, you will also -need to link in the Allegro shared library. The library you create from -the C++ wrapper will be what you then load into Allegro CL. -

- -

20.1.2 Command Line Options

- - -

-There are three Allegro CL specific command-line option: -

- -
-
-swig -allegrocl [ options ] filename
-
-   -identifier-converter [name] - Binds the variable swig:*swig-identifier-convert* 
-                                  in the generated .cl file to name.
-                                  This function is used to generate symbols
-                                  for the lisp side of the interface.
-
-   -cwrap - [default] Generate a .cxx file containing C wrapper function when
-            wrapping C code. The interface generated is similar to what is
-            done for C++ code.
-   -nocwrap - Explicitly turn off generation of .cxx wrappers for C code. Reasonable
-              for modules with simple interfaces. Can not handle all legal enum
-              and constant constructs, or take advantage of SWIG customization features.
-
-   -isolate - With this command-line argument, all lisp helper functions are defined
-              in a unique package named swig.<module-name> rather than
-              swig. This prevents conflicts when the module is
-              intended to be used with other swig generated interfaces that may,
-              for instance, make use of different identifier converters.
-
-
- -

-See Section 17.5 Identifier converter -functions for more details. -

- -

20.1.3 Inserting user code into generated files

- - -

-It is often necessary to include user-defined code into the -automatically generated interface files. For example, when building -a C++ interface, example_wrap.cxx will likely not compile unless -you add a #include "header.h" directive. This can be done -using the SWIG %insert(section) %{ ...code... %} directive: -

- -
-
-%module example
-
-%{
-#include "header.h"
-%}
-
-%include "header.h"
-
-int fact(int n);
-
-
- -

-Additional sections have been added for inserting into the -generated lisp interface file -

-
    -
  • lisphead - inserts before type declarations
  • -
  • lisp - inserts after type declarations according to - where it appears in the .i file
  • -
-

-Note that the block %{ ... %} is effectively a shortcut for -%insert("header") %{ ... %}. -

- - -

20.2 Wrapping Overview

- - -

-New users to SWIG are encouraged to read -SWIG Basics, and -SWIG and C++, for those -interested in generating an interface to C++. -

- -

20.2.1 Function Wrapping

- - -

- Writing lisp code that directly invokes functions at the foreign - function interface level can be cumbersome. Data must often be - translated between lisp and foreign types, data extracted from - objects, foreign objects allocated and freed upon completion of - the foreign call. Dealing with pointers can be unwieldy when it - comes to keeping them distinct from other valid integer values. -

- -

- We make an attempt to ease some of these burdens by making the - interface to foreign code much more lisp-like, rather than C - like. How this is done is described in later chapters. The - layers themselves, appear as follows: -

- -
-
-        ______________
-       |              |  (foreign side)
-       | Foreign Code |  What we're generating an interface to.
-       |______________|
-               |
-               |
-        _______v______
-       |              |  (foreign side)
-       | Wrapper code |  extern "C" wrappers calling C++ 
-       |______________|  functions and methods.
-               |
-    .  . . - - + - - . .  .
-        _______v______
-       |              |  (lisp side)
-       |  FFI Layer   |  Low level lisp interface. ff:def-foreign-call,
-       |______________|  ff:def-foreign-variable
-               |
-               +----------------------------
-        _______v______              _______v______
-       |              |            |              | (lisp side)    
-       |    Defuns    |            |  Defmethods  | wrapper for overloaded
-       |______________|            |______________| functions or those with
-        (lisp side)                        |        defaulted arguments
-        Wrapper for non-overloaded         |
-        functions and methods       _______v______
-                                   |              | (lisp side)
-                                   |    Defuns    | dispatch function
-                                   |______________| to overloads based
-                                                    on arity
-  
-
- -

20.2.2 Foreign Wrappers

- - -

- These wrappers are as generated by SWIG default. The types of - function parameters can be transformed in place using the CTYPE - typemap. This is use for converting pass-by-value parameters to - pass-by-reference where necessary. All wrapper parameters are then - bound to local variables for possible transformation of values - (see LIN typemap). Return values can be transformed via the OUT - typemap. -

- -

20.2.3 FFI Wrappers

- - -

- These are the generated ff:def-foreign-call forms. No typemaps are - applicable to this layer, but the %ffargs directive is - available for use in .i files, to specify which keyword arguments - should be specified for a given function. -

- -
ffargs.i: -
-%module ffargs
-
-%ffargs(strings_convert="nil", call_direct="t") foo;
-%ffargs(strings_convert="nil", release_heap=":never", optimize_for_space="t") bar;
-
-int foo(float f1, float f2);
-int foo(float f1, char c2);
-
-void bar(void *lisp_fn);
-
-char *xxx();
-  
-
- -

Generates: -

-
ffargs.cl: -
-(swig-in-package ())
-
-(swig-defmethod ("foo" "ACL___foo__SWIG_0" :type :function :arity 2)
-  ((PARM0_f1 cl:single-float :float )
-   (PARM1_f2 cl:single-float :float ))
-  (:returning (:int )
-   :call-direct t
-   :strings-convert nil)
-  (let ((SWIG_arg0 PARM0_f1))
-  (let ((SWIG_arg1 PARM1_f2))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-defmethod ("foo" "ACL___foo__SWIG_1" :type :function :arity 2)
-  ((PARM0_f1 cl:single-float :float )
-   (PARM1_c2 cl:character :char character))
-  (:returning (:int )
-   :call-direct t
-   :strings-convert nil)
-  (let ((SWIG_arg0 PARM0_f1))
-  (let ((SWIG_arg1 PARM1_c2))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-dispatcher ("foo" :type :function :arities (2)))
-(swig-defun ("bar" "ACL___bar__SWIG_0" :type :function)
-  ((PARM0_lisp_fn  (* :void) ))
-  (:returning (:void )
-   :release-heap :never
-   :optimize-for-space t
-   :strings-convert nil)
-  (let ((SWIG_arg0 PARM0_lisp_fn))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("xxx" "ACL___xxx__SWIG_0" :type :function)
-  (:void)
-  (:returning ((* :char) )
-   :strings-convert t)
-  (swig-ff-call))
-  
-
- -
-
%ffargs(strings_convert="t");
-
- -

- Is the only default value specified in allegrocl.swg to force - the muffling of warnings about automatic string conversion when defining - ff:def-foreign-call's. -

- -

20.2.4 Non-overloaded Defuns

- - -

- These are simple defuns. There is no typechecking of arguments. - Parameters are bound to local variables for possible - transformation of values, such as pulling values out of instance - slots or allocating temporary stack allocated structures, via the - lin typemap. These arguments are then passed to the - foreign-call (where typechecking may occur). The return value from - this function can be manipulated via the lout typemap. -

- -

20.2.5 Overloaded Defuns

- - -

- In the case of overloaded functions, multiple layers are - generated. First, all the overloads for a given name are separated - out into groups based on arity, and are wrapped in - defmethods. Each method calls a distinct wrapper function, but are - themselves distinguished by the types of their arguments - (see lispclass typemap). These are further wrapped in a - dispatching function (defun) which will invoke the appropriate - generic-function based on arity. This provides a single functional - interface to all overloads. The return value from this function - can be manipulated via the lout typemap. -

- -

20.2.6 What about constant and variable access?

- - -

- Along with the described functional layering, when creating a .cxx wrapper, - this module will generate getter and--if not immutable--setter, - functions for variables and constants. If the -nocwrap option is used, - defconstant and ff:def-foreign-variable forms will be - generated for accessing constants and global variables. These, along with - the defuns listed above are the intended API for calling - into the foreign module. -

- -

20.2.7 Object Wrapping

- - -

- All non-primitive types (Classes, structs, unions, and typedefs - involving same) have a corresponding foreign-type defined on the - lisp side via ff:def-foreign-type. -

- -

- All non-primitive types are further represented by a CLOS class, - created via defclass. An attempt is made to create the same class - hierarchy, with all classes inheriting directly or indirectly from - ff:foreign-pointer. Further, wherever it is apparent, all pointers - returned from foreign code are wrapped in a CLOS instance of the - appropriate class. For ff:def-foreign-calls that have been defined - to expect a :foreign-address type as argument, these CLOS instances - can legally be passed and the pointer to the C++ object - automatically extracted. This is a natural feature of Allegro's - foreign function interface. -

- -

20.3 Wrapping Details

- - -

- In this section is described how particular C/C++ constructs are - translated into lisp. -

- -

20.3.1 Namespaces

- - -

- C++ namespaces are translated into Lisp packages by SWIG. The - Global namespace is mapped to a package named by the %module - directive or the -module command-line argument. Further - namespaces are generated by the swig-defpackage utility - function and given names based on Allegro CLs nested namespace - convention. For example: -

- -
foo.i: -
-%module foo
-
-%{
-#include "foo.h"
-%}
-
-%include "foo.h"
-
-namespace car {
-  ...
-  namespace tires {
-    int do_something(int n);
-  }
-}
-    
-
-

Generates the following code. -

-
foo.cl -
-(defpackage :foo
-  (:use :common-lisp :swig :ff :excl))
-
-...
-
-(swig-defpackage ("car"))
-(swig-defpackage ("car" "tires"))
-
-...
-
-(swig-in-package ("car" "tires"))
-(swig-defun ("do_something" "ACL_car_tires__do_something__SWIG_0" :type :function)
-  ((PARM0_n  :int ))
-  (:returning (:int )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_n))
-  (swig-ff-call SWIG_arg0)))
-    
-
- -

- The above interface file would cause packages foo, foo.car, and - foo.car.tires to be created. One would find the function wrapper - for do_something defined in the foo.car.tires package(*). -

- -

(*) Except for the package named by the module, all - namespace names are passed to the identifier-converter-function - as strings with a :type of :namespace. It is the - job of this function to generate the desired symbol, accounting for - case preferences, additional naming cues, etc. -

- -

- Note that packages created by swig-defpackage do not - use the COMMON-LISP or EXCL package. This reduces possible - conflicts when defining foreign types via the SWIG interface - in all but the toplevel modules package. This may - lead to confusion if, for example, the current package is - foo.car.tires and you attempt to use a common-lisp - function such as (car '(1 2 3). -

- -

20.3.2 Constants

- - - -

- Constants, as declared by the preprocessor #define macro or SWIG - %constant directive, are included in SWIG's parse tree - when it can be determined that they are, or could be reduced to, - a literal value. Such values are translated into defconstant - forms in the generated lisp wrapper when the -nocwrap command-line - options is used. Else, wrapper functions are generated as in the - case of variable access (see section below). -

-

- Here are examples of simple preprocessor constants when using -nocwrap. -

-
-
-#define A 1                    => (swig-defconstant "A" 1)  
-#define B 'c'                  => (swig-defconstant "B" #\c)
-#define C B                    => (swig-defconstant "C" #\c)
-#define D 1.0e2                => (swig-defconstant "D" 1.0d2)
-#define E 2222                 => (swig-defconstant "E" 2222)
-#define F (unsigned int)2222   => no code generated
-#define G 1.02e2f              => (swig-defconstant "G" 1.02f2)
-#define H foo                  => no code generated
-      
-
- -

- Note that where SWIG is unable to determine if a constant is - a literal, no node is added to the SWIG parse tree, and so - no values can be generated. -

- -

- For preprocessor constants containing expressions which can be - reduced to literal values, nodes are created, but with no simplification - of the constant value. A very very simple infix to prefix converter - has been implemented that tries to do the right thing for simple cases, but - does not for more complex expressions. If the literal parser determines - that something is wrong, a warning will be generated and the literal - expression will be included in the generated code, but commented out. -

- -
-
-#define I A + E                => (swig-defconstant "I" (+ 1 2222))
-#define J 1|2                  => (swig-defconstant "J" (logior 1 2))
-#define Y 1 + 2 * 3 + 4        => (swig-defconstant "Y" (* (+ 1 2) (+ 3 4)))
-#define Y1 (1 + 2) * (3 + 4)   => (swig-defconstant "Y1" (* (+ 1 2) (+ 3 4)))
-#define Y2 1 * 2 + 3 * 4       => (swig-defconstant "Y2" (* 1 (+ 2 3) 4))  ;; WRONG
-#define Y3 (1 * 2) + (3 * 4)   => (swig-defconstant "Y3" (* 1 (+ 2 3) 4))  ;; WRONG
-#define Z 1 + 2 - 3 + 4 * 5    => (swig-defconstant "Z" (* (+ 1 (- 2 3) 4) 5)) ;; WRONG
-      
-
-

- Users are cautioned to get to know their constants before use, or - not use the -nocwrap command-line option. -

- -

20.3.3 Variables

- - -

- For C wrapping, a def-foreign-variable call is generated for access - to global variables. -

-

- When wrapping C++ code, both global and member variables, getter - wrappers are generated for accessing their value, and if not immutable, - setter wrappers as well. In the example below, note the lack of a - setter wrapper for global_var, defined as const. -

- -
vars.h -
-namespace nnn {
-  int const global_var = 2;
-  float glob_float = 2.0;
-}
-    
-
- -

- Generated code: -

-
vars.cl -
-(swig-in-package ("nnn"))
-(swig-defun ("global_var" "ACL_nnn__global_var_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning (:int )
-   :strings-convert t)
-  (swig-ff-call))
-
-
-(swig-defun ("glob_float" "ACL_nnn__glob_float_set__SWIG_0" :type :setter)
-  ((PARM0_glob_float  :float ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_glob_float))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("glob_float" "ACL_nnn__glob_float_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning (:float )
-   :strings-convert t)
-  (swig-ff-call))
-    
-
- -

- Note also, that where applicable, setter wrappers are implemented - as setf methods on the getter function, providing a lispy interface - to the foreign code. -

- -
-
-user> (load "globalvar.dll")
-; Foreign loading globalvar.dll.
-t
-user> (load "globalvar.cl")
-; Loading c:\mikel\src\swig\test\globalvar.cl
-t
-user> 
-globalvar> (globalvar.nnn::global_var)
-2
-globalvar> (globalvar.nnn::glob_float)
-2.0
-globalvar> (setf (globalvar.nnn::glob_float) 3.0)
-3.0
-globalvar> (globalvar.nnn::glob_float)
-3.0
-    
-
- -

20.3.4 Enumerations

- - -

- In C, an enumeration value is an integer value, while in C++ an - enumeration value is implicitly convertible to an integer value, - but can also be distinguished by its enum type. For each enum - declaration a def-foreign-type is generated, assigning the enum - a default type of :int. Users may adjust the foreign type of - enums via SWIG typemaps. -

- -

- Enum values are a bit trickier as they can be initialized using - any valid C/C++ expression. In C with the -nocwrap command-line option, - we handle the typical cases (simple integer initialization) and - generate a defconstant form for each enum value. This has the advantage - of it not being necessary to probe into foreign space to retrieve enum - values. When generating a .cxx wrapper file, a more general solution is - employed. A wrapper variable is created in the module_wrap.cxx file, and - a ff:def-foreign-variable call is generated to retrieve its value into lisp. -

- -

For example, the following header file -

enum.h: -
-enum COL { RED, GREEN, BLUE };
-enum FOO { FOO1 = 10, FOO2, FOO3 };
-      
-
-

- In -nocwrap mode, generates -

-
enum.cl: -
-(swig-def-foreign-type "COL" :int)
-(swig-defconstant "RED" 0)
-(swig-defconstant "GREEN" (+ #.(swig-insert-id "RED" () :type :constant) 1))
-(swig-defconstant "BLUE" (+ #.(swig-insert-id "GREEN" () :type :constant) 1))
-
-(swig-def-foreign-type "FOO" :int)
-(swig-defconstant "FOO1" 10)
-(swig-defconstant "FOO2" (+ #.(swig-insert-id "FOO1" () :type :constant) 1))
-(swig-defconstant "FOO3" (+ #.(swig-insert-id "FOO2" () :type :constant) 1))
-      
-
- -

And when generating a .cxx wrapper -

enum_wrap.cxx: -
-EXPORT const int ACL_ENUM___RED__SWIG_0 = RED;
-EXPORT const int ACL_ENUM___GREEN__SWIG_0 = GREEN;
-EXPORT const int ACL_ENUM___BLUE__SWIG_0 = BLUE;
-EXPORT const int ACL_ENUM___FOO1__SWIG_0 = FOO1;
-EXPORT const int ACL_ENUM___FOO2__SWIG_0 = FOO2;
-EXPORT const int ACL_ENUM___FOO3__SWIG_0 = FOO3;
-      
-
-

- and -

-
enum.cl: -
-(swig-def-foreign-type "COL" :int)
-(swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
-(swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
-(swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
-
-(swig-def-foreign-type "FOO" :int)
-(swig-defvar "FOO1" "ACL_ENUM___FOO1__SWIG_0" :type :constant)
-(swig-defvar "FOO2" "ACL_ENUM___FOO2__SWIG_0" :type :constant)
-(swig-defvar "FOO3" "ACL_ENUM___FOO3__SWIG_0" :type :constant)
-
-      
-
- -

20.3.5 Arrays

- - -

- One limitation in the Allegro CL foreign-types module, is that, - without macrology, expressions may not be used to specify the - dimensions of an array declaration. This is not a horrible - drawback unless it is necessary to allocate foreign structures - based on the array declaration using ff:allocate-fobject. When it - can be determined that an array bound is a valid numeric value, - SWIG will include this in the generated array declaration on the - lisp side, otherwise the value will be included, but commented out. -

- -

- Below is a comprehensive example, showing a number of legal - C/C++ array declarations and how they are translated - into foreign-type specifications in the generated lisp code. -

-
array.h -
-#define MAX_BUF_SIZE 1024
-
-namespace FOO {
-  int global_var1[13];
-  float global_var2[MAX_BUF_SIZE];
-
-}
-
-enum COLOR { RED = 10, GREEN = 20, BLUE, PURPLE = 50, CYAN };
-
-namespace BAR {
-  char global_var3[MAX_BUF_SIZE + 1];
-  float global_var4[MAX_BUF_SIZE][13];
-  signed short global_var5[MAX_BUF_SIZE + MAX_BUF_SIZE];
-
-  int enum_var5[GREEN];
-  int enum_var6[CYAN];
-
-  COLOR enum_var7[CYAN][MAX_BUF_SIZE];
-}
-    
-
- -

- Generates: -

- -
array.cl -
-(in-package #.*swig-module-name*)
-
-(swig-defpackage ("FOO"))
-(swig-defpackage ("BAR"))
-
-(swig-in-package ())
-(swig-def-foreign-type "COLOR" :int)
-(swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
-(swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
-(swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
-(swig-defvar "PURPLE" "ACL_ENUM___PURPLE__SWIG_0" :type :constant)
-(swig-defvar "CYAN" "ACL_ENUM___CYAN__SWIG_0" :type :constant)
-
-(swig-in-package ())
-
-(swig-defconstant "MAX_BUF_SIZE" 1024)
-(swig-in-package ("FOO"))
-
-(swig-defun ("global_var1" "ACL_FOO__global_var1_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning ((* :int) )
-   :strings-convert t)
-  (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
-
-
-(swig-defun ("global_var2" "ACL_FOO__global_var2_set__SWIG_0" :type :setter)
-  ((global_var2  (:array :float 1024) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var2))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-in-package ())
-(swig-in-package ("BAR"))
-(swig-defun ("global_var3" "ACL_BAR__global_var3_set__SWIG_0" :type :setter)
-  ((global_var3  (:array :char #|1024+1|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var3))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("global_var4" "ACL_BAR__global_var4_set__SWIG_0" :type :setter)
-  ((global_var4  (:array (:array :float 13) 1024) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var4))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("global_var4" "ACL_BAR__global_var4_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning ((* (:array :float 13)) )
-   :strings-convert t)
-  (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
-
-
-(swig-defun ("global_var5" "ACL_BAR__global_var5_set__SWIG_0" :type :setter)
-  ((global_var5  (:array :short #|1024+1024|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 global_var5))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var5" "ACL_BAR__enum_var5_set__SWIG_0" :type :setter)
-  ((enum_var5  (:array :int #|GREEN|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 enum_var5))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var6" "ACL_BAR__enum_var6_set__SWIG_0" :type :setter)
-  ((enum_var6  (:array :int #|CYAN|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 enum_var6))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var7" "ACL_BAR__enum_var7_set__SWIG_0" :type :setter)
-  ((enum_var7  (:array (:array #.(swig-insert-id "COLOR" ()) 1024) #|CYAN|#) ))
-  (:returning (:void )
-   :strings-convert t)
-  (let ((SWIG_arg0 enum_var7))
-  (swig-ff-call SWIG_arg0)))
-
-
-(swig-defun ("enum_var7" "ACL_BAR__enum_var7_get__SWIG_0" :type :getter)
-  (:void)
-  (:returning ((* (:array #.(swig-insert-id "COLOR" ()) 1024)) )
-   :strings-convert t)
-  (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
-    
-
- -

20.3.6 Classes and Structs and Unions (oh my!)

- - -

20.3.6.1 CLOS wrapping of

- - -

- Classes, unions, and structs are all treated the same way by the - interface generator. For any of these objects, a - def-foreign-type and a defclass form are generated. For every - function that returns an object (or pointer/reference) of C/C++ - type X, the wrapping defun (or defmethod) on the Lisp - side will automatically wrap the pointer returned in an instance - of the appropriate class. This makes it much easier to write and - debug code than if pointers were passed around as a jumble of - integer values. -

- -

20.3.6.2 CLOS Inheritance

- - -

- The CLOS class schema generated by the interface mirrors the - inheritance of the classes in foreign code, with the - ff:foreign-pointer class at its root. ff:foreign-pointer is a thin - wrapper for pointers that is made available by the foreign function - interface. Its key benefit is that it may be passed as an argument - to any ff:def-foreign-call that is expecting a pointer as the - parameter. -

- -

20.3.6.3 Member fields and functions

- - -

- All public fields will have accessor getter/setter functions - generated for them, as appropriate. All public member functions - will have wrapper functions generated. -

- -

- We currently ignore anything that isn't public (i.e. - private or protected), because the C++ compiler - won't allow the wrapper functions to access such fields. Likewise, - the interface does nothing for friend directives, -

- -

20.3.6.4 Why not directly access C++ classes using foreign types?

- - -

- The def-foreign-type generated by the SWIG interface is - currently incomplete. We can reliably generate the object layout - of simple structs and unions; they can be allocated via - ff:allocate-fobject, and their member variables accessed - directly using the various ff:fslot-value-* functions. However, - the layout of C++ classes is more complicated. Different - compilers adjust class layout based on inheritance patterns, and - the presence of virtual member functions. The size of member - function pointers vary across compilers as well. As a result, it - is recommended that users of any generated interface not attempt - to access C++ instances via the foreign type system, but instead - use the more robust wrapper functions. -

- -

20.3.7 Templates

- - - -

20.3.7.1 Generating wrapper code for templates

- - -

-SWIG provides support for dealing with templates, but by -default, it will not generate any member variable or function -wrappers for templated classes. In order to create these -wrappers, you need to explicitly tell SWIG to instantiate -them. This is done via the -%template -directive. -

- -

20.3.7.2 Implicit Template instantiation

- - -

-While no wrapper code is generated for accessing member -variables, or calling member functions, type code is generated -to include these templated classes in the foreign-type and CLOS -class schema. -

- -

20.3.8 Typedef, Templates, and Synonym Types

- - -

- In C/C++ it is possible, via typedef, to have many names refer to - the same type. In general, this is not a problem, though - it can lead to confusion. Assume the below C++ header file: -

- -
synonyms.h -
-class A { 
-  int x;
-  int y;
-};
-
-typedef A Foo;
-
-A *xxx(int i);         /* sets A->x = A->y = i */
-Foo *yyy(int i);       /* sets Foo->x = Foo->y = i */
-
-int zzz(A *inst = 0);  /* return inst->x + inst->y */
-    
-
- -

- The function zzz is an overloaded functions; the - foreign function call to it will be wrapped in a - generic-function whose argument will be checked against a type - of A. Assuming a simple implementation, a call - to xxx(1) will return a pointer to an A object, which - will be wrapped in a CLOS instance of class A, and a - call to yyy(1) will result in a CLOS instance of - type Foo being returned. Without establishing a clear - type relationship between Foo and A, an - attempt to call zzz(yyy(1)) will result in an error. -

- -

- We resolve this issue, by noting synonym relationships between - types while generating the interface. A Primary type is selected - (more on this below) from the candidate list of synonyms. For - all other synonyms, instead of generating a distinct CLOS class - definition, we generate a form that expands to: -

-
- (setf (find-class <synonym>) <primary>) -
-

- The result is that all references to synonym types in foreign - code, are wrapped in the same CLOS wrapper, and, in particular, - method specialization in wrapping generic functions works as - expected. -

- -

- Given the above header file, synonym.h, a Lisp session would - appear as follows: -

-
-
-CL-USER> (load "synonym.dll")
-; Foreign loading synonym.dll.
-t
-CL-USER> (load "synonym.cl")
-; Loading c:\mikel\src\swig\test\synonym.cl
-t
-CL-USER> 
-synonym> (setf a (xxx 3))
-#<A nil #x3261a0 @ #x207299da>
-synonym> (setf foo (yyy 10))
-#<A nil #x3291d0 @ #x2072e982>
-synonym> (zzz a)
-6
-synonym> (zzz foo)
-20
-synonym> 
-    
-
- -

20.3.8.1 Choosing a primary type

- - -

- The choice of a primary type is selected by the following - criteria from a set of synonym types. -

-
    -
  • - If a synonym type has a class definition, it is the primary type. -
  • -
  • - If a synonym type is a class template and has been explicitly - instantiated via %template, it is the primary type. -
  • -
  • - For all other sets of synonymous types, the synonym which is - parsed first becomes the primary type. -
  • -
- -

20.3.9 Function overloading/Parameter defaulting

- - -

- For each possible argument combination, a distinct wrapper - function is created in the .cxx file. On the Lisp side, a - generic functions is defined for each possible arity the - overloaded/defaulted call may have. Each distinct wrapper is - then called from within a defmethod on the appropriate generic - function. These are further wrapped inside a dispatch function - that checks the number of arguments it is called with and passes - them via apply to the appropriate generic-function. This allows - for a single entry point to overloaded functions on the lisp - side. -

- -

Example: -

-
overload.h: -
-
-class A {
- public:
-  int x;
-  int y;
-};
-
-float xxx(int i, int x = 0);   /* return i * x */
-float xxx(A *inst, int x);     /* return x + A->x + A->y */
-    
-
- -

Creates the following three wrappers, for each of the possible argument - combinations -

-
overload_wrap.cxx -
-EXPORT void ACL___delete_A__SWIG_0 (A *larg1) {
-  A *arg1 = (A *) 0 ;
-
-  arg1 = larg1;
-  try {
-    delete arg1;
-
-  } catch (...) {
-
-  }
-}
-
-
-EXPORT float ACL___xxx__SWIG_0 (int larg1, int larg2) {
-  float lresult = (float)0 ;
-  int arg1 ;
-  int arg2 ;
-  float result;
-
-  arg1 = larg1;
-  arg2 = larg2;
-  try {
-    result = (float)xxx(arg1, arg2);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (float)0;
-  }
-}
-
-
-EXPORT float ACL___xxx__SWIG_1 (int larg1) {
-  float lresult = (float)0 ;
-  int arg1 ;
-  float result;
-
-  arg1 = larg1;
-  try {
-    result = (float)xxx(arg1);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (float)0;
-  }
-}
-
-
-EXPORT float ACL___xxx__SWIG_2 (A *larg1, int larg2) {
-  float lresult = (float)0 ;
-  A *arg1 = (A *) 0 ;
-  int arg2 ;
-  float result;
-
-  arg1 = larg1;
-  arg2 = larg2;
-  try {
-    result = (float)xxx(arg1, arg2);
-
-    lresult = result;
-    return lresult;
-  } catch (...) {
-    return (float)0;
-  }
-}
-    
-
- -

- And the following foreign-function-call and method definitions on the - lisp side: -

-
overload.cl -
-(swig-defmethod ("xxx" "ACL___xxx__SWIG_0" :type :function :arity 2)
-  ((PARM0_i cl:integer :int )
-   (PARM1_x cl:integer :int ))
-  (:returning (:float )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_i))
-  (let ((SWIG_arg1 PARM1_x))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-defmethod ("xxx" "ACL___xxx__SWIG_1" :type :function :arity 1)
-  ((PARM0_i cl:integer :int ))
-  (:returning (:float )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_i))
-  (swig-ff-call SWIG_arg0)))
-
-(swig-defmethod ("xxx" "ACL___xxx__SWIG_2" :type :function :arity 2)
-  ((PARM0_inst #.(swig-insert-id "A" () :type :class) (* #.(swig-insert-id "A" ())) )
-   (PARM1_x cl:integer :int ))
-  (:returning (:float )
-   :strings-convert t)
-  (let ((SWIG_arg0 PARM0_inst))
-  (let ((SWIG_arg1 PARM1_x))
-  (swig-ff-call SWIG_arg0 SWIG_arg1))))
-
-(swig-dispatcher ("xxx" :type :function :arities (1 2)))
-    
-
- -

And their usage in a sample lisp session: -

-
-
-overload> (setf a (new_A))
-#<A nil #x329268 @ #x206cf612>
-overload> (setf (A_x a) 10)
-10
-overload> (setf (A_y a) 20)
-20
-overload> (xxx 1)
-0.0
-overload> (xxx 3 10)
-30.0
-overload> (xxx a 1)
-31.0
-overload> (xxx a 2)
-32.0
-overload> 
-    
-
- -

20.3.10 Operator wrapping and Operator overloading

- - -

- Wrappers to defined C++ Operators are automatically renamed, using - %rename, to the following defaults: -

-
-
-/* name conversion for overloaded operators. */
-#ifdef __cplusplus
-%rename(__add__)             *::operator+;
-%rename(__pos__)             *::operator+();
-%rename(__pos__)             *::operator+() const;
-
-%rename(__sub__)             *::operator-;
-%rename(__neg__)             *::operator-() const;
-%rename(__neg__)             *::operator-();
-
-%rename(__mul__)             *::operator*;
-%rename(__deref__)           *::operator*();
-%rename(__deref__)           *::operator*() const;
-
-%rename(__div__)             *::operator/;
-%rename(__mod__)             *::operator%;
-%rename(__logxor__)          *::operator^;
-%rename(__logand__)          *::operator&;
-%rename(__logior__)          *::operator|;
-%rename(__lognot__)          *::operator~();
-%rename(__lognot__)          *::operator~() const;
-
-%rename(__not__)             *::operator!();
-%rename(__not__)             *::operator!() const;
-
-%rename(__assign__)          *::operator=;
-
-%rename(__add_assign__)      *::operator+=;
-%rename(__sub_assign__)      *::operator-=;
-%rename(__mul_assign__)      *::operator*=;
-%rename(__div_assign__)      *::operator/=;
-%rename(__mod_assign__)      *::operator%=;
-%rename(__logxor_assign__)   *::operator^=;
-%rename(__logand_assign__)   *::operator&=;
-%rename(__logior_assign__)   *::operator|=;
-
-%rename(__lshift__)          *::operator<<;
-%rename(__lshift_assign__)   *::operator<<=;
-%rename(__rshift__)          *::operator>>;
-%rename(__rshift_assign__)   *::operator>>=;
-
-%rename(__eq__)              *::operator==;
-%rename(__ne__)              *::operator!=;
-%rename(__lt__)              *::operator<;
-%rename(__gt__)              *::operator>;
-%rename(__lte__)             *::operator<=;
-%rename(__gte__)             *::operator>=;
-
-%rename(__and__)             *::operator&&;
-%rename(__or__)              *::operator||;
-
-%rename(__preincr__)         *::operator++();
-%rename(__postincr__)        *::operator++(int);
-%rename(__predecr__)         *::operator--();
-%rename(__postdecr__)        *::operator--(int);
-
-%rename(__comma__)           *::operator,();
-%rename(__comma__)           *::operator,() const;
-
-%rename(__member_ref__)      *::operator->;
-%rename(__member_func_ref__) *::operator->*;
-
-%rename(__funcall__)         *::operator();
-%rename(__aref__)            *::operator[];
-    
-
- -

- Name mangling occurs on all such renamed identifiers, so that wrapper name - generated by B::operator= will be B___eq__, i.e. - <class-or-namespace>_ has been added. Users may modify - these default names by adding %rename directives in their own .i files. -

- -

- Operator overloading can be achieved by adding functions based - on the mangled names of the function. In the following example, - a class B is defined with a Operator== method defined. The - swig %extend directive is used to add an overload method - on Operator==. -

- -
opoverload.h -
-class B {
- public:
-  int x;
-  int y;
-  bool operator==(B const& other) const;
-};
-    
-
- -

- and -

-
opoverload.i -
-%module opoverload
-
-%{
-#include <fstream>
-#include "opoverload.h"
-%}
-
-%{
-bool B___eq__(B const *inst, int const x)
-{
-  // insert the function definition into the wrapper code before
-  // the wrapper for it.
-  // ... do stuff ...
-}
-%}
-
-%include "opoverload.h"
-
-%extend B {
- public:
-  bool __eq__(int const x) const;
-};
-    
-
- -

- Either operator can be called via a single call - to the dispatch function: -

-
-
-opoverload> (B___eq__ x1 x2)
-nil
-opoverload> (B___eq__ x1 3)
-nil
-opoverload> 
-    
-
- -

20.3.11 Varargs

- - -

- Variable length argument lists are not supported, by default. If - such a function is encountered, a warning will generated to - stderr. Varargs are supported via the SWIG %varargs - directive. This directive allows you to specify a (finite) - argument list which will be inserted into the wrapper in place - of the variable length argument indicator. As an example, - consider the function printf(). Its declaration would - appear as follows: -

- -

- See the following section - on Variable Length arguments - provides examples on how %varargs can be used, along - with other ways such functions can be wrapped. -

- -

20.3.12 C++ Exceptions

- - -

- Each C++ wrapper includes a handler to catch any exceptions that may - be thrown while in foreign code. This helps prevent simple C++ errors - from killing the entire lisp process. There is currently no mechanism - to have these exceptions forwarded to the lisp condition system, nor - has any explicit support of the exception related SWIG typemaps been - implemented. -

- -

20.3.13 Pass by value, pass by reference

- - -

- Allegro CL does not support the passing of non-primitive foreign - structures by value. As a result, SWIG must automatically detect - and convert function parameters and return values to pointers - whenever necessary. This is done via the use of typemaps, - and should not require any fine tuning by the user, even for - newly defined types. -

- -

20.4 Typemaps

- - -

- SWIG Typemaps provide a powerful tool for automatically generating - code to handle various menial tasks required of writing an interface - to foreign code. The purpose of this section is to describe each of - the typemaps used by the Allegro CL module. Please read the chapter - on Typemaps for more information. -

- -

20.4.1 Code Generation in the C++ Wrapper

- - - -

- Every C++ wrapper generated by SWIG takes the following form: -

- -
-
-return-val wrapper-name(parm0, parm1, ..., parmN)
-{
-  return-val lresult;   /* return value from wrapper */
-  <local-declaration>
-  ... results;          /* return value from function call */
-
-  <binding locals to parameters>
-
-  try {
-    result = function-name(local0, local1, ..., localN);
-
-    <convert and bind result to lresult>
-
-    return lresult;
-  catch (...) {
-    return (int)0;
-  }
-    
-
- -

20.4.1.1 IN Typemap

- - -

- the in typemap is used to generate code to convert parameters - passed to C++ wrapper functions into the arguments desired for the - call being wrapped. That is, it fills in the code for the - <binding locals to parameters> section above. We - use this map to automatically convert parameters passed by - reference to the wrapper function into by-value arguments for - the wrapped call, and also to convert boolean values, which are - passed as integers from lisp (by default), into the appropriate - type for the language of code being wrapped. -

- -

These are the default specifications for the IN typemap. Here, - $input refers to the parameter code is being generated - for, and $1 is the local variable to which it is - being assigned. The default settings of this typemap are as follows: -

- -
-
-%typemap(in) bool                          "$1 = (bool)$input;";
-%typemap(in) char, unsigned char, signed char,
-             short, signed short, unsigned short,
-             int, signed int, unsigned int,
-             long, signed long, unsigned long,
-             float, double, long double, char *, void *, void,
-             enum SWIGTYPE, SWIGTYPE *,
-             SWIGTYPE[ANY], SWIGTYPE &     "$1 = $input;";
-%typemap(in) SWIGTYPE                      "$1 = *$input;";
-    
-
- -

20.4.1.2 OUT Typemap

- - -

- The out typemap is used to generate code to form the - return value of the wrapper from the return value of the wrapped - function. This code is placed in the <convert and bind result to lresult> - section of the above code diagram. Its default mapping is as follows: -

- -
-
-%typemap(out) bool                          "$result = (int)$1;";
-%typemap(out) char, unsigned char, signed char,
-              short, signed short, unsigned short,
-              int, signed int, unsigned int,
-              long, signed long, unsigned long,
-              float, double, long double, char *, void *, void,
-              enum SWIGTYPE, SWIGTYPE *,
-              SWIGTYPE[ANY], SWIGTYPE &    "$result = $1;";
-%typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
-    
-
- -

20.4.1.3 CTYPE Typemap

- - -

- This typemap is not used for code generation, but purely for the - transformation of types in the parameter list of the wrapper function. - Its primary use is to handle by-value to by-reference conversion in the - wrappers parameter list. Its default settings are: -

- -
-
-%typemap(ctype) bool                       "int";
-%typemap(ctype) char, unsigned char, signed char,
-                short, signed short, unsigned short,
-                int, signed int, unsigned int,
-                long, signed long, unsigned long,
-                float, double, long double, char *, void *, void,
-                enum SWIGTYPE, SWIGTYPE *,
-                SWIGTYPE[ANY], SWIGTYPE &  "$1_ltype";
-%typemap(ctype) SWIGTYPE                   "$&1_type";
-    
-
- -

- These three typemaps are specifically employed by the - Allegro CL interface generator. SWIG also implements a number of - other typemaps that can be used for generating code in the C/C++ - wrappers. You can read about - these common typemaps here. -

- -

20.4.2 Code generation in Lisp wrappers

- - -

- A number of custom typemaps have also been added to facilitate - the generation of code in the lisp side of the interface. These - are described below. The basic code generation structure is - applied as a series of nested expressions, one for each - parameter, then one for manipulating the return value, and last, - the foreign function call itself. -

- -

- Note that the typemaps below use fully qualified symbols where - necessary. Users writing their own typemaps should do likewise. - See the explanation in the last paragraph of - 16.3.1 Namespaces for details. -

- -

20.4.2.1 LIN Typemap

- - -

- The LIN typemap allows for the manipulating the lisp objects - passed as arguments to the wrapping defun before passing them to - the foreign function call. For example, when passing lisp - strings to foreign code, it is often necessary to copy the - string into a foreign structure of type (:char *) of appropriate - size, and pass this copy to the foreign call. Using the LIN - typemap, one could arrange for the stack-allocation of a foreign - char array, copy your string into it, and not have to worry - about freeing the copy after the function returns. -

- -

The LIN typemap accepts the following $variable references. -

-
    -
  • $in - expands to the name of the parameter being - applied to this typemap -
  • -
  • $out - expands to the name of the local variable - assigned to this typemap -
  • -
  • $in_fftype - the foreign function type of the C type.
  • -
  • $*in_fftype - the foreign function type of the C type - with one pointer removed. If there is no pointer, then $*in_fftype - is the same as $in_fftype. -
  • -
  • $body - very important. Instructs SWIG where - subsequent code generation steps should be inserted into the - current typemap. Leaving out a $body reference - will result in lisp wrappers that do very little by way of - calling into foreign code. Not recommended. -
  • -
- -
-
-%typemap(lin) SWIGTYPE "(cl:let (($out $in))\n  $body)";
-    
-
- -

20.4.2.2 LOUT Typemap

- - -

- The LOUT typemap is the means by which we effect the wrapping of - foreign pointers in CLOS instances. It is applied after all LIN - typemaps, and immediately before the actual foreign-call. -

- -

The LOUT typemap uses the following $variable -

-
    -
  • $lclass - Expands to the CLOS class that - represents foreign-objects of the return type matching this - typemap. -
  • -
  • $body - Same as for the LIN map. Place this - variable where you want the foreign-function call to occur. -
  • -
  • $ldestructor - Expands to the symbol naming the destructor for this - class ($lclass) of object. Allows you to insert finalization or automatic garbage - collection into the wrapper code (see default mappings below). -
  • -
- -
-
-%typemap(lout) bool, char, unsigned char, signed char,
-               short, signed short, unsigned short,
-               int, signed int, unsigned int,
-               long, signed long, unsigned long,
-               float, double, long double, char *, void *, void,
-               enum SWIGTYPE    "$body";
-%typemap(lout) SWIGTYPE[ANY], SWIGTYPE *,
-               SWIGTYPE &       "(cl:make-instance '$lclass :foreign-address $body)";
-%typemap(lout) SWIGTYPE    "(cl:let* ((address $body)\n
-                            (ACL_result (cl:make-instance '$lclass :foreign-address address)))\n
-                            (cl:unless (cl::zerop address)\n
-                            (excl:schedule-finalization ACL_result #'$ldestructor))\n
-                             ACL_result)";
-    
-
- -

20.4.2.3 FFITYPE Typemap

- - - -

- The FFITYPE typemap works as a helper for a body of code that - converts C/C++ type specifications into Allegro CL foreign-type - specifications. These foreign-type specifications appear in - ff:def-foreing-type declarations, and in the argument list and - return values of ff:def-foreign-calls. You would modify this - typemap if you want to change how the FFI passes through - arguments of a given type. For example, if you know that a - particular compiler represents booleans as a single byte, you - might add an entry for: -

- -
-
-%typemap(ffitype) bool ":unsigned-char";
-    
-
- -

- Note that this typemap is pure type transformation, and is not - used in any code generations step the way the LIN and LOUT - typemaps are. The default mappings for this typemap are: -

- -
-
-%typemap(ffitype) bool ":int";
-%typemap(ffitype) char ":char";
-%typemap(ffitype) unsigned char ":unsigned-char";
-%typemap(ffitype) signed char ":char";
-%typemap(ffitype) short, signed short ":short";
-%typemap(ffitype) unsigned short ":unsigned-short";
-%typemap(ffitype) int, signed int ":int";
-%typemap(ffitype) unsigned int ":unsigned-int";
-%typemap(ffitype) long, signed long ":long";
-%typemap(ffitype) unsigned long ":unsigned-long";
-%typemap(ffitype) float ":float";
-%typemap(ffitype) double ":double";
-%typemap(ffitype) char * "(* :char)";
-%typemap(ffitype) void * "(* :void)";
-%typemap(ffitype) void ":void";
-%typemap(ffitype) enum SWIGTYPE ":int";
-%typemap(ffitype) SWIGTYPE & "(* :void)";
-    
-
- -

20.4.2.4 LISPTYPE Typemap

- - -

- This is another type only transformation map, and is used to - provide the lisp-type, which is the optional third argument in - argument specifier in a ff:def-foreign-call form. Specifying a - lisp-type allows the foreign call to perform type checking on - the arguments passed in. The default entries in this typemap are: -

- -
-
-%typemap(lisptype) bool "cl:boolean";
-%typemap(lisptype) char "cl:character";
-%typemap(lisptype) unsigned char "cl:integer";
-%typemap(lisptype) signed char "cl:integer";
-    
-
- -

20.4.2.5 LISPCLASS Typemap

- - -

- The LISPCLASS typemap is used to generate the method signatures - for the generic-functions which wrap overloaded functions and - functions with defaulted arguments. The default entries are: -

- -
-
-%typemap(lispclass) bool "t";
-%typemap(lispclass) char "cl:character";
-%typemap(lispclass) unsigned char, signed char,
-                    short, signed short, unsigned short,
-                    int, signed int, unsigned int,
-                    long, signed long, unsigned long,
-                    enum SWIGTYPE       "cl:integer";
-%typemap(lispclass) float "cl:single-float";
-%typemap(lispclass) double "cl:double-float";
-%typemap(lispclass) char * "cl:string";
-    
-
- -

20.4.3 Modifying SWIG behavior using typemaps

- - -

- The following example shows how we made use of the above - typemaps to add support for the wchar_t type. -

- -
-
-%typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
-
-%typemap(in)        wchar_t "$1 = $input;";
-%typemap(lin)       wchar_t "(cl:let (($out (cl:char-code $in)))\n  $body)";
-%typemap(lin)       wchar_t* "(excl:with-native-string
-                                         ($out $in
-                                          :external-format #+little-endian :fat-le 
-                                                           #-little-endian :fat)\n
-                                 $body)"
-
-%typemap(out)       wchar_t "$result = $1;";
-%typemap(lout)      wchar_t "(cl:code-char $body)";
-%typemap(lout)      wchar_t* "(excl:native-to-string $body
-                                          :external-format #+little-endian :fat-le
-                                                           #-little-endian :fat)";
-
-%typemap(ffitype)   wchar_t ":unsigned-short";
-%typemap(lisptype)  wchar_t "";
-%typemap(ctype)     wchar_t "wchar_t";
-%typemap(lispclass) wchar_t "cl:character";
-%typemap(lispclass) wchar_t* "cl:string";
-    
-
- -

20.5 Identifier Converter functions

- - -

20.5.1 Creating symbols in the lisp environment

- - -

- Various symbols must be generated in the lisp environment to which - class definitions, functions, constants, variables, etc. must be - bound. Rather than force a particular convention for naming these - symbols, an identifier (to symbol) conversion function is used. A - user-defined identifier-converter can then implement any symbol - naming, case-modifying, scheme desired. -

- -

- In generated SWIG code, whenever some interface object must be - referenced by its lisp symbol, a macro is inserted that calls the - identifier-converter function to generate the appropriate symbol - reference. It is therefore expected that the identifier-converter - function reliably return the same (eq) symbol given the same set - of arguments. -

- -

20.5.2 Existing identifier-converter functions

- - -

Two basic identifier routines have been defined. -

20.5.2.1 identifier-convert-null

- - -

- No modification of the identifier string is performed. Based on - other arguments, the identifier may be concatenated with other - strings, from which a symbol will be created. -

- -

20.5.2.2 identifier-convert-lispify

- - -

- All underscores in the identifier string are converted to - hyphens. Otherwise, identifier-convert-lispify performs the - same symbol transformations. -

- -

20.5.2.3 Default identifier to symbol conversions

- - -

- Check the definitions of the above two default - identifier-converters in Lib/allegrocl/allegrocl.swg for - default naming conventions. -

- -

20.5.3 Defining your own identifier-converter

- - -

- A user-defined identifier-converter function should conform to the following - specification: -

- -
-
-(defun identifier-convert-fn (id &key type class arity) ...body...)
-result ==> symbol or (setf symbol)
-
-
- -

The ID argument is a string representing an identifier in the -foreign environment. -

- -

-The :type keyword argument provides more information on the type of -identifier. Its value is a symbol. This allows the -identifier-converter to apply different heuristics when mapping -different types of identifiers to symbols. SWIG will generate calls -to your identifier-converter using the following types. -

- -
    -
  • :class - names a CLOS class.
  • -
  • :constant - names a defconstant
  • -
  • :constructor - names a function for creating a foreign object
  • -
  • :destructor - names a function for freeing a foreign object
  • -
  • :function - names a CLOS wrapping defmethod or defun.
  • -
  • :ff-operator - names a foreign call defined via ff:def-foreign-call
  • -
  • :getter - getter function
  • -
  • :namespace - names a C++ namespace
  • -
  • :setter - names a setter function. May return a (setf symbol) reference
  • -
  • :operator - names a C++ operator, such as Operator=, Operator*.
  • -
  • :slot - names a slot in a struct/class/union declaration.
  • -
  • :type - names a foreign-type defined via ff:def-foreign-type.
  • -
  • :variable - names a variable defined via ff:def-foreign-variable.
  • -
- -

-The :class keyword argument is a string naming a foreign -class. When non-nil, it indicates that the current identifier has -scope in the specified class. -

- -

-The :arity keyword argument only appears in swig:swig-defmethod forms -generated for overloaded functions. Its value is an integer -indicating the number of arguments passed to the routine indicated by -this identifier. -

- -

20.5.4 Instructing SWIG to use a particular identifier-converter

- - -

- By default, SWIG will use identifier-converter-null. To specify - another convert function, use the -identifier-converter - command-line argument. The value should be a string naming the - function you wish the interface to use instead, when generating - symbols. ex: -

- -
-
-% swig -allegrocl -c++ -module mymodule -identifier-converter my-identifier-converter
-
-
- - - - diff --git a/Doc/Manual/Android.html b/Doc/Manual/Android.html index 944a88d65..da475e9a4 100644 --- a/Doc/Manual/Android.html +++ b/Doc/Manual/Android.html @@ -6,7 +6,7 @@ -

21 SWIG and Android

+

22 SWIG and Android

-

12.1.3 Output parameters

+

13.1.3 Output parameters

@@ -315,7 +315,7 @@ iresult, dresult = foo(3.5, 2) -

12.1.4 Input/Output parameters

+

13.1.4 Input/Output parameters

@@ -380,7 +380,7 @@ rather than directly overwriting the value of the original input object. SWIG. Backwards compatibility is preserved, but deprecated.

-

12.1.5 Using different names

+

13.1.5 Using different names

@@ -414,7 +414,7 @@ Typemap declarations are lexically scoped so a typemap takes effect from the poi file or a matching %clear declaration.

-

12.2 Applying constraints to input values

+

13.2 Applying constraints to input values

@@ -424,7 +424,7 @@ insure that a value is positive, or that a pointer is non-NULL. This can be accomplished including the constraints.i library file.

-

12.2.1 Simple constraint example

+

13.2.1 Simple constraint example

@@ -450,7 +450,7 @@ the arguments violate the constraint condition, a scripting language exception will be raised. As a result, it is possible to catch bad values, prevent mysterious program crashes and so on.

-

12.2.2 Constraint methods

+

13.2.2 Constraint methods

@@ -466,7 +466,7 @@ NONNULL Non-NULL pointer (pointers only). -

12.2.3 Applying constraints to new datatypes

+

13.2.3 Applying constraints to new datatypes

diff --git a/Doc/Manual/CCache.html b/Doc/Manual/CCache.html index edd435fa1..1a94709ae 100644 --- a/Doc/Manual/CCache.html +++ b/Doc/Manual/CCache.html @@ -7,7 +7,7 @@ -

20 Using SWIG with ccache - ccache-swig(1) manpage

+

21 Using SWIG with ccache - ccache-swig(1) manpage

-

20.14 HISTORY

+

21.14 HISTORY

@@ -423,7 +423,7 @@ I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version.

-

20.15 DIFFERENCES FROM COMPILERCACHE

+

21.15 DIFFERENCES FROM COMPILERCACHE

@@ -441,7 +441,7 @@ are:

  • ccache avoids a double call to cpp on a cache miss

    -

    20.16 CREDITS

    +

    21.16 CREDITS

    @@ -453,7 +453,7 @@ Thanks to the following people for their contributions to ccache

  • Paul Russell for many suggestions and the debian packaging

    -

    20.17 AUTHOR

    +

    21.17 AUTHOR

    diff --git a/Doc/Manual/CPlusPlus11.html b/Doc/Manual/CPlusPlus11.html index 11335a251..e5d7fbc2d 100644 --- a/Doc/Manual/CPlusPlus11.html +++ b/Doc/Manual/CPlusPlus11.html @@ -336,6 +336,10 @@ int i; int j; decltype(i+j) k; // syntax error

  • +

    SWIG does not support auto as a type specifier for variables, only +for specifying the return type of lambdas +and functions.

    +

    7.2.7 Range-based for-loop

    diff --git a/Doc/Manual/CPlusPlus20.html b/Doc/Manual/CPlusPlus20.html new file mode 100644 index 000000000..0a8b0027f --- /dev/null +++ b/Doc/Manual/CPlusPlus20.html @@ -0,0 +1,42 @@ + + + +SWIG and C++20 + + + + + +

    10 SWIG and C++20

    + + + + + + +

    10.1 Introduction

    + + +

    This chapter gives you a brief overview about the SWIG +implementation of the C++20 standard. +Work has only just begun on adding C++20 support. +

    + +

    +Compatibility note: SWIG-4.1.0 is the first version to support any C++20 features. +

    + +

    10.2 Core language changes

    + + +

    10.3 Standard library changes

    + + + + diff --git a/Doc/Manual/CSharp.html b/Doc/Manual/CSharp.html index 1fc2d211e..fe8f7c4bd 100644 --- a/Doc/Manual/CSharp.html +++ b/Doc/Manual/CSharp.html @@ -6,7 +6,7 @@ -

    22 SWIG and C#

    +

    23 SWIG and C#

    @@ -556,7 +563,7 @@ Windows users can also get the examples working using a Cygwin or MinGW environment for automatic configuration of the example makefiles. Any one of the C# compilers (Mono or Microsoft) can be detected from within a Cygwin or Mingw environment if installed in your path. -

    22.3 Void pointers

    +

    23.3 Void pointers

    @@ -574,7 +581,7 @@ void * f(void *v); -

    22.4 C# Arrays

    +

    23.4 C# Arrays

    @@ -586,7 +593,7 @@ with one of the following three approaches; namely the SWIG C arrays library, P/ pinned arrays.

    -

    22.4.1 The SWIG C arrays library

    +

    23.4.1 The SWIG C arrays library

    @@ -623,7 +630,7 @@ example.print_array(c.cast()); // Pass to C -

    22.4.2 Managed arrays using P/Invoke default array marshalling

    +

    23.4.2 Managed arrays using P/Invoke default array marshalling

    @@ -750,7 +757,7 @@ and intermediary class method -

    22.4.3 Managed arrays using pinning

    +

    23.4.3 Managed arrays using pinning

    @@ -845,7 +852,7 @@ public static extern void myArrayCopy(global::System.IntPtr jarg1, global::Syste -

    22.5 C# Exceptions

    +

    23.5 C# Exceptions

    @@ -942,7 +949,7 @@ set so should only be used when a C# exception is not created.

    -

    22.5.1 C# exception example using "check" typemap

    +

    23.5.1 C# exception example using "check" typemap

    @@ -1124,7 +1131,7 @@ method and C# code does not handle pending exceptions via the canthrow attribute Actually it will issue this warning for any function beginning with SWIG_CSharpSetPendingException.

    -

    22.5.2 C# exception example using %exception

    +

    23.5.2 C# exception example using %exception

    @@ -1189,7 +1196,7 @@ The managed code generated does check for the pending exception as mentioned ear -

    22.5.3 C# exception example using exception specifications

    +

    23.5.3 C# exception example using exception specifications

    @@ -1245,7 +1252,7 @@ SWIGEXPORT void SWIGSTDCALL CSharp_evensonly(int jarg1) { Multiple catch handlers are generated should there be more than one exception specifications declared.

    -

    22.5.4 Custom C# ApplicationException example

    +

    23.5.4 Custom C# ApplicationException example

    @@ -1379,7 +1386,7 @@ try { -

    22.6 C# Directors

    +

    23.6 C# Directors

    @@ -1392,7 +1399,7 @@ The following sections provide information on the C# director implementation and However, the Java directors section should also be read in order to gain more insight into directors.

    -

    22.6.1 Directors example

    +

    23.6.1 Directors example

    @@ -1513,7 +1520,7 @@ CSharpDerived - UIntMethod(123) -

    22.6.2 Directors implementation

    +

    23.6.2 Directors implementation

    @@ -1721,7 +1728,7 @@ before SWIG parses the Base class will change all the delegates to internal< -

    22.6.3 Director caveats

    +

    23.6.3 Director caveats

    @@ -1769,7 +1776,7 @@ However, a call from C# to CSharpDefaults.DefaultMethod() will of cours should pass the call on to CSharpDefaults.DefaultMethod(int)using the C++ default value, as shown above.

    -

    22.7 Multiple modules

    +

    23.7 Multiple modules

    @@ -1804,7 +1811,7 @@ the [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrows if you don't want users to easily stumble upon these so called 'internal workings' of the wrappers.

    -

    22.8 C# Typemap examples

    +

    23.8 C# Typemap examples

    This section includes a few examples of typemaps. For more examples, you @@ -1812,7 +1819,7 @@ might look at the files "csharp.swg" and "typemaps.i" in the SWIG library. -

    22.8.1 Memory management when returning references to member variables

    +

    23.8.1 Memory management when returning references to member variables

    @@ -1936,7 +1943,7 @@ public class Bike : global::System.IDisposable { Note the addReference call.

    -

    22.8.2 Memory management for objects passed to the C++ layer

    +

    23.8.2 Memory management for objects passed to the C++ layer

    @@ -2068,7 +2075,7 @@ as mentioned earlier, setElement is actually: -

    22.8.3 Date marshalling using the csin typemap and associated attributes

    +

    23.8.3 Date marshalling using the csin typemap and associated attributes

    @@ -2354,7 +2361,7 @@ public class example { -

    22.8.4 A date example demonstrating marshalling of C# properties

    +

    23.8.4 A date example demonstrating marshalling of C# properties

    @@ -2454,7 +2461,7 @@ Some points to note:

  • The 'csin' typemap has 'pre', 'post' and 'cshin' attributes, and these are all ignored in the property set. The code in these attributes must instead be replicated within the 'csvarin' typemap. The line creating the temp$csinput variable is such an example; it is identical to what is in the 'pre' attribute. -

    22.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    +

    23.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    @@ -2516,7 +2523,7 @@ Pay special attention to the memory management issues, using these attributes.

    -

    22.8.6 Turning proxy classes into partial classes

    +

    23.8.6 Turning proxy classes into partial classes

    @@ -2616,7 +2623,7 @@ demonstrating that the class contains methods calling both unmanaged code - The following example is an alternative approach to adding managed code to the generated proxy class.

    -

    22.8.7 Turning proxy classes into sealed classes

    +

    23.8.7 Turning proxy classes into sealed classes

    @@ -2706,7 +2713,7 @@ Either suppress the warning or modify the generated code by copying and tweaking 'csbody' typemap code in csharp.swg by modifying swigCMemOwn to not be protected.

    -

    22.8.8 Extending proxy classes with additional C# code

    +

    23.8.8 Extending proxy classes with additional C# code

    @@ -2745,7 +2752,7 @@ public class ExtendMe : global::System.IDisposable { -

    22.8.9 Underlying type for enums

    +

    23.8.9 Underlying type for enums

    diff --git a/Doc/Manual/Chicken.html b/Doc/Manual/Chicken.html deleted file mode 100644 index 3a80811bd..000000000 --- a/Doc/Manual/Chicken.html +++ /dev/null @@ -1,597 +0,0 @@ - - - -SWIG and Chicken - - - - - - -

    23 SWIG and Chicken

    - - - - - - -

    - This chapter describes SWIG's support of CHICKEN. CHICKEN is a - Scheme-to-C compiler supporting most of the language features as - defined in the Revised^5 Report on Scheme. Its main - attributes are that it -

    - -
      -
    1. generates portable C code
    2. -
    3. includes a customizable interpreter
    4. -
    5. links to C libraries with a simple Foreign Function Interface
    6. -
    7. supports full tail-recursion and first-class continuations
    8. -
    - -

    - When confronted with a large C library, CHICKEN users can use - SWIG to generate CHICKEN wrappers for the C library. However, - the real advantages of using SWIG with CHICKEN are its - support for C++ -- object-oriented code is - difficult to wrap by hand in CHICKEN -- and its typed - pointer representation, essential for C and C++ - libraries involving structures or classes. - -

    - -

    23.1 Preliminaries

    - - -

    - CHICKEN support was introduced to SWIG in version 1.3.18. SWIG - relies on some recent additions to CHICKEN, which are only - present in releases of CHICKEN with version number - greater than or equal to 1.89. - To use a chicken version between 1.40 and 1.89, see the Garbage collection - section below. -

    - -

    - You may want to look at any of the examples in Examples/chicken/ - directory for the basic steps to run SWIG CHICKEN. -

    - -

    23.1.1 Running SWIG in C mode

    - - -

    - To run SWIG CHICKEN in C mode, use - the -chicken option. -

    - -
    -
    % swig -chicken example.i
    -
    - -

    - To allow the wrapper to take advantage of future CHICKEN code - generation improvements, part of the wrapper is direct CHICKEN - function calls (example_wrap.c) and part is CHICKEN - Scheme (example.scm). The basic Scheme code must - be compiled to C using your system's CHICKEN compiler or - both files can be compiled directly using the much simpler csc. -

    - -
    -
    -% chicken example.scm -output-file oexample.c
    -
    -
    - -

    - So for the C mode of SWIG CHICKEN, example_wrap.c and - oexample.c are the files that must be compiled to - object files and linked into your project. -

    - -

    23.1.2 Running SWIG in C++ mode

    - - -

    - To run SWIG CHICKEN in C++ mode, use - the -chicken -c++ option. -

    - -
    -
    % swig -chicken -c++ example.i
    -
    - -

    - This will generate example_wrap.cxx and - example.scm. The basic Scheme code must be - compiled to C using your system's CHICKEN compiler or - both files can be compiled directly using the much simpler csc. -

    - -
    -
    % chicken example.scm -output-file oexample.c
    -
    - -

    - So for the C++ mode of SWIG CHICKEN, example_wrap.cxx - and oexample.c are the files that must be compiled to - object files and linked into your project. -

    - -

    23.2 Code Generation

    - - -

    23.2.1 Naming Conventions

    - - -

    - Given a C variable, function or constant declaration named - Foo_Bar, the declaration will be available - in CHICKEN as an identifier ending with - Foo-Bar. That is, an underscore is converted - to a dash. -

    - -

    - You may control what the CHICKEN identifier will be by using the - %rename SWIG directive in the SWIG interface file. -

    - -

    23.2.2 Modules

    - - -

    - The name of the module must be declared one of two ways: -

      -
    • Placing %module example in the SWIG interface - file.
    • -
    • Using -module example on the SWIG command - line.
    • -
    - -

    - The generated example.scm file then exports (declare (unit modulename)). - If you do not want SWIG to export the (declare (unit modulename)), pass - the -nounit option to SWIG. - -

    - CHICKEN will be able to access the module using the (declare - (uses modulename)) CHICKEN Scheme form. -

    - -

    23.2.3 Constants and Variables

    - - -

    - Constants may be created using any of the four constructs in - the interface file: -

    -
      -
    1. #define MYCONSTANT1 ...
    2. -
    3. %constant int MYCONSTANT2 = ...
    4. -
    5. const int MYCONSTANT3 = ...
    6. -
    7. enum { MYCONSTANT4 = ... };
    8. -
    - -

    - In all cases, the constants may be accessed from within CHICKEN - using the form (MYCONSTANT1); that is, the constants - may be accessed using the read-only parameter form. -

    - -

    - Variables are accessed using the full parameter form. - For example, to set the C variable "int my_variable;", use the - Scheme form (my-variable 2345). To get the C variable, - use (my-variable). -

    - -

    - The %feature("constasvar") can be applied to any constant - or immutable variable. Instead of exporting the constant as - a function that must be called, the constant will appear as a - scheme variable. This causes the generated .scm file to just contain the code - (set! MYCONSTANT1 (MYCONSTANT1)). See - Features and the %feature directive - for info on how to apply the %feature. -

    - -

    23.2.4 Functions

    - - -

    - C functions declared in the SWIG interface file will have - corresponding CHICKEN Scheme procedures. For example, the C - function "int sqrt(double x);" will be available using the - Scheme form (sqrt 2345.0). A void return - value will give C_SCHEME_UNDEFINED as a result. -

    -

    - A function may return more than one value by using the - OUTPUT specifier (see Lib/chicken/typemaps.i). - They will be returned as multiple values using (values) if there is more than one - result (that is, a non-void return value and at least one argout - parameter, or a void return value and at least two argout - parameters). The return values can then be accessed with (call-with-values). -

    - -

    23.2.5 Exceptions

    - - -

    The SWIG chicken module has support for exceptions thrown from - C or C++ code to be caught in scheme. - See Exception handling with %exception - for more information about declaring exceptions in the interface file. -

    - -

    Chicken supports both the SWIG_exception(int code, const char *msg) interface - as well as a SWIG_ThrowException(C_word val) function for throwing exceptions from - inside the %exception blocks. SWIG_exception will throw a list consisting of the code - (as an integer) and the message. Both of these will throw an exception using (abort), - which can be handled by (handle-exceptions). See - the Chicken manual on Exceptions - and SFRI-12. Since the exception values are thrown - directly, if (condition-case) is used to catch an exception the exception will come through in the val () case. -

    - -

    The following simple module

    - -
    -%module exception_test
    -
    -%inline %{
    -  void test_throw(int i) throws (int) { 
    -    if (i == 1) throw 15; 
    -  }
    -%}
    -
    - -

    could be run with

    - -
    -(handle-exceptions exvar 
    -  (if (= exvar 15)
    -    (print "Correct!") 
    -    (print "Threw something else " exvar))
    -  (test-throw 1))
    -
    - - -

    23.3 TinyCLOS

    - - -

    - The author of TinyCLOS, Gregor Kiczales, describes TinyCLOS as: - "Tiny CLOS is a Scheme implementation of a 'kernelized' CLOS, with a - metaobject protocol. The implementation is even simpler than - the simple CLOS found in 'The Art of the Metaobject Protocol', - weighing in at around 850 lines of code, including (some) - comments and documentation." -

    - -

    - Almost all good Scheme books describe how to use metaobjects and - generic procedures to implement an object-oriented Scheme - system. Please consult a Scheme book if you are unfamiliar - with the concept. -

    - -

    - - CHICKEN has a modified version of TinyCLOS, which SWIG CHICKEN - uses if the -proxy argument is given. If -proxy is passed, then - the generated example.scm file will contain TinyCLOS class definitions. - A class named Foo is declared as <Foo>, and each member variable - is allocated a slot. Member functions are exported as generic functions. - -

    - - Primitive symbols and functions (the interface that would be presented if - -proxy was not passed) are hidden and no longer accessible. If the -unhideprimitive - command line argument is passed to SWIG, then the primitive symbols will be - available, but each will be prefixed by the string "primitive:" - -

    - - The exported symbol names can be controlled with the -closprefix and -useclassprefix arguments. - If -useclassprefix is passed to SWIG, every member function will be generated with the class name - as a prefix. If the -closprefix mymod: argument is passed to SWIG, then the exported functions will - be prefixed by the string "mymod:". If -useclassprefix is passed, -closprefix is ignored. - -

    - -

    23.4 Linkage

    - - -

    - Please refer to CHICKEN - A practical and portable Scheme - system - User's manual for detailed help on how to link - object files to create a CHICKEN Scheme program. Briefly, to - link object files, be sure to add `chicken-config - -extra-libs -libs` or `chicken-config -shared - -extra-libs -libs`to your linker options. Use the - -shared option if you want to create a dynamically - loadable module. You might also want to use the much simpler - csc or csc.bat. -

    - -

    Each scheme file that is generated - by SWIG contains (declare (uses modname)). This means that to load the - module from scheme code, the code must include (declare (uses modname)). -

    - - -

    23.4.1 Static binary or shared library linked at compile time

    - - -

    We can easily use csc to build a static binary.

    - -
    -
    -$ swig -chicken example.i
    -$ csc -v example.scm example_impl.c example_wrap.c test_script.scm -o example
    -$ ./example
    -
    -
    - -

    Similar to the above, any number of module.scm files could be compiled -into a shared library, and then that shared library linked when compiling the -main application.

    - -
    -
    -$ swig -chicken example.i
    -$ csc -sv example.scm example_wrap.c example_impl.c -o example.so
    -
    -
    - -

    The example.so file can then linked with test_script.scm when it -is compiled, in which case test_script.scm must have (declare (uses example)). -Multiple SWIG modules could have been linked into example.so and each -one accessed with a (declare (uses ... )). -

    - -
    -
    -$ csc -v test_script.scm -lexample
    -
    -
    - -

    An alternative is that the test_script.scm can have the code (load-library 'example "example.so"), -in which case the test script does not need to be linked with example.so. The test_script.scm file can then -be run with csi. -

    - -

    23.4.2 Building chicken extension libraries

    - - -

    Building a shared library like in the above section only works if the library -is linked at compile time with a script containing (declare (uses ...)) or is -loaded explicitly with (load-library 'example "example.so"). It is -not the format that CHICKEN expects for extension libraries and eggs. The problem is the -(declare (unit modname)) inside the modname.scm file. There are -two possible solutions to this.

    - -

    First, SWIG accepts a -nounit argument, in which case the (declare (unit modname)) -is not generated. Then, the modname.scm and modname_wrap.c files must be compiled into -their own shared library.

    - -
    -
    -$ csc -sv modname.scm modname_wrap.c modname_impl.c -o modname.so
    -
    -
    - -

    This library can then be loaded by scheme code with the (require 'modname) function. -See the -Loading-extension-libraries in the eval unit inside the CHICKEN manual for more information.

    - -

    Another alternative is to run SWIG normally and create a scheme file that contains (declare (uses modname)) -and then compile that file into the shared library as well. For example, inside the mod_load.scm file,

    - -
    -
    -(declare (uses mod1))
    -(declare (uses mod2))
    -
    -
    - -

    Which would then be compiled with

    - -
    -
    -$ swig -chicken mod1.i
    -$ swig -chicken mod2.i
    -$ csc -sv mod_load.scm mod1.scm mod2.scm mod1_wrap.c mod2_wrap.c mod1_impl.c mod2_impl.c -o mod.so
    -
    -
    - -

    Then the extension library can be loaded with (require 'mod). As we can see here, -mod_load.scm contains the code that gets executed when the module is loaded. All this code -does is load both mod1 and mod2. As we can see, this technique is more useful when you want to -combine a few SWIG modules into one chicken extension library, especially if modules are related by -%import

    - -

    In either method, the files that are compiled into the shared library could also be -packaged into an egg. The mod1_wrap.c and mod2_wrap.c files that are created by SWIG -are stand alone and do not need SWIG to be installed to be compiled. Thus the egg could be -distributed and used by anyone, even if SWIG is not installed.

    - -

    See the Examples/chicken/egg directory in the SWIG source for an example that builds -two eggs, one using the first method and one using the second method.

    - -

    23.4.3 Linking multiple SWIG modules with TinyCLOS

    - - -

    Linking together multiple modules that share type information using the %import -directive while also using -proxy is more complicated. For example, if mod2.i imports mod1.i, then the -mod2.scm file contains references to symbols declared in mod1.scm, -and thus a (declare (uses mod1)) or (require 'mod1) must be exported -to the top of mod2.scm. By default, when SWIG encounters an %import "modname.i" directive, -it exports (declare (uses modname)) into the scm file. This works fine unless mod1 was compiled with -the -nounit argument or was compiled into an extension library with other modules under a different name.

    - -

    One option is to override the automatic generation of (declare (uses mod1)) -by passing the -noclosuses option to SWIG when compiling mod2.i. -SWIG then provides the %insert(closprefix) %{ %} directive. Any scheme code inside that directive is inserted into the -generated .scm file, and if mod1 was compiled with -nounit, the directive should contain (require 'mod1). -This option allows for mixed loading as well, where some modules are imported with (declare (uses modname)) -(which means they were compiled without -nounit) and some are imported with (require 'modname).

    - -

    The other option is to use the second idea in the above section. Compile all the modules normally, without any -%insert(closprefix), -nounit, or -noclosuses. Then the modules will import each other correctly -with (declare (uses ...)). -To create an extension library or an egg, just create a module_load.scm file that (declare (uses ...)) -all the modules.

    - -

    23.5 Typemaps

    - - -

    - The Chicken module handles all types via typemaps. This information is - read from Lib/chicken/typemaps.i and - Lib/chicken/chicken.swg. -

    - -

    23.6 Pointers

    - - -

    - For pointer types, SWIG uses CHICKEN tagged pointers. - - A tagged pointer is an ordinary CHICKEN pointer with an - extra slot for a void *. With SWIG - CHICKEN, this void * is a pointer to a type-info - structure. So each pointer used as input or output from - the SWIG-generated CHICKEN wrappers will have type - information attached to it. This will let the wrappers - correctly determine which method should be called - according to the object type hierarchy exposed in the SWIG - interface files. -

    -

    - To construct a Scheme object from a C pointer, the wrapper code - calls the function - SWIG_NewPointerObj(void *ptr, swig_type_info *type, int owner), - The function that calls SWIG_NewPointerObj must have a variable declared - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - It is ok to call SWIG_NewPointerObj more than once, - just make sure known_space has enough space for all the created pointers. -

    -

    - To get the pointer represented by a CHICKEN tagged pointer, the - wrapper code calls the function - SWIG_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags), - passing a pointer to a struct representing the expected pointer - type. flags is either zero or SWIG_POINTER_DISOWN (see below). -

    - -

    23.6.1 Garbage collection

    - - -

    If the owner flag passed to SWIG_NewPointerObj is 1, NewPointerObj will add a - finalizer to the type which will call the destructor or delete method of - that type. The destructor and delete functions are no longer exported for - use in scheme code, instead SWIG and chicken manage pointers. - In situations where SWIG knows that a function is returning a type that should - be garbage collected, SWIG will automatically set the owner flag to 1. For other functions, - the %newobject directive must be specified for functions whose return values - should be garbage collected. See - Object ownership and %newobject for more information. -

    - -

    In situations where a C or C++ function will assume ownership of a pointer, and thus - chicken should no longer garbage collect it, SWIG provides the DISOWN input typemap. - After applying this typemap (see the Typemaps chapter for more information on how to apply typemaps), - any pointer that gets passed in will no longer be garbage collected. - An object is disowned by passing the SWIG_POINTER_DISOWN flag to SWIG_ConvertPtr. - Warning: Since the lifetime of the object is now controlled by the underlying code, the object might - get deleted while the scheme code still holds a pointer to it. Further use of this pointer - can lead to a crash. -

    - -

    Adding a finalizer function from C code was added to chicken in the 1.89 release, so garbage collection - does not work for chicken versions below 1.89. If you would like the SWIG generated code to work with - chicken 1.40 to 1.89, pass the -nocollection argument to SWIG. This will not export code - inside the _wrap.c file to register finalizers, and will then export destructor functions which - must be called manually. -

    - -

    23.7 Unsupported features and known problems

    - - -
      -
    • No director support.
    • -
    • No support for c++ standard types like std::vector.
    • -
    • The TinyCLOS wrappers for overloaded functions will not work correctly when using - %feature(compactdefaultargs).
    • -
    - -

    23.7.1 TinyCLOS problems with Chicken version <= 1.92

    - - -

    In Chicken versions equal to or below 1.92, TinyCLOS has a limitation such that generic methods do not properly work on methods - with different number of specializers: TinyCLOS assumes that every method added to a generic function - will have the same number of specializers. SWIG generates functions with different lengths of specializers - when C/C++ functions are overloaded. For example, the code

    - -
    -
    -class Foo {};
    -int foo(int a, Foo *b);
    -int foo(int a);
    -
    - -

    will produce scheme code

    - -
    -
    -(define-method (foo (arg0 <top>) (arg1 <Foo>)) (call primitive function))
    -(define-method (foo (arg0 <top>)) (call primitive function))
    -
    - -

    Using unpatched TinyCLOS, the second (define-method) will replace the first one, -so calling (foo 3 f) will produce an error.

    - -

    There are three solutions to this. The easist is to upgrade to the latest Chicken version. Otherwise, the -file Lib/chicken/tinyclos-multi-generic.patch in the SWIG source contains a patch against -tinyclos.scm inside the 1.92 chicken source to add support into TinyCLOS for multi-argument generics. (This patch was accepted into Chicken) -This requires chicken to be rebuilt and custom install of chicken. An alternative is the Lib/chicken/multi-generic.scm -file in the SWIG source. This file can be loaded after TinyCLOS is loaded, and it will override some functions -inside TinyCLOS to correctly support multi-argument generics. Please see the comments at the top of both files for more information.

    - - - diff --git a/Doc/Manual/Contents.html b/Doc/Manual/Contents.html index 57aef5b8a..47b41186e 100644 --- a/Doc/Manual/Contents.html +++ b/Doc/Manual/Contents.html @@ -95,9 +95,10 @@ @@ -372,7 +373,19 @@ -

    10 Preprocessing

    +

    10 SWIG and C++20

    + + + + + +

    11 Preprocessing

    @@ -395,7 +408,7 @@
    -

    11 SWIG library

    +

    12 SWIG library

    @@ -438,7 +451,7 @@
    -

    12 Argument Handling

    +

    13 Argument Handling

    @@ -461,7 +474,7 @@
    -

    13 Typemaps

    +

    14 Typemaps

    @@ -555,7 +568,7 @@
    -

    14 Customization Features

    +

    15 Customization Features

    @@ -583,7 +596,7 @@
    -

    15 Contracts

    +

    16 Contracts

    @@ -596,7 +609,7 @@
    -

    16 Variable Length Arguments

    +

    17 Variable Length Arguments

    @@ -614,7 +627,7 @@
    -

    17 SWIG and Doxygen Translation

    +

    18 SWIG and Doxygen Translation

    @@ -662,7 +675,7 @@
    -

    18 Warning Messages

    +

    19 Warning Messages

    @@ -691,7 +704,7 @@
    -

    19 Working with Modules

    +

    20 Working with Modules

    @@ -707,7 +720,7 @@
    -

    20 Using SWIG with ccache - ccache-swig(1) manpage

    +

    21 Using SWIG with ccache - ccache-swig(1) manpage

    @@ -733,7 +746,7 @@
    -

    21 SWIG and Android

    +

    22 SWIG and Android

    @@ -751,7 +764,7 @@
    -

    22 SWIG and C#

    +

    23 SWIG and C#

    @@ -799,7 +812,7 @@
    -

    23 SWIG and D

    +

    24 SWIG and D

    @@ -833,7 +846,7 @@
    -

    24 SWIG and Go

    +

    25 SWIG and Go

    @@ -877,7 +890,7 @@
    -

    25 SWIG and Guile

    +

    26 SWIG and Guile

    @@ -913,7 +926,7 @@
    -

    26 SWIG and Java

    +

    27 SWIG and Java

    @@ -1067,7 +1080,7 @@
    -

    27 SWIG and Javascript

    +

    28 SWIG and Javascript

    @@ -1109,7 +1122,7 @@
    -

    28 SWIG and Lua

    +

    29 SWIG and Lua

    @@ -1177,7 +1190,7 @@
    -

    29 SWIG and Octave

    +

    30 SWIG and Octave

    @@ -1217,7 +1230,7 @@
    -

    30 SWIG and Perl5

    +

    31 SWIG and Perl5

    @@ -1293,7 +1306,7 @@
    -

    31 SWIG and PHP

    +

    32 SWIG and PHP

    @@ -1334,7 +1347,7 @@
    -

    32 SWIG and Python

    +

    33 SWIG and Python

    @@ -1476,7 +1489,7 @@
    -

    33 SWIG and R

    +

    34 SWIG and R

    @@ -1487,12 +1500,15 @@
  • General policy
  • Language conventions
  • C++ classes +
  • Enumerations -

    34 SWIG and Ruby

    +

    35 SWIG and Ruby

    @@ -1630,7 +1646,7 @@
    -

    35 SWIG and Scilab

    +

    36 SWIG and Scilab

    @@ -1699,7 +1715,7 @@
    -

    36 SWIG and Tcl

    +

    37 SWIG and Tcl

    @@ -1765,7 +1781,7 @@
    -

    37 SWIG and MzScheme/Racket

    +

    38 SWIG and MzScheme/Racket

    @@ -1777,7 +1793,7 @@
    -

    38 SWIG and OCaml

    +

    39 SWIG and OCaml

    @@ -1832,7 +1848,7 @@
    -

    39 Extending SWIG to support new languages

    +

    40 Extending SWIG to support new languages

    diff --git a/Doc/Manual/Contract.html b/Doc/Manual/Contract.html index 93fb8c003..f7acbba3e 100644 --- a/Doc/Manual/Contract.html +++ b/Doc/Manual/Contract.html @@ -7,7 +7,7 @@ -

    15 Contracts

    +

    16 Contracts

      @@ -39,7 +39,7 @@ When one of the rules is violated by a script, a runtime exception is generated rather than having the program continue to execute.

      -

      15.1 The %contract directive

      +

      16.1 The %contract directive

      @@ -95,7 +95,7 @@ RuntimeError: Contract violation: require: (arg1>=0)

    -

    15.2 %contract and classes

    +

    16.2 %contract and classes

    @@ -174,7 +174,7 @@ specified for the derived class all must hold. In the above example, this means that both the arguments to Spam::bar must be positive.

    -

    15.3 Constant aggregation and %aggregate_check

    +

    16.3 Constant aggregation and %aggregate_check

    @@ -263,7 +263,7 @@ Regrettably, there is no automatic way to perform similar checks with enums valu release.

    -

    15.4 Notes

    +

    16.4 Notes

    diff --git a/Doc/Manual/Customization.html b/Doc/Manual/Customization.html index 328bc2391..5fe0f5b52 100644 --- a/Doc/Manual/Customization.html +++ b/Doc/Manual/Customization.html @@ -7,7 +7,7 @@ -

    14 Customization Features

    +

    15 Customization Features

    -

    14.1.4 Exception handlers for variables

    +

    15.1.4 Exception handlers for variables

    @@ -305,7 +305,7 @@ The %allowexception feature works like any other feature and so can be

    -

    14.1.5 Defining different exception handlers

    +

    15.1.5 Defining different exception handlers

    @@ -442,7 +442,7 @@ declarations. However, it never really worked that well and the new %exception directive is much better.

    -

    14.1.6 Special variables for %exception

    +

    15.1.6 Special variables for %exception

    @@ -545,7 +545,7 @@ Below shows the expansions for the 1st of the overloaded something wrap -

    14.1.7 Using The SWIG exception library

    +

    15.1.7 Using The SWIG exception library

    @@ -600,7 +600,7 @@ SWIG_NullReferenceError The SWIG_exception() function can also be used in typemaps.

    -

    14.2 Object ownership and %newobject

    +

    15.2 Object ownership and %newobject

    @@ -757,7 +757,7 @@ char *strdup(const char *s); The results might not be what you expect.

    -

    14.3 Features and the %feature directive

    +

    15.3 Features and the %feature directive

    @@ -839,7 +839,7 @@ The following are all equivalent: The syntax in the first variation will generate the { } delimiters used whereas the other variations will not.

    -

    14.3.1 Feature attributes

    +

    15.3.1 Feature attributes

    @@ -880,7 +880,7 @@ In the following example, MyExceptionClass is the name of the Java clas Further details can be obtained from the Java exception handling section.

    -

    14.3.2 Feature flags

    +

    15.3.2 Feature flags

    @@ -978,7 +978,7 @@ in the swig.swg Library file. The following shows the alternative synta The concept of clearing features is discussed next.

    -

    14.3.3 Clearing features

    +

    15.3.3 Clearing features

    @@ -1071,7 +1071,7 @@ The three macros below show this for the "except" feature: -

    14.3.4 Features and default arguments

    +

    15.3.4 Features and default arguments

    @@ -1146,7 +1146,7 @@ specifying or not specifying default arguments in a feature is not applicable as in SWIG-1.3.23 when the approach to wrapping methods with default arguments was changed.

    -

    14.3.5 Feature example

    +

    15.3.5 Feature example

    diff --git a/Doc/Manual/D.html b/Doc/Manual/D.html index d97267a5b..f9f2d53ca 100644 --- a/Doc/Manual/D.html +++ b/Doc/Manual/D.html @@ -6,7 +6,7 @@ -

    23 SWIG and D

    +

    24 SWIG and D

      @@ -41,7 +41,7 @@ -

      23.1 Introduction

      +

      24.1 Introduction

      From the D Programming Language web site: D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. [...] The D language is statically typed and compiles directly to machine code. As such, it is not very surprising that D is able to directly interface with C libraries. Why would a SWIG module for D be needed then in the first place?

      @@ -53,7 +53,7 @@

      To help addressing these issues, the SWIG C# module has been forked to support D. Is has evolved quite a lot since then, but there are still many similarities, so if you do not find what you are looking for on this page, it might be worth having a look at the chapter on C# (and also on Java, since the C# module was in turn forked from it).

      -

      23.2 Command line invocation

      +

      24.2 Command line invocation

      To activate the D module, pass the -d option to SWIG at the command line. The same standard command line options as with any other language module are available, plus the following D specific ones:

      @@ -83,10 +83,10 @@ -

      23.3 Typemaps

      +

      24.3 Typemaps

      -

      23.3.1 C# <-> D name comparison

      +

      24.3.1 C# <-> D name comparison

      If you already know the SWIG C# module, you might find the following name comparison table useful:

      @@ -112,7 +112,7 @@
    -

    23.3.2 ctype, imtype, dtype

    +

    24.3.2 ctype, imtype, dtype

    Mapping of types between the C/C++ library, the C/C++ library wrapper exposing the C functions, the D wrapper module importing these functions and the D proxy code.

    @@ -120,7 +120,7 @@

    The ctype typemap is used to determine the types to use in the C wrapper functions. The types from the imtype typemap are used in the extern(C) declarations of these functions in the intermediary D module. The dtype typemap contains the D types used in the D proxy module/class.

    -

    23.3.3 in, out, directorin, directorout

    +

    24.3.3 in, out, directorin, directorout

    Used for converting between the types for C/C++ and D when generating the code for the wrapper functions (on the C++ side).

    @@ -130,7 +130,7 @@

    The directorin typemap is used to convert parameters to the type used in the D director callback function, its return value is processed by directorout (see below).

    -

    23.3.4 din, dout, ddirectorin, ddirectorout

    +

    24.3.4 din, dout, ddirectorin, ddirectorout

    Typemaps for code generation in D proxy and type wrapper classes.

    @@ -157,13 +157,13 @@ dtype DClass.method(dtype a) -

    23.3.5 typecheck typemaps

    +

    24.3.5 typecheck typemaps

    Because, unlike many scripting languages supported by SWIG, D does not need any dynamic dispatch helper to access an overloaded function, the purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in D (as more than one C++ type maps to a single D type).

    -

    23.3.6 Code injection typemaps

    +

    24.3.6 Code injection typemaps

    These typemaps are used for generating the skeleton of proxy classes for C++ types.

    @@ -178,7 +178,7 @@ Code can also be injected into the D proxy class using %proxycode.

    -

    23.3.7 Special variable macros

    +

    24.3.7 Special variable macros

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation, for example $1, $input, $result etc.

    @@ -299,7 +299,7 @@ $importtype(AnotherInterface) -

    23.4 D and %feature

    +

    24.4 D and %feature

    The D module defines a number of directives which modify the SWIG features set globally or for a specific declaration:

    @@ -329,7 +329,7 @@ struct A { -

    23.5 Pragmas

    +

    24.5 Pragmas

    There are a few SWIG pragmas specific to the D module, which you can use to influence the D code SWIG generates:

    @@ -368,7 +368,7 @@ struct A { -

    23.6 D Exceptions

    +

    24.6 D Exceptions

    Out of the box, C++ exceptions are fundamentally incompatible to their equivalent in the D world and cannot simply be propagated to a calling D method. There is, however, an easy way to solve this problem: Just catch the exception in the C/C++ wrapper layer, pass the contents to D, and make the wrapper code rethrow the exception in the D world.

    @@ -378,7 +378,7 @@ struct A {

    As this feature is implemented in exactly the same way it is for C#, please see the C# documentation for a more detailed explanation.

    -

    23.7 D Directors

    +

    24.7 D Directors

    When the directors feature is activated, SWIG generates extra code on both the C++ and the D side to enable cross-language polymorphism. Essentially, this means that if you subclass a proxy class in D, C++ code can access any overridden virtual methods just as if you created a derived class in C++.

    @@ -387,16 +387,16 @@ struct A {

    -

    23.8 Other features

    +

    24.8 Other features

    -

    23.8.1 Extended namespace support (nspace)

    +

    24.8.1 Extended namespace support (nspace)

    By default, SWIG flattens all C++ namespaces into a single target language namespace, but as for Java and C#, the nspace feature is supported for D. If it is active, C++ namespaces are mapped to D packages/modules. Note, however, that like for the other languages, free variables and functions are not supported yet; currently, they are all allows written to the main proxy D module.

    -

    23.8.2 Native pointer support

    +

    24.8.2 Native pointer support

    Contrary to many of the scripting languages supported by SWIG, D fully supports C-style pointers. The D module thus includes a custom mechanism to wrap C pointers directly as D pointers where applicable, that is, if the type that is pointed to is represented the same in C and D (on the bit-level), dubbed a primitive type below.

    @@ -408,7 +408,7 @@ struct A {

    To determine if a type should be considered primitive, the cprimitive attribute on its dtype attribute is used. For example, the dtype typemap for float has cprimitive="1", so the code from the nativepointer attribute is taken into account e.g. for float ** or the function pointer float (*)(float *).

    -

    23.8.3 Operator overloading

    +

    24.8.3 Operator overloading

    The D module comes with basic operator overloading support for both D1 and D2. There are, however, a few limitations arising from conceptual differences between C++ and D:

    @@ -420,7 +420,7 @@ struct A {

    There are also some cases where the operators can be translated to D, but the differences in the implementation details are big enough that a rather involved scheme would be required for automatic wrapping them, which has not been implemented yet. This affects, for example, the array subscript operator, [], in combination with assignments - while operator [] in C++ simply returns a reference which is then written to, D resorts to a separate opIndexAssign method -, or implicit casting (which was introduced in D2 via alias this). Despite the lack of automatic support, manually handling these cases should be perfectly possible.

    -

    23.8.4 Running the test-suite

    +

    24.8.4 Running the test-suite

    As with any other language, the SWIG test-suite can be built for D using the *-d-test-suite targets of the top-level Makefile. By default, D1 is targeted, to build it with D2, use the optional D_VERSION variable, e.g. make check-d-test-suite D_VERSION=2.

    @@ -428,14 +428,14 @@ struct A {

    Note: If you want to use GDC on Linux or another platform which requires you to link libdl for dynamically loading the shared library, you might have to add -ldl manually to the d_compile target in Examples/Makefile, because GDC does not currently honor the pragma(lib, ...) statement.

    -

    23.9 D Typemap examples

    +

    24.9 D Typemap examples

    There are no D-specific typemap examples yet. However, with the above name comparison table, you should be able to get an idea what can be done by looking at the corresponding C# section.

    -

    23.10 Work in progress and planned features

    +

    24.10 Work in progress and planned features

    There are a couple of features which are not implemented yet, but would be very useful and might be added in the near future:

    diff --git a/Doc/Manual/Doxygen.html b/Doc/Manual/Doxygen.html index ff025c047..53238c24d 100644 --- a/Doc/Manual/Doxygen.html +++ b/Doc/Manual/Doxygen.html @@ -5,7 +5,7 @@ -

    17 SWIG and Doxygen Translation

    +

    18 SWIG and Doxygen Translation

    -Also any of the above with '<' added after comment-starting symbol, -like /**<, /*!<, ///<, or //!< will be +Also any of the above with '<' added after comment-starting symbol, +like /**<, /*!<, ///<, or //!< will be treated as a post-comment and will be assigned to the code before the comment. -Any number of '*' or '/' within a Doxygen comment is considered to be a -separator and is not included in the final comment, so you may safely use -comments like /*********/ or //////////. +Any number of '*' or '/' within a Doxygen comment is +considered to be a separator and is not included in the final comment, +so you may safely use comments like /*********/ +or //////////.

    @@ -193,7 +194,7 @@ where the comments for a code item are not put directly before or after the code These structural commands are stripped out by SWIG and are not assigned to anything.

    -

    17.2.1 Enabling Doxygen translation

    +

    18.2.1 Enabling Doxygen translation

    @@ -202,7 +203,7 @@ enabled using the command line -doxygen option for the languages that do support it (currently Java and Python).

    -

    17.2.2 Doxygen-specific %feature directives

    +

    18.2.2 Doxygen-specific %feature directives

    @@ -210,7 +211,7 @@ Translation of Doxygen comments is influenced by the following %feature directives:

    -

    17.2.2.1 doxygen:notranslate

    +

    18.2.2.1 doxygen:notranslate

    @@ -222,7 +223,7 @@ instead of the corresponding language tool (javadoc, sphinx,

    -

    17.2.2.2 doxygen:alias:<command-name>

    +

    18.2.2.2 doxygen:alias:<command-name>

    @@ -269,7 +270,7 @@ wrappers of the C++ API.

    -

    17.2.2.3 doxygen:ignore:<command-name>

    +

    18.2.2.3 doxygen:ignore:<command-name>

    @@ -420,7 +421,7 @@ def func(): -

    17.2.2.4 doxygen:nolinktranslate

    +

    18.2.2.4 doxygen:nolinktranslate

    @@ -429,7 +430,7 @@ This is only applicable to Java at the moment.

    -

    17.2.2.5 doxygen:nostripparams

    +

    18.2.2.5 doxygen:nostripparams

    @@ -439,14 +440,14 @@ This is only applicable to Java at the moment.

    -

    17.2.3 Additional command line options

    +

    18.2.3 Additional command line options

    ALSO TO BE ADDED (Javadoc auto brief?)

    -

    17.3 Doxygen to Javadoc

    +

    18.3 Doxygen to Javadoc

    @@ -455,7 +456,7 @@ automatically placed in the correct locations in the resulting module and proxy files.

    -

    17.3.1 Basic example

    +

    18.3.1 Basic example

    @@ -562,7 +563,7 @@ Javadoc translator features summary directives):

    -

    17.3.2 Javadoc tags

    +

    18.3.2 Javadoc tags

    @@ -606,6 +607,10 @@ Here is the list of all Doxygen tags and the description of how they are transla translated to {@code ...} +\code{<ext>} +translated to {@code ...}; code language extension is ignored + + \cond translated to 'Conditional comment: <condition>' @@ -683,7 +688,7 @@ Here is the list of all Doxygen tags and the description of how they are transla \n -replaced with new line char +replaced with newline char \note @@ -706,6 +711,10 @@ Here is the list of all Doxygen tags and the description of how they are transla translated to @param +\param[<dir>] +translated to @param; parameter direction ('in'; 'out'; or 'in,out') is ignored + + \remark replaced with 'Remarks:' @@ -816,7 +825,7 @@ Here is the list of all Doxygen tags and the description of how they are transla -

    17.3.3 Unsupported tags

    +

    18.3.3 Unsupported tags

    @@ -829,155 +838,107 @@ These are suppressed with their content just printed out (if the tag has any sense, typically text content). Here is the list of these tags:

    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Unsupported Doxygen tags
    \addindex\addtogroup\anchor\attention
    \brief\bug\callgraph\callergraph
    \class\copybrief\copydetails\copydoc
    \date\def\defgroup\details
    \dir\dontinclude\dot\dotfile
    \enddot\endhtmlonly\endinternal\endlatexonly
    \endmanonly\endmsc\endrtfonly\endxmlonly
    \enum\example\extends
    \file\fn\headerfile\hideinitializer
    \htmlinclude\htmlonly\implements\include
    \includelineno\ingroup\internal\invariant
    \interface\latexonly\line\mainpage
    \manonly\memberof\msc\mscfile
    \name\namespace\nosubgrouping\package
    \page\paragraph\post\pre
    \private\privatesection\property\protected
    \protectedsection\protocol\public\publicsection
    \ref\related\relates\relatedalso
    \relatesalso\retval\rtfonly\section
    \short\showinitializer\skip\skipline
    \snippet\struct\subpage\subsection
    \subsubsection\tableofcontents\test\typedef
    \union\until\var\verbinclude
    \weakgroup\xmlonly\xrefitem\category
    + Unsupported Doxygen tags + +
      +
    • \addindex
    • +
    • \addtogroup
    • +
    • \anchor
    • +
    • \attention
    • +
    • \brief
    • +
    • \bug
    • +
    • \callergraph
    • +
    • \callgraph
    • +
    • \category
    • +
    • \class
    • +
    • \copybrief
    • +
    • \copydetails
    • +
    • \copydoc
    • +
    • \date
    • +
    • \def
    • +
    • \defgroup
    • +
    • \details
    • +
    • \dir
    • +
    • \dontinclude
    • +
    • \dot
    • +
    • \dotfile
    • +
    • \enddot
    • +
    • \endhtmlonly
    • +
    • \endinternal
    • +
    • \endlatexonly
    • +
    • \endmanonly
    • +
    • \endmsc
    • +
    • \endrtfonly
    • +
    • \endxmlonly
    • +
    • \enum
    • +
    • \example
    • +
    • \extends
    • +
    • \file
    • +
    • \fn
    • +
    • \headerfile
    • +
    • \hideinitializer
    • +
    • \htmlinclude
    • +
    • \htmlonly
    • +
    • \implements
    • +
    • \include
    • +
    • \includelineno
    • +
    • \ingroup
    • +
    • \interface
    • +
    • \internal
    • +
    • \invariant
    • +
    • \latexonly
    • +
    • \line
    • +
    • \mainpage
    • +
    • \manonly
    • +
    • \memberof
    • +
    • \msc
    • +
    • \mscfile
    • +
    • \name
    • +
    • \namespace
    • +
    • \nosubgrouping
    • +
    • \package
    • +
    • \page
    • +
    • \paragraph
    • +
    • \post
    • +
    • \pre
    • +
    • \private
    • +
    • \privatesection
    • +
    • \property
    • +
    • \protected
    • +
    • \protectedsection
    • +
    • \protocol
    • +
    • \public
    • +
    • \publicsection
    • +
    • \ref
    • +
    • \related
    • +
    • \relatedalso
    • +
    • \relates
    • +
    • \relatesalso
    • +
    • \retval
    • +
    • \rtfonly
    • +
    • \section
    • +
    • \short
    • +
    • \showinitializer
    • +
    • \skip
    • +
    • \skipline
    • +
    • \snippet
    • +
    • \struct
    • +
    • \subpage
    • +
    • \subsection
    • +
    • \subsubsection
    • +
    • \tableofcontents
    • +
    • \test
    • +
    • \typedef
    • +
    • \union
    • +
    • \until
    • +
    • \var
    • +
    • \verbinclude
    • +
    • \weakgroup
    • +
    • \xmlonly
    • +
    • \xrefitem
    • +

    @@ -987,79 +948,58 @@ comment, the whole comment block is ignored:

    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Ignored Doxygen tags -
    Ignored Doxygen tags
    \addtogroup\callgraph\callergraph\category
    \class\def\defgroup\dir
    \enum\example\file\fn
    \headerfile\hideinitializer\interface\internal
    \mainpage\name\namespace\nosubgrouping
    \overload\package\page\property
    \protocol\relates\relatesalso\showinitializer
    \struct\name\namespace\nosubgrouping
    \typedef\union\var\weakgroup
    +
      +
    • \addtogroup
    • +
    • \callergraph
    • +
    • \callgraph
    • +
    • \category
    • +
    • \class
    • +
    • \def
    • +
    • \defgroup
    • +
    • \dir
    • +
    • \enum
    • +
    • \example
    • +
    • \file
    • +
    • \fn
    • +
    • \headerfile
    • +
    • \hideinitializer
    • +
    • \interface
    • +
    • \internal
    • +
    • \mainpage
    • +
    • \name
    • +
    • \namespace
    • +
    • \nosubgrouping
    • +
    • \overload
    • +
    • \package
    • +
    • \page
    • +
    • \property
    • +
    • \protocol
    • +
    • \relates
    • +
    • \relatesalso
    • +
    • \showinitializer
    • +
    • \struct
    • +
    • \typedef
    • +
    • \union
    • +
    • \var
    • +
    • \weakgroup
    • +
    + -

    17.3.4 Further details

    +

    18.3.4 Further details

    TO BE ADDED.

    -

    17.4 Doxygen to Pydoc

    +

    18.4 Doxygen to Pydoc

    @@ -1070,7 +1010,7 @@ Doxygen or Javadoc, so most of Doxygen commands are translated by merely copying the appropriate command text.

    -

    17.4.1 Basic example

    +

    18.4.1 Basic example

    @@ -1233,7 +1173,7 @@ docs), you may want to use some tool like doxypy to do the work.

    -

    17.4.2 Pydoc translator

    +

    18.4.2 Pydoc translator

    @@ -1246,11 +1186,11 @@ Here is the list of all Doxygen tags and the description of how they are transla \a -wrapped with '_' +wrapped with '*' \arg -prepended with ' --' +prepended with '* ' \author @@ -1258,17 +1198,29 @@ Here is the list of all Doxygen tags and the description of how they are transla \authors -prints 'Author:' +prints 'Authors:' \b -wrapped with '__' +wrapped with '**' + + +\c +wrapped with '``' \cite wrapped with single quotes +\code +replaced with '.. code-block:: c++' + + +\code{<ext>} +replaced with '.. code-block:: <lang>', where the following doxygen code languages are recognized: .c -> C, .py -> python, .java > java + + \cond translated to 'Conditional comment: <condition>' @@ -1282,7 +1234,7 @@ Here is the list of all Doxygen tags and the description of how they are transla \e -wrapped with '_' +wrapped with '*' \else @@ -1294,7 +1246,7 @@ Here is the list of all Doxygen tags and the description of how they are transla \em -wrapped with '_' +wrapped with '*' \endcond @@ -1305,8 +1257,24 @@ Here is the list of all Doxygen tags and the description of how they are transla replaced with '}' +\example +replaced with 'Example:' + + \exception -replaced with 'Throws:' +replaced with ':raises:' + + +\f$ +rendered using ':math:``' + + +\f[ +rendered using '.. math::' + + +\f{ +rendered using '.. math::' \if @@ -1318,11 +1286,11 @@ Here is the list of all Doxygen tags and the description of how they are transla \li -prepended with ' --' +prepended with '* ' \n -replaced with new line char +replaced with newline char \note @@ -1333,12 +1301,20 @@ Here is the list of all Doxygen tags and the description of how they are transla prints 'This is an overloaded ...' according to Doxygen docs +\p +wrapped with '``' + + \par replaced with 'Title: ...' \param -translated to 'Arguments:\n param(type) --description' +add ':type:' and ':param:' directives + + +\param[<dir>] +same as \param, but direction ('in'; 'out'; 'in,out') is included in ':type:' directive \remark @@ -1350,15 +1326,15 @@ Here is the list of all Doxygen tags and the description of how they are transla \result -replaced with 'Result:' +add ':rtype:' and ':return:' directives \return -replaced with 'Result:' +add ':rtype:' and ':return:' directives \returns -replaced with 'Result:' +add ':rtype:' and ':return:' directives \sa @@ -1374,11 +1350,11 @@ Here is the list of all Doxygen tags and the description of how they are transla \throw -replaced with 'Throws:' +replaced with ':raises:' \throws -replaced wih 'Throws:' +replaced wih ':raises:' \todo @@ -1386,7 +1362,11 @@ Here is the list of all Doxygen tags and the description of how they are transla \tparam -translated to 'Arguments:\n param(type) --description' +add ':type:' and ':param:' directives + + +\verbatim +content copied verbatim \version @@ -1447,7 +1427,7 @@ Here is the list of all Doxygen tags and the description of how they are transla -

    17.4.3 Unsupported tags

    +

    18.4.3 Unsupported tags

    @@ -1458,187 +1438,119 @@ are suppressed with their content just printed out (if it has any sense, typically text content). Here is the list of these tags:

    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Unsupported Doxygen tags
    \addindex\addtogroup\anchor\attention
    \brief\bug\callgraph\callergraph
    \class\copybrief\copydetails\copydoc
    \date\def\defgroup\details
    \dir\dontinclude\dot\dotfile
    \code\endcode\endverbatim\endlink
    \enddot\endhtmlonly\endinternal\endlatexonly
    \endmanonly\endmsc\endrtfonly\endxmlonly
    \enum\example\extends\f$
    \f[\f]\f{\f}
    \file\fn\headerfile\hideinitializer
    \htmlinclude\htmlonly\implements\include
    \image\link\verbatim\p
    \includelineno\ingroup\internal\invariant
    \interface\latexonly\line\mainpage
    \manonly\memberof\msc\mscfile
    \name\namespace\nosubgrouping\package
    \page\paragraph\post\pre
    \private\privatesection\property\protected
    \protectedsection\protocol\public\publicsection
    \ref\related\relates\relatedalso
    \relatesalso\retval\rtfonly\section
    \short\showinitializer\skip\skipline
    \snippet\struct\subpage\subsection
    \subsubsection\tableofcontents\test\typedef
    \union\until\var\verbinclude
    \weakgroup\xmlonly\xrefitem\category
    \c
    + Unsupported Python Doxygen tags + +
      +
    • \addindex
    • +
    • \addtogroup
    • +
    • \anchor
    • +
    • \attention
    • +
    • \brief
    • +
    • \bug
    • +
    • \callergraph
    • +
    • \callgraph
    • +
    • \category
    • +
    • \class
    • +
    • \copybrief
    • +
    • \copydetails
    • +
    • \copydoc
    • +
    • \date
    • +
    • \def
    • +
    • \defgroup
    • +
    • \details
    • +
    • \dir
    • +
    • \dontinclude
    • +
    • \dot
    • +
    • \dotfile
    • +
    • \enddot
    • +
    • \endhtmlonly
    • +
    • \endinternal
    • +
    • \endlatexonly
    • +
    • \endlink
    • +
    • \endmanonly
    • +
    • \endmsc
    • +
    • \endrtfonly
    • +
    • \endxmlonly
    • +
    • \enum
    • +
    • \extends
    • +
    • \file
    • +
    • \fn
    • +
    • \headerfile
    • +
    • \hideinitializer
    • +
    • \htmlinclude
    • +
    • \htmlonly
    • +
    • \image
    • +
    • \implements
    • +
    • \include
    • +
    • \includelineno
    • +
    • \ingroup
    • +
    • \interface
    • +
    • \internal
    • +
    • \invariant
    • +
    • \latexonly
    • +
    • \line
    • +
    • \link
    • +
    • \mainpage
    • +
    • \manonly
    • +
    • \memberof
    • +
    • \msc
    • +
    • \mscfile
    • +
    • \name
    • +
    • \namespace
    • +
    • \nosubgrouping
    • +
    • \package
    • +
    • \page
    • +
    • \paragraph
    • +
    • \post
    • +
    • \pre
    • +
    • \private
    • +
    • \privatesection
    • +
    • \property
    • +
    • \protected
    • +
    • \protectedsection
    • +
    • \protocol
    • +
    • \public
    • +
    • \publicsection
    • +
    • \ref
    • +
    • \related
    • +
    • \relatedalso
    • +
    • \relates
    • +
    • \relatesalso
    • +
    • \retval
    • +
    • \rtfonly
    • +
    • \section
    • +
    • \short
    • +
    • \showinitializer
    • +
    • \skip
    • +
    • \skipline
    • +
    • \snippet
    • +
    • \struct
    • +
    • \subpage
    • +
    • \subsection
    • +
    • \subsubsection
    • +
    • \tableofcontents
    • +
    • \test
    • +
    • \typedef
    • +
    • \union
    • +
    • \until
    • +
    • \var
    • +
    • \verbinclude
    • +
    • \weakgroup
    • +
    • \xmlonly
    • +
    • \xrefitem
    • +
    -

    17.4.4 Further details

    +

    18.4.4 Further details

    TO BE ADDED.

    -

    17.5 Troubleshooting

    +

    18.5 Troubleshooting

    @@ -1660,7 +1572,7 @@ include the option and fix problems with Doxygen comments.

    -

    17.5.1 Problem with conditional compilation

    +

    18.5.1 Problem with conditional compilation

    @@ -1700,14 +1612,14 @@ class A { -

    17.6 Developer information

    +

    18.6 Developer information

    This section contains information for developers enhancing the Doxygen translator.

    -

    17.6.1 Doxygen translator design

    +

    18.6.1 Doxygen translator design

    @@ -1733,7 +1645,7 @@ class for translation into the target documentation language. For example, JavaDocConverter is the Javadoc module class.

    -

    17.6.2 Debugging the Doxygen parser and translator

    +

    18.6.2 Debugging the Doxygen parser and translator

    @@ -1746,7 +1658,7 @@ detailed debug information printing. -debug-doxygen-translator - Display Doxygen translator module debugging information -

    17.6.3 Tests

    +

    18.6.3 Tests

    @@ -1798,7 +1710,7 @@ Runtime tests in Python are just plain string comparisons of the __doc__ properties.

    -

    17.7 Extending to other languages

    +

    18.7 Extending to other languages

    diff --git a/Doc/Manual/Extending.html b/Doc/Manual/Extending.html index 5a640fbdc..7c2a6c66c 100644 --- a/Doc/Manual/Extending.html +++ b/Doc/Manual/Extending.html @@ -7,7 +7,7 @@ -

    39 Extending SWIG to support new languages

    +

    40 Extending SWIG to support new languages

    -

    39.4.4 Attribute namespaces

    +

    40.4.4 Attribute namespaces

    @@ -665,7 +665,7 @@ that matches the name of the target language. For example, python:foo perl:foo.

    -

    39.4.5 Symbol Tables

    +

    40.4.5 Symbol Tables

    @@ -756,7 +756,7 @@ example.i:5. Previous declaration is foo_i(int ) -

    39.4.6 The %feature directive

    +

    40.4.6 The %feature directive

    @@ -812,7 +812,7 @@ For example, the exception code above is simply stored without any modifications.

    -

    39.4.7 Code Generation

    +

    40.4.7 Code Generation

    @@ -934,7 +934,7 @@ public : The role of these functions is described shortly.

    -

    39.4.8 SWIG and XML

    +

    40.4.8 SWIG and XML

    @@ -947,7 +947,7 @@ internal data structures, it may be useful to keep XML in the back of your mind as a model.

    -

    39.5 Primitive Data Structures

    +

    40.5 Primitive Data Structures

    @@ -993,7 +993,7 @@ typedef Hash Typetab; -

    39.5.1 Strings

    +

    40.5.1 Strings

    @@ -1134,7 +1134,7 @@ Returns the number of replacements made (if any). -

    39.5.2 Hashes

    +

    40.5.2 Hashes

    @@ -1211,7 +1211,7 @@ Returns the list of hash table keys. -

    39.5.3 Lists

    +

    40.5.3 Lists

    @@ -1300,7 +1300,7 @@ If t is not a standard object, it is assumed to be a char * and is used to create a String object. -

    39.5.4 Common operations

    +

    40.5.4 Common operations

    The following operations are applicable to all datatypes. @@ -1355,7 +1355,7 @@ objects and report errors. Gets the line number associated with x. -

    39.5.5 Iterating over Lists and Hashes

    +

    40.5.5 Iterating over Lists and Hashes

    To iterate over the elements of a list or a hash table, the following functions are used: @@ -1400,7 +1400,7 @@ for (j = First(j); j.item; j= Next(j)) { -

    39.5.6 I/O

    +

    40.5.6 I/O

    Special I/O functions are used for all internal I/O. These operations @@ -1534,7 +1534,7 @@ Printf(f, "%s\n", s); Similarly, the preprocessor and parser all operate on string-files.

    -

    39.6 Navigating and manipulating parse trees

    +

    40.6 Navigating and manipulating parse trees

    Parse trees are built as collections of hash tables. Each node is a hash table in which @@ -1668,7 +1668,7 @@ Deletes a node from the parse tree. Deletion reconnects siblings and properly u the parent so that sibling nodes are unaffected. -

    39.7 Working with attributes

    +

    40.7 Working with attributes

    @@ -1785,7 +1785,7 @@ the attribute is optional. Swig_restore() must always be called after function. -

    39.8 Type system

    +

    40.8 Type system

    @@ -1794,7 +1794,7 @@ pointers, references, and pointers to members. A detailed discussion of type theory is impossible here. However, let's cover the highlights.

    -

    39.8.1 String encoding of types

    +

    40.8.1 String encoding of types

    @@ -1895,7 +1895,7 @@ make the final type, the two parts are just joined together using string concatenation.

    -

    39.8.2 Type construction

    +

    40.8.2 Type construction

    @@ -2064,7 +2064,7 @@ Returns the prefix of a type. For example, if ty is ty is unmodified. -

    39.8.3 Type tests

    +

    40.8.3 Type tests

    @@ -2151,7 +2151,7 @@ Checks if ty is a varargs type. Checks if ty is a templatized type. -

    39.8.4 Typedef and inheritance

    +

    40.8.4 Typedef and inheritance

    @@ -2253,7 +2253,7 @@ Fully reduces ty according to typedef rules. Resulting datatype will consist only of primitive typenames. -

    39.8.5 Lvalues

    +

    40.8.5 Lvalues

    @@ -2290,7 +2290,7 @@ Literal y; // type = 'Literal', ltype='p.char' -

    39.8.6 Output functions

    +

    40.8.6 Output functions

    @@ -2352,7 +2352,7 @@ SWIG, but is most commonly associated with type-descriptor objects that appear in wrappers (e.g., SWIGTYPE_p_double). -

    39.9 Parameters

    +

    40.9 Parameters

    @@ -2451,7 +2451,7 @@ included. Used to emit prototypes. Returns the number of required (non-optional) arguments in p. -

    39.10 Writing a Language Module

    +

    40.10 Writing a Language Module

    @@ -2466,7 +2466,7 @@ describes the creation of a minimal Python module. You should be able to extra this to other languages.

    -

    39.10.1 Execution model

    +

    40.10.1 Execution model

    @@ -2476,7 +2476,7 @@ the parsing of command line options, all aspects of code generation are controll different methods of the Language that must be defined by your module.

    -

    39.10.2 Starting out

    +

    40.10.2 Starting out

    @@ -2584,7 +2584,7 @@ that activates your module. For example, swig -python foo.i. The messages from your new module should appear.

    -

    39.10.3 Command line options

    +

    40.10.3 Command line options

    @@ -2643,7 +2643,7 @@ to mark the option as valid. If you forget to do this, SWIG will terminate wit unrecognized command line option error.

    -

    39.10.4 Configuration and preprocessing

    +

    40.10.4 Configuration and preprocessing

    @@ -2692,7 +2692,7 @@ an implementation file python.cxx and a configuration file python.swg.

    -

    39.10.5 Entry point to code generation

    +

    40.10.5 Entry point to code generation

    @@ -2750,7 +2750,7 @@ int Python::top(Node *n) { -

    39.10.6 Module I/O and wrapper skeleton

    +

    40.10.6 Module I/O and wrapper skeleton

    @@ -2898,7 +2898,7 @@ functionWrapper : void Shape_y_set(Shape *self, double y) -

    39.10.7 Low-level code generators

    +

    40.10.7 Low-level code generators

    @@ -3052,7 +3052,7 @@ but without the typemaps, there is still work to do.

    -

    39.10.8 Configuration files

    +

    40.10.8 Configuration files

    @@ -3196,7 +3196,7 @@ politely displays the ignoring language message. -

    39.10.9 Runtime support

    +

    40.10.9 Runtime support

    @@ -3205,7 +3205,7 @@ Discuss the kinds of functions typically needed for SWIG runtime support (e.g. the SWIG files that implement those functions.

    -

    39.10.10 Standard library files

    +

    40.10.10 Standard library files

    @@ -3224,7 +3224,7 @@ The following are the minimum that are usually supported: Please copy these and modify for any new language.

    -

    39.10.11 User examples

    +

    40.10.11 User examples

    @@ -3253,7 +3253,7 @@ during this process, see the section on .

    -

    39.10.12 Test driven development and the test-suite

    +

    40.10.12 Test driven development and the test-suite

    @@ -3312,7 +3312,7 @@ It is therefore essential that the runtime tests are written in a manner that di but error/exception out with an error message on stderr on failure.

    -

    39.10.12.1 Running the test-suite

    +

    40.10.12.1 Running the test-suite

    @@ -3504,7 +3504,7 @@ It can be run in the same way as the other language test-suites, replacing [lang The test cases used and the way it works is described in Examples/test-suite/errors/Makefile.in.

    -

    39.10.13 Documentation

    +

    40.10.13 Documentation

    @@ -3536,7 +3536,7 @@ Some topics that you'll want to be sure to address include: if available. -

    39.10.14 Coding style guidelines

    +

    40.10.14 Coding style guidelines

    @@ -3561,7 +3561,7 @@ should be avoided as unlike the SWIG developers, users will never have consisten

    -

    39.10.15 Target language status

    +

    40.10.15 Target language status

    @@ -3570,7 +3570,7 @@ the Target language in This section provides more details on how this status is given.

    -

    39.10.15.1 Supported status

    +

    40.10.15.1 Supported status

    @@ -3617,7 +3617,7 @@ A target language is given the 'Supported' status when

  • -

    39.10.15.2 Experimental status

    +

    40.10.15.2 Experimental status

    @@ -3682,7 +3682,7 @@ Some minimum requirements and notes about languages with the 'Experimental' stat -

    39.10.16 Prerequisites for adding a new language module to the SWIG distribution

    +

    40.10.16 Prerequisites for adding a new language module to the SWIG distribution

    @@ -3746,7 +3746,7 @@ the existing tests.

    -

    39.11 Debugging Options

    +

    40.11 Debugging Options

    @@ -3773,7 +3773,7 @@ There are various command line options which can aid debugging a SWIG interface The complete list of command line options for SWIG are available by running swig -help.

    -

    39.12 Guide to parse tree nodes

    +

    40.12 Guide to parse tree nodes

    @@ -4181,7 +4181,7 @@ extern "X" { ... } declaration. -

    39.13 Further Development Information

    +

    40.13 Further Development Information

    diff --git a/Doc/Manual/Go.html b/Doc/Manual/Go.html index c28cc03e1..4e230c78b 100644 --- a/Doc/Manual/Go.html +++ b/Doc/Manual/Go.html @@ -6,7 +6,7 @@ -

    24 SWIG and Go

    +

    25 SWIG and Go

      @@ -57,7 +57,7 @@ the Go programming language see golang.org.

      -

      24.1 Overview

      +

      25.1 Overview

      @@ -71,6 +71,7 @@ code. SWIG fills this gap. There are (at least) two different Go compilers. The first is the gc compiler of the Go distribution, normally invoked via the go tool. +SWIG supports the gc compiler version 1.2 or later. The second Go compiler is the gccgo compiler, which is a frontend to the GCC compiler suite. The interface to C/C++ code is completely different for the two Go compilers. @@ -86,7 +87,7 @@ type-safe as well. In case of type issues the build will fail and hence SWIG's are not used.

      -

      24.2 Examples

      +

      25.2 Examples

      @@ -101,7 +102,7 @@ SWIG interface file extension for backwards compatibility with Go 1.

      -

      24.3 Running SWIG with Go

      +

      25.3 Running SWIG with Go

      @@ -142,46 +143,8 @@ You will now have a Go package that you can import from other Go packages as usual.

      -

      -SWIG can be used without cgo, via the -no-cgo option, but -more steps are required. This only works with Go versions before 1.5. -When using Go version 1.2 or later, or when using gccgo, the code -generated by SWIG can be linked directly into the Go program. A -typical command sequence when using the Go compiler of the Go -distribution would look like this: -

      -
      -% swig -go -no-cgo example.i
      -% gcc -c code.c    # The C library being wrapped.
      -% gcc -c example_wrap.c
      -% go tool 6g example.go
      -% go tool 6c example_gc.c
      -% go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
      -% go tool 6g main.go
      -% go tool 6l main.6
      -
      - -

      -You can also put the wrapped code into a shared library, and when using the Go -versions before 1.2 this is the only supported option. A typical command -sequence for this approach would look like this: -

      - -
      -% swig -go -no-cgo -use-shlib example.i
      -% gcc -c -fpic example.c
      -% gcc -c -fpic example_wrap.c
      -% gcc -shared example.o example_wrap.o -o example.so
      -% go tool 6g example.go
      -% go tool 6c example_gc.c
      -% go tool pack grc example.a example.6 example_gc.6
      -% go tool 6g main.go  # your code, not generated by SWIG
      -% go tool 6l main.6
      -
      - - -

      24.3.1 Go-specific Commandline Options

      +

      25.3.1 Go-specific Commandline Options

      @@ -206,9 +169,7 @@ swig -go -help -no-cgo -Generate files that can be used directly, rather than via the Go - cgo tool. This option does not work with Go 1.5 or later. It is - required for versions of Go before 1.2. +This option is no longer supported. @@ -276,16 +237,13 @@ swig -go -help -

      24.3.2 Generated Wrapper Files

      +

      25.3.2 Generated Wrapper Files

      -

      There are two different approaches to generating wrapper files, - controlled by SWIG's -no-cgo option. The -no-cgo - option only works with version of Go before 1.5. It is required - when using versions of Go before 1.2.

      - -

      With or without the -no-cgo option, SWIG will generate the - following files when generating wrapper code:

      +

      +SWIG will generate the following files when generating wrapper +code: +

      • @@ -308,19 +266,8 @@ or C++ compiler.
      -

      When the -no-cgo option is used, and the -gccgo - option is not used, SWIG will also generate an additional file:

      -
        -
      • -MODULE_gc.c will contain C code which should be compiled with the C -compiler distributed as part of the gc compiler. It should then be -combined with the compiled MODULE.go using go tool pack. -
      • -
      - - -

      24.4 A tour of basic C/C++ wrapping

      +

      25.4 A tour of basic C/C++ wrapping

      @@ -330,7 +277,7 @@ modifications have to occur. This section briefly covers the essential aspects of this wrapping.

      -

      24.4.1 Go Package Name

      +

      25.4.1 Go Package Name

      @@ -340,7 +287,7 @@ directive. You may override this by using SWIG's -package command line option.

      -

      24.4.2 Go Names

      +

      25.4.2 Go Names

      @@ -372,7 +319,7 @@ followed by that name, and the destructor will be named Delete followed by that name.

      -

      24.4.3 Go Constants

      +

      25.4.3 Go Constants

      @@ -380,7 +327,7 @@ C/C++ constants created via #define or the %constant directive become Go constants, declared with a const declaration. -

      24.4.4 Go Enumerations

      +

      25.4.4 Go Enumerations

      @@ -390,7 +337,7 @@ usual). The values of the enumeration will become variables in Go; code should avoid modifying those variables.

      -

      24.4.5 Go Classes

      +

      25.4.5 Go Classes

      @@ -468,7 +415,7 @@ returns a go interface. If the returned pointer can be null, you can check for this by calling the Swigcptr() method.

      -

      24.4.5.1 Go Class Memory Management

      +

      25.4.5.1 Go Class Memory Management

      @@ -590,7 +537,7 @@ func (o *GoClassName) Close() {

    -

    24.4.5.2 Go Class Inheritance

    +

    25.4.5.2 Go Class Inheritance

    @@ -602,7 +549,7 @@ Doing the reverse will require an explicit type assertion, which will be checked dynamically.

    -

    24.4.6 Go Templates

    +

    25.4.6 Go Templates

    @@ -611,7 +558,7 @@ wrappers for a particular template instantiation. To do this, use the %template directive. -

    24.4.7 Go Director Classes

    +

    25.4.7 Go Director Classes

    @@ -629,7 +576,7 @@ completely to avoid common pitfalls with directors in Go.

    -

    24.4.7.1 Example C++ code

    +

    25.4.7.1 Example C++ code

    @@ -701,7 +648,7 @@ be found in the end of the guide.

    -

    24.4.7.2 Enable director feature

    +

    25.4.7.2 Enable director feature

    @@ -736,7 +683,7 @@ documentation on directors.

    -

    24.4.7.3 Constructor and destructor

    +

    25.4.7.3 Constructor and destructor

    @@ -789,7 +736,7 @@ embedding.

    -

    24.4.7.4 Override virtual methods

    +

    25.4.7.4 Override virtual methods

    @@ -857,7 +804,7 @@ the Go methods.

    -

    24.4.7.5 Call base methods

    +

    25.4.7.5 Call base methods

    @@ -894,7 +841,7 @@ be found in the end of the guide.

    -

    24.4.7.6 Subclass via embedding

    +

    25.4.7.6 Subclass via embedding

    @@ -962,7 +909,7 @@ class.

    -

    24.4.7.7 Memory management with runtime.SetFinalizer

    +

    25.4.7.7 Memory management with runtime.SetFinalizer

    @@ -1027,7 +974,7 @@ before using runtime.SetFinalizer to know all of its gotchas.

    -

    24.4.7.8 Complete FooBarGo example class

    +

    25.4.7.8 Complete FooBarGo example class

    @@ -1156,7 +1103,7 @@ SWIG/Examples/go/director/.

    -

    24.4.8 Default Go primitive type mappings

    +

    25.4.8 Default Go primitive type mappings

    @@ -1263,7 +1210,7 @@ that typemap, or add new values, to control how C/C++ types are mapped into Go types.

    -

    24.4.9 Output arguments

    +

    25.4.9 Output arguments

    Because of limitations in the way output arguments are processed in swig, @@ -1316,7 +1263,7 @@ void f(char *output); -

    24.4.10 Adding additional go code

    +

    25.4.10 Adding additional go code

    Often the APIs generated by swig are not very natural in go, especially if @@ -1411,7 +1358,7 @@ func bar() { -

    24.4.11 Go typemaps

    +

    25.4.11 Go typemaps

    diff --git a/Doc/Manual/Guile.html b/Doc/Manual/Guile.html index 31d822599..26679dc4b 100644 --- a/Doc/Manual/Guile.html +++ b/Doc/Manual/Guile.html @@ -8,7 +8,7 @@ -

    25 SWIG and Guile

    +

    26 SWIG and Guile

      @@ -48,7 +48,7 @@

      This section details guile-specific support in SWIG. -

      25.1 Supported Guile Versions

      +

      26.1 Supported Guile Versions

      @@ -62,7 +62,7 @@ improved performance. This is currently not tested with swig so your mileage may vary. To be safe set environment variable GUILE_AUTO_COMPILE to 0 when using swig generated guile code. -

      25.2 Meaning of "Module"

      +

      26.2 Meaning of "Module"

      @@ -70,7 +70,7 @@ There are three different concepts of "module" involved, defined separately for SWIG, Guile, and Libtool. To avoid horrible confusion, we explicitly prefix the context, e.g., "guile-module". -

      25.3 Old GH Guile API

      +

      26.3 Old GH Guile API

      Guile 1.8 and older could be interfaced using two different api's, the SCM @@ -81,7 +81,7 @@ or the GH API. The GH interface to guile is deprecated. Read more about why in version of SWIG that can still generate guile GH wrapper code is 2.0.9. Please use that version if you really need the GH wrapper code. -

      25.4 Linkage

      +

      26.4 Linkage

      @@ -89,7 +89,7 @@ Guile support is complicated by a lack of user community cohesiveness, which manifests in multiple shared-library usage conventions. A set of policies implementing a usage convention is called a linkage. -

      25.4.1 Simple Linkage

      +

      26.4.1 Simple Linkage

      @@ -183,7 +183,7 @@ information by including a directive like this in the interface file:

    -(The %scheme directive allows to insert arbitrary Scheme +(The %scheme directive allows inserting arbitrary Scheme code into the generated file module.scm; it is placed between the define-module form and the export form.) @@ -194,7 +194,7 @@ placed between the define-module form and the SWIG_init via a preprocessor define to avoid symbol clashes. For this case, however, passive linkage is available. -

    25.4.2 Passive Linkage

    +

    26.4.2 Passive Linkage

    Passive linkage is just like simple linkage, but it generates an @@ -204,7 +204,7 @@ package name (see below).

    You should use passive linkage rather than simple linkage when you are using multiple modules. -

    25.4.3 Native Guile Module Linkage

    +

    26.4.3 Native Guile Module Linkage

    SWIG can also generate wrapper code that does all the Guile module @@ -245,7 +245,7 @@ Newer Guile versions have a shorthand procedure for this: -

    25.4.4 Old Auto-Loading Guile Module Linkage

    +

    26.4.4 Old Auto-Loading Guile Module Linkage

    Guile used to support an autoloading facility for object-code @@ -271,7 +271,7 @@ option, SWIG generates an exported module initialization function with an appropriate name. -

    25.4.5 Hobbit4D Linkage

    +

    26.4.5 Hobbit4D Linkage

    @@ -296,7 +296,7 @@ my/lib/libfoo.so.X.Y.Z and friends. This scheme is still very experimental; the (hobbit4d link) conventions are not well understood.

    -

    25.5 Underscore Folding

    +

    26.5 Underscore Folding

    @@ -308,7 +308,7 @@ complained so far. %rename to specify the Guile name of the wrapped functions and variables (see CHANGES). -

    25.6 Typemaps

    +

    26.6 Typemaps

    @@ -400,7 +400,7 @@ constant will appear as a scheme variable. See Features and the %feature directive for info on how to apply the %feature.

    -

    25.7 Representation of pointers as smobs

    +

    26.7 Representation of pointers as smobs

    @@ -421,7 +421,7 @@ representing the expected pointer type. See also If the Scheme object passed was not a SWIG smob representing a compatible pointer, a wrong-type-arg exception is raised. -

    25.7.1 Smobs

    +

    26.7.1 Smobs

    @@ -440,7 +440,7 @@ structure describing this type. If a generated GOOPS module has been loaded, sm the corresponding GOOPS class.

    -

    25.7.2 Garbage Collection

    +

    26.7.2 Garbage Collection

    Garbage collection is a feature of Guile since version 1.6. As SWIG now requires Guile > 1.8, @@ -454,14 +454,14 @@ is exactly like described in 25.8 Native Guile pointers +

    26.8 Native Guile pointers

    In addition to SWIG smob pointers, Guile's native pointer type are accepted as arguments to wrapped SWIG functions. This can be useful for passing pointers to bytevector data to wrapped functions.

    -

    25.9 Exception Handling

    +

    26.9 Exception Handling

    @@ -487,7 +487,7 @@ mapping: The default when not specified here is to use "swig-error". See Lib/exception.i for details. -

    25.10 Procedure documentation

    +

    26.10 Procedure documentation

    If invoked with the command-line option -procdoc @@ -522,7 +522,7 @@ like this: typemap argument doc. See Lib/guile/typemaps.i for details. -

    25.11 Procedures with setters

    +

    26.11 Procedures with setters

    For global variables, SWIG creates a single wrapper procedure @@ -550,7 +550,7 @@ struct members, the procedures (struct-member-get pointer) and (struct-member-set pointer value) are not generated. -

    25.12 GOOPS Proxy Classes

    +

    26.12 GOOPS Proxy Classes

    SWIG can also generate classes and generic functions for use with @@ -696,7 +696,7 @@ Notice that <Foo> is used before it is defined. The fix is to just put th %import "foo.h" before the %inline block.

    -

    25.12.1 Naming Issues

    +

    26.12.1 Naming Issues

    As you can see in the example above, there are potential naming conflicts. The default exported @@ -733,7 +733,7 @@ guile-modules. For example,

    (use-modules ((Test) #:renamer (symbol-prefix-proc 'goops:))) -

    25.12.2 Linking

    +

    26.12.2 Linking

    The guile-modules generated above all need to be linked together. GOOPS support requires diff --git a/Doc/Manual/Introduction.html b/Doc/Manual/Introduction.html index 8d161b73d..facfc7dd1 100644 --- a/Doc/Manual/Introduction.html +++ b/Doc/Manual/Introduction.html @@ -416,6 +416,7 @@ major features include: Most of C++11 is also supported. Details are in the C++11 chapter. C++14 support is covered in the C++14 chapter. C++17 support is covered in the C++17 chapter. +C++20 support is covered in the C++20 chapter.

    diff --git a/Doc/Manual/Java.html b/Doc/Manual/Java.html index db5f041e4..dc403a98c 100644 --- a/Doc/Manual/Java.html +++ b/Doc/Manual/Java.html @@ -6,7 +6,7 @@ -

    26 SWIG and Java

    +

    27 SWIG and Java

    -

    26.3.3 Global variables

    +

    27.3.3 Global variables

    @@ -816,7 +816,7 @@ extern char *path; // Read-only (due to %immutable) -

    26.3.4 Constants

    +

    27.3.4 Constants

    @@ -956,7 +956,7 @@ Or if you decide this practice isn't so bad and your own class implements ex

    -

    26.3.5 Enumerations

    +

    27.3.5 Enumerations

    @@ -970,7 +970,7 @@ The final two approaches use simple integers for each enum item. Before looking at the various approaches for wrapping named C/C++ enums, anonymous enums are considered.

    -

    26.3.5.1 Anonymous enums

    +

    27.3.5.1 Anonymous enums

    @@ -1033,7 +1033,7 @@ As in the case of constants, you can access them through either the module class

    -

    26.3.5.2 Typesafe enums

    +

    27.3.5.2 Typesafe enums

    @@ -1126,7 +1126,7 @@ When upgrading to JDK 1.5 or later, proper Java enums could be used instead, wit The following section details proper Java enum generation.

    -

    26.3.5.3 Proper Java enums

    +

    27.3.5.3 Proper Java enums

    @@ -1179,7 +1179,7 @@ The additional support methods need not be generated if none of the enum items h Simpler Java enums for enums without initializers section.

    -

    26.3.5.4 Type unsafe enums

    +

    27.3.5.4 Type unsafe enums

    @@ -1227,7 +1227,7 @@ Note that unlike typesafe enums, this approach requires users to mostly use diff Thus the upgrade path to proper enums provided in JDK 1.5 is more painful.

    -

    26.3.5.5 Simple enums

    +

    27.3.5.5 Simple enums

    @@ -1246,7 +1246,7 @@ SWIG-1.3.21 and earlier versions wrapped all enums using this approach. The type unsafe approach is preferable to this one and this simple approach is only included for backwards compatibility with these earlier versions of SWIG.

    -

    26.3.6 Pointers

    +

    27.3.6 Pointers

    @@ -1334,7 +1334,7 @@ C-style cast may return a bogus result whereas as the C++-style cast will return a NULL pointer if the conversion can't be performed.

    -

    26.3.7 Structures

    +

    27.3.7 Structures

    @@ -1502,7 +1502,7 @@ x.setA(3); // Modify x.a - this is the same as b.f.a -

    26.3.8 C++ classes

    +

    27.3.8 C++ classes

    @@ -1565,7 +1565,7 @@ int bar = Spam.getBar(); -

    26.3.9 C++ inheritance

    +

    27.3.9 C++ inheritance

    @@ -1626,7 +1626,7 @@ Note that Java does not support multiple inheritance so any multiple inheritance A warning is given when multiple inheritance is detected and only the first base class is used.

    -

    26.3.10 Pointers, references, arrays and pass by value

    +

    27.3.10 Pointers, references, arrays and pass by value

    @@ -1681,7 +1681,7 @@ to hold the result and a pointer is returned (Java will release this memory when the returned object's finalizer is run by the garbage collector).

    -

    26.3.10.1 Null pointers

    +

    27.3.10.1 Null pointers

    @@ -1705,7 +1705,7 @@ For spam1 and spam4 above the Java null gets translat The converse also occurs, that is, NULL pointers are translated into null Java objects when returned from a C/C++ function.

    -

    26.3.11 C++ overloaded functions

    +

    27.3.11 C++ overloaded functions

    @@ -1820,7 +1820,7 @@ void spam(unsigned short); // Ignored -

    26.3.12 C++ default arguments

    +

    27.3.12 C++ default arguments

    @@ -1863,7 +1863,7 @@ Further details on default arguments and how to restore this approach are given

    -

    26.3.13 C++ namespaces

    +

    27.3.13 C++ namespaces

    @@ -1953,7 +1953,7 @@ If the resulting use of the nspace feature and hence packages results in a proxy you will need to open up the visibility for the pointer constructor and getCPtr method from the default 'protected' to 'public' with the SWIG_JAVABODY_PROXY macro. See Java code typemaps.

    -

    26.3.14 C++ templates

    +

    27.3.14 C++ templates

    @@ -2002,10 +2002,10 @@ Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter.

    -

    26.3.15 C++ Smart Pointers

    +

    27.3.15 C++ Smart Pointers

    -

    26.3.15.1 The shared_ptr Smart Pointer

    +

    27.3.15.1 The shared_ptr Smart Pointer

    @@ -2016,7 +2016,7 @@ in the shared_ptr smart pointer -

    26.3.15.2 Generic Smart Pointers

    +

    27.3.15.2 Generic Smart Pointers

    @@ -2100,7 +2100,7 @@ Foo f = p.__deref__(); // Returns underlying Foo * -

    26.4 Further details on the generated Java classes

    +

    27.4 Further details on the generated Java classes

    @@ -2115,7 +2115,7 @@ Finally enum classes are covered. First, the crucial intermediary JNI class is considered.

    -

    26.4.1 The intermediary JNI class

    +

    27.4.1 The intermediary JNI class

    @@ -2235,7 +2235,7 @@ If name is the same as modulename then the module class name g from modulename to modulenameModule.

    -

    26.4.1.1 The intermediary JNI class pragmas

    +

    27.4.1.1 The intermediary JNI class pragmas

    @@ -2317,7 +2317,7 @@ For example, let's change the intermediary JNI class access to just the default All the methods in the intermediary JNI class will then not be callable outside of the package as the method modifiers have been changed from public access to default access. This is useful if you want to prevent users calling these low level functions.

    -

    26.4.2 The Java module class

    +

    27.4.2 The Java module class

    @@ -2348,7 +2348,7 @@ example.egg(new Foo()); The primary reason for having the module class wrapping the calls in the intermediary JNI class is to implement static type checking. In this case only a Foo can be passed to the egg function, whereas any long can be passed to the egg function in the intermediary JNI class.

    -

    26.4.2.1 The Java module class pragmas

    +

    27.4.2.1 The Java module class pragmas

    @@ -2399,7 +2399,7 @@ See The intermediary JNI class pragmas secti

    -

    26.4.3 Java proxy classes

    +

    27.4.3 Java proxy classes

    @@ -2475,7 +2475,7 @@ int y = f.spam(5, new Foo()); -

    26.4.3.1 Memory management

    +

    27.4.3.1 Memory management

    @@ -2637,7 +2637,7 @@ and

    -

    26.4.3.2 Inheritance

    +

    27.4.3.2 Inheritance

    @@ -2753,7 +2753,7 @@ However, true cross language polymorphism can be achieved using the 26.4.3.3 Proxy classes and garbage collection +

    27.4.3.3 Proxy classes and garbage collection

    @@ -2836,7 +2836,7 @@ The section on Java typemaps details how to specify See the How to Handle Java Finalization's Memory-Retention Issues article for alternative approaches to managing memory by avoiding finalizers altogether.

    -

    26.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    +

    27.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    @@ -2958,7 +2958,7 @@ For example: Compatibility note: The generation of this additional parameter did not occur in versions prior to SWIG-1.3.30.

    -

    26.4.3.5 Single threaded applications and thread safety

    +

    27.4.3.5 Single threaded applications and thread safety

    @@ -3046,7 +3046,7 @@ for (int i=0; i<100000; i++) { -

    26.4.4 Type wrapper classes

    +

    27.4.4 Type wrapper classes

    @@ -3133,7 +3133,7 @@ public static void spam(SWIGTYPE_p_int x, SWIGTYPE_p_int y, int z) { ... } -

    26.4.5 Enum classes

    +

    27.4.5 Enum classes

    @@ -3142,7 +3142,7 @@ The Enumerations section discussed these but om The following sub-sections detail the various types of enum classes that can be generated.

    -

    26.4.5.1 Typesafe enum classes

    +

    27.4.5.1 Typesafe enum classes

    @@ -3226,7 +3226,7 @@ The swigValue method is used for marshalling in the other direction. The toString method is overridden so that the enum name is available.

    -

    26.4.5.2 Proper Java enum classes

    +

    27.4.5.2 Proper Java enum classes

    @@ -3304,7 +3304,7 @@ These needn't be generated if the enum being wrapped does not have any initializ Simpler Java enums for enums without initializers section describes how typemaps can be used to achieve this.

    -

    26.4.5.3 Type unsafe enum classes

    +

    27.4.5.3 Type unsafe enum classes

    @@ -3335,7 +3335,7 @@ public final class Beverage { -

    26.4.6 Interfaces

    +

    27.4.6 Interfaces

    @@ -3580,7 +3580,7 @@ typemap which is only used when a class is marked with the interface fe See Java code typemaps for details.

    -

    26.5 Cross language polymorphism using directors

    +

    27.5 Cross language polymorphism using directors

    @@ -3602,7 +3602,7 @@ The upshot is that C++ classes can be extended in Java and from C++ these extens Neither C++ code nor Java code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions transparently takes care of all the cross-language method routing.

    -

    26.5.1 Enabling directors

    +

    27.5.1 Enabling directors

    @@ -3670,7 +3670,7 @@ public: -

    26.5.2 Director classes

    +

    27.5.2 Director classes

    @@ -3698,7 +3698,7 @@ If the correct implementation is in Java, the Java API is used to call the metho

    -

    26.5.3 Overhead and code bloat

    +

    27.5.3 Overhead and code bloat

    @@ -3716,7 +3716,7 @@ This situation can be optimized by selectively enabling director methods (using

    -

    26.5.4 Simple directors example

    +

    27.5.4 Simple directors example

    @@ -3779,7 +3779,7 @@ DirectorDerived.upcall_method() invoked. -

    26.5.5 Director threading issues

    +

    27.5.5 Director threading issues

    @@ -3799,7 +3799,7 @@ Macros can be defined on the commandline when compiling your C++ code, or altern -

    26.5.6 Director performance tuning

    +

    27.5.6 Director performance tuning

    @@ -3820,7 +3820,7 @@ However, if all director methods are expected to usually be overridden by Java s The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical.

    -

    26.5.7 Java exceptions from directors

    +

    27.5.7 Java exceptions from directors

    @@ -3896,7 +3896,7 @@ Exception in thread "main" java.lang.RuntimeException: There was a problem! More on the Swig::DirectorException class can be found in the next section which details how to customize the handling of director exceptions.

    -

    26.5.7.1 Customizing director exceptions

    +

    27.5.7.1 Customizing director exceptions

    @@ -4030,7 +4030,7 @@ repetitive duplication of the director:except feature code for each director method. To mitigate this, a second approach is provided via typemaps in a fashion analogous to -the "throws" typemap. +the "throws" typemap. The "throws" typemap provides a way to map all the C++ exceptions listed in a method's defined exceptions (either from a C++ exception specification or a %catches @@ -4081,7 +4081,7 @@ has the $directorthrowshandlers special variable replaced with the the relevant "directorthrows" typemaps, for each and every exception defined for the method. The relevant exceptions can be defined either with a C++ exception specification or %catches as described for the -"throws" typemap. +"throws" typemap.

    @@ -4454,7 +4454,7 @@ Exception in thread "main" java.lang.IndexOutOfBoundsException: Index is negativ -

    26.6 Accessing protected members

    +

    27.6 Accessing protected members

    @@ -4550,7 +4550,7 @@ class MyProtectedBase extends ProtectedBase -

    26.7 Common customization features

    +

    27.7 Common customization features

    @@ -4562,7 +4562,7 @@ be awkward. This section describes some common SWIG features that are used to improve the interface to existing C/C++ code.

    -

    26.7.1 C/C++ helper functions

    +

    27.7.1 C/C++ helper functions

    @@ -4628,7 +4628,7 @@ hard to implement. It is possible to improve on this using Java code, typemaps, customization features as covered in later sections, but sometimes helper functions are a quick and easy solution to difficult cases.

    -

    26.7.2 Class extension with %extend

    +

    27.7.2 Class extension with %extend

    @@ -4691,7 +4691,7 @@ Vector(2, 3, 4) in any way---the extensions only show up in the Java interface.

    -

    26.7.3 Class extension with %proxycode

    +

    27.7.3 Class extension with %proxycode

    @@ -4828,7 +4828,7 @@ public class ValueUnsignedInt { -

    26.7.4 Exception handling with %exception and %javaexception

    +

    27.7.4 Exception handling with %exception and %javaexception

    @@ -4987,7 +4987,7 @@ to raise exceptions. See the SWIG Library ch The typemap example Handling C++ exception specifications as Java exceptions provides further exception handling capabilities.

    -

    26.7.5 Method access with %javamethodmodifiers

    +

    27.7.5 Method access with %javamethodmodifiers

    @@ -5013,7 +5013,7 @@ protected static void protect_me() { -

    26.8 Tips and techniques

    +

    27.8 Tips and techniques

    @@ -5023,7 +5023,7 @@ strings and arrays. This chapter discusses the common techniques for solving these problems.

    -

    26.8.1 Input and output parameters using primitive pointers and references

    +

    27.8.1 Input and output parameters using primitive pointers and references

    @@ -5197,7 +5197,7 @@ void foo(Bar *OUTPUT); will not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    -

    26.8.2 Simple pointers

    +

    27.8.2 Simple pointers

    @@ -5263,7 +5263,7 @@ System.out.println("3 + 4 = " + result); See the SWIG Library chapter for further details.

    -

    26.8.3 Wrapping C arrays with Java arrays

    +

    27.8.3 Wrapping C arrays with Java arrays

    @@ -5330,7 +5330,7 @@ Please be aware that the typemaps in this library are not efficient as all the e There is an alternative approach using the SWIG array library and this is covered in the next section.

    -

    26.8.4 Unbounded C Arrays

    +

    27.8.4 Unbounded C Arrays

    @@ -5475,7 +5475,7 @@ well suited for applications in which you need to create buffers, package binary data, etc.

    -

    26.8.5 Binary data vs Strings

    +

    27.8.5 Binary data vs Strings

    @@ -5519,7 +5519,7 @@ len: 5 data: 68 69 0 6a 6b -

    26.8.6 Overriding new and delete to allocate from Java heap

    +

    27.8.6 Overriding new and delete to allocate from Java heap

    @@ -5636,7 +5636,7 @@ model and use these functions in place of malloc and free in your own code.

    -

    26.9 Java typemaps

    +

    27.9 Java typemaps

    @@ -5657,7 +5657,7 @@ Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the generated code. -

    26.9.1 Default primitive type mappings

    +

    27.9.1 Default primitive type mappings

    @@ -5809,7 +5809,7 @@ However, the mappings allow the full range of values for each C type from Java.

    -

    26.9.2 Default typemaps for non-primitive types

    +

    27.9.2 Default typemaps for non-primitive types

    @@ -5824,7 +5824,7 @@ So in summary, the C/C++ pointer to non-primitive types is cast into the 64 bit The Java type is either the proxy class or type wrapper class.

    -

    26.9.3 Sixty four bit JVMs

    +

    27.9.3 Sixty four bit JVMs

    @@ -5837,7 +5837,7 @@ Unfortunately it won't of course hold true for JNI code.

    -

    26.9.4 What is a typemap?

    +

    27.9.4 What is a typemap?

    @@ -5960,7 +5960,7 @@ int c = example.count('e', "Hello World"); -

    26.9.5 Typemaps for mapping C/C++ types to Java types

    +

    27.9.5 Typemaps for mapping C/C++ types to Java types

    @@ -6240,7 +6240,7 @@ These are listed below: -

    26.9.6 Java typemap attributes

    +

    27.9.6 Java typemap attributes

    @@ -6286,7 +6286,7 @@ The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a this call. In Java the this call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a Date marshalling example showing 'pre', 'post' and 'pgcppname' attributes in action.

    -

    26.9.7 Java special variables

    +

    27.9.7 Java special variables

    @@ -6468,7 +6468,7 @@ in that it is not fully qualified with the package name when using the nspace feature.

    -

    26.9.8 Typemaps for both C and C++ compilation

    +

    27.9.8 Typemaps for both C and C++ compilation

    @@ -6505,7 +6505,7 @@ If you do not intend your code to be targeting both C and C++ then your typemaps

    -

    26.9.9 Java code typemaps

    +

    27.9.9 Java code typemaps

    @@ -6610,6 +6610,15 @@ Below shows an example modifying the finalizer, assuming the delete met +

    %typemap(javainterfacemodifiers)

    +
    +Interface modifiers for the Java interface generated when using the interface feature, see Java interfaces section. The default is "public interface". +

    +Compatibility note: This typemap was added in SWIG-4.1.0. +

    + +
    +

    %typemap(javainterfacecode, declaration="...", cptrmethod="...")

    @@ -6709,7 +6718,7 @@ The "javaimports" typemap is ignored if the enum class is wrapped by an inner Ja

     [ javaimports typemap ]
    -public interface [ javainterfacename ] {
    +[ javainterfacemodifiers typemap ] [ javainterfacename ] {
     [ javainterfacecode:cptrmethod typemap attribute ]
     ... interface declarations ...
     }
    @@ -6803,7 +6812,7 @@ to make the method and constructor public:
     
    -

    26.9.10 Director specific typemaps

    +

    27.9.10 Director specific typemaps

    @@ -7080,7 +7089,7 @@ The basic strategy here is to provide a default package typemap for the majority

    -

    26.10 Typemap Examples

    +

    27.10 Typemap Examples

    @@ -7090,7 +7099,7 @@ the SWIG library.

    -

    26.10.1 Simpler Java enums for enums without initializers

    +

    27.10.1 Simpler Java enums for enums without initializers

    @@ -7169,7 +7178,7 @@ This would be done by using the original versions of these typemaps in "enums.sw

    -

    26.10.2 Handling C++ exception specifications as Java exceptions

    +

    27.10.2 Handling C++ exception specifications as Java exceptions

    @@ -7294,7 +7303,7 @@ We could alternatively have used %rename to rename what() into

    -

    26.10.3 NaN Exception - exception handling for a particular type

    +

    27.10.3 NaN Exception - exception handling for a particular type

    @@ -7449,7 +7458,7 @@ If we were a martyr to the JNI cause, we could replace the succinct code within If we had, we would have put it in the "in" typemap which, like all JNI and Java typemaps, also supports the 'throws' attribute.

    -

    26.10.4 Converting Java String arrays to char **

    +

    27.10.4 Converting Java String arrays to char **

    @@ -7593,7 +7602,7 @@ Lastly the "jni", "jtype" and "jstype" typemaps are also required to specify what Java types to use.

    -

    26.10.5 Expanding a Java object to multiple arguments

    +

    27.10.5 Expanding a Java object to multiple arguments

    @@ -7675,7 +7684,7 @@ example.foo(new String[]{"red", "green", "blue", "white"}); -

    26.10.6 Using typemaps to return arguments

    +

    27.10.6 Using typemaps to return arguments

    @@ -7793,7 +7802,7 @@ $ java runme 1 12.0 340.0 -

    26.10.7 Adding Java downcasts to polymorphic return types

    +

    27.10.7 Adding Java downcasts to polymorphic return types

    @@ -7999,7 +8008,7 @@ SWIG usually generates code which constructs the proxy classes using Java code a Note that the JNI code above uses a number of string lookups to call a constructor, whereas this would not occur using byte compiled Java code.

    -

    26.10.8 Adding an equals method to the Java classes

    +

    27.10.8 Adding an equals method to the Java classes

    @@ -8043,7 +8052,7 @@ System.out.println("foo1? " + foo1.equals(foo2)); -

    26.10.9 Void pointers and a common Java base class

    +

    27.10.9 Void pointers and a common Java base class

    @@ -8102,7 +8111,7 @@ This example contains some useful functionality which you may want in your code.

  • It also has a function which effectively implements a cast from the type of the proxy/type wrapper class to a void pointer. This is necessary for passing a proxy class or a type wrapper class to a function that takes a void pointer. -

    26.10.10 Struct pointer to pointer

    +

    27.10.10 Struct pointer to pointer

    @@ -8282,7 +8291,7 @@ The C functional interface has been completely morphed into an object-oriented i the Butler class would behave much like any pure Java class and feel more natural to Java users.

    -

    26.10.11 Memory management when returning references to member variables

    +

    27.10.11 Memory management when returning references to member variables

    @@ -8405,7 +8414,7 @@ public class Bike { Note the addReference call.

    -

    26.10.12 Memory management for objects passed to the C++ layer

    +

    27.10.12 Memory management for objects passed to the C++ layer

    @@ -8533,7 +8542,7 @@ as mentioned earlier, setElement is actually: -

    26.10.13 Date marshalling using the javain typemap and associated attributes

    +

    27.10.13 Date marshalling using the javain typemap and associated attributes

    @@ -8710,7 +8719,7 @@ A few things to note: -

    26.11 Living with Java Directors

    +

    27.11 Living with Java Directors

    @@ -8889,10 +8898,10 @@ public abstract class UserVisibleFoo extends Foo {

  • -

    26.12 Odds and ends

    +

    27.12 Odds and ends

    -

    26.12.1 JavaDoc comments

    +

    27.12.1 JavaDoc comments

    @@ -8948,7 +8957,7 @@ public class Barmy { -

    26.12.2 Functional interface without proxy classes

    +

    27.12.2 Functional interface without proxy classes

    @@ -9009,7 +9018,7 @@ All destructors have to be called manually for example the delete_Foo(foo) -

    26.12.3 Using your own JNI functions

    +

    27.12.3 Using your own JNI functions

    @@ -9059,7 +9068,7 @@ This directive is only really useful if you want to mix your own hand crafted JN

    -

    26.12.4 Performance concerns and hints

    +

    27.12.4 Performance concerns and hints

    @@ -9080,7 +9089,7 @@ However, you will have to be careful about memory management and make sure that This method normally calls the C++ destructor or free() for C code.

    -

    26.12.5 Debugging

    +

    27.12.5 Debugging

    @@ -9102,7 +9111,7 @@ The -verbose:jni and -verbose:gc are also useful options for monitoring code beh

    -

    26.13 Java Examples

    +

    27.13 Java Examples

    diff --git a/Doc/Manual/Javascript.html b/Doc/Manual/Javascript.html index 417ee4585..54bd68521 100644 --- a/Doc/Manual/Javascript.html +++ b/Doc/Manual/Javascript.html @@ -7,7 +7,7 @@ -

    27 SWIG and Javascript

    +

    28 SWIG and Javascript

      @@ -52,7 +52,7 @@

      This chapter describes SWIG's support of Javascript. It does not cover SWIG basics, but only information that is specific to this module.

      -

      27.1 Overview

      +

      28.1 Overview

      Javascript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. Its arguably the most popular language for web development. @@ -63,10 +63,10 @@ Javascript has gone beyond being a browser-based scripting language and with node-webkit there is a platform which uses Google's Chromium as Web-Browser widget and node.js for javascript extensions.

      -

      27.2 Preliminaries

      +

      28.2 Preliminaries

      -

      27.2.1 Running SWIG

      +

      28.2.1 Running SWIG

      Suppose that you defined a SWIG module such as the following:

      @@ -89,19 +89,24 @@ $ swig -javascript -jsc example.i
       $ swig -c++ -javascript -jsc example.i
    -

    The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.

    -

    The API headers for V8 >= 4.3.0 define constants which SWIG can use to -determine the V8 version it is compiling for. For versions < 4.3.0, you +

    The V8 code that SWIG generates should work with most versions from 3.11.10. +However, the only early version that receives some testing is 3.14.5, which is +still shipped with Ubuntu for some reason. Other than that it's probably safer +to assume that versions earlier than 5.0 are no longer supported. Keep in mind +that these are V8 versions, not Node.js. To give some perspective, Node.js v6.0 +uses V8 5.0, v12.0 - 7.4, v14.0 - 8.1...

    +

    The API headers for V8 >= 4.3.10 define constants which SWIG can use to +determine the V8 version it is compiling for. For versions < 4.3.10, you need to specify the V8 version when running SWIG. This is specified as a hex constant, but the constant is read as pairs of decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't represent components > 99, -but this constant is only useful for V8 < 4.3.0, and no V8 versions from +but this constant is only useful for V8 < 4.3.10, and no V8 versions from that era had a component > 99. For example:

     $ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i
    -

    If you're targeting V8 >= 4.3.0, you would just run swig like so:

    +

    If you're targeting V8 >= 4.3.10, you would just run swig like so:

     $ swig -c++ -javascript -v8 example.i
    @@ -121,7 +126,7 @@ void example_initialize(v8::Handle<v8::Object> exports) Note: be aware that v8 has a C++ API, and thus, the generated modules must be compiled as C++.

    -

    27.2.2 Running Tests and Examples

    +

    28.2.2 Running Tests and Examples

    The configuration for tests and examples currently supports Linux and Mac only and not MinGW (Windows) yet.

    @@ -153,7 +158,7 @@ $ make check-javascript-test-suite ENGINE=jsc $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8
    -

    27.2.3 Known Issues

    +

    28.2.3 Known Issues

    At the moment, the Javascript generators pass all tests syntactically, i.e., the generated source code compiles. However, there are still remaining runtime issues.

    @@ -163,19 +168,18 @@ $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8
  • Multiple output arguments do not work for JSC

  • C89 incompatibility: the JSC generator might still generate C89 violating code

  • long long is not supported

  • -
  • %native is not supported

  • Javascript callbacks are not supported

  • instanceOf does not work under JSC

  • The primary development environment has been Linux (Ubuntu 12.04). Windows and Mac OS X have been tested sporadically. Therefore, the generators might have more issues on those platforms. Please report back any problem you observe to help us improving this module quickly.

    -

    27.3 Integration

    +

    28.3 Integration

    This chapter gives a short introduction how to use a native Javascript extension: as a node.js module, and as an extension for an embedded Webkit.

    -

    27.3.1 Creating node.js Extensions

    +

    28.3.1 Creating node.js Extensions

    To install node.js you can download an installer from their web-site for Mac OS X and Windows. For Linux you can either build the source yourself and run sudo checkinstall or keep to the (probably stone-age) packaged version. For Ubuntu there is a PPA available.

    @@ -221,7 +225,7 @@ require("./build/Release/example")

    A more detailed explanation is given in the Examples section.

    -

    27.3.1.1 Troubleshooting

    +

    28.3.1.1 Troubleshooting

      @@ -233,12 +237,12 @@ require("./build/Release/example") $ sudo apt-get remove gyp -

      27.3.2 Embedded Webkit

      +

      28.3.2 Embedded Webkit

      Webkit is pre-installed on Mac OS X and available as a library for GTK.

      -

      27.3.2.1 Mac OS X

      +

      28.3.2.1 Mac OS X

      There is general information about programming with WebKit on Apple Developer Documentation. Details about Cocoa programming are not covered here.

      @@ -286,7 +290,7 @@ extern bool example_initialize(JSGlobalContextRef context, JSObjectRef* exports) @end -

      27.3.2.2 GTK

      +

      28.3.2.2 GTK

      There is general information about programming GTK at GTK documentation and in the GTK tutorial, and for Webkit there is a Webkit GTK+ API Reference.

      @@ -331,7 +335,7 @@ int main(int argc, char* argv[]) } -

      27.3.3 Creating Applications with node-webkit

      +

      28.3.3 Creating Applications with node-webkit

      To get started with node-webkit there is a very informative set of wiki pages.

      @@ -402,7 +406,7 @@ the main window.

      As known from node.js one can use require to load javascript modules. -Additionally, node-webkit provides an API that allows to manipulate the window's menu, +Additionally, node-webkit provides an API that allows manipulating the window's menu, open new windows, and many more things.

      @@ -422,12 +426,12 @@ open new windows, and many more things. }; -

      27.4 Examples

      +

      28.4 Examples

      Some basic examples are shown here in more detail.

      -

      27.4.1 Simple

      +

      28.4.1 Simple

      The common example simple looks like this:

      @@ -477,7 +481,7 @@ example.Foo = 3.1415926;

      Note: ECMAScript 5, the currently implemented Javascript standard, does not have modules. node.js and other implementations provide this mechanism defined by the CommonJS group. For browsers this is provided by Browserify, for instance.

      -

      27.4.2 Class

      +

      28.4.2 Class

      The common example class defines three classes, Shape, Circle, and Square:

      @@ -607,12 +611,12 @@ at emitKey (readline.js:1095:12) Note: In ECMAScript 5 there is no concept for classes. Instead each function can be used as a constructor function which is executed by the 'new' operator. Furthermore, during construction the key property prototype of the constructor function is used to attach a prototype instance to the created object. A prototype is essentially an object itself that is the first-class delegate of a class used whenever the access to a property of an object fails. The very same prototype instance is shared among all instances of one type. Prototypal inheritance is explained in more detail on in Inheritance and the prototype chain, for instance.

      -

      27.5 Implementation

      +

      28.5 Implementation

      The Javascript Module implementation has taken a very different approach compared to other language modules in order to support different Javascript interpreters.

      -

      27.5.1 Source Code

      +

      28.5.1 Source Code

      The Javascript module is implemented in Source/Modules/javascript.cxx. It dispatches the code generation to a JSEmitter instance, V8Emitter or JSCEmitter. Additionally there are some helpers: Template, for templated code generation, and JSEmitterState, which is used to manage state information during AST traversal. This rough map shall make it easier to find a way through this huge source file:

      @@ -713,7 +717,7 @@ Template::Template(const String *code_) { ... } ... -

      27.5.2 Code Templates

      +

      28.5.2 Code Templates

      All generated code is created on the basis of code templates. The templates for JavascriptCore can be found in Lib/javascript/jsc/javascriptcode.swg, for v8 in Lib/javascript/v8/javascriptcode.swg.

      @@ -752,7 +756,7 @@ t_register.replace("$jsparent", state.clazz(NAME_MANGLED))

      Template creates a copy of that string and Template::replace uses Swig's Replaceall to replace variables in the template. Template::trim can be used to eliminate leading and trailing whitespaces. Template::print is used to write the final template string to a Swig DOH (based on Printv). All methods allow chaining.

      -

      27.5.3 Emitter

      +

      28.5.3 Emitter

      The Javascript module delegates code generation to a JSEmitter instance. The following extract shows the essential interface:

      @@ -871,7 +875,7 @@ int JAVASCRIPT::classHandler(Node *n) {

      In enterClass the emitter stores state information that is necessary when processing class members. In exitClass the wrapper code for the whole class is generated.

      -

      27.5.4 Emitter states

      +

      28.5.4 Emitter states

      For storing information during the AST traversal the emitter provides a JSEmitterState with different slots to store data representing the scopes global, class, function, and variable.

      @@ -915,7 +919,7 @@ state.clazz(NAME, Getattr(n, "sym:name"));

      State information can be retrieved using state.clazz(NAME) or with Getattr on state.clazz() which actually returns a Hash instance.

      -

      27.5.5 Handling Exceptions in JavascriptCore

      +

      28.5.5 Handling Exceptions in JavascriptCore

      Applications with an embedded JavascriptCore should be able to present detailed exception messages that occur in the Javascript engine. Below is an example derived from code provided by Brian Barnes on how these exception details can be extracted.

      diff --git a/Doc/Manual/Library.html b/Doc/Manual/Library.html index 560859234..5f72b557d 100644 --- a/Doc/Manual/Library.html +++ b/Doc/Manual/Library.html @@ -7,7 +7,7 @@ -

      11 SWIG library

      +

      12 SWIG library

      -

      11.2.4 cdata.i

      +

      12.2.4 cdata.i

      @@ -769,7 +769,7 @@ char *cdata_name(type* ptr, int nitems) Clearly they are unsafe.

      -

      11.3 C string handling

      +

      12.3 C string handling

      @@ -789,7 +789,7 @@ morality. The modules in this section provide basic functionality for manipulating raw C strings.

      -

      11.3.1 Default string handling

      +

      12.3.1 Default string handling

      @@ -830,7 +830,7 @@ interpreter and lead to a crash). Furthermore, the default behavior does not work well with binary data. Instead, strings are assumed to be NULL-terminated.

      -

      11.3.2 Passing binary data

      +

      12.3.2 Passing binary data

      @@ -872,7 +872,7 @@ In the wrapper function, the passed string will be expanded to a pointer and len The (char *STRING, int LENGTH) multi-argument typemap is also available in addition to (char *STRING, size_t LENGTH).

      -

      11.3.3 Using %newobject to release memory

      +

      12.3.3 Using %newobject to release memory

      @@ -913,7 +913,7 @@ however, you may need to provide your own "newfree" typemap for other types. See Object ownership and %newobject for more details.

      -

      11.3.4 cstring.i

      +

      12.3.4 cstring.i

      @@ -1373,7 +1373,7 @@ structure or class instead.

    -

    11.4 STL/C++ library

    +

    12.4 STL/C++ library

    @@ -1420,7 +1420,7 @@ Please look for the library files in the appropriate language library directory.

    -

    11.4.1 std::string

    +

    12.4.1 std::string

    @@ -1504,7 +1504,7 @@ void foo(string s, const String &t); // std_string typemaps still applie -

    11.4.2 std::vector

    +

    12.4.2 std::vector

    @@ -1683,7 +1683,7 @@ if you want to make their head explode. details and the public API exposed to the interpreter vary.

    -

    11.4.3 STL exceptions

    +

    12.4.3 STL exceptions

    @@ -1733,10 +1733,10 @@ The %exception directive can be used by placing the following code befo Any thrown STL exceptions will then be gracefully handled instead of causing a crash.

    -

    11.4.4 shared_ptr smart pointer

    +

    12.4.4 shared_ptr smart pointer

    -

    11.4.4.1 shared_ptr basics

    +

    12.4.4.1 shared_ptr basics

    @@ -1832,7 +1832,7 @@ System.out.println(val1 + " " + val2); -

    11.4.4.2 shared_ptr and inheritance

    +

    12.4.4.2 shared_ptr and inheritance

    @@ -1923,7 +1923,7 @@ Adding the missing %shared_ptr macros will fix this: -

    11.4.4.3 shared_ptr and method overloading

    +

    12.4.4.3 shared_ptr and method overloading

    @@ -1945,7 +1945,7 @@ SWIG will choose to wrap just the first method by default. For the interested reader, SWIG detects that they are equivalent types via the typecheck typemaps in the shared_ptr library.

    -

    11.4.4.4 shared_ptr and templates

    +

    12.4.4.4 shared_ptr and templates

    @@ -1987,7 +1987,7 @@ The SWIG code below shows the required ordering: -

    11.4.4.5 shared_ptr and directors

    +

    12.4.4.5 shared_ptr and directors

    @@ -1995,7 +1995,7 @@ The languages that support shared_ptr also have support for using shared_ptr wit

    -

    11.4.5 auto_ptr smart pointer

    +

    12.4.5 auto_ptr smart pointer

    @@ -2044,10 +2044,10 @@ int value = k.getValue(); -

    11.5 Utility Libraries

    +

    12.5 Utility Libraries

    -

    11.5.1 exception.i

    +

    12.5.1 exception.i

    diff --git a/Doc/Manual/Lua.html b/Doc/Manual/Lua.html index 6633eaa38..80807baf4 100644 --- a/Doc/Manual/Lua.html +++ b/Doc/Manual/Lua.html @@ -7,7 +7,7 @@ -

    28 SWIG and Lua

    +

    29 SWIG and Lua

      @@ -83,14 +83,14 @@ Lua is an extension programming language designed to support general procedural eLua stands for Embedded Lua (can be thought of as a flavor of Lua) and offers the full implementation of the Lua programming language to the embedded world, extending it with specific features for efficient and portable software embedded development. eLua runs on smaller devices like microcontrollers and provides the full features of the regular Lua desktop version. More information on eLua can be found here: http://www.eluaproject.net

      -

      28.1 Preliminaries

      +

      29.1 Preliminaries

      The current SWIG implementation is designed to work with Lua 5.0.x, 5.1.x and 5.2.x. It should work with later versions of Lua, but certainly not with Lua 4.0 due to substantial API changes. It is possible to either static link or dynamic link a Lua module into the interpreter (normally Lua static links its libraries, as dynamic linking is not available on all platforms). SWIG also has support for eLua starting from eLua 0.8. Due to substantial changes between SWIG 2.x and SWIG 3.0 and unavailability of testing platform, eLua status was downgraded to 'experimental'.

      -

      28.2 Running SWIG

      +

      29.2 Running SWIG

      @@ -138,14 +138,14 @@ $ swig -lua -eluac example.i The -elua option puts all the C function wrappers and variable get/set wrappers in rotables. It also generates a metatable which will control the access to these variables from eLua. It also offers a significant amount of module size compression. On the other hand, the -eluac option puts all the wrappers in a single rotable. With this option, no matter how huge the module, it will consume no additional microcontroller SRAM (crass compression). There is a catch though: Metatables are not generated with -eluac. To access any value from eLua, one must directly call the wrapper function associated with that value.

      -

      28.2.1 Additional command line options

      +

      29.2.1 Additional command line options

      The following table list the additional commandline options available for the Lua module. They can also be seen by using:

      -
      +
       swig -lua -help 
       
      @@ -179,7 +179,7 @@ swig -lua -help -

      28.2.2 Compiling and Linking and Interpreter

      +

      29.2.2 Compiling and Linking and Interpreter

      @@ -250,7 +250,7 @@ LUALIB_API int ( luaopen_mod )(lua_State *L ); More information on building and configuring eLua can be found here: http://www.eluaproject.net/doc/v0.8/en_building.html

      -

      28.2.3 Compiling a dynamic module

      +

      29.2.3 Compiling a dynamic module

      @@ -318,7 +318,7 @@ Is quite obvious (Go back and consult the Lua documents on how to enable loadlib -

      28.2.4 Using your module

      +

      29.2.4 Using your module

      @@ -336,19 +336,19 @@ $ ./my_lua >

      -

      28.3 A tour of basic C/C++ wrapping

      +

      29.3 A tour of basic C/C++ wrapping

      By default, SWIG tries to build a very natural Lua interface to your C/C++ code. This section briefly covers the essential aspects of this wrapping.

      -

      28.3.1 Modules

      +

      29.3.1 Modules

      The SWIG module directive specifies the name of the Lua module. If you specify `module example', then everything is wrapped into a Lua table 'example' containing all the functions and variables. When choosing a module name, make sure you don't use the same name as a built-in Lua command or standard module name.

      -

      28.3.2 Functions

      +

      29.3.2 Functions

      @@ -389,7 +389,7 @@ It is also possible to rename the module with an assignment. 24

    -

    28.3.3 Global variables

    +

    29.3.3 Global variables

    @@ -477,7 +477,7 @@ If you have used the -eluac option for your eLua module, you will have In general, functions of the form "variable_get()" and "variable_set()" are automatically generated by SWIG for use with -eluac.

    -

    28.3.4 Constants and enums

    +

    29.3.4 Constants and enums

    @@ -512,7 +512,7 @@ If you're using eLua and have used -elua or -eluac to generate Hello World -

    28.3.4.1 Constants/enums and classes/structures

    +

    29.3.4.1 Constants/enums and classes/structures

    @@ -568,7 +568,7 @@ If the -no-old-metatable-bindings option is used, then these old-style It is worth mentioning, that example.Test.TEST1 and example.Test_TEST1 are different entities and changing one does not change the other. Given the fact that these are constantes and they are not supposed to be changed, it is up to you to avoid such issues.

    -

    28.3.5 Pointers

    +

    29.3.5 Pointers

    @@ -606,7 +606,7 @@ Lua enforces the integrity of its userdata, so it is virtually impossible to cor nil -

    28.3.6 Structures

    +

    29.3.6 Structures

    @@ -710,7 +710,7 @@ For eLua with the -eluac option, structure manipulation has to be perfo In general, functions of the form "new_struct()", "struct_member_get()", "struct_member_set()" and "free_struct()" are automatically generated by SWIG for each structure defined in C. (Please note: This doesn't apply for modules generated with the -elua option)

    -

    28.3.7 C++ classes

    +

    29.3.7 C++ classes

    @@ -747,7 +747,8 @@ Stout

    Class data members are accessed in the same manner as C structures. Static class members present a special problem for Lua, as Lua doesn't have support for such features. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    -
    class Spam {
    +
    +class Spam {
     public:
       static void foo();
       static int bar;
    @@ -756,7 +757,7 @@ public:
     

    In Lua, C++ static members can be accessed as follows:

    -
    +
     > example.Spam.foo()            -- calling Spam::foo()
     > a=example.Spam.bar            -- reading Spam::bar 
     > example.Spam.bar=b            -- writing to Spam::bar
    @@ -774,7 +775,7 @@ It is not (currently) possible to access static members of an instance:
     Compatibility Note: In versions prior to SWIG-3.0.0 only the following names would work:
     

    -
    +
     > example.Spam_foo()            -- calling Spam::foo()
     > a=example.Spam_bar            -- reading Spam::bar 
     > example.Spam_bar=b            -- writing to Spam::bar
    @@ -785,7 +786,7 @@ Both style names are generated by default now.
     However, if the -no-old-metatable-bindings option is used, then the backward compatible names are not generated in addition to ordinary ones.
     

    -

    28.3.8 C++ inheritance

    +

    29.3.8 C++ inheritance

    @@ -810,7 +811,7 @@ then the function spam() accepts a Foo pointer or a pointer to any clas

    It is safe to use multiple inheritance with SWIG.

    -

    28.3.9 Pointers, references, values, and arrays

    +

    29.3.9 Pointers, references, values, and arrays

    @@ -841,7 +842,7 @@ Foo spam7();

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Lua will release this memory when the return value is garbage collected). The other two are pointers which are assumed to be managed by the C code and so will not be garbage collected.

    -

    28.3.10 C++ overloaded functions

    +

    29.3.10 C++ overloaded functions

    @@ -927,7 +928,7 @@ Please refer to the "SWIG and C++" chapter for more information about overloadin

    Dealing with the Lua coercion mechanism, the priority is roughly (integers, floats, strings, userdata). But it is better to rename the functions rather than rely upon the ordering.

    -

    28.3.11 C++ operators

    +

    29.3.11 C++ operators

    @@ -964,7 +965,8 @@ When wrapped, it works like you expect:

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    -
    class Complex {
    +
    +class Complex {
     ...
     friend Complex operator+(double, const Complex &c);
     ...
    @@ -973,7 +975,8 @@ friend Complex operator+(double, const Complex &c);
     

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    -
    %rename(Complex_add_dc) operator+(double, const Complex &);
    +
    +%rename(Complex_add_dc) operator+(double, const Complex &);
     ...
     Complex operator+(double, const Complex &c);
     
    @@ -1059,7 +1062,7 @@ operators and pseudo-operators):

    No other lua metafunction is inherited. For example, __gc is not inherited and must be redefined in every class. __tostring is subject to a special handling. If absent in class and in class bases, a default one will be provided by SWIG.

    -

    28.3.12 Class extension with %extend

    +

    29.3.12 Class extension with %extend

    @@ -1116,7 +1119,7 @@ true Extend works with both C and C++ code, on classes and structs. It does not modify the underlying object in any way---the extensions only show up in the Lua interface. The only item to take note of is the code has to use the '$self' instead of 'this', and that you cannot access protected/private members of the code (as you are not officially part of the class).

    -

    28.3.13 Using %newobject to release memory

    +

    29.3.13 Using %newobject to release memory

    If you have a function that allocates memory like this,

    @@ -1140,7 +1143,7 @@ char *foo();

    This will release the allocated memory.

    -

    28.3.14 C++ templates

    +

    29.3.14 C++ templates

    @@ -1175,7 +1178,7 @@ In Lua:

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    -

    28.3.15 C++ Smart Pointers

    +

    29.3.15 C++ Smart Pointers

    @@ -1227,7 +1230,7 @@ If you ever need to access the underlying pointer returned by operator->( > f = p:__deref__() -- Returns underlying Foo *

    -

    28.3.16 C++ Exceptions

    +

    29.3.16 C++ Exceptions

    @@ -1370,7 +1373,7 @@ and the "Exception handling add exception specification to functions or globally (respectively).

    -

    28.3.17 Namespaces

    +

    29.3.17 Namespaces

    @@ -1421,7 +1424,7 @@ Now, from Lua usage is as follows: 19 >

    -

    28.3.17.1 Compatibility Note

    +

    29.3.17.1 Compatibility Note

    @@ -1437,7 +1440,7 @@ If SWIG is running in a backwards compatible way, i.e. without the -no-old-m

    -

    28.3.17.2 Names

    +

    29.3.17.2 Names

    If SWIG is launched without -no-old-metatable-bindings option, then it enters backward-compatible mode. While in this mode, it tries @@ -1446,6 +1449,7 @@ Those names are in a form $classname_$symbolname and are added to the s If %nspace is enabled, then class namespace is taken as scope. If there is no namespace, or %nspace is disabled, then module is considered a class namespace.

    Consider the following C++ code

    +
    %module example
     %nspace MyWorld::Test;
     namespace MyWorld {
    @@ -1481,11 +1485,12 @@ surrounding scope without any prefixing. Pretending that Test2 is a struct, not
     >
     
    -

    28.3.17.3 Inheritance

    +

    29.3.17.3 Inheritance

    The internal organization of inheritance has changed. Consider the following C++ code:

    +
    %module example
     class Base {
       public:
    @@ -1502,6 +1507,7 @@ were squashed and added to corresponding derived class ST: Everything f
     was copied to .fn table of class Derived and so on. This was a recursive procedure, so in the end the whole
     inheritance tree of derived class was squashed into derived class. 

    That means that any changes done to class Base after module initialization wouldn't affect class Derived:

    +
     base = example.Base()
     der = example.Derived()
    @@ -1516,18 +1522,20 @@ nil
     

    This behaviour was changed. Now unless -squash-bases option is provided, Derived store a list of it's bases and if some symbol is not found in it's own service tables then its bases are searched for it. Option -squash-bases will effectively return old behaviour. +

    +
     > print(der.new_func) -- Now it works
     function
     >
     
    -

    28.4 Typemaps

    +

    29.4 Typemaps

    This section explains what typemaps are and how to use them. The default wrapping behaviour of SWIG is enough in most cases. However sometimes SWIG may need a little additional assistance to know which typemap to apply to provide the best wrapping. This section will be explaining how to use typemaps to best effect

    -

    28.4.1 What is a typemap?

    +

    29.4.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Lua to C, you might define a typemap like this:

    @@ -1555,7 +1563,7 @@ Received an integer : 6 720
    -

    28.4.2 Using typemaps

    +

    29.4.2 Using typemaps

    There are many ready written typemaps built into SWIG for all common types (int, float, short, long, char*, enum and more), which SWIG uses automatically, with no effort required on your part.

    @@ -1608,7 +1616,7 @@ void swap(int *sx, int *sy);

    Note: C++ references must be handled exactly the same way. However SWIG will automatically wrap a const int& as an input parameter (since that it obviously input).

    -

    28.4.3 Typemaps and arrays

    +

    29.4.3 Typemaps and arrays

    Arrays present a challenge for SWIG, because like pointers SWIG does not know whether these are input or output values, nor @@ -1672,7 +1680,7 @@ and Lua tables to be 1..N, (the indexing follows the norm for the language). In

    Note: SWIG also can support arrays of pointers in a similar manner.

    -

    28.4.4 Typemaps and pointer-pointer functions

    +

    29.4.4 Typemaps and pointer-pointer functions

    Several C++ libraries use a pointer-pointer functions to create its objects. These functions require a pointer to a pointer which is then filled with the pointer to the new object. Microsoft's COM and DirectX as well as many other libraries have this kind of function. An example is given below:

    @@ -1706,7 +1714,7 @@ int Create_Math(iMath** pptr); // its creator (assume it mallocs) ptr=nil -- the iMath* will be GC'ed as normal
    -

    28.5 Writing typemaps

    +

    29.5 Writing typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Lua C API as well as the material in the "Typemaps" chapter.

    @@ -1715,7 +1723,7 @@ ptr=nil -- the iMath* will be GC'ed as normal

    Before proceeding, you should read the previous section on using typemaps, and look at the existing typemaps found in luatypemaps.swg and typemaps.i. These are both well documented and fairly easy to read. You should not attempt to write your own typemaps until you have read and can understand both of these files (they may well also give you an idea to base your work on).

    -

    28.5.1 Typemaps you can write

    +

    29.5.1 Typemaps you can write

    There are many different types of typemap that can be written, the full list can be found in the "Typemaps" chapter. However the following are the most commonly used ones.

    @@ -1728,7 +1736,7 @@ ptr=nil -- the iMath* will be GC'ed as normal (the syntax for the typecheck is different from the typemap, see typemaps for details). -

    28.5.2 SWIG's Lua-C API

    +

    29.5.2 SWIG's Lua-C API

    This section explains the SWIG specific Lua-C API. It does not cover the main Lua-C api, as this is well documented and not worth covering.

    @@ -1777,7 +1785,7 @@ This macro, when called within the context of a SWIG wrapped function, will disp
    Similar to SWIG_fail_arg, except that it will display the swig_type_info information instead.
    -

    28.6 Customization of your Bindings

    +

    29.6 Customization of your Bindings

    @@ -1786,7 +1794,7 @@ This section covers adding of some small extra bits to your module to add the la -

    28.6.1 Writing your own custom wrappers

    +

    29.6.1 Writing your own custom wrappers

    @@ -1805,7 +1813,7 @@ int native_function(lua_State*L) // my native code The %native directive in the above example, tells SWIG that there is a function int native_function(lua_State*L); which is to be added into the module under the name 'my_func'. SWIG will not add any wrapper for this function, beyond adding it into the function table. How you write your code is entirely up to you.

    -

    28.6.2 Adding additional Lua code

    +

    29.6.2 Adding additional Lua code

    @@ -1843,7 +1851,7 @@ Good uses for this feature is adding of new code, or writing helper functions to See Examples/lua/arrays for an example of this code.

    -

    28.7 Details on the Lua binding

    +

    29.7 Details on the Lua binding

    @@ -1854,7 +1862,7 @@ See Examples/lua/arrays for an example of this code.

    -

    28.7.1 Binding global data into the module.

    +

    29.7.1 Binding global data into the module.

    @@ -1914,7 +1922,7 @@ end

    That way when you call 'a=example.Foo', the interpreter looks at the table 'example' sees that there is no field 'Foo' and calls __index. This will in turn check in '.get' table and find the existence of 'Foo' and then return the value of the C function call 'Foo_get()'. Similarly for the code 'example.Foo=10', the interpreter will check the table, then call the __newindex which will then check the '.set' table and call the C function 'Foo_set(10)'.

    -

    28.7.2 Userdata and Metatables

    +

    29.7.2 Userdata and Metatables

    @@ -1994,7 +2002,7 @@ Note: Both the opaque structures (like the FILE*) and normal wrapped classes/str

    Note: Operator overloads are basically done in the same way, by adding functions such as '__add' & '__call' to the class' metatable. The current implementation is a bit rough as it will add any member function beginning with '__' into the metatable too, assuming its an operator overload.

    -

    28.7.3 Memory management

    +

    29.7.3 Memory management

    diff --git a/Doc/Manual/Modula3.html b/Doc/Manual/Modula3.html deleted file mode 100644 index fc4ffa03c..000000000 --- a/Doc/Manual/Modula3.html +++ /dev/null @@ -1,942 +0,0 @@ - - - -SWIG and Modula-3 - - - - -

    31 SWIG and Modula-3

    - - - - - - -

    -This chapter describes SWIG's support for -Modula-3. -You should be familiar with the -basics -of SWIG, -especially -typemaps. -

    - -

    31.1 Overview

    - - -

    -Modula-3 is a compiled language in the tradition of Niklaus Wirth's Modula 2, -which is in turn a successor to Pascal. -

    - -

    -SWIG's Modula-3 support is currently very basic and highly experimental! -Many features are still not designed satisfyingly -and I need more discussion about the odds and ends. -Don't rely on any feature, incompatible changes are likely in the future! -However, the Modula-3 generator was already useful for interfacing -to the libraries: -

    - -
      -
    1. - -PLPlot - -
    2. -
    3. - -FFTW - -
    4. -
    - -

    31.1.1 Motivation

    - - -

    -Although it is possible to write Modula-3 code that performs as well as C/C++ -most existing libraries are not written in Modula-3 but in C or C++, and -even libraries in other languages may provide C header files. -

    - -

    -Fortunately Modula-3 can call C functions, but you have to write Modula-3 -interfaces to them, and to make things comfortable you will also need -wrappers that convert between high-level features of Modula-3 (garbage -collecting, exceptions) and the explicit tracking of allocated memory and -exception codes used by C APIs. -

    - -

    -SWIG converts C headers to Modula-3 interfaces for you, and using typemaps -you can pass TEXTs or open arrays, and convert error return codes -into exceptions. -

    - -

    -If the library API is ill designed -writing appropriate typemaps can still be time-consuming. -E.g. C programmers are very creative to work-around -missing data types like (real) enumerations and sets. -You should turn such work-arounds back to the Modula-3 way -otherwise you lose static safety and consistency. -

    - -

    -Without SWIG you would probably never consider trying to call C++ libraries -from Modula-3, but with SWIG this is becomes feasible. -SWIG can generate C wrappers to C++ functions and object methods -that may throw exceptions, and then wrap these C wrappers for Modula-3. -To make it complete you can then hide the C interface with Modula-3 classes and -exceptions. -

    - -

    -SWIG allows you to call C and C++ libraries from Modula-3 (even with call back -functions), but it doesn't allow you to easily integrate a Modula-3 module into -a C/C++ project. -

    - -

    31.2 Conception

    - - -

    31.2.1 Interfaces to C libraries

    - - -

    -Modula-3 has integrated support for calling C functions. -This is also extensively used by the standard Modula-3 libraries -to call OS functions. -The Modula-3 part of SWIG and the corresponding SWIG library -modula3.swg -contain code that uses these features. -Because of the built-in support there is no need -for calling the SWIG kernel to generate wrappers written in C. -All conversion and argument checking can be done in Modula-3 -and the interfacing is quite efficient. -All you have to do is to write pieces of Modula-3 code -that SWIG puts together. -

    - - - - - - - - - - - - - - - - - - - -
    C library support integrated in Modula-3
    Pragma <* EXTERNAL *>Precedes a declaration of a PROCEDURE that is implemented -in an external library instead of a Modula-3 module.
    Pragma <* CALLBACK *>Precedes a declaration of a PROCEDURE that should be called -by external library code.
    Module CtypesContains Modula-3 types that match some basic C types.
    Module M3toCContains routines that convert between Modula-3's TEXT type -and C's char * type.
    - -

    -In each run of SWIG the Modula-3 part -generates several files: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Module name schemeIdentifier for %insertDescription
    ModuleRaw.i3m3rawintfDeclaration of types that are equivalent to those of the C library, - EXTERNAL procedures as interface to the C library functions
    ModuleRaw.m3m3rawimplAlmost empty.
    Module.i3m3wrapintfDeclaration of comfortable wrappers to the C library functions.
    Module.m3m3wrapimplImplementation of the wrappers that - convert between Modula-3 and C types, - check for validity of values, - hand-over resource management to the garbage collector using WeakRefs - and raises exceptions.
    m3makefilem3makefileAdd the modules above to the Modula-3 project and - specify the name of the Modula-3 wrapper library - to be generated. - - Today I'm not sure if it is a good idea - to create a m3makefile in each run, - because SWIG must be started for each Modula-3 module it creates. - Thus the m3makefile is overwritten each time. :-( -
    - -

    -Here's a scheme of how the function calls to Modula-3 wrappers -are redirected to C library functions: -

    - - - - - - - - - - - - - - - - - -
    - Modula-3 wrapper
    - Module.i3
    - generated by Modula-3 part of SWIG -
    - - |
    - v -
    - Modula-3 interface to C
    - ModuleRaw.i3
    - generated by Modula-3 part of SWIG -
    --> - C library -
    - - -

    -I have still no good conception how one can split C library interfaces -into type oriented interfaces. -A Module in Modula-3 represents an Abstract DataType -(or call it a static classes, i.e. a class without virtual methods). -E.g. if you have a principal type, say Database, -it is good Modula-3 style to set up one Module with the name Database -where the database type is declared with the name T -and where all functions are declared that operates on it. -

    - -

    -The normal operation of SWIG is to generate a fixed set of files per call. -To generate multiple modules one has to write one SWIG interface -(different SWIG interfaces can share common data) per module. -Identifiers belonging to a different module may ignored (%ignore) -and the principal type must be renamed (%typemap). -

    - - -

    31.2.2 Interfaces to C++ libraries

    - - -

    -Interfaces to C++ files are much more complicated and -there are some more design decisions that are not made, yet. -Modula-3 has no support for C++ functions -but C++ compilers should support generating C++ functions -with a C interface. -

    - -

    -Here's a scheme of how the function calls to Modula-3 wrappers -are redirected to C library functions: -

    - - - - - - - - - - - - - - - - - -
    - Modula-3 wrapper
    - Module.i3
    - generated by Modula-3 part of SWIG -
    C++ library
    - - |
    - v -
    - ^
    - | -
    - Modula-3 interface to C
    - ModuleRaw.i3
    - generated by Modula-3 part of SWIG -
    --> - C interface to C++
    - module_wrap.cxx
    - generated by the SWIG core -
    - -

    -Wrapping C++ libraries arises additional problems: -

    -
      -
    • -Is it sensible to wrap C++ classes with Modula-3 classes? -
    • -
    • -How to find the wrapping Modula-3 class -for a class pointer that is returned by a C++ routine? -
    • -
    • -How to deal with multiple inheritance -which was neglected for Modula-3 for good reasons? -
    • -
    • -Is it possible to sub-class C++ classes with Modula-3 code? -This issue is addressed by directors, -a feature that was experimentally added to some Language modules -like -Java and -Python. -
    • -
    • -How to manage storage with the garbage collector of Modula-3? -Support for - -%newobject and %typemap(newfree) -isn't implemented, yet. -What's about resources that are managed by the garbage collector -but shall be passed back to the storage management of the C++ library? -This is a general issue which is not solved in a satisfying fashion -as far as I know. -
    • -
    • -How to turn C++ exceptions into Modula-3 exceptions? -There's also no support for - -%exception, yet. -
    • -
    - -

    -Be warned: -There is no C++ library I wrote a SWIG interface for, -so I'm not sure if this is possible or sensible, yet. -

    - -

    31.3 Preliminaries

    - - -

    31.3.1 Compilers

    - - -

    -There are different Modula-3 compilers around: -cm3, pm3, ezm3, Klagenfurth Modula-3, Cambridge Modula-3. -SWIG itself does not contain compiler specific code -but the modula3.swg library file -may do so. -For testing examples I use Critical Mass cm3. -

    - - -

    31.3.2 Additional Commandline Options

    - - -

    -There are some experimental command line options -that prevent SWIG from generating interface files. -Instead files are emitted that may assist you -when writing SWIG interface files. -

    - - - - - - - - - - - - - - - - - - - - - -
    Modula-3 specific optionsDescription
    -generateconst <file> -Disable generation of interfaces and wrappers. -Instead write code for computing numeric values of constants -to the specified file. -
    -C code may contain several constant definitions -written as preprocessor macros. -Other language modules of SWIG use -compute-once-use-readonly variables or -functions to wrap such definitions. -All of them can invoke C code dynamically -for computing the macro values. -But if one wants to turn them into Modula-3 -integer constants, enumerations or set types, -the values of these expressions has to be known statically. -Although definitions like (1 << FLAG_MAXIMIZEWINDOW) -must be considered as good C style -they are hard to convert to Modula-3 -since the value computation can use every feature of C. -
    -Thus I implemented these switch -to extract all constant definitions -and write a C program that output the values of them. -It works for numeric constants only -and treats all of them as double. -Future versions may generate a C++ program -that can detect the type of the macros -by overloaded output functions. -Then strings can also be processed. -
    -generaterename <file> -Disable generation of interfaces and wrappers. -Instead generate suggestions for %rename. -
    -C libraries use a naming style -that is neither homogeneous nor similar to that of Modula-3. -C function names often contain a prefix denoting the library -and some name components separated by underscores -or capitalization changes. -To get library interfaces that are really Modula-3 like -you should rename the function names with the %rename directive. -This switch outputs a list of such directives -with a name suggestion generated by a simple heuristic. -
    -generatetypemap <file> -Disable generation of interfaces and wrappers. -Instead generate templates for some basic typemaps. -
    - -

    31.4 Modula-3 typemaps

    - - -

    31.4.1 Inputs and outputs

    - - -

    -Each C procedure has a bunch of inputs and outputs. -Inputs are passed as function arguments, -outputs are updated referential arguments and -the function value. -

    - -

    -Each C type can have several typemaps -that apply only in case if a type is used -for an input argument, for an output argument, -or for a return value. -A further typemap may specify -the direction that is used for certain parameters. -I have chosen this separation -in order to be able to write general typemaps for the modula3.swg typemap library. -In the library code the final usage of the type is not known. -Using separate typemaps for each possible use -allows appropriate definitions for each case. -If these pre-definitions are fine -then the direction of the function parameter -is the only hint the user must give. -

    - -

    -The typemaps specific to Modula-3 have a common name scheme: -A typemap name starts with "m3", -followed by "raw" or "wrap" -depending on whether it controls the generation -of the ModuleRaw.i3 or the Module.i3, respectively. -It follows an "in" for typemaps applied to input argument, -"out" for output arguments, "arg" for all kind of arguments, -"ret" for returned values. -

    - -

    -The main task of SWIG is to build wrapper function, -i.e. functions that convert values between C and Modula-3 -and call the corresponding C function. -Modula-3 wrapper functions generated by SWIG -consist of the following parts: -

    -
      -
    • Generate PROCEDURE signature.
    • -
    • Declare local variables.
    • -
    • Convert input values from Modula-3 to C.
    • -
    • Check for input value integrity.
    • -
    • Call the C function.
    • -
    • Check returned values, e.g. error codes.
    • -
    • Convert and write back values into Modula-3 records.
    • -
    • Free temporary storage.
    • -
    • Return values.
    • -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TypemapExampleDescription
    m3wrapargvar$1: INTEGER := $1_name; - Declaration of some variables needed for temporary results. -
    m3wrapargconst$1 = "$1_name"; - Declaration of some constant, maybe for debug purposes. -
    m3wrapargrawORD($1_name) - The expression that should be passed as argument to the raw Modula-3 interface function. -
    m3wrapargdirout - Referential arguments can be used for input, output, update. - ??? -
    m3wrapinmodeREADONLY - One of Modula-3 parameter modes - VALUE (or empty), - VAR, - READONLY -
    m3wrapinname - New name of the input argument. -
    m3wrapintype - Modula-3 type of the input argument. -
    m3wrapindefault - Default value of the input argument -
    m3wrapinconv$1 := M3toC.SharedTtoS($1_name); - Statement for converting the Modula-3 input value to C compliant value. -
    m3wrapincheckIF Text.Length($1_name) > 10 THEN RAISE E("str too long"); END; - Check the integrity of the input value. -
    m3wrapoutname - Name of the RECORD field to be used for returning multiple values. - This applies to referential output arguments that shall be turned - into return values. -
    m3wrapouttype - Type of the value that is returned instead of a referential output argument. -
    m3wrapoutconv -
    m3wrapoutcheck -
    m3wrapretraw -
    m3wrapretname -
    m3wraprettype -
    m3wrapretvar -
    m3wrapretconv -
    m3wrapretcheck -
    m3wrapfreeargM3toC.FreeSharedS(str, arg1); - Free resources that were temporarily used in the wrapper. - Since this step should never be skipped, - SWIG will put it in the FINALLY branch - of a TRY .. FINALLY structure. -
    - - -

    31.4.2 Subranges, Enumerations, Sets

    - - -

    -Subranges, enumerations, and sets are machine oriented types -that make Modula very strong and expressive compared -with the type systems of many other languages. -

    - -
      -
    • -Subranges are used for statically restricted choices of integers. -
    • -
    • -Enumerations are used for named choices. -
    • -
    • -Sets are commonly used for flag (option) sets. -
    • -
    - -

    -Using them extensively makes Modula code very safe and readable. -

    - -

    -C supports enumerations, too, but they are not as safe as the ones of Modula. -Thus they are abused for many things: -For named choices, for integer constant definitions, for sets. -To make it complete every way of defining a value in C -(#define, const int, enum) -is somewhere used for defining something -that must be handled completely different in Modula-3 -(INTEGER, enumeration, SET). -

    - -

    -I played around with several %features and %pragmas -that split the task up into converting -the C bit patterns (integer or bit set) -into Modula-3 bit patterns (integer or bit set) -and change the type as requested. -See the corresponding example in the -Examples/modula3/enum/example.i file. -This is quite messy and not satisfying. -So the best what you can currently do is -to rewrite constant definitions manually. -Though this is a tedious work -that I'd like to automate. -

    - - -

    31.4.3 Objects

    - - -

    -Declarations of C++ classes are mapped to OBJECT types -while it is tried to retain the access hierarchy -"public - protected - private" using partial revelation. -Though the example in -Examples/modula3/class/example.i -is not really useful, yet. -

    - - -

    31.4.4 Imports

    - - -

    -Pieces of Modula-3 code provided by typemaps -may contain identifiers from foreign modules. -If the typemap m3wrapinconv for blah * -contains code using the function M3toC.SharedTtoS -you may declare %typemap("m3wrapinconv:import") blah * %{M3toC%}. -Then the module M3toC is imported -if the m3wrapinconv typemap for blah * -is used at least once. -Use %typemap("m3wrapinconv:import") blah * %{MyConversions AS M3toC%} -if you need module renaming. -Unqualified import is not supported. -

    - -

    -It is cumbersome to add this typemap to each piece of Modula-3 code. -It is especially useful when writing general typemaps -for the modula3.swg typemap library. -For a monolithic module you might be better off -if you add the imports directly: -

    - -
    -
    -%insert(m3rawintf) %{
    -IMPORT M3toC;
    -%}
    -
    - - -

    31.4.5 Exceptions

    - - -

    -Modula-3 provides another possibility -of an output of a function: exceptions. -

    - -

    -Any piece of Modula-3 code that SWIG inserts -due to a typemap can raise an exception. -This way you can also convert an error code -from a C function into a Modula-3 exception. -

    - -

    -The RAISES clause is controlled -by typemaps with the throws extension. -If the typemap m3wrapinconv for blah * -contains code that may raise the exceptions OSError.E -you should declare -%typemap("m3wrapinconv:throws") blah * %{OSError.E%}. -

    - -

    31.4.6 Example

    - - -

    -The generation of wrappers in Modula-3 needs very fine control -to take advantage of the language features. -Here is an example of a generated wrapper -where almost everything is generated by a typemap: -

    - -
    -         (* %relabel  m3wrapinmode m3wrapinname m3wrapintype  m3wrapindefault *)
    -  PROCEDURE Name     (READONLY       str       :    TEXT    :=      ""       )
    -              (* m3wrapoutcheck:throws *)
    -     : NameResult RAISES {E} =
    -    CONST
    -      arg1name = "str";                  (* m3wrapargconst *)
    -    VAR
    -      arg0   : C.char_star;              (* m3wrapretvar *)
    -      arg1   : C.char_star;              (* m3wrapargvar *)
    -      arg2   : C.int;
    -      result : RECORD
    -           (*m3wrapretname  m3wraprettype*)
    -                 unixPath : TEXT;
    -           (*m3wrapoutname  m3wrapouttype*)
    -                 checksum : CARDINAL;
    -               END;
    -    BEGIN
    -      TRY
    -        arg1 := M3toC.SharedTtoS(str);   (* m3wrapinconv *)
    -        IF Text.Length(arg1) > 10 THEN   (* m3wrapincheck *)
    -          RAISE E("str too long");
    -        END;
    - (* m3wrapretraw           m3wrapargraw *)
    -        arg0 := MessyToUnix  (arg1,   arg2);
    -        result.unixPath := M3toC.CopyStoT(arg0);  (* m3wrapretconv *)
    -        result.checksum := arg2;         (* m3wrapoutconv *)
    -        IF result.checksum = 0 THEN      (* m3wrapoutcheck *)
    -          RAISE E("invalid checksum");
    -        END;
    -      FINALLY
    -        M3toC.FreeSharedS(str, arg1);     (* m3wrapfreearg *)
    -      END;
    -    END Name;
    -
    - - -

    31.5 More hints to the generator

    - - -

    31.5.1 Features

    - - - - - - - - - - - - - - - - - - -
    FeatureExampleDescription
    multiretval%m3multiretval get_box; or - %feature("modula3:multiretval") get_box;Let the denoted function return a RECORD - rather than a plain value. - This RECORD contains all arguments with "out" direction - including the return value of the C function (if there is one). - If more than one argument is "out" - then the function must have the multiretval feature activated, - but it is explicitly requested from the user to prevent mistakes.
    constnumeric%constnumeric(12) twelve; or - %feature("constnumeric", "12") twelve;This feature can be used to tell Modula-3's back-end of SWIG - the value of an identifier. - This is necessary in the cases - where it was defined by a non-trivial C expression. - This feature is used by the - -generateconst option. - In future it may be generalized to other kind of values - such as strings. -
    - -

    31.5.2 Pragmas

    - - - - - - - - - - - - - - - - - - -
    PragmaExampleDescription
    unsafe%pragma(modula3) unsafe="true";Mark the raw interface modules as UNSAFE. - This will be necessary in many cases.
    library%pragma(modula3) library="m3fftw";Specifies the library name for the wrapper library to be created. - It should be distinct from the name of the library to be wrapped.
    - -

    31.6 Remarks

    - - -
      -
    • -The Modula-3 part of SWIG doesn't try to generate nicely formatted code. -If you need to read the generated code, use m3pp to postprocess the -Modula files. -
    • -
    - - - diff --git a/Doc/Manual/Modules.html b/Doc/Manual/Modules.html index 7efd74e2b..b9b7b2b94 100644 --- a/Doc/Manual/Modules.html +++ b/Doc/Manual/Modules.html @@ -7,7 +7,7 @@ -

    19 Working with Modules

    +

    20 Working with Modules

    -

    37.2 Simple example

    +

    38.2 Simple example

    @@ -166,7 +166,7 @@ Some points of interest:

  • The above requests mzc to create an extension using the CGC garbage-collector. The alternative -- the 3m collector -- has generally better performance, but work is still required for SWIG to emit code which is compatible with it. -

    37.3 External documentation

    +

    38.3 External documentation

    diff --git a/Doc/Manual/Ocaml.html b/Doc/Manual/Ocaml.html index 92b5260fe..4ae07e969 100644 --- a/Doc/Manual/Ocaml.html +++ b/Doc/Manual/Ocaml.html @@ -7,7 +7,7 @@ -

    38 SWIG and OCaml

    +

    39 SWIG and OCaml

  • -

    38.1.3 The camlp4 module

    +

    39.1.3 The camlp4 module

    @@ -242,7 +242,7 @@ let b = C_string (getenv "PATH") -

    38.1.4 Using your module

    +

    39.1.4 Using your module

    @@ -256,7 +256,7 @@ option to build your functions into the primitive list. This option is not needed when you build native code.

    -

    38.1.5 Compilation problems and compiling with C++

    +

    39.1.5 Compilation problems and compiling with C++

    @@ -267,7 +267,7 @@ liberal with pointer types may not compile under the C++ compiler. Most code meant to be compiled as C++ will not have problems.

    -

    38.2 The low-level Ocaml/C interface

    +

    39.2 The low-level Ocaml/C interface

    @@ -367,7 +367,7 @@ value items pass through directly, but you must make your own type signature for a function that uses value in this way.

    -

    38.2.1 The generated module

    +

    39.2.1 The generated module

    @@ -401,7 +401,7 @@ it describes the output SWIG will generate for class definitions. -

    38.2.2 Enums

    +

    39.2.2 Enums

    @@ -464,7 +464,7 @@ val x : Enum_test.c_obj = C_enum `a

    -

    38.2.2.1 Enum typing in Ocaml

    +

    39.2.2.1 Enum typing in Ocaml

    @@ -477,10 +477,10 @@ functions imported from different modules. You must convert values to master values using the swig_val function before sharing them with another module.

    -

    38.2.3 Arrays

    +

    39.2.3 Arrays

    -

    38.2.3.1 Simple types of bounded arrays

    +

    39.2.3.1 Simple types of bounded arrays

    @@ -501,7 +501,7 @@ arrays of simple types with known bounds in your code, but this only works for arrays whose bounds are completely specified.

    -

    38.2.3.2 Complex and unbounded arrays

    +

    39.2.3.2 Complex and unbounded arrays

    @@ -514,7 +514,7 @@ SWIG can't predict which of these methods will be used in the array, so you have to specify it for yourself in the form of a typemap.

    -

    38.2.3.3 Using an object

    +

    39.2.3.3 Using an object

    @@ -528,7 +528,7 @@ Consider writing an object when the ending condition of your array is complex, such as using a required sentinel, etc.

    -

    38.2.3.4 Example typemap for a function taking float * and int

    +

    39.2.3.4 Example typemap for a function taking float * and int

    @@ -579,7 +579,7 @@ void printfloats( float *tab, int len );

    -

    38.2.4 C++ Classes

    +

    39.2.4 C++ Classes

    @@ -622,7 +622,7 @@ the underlying pointer, so using create_[x]_from_ptr alters the returned value for the same object.

    -

    38.2.4.1 STL vector and string Example

    +

    39.2.4.1 STL vector and string Example

    @@ -702,7 +702,7 @@ baz #

    -

    38.2.4.2 C++ Class Example

    +

    39.2.4.2 C++ Class Example

    @@ -732,7 +732,7 @@ public: }; -

    38.2.4.3 Compiling the example

    +

    39.2.4.3 Compiling the example

    @@ -750,7 +750,7 @@ bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
       -L$QTPATH/lib -cclib -lqt
     
    -

    38.2.4.4 Sample Session

    +

    39.2.4.4 Sample Session

    @@ -777,10 +777,10 @@ Assuming you have a working installation of QT, you will see a window
     containing the string "hi" in a button.
     

    -

    38.2.5 Director Classes

    +

    39.2.5 Director Classes

    -

    38.2.5.1 Director Introduction

    +

    39.2.5.1 Director Introduction

    @@ -807,7 +807,7 @@ class foo { };

    -

    38.2.5.2 Overriding Methods in Ocaml

    +

    39.2.5.2 Overriding Methods in Ocaml

    @@ -835,7 +835,7 @@ In this example, I'll examine the objective caml code involved in providing an overloaded class. This example is contained in Examples/ocaml/shapes.

    -

    38.2.5.3 Director Usage Example

    +

    39.2.5.3 Director Usage Example

    @@ -896,7 +896,7 @@ in a more effortless style in ocaml, while leaving the "engine" part of the program in C++.

    -

    38.2.5.4 Creating director objects

    +

    39.2.5.4 Creating director objects

    @@ -937,7 +937,7 @@ object from causing a core dump, as long as the object is destroyed properly.

    -

    38.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    +

    39.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    @@ -948,7 +948,7 @@ well as a function return value in the same way you provide function arguments, and to receive arguments the same way you normally receive function returns.

    -

    38.2.5.6 directorin typemap

    +

    39.2.5.6 directorin typemap

    @@ -959,7 +959,7 @@ code receives when you are called. In general, a simple directorin typ can use the same body as a simple out typemap.

    -

    38.2.5.7 directorout typemap

    +

    39.2.5.7 directorout typemap

    @@ -970,7 +970,7 @@ for the same type, except when there are special requirements for object ownership, etc.

    -

    38.2.5.8 directorargout typemap

    +

    39.2.5.8 directorargout typemap

    @@ -987,7 +987,7 @@ In the event that you don't specify all of the necessary values, integral values will read zero, and struct or object returns have undefined results.

    -

    38.2.6 Exceptions

    +

    39.2.6 Exceptions

    @@ -1075,7 +1075,7 @@ The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    -

    38.3 Documentation Features

    +

    39.3 Documentation Features

    @@ -1084,7 +1084,7 @@ comments (colloquially referred to as "docstrings") that can be read by OCamldoc.

    -

    38.3.1 Module docstring

    +

    39.3.1 Module docstring

    diff --git a/Doc/Manual/Octave.html b/Doc/Manual/Octave.html index bd6b08ff9..bdef5db7c 100644 --- a/Doc/Manual/Octave.html +++ b/Doc/Manual/Octave.html @@ -9,7 +9,7 @@ -

    29 SWIG and Octave

    +

    30 SWIG and Octave

      @@ -60,7 +60,7 @@ This chapter is intended to give an introduction to using the module. You should Also, there are a dozen or so examples in the Examples/octave directory, and hundreds in the test suite (Examples/test-suite and Examples/test-suite/octave).

      -

      29.1 Preliminaries

      +

      30.1 Preliminaries

      @@ -76,7 +76,7 @@ This cannot be guaranteed however, as in recent times new Octave releases have r The SWIG runtime exports the function swig_octave_prereq() for checking the version of Octave.

      -

      29.2 Running SWIG

      +

      30.2 Running SWIG

      @@ -108,7 +108,7 @@ The -c++ option is also required when wrapping C++ code: This creates a C++ source file "example_wrap.cpp". A C++ file is generated even when wrapping C code as Octave is itself written in C++ and requires wrapper code to be in the same language. The generated C++ source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application (in this case, the gcd implementation) to create an extension module.

      -

      29.2.1 Command-line options

      +

      30.2.1 Command-line options

      @@ -131,7 +131,7 @@ The special name "." loads C global variables into the module namespace, i.e. al The -opprefix options sets the prefix of the names of global/friend operator functions.

      -

      29.2.2 Compiling a dynamic module

      +

      30.2.2 Compiling a dynamic module

      @@ -158,7 +158,7 @@ $ mkoctfile example_wrap.cpp example.c

      octave:1> swigexample
      -

      29.2.3 Using your module

      +

      30.2.3 Using your module

      @@ -176,10 +176,10 @@ octave:4> swigexample.cvar.Foo=4; octave:5> swigexample.cvar.Foo ans = 4

    -

    29.3 A tour of basic C/C++ wrapping

    +

    30.3 A tour of basic C/C++ wrapping

    -

    29.3.1 Modules

    +

    30.3.1 Modules

    @@ -224,7 +224,7 @@ octave:4> swigexample.gcd(4, 6) ans = 2 -

    29.3.2 Functions

    +

    30.3.2 Functions

    @@ -241,7 +241,7 @@ int fact(int n);

    octave:1> swigexample.fact(4)
     24 
    -

    29.3.3 Global variables

    +

    30.3.3 Global variables

    @@ -294,7 +294,7 @@ octave:2> swigexample.PI=3.142; octave:3> swigexample.PI ans = 3.1420 -

    29.3.4 Constants and enums

    +

    30.3.4 Constants and enums

    @@ -316,7 +316,7 @@ swigexample.SCONST="Hello World" swigexample.SUNDAY=0 .... -

    29.3.5 Pointers

    +

    30.3.5 Pointers

    @@ -363,7 +363,7 @@ octave:2> f=swigexample.fopen("not there", "r"); error: value on right hand side of assignment is undefined error: evaluating assignment expression near line 2, column 2 -

    29.3.6 Structures and C++ classes

    +

    30.3.6 Structures and C++ classes

    @@ -498,7 +498,7 @@ ans = 1 Depending on the ownership setting of a swig_ref, it may call C++ destructors when its reference count goes to zero. See the section on memory management below for details.

    -

    29.3.7 C++ inheritance

    +

    30.3.7 C++ inheritance

    @@ -507,7 +507,7 @@ This information contains the full class hierarchy. When an indexing operation ( the tree is walked to find a match in the current class as well as any of its bases. The lookup is then cached in the swig_ref.

    -

    29.3.8 C++ overloaded functions

    +

    30.3.8 C++ overloaded functions

    @@ -517,7 +517,7 @@ The dispatch function selects which overload to call (if any) based on the passe typecheck typemaps are used to analyze each argument, as well as assign precedence. See the chapter on typemaps for details.

    -

    29.3.9 C++ operators

    +

    30.3.9 C++ operators

    @@ -621,7 +621,7 @@ On the C++ side, the default mappings are as follows: Octave can also utilise friend (i.e. non-member) operators with a simple %rename: see the example in the Examples/octave/operator directory.

    -

    29.3.10 Class extension with %extend

    +

    30.3.10 Class extension with %extend

    @@ -660,7 +660,7 @@ Similarly, Octave can use the __float__ method to convert an object to Octave 3.8.0 and later versions will also map unary functions X() to the corresponding __X__ method, where X includes: abs(), acos(), acosh(), angle(), arg(), asin(), asinh(), atan(), atanh(), cbrt(), ceil(), conj(), cos(), cosh(), dawson(), erf(), erfc(), erfcinv(), erfcx(), erfi(), erfinv(), exp(), expm1(), finite(), fix(), floor(), gamma(), imag(), isalnum(), isalpha(), isascii(), iscntrl(), isdigit(), isgraph(), isinf(), islower(), isna(), isnan(), isprint(), ispunct(), isspace(), isupper(), isxdigit(), lgamma(), log(), log10(), log1p(), log2(), real(), round(), roundb(), signbit(), signum(), sin(), sinh(), sqrt(), tan(), tanh(), toascii(), tolower(), toupper()

    -

    29.3.11 C++ templates

    +

    30.3.11 C++ templates

    @@ -737,10 +737,10 @@ ans = -

    29.3.12 C++ Smart Pointers

    +

    30.3.12 C++ Smart Pointers

    -

    29.3.12.1 The shared_ptr Smart Pointer

    +

    30.3.12.1 The shared_ptr Smart Pointer

    @@ -751,14 +751,14 @@ in the shared_ptr smart pointer -

    29.3.12.2 Generic Smart Pointers

    +

    30.3.12.2 Generic Smart Pointers

    C++ smart pointers are fully supported as in other modules.

    -

    29.3.13 Directors (calling Octave from C++ code)

    +

    30.3.13 Directors (calling Octave from C++ code)

    @@ -839,14 +839,14 @@ c-side routine called octave-side routine called -

    29.3.14 Threads

    +

    30.3.14 Threads

    The use of threads in wrapped Director code is not supported; i.e., an Octave-side implementation of a C++ class must be called from the Octave interpreter's thread. Anything fancier (apartment/queue model, whatever) is left to the user. Without anything fancier, this amounts to the limitation that Octave must drive the module... like, for example, an optimization package that calls Octave to evaluate an objective function.

    -

    29.3.15 Memory management

    +

    30.3.15 Memory management

    @@ -880,14 +880,14 @@ The %newobject directive may be used to control this behavior for pointers retur In the case where one wishes for the C++ side to own an object that was created in Octave (especially a Director object), one can use the __disown() method to invert this logic. Then letting the Octave reference count go to zero will not destroy the object, but destroying the object will invalidate the Octave-side object if it still exists (and call destructors of other C++ bases in the case of multiple inheritance/subclass()'ing).

    -

    29.3.16 STL support

    +

    30.3.16 STL support

    Various STL library files are provided for wrapping STL containers.

    -

    29.3.17 Matrix typemaps

    +

    30.3.17 Matrix typemaps

    diff --git a/Doc/Manual/Perl5.html b/Doc/Manual/Perl5.html index 766ccaede..85c2545cf 100644 --- a/Doc/Manual/Perl5.html +++ b/Doc/Manual/Perl5.html @@ -7,7 +7,7 @@ -

    30 SWIG and Perl5

    +

    31 SWIG and Perl5

    -

    30.2.2 Compiling a dynamic module

    +

    31.2.2 Compiling a dynamic module

    @@ -208,7 +208,7 @@ the target should be named `example.so', `example.sl', or the appropriate dynamic module name on your system.

    -

    30.2.3 Building a dynamic module with MakeMaker

    +

    31.2.3 Building a dynamic module with MakeMaker

    @@ -242,7 +242,7 @@ the preferred approach to compilation. More information about MakeMaker can be found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen, and Randal Schwartz.

    -

    30.2.4 Building a static version of Perl

    +

    31.2.4 Building a static version of Perl

    @@ -311,7 +311,7 @@ added to it. Depending on your machine, you may need to link with additional libraries such as -lsocket, -lnsl, -ldl, etc.

    -

    30.2.5 Using the module

    +

    31.2.5 Using the module

    @@ -464,7 +464,7 @@ system configuration (this requires root access and you will need to read the man pages).

    -

    30.2.6 Compilation problems and compiling with C++

    +

    31.2.6 Compilation problems and compiling with C++

    @@ -607,7 +607,7 @@ have to find the macro that conflicts and add an #undef into the .i file. Pleas any conflicting macros you find to swig-user mailing list.

    -

    30.2.7 Compiling for 64-bit platforms

    +

    31.2.7 Compiling for 64-bit platforms

    @@ -634,7 +634,7 @@ also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    -

    30.3 Building Perl Extensions under Windows

    +

    31.3 Building Perl Extensions under Windows

    @@ -645,7 +645,7 @@ section assumes you are using SWIG with Microsoft Visual C++ although the procedure may be similar with other compilers.

    -

    30.3.1 Running SWIG from Developer Studio

    +

    31.3.1 Running SWIG from Developer Studio

    @@ -708,7 +708,7 @@ print "$a\n"; -

    30.3.2 Using other compilers

    +

    31.3.2 Using other compilers

    @@ -716,7 +716,7 @@ SWIG is known to work with Cygwin and may work with other compilers on Windows. For general hints and suggestions refer to the Windows chapter.

    -

    30.4 The low-level interface

    +

    31.4 The low-level interface

    @@ -726,7 +726,7 @@ can be used to control your application. However, it is also used to construct more user-friendly proxy classes as described in the next section.

    -

    30.4.1 Functions

    +

    31.4.1 Functions

    @@ -749,7 +749,7 @@ use example; $a = &example::fact(2); -

    30.4.2 Global variables

    +

    31.4.2 Global variables

    @@ -819,7 +819,7 @@ extern char *path; // Declared later in the input -

    30.4.3 Constants

    +

    31.4.3 Constants

    @@ -859,7 +859,7 @@ print example::FOO, "\n"; -

    30.4.4 Pointers

    +

    31.4.4 Pointers

    @@ -968,7 +968,7 @@ as XS and xsubpp. Given the advancement of the SWIG typesystem and the SWIG and XS, this is no longer supported.

    -

    30.4.5 Structures

    +

    31.4.5 Structures

    @@ -1102,7 +1102,7 @@ void Bar_f_set(Bar *b, Foo *val) { -

    30.4.6 C++ classes

    +

    31.4.6 C++ classes

    @@ -1167,7 +1167,7 @@ provides direct access to C++ objects. A higher level interface using Perl prox can be built using these low-level accessors. This is described shortly.

    -

    30.4.7 C++ classes and type-checking

    +

    31.4.7 C++ classes and type-checking

    @@ -1203,7 +1203,7 @@ If necessary, the type-checker also adjusts the value of the pointer (as is nece multiple inheritance is used).

    -

    30.4.8 C++ overloaded functions

    +

    31.4.8 C++ overloaded functions

    @@ -1247,7 +1247,7 @@ example::Spam_foo_d($s, 3.14); Please refer to the "SWIG Basics" chapter for more information.

    -

    30.4.9 Operators

    +

    31.4.9 Operators

    @@ -1274,7 +1274,7 @@ The following C++ operators are currently supported by the Perl module:

  • operator or
  • -

    30.4.10 Modules and packages

    +

    31.4.10 Modules and packages

    @@ -1369,7 +1369,7 @@ print Foo::fact(4), "\n"; # Call a function in package FooBar --> -

    30.5 Input and output parameters

    +

    31.5 Input and output parameters

    @@ -1588,7 +1588,7 @@ print "$c\n"; Note: The REFERENCE feature is only currently supported for numeric types (integers and floating point).

    -

    30.6 Exception handling

    +

    31.6 Exception handling

    @@ -1752,7 +1752,7 @@ This is still supported, but it is deprecated. The newer %exception di functionality, but it has additional capabilities that make it more powerful.

    -

    30.7 Remapping datatypes with typemaps

    +

    31.7 Remapping datatypes with typemaps

    @@ -1769,7 +1769,7 @@ Typemaps are only used if you want to change some aspect of the primitive C-Perl interface.

    -

    30.7.1 A simple typemap example

    +

    31.7.1 A simple typemap example

    @@ -1873,7 +1873,7 @@ example::count("e", "Hello World"); -

    30.7.2 Perl5 typemaps

    +

    31.7.2 Perl5 typemaps

    @@ -1978,7 +1978,7 @@ Return of C++ member data (all languages). Check value of input parameter. -

    30.7.3 Typemap variables

    +

    31.7.3 Typemap variables

    @@ -2049,7 +2049,7 @@ properly assigned. The Perl name of the wrapper function being created. -

    30.7.4 Useful functions

    +

    31.7.4 Useful functions

    @@ -2118,7 +2118,7 @@ int sv_isa(SV *, char *0; -

    30.8 Typemap Examples

    +

    31.8 Typemap Examples

    @@ -2127,7 +2127,7 @@ might look at the files "perl5.swg" and "typemaps.i" in the SWIG library.

    -

    30.8.1 Converting a Perl5 array to a char **

    +

    31.8.1 Converting a Perl5 array to a char **

    @@ -2219,7 +2219,7 @@ print @$b, "\n"; # Print it out -

    30.8.2 Return values

    +

    31.8.2 Return values

    @@ -2243,12 +2243,12 @@ can be done using the EXTEND() macro as in: EXTEND(sp, 1); /* Extend the stack by 1 object */ } $result = sv_newmortal(); - sv_setiv($target, (IV) *($1)); + sv_setiv($result, (IV) *($1)); argvi++; } -

    30.8.3 Returning values from arguments

    +

    31.8.3 Returning values from arguments

    @@ -2302,7 +2302,7 @@ print "multout(7, 13) = @r\n"; ($x, $y) = multout(7, 13); -

    30.8.4 Accessing array structure members

    +

    31.8.4 Accessing array structure members

    @@ -2365,7 +2365,7 @@ the "in" typemap in the previous section would be used to convert an to copy the converted array into a C data structure.

    -

    30.8.5 Turning Perl references into C pointers

    +

    31.8.5 Turning Perl references into C pointers

    @@ -2430,7 +2430,7 @@ print "$c\n"; -

    30.8.6 Pointer handling

    +

    31.8.6 Pointer handling

    @@ -2515,7 +2515,7 @@ For example: -

    30.9 Proxy classes

    +

    31.9 Proxy classes

    @@ -2531,7 +2531,7 @@ to the underlying code. This section describes the implementation details of the proxy interface.

    -

    30.9.1 Preliminaries

    +

    31.9.1 Preliminaries

    @@ -2553,7 +2553,7 @@ SWIG creates a collection of high-level Perl wrappers. In your scripts, you wil high level wrappers. The wrappers, in turn, interact with the low-level procedural module.

    -

    30.9.2 Structure and class wrappers

    +

    31.9.2 Structure and class wrappers

    @@ -2680,7 +2680,7 @@ $v->DESTROY(); -

    30.9.3 Object Ownership

    +

    31.9.3 Object Ownership

    @@ -2767,7 +2767,7 @@ counting, garbage collection, or advanced features one might find in sophisticated languages.

    -

    30.9.4 Nested Objects

    +

    31.9.4 Nested Objects

    @@ -2820,7 +2820,7 @@ $p->{f}->{x} = 0.0; %${$p->{v}} = ( x=>0, y=>0, z=>0); -

    30.9.5 Proxy Functions

    +

    31.9.5 Proxy Functions

    @@ -2854,7 +2854,7 @@ This function replaces the original function, but operates in an identical manner.

    -

    30.9.6 Inheritance

    +

    31.9.6 Inheritance

    @@ -2930,7 +2930,7 @@ particular, inheritance of data members is extremely tricky (and I'm not even sure if it really works).

    -

    30.9.7 Modifying the proxy methods

    +

    31.9.7 Modifying the proxy methods

    @@ -2958,7 +2958,7 @@ public: }; -

    30.10 Adding additional Perl code

    +

    31.10 Adding additional Perl code

    @@ -3009,7 +3009,7 @@ set_transform($im, $a); -

    30.11 Cross language polymorphism

    +

    31.11 Cross language polymorphism

    @@ -3043,7 +3043,7 @@ proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    -

    30.11.1 Enabling directors

    +

    31.11.1 Enabling directors

    @@ -3133,7 +3133,7 @@ sub one { -

    30.11.2 Director classes

    +

    31.11.2 Director classes

    @@ -3214,7 +3214,7 @@ so there is no need for the extra overhead involved with routing the calls through Perl.

    -

    30.11.3 Ownership and object destruction

    +

    31.11.3 Ownership and object destruction

    @@ -3263,7 +3263,7 @@ sub DESTROY { -

    30.11.4 Exception unrolling

    +

    31.11.4 Exception unrolling

    @@ -3319,7 +3319,7 @@ Swig::DirectorMethodException is thrown, Perl will register the exception as soon as the C wrapper function returns.

    -

    30.11.5 Overhead and code bloat

    +

    31.11.5 Overhead and code bloat

    @@ -3353,7 +3353,7 @@ directive) for only those methods that are likely to be extended in Perl.

    -

    30.11.6 Typemaps

    +

    31.11.6 Typemaps

    diff --git a/Doc/Manual/Php.html b/Doc/Manual/Php.html index d0ec0df7f..5aea878b2 100644 --- a/Doc/Manual/Php.html +++ b/Doc/Manual/Php.html @@ -7,7 +7,7 @@ -

    31 SWIG and PHP

    +

    32 SWIG and PHP

      @@ -51,12 +51,12 @@

      In this chapter, we discuss SWIG's support of PHP. SWIG currently supports -generating wrappers for PHP7. Support for PHP5 was removed in SWIG 4.0.0 -and support for PHP4 was removed in SWIG 1.3.37. +generating wrappers for PHP7 and PHP8. Support for PHP5 was removed in SWIG +4.0.0 and support for PHP4 was removed in SWIG 1.3.37.

      -Currently any PHP7 release should work. +Currently any PHP7 or PHP8 release should work.

      @@ -70,7 +70,7 @@ your extension into php directly, you will need the complete PHP source tree available.

      -

      31.1 Generating PHP Extensions

      +

      32.1 Generating PHP Extensions

      @@ -84,16 +84,21 @@ swig -php7 example.i

    -This will produce 3 files example_wrap.c, php_example.h and -example.php. The first file, example_wrap.c contains all of +This will produce 2 files: example_wrap.c and php_example.h. +The first file, example_wrap.c contains all of the C code needed to build a PHP extension. The second file, php_example.h contains the header information needed if you wish to statically link the extension into the php interpreter. -The third file, -example.php can be included by PHP scripts. It attempts to -dynamically load the extension and contains extra php code specified -in the interface file. If wrapping C++ code with PHP classes, it will -also contain PHP class wrappers. +

    + +

    +If the interface file uses %pragma(php) include=... or +%pragma(php) code=... then SWIG will also generate a third file, +example.php to contain what these specify. In SWIG < 4.1.0, +this third file was always generated as it defined the PHP classes, etc +(but this is now done via C code in example_wrap.c) and also +contained code to dynamically load the extension (but this used the +PHP dl() function, which isn't recommended nowadays).

    @@ -119,7 +124,7 @@ and it doesn't play nicely with package system. We don't recommend this approach, or provide explicit support for it.

    -

    31.1.1 Building a loadable extension

    +

    32.1.1 Building a loadable extension

    @@ -134,27 +139,35 @@ least work for Linux though): gcc -shared example_wrap.o example.o -o example.so -

    31.1.2 Using PHP Extensions

    +

    32.1.2 Using PHP Extensions

    To test the extension from a PHP script, you first need to tell PHP to -load it. To do this, add a line like this to the [PHP] section of -php.ini: +load it. Assuming you're using PHP 7.2 or higher, the recommended (and +simplest!) way to do this is to copy it to PHP's default extension directory +and add a line like this to the [PHP] section of php.ini:

    -        extension=/path/to/modulename.so
    +        extension=modulename
     

    -If the module is in PHP's default extension directory, you can omit the path. +PHP < 7.2 doesn't support loading by just the module name, so you need +to specify the filename of the module to be specified, which varies +between platforms. And for any PHP version, if the module is not in PHP's +default extension directory, you also need to specify the path, for example:

    +
    +	extension=/path/to/modulename.so
    +
    +

    -For some SAPIs (for example, the CLI SAPI) you can instead use the -dl() function to load -an extension at run time, by adding a line like this to the start of each +If you're using the PHP CLI SAPI it's possible (but not recommended) to use the +dl() function to +load an extension at run time, by adding a line like this to the start of each PHP script which uses your extension:

    @@ -163,26 +176,14 @@ PHP script which uses your extension:

    -But note that dl() isn't supported when running PHP through a -webserver - you'll need to use extension in php.ini as -described above. +But to do this portably you need to take into account that pathnames and the +filename extension vary by platform, and for security reasons PHP no longer +supports dl() when running PHP through a webserver. Overall it's +better to instead use extension in php.ini as described +above.

    -

    -The PHP module which SWIG generates will also attempt to do the dl() -call for you if the extension isn't already loaded: -

    - -
    -        include("example.php");
    -
    - -

    -This PHP module also defines the PHP classes for the wrapped API, so you'll -almost certainly want to include it anyway. -

    - -

    31.2 Basic PHP interface

    +

    32.2 Basic PHP interface

    @@ -194,7 +195,7 @@ SWIG doesn't have support for generating wrappers which make use of PHP's namespace feature.

    -

    31.2.1 Constants

    +

    32.2.1 Constants

    @@ -219,24 +220,19 @@ you can access the constants in your PHP script like this,

    -include("example.php");
    -
     echo "PI = " . PI . "\n";
    -
     echo "E = " . E . "\n";
    -
     

    -There's one peculiarity of how constants work in PHP which it is useful -to note (this is not specific to SWIG though) - if you try to use an undeclared -constant, PHP will emit a warning (or a notice in PHP 7.1 and earlier) and then -expand the constant to a string version of the constant's name. Unfortunately -it is easy to miss the warning message if you're using PHP in a webserver as -it will probably end up in error.log or similar. Apparently this will throw -an Error in a future version of PHP, but until then it's something to be -aware of. +There's one peculiarity of how constants work in PHP prior to PHP 8 +which it is useful to note (this is not specific to SWIG though) - if you try +to use an undeclared constant, PHP will emit a warning (or a notice in PHP 7.1 +and earlier) and then expand the constant to a string version of the constant's +name. Unfortunately it is easy to miss the warning message if you're using PHP +in a webserver as it will probably end up in error.log or similar. PHP 8.0 +made this an error.

    @@ -256,8 +252,6 @@ accessed incorrectly in PHP,

    -include("example.php");
    -
     if(EASY_TO_MISPEL) {
       ...
     } else {
    @@ -273,7 +267,7 @@ is treated as true by the if test, when the value of the intended constant
     would be treated as false!
     

    -

    31.2.2 Global Variables

    +

    32.2.2 Global Variables

    @@ -298,7 +292,6 @@ is accessed as follows:

    -include("example.php");
     print seki_get();
     seki_set( seki_get() * 2); # The C variable is now 4.
     print seki_get();
    @@ -306,8 +299,10 @@ print seki_get();
     
     

    SWIG supports global variables of all C datatypes including pointers -and complex objects. Additional types can be supported by using the -varinit typemap. +and complex objects. To support additional types, you just need to +supply the standard in and out typemaps, which get +used because of the wrapping as _get() and _set() +functions.

    @@ -322,7 +317,7 @@ undefined. At this time SWIG does not support custom accessor methods.

    -

    31.2.3 Functions

    +

    32.2.3 Functions

    @@ -342,7 +337,6 @@ Will be accessed in PHP like this :

    -include("example.php");
     $a = foo(2);
     $b = bar(3.5, -1.5);
     $c = bar(3.5);  # Use default argument for 2nd parameter
    @@ -375,7 +369,7 @@ print $s;      # The value of $s was not changed.
     -->
     
     
    -

    31.2.4 Overloading

    +

    32.2.4 Overloading

    @@ -430,12 +424,14 @@ taking the integer argument.

    --> -

    31.2.5 Pointers and References

    - +

    32.2.5 Pointers and References

    -Pointers to C/C++ objects are represented -as PHP resources, rather like MySQL connection handles. +Since SWIG 4.1.0, SWIG wraps C/C++ classes directly with PHP objects. +Pointers to other types are also wrapped as PHP objects - mostly this is an +implementation detail, but it's visible from PHP via is_object() and +similar. In earlier SWIG versions, PHP resources were used to wrap both +classes and pointers to other types.

    @@ -467,8 +463,6 @@ This will result in the following usage in PHP:

     <?php
     
    -include("example.php");
    -
     $in1=copy_intp(3);
     $in2=copy_intp(5);
     $result=new_intp();
    @@ -476,7 +470,6 @@ $result=new_intp();
     add( $in1, $in2, $result );
     
     echo "The sum " . intp_value($in1) . " + " . intp_value($in2) . " = " . intp_value( $result) . "\n";
    -?>
     

    @@ -501,14 +494,11 @@ This will result in the following usage in PHP:

     <?php
     
    -include("example.php");
    -
     $in1 = 3;
     $in2 = 5;
     $result= add($in1, $in2);  # Note using variables for the input is unnecessary.
     
     echo "The sum $in1 + $in2 = $result\n";
    -?>
     

    @@ -539,15 +529,12 @@ This will result in the following usage in PHP:

     <?php
     
    -include("example.php");
    -
     $in1 = 3;
     $in2 = 5;
     $result = 0;
     add($in1, $in2, $result);
     
     echo "The sum $in1 + $in2 = $result\n";
    -?>
     

    @@ -568,15 +555,20 @@ PHP in a number of ways: by using unset on an existing variable, or assigning NULL to a variable.

    -

    31.2.6 Structures and C++ classes

    +

    32.2.6 Structures and C++ classes

    -SWIG defaults to wrapping C++ structs and classes with PHP classes - this -is done by generating a PHP wrapper script which defines proxy classes -which calls a set of flat functions which actually wrap the C++ class. -You can disable this wrapper layer by passing the command-line option -"-noproxy" in which case you'll just get the flat functions. +SWIG defaults to wrapping C++ structs and classes with PHP classes. +Since SWIG 4.1.0, this is done entirely via PHP's C API - earlier SWIG +versions generated a PHP wrapper script which defined proxy classes +which called a set of flat functions which actually wrapped the C++ class. +

    + +

    +If you don't want the class wrappers, you can pass the command-line option +"-noproxy" in which case you'll get C++ classes wrapped as flat functions +as described below.

    @@ -605,7 +597,6 @@ Would be used in the following way from PHP:

     <?php
    -  require "vector.php";
     
       $v = new Vector();
       $v->x = 3;
    @@ -622,14 +613,13 @@ Would be used in the following way from PHP:
       $c->im = 0;
     
       # $c destructor called when $c goes out of scope.
    -?>
     

    Member variables and methods are accessed using the -> operator.

    -

    31.2.6.1 Using -noproxy

    +

    32.2.6.1 Using -noproxy

    @@ -655,7 +645,7 @@ Complex_im_set($obj, $d); Complex_im_get($obj);

    -

    31.2.6.2 Constructors and Destructors

    +

    32.2.6.2 Constructors and Destructors

    @@ -667,8 +657,8 @@ constructor to execute.

    -Because PHP uses reference counting to manage resources, simple -assignment of one variable to another such as: +Because PHP uses reference counting, simple assignment of one variable to +another such as:

    @@ -696,7 +686,7 @@ the programmer can either reassign the variable or call
     unset($v)
     

    -

    31.2.6.3 Static Member Variables

    +

    32.2.6.3 Static Member Variables

    @@ -721,8 +711,6 @@ would be accessed in PHP as,

    -include("example.php");
    -
     echo "There have now been " . Ko::threats() . " threats\n";
     
     
    @@ -739,7 +727,7 @@ Ko::threats(10); echo "There have now been " . Ko::threats() . " threats\n";
    -

    31.2.6.4 Static Member Functions

    +

    32.2.6.4 Static Member Functions

    @@ -756,12 +744,11 @@ class Ko { would be executed in PHP as,

    -include("example.php");
     Ko::threats();
     
    -

    31.2.6.5 Specifying Implemented Interfaces

    +

    32.2.6.5 Specifying Implemented Interfaces

    @@ -779,13 +766,12 @@ so: If there are multiple interfaces, just list them separated by commas.

    -

    31.2.7 PHP Pragmas, Startup and Shutdown code

    +

    32.2.7 PHP Pragmas, Startup and Shutdown code

    -To place PHP code in the generated "example.php" file one can use the -code pragma. The code is inserted after loading the shared -object. +You can get SWIG to generate an "example.php" file by specifying +the code to put in it using the code pragma.

    @@ -876,14 +862,14 @@ The %rinit and %rshutdown statements are very similar but inse
     into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.
     

    -

    31.3 Cross language polymorphism

    +

    32.3 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the -C++ instance transparently via C wrapper functions. +C++ instance transparently.

    @@ -911,7 +897,7 @@ wrapper functions takes care of all the cross-language method routing transparently.

    -

    31.3.1 Enabling directors

    +

    32.3.1 Enabling directors

    @@ -989,8 +975,6 @@ then at the PHP side you can define

    -require("mymodule.php");
    -
     class MyFoo extends Foo {
       function one() {
         print "one from php\n";
    @@ -1000,7 +984,7 @@ class MyFoo extends Foo {
     
    -

    31.3.2 Director classes

    +

    32.3.2 Director classes

    @@ -1012,8 +996,8 @@ that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the PHP proxy classes. The director classes store a pointer to their underlying -PHP object. Indeed, this is quite similar to the "_cPtr" and "thisown" -members of the PHP proxy classes. +PHP object. Indeed, this is quite similar to struct swig_object_wrapper +which is used to implement the PHP proxy classes.

    @@ -1068,12 +1052,12 @@ infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in -PHP, SWIG creates an instance of the original C++ class and assigns it -to ->_cPtr. This is exactly what happens without directors -and is true even if directors are enabled for the particular class in -question. When a class derived from a proxy class is created, -however, SWIG then creates an instance of the corresponding C++ director -class. The reason for this difference is that user-defined subclasses +PHP, SWIG creates an instance of the original C++ class and stores it +in the struct swig_object_wrapper. This is true whether or not +directors are enabled for the particular class in question. However +when a class derived from a proxy class is created, SWIG instead +creates an instance of the corresponding C++ director class. +The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ @@ -1081,7 +1065,7 @@ so there is no need for the extra overhead involved with routing the calls through PHP.

    -

    31.3.3 Ownership and object destruction

    +

    32.3.3 Ownership and object destruction

    @@ -1137,7 +1121,7 @@ In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point.

    -

    31.3.4 Exception unrolling

    +

    32.3.4 Exception unrolling

    @@ -1161,13 +1145,32 @@ should suffice in most cases:

     %feature("director:except") {
    -  if ($error == FAILURE) {
    +#if SWIG_VERSION >= 0x040100
    +  if ($error != NULL)
    +#else
    +  if ($error == FAILURE)
    +#endif
    +  {
         throw Swig::DirectorMethodException();
       }
     }
     
    +

    +If you only need to support SWIG >= 4.1.0, you can just use the +($error != NULL) condition. +

    + +

    +In SWIG 4.1.0, $error was changed in the SWIG/PHP director +implementation to make it work more like how it does for other languages. +Previously, $error didn't actually indicate an exception, but instead +was only set to FAILURE if there was a problem calling the PHP method. +Now $error indicates if the PHP method threw a PHP exception, and +directorout typemaps for PHP no longer need to be gated by if (EG(exception)). +

    +

    This code will check the PHP error state after each method call from a director into PHP, and throw a C++ exception if an error occurred. This @@ -1204,7 +1207,7 @@ Swig::DirectorMethodException is thrown, PHP will register the exception as soon as the C wrapper function returns.

    -

    31.3.5 Overhead and code bloat

    +

    32.3.5 Overhead and code bloat

    @@ -1237,7 +1240,7 @@ optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in PHP.

    -

    31.3.6 Typemaps

    +

    32.3.6 Typemaps

    @@ -1251,7 +1254,7 @@ need to be supported.

    -

    31.3.7 Miscellaneous

    +

    32.3.7 Miscellaneous

    Director typemaps for STL classes are mostly in place, and hence you diff --git a/Doc/Manual/Pike.html b/Doc/Manual/Pike.html deleted file mode 100644 index 2b8432399..000000000 --- a/Doc/Manual/Pike.html +++ /dev/null @@ -1,246 +0,0 @@ - - - -SWIG and Pike - - - - - -

    37 SWIG and Pike

    - - - - - - -

    -This chapter describes SWIG support for Pike. As of this writing, the -SWIG Pike module is still under development and is not considered -ready for prime time. The Pike module is being developed against the -Pike 7.4.10 release and may not be compatible with previous versions -of Pike. -

    - -

    -This chapter covers most SWIG features, but certain low-level details -are covered in less depth than in earlier chapters. At the very -least, make sure you read the "SWIG Basics" -chapter.
    -

    - -

    37.1 Preliminaries

    - - -

    37.1.1 Running SWIG

    - - -

    -Suppose that you defined a SWIG module such as the following: -

    - -
    -
    %module example

    %{
    #include "example.h"
    %}

    int fact(int n);
    -
    - -

    -To build a C extension module for Pike, run SWIG using the -pike option : -

    - -
    -
    $ swig -pike example.i
    -
    - -

    -If you're building a C++ extension, be sure to add the -c++ option: -

    - -
    -
    $ swig -c++ -pike example.i
    -
    - -

    -This creates a single source file named example_wrap.c (or example_wrap.cxx, if you -ran SWIG with the -c++ option). -The SWIG-generated source file contains the low-level wrappers that need -to be compiled and linked with the rest of your C/C++ application to -create an extension module. -

    - -

    -The name of the wrapper file is derived from the name of the input -file. For example, if the input file is example.i, the name -of the wrapper file is example_wrap.c. To change this, you -can use the -o option: -

    - -
    -
    $ swig -pike -o pseudonym.c example.i
    -
    -

    37.1.2 Getting the right header files

    - - -

    -In order to compile the C/C++ wrappers, the compiler needs to know the -path to the Pike header files. These files are usually contained in a -directory such as -

    - -
    -
    /usr/local/pike/7.4.10/include/pike
    -
    - -

    -There doesn't seem to be any way to get Pike itself to reveal the -location of these files, so you may need to hunt around for them. -You're looking for files with the names global.h, program.h -and so on. -

    - -

    37.1.3 Using your module

    - - -

    -To use your module, simply use Pike's import statement: -

    - -
    -$ pike
    -Pike v7.4 release 10 running Hilfe v3.5 (Incremental Pike Frontend)
    -> import example;
    -> fact(4);
    -(1) Result: 24
    -
    - -

    37.2 Basic C/C++ Mapping

    - - -

    37.2.1 Modules

    - - -

    -All of the code for a given SWIG module is wrapped into a single Pike -module. Since the name of the shared library that implements your -module ultimately determines the module's name (as far as Pike is -concerned), SWIG's %module directive doesn't really have any -significance. -

    - -

    37.2.2 Functions

    - - -

    -Global functions are wrapped as new Pike built-in functions. For -example, -

    - -
    -%module example
    -
    -int fact(int n);
    -
    - -

    -creates a new built-in function example.fact(n) that works -exactly as you'd expect it to: -

    - -
    -> import example;
    -> fact(4);
    -(1) Result: 24
    -
    - -

    37.2.3 Global variables

    - - -

    -Global variables are currently wrapped as a pair of functions, one to get -the current value of the variable and another to set it. For example, the -declaration -

    - -
    -%module example
    -
    -double Foo;
    -
    - -

    -will result in two functions, Foo_get() and Foo_set(): -

    - -
    -> import example;
    -> Foo_get();
    -(1) Result: 3.000000
    -> Foo_set(3.14159);
    -(2) Result: 0
    -> Foo_get();
    -(3) Result: 3.141590
    -
    - -

    37.2.4 Constants and enumerated types

    - - -

    -Enumerated types in C/C++ declarations are wrapped as Pike constants, -not as Pike enums. -

    - -

    37.2.5 Constructors and Destructors

    - - -

    -Constructors are wrapped as create() methods, and destructors are -wrapped as destroy() methods, for Pike classes. -

    - -

    37.2.6 Static Members

    - - -

    -Since Pike doesn't support static methods or data for Pike classes, static -member functions in your C++ classes are wrapped as regular functions and -static member variables are wrapped as pairs of functions (one to get the -value of the static member variable, and another to set it). The names of -these functions are prepended with the name of the class. -For example, given this C++ class declaration: -

    - -
    -class Shape
    -{
    -public:
    -  static void print();
    -  static int nshapes;
    -};
    -
    - -

    -SWIG will generate a Shape_print() method that invokes the static -Shape::print() member function, as well as a pair of methods, -Shape_nshapes_get() and Shape_nshapes_set(), to get and set -the value of Shape::nshapes. -

    - - - diff --git a/Doc/Manual/Preprocessor.html b/Doc/Manual/Preprocessor.html index 3d1bb453e..7611ea40c 100644 --- a/Doc/Manual/Preprocessor.html +++ b/Doc/Manual/Preprocessor.html @@ -7,7 +7,7 @@ -

    10 Preprocessing

    +

    11 Preprocessing

      @@ -38,7 +38,7 @@ However, a number of modifications and enhancements have been made. This chapter describes some of these modifications.

      -

      10.1 File inclusion

      +

      11.1 File inclusion

      @@ -64,7 +64,7 @@ By default, the #include is ignored unless you run SWIG with the is that you often don't want SWIG to try and wrap everything included in standard header system headers and auxiliary files. -

      10.2 File imports

      +

      11.2 File imports

      @@ -93,7 +93,7 @@ The -importall directive tells SWIG to follow all #include sta as imports. This might be useful if you want to extract type definitions from system header files without generating any wrappers. -

      10.3 Conditional Compilation

      +

      11.3 Conditional Compilation

      @@ -110,18 +110,20 @@ SWIG_VERSION Hexadecimal (binary-coded decimal) number contai such as 0x010311 (corresponding to SWIG-1.3.11). SWIGCSHARP Defined when using C# +SWIGD Defined when using D +SWIGGO Defined when using Go SWIGGUILE Defined when using Guile SWIGJAVA Defined when using Java SWIGJAVASCRIPT Defined when using Javascript -SWIG_JAVASCRIPT_JSC Defined when using Javascript for JavascriptCore -SWIG_JAVASCRIPT_V8 Defined when using Javascript for v8 or node.js +SWIG_JAVASCRIPT_JSC Defined when using Javascript with -jsc +SWIG_JAVASCRIPT_V8 Defined when using Javascript with -v8 or -node SWIGLUA Defined when using Lua SWIGMZSCHEME Defined when using Mzscheme SWIGOCAML Defined when using OCaml SWIGOCTAVE Defined when using Octave SWIGPERL Defined when using Perl SWIGPHP Defined when using PHP (any version) -SWIGPHP7 Defined when using PHP7 +SWIGPHP7 Defined when using PHP 7 or later (with a compatible C API) SWIGPYTHON Defined when using Python SWIGR Defined when using R SWIGRUBY Defined when using Ruby @@ -144,14 +146,26 @@ __cplusplus Defined when -c++ option used

    -Interface files can look at these symbols as necessary to change the -way in which an interface is generated or to mix SWIG directives with -C code. These symbols are also defined within the C code generated by -SWIG (except for the symbol `SWIG' which is only defined -within the SWIG compiler). +The following are language specific symbols that might be defined:

    -

    10.4 Macro Expansion

    +
    +SWIG_D_VERSION                  Unsigned integer target version when using D
    +SWIGGO_CGO                      Defined when using Go for cgo
    +SWIGGO_GCCGO                    Defined when using Go for gccgo
    +SWIGGO_INTGO_SIZE               Size of the Go type int when using Go (32 or 64)
    +SWIGPYTHON_PY3                  Defined when using Python with -py3
    +SWIGPYTHON_BUILTIN              Defined when using Python with -builtin
    +SWIG_RUBY_AUTORENAME            Defined when using Ruby with -autorename
    +
    + +

    +Interface files can look at these symbols as necessary to change the +way in which an interface is generated or to mix SWIG directives with +C code. +

    + +

    11.4 Macro Expansion

    @@ -206,7 +220,7 @@ like #x. This is a non-standard SWIG extension. -

    10.5 SWIG Macros

    +

    11.5 SWIG Macros

    @@ -252,7 +266,7 @@ many of SWIG's advanced features and libraries are built using this mechanism (s support).

    -

    10.6 C99 and GNU Extensions

    +

    11.6 C99 and GNU Extensions

    @@ -308,14 +322,14 @@ interface building. However, they are used internally to implement a number of SWIG directives and are provided to make SWIG more compatible with C99 code.

    -

    10.7 Preprocessing and delimiters

    +

    11.7 Preprocessing and delimiters

    The preprocessor handles { }, " " and %{ %} delimiters differently.

    -

    10.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    +

    11.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    @@ -340,7 +354,7 @@ the contents of the %{ ... %} block are copied without modification to the output (including all preprocessor directives).

    -

    10.7.2 Preprocessing and { ... } delimiters

    +

    11.7.2 Preprocessing and { ... } delimiters

    @@ -382,7 +396,7 @@ to actually go into the wrapper file, prefix the preprocessor directives with % and leave the preprocessor directive in the code.

    -

    10.8 Preprocessor and Typemaps

    +

    11.8 Preprocessor and Typemaps

    @@ -453,7 +467,7 @@ would generate

    -

    10.9 Viewing preprocessor output

    +

    11.9 Viewing preprocessor output

    @@ -463,7 +477,7 @@ Instead the results after the preprocessor has run are displayed. This might be useful as an aid to debugging and viewing the results of macro expansions.

    -

    10.10 The #error and #warning directives

    +

    11.10 The #error and #warning directives

    diff --git a/Doc/Manual/Python.html b/Doc/Manual/Python.html index ee443be53..c132afc8a 100644 --- a/Doc/Manual/Python.html +++ b/Doc/Manual/Python.html @@ -7,7 +7,7 @@ -

    32 SWIG and Python

    +

    33 SWIG and Python

    -

    32.3.3 Global variables

    +

    33.3.3 Global variables

    @@ -1158,7 +1158,7 @@ that starts with a leading underscore. SWIG does not create cvar if there are no global variables in a module.

    -

    32.3.4 Constants and enums

    +

    33.3.4 Constants and enums

    @@ -1198,7 +1198,7 @@ other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    -

    32.3.5 Pointers

    +

    33.3.5 Pointers

    @@ -1339,7 +1339,7 @@ C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    -

    32.3.6 Structures

    +

    33.3.6 Structures

    @@ -1549,7 +1549,7 @@ memory and use of it results in a segfault or some sort of other undefined behav

    -

    32.3.7 C++ classes

    +

    33.3.7 C++ classes

    @@ -1637,7 +1637,7 @@ they are accessed through cvar like this:

    -

    32.3.8 C++ inheritance

    +

    33.3.8 C++ inheritance

    @@ -1692,7 +1692,7 @@ then the function spam() accepts Foo * or a pointer to any cla It is safe to use multiple inheritance with SWIG.

    -

    32.3.9 Pointers, references, values, and arrays

    +

    33.3.9 Pointers, references, values, and arrays

    @@ -1753,7 +1753,7 @@ treated as a returning value, and it will follow the same allocation/deallocation process.

    -

    32.3.10 C++ overloaded functions

    +

    33.3.10 C++ overloaded functions

    @@ -1876,7 +1876,7 @@ first declaration takes precedence. Please refer to the "SWIG and C++" chapter for more information about overloading.

    -

    32.3.11 C++ operators

    +

    33.3.11 C++ operators

    @@ -1973,7 +1973,7 @@ instead of raising an exception when the comparison fails, that is, on any kind This follows the guidelines in PEP 207 - Rich Comparisons and NotImplemented Python constant.

    -

    32.3.12 C++ namespaces

    +

    33.3.12 C++ namespaces

    @@ -2040,7 +2040,7 @@ utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    -

    32.3.13 C++ templates

    +

    33.3.13 C++ templates

    @@ -2094,10 +2094,10 @@ Some more complicated examples will appear later.

    -

    32.3.14 C++ Smart Pointers

    +

    33.3.14 C++ Smart Pointers

    -

    32.3.14.1 The shared_ptr Smart Pointer

    +

    33.3.14.1 The shared_ptr Smart Pointer

    @@ -2108,7 +2108,7 @@ in the shared_ptr smart pointer -

    32.3.14.2 Generic Smart Pointers

    +

    33.3.14.2 Generic Smart Pointers

    @@ -2192,7 +2192,7 @@ simply use the __deref__() method. For example: -

    32.3.15 C++ reference counted objects

    +

    33.3.15 C++ reference counted objects

    @@ -2201,7 +2201,7 @@ Python examples of memory management using referencing counting.

    -

    32.4 Further details on the Python class interface

    +

    33.4 Further details on the Python class interface

    @@ -2224,7 +2224,7 @@ the -builtin option are in the Built-in section.

    -

    32.4.1 Proxy classes

    +

    33.4.1 Proxy classes

    @@ -2313,7 +2313,7 @@ you can attach new Python methods to the class and you can even inherit from it by Python built-in types until Python 2.2).

    -

    32.4.2 Built-in Types

    +

    33.4.2 Built-in Types

    @@ -2357,7 +2357,7 @@ please refer to the Python documentation:

    https://docs.python.org/3/extending/newtypes.html

    -

    32.4.2.1 Limitations

    +

    33.4.2.1 Limitations

    Use of the -builtin option implies a couple of limitations: @@ -2518,7 +2518,7 @@ assert(issubclass(B.Derived, A.Base)) -

    32.4.2.2 Operator overloads and slots -- use them!

    +

    33.4.2.2 Operator overloads and slots -- use them!

    The entire justification for the -builtin option is improved @@ -2568,7 +2568,7 @@ but the line that uses the '+' operator is much faster. (operator==, operator<, etc.) are also converted to Python slot operators. For a complete list of C++ operators that are automatically converted to Python slot operators, refer to the file -python/pyopers.swig in the SWIG library. +python/pyopers.swg in the SWIG library.

    @@ -2674,11 +2674,11 @@ the chosen closure function.

    There is further information on %feature("python:slot") -in the file python/pyopers.swig in the SWIG library. +in the file python/pyopers.swg in the SWIG library.

    -

    32.4.3 Memory management

    +

    33.4.3 Memory management

    NOTE: Although this section refers to proxy objects, everything here also applies @@ -2873,7 +2873,7 @@ It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    -

    32.5 Cross language polymorphism

    +

    33.5 Cross language polymorphism

    @@ -2907,7 +2907,7 @@ proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    -

    32.5.1 Enabling directors

    +

    33.5.1 Enabling directors

    @@ -2999,7 +2999,7 @@ class MyFoo(mymodule.Foo): -

    32.5.2 Director classes

    +

    33.5.2 Director classes

    @@ -3079,7 +3079,7 @@ so there is no need for the extra overhead involved with routing the calls through Python.

    -

    32.5.3 Ownership and object destruction

    +

    33.5.3 Ownership and object destruction

    @@ -3146,7 +3146,7 @@ deleting all the Foo pointers it contains at some point. Note that no hard references to the Foo objects remain in Python.

    -

    32.5.4 Exception unrolling

    +

    33.5.4 Exception unrolling

    @@ -3205,7 +3205,7 @@ Swig::DirectorMethodException is thrown, Python will register the exception as soon as the C wrapper function returns.

    -

    32.5.5 Overhead and code bloat

    +

    33.5.5 Overhead and code bloat

    @@ -3239,7 +3239,7 @@ directive) for only those methods that are likely to be extended in Python.

    -

    32.5.6 Typemaps

    +

    33.5.6 Typemaps

    @@ -3253,7 +3253,7 @@ need to be supported.

    -

    32.5.7 Miscellaneous

    +

    33.5.7 Miscellaneous

    @@ -3300,7 +3300,7 @@ methods that return const references.

    -

    32.6 Common customization features

    +

    33.6 Common customization features

    @@ -3313,7 +3313,7 @@ This section describes some common SWIG features that are used to improve your the interface to an extension module.

    -

    32.6.1 C/C++ helper functions

    +

    33.6.1 C/C++ helper functions

    @@ -3394,7 +3394,7 @@ hard to implement. It is possible to clean this up using Python code, typemaps, customization features as covered in later sections.

    -

    32.6.2 Adding additional Python code

    +

    33.6.2 Adding additional Python code

    @@ -3650,7 +3650,7 @@ The same applies for overloaded constructors.

    -

    32.6.3 Class extension with %extend

    +

    33.6.3 Class extension with %extend

    @@ -3739,7 +3739,7 @@ Vector(12, 14, 16) in any way---the extensions only show up in the Python interface.

    -

    32.6.4 Exception handling with %exception

    +

    33.6.4 Exception handling with %exception

    @@ -3873,10 +3873,10 @@ The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    -

    32.6.5 Optimization options

    +

    33.6.5 Optimization options

    -

    32.6.5.1 -fastproxy

    +

    33.6.5.1 -fastproxy

    @@ -4009,7 +4009,7 @@ While this possibly provides the best of both worlds, the time to import the mod The command line options mentioned above also apply to wrapped C/C++ global functions, not just class methods.

    -

    32.7 Tips and techniques

    +

    33.7 Tips and techniques

    @@ -4019,7 +4019,7 @@ strings, binary data, and arrays. This chapter discusses the common techniques solving these problems.

    -

    32.7.1 Input and output parameters

    +

    33.7.1 Input and output parameters

    @@ -4232,7 +4232,7 @@ void foo(Bar *OUTPUT); may not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    -

    32.7.2 Simple pointers

    +

    33.7.2 Simple pointers

    @@ -4301,7 +4301,7 @@ If you replace %pointer_functions() by %pointer_class(type, name)SWIG Library chapter for further details.

    -

    32.7.3 Unbounded C Arrays

    +

    33.7.3 Unbounded C Arrays

    @@ -4363,7 +4363,7 @@ well suited for applications in which you need to create buffers, package binary data, etc.

    -

    32.7.4 String handling

    +

    33.7.4 String handling

    @@ -4433,7 +4433,7 @@ also be used to extra binary data from arbitrary pointers.

    -

    32.7.5 Default arguments

    +

    33.7.5 Default arguments

    @@ -4532,7 +4532,7 @@ Versions of SWIG prior to this varied in their ability to convert C++ default va equivalent Python default argument values.

    -

    32.8 Typemaps

    +

    33.8 Typemaps

    @@ -4549,7 +4549,7 @@ Typemaps are only used if you want to change some aspect of the primitive C-Python interface or if you want to elevate your guru status.

    -

    32.8.1 What is a typemap?

    +

    33.8.1 What is a typemap?

    @@ -4665,7 +4665,7 @@ parameter is omitted): -

    32.8.2 Python typemaps

    +

    33.8.2 Python typemaps

    @@ -4706,7 +4706,7 @@ a look at the SWIG library version 1.3.20 or so.

    -

    32.8.3 Typemap variables

    +

    33.8.3 Typemap variables

    @@ -4777,7 +4777,7 @@ properly assigned. The Python name of the wrapper function being created. -

    32.8.4 Useful Python Functions

    +

    33.8.4 Useful Python Functions

    @@ -4905,7 +4905,7 @@ write me -

    32.9 Typemap Examples

    +

    33.9 Typemap Examples

    @@ -4914,7 +4914,7 @@ might look at the files "python.swg" and "typemaps.i" in the SWIG library.

    -

    32.9.1 Converting Python list to a char **

    +

    33.9.1 Converting Python list to a char **

    @@ -4994,7 +4994,7 @@ memory allocation is used to allocate memory for the array, the the C function.

    -

    32.9.2 Expanding a Python object into multiple arguments

    +

    33.9.2 Expanding a Python object into multiple arguments

    @@ -5113,7 +5113,7 @@ TypeError: Wrong number or type of arguments for overloaded function 'foo'. -

    32.9.3 Using typemaps to return arguments

    +

    33.9.3 Using typemaps to return arguments

    @@ -5201,7 +5201,7 @@ function can now be used as follows: >>> -

    32.9.4 Mapping Python tuples into small arrays

    +

    33.9.4 Mapping Python tuples into small arrays

    @@ -5250,7 +5250,7 @@ array, such an approach would not be recommended for huge arrays, but for small structures, this approach works fine.

    -

    32.9.5 Mapping sequences to C arrays

    +

    33.9.5 Mapping sequences to C arrays

    @@ -5339,7 +5339,7 @@ static int convert_darray(PyObject *input, double *ptr, int size) { -

    32.9.6 Pointer handling

    +

    33.9.6 Pointer handling

    @@ -5436,7 +5436,7 @@ that has a this attribute. In addition, class object (if applicable).

    -

    32.9.7 Memory management when returning references to member variables

    +

    33.9.7 Memory management when returning references to member variables

    @@ -5597,7 +5597,7 @@ static PyObject *bike_reference() { -

    32.10 Docstring Features

    +

    33.10 Docstring Features

    @@ -5625,7 +5625,7 @@ of your users much simpler.

    -

    32.10.1 Module docstring

    +

    33.10.1 Module docstring

    @@ -5659,7 +5659,7 @@ layout of controls on a panel, etc. to be loaded from an XML file." -

    32.10.2 %feature("autodoc")

    +

    33.10.2 %feature("autodoc")

    @@ -5687,7 +5687,7 @@ four levels for autodoc controlled by the value given to the feature, %feature("autodoc", "level"). The four values for level are covered in the following sub-sections. -

    32.10.2.1 %feature("autodoc", "0")

    +

    33.10.2.1 %feature("autodoc", "0")

    @@ -5716,7 +5716,7 @@ def function_name(*args, **kwargs): -

    32.10.2.2 %feature("autodoc", "1")

    +

    33.10.2.2 %feature("autodoc", "1")

    @@ -5741,7 +5741,7 @@ def function_name(*args, **kwargs): -

    32.10.2.3 %feature("autodoc", "2")

    +

    33.10.2.3 %feature("autodoc", "2")

    @@ -5803,7 +5803,7 @@ def function_name(*args, **kwargs): -

    32.10.2.4 %feature("autodoc", "3")

    +

    33.10.2.4 %feature("autodoc", "3")

    @@ -5829,7 +5829,7 @@ def function_name(*args, **kwargs): -

    32.10.2.5 %feature("autodoc", "docstring")

    +

    33.10.2.5 %feature("autodoc", "docstring")

    @@ -5848,7 +5848,7 @@ void GetPosition(int* OUTPUT, int* OUTPUT); -

    32.10.3 %feature("docstring")

    +

    33.10.3 %feature("docstring")

    @@ -5880,7 +5880,7 @@ with more than one line. -

    32.11 Python Packages

    +

    33.11 Python Packages

    Python has concepts of modules and packages. Modules are separate units of @@ -5954,7 +5954,7 @@ users may need to use special features such as the package option in th %module directive or import related command line options. These are explained in the following sections.

    -

    32.11.1 Setting the Python package

    +

    33.11.1 Setting the Python package

    @@ -6008,7 +6008,7 @@ pkg1/pkg2/_foo.so # (shared library built from C/C++ code generated by SWI -

    32.11.2 Absolute and relative imports

    +

    33.11.2 Absolute and relative imports

    Suppose, we have the following hierarchy of files:

    @@ -6145,7 +6145,7 @@ uses relative imports. Second case is, when one puts import directives in __init__.py to import symbols from submodules or subpackages and the submodule depends on other submodules (discussed later).

    -

    32.11.3 Enforcing absolute import semantics

    +

    33.11.3 Enforcing absolute import semantics

    As you may know, there is an incompatibility in import semantics (for the @@ -6182,7 +6182,7 @@ from __future__ import absolute_import -

    32.11.4 Importing from __init__.py

    +

    33.11.4 Importing from __init__.py

    Imports in __init__.py are handy when you want to populate a @@ -6292,7 +6292,7 @@ class Bar(pkg3.foo.Foo): pass effect (note, that the Python 2 case also needs the -relativeimport workaround).

    -

    32.11.5 Implicit namespace packages

    +

    33.11.5 Implicit namespace packages

    Python 3.3 introduced @@ -6370,7 +6370,7 @@ zipimporter requires python-3.5.1 or newer to work with subpackages.

    -

    32.11.6 Location of modules

    +

    33.11.6 Location of modules

    @@ -6406,7 +6406,7 @@ The following sub-sections look more closely at the two default configurations a An input interface file, foo.i, results in the two modules foo.py and _foo.so for each of the configurations.

    -

    32.11.6.1 Both modules in the same package

    +

    33.11.6.1 Both modules in the same package

    @@ -6441,7 +6441,7 @@ from mypackage import foo -

    32.11.6.2 Both modules are global

    +

    33.11.6.2 Both modules are global

    @@ -6473,7 +6473,7 @@ import foo -

    32.11.6.3 Split modules custom configuration

    +

    33.11.6.3 Split modules custom configuration

    In this non-standard 'split module' configuration, the pure Python module is in a package and the low level C/C++ module is global. @@ -6523,7 +6523,7 @@ Using one of the two default configurations is the recommended approach now.

    -

    32.11.6.4 More on customizing the module import code

    +

    33.11.6.4 More on customizing the module import code

    @@ -6643,7 +6643,7 @@ The following will do this for the 32.11.6.5 Statically linked C modules +

    33.11.6.5 Statically linked C modules

    It is strongly recommended to use dynamically linked modules for the C @@ -6715,7 +6715,7 @@ module then you will either need to refer to the Python documentation on how to do this (remember you are now the Python importer) or use dynamic linking.

    -

    32.12 Python 3 Support

    +

    33.12 Python 3 Support

    @@ -6740,7 +6740,7 @@ The following are Python 3 new features that are currently supported by SWIG.

    -

    32.12.1 Function annotation

    +

    33.12.1 Function annotation

    @@ -6773,7 +6773,7 @@ For detailed usage of function annotation, see PEP 3107.

    -

    32.12.2 Buffer interface

    +

    33.12.2 Buffer interface

    @@ -6925,7 +6925,7 @@ modify the buffer. -

    32.12.3 Abstract base classes

    +

    33.12.3 Abstract base classes

    @@ -6975,7 +6975,7 @@ The collections.abc module was introduced in Python 3.3 and hence this requires Python 3.3 or later.

    -

    32.12.4 Byte string output conversion

    +

    33.12.4 Byte string output conversion

    @@ -7156,7 +7156,7 @@ overloads taking both std::string (as Python bytes) and std::wstring (as Python unicode).

    -

    32.12.5 Python 2 Unicode

    +

    33.12.5 Python 2 Unicode

    @@ -7228,7 +7228,7 @@ the first is allowing unicode conversion and the second is explicitly prohibiting it.

    -

    32.13 Support for Multithreaded Applications

    +

    33.13 Support for Multithreaded Applications

    By default, SWIG does not enable support for multithreaded Python applications. More @@ -7243,7 +7243,7 @@ will not be able to run any other threads, even if the wrapped C/C++ code is wai interface for this is described in the next section.

    -

    32.13.1 UI for Enabling Multithreading Support

    +

    33.13.1 UI for Enabling Multithreading Support

    The user interface is as follows:

    @@ -7286,7 +7286,7 @@ will not be able to run any other threads, even if the wrapped C/C++ code is wai -

    32.13.2 Multithread Performance

    +

    33.13.2 Multithread Performance

    diff --git a/Doc/Manual/R.html b/Doc/Manual/R.html index 45e5541d0..e44fe432c 100644 --- a/Doc/Manual/R.html +++ b/Doc/Manual/R.html @@ -7,7 +7,7 @@ -

    33 SWIG and R

    +

    34 SWIG and R

    @@ -28,13 +31,19 @@ R is a GPL'ed open source statistical and plotting environment. Information about R can be found at www.r-project.org. - -The R bindings are under active development. They have been used to -compile and run an R interface to QuantLib running on Mandriva Linux -with gcc. The R bindings also work on Microsoft Windows using Visual C++.

    -

    33.1 Bugs

    +

    +The R bindings are under active development. They have been used to +compile and run an R interface to QuantLib running on Mandriva Linux +with gcc. They are also used to create the SimpleITK R package, which +runs on Linux and MacOS. SWIG is used to create all wrapper +interfaces +to SimpleITK. The R +bindings also work on Microsoft Windows using Visual C++. +

    + +

    34.1 Bugs

    @@ -42,11 +51,13 @@ Currently the following features are not implemented or broken:

      -
    • Garbage collection of created objects +
    • Garbage collection of some created objects. Finalizers are + available for wrapped C++ classes and are called by the + garbage collection system.
    • C Array wrappings
    -

    33.2 Using R and SWIG

    +

    34.2 Using R and SWIG

    @@ -113,11 +124,10 @@ cacheMetaData(1) +

    The cacheMetaData(1) will cause R to refresh its object tables. Without it, inheritance of wrapped objects may fail. - -

    -These two files can be loaded in any order +These two files can be loaded in any order.

    @@ -137,25 +147,32 @@ Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :

  • Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into -

    33.3 Precompiling large R files

    +

    34.3 Precompiling large R files

    +

    In cases where the R file is large, one make save a lot of loading time by precompiling the R wrapper. This can be done by creating the file makeRData.R which contains the following +

    -
    +
     source('BigFile.R')
     save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
     q(save="no")
    -
    +
    +

    This will generate a compiled R file called BigFile.RData that will save a large amount of loading time. +

    +

    +There is no need to precompile large R files if the SWIG-generated code is being included +in an R package. The package infrastructure provides this service during package installation. +

    - -

    33.4 General policy

    +

    34.4 General policy

    @@ -164,49 +181,163 @@ wrapping over the underlying functions and rely on the R type system to provide R syntax.

    -

    33.5 Language conventions

    +

    34.5 Language conventions

    -getitem and setitem use C++ conventions (i.e. zero based indices). [<- +getitem and setitem use C++ conventions (i.e. zero based indices). [<- and [ are overloaded to allow for R syntax (one based indices and slices)

    -

    33.6 C++ classes

    +

    34.6 C++ classes

    -C++ objects are implemented as external pointer objects with the class -being the mangled name of the class. The C++ classes are encapsulated -as an SEXP with an external pointer type. The class is the mangled -name of the class. The nice thing about R is that is allows you to -keep track of the pointer object which removes the necessity for a lot -of the proxy class baggage you see in other languages. +Wrapping of C++ classes for R works quite well. R has a special +type, known as an external reference, that can be used as a pointer +to arbitary things, including C++ classes. The proxy layers generated +for other classes are not required.

    -

    33.7 Enumerations

    +

    + SWIG currently creates a custom hierarchy of R classes derived from the + external reference type and implements +type checking and function overloading in the R code it generates. In +the future we hope to utilise the built in R6 class structures. +

    + +

    +The R interface has the following capabilities: +

    +
      +
    • Destructor methods are registered and called automatically by the R garbage collector. +
    • A range of std::vector types are converted automatically to R equivalents via the std_vector.i library. +
    • The $ operator is used for method access. +
    • Variable accessors are automatically generated and called via the $, [, [[, $<-, [<-, [[<- operators. +
    + +

    34.6.1 Examples

    + + +

    +Consider the following simple example: +

    + +
    +
    +class Vehicle {
    +private:
    +  int m_axles;
    +
    +public:
    +  int Axles() {
    +    return(m_axles);
    +  }
    +
    +  bool Available;
    +
    +  Vehicle() {
    +    Available=false;
    +    m_axles=2;
    +  }
    +
    +  Vehicle(int ax) {
    +    Available=false;
    +    m_axles=ax;
    +  }
    +};
    +
    +
    + +

    +The following options are available in R: +

    + +
    +
    +v1 <- Vehicle()
    +v2 <- Vehicle(4)
    +# access members
    +v1$Axles()
    +[1] 2
    +v2$Axles
    +[1] 4
    +v1$Available
    +[1] FALSE
    +# Set availabilty
    +v1$Available <- TRUE
    +v1$Available
    +[1] TRUE
    +
    +
    + +

    +A useful trick to determine the methods that are available is to +query the R method definition as follows: +

    + +
    +
    +# display the methods for the class
    +getMethod("$", class(v1))
    +    
    +Method Definition:
    +
    +function (x, name) 
    +{
    +    accessorFuns = list(Axles = Vehicle_Axles, Available = Vehicle_Available_get)
    +    vaccessors = c("Available")
    +    idx = pmatch(name, names(accessorFuns))
    +    if (is.na(idx)) 
    +        return(callNextMethod(x, name))
    +    f = accessorFuns[[idx]]
    +    if (is.na(match(name, vaccessors))) 
    +        function(...) {
    +            f(x, ...)
    +        }
    +    else f(x)
    +}
    +
    +Signatures:
    +        x           
    +target  "_p_Vehicle"
    +defined "_p_Vehicle"
    +
    +
    +
    +

    +The names in the accessorFuns list correspond to class methods while names in the vaccessors section +correspond to variables that may be modified. +

    +

    34.7 Enumerations

    R doesn't have a native enumeration type. Enumerations are represented as character strings in R, with calls to R functions that convert back and forth between integers. +

    +

    The details of enumeration names and contents are stored in hidden R environments, which are named according the the enumeration name - for example, an enumeration colour: +

    +
     enum colour { red=-1, blue, green = 10 };
     
    +

    will be initialized by the following call in R: +

    +
     defineEnumeration("_colour",
      .values=c("red" = .Call('R_swig_colour_red_get',FALSE, PACKAGE='enum_thorough'),
     "blue" = .Call('R_swig_colour_blue_get',FALSE, PACKAGE='enum_thorough'),
     "green" = .Call('R_swig_colour_green_get',FALSE, PACKAGE='enum_thorough')))
    -
     

    @@ -216,7 +347,9 @@ values for enumerations to be used. Calls to the C/C++ code require the compiled library to be loaded, so a delayedAssign is employed within defineEnumeration in order to allow the code to be easily used in R packages. +

    +

    The user typically does not need to access the enumeration lookup functions or know the name of the enumeration type used by R. Attributes containing the type information are attached by swig to @@ -224,14 +357,17 @@ functions requiring enumeration arguments or returning enumeration values, and those attributes are used to identify and access the appropriate environments and thus translate between characters and integers. +

    +

    The relevant functions, for debugging purposes, are enumToInteger and enumFromInteger. +

    +

    Anonymous enumerations are ignored by the binding generation process, leaving no way of accessing the value of anonymous enumerations from R code. -

    diff --git a/Doc/Manual/Ruby.html b/Doc/Manual/Ruby.html index 3cfd1292c..5581cc458 100644 --- a/Doc/Manual/Ruby.html +++ b/Doc/Manual/Ruby.html @@ -8,7 +8,7 @@ -

    34 SWIG and Ruby

    +

    35 SWIG and Ruby

      @@ -149,7 +149,7 @@

      This chapter describes SWIG's support of Ruby.

      -

      34.1 Preliminaries

      +

      35.1 Preliminaries

      SWIG 4.0 is known to work with Ruby versions 1.9 and later. @@ -164,7 +164,7 @@ read the "SWIG Basics" chapter. It is also assumed that the reader has a basic understanding of Ruby.

      -

      34.1.1 Running SWIG

      +

      35.1.1 Running SWIG

      To build a Ruby module, run SWIG using the -ruby @@ -188,7 +188,7 @@ if compiling a C++ extension) that contains all of the code needed to build a Ruby extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

      -

      34.1.2 Getting the right header files

      +

      35.1.2 Getting the right header files

      In order to compile the wrapper code, the compiler needs the ruby.h @@ -202,7 +202,7 @@ the compiler options needed to compile the code is to ask Ruby itself:

    -

    34.1.3 Compiling a dynamic module

    +

    35.1.3 Compiling a dynamic module

    Ruby extension modules are typically compiled into shared @@ -275,7 +275,7 @@ manual pages for your compiler and linker to determine the correct set of options. You might also check the SWIG Wiki for additional information.

    -

    34.1.4 Using your module

    +

    35.1.4 Using your module

    Ruby module names must be capitalized, @@ -305,7 +305,7 @@ begins with:

    will result in an extension module using the feature name "example" and Ruby module name "Example".

    -

    34.1.5 Static linking

    +

    35.1.5 Static linking

    An alternative approach to dynamic linking is to rebuild the @@ -320,7 +320,7 @@ finding the Ruby source, adding an entry to the ext/Setup file, adding your directory to the list of extensions in the file, and finally rebuilding Ruby.

    -

    34.1.6 Compilation of C++ extensions

    +

    35.1.6 Compilation of C++ extensions

    On most machines, C++ extension modules should be linked @@ -352,7 +352,7 @@ $libs = append_library($libs, "supc++") create_makefile('example') -

    34.2 Building Ruby Extensions under Windows 95/NT

    +

    35.2 Building Ruby Extensions under Windows 95/NT

    Building a SWIG extension to Ruby under Windows 95/NT is @@ -377,7 +377,7 @@ order to build extensions, you may need to download the source distribution to the Ruby package, as you will need the Ruby header files.

    -

    34.2.1 Running SWIG from Developer Studio

    +

    35.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft @@ -441,13 +441,13 @@ Foo = 3.0 -

    34.3 The Ruby-to-C/C++ Mapping

    +

    35.3 The Ruby-to-C/C++ Mapping

    This section describes the basics of how SWIG maps C or C++ declarations in your SWIG interface files to Ruby constructs.

    -

    34.3.1 Modules

    +

    35.3.1 Modules

    The SWIG %module directive specifies @@ -519,7 +519,7 @@ option to wrap everything into the global module, take care that the names of your constants, classes and methods don't conflict with any of Ruby's built-in names.

    -

    34.3.2 Functions

    +

    35.3.2 Functions

    Global functions are wrapped as Ruby module methods. For @@ -553,7 +553,7 @@ irb(main):002:0> Example.fact(4) 24 -

    34.3.3 Variable Linking

    +

    35.3.3 Variable Linking

    C/C++ global variables are wrapped as a pair of singleton @@ -615,7 +615,25 @@ directive. For example:

    effect until it is explicitly disabled using %mutable.

    -

    34.3.4 Constants

    +

    Note: When SWIG is invoked with the -globalmodule option in +effect, the C/C++ global variables will be translated into Ruby global +variables. Type-checking and the optional read-only characteristic are +available in the same way as described above. However the example would +then have to be modified and executed in the following way: + +

    +
    $ irb
    +irb(main):001:0> require 'Example'
    +true
    +irb(main):002:0> $variable1 = 2
    +2
    +irb(main):003:0> $Variable2 = 4 * 10.3
    +41.2
    +irb(main):004:0> $Variable2
    +41.2
    +
    + +

    35.3.4 Constants

    C/C++ constants are wrapped as module constants initialized @@ -643,7 +661,7 @@ irb(main):002:0> Example::PI 3.14159 -

    34.3.5 Pointers

    +

    35.3.5 Pointers

    "Opaque" pointers to arbitrary C/C++ types (i.e. types that @@ -667,7 +685,7 @@ returns an instance of an internally generated Ruby class:

    A NULL pointer is always represented by the Ruby nil object.

    -

    34.3.6 Structures

    +

    35.3.6 Structures

    C/C++ structs are wrapped as Ruby classes, with accessor @@ -772,7 +790,7 @@ void Bar_f_set(Bar *b, Foo *val) { } -

    34.3.7 C++ classes

    +

    35.3.7 C++ classes

    Like structs, C++ classes are wrapped by creating a new Ruby @@ -827,7 +845,7 @@ Ale 3 -

    34.3.8 C++ Inheritance

    +

    35.3.8 C++ Inheritance

    The SWIG type-checker is fully aware of C++ inheritance. @@ -980,7 +998,7 @@ inherit from both Base1 and Base2 (i.e. they exhibit "Duck Typing").

    -

    34.3.9 C++ Overloaded Functions

    +

    35.3.9 C++ Overloaded Functions

    C++ overloaded functions, methods, and constructors are @@ -1070,7 +1088,7 @@ arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    -

    34.3.10 C++ Operators

    +

    35.3.10 C++ Operators

    For the most part, overloaded operators are handled @@ -1112,7 +1130,7 @@ c = Example.add_complex(a, b) is discussed in the section on operator overloading.

    -

    34.3.11 C++ namespaces

    +

    35.3.11 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not @@ -1169,7 +1187,7 @@ and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    -

    34.3.12 C++ templates

    +

    35.3.12 C++ templates

    C++ templates don't present a huge problem for SWIG. However, @@ -1211,7 +1229,7 @@ irb(main):004:0> p.second 4 -

    34.3.13 C++ Standard Template Library (STL)

    +

    35.3.13 C++ Standard Template Library (STL)

    On a related note, the standard SWIG library contains a @@ -1304,7 +1322,7 @@ puts v shown in these examples. More details can be found in the SWIG and C++ chapter.

    -

    34.3.14 C++ STL Functors

    +

    35.3.14 C++ STL Functors

    Some containers in the STL allow you to modify their default @@ -1365,7 +1383,7 @@ b -

    34.3.15 C++ STL Iterators

    +

    35.3.15 C++ STL Iterators

    The STL is well known for the use of iterators. There @@ -1448,10 +1466,10 @@ i

    If you'd rather have STL classes without any iterators, you should define -DSWIG_NO_EXPORT_ITERATOR_METHODS when running swig.

    -

    34.3.16 C++ Smart Pointers

    +

    35.3.16 C++ Smart Pointers

    -

    34.3.16.1 The shared_ptr Smart Pointer

    +

    35.3.16.1 The shared_ptr Smart Pointer

    @@ -1462,7 +1480,7 @@ in the shared_ptr smart pointer -

    34.3.16.2 Generic Smart Pointers

    +

    35.3.16.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that @@ -1527,7 +1545,7 @@ method. For example:

    irb(main):004:0> f = p.__deref__() # Returns underlying Foo *
    -

    34.3.17 Cross-Language Polymorphism

    +

    35.3.17 Cross-Language Polymorphism

    SWIG's Ruby module supports cross-language polymorphism @@ -1536,7 +1554,7 @@ module. Rather than duplicate the information presented in the 34.3.17.1 Exception Unrolling +

    35.3.17.1 Exception Unrolling

    Whenever a C++ director class routes one of its virtual @@ -1559,7 +1577,7 @@ method is "wrapped" using the rb_rescue2() function from Ruby's C API. If any Ruby exception is raised, it will be caught here and a C++ exception is raised in its place.

    -

    34.4 Naming

    +

    35.4 Naming

    Ruby has several common naming conventions. Constants are @@ -1597,7 +1615,7 @@ generated by SWIG, it is turned off by default in SWIG 1.3.28. However, it is planned to become the default option in future releases.

    -

    34.4.1 Defining Aliases

    +

    35.4.1 Defining Aliases

    It's a fairly common practice in the Ruby built-ins and @@ -1667,7 +1685,7 @@ matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    -

    34.4.2 Predicate Methods

    +

    35.4.2 Predicate Methods

    Ruby methods that return a boolean value and end in a @@ -1716,7 +1734,7 @@ using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    -

    34.4.3 Bang Methods

    +

    35.4.3 Bang Methods

    Ruby methods that modify an object in-place and end in an @@ -1748,7 +1766,7 @@ using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    -

    34.4.4 Getters and Setters

    +

    35.4.4 Getters and Setters

    Often times a C++ library will expose properties through @@ -1783,7 +1801,7 @@ irb(main):003:0> puts foo.value %rename("value=") Foo::setValue(int value); -

    34.5 Input and output parameters

    +

    35.5 Input and output parameters

    A common problem in some C programs is handling parameters @@ -1922,10 +1940,10 @@ void get_dimensions(Matrix *m, int *rows, int*columns);

    r, c = Example.get_dimensions(m)
    -

    34.6 Exception handling

    +

    35.6 Exception handling

    -

    34.6.1 Using the %exception directive

    +

    35.6.1 Using the %exception directive

    The SWIG %exception directive can be @@ -2034,7 +2052,7 @@ methods and functions named getitem and setitem. limited to C++ exception handling. See the chapter on Customization Features for more examples.

    -

    34.6.2 Handling Ruby Blocks

    +

    35.6.2 Handling Ruby Blocks

    One of the highlights of Ruby and most of its standard library @@ -2101,7 +2119,7 @@ a special in typemap, like:

    For more information on typemaps, see Typemaps.

    -

    34.6.3 Raising exceptions

    +

    35.6.3 Raising exceptions

    There are three ways to raise exceptions from C++ code to @@ -2258,7 +2276,7 @@ function. The first argument passed to rb_raise() is the exception type. You can raise a custom exception type or one of the built-in Ruby exception types.

    -

    34.6.4 Exception classes

    +

    35.6.4 Exception classes

    Starting with SWIG 1.3.28, the Ruby module supports the %exceptionclass @@ -2295,7 +2313,7 @@ end

    For another example look at swig/Examples/ruby/exception_class.

    -

    34.7 Typemaps

    +

    35.7 Typemaps

    This section describes how you can modify SWIG's default @@ -2310,7 +2328,7 @@ a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Ruby interface.

    -

    34.7.1 What is a typemap?

    +

    35.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is @@ -2467,7 +2485,7 @@ to be used as follows (notice how the length parameter is omitted):

    2 -

    34.7.2 Typemap scope

    +

    35.7.2 Typemap scope

    Once defined, a typemap remains in effect for all of the @@ -2513,7 +2531,7 @@ where the class itself is defined. For example:

    }; -

    34.7.3 Copying a typemap

    +

    35.7.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    @@ -2555,7 +2573,7 @@ rules as for %apply (char *buf, int len) { (char *buffer, int size) }; // Multiple arguments -

    34.7.4 Deleting a typemap

    +

    35.7.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For @@ -2580,7 +2598,7 @@ defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    -

    34.7.5 Placement of typemaps

    +

    35.7.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, @@ -2651,13 +2669,13 @@ In this example, this is done using the class declaration class string .

    -

    34.7.6 Ruby typemaps

    +

    35.7.6 Ruby typemaps

    The following list details all of the typemap methods that can be used by the Ruby module:

    -

    34.7.6.1 "in" typemap

    +

    35.7.6.1 "in" typemap

    Converts Ruby objects to input @@ -2724,7 +2742,7 @@ arguments to be specified. For example:

    At this time, only zero or one arguments may be converted.

    -

    34.7.6.2 "typecheck" typemap

    +

    35.7.6.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded @@ -2746,7 +2764,7 @@ program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in a later section on "Typemaps and Overloading."

    -

    34.7.6.3 "out" typemap

    +

    35.7.6.3 "out" typemap

    Converts return value of a C function @@ -2797,7 +2815,7 @@ version of the C datatype matched by the typemap.

  • -

    34.7.6.4 "arginit" typemap

    +

    35.7.6.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a @@ -2812,7 +2830,7 @@ applications. For example:

    } -

    34.7.6.5 "default" typemap

    +

    35.7.6.5 "default" typemap

    The "default" typemap is used to turn an argument into a @@ -2837,7 +2855,7 @@ arguments that follow must have default values. See the 34.7.6.6 "check" typemap +

    35.7.6.6 "check" typemap

    The "check" typemap is used to supply value checking code @@ -2852,7 +2870,7 @@ arguments have been converted. For example:

    } -

    34.7.6.7 "argout" typemap

    +

    35.7.6.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. @@ -2906,7 +2924,7 @@ some function like SWIG_Ruby_AppendOutput.

    See the typemaps.i library for examples.

    -

    34.7.6.8 "freearg" typemap

    +

    35.7.6.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is @@ -2933,7 +2951,7 @@ This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    -

    34.7.6.9 "newfree" typemap

    +

    35.7.6.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject @@ -2957,7 +2975,7 @@ string *foo();

    See Object ownership and %newobject for further details.

    -

    34.7.6.10 "memberin" typemap

    +

    35.7.6.10 "memberin" typemap

    The "memberin" typemap is used to copy data from an @@ -2975,21 +2993,21 @@ example:

    already provides a default implementation for arrays, strings, and other objects.

    -

    34.7.6.11 "varin" typemap

    +

    35.7.6.11 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    -

    34.7.6.12 "varout" typemap

    +

    35.7.6.12 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    -

    34.7.6.13 "throws" typemap

    +

    35.7.6.13 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ @@ -3030,7 +3048,7 @@ specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    -

    34.7.6.14 directorin typemap

    +

    35.7.6.14 directorin typemap

    Converts C++ objects in director @@ -3089,7 +3107,7 @@ referring to the class itself. -

    34.7.6.15 directorout typemap

    +

    35.7.6.15 directorout typemap

    Converts Ruby objects in director @@ -3162,7 +3180,7 @@ exception.

    -

    34.7.6.16 directorargout typemap

    +

    35.7.6.16 directorargout typemap

    Output argument processing in director @@ -3220,19 +3238,19 @@ referring to the instance of the class itself -

    34.7.6.17 ret typemap

    +

    35.7.6.17 ret typemap

    Cleanup of function return values

    -

    34.7.6.18 globalin typemap

    +

    35.7.6.18 globalin typemap

    Setting of C global variables

    -

    34.7.7 Typemap variables

    +

    35.7.7 Typemap variables

    @@ -3282,7 +3300,7 @@ so that their values can be properly assigned.

    The Ruby name of the wrapper function being created.
    -

    34.7.8 Useful Functions

    +

    35.7.8 Useful Functions

    When you write a typemap, you usually have to work directly @@ -3297,7 +3315,7 @@ stick to the swig functions instead of the native Ruby functions. That should help you avoid having to rewrite a lot of typemaps across multiple languages.

    -

    34.7.8.1 C Datatypes to Ruby Objects

    +

    35.7.8.1 C Datatypes to Ruby Objects

    @@ -3339,7 +3357,7 @@ SWIG_From_float(float)
    -

    34.7.8.2 Ruby Objects to C Datatypes

    +

    35.7.8.2 Ruby Objects to C Datatypes

    Here, while the Ruby versions return the value directly, the SWIG @@ -3407,7 +3425,7 @@ versions do not, but return a status value to indicate success (SWIG_OK -

    34.7.8.3 Macros for VALUE

    +

    35.7.8.3 Macros for VALUE

    RSTRING_LEN(str)

    @@ -3430,7 +3448,7 @@ versions do not, but return a status value to indicate success (SWIG_OK
    pointer to array storage
    -

    34.7.8.4 Exceptions

    +

    35.7.8.4 Exceptions

    void rb_raise(VALUE exception, const char *fmt, @@ -3509,7 +3527,7 @@ message to standard error if Ruby was invoked with the -w flag. The given format string fmt and remaining arguments are interpreted as with printf(). -

    34.7.8.5 Iterators

    +

    35.7.8.5 Iterators

    void rb_iter_break()

    @@ -3555,14 +3573,14 @@ VALUE), VALUE value)

    Equivalent to Ruby's throw.
    -

    34.7.9 Typemap Examples

    +

    35.7.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the examples in the Example/ruby directory.

    -

    34.7.10 Converting a Ruby array to a char **

    +

    35.7.10 Converting a Ruby array to a char **

    A common problem in many C programs is the processing of @@ -3627,7 +3645,7 @@ array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    -

    34.7.11 Collecting arguments in a hash

    +

    35.7.11 Collecting arguments in a hash

    Ruby's solution to the "keyword arguments" capability of some @@ -3841,7 +3859,7 @@ memory leak. Fortunately, this typemap is a lot easier to write:

    program that uses the extension, can be found in the Examples/ruby/hashargs directory of the SWIG distribution.

    -

    34.7.12 Pointer handling

    +

    35.7.12 Pointer handling

    Occasionally, it might be necessary to convert pointer values @@ -3900,7 +3918,7 @@ For example:

    } -

    34.7.12.1 Ruby Datatype Wrapping

    +

    35.7.12.1 Ruby Datatype Wrapping

    VALUE Data_Wrap_Struct(VALUE class, void @@ -3927,7 +3945,7 @@ as above. type c-type from the data object obj and assigns that pointer to ptr. -

    34.7.13 Example: STL Vector to Ruby Array

    +

    35.7.13 Example: STL Vector to Ruby Array

    Another use for macros and type maps is to create a Ruby array @@ -4019,7 +4037,7 @@ STL with ruby, you are advised to use the standard swig STL library, which does much more than this. Refer to the section called the C++ Standard Template Library. -

    34.8 Docstring Features

    +

    35.8 Docstring Features

    @@ -4053,7 +4071,7 @@ generate ri documentation from a c wrap file, you could do:

    $ rdoc -r file_wrap.c -

    34.8.1 Module docstring

    +

    35.8.1 Module docstring

    @@ -4083,7 +4101,7 @@ layout of controls on a panel, etc. to be loaded from an XML file." %module(docstring=DOCSTRING) xrc -

    34.8.2 %feature("autodoc")

    +

    35.8.2 %feature("autodoc")

    Since SWIG does know everything about the function it wraps, @@ -4104,7 +4122,7 @@ several options for autodoc controlled by the value given to the feature, described below.

    -

    34.8.2.1 %feature("autodoc", "0")

    +

    35.8.2.1 %feature("autodoc", "0")

    @@ -4128,7 +4146,7 @@ Then Ruby code like this will be generated: ... -

    34.8.2.2 %feature("autodoc", "1")

    +

    35.8.2.2 %feature("autodoc", "1")

    @@ -4148,7 +4166,7 @@ this: ... -

    34.8.2.3 %feature("autodoc", "2")

    +

    35.8.2.3 %feature("autodoc", "2")

    @@ -4160,7 +4178,7 @@ parameter types with the "2" option will result in Ruby code like this:

    -

    34.8.2.4 %feature("autodoc", "3")

    +

    35.8.2.4 %feature("autodoc", "3")

    @@ -4181,7 +4199,7 @@ Parameters: bar - Bar -

    34.8.2.5 %feature("autodoc", "docstring")

    +

    35.8.2.5 %feature("autodoc", "docstring")

    @@ -4197,7 +4215,7 @@ generated string. For example: void GetPosition(int* OUTPUT, int* OUTPUT); -

    34.8.3 %feature("docstring")

    +

    35.8.3 %feature("docstring")

    @@ -4208,10 +4226,10 @@ docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together.

    -

    34.9 Advanced Topics

    +

    35.9 Advanced Topics

    -

    34.9.1 Operator overloading

    +

    35.9.1 Operator overloading

    SWIG allows operator overloading with, by using the %extend @@ -4392,7 +4410,7 @@ separate method for handling inequality since Ruby parses the expression a != b as !(a == b).

    -

    34.9.2 Creating Multi-Module Packages

    +

    35.9.2 Creating Multi-Module Packages

    The chapter on Working @@ -4518,7 +4536,7 @@ irb(main):005:0> c.getX() 5.0 -

    34.9.3 Specifying Mixin Modules

    +

    35.9.3 Specifying Mixin Modules

    The Ruby language doesn't support multiple inheritance, but @@ -4585,7 +4603,7 @@ matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    -

    34.10 Memory Management

    +

    35.10 Memory Management

    One of the most common issues in generating SWIG bindings for @@ -4608,7 +4626,7 @@ to C++ (or vice versa) depending on what function or methods are invoked. Clearly, developing a SWIG wrapper requires a thorough understanding of how the underlying library manages memory.

    -

    34.10.1 Mark and Sweep Garbage Collector

    +

    35.10.1 Mark and Sweep Garbage Collector

    Ruby uses a mark and sweep garbage collector. When the garbage @@ -4639,7 +4657,7 @@ any memory has been allocated in creating the underlying C struct or C++ struct, then a "free" function must be defined that deallocates this memory.

    -

    34.10.2 Object Ownership

    +

    35.10.2 Object Ownership

    As described above, memory management depends on clearly @@ -4784,7 +4802,7 @@ public:

    This code can be seen in swig/examples/ruby/tracking.

    -

    34.10.3 Object Tracking

    +

    35.10.3 Object Tracking

    The remaining parts of this section will use the class library @@ -5010,7 +5028,7 @@ However, if you implement your own free functions (see below) you may also have to call the SWIG_RubyRemoveTracking and RubyUnlinkObjects methods.

    -

    34.10.4 Mark Functions

    +

    35.10.4 Mark Functions

    With a bit more testing, we see that our class library still @@ -5139,7 +5157,7 @@ irb(main):016:0>

    This code can be seen in swig/examples/ruby/mark_function.

    -

    34.10.5 Free Functions

    +

    35.10.5 Free Functions

    By default, SWIG creates a "free" function that is called when @@ -5307,7 +5325,7 @@ been freed, and thus raises a runtime exception.

    This code can be seen in swig/examples/ruby/free_function.

    -

    34.10.6 Embedded Ruby and the C++ Stack

    +

    35.10.6 Embedded Ruby and the C++ Stack

    As has been said, the Ruby GC runs and marks objects before diff --git a/Doc/Manual/SWIG.html b/Doc/Manual/SWIG.html index d1492d30a..876c0ac17 100644 --- a/Doc/Manual/SWIG.html +++ b/Doc/Manual/SWIG.html @@ -127,7 +127,7 @@ Supported Target Language Options -lua - Generate Lua wrappers -octave - Generate Octave wrappers -perl5 - Generate Perl 5 wrappers - -php7 - Generate PHP 7 wrappers + -php7 - Generate PHP 7 or later wrappers -python - Generate Python wrappers -r - Generate R (aka GNU S) wrappers -ruby - Generate Ruby wrappers @@ -826,6 +826,32 @@ However, for the same conservative reasons even a constant with a simple cast wi +

    +This logic can lead to false attempts at converting #define into %constant though. +For example the following case does not have any undefined symbols within the macro: +

    + +
    +
    +// For indicating pure virtual functions such as: virtual void f() PURE;
    +#define PURE = 0
    +
    +
    + +

    +A warning is issued: +

    + +
    +
    +pure.h:1: Warning 305: Bad constant value (ignored).
    +
    +
    + +

    +In such cases simply ignore the warning or suppress it using the normal warning suppression techniques. +

    +

    The use of constant expressions is allowed, but SWIG does not evaluate them. Rather, it passes them through to the output file and lets the C @@ -1994,7 +2020,7 @@ and a more descriptive one, but the two functions are otherwise equivalent: regex:/pattern/subst/ String after (Perl-like) regex substitution operation. This function - allows to apply arbitrary regular expressions to the identifier names. The + allows applying arbitrary regular expressions to the identifier names. The pattern part is a regular expression in Perl syntax (as supported by the Perl Compatible Regular Expressions (PCRE)) library and the subst string @@ -3438,6 +3464,18 @@ initialization on module loading, you could write this: %} +

    +Please note that some language backends (e.g. C# or Java) don't have any +initialization function, hence you should define a global object performing +the necessary initialization for them instead: +

    + +
    +%init %{
    +  static struct MyInit { MyInit() { init_variables(); } } myInit;
    +%}
    +
    +

    5.7 An Interface Building Strategy

    diff --git a/Doc/Manual/SWIGPlus.html b/Doc/Manual/SWIGPlus.html index dc9ae0f7e..2244a0508 100644 --- a/Doc/Manual/SWIGPlus.html +++ b/Doc/Manual/SWIGPlus.html @@ -91,6 +91,7 @@ For additions to the original C++ standard, please read the SWIG and C++11, SWIG and C++14 and SWIG and C++17 chapters. +SWIG and C++20 chapters. As a prerequisite, you should first read the chapter SWIG Basics to see how SWIG wraps ISO C. Support for C++ builds upon ISO C @@ -3631,7 +3632,7 @@ Alternatively, you could expand the constructor template in selected instantiati // Create default and conversion constructors %extend pair<double, double> { - %template(paird) pair<double, dobule>; // Default constructor + %template(paird) pair<double, double>; // Default constructor %template(pairc) pair<int, int>; // Conversion constructor }; @@ -3646,7 +3647,7 @@ instead:
     // Create default and conversion constructors 
     %extend pair<double, double> {
    -  %template(pair) pair<double, dobule>;   // Default constructor
    +  %template(pair) pair<double, double>;   // Default constructor
       %template(pair) pair<int, int>;         // Conversion constructor
     };
     
    diff --git a/Doc/Manual/Scilab.html b/Doc/Manual/Scilab.html index 88ab8043e..5c4ef6269 100644 --- a/Doc/Manual/Scilab.html +++ b/Doc/Manual/Scilab.html @@ -9,7 +9,7 @@ -

    35 SWIG and Scilab

    +

    36 SWIG and Scilab

    -

    35.3 A basic tour of C/C++ wrapping

    +

    36.3 A basic tour of C/C++ wrapping

    -

    35.3.1 Overview

    +

    36.3.1 Overview

    @@ -332,7 +332,7 @@ This means that functions, structs, classes, variables, etc... are interfaced th There are a few exceptions, such as constants and enumerations, which can be wrapped directly as Scilab variables.

    -

    35.3.2 Identifiers

    +

    36.3.2 Identifiers

    @@ -347,7 +347,7 @@ In these cases, the %rename directive Note: truncations can be disabled by specifying the target version 6 of Scilab in the targetversion argument (i.e. -targetversion 6).

    -

    35.3.3 Functions

    +

    36.3.3 Functions

    @@ -378,7 +378,7 @@ ans = 24. -

    35.3.3.1 Argument passing

    +

    36.3.3.1 Argument passing

    @@ -431,7 +431,7 @@ In Scilab, parameters are passed by value. The output (and inout) parameters are 7. -

    35.3.3.2 Multiple output arguments

    +

    36.3.3.2 Multiple output arguments

    @@ -480,7 +480,7 @@ int divide(int n, int d, int *OUTPUT, int *OUTPUT); -

    35.3.4 Global variables

    +

    36.3.4 Global variables

    @@ -549,10 +549,10 @@ It works the same:

    -

    35.3.5 Constants and enumerations

    +

    36.3.5 Constants and enumerations

    -

    35.3.5.1 Constants

    +

    36.3.5.1 Constants

    @@ -693,7 +693,7 @@ are mapped to Scilab variables, with the same name: 3.14 -

    35.3.5.2 Enumerations

    +

    36.3.5.2 Enumerations

    @@ -758,7 +758,7 @@ typedef enum { RED, BLUE, GREEN } color; -

    35.3.6 Pointers

    +

    36.3.6 Pointers

    @@ -820,7 +820,7 @@ Note: the type name _p_FILE which means "pointer to FILE". The user of a pointer is responsible for freeing it or, like in the example, closing any resources associated with it (just as is required in a C program).

    -

    35.3.6.1 Utility functions

    +

    36.3.6.1 Utility functions

    @@ -861,7 +861,7 @@ ans = -

    35.3.6.2 Null pointers:

    +

    36.3.6.2 Null pointers:

    @@ -877,7 +877,7 @@ Using the previous SWIG_this() and SWIG_ptr(), it is possible -

    35.3.7 Structures

    +

    36.3.7 Structures

    @@ -986,7 +986,7 @@ Note: the pointer to the struct works as described in 35.3.8 C++ classes +

    36.3.8 C++ classes

    @@ -1054,7 +1054,7 @@ Note: like structs, class pointers are mapped as described in 35.3.9 C++ inheritance +

    36.3.9 C++ inheritance

    @@ -1129,7 +1129,7 @@ But we can use either use the get_perimeter() function of the parent cl 18.84 -

    35.3.10 C++ overloading

    +

    36.3.10 C++ overloading

    @@ -1169,7 +1169,7 @@ void magnify(Circle *circle, double factor) { -

    35.3.11 Pointers, references, values, and arrays

    +

    36.3.11 Pointers, references, values, and arrays

    @@ -1227,7 +1227,7 @@ All these functions will return a pointer to an instance of Foo. As the function spam7 returns a value, new instance of Foo has to be allocated, and a pointer on this instance is returned.

    -

    35.3.12 C++ templates

    +

    36.3.12 C++ templates

    @@ -1286,7 +1286,7 @@ Then in Scilab: More details on template support can be found in the templates documentation.

    -

    35.3.13 C++ operators

    +

    36.3.13 C++ operators

    @@ -1339,7 +1339,7 @@ private: -

    35.3.14 C++ namespaces

    +

    36.3.14 C++ namespaces

    @@ -1417,7 +1417,7 @@ Note: the nspace feature is not supp

    -

    35.3.15 C++ exceptions

    +

    36.3.15 C++ exceptions

    @@ -1500,17 +1500,17 @@ More complex or custom exception types require specific exception typemaps to be See the SWIG C++ documentation for more details.

    -

    35.3.16 C++ STL

    +

    36.3.16 C++ STL

    The Standard Template Library (STL) is partially supported. See STL for more details.

    -

    35.4 Type mappings and libraries

    +

    36.4 Type mappings and libraries

    -

    35.4.1 Default primitive type mappings

    +

    36.4.1 Default primitive type mappings

    @@ -1561,7 +1561,7 @@ The default behaviour is for SWIG to generate code that will give a runtime erro -

    35.4.2 Arrays

    +

    36.4.2 Arrays

    @@ -1616,7 +1616,7 @@ void printArray(int values[], int len) { [ 0 1 2 3 ] -

    35.4.3 Pointer-to-pointers

    +

    36.4.3 Pointer-to-pointers

    @@ -1689,7 +1689,7 @@ void print_matrix(double **M, int nbRows, int nbCols) { -

    35.4.4 Matrices

    +

    36.4.4 Matrices

    @@ -1782,7 +1782,7 @@ The remarks made earlier for arrays also apply here:

  • There is no control while converting double values to integers, double values are truncated without any checking or warning.
  • -

    35.4.5 STL

    +

    36.4.5 STL

    @@ -1982,7 +1982,7 @@ ans = --> delete_PersonPtrSet(p); -

    35.5 Module initialization

    +

    36.5 Module initialization

    @@ -2006,7 +2006,7 @@ For example, to initialize the module example: --> example_Init(); -

    35.6 Building modes

    +

    36.6 Building modes

    @@ -2021,7 +2021,7 @@ To produce a dynamic module, when generating the wrapper, there are two possibil

  • the builder mode. In this mode, Scilab is responsible of building. -

    35.6.1 No-builder mode

    +

    36.6.1 No-builder mode

    @@ -2034,7 +2034,7 @@ This mode is the best option to use when you have to integrate the module build

    -

    35.6.2 Builder mode

    +

    36.6.2 Builder mode

    @@ -2074,14 +2074,14 @@ The command is: $ swig -scilab -builder -buildercflags -I/opt/foo/include -builderldflags "-L/opt/foo/lib -lfoo" -buildersources baa1.cxx, baa2.cxx example.i -

    35.7 Generated scripts

    +

    36.7 Generated scripts

    In this part we give some details about the generated Scilab scripts.

    -

    35.7.1 Builder script

    +

    36.7.1 Builder script

    @@ -2106,7 +2106,7 @@ ilib_build(ilib_name, table, files, libs);

  • table: two column string matrix containing a table of pairs of 'scilab function name', 'C function name'.
  • -

    35.7.2 Loader script

    +

    36.7.2 Loader script

    @@ -2145,7 +2145,7 @@ clear get_file_path; -

    35.8 Other resources

    +

    36.8 Other resources

    -

    13.4 Code generation rules

    +

    14.4 Code generation rules

    @@ -1878,7 +1878,7 @@ This section describes rules by which typemap code is inserted into the generated wrapper code.

    -

    13.4.1 Scope

    +

    14.4.1 Scope

    @@ -1956,7 +1956,7 @@ a block scope when it is emitted. This sometimes results in a less complicated Note that only the third of the three typemaps have the typemap code passed through the SWIG preprocessor.

    -

    13.4.2 Declaring new local variables

    +

    14.4.2 Declaring new local variables

    @@ -2123,7 +2123,7 @@ each type must have its own local variable declaration. -

    13.4.3 Special variables

    +

    14.4.3 Special variables

    @@ -2375,7 +2375,7 @@ Another approach, which only works for arrays is to use the $1_basetype -

    13.4.4 Special variable macros

    +

    14.4.4 Special variable macros

    @@ -2387,7 +2387,7 @@ it is done during the SWIG parsing/compilation stages. The following special variable macros are available across all language modules.

    -

    13.4.4.1 $descriptor(type)

    +

    14.4.4.1 $descriptor(type)

    @@ -2398,7 +2398,7 @@ For example, $descriptor(std::vector<int> *) will expand into Run-time type checker usage section.

    -

    13.4.4.2 $typemap(method, typepattern)

    +

    14.4.4.2 $typemap(method, typepattern)

    @@ -2456,7 +2456,7 @@ The result is the following expansion -

    13.4.5 Special variables and typemap attributes

    +

    14.4.5 Special variables and typemap attributes

    @@ -2483,7 +2483,7 @@ is equivalent to the following as $*1_ltype expands to unsigned int -

    13.4.6 Special variables combined with special variable macros

    +

    14.4.6 Special variables combined with special variable macros

    @@ -2525,7 +2525,7 @@ which then expands to: -

    13.5 Common typemap methods

    +

    14.5 Common typemap methods

    @@ -2533,7 +2533,7 @@ The family of typemaps recognized by a language module may vary. However, the following typemap methods are nearly universal:

    -

    13.5.1 "in" typemap

    +

    14.5.1 "in" typemap

    @@ -2593,7 +2593,7 @@ Usually numinputs is not specified, whereupon the default value is 1, t is the same as the old "ignore" typemap.

    -

    13.5.2 "typecheck" typemap

    +

    14.5.2 "typecheck" typemap

    @@ -2620,7 +2620,7 @@ If you define new "in" typemaps and your program uses overloaded method "typecheck" typemaps. More details about this follow in the Typemaps and overloading section.

    -

    13.5.3 "out" typemap

    +

    14.5.3 "out" typemap

    @@ -2651,7 +2651,7 @@ $symname - Name of function/method being wrapped The "out" typemap supports an optional attribute flag called "optimal". This is for code optimisation and is detailed in the Optimal code generation when returning by value section.

    -

    13.5.4 "arginit" typemap

    +

    14.5.4 "arginit" typemap

    @@ -2670,7 +2670,7 @@ For example: -

    13.5.5 "default" typemap

    +

    14.5.5 "default" typemap

    @@ -2703,7 +2703,7 @@ See the Default/optional arguments sec for further information on default argument wrapping.

    -

    13.5.6 "check" typemap

    +

    14.5.6 "check" typemap

    @@ -2722,7 +2722,7 @@ converted. For example: -

    13.5.7 "argout" typemap

    +

    14.5.7 "argout" typemap

    @@ -2768,7 +2768,7 @@ return values are often appended to return value of the function. See the typemaps.i library file for examples.

    -

    13.5.8 "freearg" typemap

    +

    14.5.8 "freearg" typemap

    @@ -2801,7 +2801,7 @@ be used in other typemaps whenever a wrapper function needs to abort prematurely.

    -

    13.5.9 "newfree" typemap

    +

    14.5.9 "newfree" typemap

    @@ -2830,7 +2830,7 @@ string *foo(); See Object ownership and %newobject for further details.

    -

    13.5.10 "ret" typemap

    +

    14.5.10 "ret" typemap

    @@ -2869,7 +2869,7 @@ This approach is an alternative to using the "newfree" typemap and %newobjec is no need to list all the functions that require the memory cleanup, it is purely done on types.

    -

    13.5.11 "memberin" typemap

    +

    14.5.11 "memberin" typemap

    @@ -2891,7 +2891,7 @@ It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    -

    13.5.12 "varin" typemap

    +

    14.5.12 "varin" typemap

    @@ -2899,7 +2899,7 @@ The "varin" typemap is used to convert objects in the target language to C for t purposes of assigning to a C/C++ global variable. This is implementation specific.

    -

    13.5.13 "varout" typemap

    +

    14.5.13 "varout" typemap

    @@ -2907,7 +2907,7 @@ The "varout" typemap is used to convert a C/C++ object to an object in the targe language when reading a C/C++ global variable. This is implementation specific.

    -

    13.5.14 "throws" typemap

    +

    14.5.14 "throws" typemap

    @@ -2957,7 +2957,7 @@ Note that if your methods do not have an exception specification but they do thr Please also see the Exception handling with %exception section for another way to handle exceptions.

    -

    13.6 Some typemap examples

    +

    14.6 Some typemap examples

    @@ -2965,7 +2965,7 @@ This section contains a few examples. Consult language module documentation for more examples.

    -

    13.6.1 Typemaps for arrays

    +

    14.6.1 Typemaps for arrays

    @@ -3224,7 +3224,7 @@ Now, you will find that member access is quite nice: useless and has since been eliminated. To return structure members, simply use the "out" typemap.

    -

    13.6.2 Implementing constraints with typemaps

    +

    14.6.2 Implementing constraints with typemaps

    @@ -3272,7 +3272,7 @@ a NULL pointer. As a result, SWIG can often prevent a potential segmentation faults or other run-time problems by raising an exception rather than blindly passing values to the underlying C/C++ program.

    -

    13.7 Typemaps for multiple target languages

    +

    14.7 Typemaps for multiple target languages

    @@ -3302,7 +3302,7 @@ The example above also shows a common approach of issuing a warning for an as ye %typemap(ruby, in) int "$1 = NUM2INT($input);".

    -

    13.8 Optimal code generation when returning by value

    +

    14.8 Optimal code generation when returning by value

    @@ -3491,7 +3491,7 @@ example.i:7: Warning 475: optimal attribute usage in the out typemap. However, it doesn't always get it right, for example when $1 is within some commented out code.

    -

    13.9 Multi-argument typemaps

    +

    14.9 Multi-argument typemaps

    @@ -3768,7 +3768,7 @@ with non-consecutive C/C++ arguments; a workaround such as a helper function re- the arguments to make them consecutive will need to be written.

    -

    13.10 Typemap warnings

    +

    14.10 Typemap warnings

    @@ -3777,7 +3777,7 @@ See the information in the issuing warnings

    -

    13.11 Typemap fragments

    +

    14.11 Typemap fragments

    @@ -4113,7 +4113,7 @@ fragment usage unless a desire to really get to grips with some powerful but tricky macro and fragment usage that is used in parts of the SWIG typemap library.

    -

    13.11.1 Fragment type specialization

    +

    14.11.1 Fragment type specialization

    @@ -4146,7 +4146,7 @@ struct A { -

    13.11.2 Fragments and automatic typemap specialization

    +

    14.11.2 Fragments and automatic typemap specialization

    @@ -4192,7 +4192,7 @@ The interested (or very brave) reader can take a look at the fragments.swg file

    -

    13.12 The run-time type checker

    +

    14.12 The run-time type checker

    @@ -4218,7 +4218,7 @@ language modules.

  • Modules can be unloaded from the type system.
  • -

    13.12.1 Implementation

    +

    14.12.1 Implementation

    @@ -4412,7 +4412,7 @@ structures rather than creating new ones. These swig_module_info structures are chained together in a circularly linked list.

    -

    13.12.2 Usage

    +

    14.12.2 Usage

    This section covers how to use these functions from typemaps. To learn how to @@ -4508,7 +4508,7 @@ probably just look at the output of SWIG to get a better sense for how types are managed.

    -

    13.13 Typemaps and overloading

    +

    14.13 Typemaps and overloading

    @@ -4630,37 +4630,69 @@ To support dynamic dispatch, SWIG first defines a general purpose type hierarchy

     Symbolic Name                   Precedence Value
     ------------------------------  ------------------
    -SWIG_TYPECHECK_POINTER           0  
    -SWIG_TYPECHECK_VOIDPTR           10 
    -SWIG_TYPECHECK_BOOL              15 
    -SWIG_TYPECHECK_UINT8             20 
    -SWIG_TYPECHECK_INT8              25 
    -SWIG_TYPECHECK_UINT16            30 
    -SWIG_TYPECHECK_INT16             35 
    -SWIG_TYPECHECK_UINT32            40 
    -SWIG_TYPECHECK_INT32             45 
    -SWIG_TYPECHECK_UINT64            50 
    -SWIG_TYPECHECK_INT64             55 
    -SWIG_TYPECHECK_UINT128           60 
    -SWIG_TYPECHECK_INT128            65 
    -SWIG_TYPECHECK_INTEGER           70 
    -SWIG_TYPECHECK_FLOAT             80 
    -SWIG_TYPECHECK_DOUBLE            90 
    -SWIG_TYPECHECK_COMPLEX           100 
    -SWIG_TYPECHECK_UNICHAR           110 
    -SWIG_TYPECHECK_UNISTRING         120 
    -SWIG_TYPECHECK_CHAR              130 
    -SWIG_TYPECHECK_STRING            140 
    -SWIG_TYPECHECK_BOOL_ARRAY        1015 
    -SWIG_TYPECHECK_INT8_ARRAY        1025 
    -SWIG_TYPECHECK_INT16_ARRAY       1035 
    -SWIG_TYPECHECK_INT32_ARRAY       1045 
    -SWIG_TYPECHECK_INT64_ARRAY       1055 
    -SWIG_TYPECHECK_INT128_ARRAY      1065 
    -SWIG_TYPECHECK_FLOAT_ARRAY       1080 
    -SWIG_TYPECHECK_DOUBLE_ARRAY      1090 
    -SWIG_TYPECHECK_CHAR_ARRAY        1130 
    -SWIG_TYPECHECK_STRING_ARRAY      1140 
    +SWIG_TYPECHECK_POINTER           0
    +SWIG_TYPECHECK_ITERATOR          5
    +SWIG_TYPECHECK_VOIDPTR           10
    +SWIG_TYPECHECK_BOOL              15
    +SWIG_TYPECHECK_UINT8             20
    +SWIG_TYPECHECK_INT8              25
    +SWIG_TYPECHECK_UINT16            30
    +SWIG_TYPECHECK_INT16             35
    +SWIG_TYPECHECK_UINT32            40
    +SWIG_TYPECHECK_INT32             45
    +SWIG_TYPECHECK_SIZE              47
    +SWIG_TYPECHECK_PTRDIFF           48
    +SWIG_TYPECHECK_UINT64            50
    +SWIG_TYPECHECK_INT64             55
    +SWIG_TYPECHECK_UINT128           60
    +SWIG_TYPECHECK_INT128            65
    +SWIG_TYPECHECK_INTEGER           70
    +SWIG_TYPECHECK_FLOAT             80
    +SWIG_TYPECHECK_DOUBLE            90
    +SWIG_TYPECHECK_CPLXFLT           95
    +SWIG_TYPECHECK_CPLXDBL           100
    +SWIG_TYPECHECK_COMPLEX           105
    +SWIG_TYPECHECK_UNICHAR           110
    +SWIG_TYPECHECK_STDUNISTRING      115
    +SWIG_TYPECHECK_UNISTRING         120
    +SWIG_TYPECHECK_CHAR              130
    +SWIG_TYPECHECK_STDSTRING         135
    +SWIG_TYPECHECK_STRING            140
    +SWIG_TYPECHECK_PAIR              150
    +SWIG_TYPECHECK_STDARRAY          155
    +SWIG_TYPECHECK_VECTOR            160
    +SWIG_TYPECHECK_DEQUE             170
    +SWIG_TYPECHECK_LIST              180
    +SWIG_TYPECHECK_SET               190
    +SWIG_TYPECHECK_MULTISET          200
    +SWIG_TYPECHECK_MAP               210
    +SWIG_TYPECHECK_MULTIMAP          220
    +SWIG_TYPECHECK_STACK             230
    +SWIG_TYPECHECK_QUEUE             240
    +SWIG_TYPECHECK_BOOL_ARRAY        1015
    +SWIG_TYPECHECK_INT8_ARRAY        1025
    +SWIG_TYPECHECK_INT16_ARRAY       1035
    +SWIG_TYPECHECK_INT32_ARRAY       1045
    +SWIG_TYPECHECK_INT64_ARRAY       1055
    +SWIG_TYPECHECK_INT128_ARRAY      1065
    +SWIG_TYPECHECK_FLOAT_ARRAY       1080
    +SWIG_TYPECHECK_DOUBLE_ARRAY      1090
    +SWIG_TYPECHECK_CHAR_ARRAY        1130
    +SWIG_TYPECHECK_STRING_ARRAY      1140
    +SWIG_TYPECHECK_OBJECT_ARRAY      1150
    +SWIG_TYPECHECK_BOOL_PTR          2015
    +SWIG_TYPECHECK_UINT8_PTR         2020
    +SWIG_TYPECHECK_INT8_PTR          2025
    +SWIG_TYPECHECK_UINT16_PTR        2030
    +SWIG_TYPECHECK_INT16_PTR         2035
    +SWIG_TYPECHECK_UINT32_PTR        2040
    +SWIG_TYPECHECK_INT32_PTR         2045
    +SWIG_TYPECHECK_UINT64_PTR        2050
    +SWIG_TYPECHECK_INT64_PTR         2055
    +SWIG_TYPECHECK_FLOAT_PTR         2080
    +SWIG_TYPECHECK_DOUBLE_PTR        2090
    +SWIG_TYPECHECK_CHAR_PTR          2130
    +SWIG_TYPECHECK_SWIGOBJECT        5000
     
    @@ -4815,7 +4847,7 @@ Subsequent "in" typemaps would then perform more extensive type-checking. -

    13.13.1 SWIG_TYPECHECK_POINTER precedence level and the typecheck typemap

    +

    14.13.1 SWIG_TYPECHECK_POINTER precedence level and the typecheck typemap

    @@ -4917,7 +4949,7 @@ Otherwise both can be wrapped by removing the overloading name ambiguity by rena The 'equivalent' attribute is used in the implementation for the shared_ptr smart pointer library.

    -

    13.14 More about %apply and %clear

    +

    14.14 More about %apply and %clear

    @@ -5022,7 +5054,7 @@ will delete the typemaps for all the typemap methods; namely "in", "check" and " -

    13.15 Passing data between typemaps

    +

    14.15 Passing data between typemaps

    @@ -5059,7 +5091,7 @@ sure that the typemaps sharing information have exactly the same types and names

    -

    13.16 C++ "this" pointer

    +

    14.16 C++ "this" pointer

    @@ -5119,7 +5151,7 @@ will also match the typemap. One work around is to create an interface file tha the method, but gives the argument a name other than self.

    -

    13.17 Where to go for more information?

    +

    14.17 Where to go for more information?

    diff --git a/Doc/Manual/Varargs.html b/Doc/Manual/Varargs.html index 9f20469d2..620f2e5a0 100644 --- a/Doc/Manual/Varargs.html +++ b/Doc/Manual/Varargs.html @@ -7,7 +7,7 @@ -

    16 Variable Length Arguments

    +

    17 Variable Length Arguments

      @@ -43,7 +43,7 @@ added in SWIG-1.3.12. Most other wrapper generation tools have wisely chosen to avoid this issue.

      -

      16.1 Introduction

      +

      17.1 Introduction

      @@ -140,7 +140,7 @@ List make_list(const char *s, ...) {

    -

    16.2 The Problem

    +

    17.2 The Problem

    @@ -233,7 +233,7 @@ can also support real varargs wrapping (with stack-frame manipulation) if you are willing to get hands dirty. Keep reading.

    -

    16.3 Default varargs support

    +

    17.3 Default varargs support

    @@ -302,7 +302,7 @@ Read on for further solutions.

    -

    16.4 Argument replacement using %varargs

    +

    17.4 Argument replacement using %varargs

    @@ -413,7 +413,7 @@ mixed argument types such as printf(). Providing general purpose wrappers to such functions presents special problems (covered shortly).

    -

    16.5 Varargs and typemaps

    +

    17.5 Varargs and typemaps

    @@ -593,7 +593,7 @@ really want to elevate your guru status and increase your job security, continue to the next section.

    -

    16.6 Varargs wrapping with libffi

    +

    17.6 Varargs wrapping with libffi

    @@ -845,7 +845,7 @@ provide an argument number for the first extra argument. This can be used to in values. Please consult the chapter on each language module for more details.

    -

    16.7 Wrapping of va_list

    +

    17.7 Wrapping of va_list

    @@ -899,7 +899,7 @@ int my_vprintf(const char *fmt, ...) { -

    16.8 C++ Issues

    +

    17.8 C++ Issues

    @@ -968,7 +968,7 @@ design or to provide an alternative interface using a helper function than it is fully general wrapper to a varargs C++ member function.

    -

    16.9 Discussion

    +

    17.9 Discussion

    diff --git a/Doc/Manual/Warnings.html b/Doc/Manual/Warnings.html index c63d7de0c..02197f1cb 100644 --- a/Doc/Manual/Warnings.html +++ b/Doc/Manual/Warnings.html @@ -7,7 +7,7 @@ -

    18 Warning Messages

    +

    19 Warning Messages

    -

    18.5 Symbolic symbols

    +

    19.5 Symbolic symbols

    @@ -311,7 +311,7 @@ or -

    18.6 Commentary

    +

    19.6 Commentary

    @@ -328,7 +328,7 @@ no obvious recovery. There is no mechanism for suppressing error messages.

    -

    18.7 Warnings as errors

    +

    19.7 Warnings as errors

    @@ -337,7 +337,7 @@ option. This will cause SWIG to exit with a non successful exit code if a warning is encountered.

    -

    18.8 Message output format

    +

    19.8 Message output format

    @@ -356,10 +356,10 @@ $ swig -python -Fmicrosoft example.i example.i(4) : Syntax error in input(1). -

    18.9 Warning number reference

    +

    19.9 Warning number reference

    -

    18.9.1 Deprecated features (100-199)

    +

    19.9.1 Deprecated features (100-199)

      @@ -387,7 +387,7 @@ example.i(4) : Syntax error in input(1).
    • 126. The 'nestedworkaround' feature is deprecated.
    -

    18.9.2 Preprocessor (200-299)

    +

    19.9.2 Preprocessor (200-299)

      @@ -399,7 +399,7 @@ example.i(4) : Syntax error in input(1).
    • 206. Unexpected tokens after #directive directive.
    -

    18.9.3 C/C++ Parser (300-399)

    +

    19.9.3 C/C++ Parser (300-399)

      @@ -476,14 +476,14 @@ example.i(4) : Syntax error in input(1).
    • 395. operator delete[] ignored.
    -

    18.9.4 Types and typemaps (400-499)

    +

    19.9.4 Types and typemaps (400-499)

    \n" + - " {@link someMember Some description follows }\n" + + " {@link someMember Some description follows} with text after\n" + " This will only appear in man\n"); - wantedComments.put("doxygen_translate_all_tags.doxygen_translate_all_tags.func07(int)", + wantedComments.put("doxygen_translate_all_tags.doxygen_translate_all_tags.func07(int, int, int, int)", " Comment for func07().\n" + " Note: Here \n" + " is the note! \n" + @@ -115,7 +107,10 @@ public class doxygen_translate_all_tags_runme { " The paragraph text. \n" + " Maybe even multiline \n" + "

    \n" + - " @param a the first param\n"); + " @param a the first param\n" + + " @param b parameter with intent(in)\n" + + " @param c parameter with intent(out)\n" + + " @param d parameter with intent(in,out)\n"); wantedComments.put("doxygen_translate_all_tags.doxygen_translate_all_tags.func08(int)", "
    \n" + @@ -154,6 +149,6 @@ public class doxygen_translate_all_tags_runme { " And here goes simple text \n" + ""); // and ask the parser to check comments for us - System.exit(parser.check(wantedComments)); + System.exit(CommentParser.check(wantedComments)); } } diff --git a/Examples/test-suite/java/doxygen_translate_links_runme.java b/Examples/test-suite/java/doxygen_translate_links_runme.java index 6d74e16fe..afee4eac6 100644 --- a/Examples/test-suite/java/doxygen_translate_links_runme.java +++ b/Examples/test-suite/java/doxygen_translate_links_runme.java @@ -1,6 +1,5 @@ import doxygen_translate_links.*; -import com.sun.javadoc.*; import java.util.HashMap; public class doxygen_translate_links_runme { @@ -15,14 +14,7 @@ public class doxygen_translate_links_runme { public static void main(String argv[]) { - /* - Here we are using internal javadoc tool, it accepts the name of the class as paramterer, - and calls the start() method of that class with parsed information. - */ - CommentParser parser = new CommentParser(); - com.sun.tools.javadoc.Main.execute("doxygen_translate_links runtime test", - "CommentParser", - new String[]{"-quiet", "doxygen_translate_links"}); + CommentParser.parse("doxygen_translate_links"); HashMap wantedComments = new HashMap(); @@ -64,6 +56,6 @@ public class doxygen_translate_links_runme { ""); // and ask the parser to check comments for us - System.exit(parser.check(wantedComments)); + System.exit(CommentParser.check(wantedComments)); } } \ No newline at end of file diff --git a/Examples/test-suite/java/doxygen_translate_runme.java b/Examples/test-suite/java/doxygen_translate_runme.java index 55e5d23d3..b049a6466 100644 --- a/Examples/test-suite/java/doxygen_translate_runme.java +++ b/Examples/test-suite/java/doxygen_translate_runme.java @@ -1,6 +1,5 @@ import doxygen_translate.*; -import com.sun.javadoc.*; import java.util.HashMap; import java.util.Map; @@ -16,14 +15,7 @@ public class doxygen_translate_runme { public static void main(String argv[]) { - /* - Here we are using internal javadoc tool, it accepts the name of the class as paramterer, - and calls the start() method of that class with parsed information. - */ - CommentParser parser = new CommentParser(); - com.sun.tools.javadoc.Main.execute("doxygen_translate runtime test", - "CommentParser", - new String[]{"-quiet", "doxygen_translate"}); + CommentParser.parse("doxygen_translate"); Map wantedComments = new HashMap(); @@ -274,6 +266,6 @@ public class doxygen_translate_runme { ""); // and ask the parser to check comments for us - System.exit(parser.check(wantedComments)); + System.exit(CommentParser.check(wantedComments)); } } diff --git a/Examples/test-suite/java/multiple_inheritance_abstract_runme.java b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java index 1489d92a7..4230e7b9a 100644 --- a/Examples/test-suite/java/multiple_inheritance_abstract_runme.java +++ b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java @@ -224,6 +224,7 @@ public class multiple_inheritance_abstract_runme { check(multiple_inheritance_abstract.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); check(multiple_inheritance_abstract.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); check(multiple_inheritance_abstract.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + // Return pointers check(multiple_inheritance_abstract.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); check(multiple_inheritance_abstract.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); @@ -242,6 +243,15 @@ public class multiple_inheritance_abstract_runme { check(multiple_inheritance_abstract.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); check(multiple_inheritance_abstract.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + // Return const pointer references + check(multiple_inheritance_abstract.MakeConstPtrRefDerived1_CBase1().cbase1y()!=3, "MakeConstPtrRefDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakeConstPtrRefDerived1_CBase2().cbase2()!=4, "MakeConstPtrRefDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakeConstPtrRefDerived2_CBase1().cbase1y()!=6, "MakeConstPtrRefDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakeConstPtrRefDerived2_ABase1().abase1()!=5, "MakeConstPtrRefDerived2_ABase1 failed"); + check(multiple_inheritance_abstract.MakeConstPtrRefDerived3_ABase1().abase1()!=9, "MakeConstPtrRefDerived3_ABase1 failed"); + check(multiple_inheritance_abstract.MakeConstPtrRefDerived3_CBase1().cbase1y()!=7, "MakeConstPtrRefDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakeConstPtrRefDerived3_CBase2().cbase2()!=8, "MakeConstPtrRefDerived3_CBase2 failed"); + // Return by value (sliced objects) check(multiple_inheritance_abstract.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); check(multiple_inheritance_abstract.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); diff --git a/Examples/test-suite/java/multiple_inheritance_nspace_runme.java b/Examples/test-suite/java/multiple_inheritance_nspace_runme.java index 461c7a131..ed2d3377a 100644 --- a/Examples/test-suite/java/multiple_inheritance_nspace_runme.java +++ b/Examples/test-suite/java/multiple_inheritance_nspace_runme.java @@ -244,6 +244,15 @@ public class multiple_inheritance_nspace_runme { check(multiple_inheritance_nspace.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); check(multiple_inheritance_nspace.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + // Return const pointer references + check(multiple_inheritance_nspace.MakeConstPtrRefDerived1_CBase1().cbase1y()!=3, "MakeConstPtrRefDerived1_CBase1 failed"); + check(multiple_inheritance_nspace.MakeConstPtrRefDerived1_CBase2().cbase2()!=4, "MakeConstPtrRefDerived1_CBase2 failed"); + check(multiple_inheritance_nspace.MakeConstPtrRefDerived2_CBase1().cbase1y()!=6, "MakeConstPtrRefDerived2_CBase1 failed"); + check(multiple_inheritance_nspace.MakeConstPtrRefDerived2_ABase1().abase1()!=5, "MakeConstPtrRefDerived2_ABase1 failed"); + check(multiple_inheritance_nspace.MakeConstPtrRefDerived3_ABase1().abase1()!=9, "MakeConstPtrRefDerived3_ABase1 failed"); + check(multiple_inheritance_nspace.MakeConstPtrRefDerived3_CBase1().cbase1y()!=7, "MakeConstPtrRefDerived3_CBase1 failed"); + check(multiple_inheritance_nspace.MakeConstPtrRefDerived3_CBase2().cbase2()!=8, "MakeConstPtrRefDerived3_CBase2 failed"); + // Return by value (sliced objects) check(multiple_inheritance_nspace.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); check(multiple_inheritance_nspace.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); diff --git a/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java b/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java index 6472a911e..910913027 100644 --- a/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java +++ b/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java @@ -309,6 +309,15 @@ public class multiple_inheritance_shared_ptr_runme { check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + // Return const pointer references + check(multiple_inheritance_shared_ptr.MakeConstPtrRefDerived1_CBase1().cbase1y()!=3, "MakeConstPtrRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeConstPtrRefDerived1_CBase2().cbase2()!=4, "MakeConstPtrRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeConstPtrRefDerived2_CBase1().cbase1y()!=6, "MakeConstPtrRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeConstPtrRefDerived2_ABase1().abase1()!=5, "MakeConstPtrRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeConstPtrRefDerived3_ABase1().abase1()!=9, "MakeConstPtrRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeConstPtrRefDerived3_CBase1().cbase1y()!=7, "MakeConstPtrRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeConstPtrRefDerived3_CBase2().cbase2()!=8, "MakeConstPtrRefDerived3_CBase2 failed"); + // Return by value (sliced objects) check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); diff --git a/Examples/test-suite/java/rname_runme.java b/Examples/test-suite/java/rname_runme.java index dac0a1ecf..4af6581c2 100644 --- a/Examples/test-suite/java/rname_runme.java +++ b/Examples/test-suite/java/rname_runme.java @@ -25,7 +25,7 @@ public class rname_runme { bar.foo_u((long)10); RenamedBase base = new RenamedBase(); - base.fn(base, base, base); + base.fn1(base, base, base); if (!base.newname(10.0).equals("Base")) throw new RuntimeException("base.newname"); diff --git a/Examples/test-suite/java/template_nested_flat_runme.java b/Examples/test-suite/java/template_nested_flat_runme.java new file mode 100644 index 000000000..023c18590 --- /dev/null +++ b/Examples/test-suite/java/template_nested_flat_runme.java @@ -0,0 +1,35 @@ + +import template_nested_flat.*; + +public class template_nested_flat_runme { + + static { + try { + System.loadLibrary("template_nested_flat"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + new T_NormalTemplateNormalClass().tmethod(new NormalClass()); + new OuterClass().T_OuterTMethodNormalClass(new NormalClass()); + + TemplateFuncs tf = new TemplateFuncs(); + if (tf.T_TemplateFuncs1Int(-10) != -10) + throw new RuntimeException("it failed"); + if (tf.T_TemplateFuncs2Double(-12.3) != -12.3) + throw new RuntimeException("it failed"); + + T_NestedOuterTemplateDouble tn = new T_NestedOuterTemplateDouble(); + if (tn.hohum(-12.3) != -12.3) + throw new RuntimeException("it failed"); + T_OuterClassInner1Int inner1 = new OuterClass().useInner1(new T_OuterClassInner1Int()); + T_OuterClassInner2NormalClass inner2 = new T_OuterClassInner2NormalClass(); + inner2.setEmbeddedVar(2); + T_OuterClassInner2NormalClass inner22 = new OuterClass().useInner2Again(inner2); + T_OuterClassInner1Double inner3 = new T_OuterClassInner1Double(); + } +} + diff --git a/Examples/test-suite/java/template_template_parameters_runme.java b/Examples/test-suite/java/template_template_parameters_runme.java index 42135b982..613f9087c 100644 --- a/Examples/test-suite/java/template_template_parameters_runme.java +++ b/Examples/test-suite/java/template_template_parameters_runme.java @@ -14,15 +14,33 @@ public class template_template_parameters_runme { } public static void main(String argv[]) { + // Test first part ListFastBool listBool = new ListFastBool(); listBool.setItem(true); + boolean x_boolean = listBool.getAllotype(); if (listBool.getItem() != true) throw new RuntimeException("Failed"); ListDefaultDouble listDouble = new ListDefaultDouble(); listDouble.setItem(10.2); + double x_double = listDouble.getAllotype(); if (listDouble.getItem() != 10.2) throw new RuntimeException("Failed"); + + // Test second part + FloatTestStruct floatTestStruct = new FloatTestStruct(); + FloatContainer2 floatContainer2 = floatTestStruct.getX(); + floatContainer2.setX(8.1f); + IntTestStruct intTestStruct = new IntTestStruct(); + IntContainer1 intContainer1 = intTestStruct.getX(); + intContainer1.setX(91); + if (intContainer1.getX() != 91) + throw new RuntimeException("Failed"); + if (intTestStruct.getX().getX() != 91) + throw new RuntimeException("Failed"); + IntTestStruct intTestStructReturned = template_template_parameters.TestStructContainer1Method(intTestStruct); + if (intTestStructReturned.getX().getX() != 101) + throw new RuntimeException("Failed"); } } diff --git a/Examples/test-suite/javascript/Makefile.in b/Examples/test-suite/javascript/Makefile.in index 8127415f1..0e11f3d9d 100644 --- a/Examples/test-suite/javascript/Makefile.in +++ b/Examples/test-suite/javascript/Makefile.in @@ -13,6 +13,9 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ +CPP_TEST_CASES += \ + javascript_lib_arrays \ + SWIGEXE = $(top_builddir)/swig SWIG_LIB_DIR = $(top_srcdir)/Lib @@ -51,7 +54,10 @@ ifeq (node,$(JSENGINE)) # dunno... ignoring generously apply_signed_char.cpptest: GYP_CFLAGS = \"-Wno-ignored-qualifiers\" constant_pointers.cpptest: GYP_CFLAGS = \"-Wno-ignored-qualifiers\" + cpp11_ref_qualifiers.cpptest: GYP_CFLAGS = \"-Wno-ignored-qualifiers\" + director_basic.cpptest: GYP_CFLAGS = \"-Wno-ignored-qualifiers\" enum_thorough.cpptest: GYP_CFLAGS = \"-Wno-ignored-qualifiers\" + member_funcptr_galore.cpptest: GYP_CFLAGS = \"-Wno-ignored-qualifiers\" setup_node = \ test -d $* || mkdir $* && \ @@ -133,4 +139,5 @@ clean: rm -f mod_a$${ext} mod_b$${ext}; \ rm -f multi_import_a$${ext} multi_import_b$${ext}; \ rm -f packageoption_a$${ext} packageoption_b$${ext} packageoption_c$${ext}; \ + rm -f template_typedef_cplx2$${ext}; \ done diff --git a/Examples/test-suite/javascript/class_scope_weird_runme.js b/Examples/test-suite/javascript/class_scope_weird_runme.js index 73c118d61..ca18c1b4d 100644 --- a/Examples/test-suite/javascript/class_scope_weird_runme.js +++ b/Examples/test-suite/javascript/class_scope_weird_runme.js @@ -4,3 +4,14 @@ f = new class_scope_weird.Foo(); g = new class_scope_weird.Foo(3); if (f.bar(3) != 3) throw RuntimeError; + +// Test missing new keyword during constructor call +var caughtException = false; +try { + g = class_scope_weird.Foo(4); +} catch (err) { + caughtException = true; +} +if (!caughtException) { + throw new Error("Instantiation exception not thrown"); +} diff --git a/Examples/test-suite/javascript/inherit_missing_runme.js b/Examples/test-suite/javascript/inherit_missing_runme.js new file mode 100644 index 000000000..05f5760e2 --- /dev/null +++ b/Examples/test-suite/javascript/inherit_missing_runme.js @@ -0,0 +1,19 @@ +var inherit_missing = require("inherit_missing"); + +a = inherit_missing.new_Foo() +b = new inherit_missing.Bar() +c = new inherit_missing.Spam() + +x = inherit_missing.do_blah(a) +if (x != "Foo::blah") + throw new Error("Whoa! Bad return {}".format(x)) + +x = inherit_missing.do_blah(b) +if (x != "Bar::blah") + throw new Error("Whoa! Bad return {}".format(x)) + +x = inherit_missing.do_blah(c) +if (x != "Spam::blah") + throw new Error("Whoa! Bad return {}".format(x)) + +inherit_missing.delete_Foo(a) diff --git a/Examples/test-suite/javascript/integers_runme.js b/Examples/test-suite/javascript/integers_runme.js new file mode 100644 index 000000000..0356176ad --- /dev/null +++ b/Examples/test-suite/javascript/integers_runme.js @@ -0,0 +1,18 @@ +var integers = require("integers"); + +var val = 3902408827 +ret = integers.signed_long_identity(val) +if (ret != val) + throw "Incorrect value: " + ret + +ret = integers.unsigned_long_identity(val) +if (ret != val) + throw "Incorrect value: " + ret + +ret = integers.signed_long_long_identity(val) +if (ret != val) + throw "Incorrect value: " + ret + +ret = integers.unsigned_long_long_identity(val) +if (ret != val) + throw "Incorrect value: " + ret diff --git a/Examples/test-suite/javascript/javascript_lib_arrays_runme.js b/Examples/test-suite/javascript/javascript_lib_arrays_runme.js new file mode 100644 index 000000000..1eb586134 --- /dev/null +++ b/Examples/test-suite/javascript/javascript_lib_arrays_runme.js @@ -0,0 +1,20 @@ +var javascript_lib_arrays = require("javascript_lib_arrays"); + +var arr = [1, 2, 3, 4, 5]; + +function check(a, b) { + if (a !== b) { + throw new Error("Not equal: " + a + " " + b) + } +} + +function check_array(a, b) { + if (a.length != b.length) + throw new Error("Array length mismatch " + a.length + " " + b.length) + if (!a.every(function(element, index) { return element === b[index]; })) + throw new Error("Arrays don't match a:" + a + " b:" + b) +} + +check(15, javascript_lib_arrays.sum1(arr, arr.length)); +check(6, javascript_lib_arrays.sum2(arr)); +check_array([1, 2, 3, 4], javascript_lib_arrays.data3) diff --git a/Examples/test-suite/javascript/li_typemaps_runme.js b/Examples/test-suite/javascript/li_typemaps_runme.js new file mode 100644 index 000000000..c0b1b43b0 --- /dev/null +++ b/Examples/test-suite/javascript/li_typemaps_runme.js @@ -0,0 +1,50 @@ +var li_typemaps = require("li_typemaps"); + +function check(a, b) { + if (a !== b) { + throw new Error("Not equal: " + a + " " + b) + } +} + +function check_array(a, b) { + if (a.length != b.length) + throw new Error("Array length mismatch " + a.length + " " + b.length) + if (!a.every(function(element, index) { return element === b[index]; })) + throw new Error("Arrays don't match a:" + a + " b:" + b) +} + +// Check double INPUT typemaps +check(li_typemaps.in_double(22.22), 22.22) +check(li_typemaps.inr_double(22.22), 22.22) + +// Check double OUTPUT typemaps +check_array(li_typemaps.out_double(22.22), [22.22]) +check_array(li_typemaps.outr_double(22.22), [22.22]) + +// Check double INOUT typemaps +check_array(li_typemaps.inout_double(22.22), [22.22]) +check_array(li_typemaps.inoutr_double(22.22), [22.22]) + +// check long long +check(li_typemaps.in_ulonglong(20), 20) +check(li_typemaps.inr_ulonglong(20), 20) +check_array(li_typemaps.out_ulonglong(20), [20]) +check_array(li_typemaps.outr_ulonglong(20), [20]) +check_array(li_typemaps.inout_ulonglong(20), [20]) +check_array(li_typemaps.inoutr_ulonglong(20), [20]) + +// check bools +check(li_typemaps.in_bool(true), true) +check(li_typemaps.inr_bool(false), false) +check_array(li_typemaps.out_bool(true), [true]) +check_array(li_typemaps.outr_bool(false), [false]) +check_array(li_typemaps.inout_bool(true), [true]) +check_array(li_typemaps.inoutr_bool(false), [false]) + +// the others +check_array(li_typemaps.inoutr_int2(1,2), [1, 2]) + +fi = li_typemaps.out_foo(10) +check(fi[0].a, 10) +check(fi[1], 20) +check(fi[2], 30) diff --git a/Examples/test-suite/javascript/native_directive_runme.js b/Examples/test-suite/javascript/native_directive_runme.js new file mode 100644 index 000000000..5c1d69cf1 --- /dev/null +++ b/Examples/test-suite/javascript/native_directive_runme.js @@ -0,0 +1,9 @@ +var native_directive = require("native_directive"); + +(function main() { + var s = "abc.DEF-123"; + if (native_directive.CountAlphas(s) !== 6) + throw "CountAlphas failed"; + if (native_directive.CountAlphaCharacters(s) !== 6) + throw "CountAlphaCharacters failed"; +})(); diff --git a/Examples/test-suite/javascript/types_directive_runme.js b/Examples/test-suite/javascript/types_directive_runme.js new file mode 100644 index 000000000..f4f0a2b7a --- /dev/null +++ b/Examples/test-suite/javascript/types_directive_runme.js @@ -0,0 +1,14 @@ +var types_directive = require("types_directive"); + +d1 = new types_directive.Time1(2001, 2, 3, 60) +// check that a Time1 instance is accepted where Date is expected +newDate = types_directive.add(d1, 7) +if (newDate.day != 10) + throw new Error("newDate mismatch") + +d2 = new types_directive.Time2(1999, 8, 7, 60) +// check that a Time2 instance is accepted where Date is expected +newDate = types_directive.add(d2, 7) +if (newDate.day != 14) + throw new Error("newDate mismatch") + diff --git a/Examples/test-suite/javascript/virtual_derivation_runme.js b/Examples/test-suite/javascript/virtual_derivation_runme.js new file mode 100644 index 000000000..be87a5d9a --- /dev/null +++ b/Examples/test-suite/javascript/virtual_derivation_runme.js @@ -0,0 +1,8 @@ +var virtual_derivation = require("virtual_derivation"); +// +// very innocent example +// +b = new virtual_derivation.B(3) +if (b.get_a() != b.get_b()) + throw new Error("something is really wrong") + diff --git a/Examples/test-suite/javascript_lib_arrays.i b/Examples/test-suite/javascript_lib_arrays.i new file mode 100644 index 000000000..512084ad5 --- /dev/null +++ b/Examples/test-suite/javascript_lib_arrays.i @@ -0,0 +1,30 @@ +%module javascript_lib_arrays + +%include + +%apply int[] { int *data1 } +%apply int[3] { int data2[3] } +%apply int[4] { int data3[4] } + +%inline %{ + +int sum1(int *data1, int size) { + int sum = 0; + for (int i = 0; i < size; i++) { + sum += data1[i]; + } + return sum; +} + +int sum2(int data2[3]) { + int sum = 0; + for (int i = 0; i < 3; i++) { + sum += data2[i]; + } + return sum; +} + +int data3[4] = {1, 2, 3, 4}; + +%} + diff --git a/Examples/test-suite/keyword_rename.i b/Examples/test-suite/keyword_rename.i index 23c01087d..645f02661 100644 --- a/Examples/test-suite/keyword_rename.i +++ b/Examples/test-suite/keyword_rename.i @@ -27,7 +27,7 @@ KW(synchronized, final) /* C# Keywords */ KW(string, out) -struct sealed {int i;}; +struct stackalloc {int i;}; /* Go Keywords */ KW(go, defer) diff --git a/Examples/test-suite/kwargs_feature.i b/Examples/test-suite/kwargs_feature.i index a8d1c38d8..dd5b2638d 100644 --- a/Examples/test-suite/kwargs_feature.i +++ b/Examples/test-suite/kwargs_feature.i @@ -100,3 +100,47 @@ int foo_mm(int min = 1, int max = 2) {return min + max; } %} + + +// Extended constructors +%extend Extending0 { + Extending0() { return new Extending0(); } +} +%extend Extending1 { + Extending1(int one) { return new Extending1(); } +} +%extend Extending2 { + Extending2(int one, const char *two) { return new Extending2(); } +} +%extend ExtendingOptArgs1 { + ExtendingOptArgs1(int one = 0) { return new ExtendingOptArgs1(); } +} +%extend ExtendingOptArgs2 { + ExtendingOptArgs2(int one = 0, const char* two = NULL) { return new ExtendingOptArgs2(); } +} + +%inline %{ +struct Extending0 {}; +struct Extending1 {}; +struct Extending2 {}; +struct ExtendingOptArgs1 {}; +struct ExtendingOptArgs2 {}; +%} + +// Varargs +%warnfilter(SWIGWARN_LANG_VARARGS_KEYWORD) VarargConstructor::VarargConstructor; // Can't wrap varargs with keyword arguments enabled +%warnfilter(SWIGWARN_LANG_VARARGS_KEYWORD) VarargConstructor::vararg_method; // Can't wrap varargs with keyword arguments enabled +%inline %{ +struct VarargConstructor { + char *str; + VarargConstructor(const char *fmt, ...) { + str = new char[strlen(fmt) + 1]; + strcpy(str, fmt); + } + void vararg_method(const char *fmt, ...) { + delete [] str; + str = new char[strlen(fmt) + 1]; + strcpy(str, fmt); + } +}; +%} diff --git a/Examples/test-suite/li_attribute.i b/Examples/test-suite/li_attribute.i index 4f9497afb..95389b2b6 100644 --- a/Examples/test-suite/li_attribute.i +++ b/Examples/test-suite/li_attribute.i @@ -95,6 +95,7 @@ struct MyFoo; // %attribute2 does not work with templates // class/struct attribute with get/set methods using return/pass by reference %attribute2(MyClass, MyFoo, Foo, GetFoo, SetFoo); +%attribute2ref(MyClass, MyFoo, Foo2); %inline %{ struct MyFoo { MyFoo() : x(-1) {} @@ -102,9 +103,11 @@ struct MyFoo; // %attribute2 does not work with templates }; class MyClass { MyFoo foo; + MyFoo foo2; public: MyFoo& GetFoo() { return foo; } void SetFoo(const MyFoo& other) { foo = other; } + MyFoo& Foo2() { return foo2; } }; %} diff --git a/Examples/test-suite/li_math.i b/Examples/test-suite/li_math.i index 3aa3db303..db39cd3de 100644 --- a/Examples/test-suite/li_math.i +++ b/Examples/test-suite/li_math.i @@ -1,7 +1,2 @@ %module li_math -#ifdef SWIGPHP -// PHP already provides these functions with the same names, so just kill that -// warning. -%warnfilter(SWIGWARN_PARSE_KEYWORD); -#endif %include math.i diff --git a/Examples/test-suite/li_std_auto_ptr.i b/Examples/test-suite/li_std_auto_ptr.i index 5bde387a3..d83732af0 100644 --- a/Examples/test-suite/li_std_auto_ptr.i +++ b/Examples/test-suite/li_std_auto_ptr.i @@ -12,7 +12,7 @@ #endif %} -#if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGPYTHON) +#if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGPYTHON) || defined(SWIGRUBY) %include "std_auto_ptr.i" diff --git a/Examples/test-suite/li_std_containers_overload.i b/Examples/test-suite/li_std_containers_overload.i new file mode 100644 index 000000000..5e7c28e37 --- /dev/null +++ b/Examples/test-suite/li_std_containers_overload.i @@ -0,0 +1,33 @@ +%module li_std_containers_overload + +// Suppress warning that ought not to appear, but there is no easy fix +%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) VectorOverload; + +%include +%include + +%inline %{ +struct X {}; +struct Y {}; +%} + +%template(VectorX) std::vector; +%template(VectorY) std::vector; +%template(VectorString) std::vector; +%template(VectorInt) std::vector; + +%inline %{ +using namespace std; +string VectorOverload(vector v) { + return "vector"; +} +string VectorOverload(vector v) { + return "vector"; +} +string VectorOverload(vector v) { + return "vector"; +} +string VectorOverload(vector v) { + return "vector"; +} +%} diff --git a/Examples/test-suite/li_std_wstring.i b/Examples/test-suite/li_std_wstring.i index 55d45383e..a790ca7e0 100644 --- a/Examples/test-suite/li_std_wstring.i +++ b/Examples/test-suite/li_std_wstring.i @@ -70,6 +70,11 @@ size_t size_wstring(const std::wstring& s) { return s.size(); } +struct wchar_test_struct { + wchar_t wchar_t_member; + wchar_t* wchar_t_ptr_member; +}; + %} #endif diff --git a/Examples/test-suite/li_typemaps.i b/Examples/test-suite/li_typemaps.i index a53c1c74a..d508c1c84 100644 --- a/Examples/test-suite/li_typemaps.i +++ b/Examples/test-suite/li_typemaps.i @@ -2,6 +2,7 @@ %include "typemaps.i" +%apply int *OUTPUT { int *OUTPUT2 }; %apply int &INOUT { int &INOUT2 }; %newobject out_foo; %inline %{ @@ -51,10 +52,13 @@ void out_longlong(long long x, long long *OUTPUT) { *OUTPUT = x; } void out_ulonglong(unsigned long long x, unsigned long long *OUTPUT) { *OUTPUT = x; } /* Tests a returning a wrapped pointer and an output argument */ -struct Foo *out_foo(int a, int *OUTPUT) { +struct Foo *out_foo(int a, int *OUTPUT, int *OUTPUT2) { struct Foo *f = new struct Foo(); f->a = a; *OUTPUT = a * 2; + struct Foo *f2 = new struct Foo(); + f2->a = a; + *OUTPUT2 = a * 3; return f; } diff --git a/Examples/test-suite/lua/Makefile.in b/Examples/test-suite/lua/Makefile.in index 63b8692b1..92559bb8f 100644 --- a/Examples/test-suite/lua/Makefile.in +++ b/Examples/test-suite/lua/Makefile.in @@ -15,6 +15,7 @@ top_builddir = @top_builddir@ CPP_TEST_CASES += \ lua_no_module_global \ lua_inherit_getitem \ + lua_lightuserdata \ C_TEST_CASES += \ diff --git a/Examples/test-suite/lua/li_typemaps_runme.lua b/Examples/test-suite/lua/li_typemaps_runme.lua index 7456d8245..342634a5b 100644 --- a/Examples/test-suite/lua/li_typemaps_runme.lua +++ b/Examples/test-suite/lua/li_typemaps_runme.lua @@ -38,5 +38,5 @@ assert(li_typemaps.inoutr_bool(false)==false) a,b=li_typemaps.inoutr_int2(1,2) assert(a==1 and b==2) -f,i=li_typemaps.out_foo(10) -assert(f.a==10 and i==20) +f,i,i2=li_typemaps.out_foo(10) +assert(f.a==10 and i==20 and i2==30) diff --git a/Examples/test-suite/lua/lua_lightuserdata_runme.lua b/Examples/test-suite/lua/lua_lightuserdata_runme.lua new file mode 100644 index 000000000..c1c3c1d73 --- /dev/null +++ b/Examples/test-suite/lua/lua_lightuserdata_runme.lua @@ -0,0 +1,7 @@ +require("import") -- the import fn +import("lua_lightuserdata") -- import lib + +local t = lua_lightuserdata +local d = t.get_lightuserdata() +local r = t.check_lighuserdata(d) +assert(r) diff --git a/Examples/test-suite/lua_lightuserdata.i b/Examples/test-suite/lua_lightuserdata.i new file mode 100644 index 000000000..9069b6ab4 --- /dev/null +++ b/Examples/test-suite/lua_lightuserdata.i @@ -0,0 +1,17 @@ +%module lua_lightuserdata + +%native(get_lightuserdata) int get_lightuserdata(lua_State* L); +%{ +static int foo; +int get_lightuserdata(lua_State* L) +{ + lua_pushlightuserdata(L, &foo); + return 1; +} +%} + +%inline %{ +bool check_lighuserdata(const void* d) { + return d == &foo; +} +%} diff --git a/Examples/test-suite/memberin_extend_c.i b/Examples/test-suite/memberin_extend_c.i index 0599e65a0..c7e017305 100644 --- a/Examples/test-suite/memberin_extend_c.i +++ b/Examples/test-suite/memberin_extend_c.i @@ -32,7 +32,8 @@ char *Person_name_get(Person *p) { } void Person_name_set(Person *p, char *val) { - strncpy(p->name,val,50); + p->name[0] = '\0'; + strncat(p->name, val, sizeof(p->name) - 1); make_upper(p->name); } %} diff --git a/Examples/test-suite/multiple_inheritance_abstract.i b/Examples/test-suite/multiple_inheritance_abstract.i index b54a37dea..9ac16a235 100644 --- a/Examples/test-suite/multiple_inheritance_abstract.i +++ b/Examples/test-suite/multiple_inheritance_abstract.i @@ -1,9 +1,8 @@ // This is a copy of the multiple_inheritance_abstract test -%module multiple_inheritance_abstract +%module(ruby_minherit="1") multiple_inheritance_abstract -%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, - SWIGWARN_D_MULTIPLE_INHERITANCE, - SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ +%warnfilter(SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance */ #if defined(SWIGJAVA) || defined(SWIGCSHARP) %include "swiginterface.i" @@ -23,7 +22,7 @@ namespace Space { struct CBase1 { virtual void cbase1x() { return; - } + } virtual int cbase1y() { return 1; } @@ -307,6 +306,36 @@ namespace Space { return d; } + // Return const pointer references + CBase1 *const&MakeConstPtrRefDerived1_CBase1() { + static CBase1 *d = new Derived1(); + return d; + } + CBase2 *const&MakeConstPtrRefDerived1_CBase2() { + static CBase2 *const& d = new Derived1(); + return d; + } + CBase1 *const&MakeConstPtrRefDerived2_CBase1() { + static CBase1 *const& d = new Derived2(); + return d; + } + ABase1 *const&MakeConstPtrRefDerived2_ABase1() { + static ABase1 *const& d = new Derived2(); + return d; + } + ABase1 *const&MakeConstPtrRefDerived3_ABase1() { + static ABase1 *const& d = new Derived3(); + return d; + } + CBase1 *const&MakeConstPtrRefDerived3_CBase1() { + static CBase1 *const& d = new Derived3(); + return d; + } + CBase2 *const&MakeConstPtrRefDerived3_CBase2() { + static CBase2 *const& d = new Derived3(); + return d; + } + // Return by value (sliced objects) CBase1 MakeValDerived1_CBase1() { return Derived1(); diff --git a/Examples/test-suite/multiple_inheritance_interfaces.i b/Examples/test-suite/multiple_inheritance_interfaces.i index 2972922fb..6bb1d50cb 100644 --- a/Examples/test-suite/multiple_inheritance_interfaces.i +++ b/Examples/test-suite/multiple_inheritance_interfaces.i @@ -1,8 +1,7 @@ -%module multiple_inheritance_interfaces +%module(ruby_minherit="1") multiple_inheritance_interfaces -%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, - SWIGWARN_D_MULTIPLE_INHERITANCE, - SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ +%warnfilter(SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance */ #if defined(SWIGJAVA) || defined(SWIGCSHARP) %include "swiginterface.i" @@ -64,3 +63,32 @@ struct DerivedOverloaded : public BaseOverloaded { virtual void identical_overload(int i, const PTypedef &p = PTypedef()) {} }; %} + + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%interface(Space::X) +#endif + +// Test the csinterfacemodifiers and javainterfacemodifiers typemaps. +#if defined(SWIGCSHARP) +/* change access from default "public class" to "internal class" */ +%typemap(csclassmodifiers) InternalAccess "internal class" +/* The following modifiers are also needed with the above access modifier change */ +%typemap(csclassmodifiers) Space::X "internal class" +%typemap(csinterfacemodifiers) Space::X "internal interface" +#elif defined(SWIGJAVA) +%typemap(javaclassmodifiers) InternalAccess "final /*notpublic*/ class" +%typemap(javaclassmodifiers) Space::X "final class" +%typemap(javainterfacemodifiers) Space::X "/*notpublic*/ interface" +#endif + +%inline %{ +struct InternalAccess {}; +namespace Space { + class X { + public: + virtual void x(const InternalAccess& date) const = 0; + virtual ~X() {} + }; +} +%} diff --git a/Examples/test-suite/multiple_inheritance_nspace.i b/Examples/test-suite/multiple_inheritance_nspace.i index 4faef5749..002e6d6ee 100644 --- a/Examples/test-suite/multiple_inheritance_nspace.i +++ b/Examples/test-suite/multiple_inheritance_nspace.i @@ -1,9 +1,8 @@ // This is a copy of the multiple_inheritance_abstract test -%module multiple_inheritance_nspace +%module(ruby_minherit="1") multiple_inheritance_nspace -%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, - SWIGWARN_D_MULTIPLE_INHERITANCE, - SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ +%warnfilter(SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance */ // nspace feature only supported by these languages #if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGD) || defined(SWIGLUA) || defined(SWIGJAVASCRIPT) @@ -32,7 +31,7 @@ namespace Space { struct CBase1 { virtual void cbase1x() { return; - } + } virtual int cbase1y() { return 1; } @@ -316,6 +315,36 @@ namespace Space { return d; } + // Return const pointer references + CBase1 *const&MakeConstPtrRefDerived1_CBase1() { + static CBase1 *d = new Derived1(); + return d; + } + CBase2 *const&MakeConstPtrRefDerived1_CBase2() { + static CBase2 *const& d = new Derived1(); + return d; + } + CBase1 *const&MakeConstPtrRefDerived2_CBase1() { + static CBase1 *const& d = new Derived2(); + return d; + } + ABase1 *const&MakeConstPtrRefDerived2_ABase1() { + static ABase1 *const& d = new Derived2(); + return d; + } + ABase1 *const&MakeConstPtrRefDerived3_ABase1() { + static ABase1 *const& d = new Derived3(); + return d; + } + CBase1 *const&MakeConstPtrRefDerived3_CBase1() { + static CBase1 *const& d = new Derived3(); + return d; + } + CBase2 *const&MakeConstPtrRefDerived3_CBase2() { + static CBase2 *const& d = new Derived3(); + return d; + } + // Return by value (sliced objects) CBase1 MakeValDerived1_CBase1() { return Derived1(); diff --git a/Examples/test-suite/multiple_inheritance_shared_ptr.i b/Examples/test-suite/multiple_inheritance_shared_ptr.i index 3c061e1a9..061db57d9 100644 --- a/Examples/test-suite/multiple_inheritance_shared_ptr.i +++ b/Examples/test-suite/multiple_inheritance_shared_ptr.i @@ -1,9 +1,8 @@ // This is a copy of the multiple_inheritance_abstract test and extended for testing %shared_ptr and %interface_impl -%module multiple_inheritance_shared_ptr +%module(ruby_minherit="1") multiple_inheritance_shared_ptr -%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, - SWIGWARN_D_MULTIPLE_INHERITANCE, - SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ +%warnfilter(SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance */ // Typemap changes required to mix %shared_ptr and %interface_impl // Note we don't have a way to use $javainterfacename/$csinterfacename (yet), @@ -425,6 +424,36 @@ namespace Space { return d; } + // Return const pointer references + CBase1 *const&MakeConstPtrRefDerived1_CBase1() { + static CBase1 *d = new Derived1(); + return d; + } + CBase2 *const&MakeConstPtrRefDerived1_CBase2() { + static CBase2 *const& d = new Derived1(); + return d; + } + CBase1 *const&MakeConstPtrRefDerived2_CBase1() { + static CBase1 *const& d = new Derived2(); + return d; + } + ABase1 *const&MakeConstPtrRefDerived2_ABase1() { + static ABase1 *const& d = new Derived2(); + return d; + } + ABase1 *const&MakeConstPtrRefDerived3_ABase1() { + static ABase1 *const& d = new Derived3(); + return d; + } + CBase1 *const&MakeConstPtrRefDerived3_CBase1() { + static CBase1 *const& d = new Derived3(); + return d; + } + CBase2 *const&MakeConstPtrRefDerived3_CBase2() { + static CBase2 *const& d = new Derived3(); + return d; + } + // Return by value (sliced objects) CBase1 MakeValDerived1_CBase1() { return Derived1(); diff --git a/Examples/test-suite/native_directive.i b/Examples/test-suite/native_directive.i index d08c9a954..3d4858032 100644 --- a/Examples/test-suite/native_directive.i +++ b/Examples/test-suite/native_directive.i @@ -41,3 +41,62 @@ extern "C" JNIEXPORT jint JNICALL Java_native_1directive_native_1directiveJNI_Co %} #endif + +// TODO: C# +// TODO: Python + + +#ifdef SWIGJAVASCRIPT +%native(CountAlphaCharacters) void JavaScript_alpha_count(); +%{ +#ifdef SWIG_V8_VERSION /* engine = node || v8 */ + +static SwigV8ReturnValue JavaScript_alpha_count(const SwigV8Arguments &args) { + SWIGV8_HANDLESCOPE(); + SWIGV8_VALUE jsresult; + char *arg1 = (char *)0; + int res1; + char *buf1 = 0; + int alloc1 = 0; + int result; + if(args.Length() != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for _wrap_alpha_count."); + res1 = SWIG_AsCharPtrAndSize(args[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "alpha_count" "', argument " "1"" of type '" "char const *""'"); + arg1 = reinterpret_cast< char * >(buf1); + result = (int)alpha_count((char const *)arg1); + jsresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIGV8_RETURN(jsresult); +fail: + SWIGV8_RETURN(SWIGV8_UNDEFINED()); +} + +#else /* engine = jsc */ + +static JSValueRef JavaScript_alpha_count(JSContextRef context, JSObjectRef function, + JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) +{ + char *arg1 = (char *)0; + int res1; + char *buf1 = 0; + int alloc1 = 0; + int result; + JSValueRef jsresult; + if (argc != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments."); + res1 = SWIG_JSC_AsCharPtrAndSize(context, argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "alpha_count" "', argument " "1"" of type '" "char const *""'"); + arg1 = reinterpret_cast< char * >(buf1); + result = (int)alpha_count((char const *)arg1); + jsresult = SWIG_From_int SWIG_JSC_FROM_CALL_ARGS(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return jsresult; +fail: + return JSValueMakeUndefined(context); +} + +#endif /* engine */ +%} +#endif /* SWIGJAVASCRIPT */ + diff --git a/Examples/test-suite/nested_scope.i b/Examples/test-suite/nested_scope.i index bd66eec73..dabea310e 100644 --- a/Examples/test-suite/nested_scope.i +++ b/Examples/test-suite/nested_scope.i @@ -1,9 +1,5 @@ %module nested_scope -#if !defined(SWIGCSHARP) && !defined(SWIGJAVA) -%feature ("flatnested"); -#endif - %inline %{ namespace ns { // "global" is a case-insensitive keyword in PHP. @@ -31,9 +27,9 @@ namespace ns { public: struct Nested2; #ifdef __clang__ - struct Nested2 { - int data; - }; + struct Nested2 { + int data; + }; #endif template class AbstractClass; class Real; diff --git a/Examples/test-suite/nested_scope_flat.i b/Examples/test-suite/nested_scope_flat.i new file mode 100644 index 000000000..6aab72349 --- /dev/null +++ b/Examples/test-suite/nested_scope_flat.i @@ -0,0 +1,5 @@ +%module nested_scope_flat + +%feature ("flatnested"); + +%include "nested_scope.i" diff --git a/Examples/test-suite/not_c_keywords.i b/Examples/test-suite/not_c_keywords.i new file mode 100644 index 000000000..013575bc6 --- /dev/null +++ b/Examples/test-suite/not_c_keywords.i @@ -0,0 +1,13 @@ +%module not_c_keywords + +%extend ComplexStruct { +void init() { + $self->complex = 123; +} +} + +%inline %{ +struct ComplexStruct { + int complex; /* complex as variable name */ +}; +%} diff --git a/Examples/test-suite/ocaml/Makefile.in b/Examples/test-suite/ocaml/Makefile.in index 775b1ea71..c44f02a72 100644 --- a/Examples/test-suite/ocaml/Makefile.in +++ b/Examples/test-suite/ocaml/Makefile.in @@ -20,6 +20,7 @@ apply_strings \ cpp_enum \ default_constructor \ director_binary_string \ +director_comparison_operators \ director_enum \ director_primitives \ director_redefined \ @@ -101,6 +102,10 @@ $(MULTI_CPP_TEST_CASES:=.multicpptest): extra_objects clean: $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' ocaml_clean - rm -f clientdata_prop_a.ml clientdata_prop_b.ml import_stl_a.ml import_stl_b.ml - rm -f imports_a.ml imports_b.ml mod_a.ml mod_b.ml multi_import_a.ml - rm -f multi_import_b.ml packageoption_a.ml packageoption_b.ml packageoption_c.ml + rm -f clientdata_prop_a.ml clientdata_prop_b.ml + rm -f import_stl_a.ml import_stl_b.ml + rm -f imports_a.ml imports_b.ml + rm -f mod_a.ml mod_b.ml + rm -f multi_import_a.ml multi_import_b.ml + rm -f packageoption_a.ml packageoption_b.ml packageoption_c.ml + rm -f template_typedef_cplx2.ml diff --git a/Examples/test-suite/octave/Makefile.in b/Examples/test-suite/octave/Makefile.in index 3c8f3b165..9602d85f5 100644 --- a/Examples/test-suite/octave/Makefile.in +++ b/Examples/test-suite/octave/Makefile.in @@ -5,6 +5,7 @@ LANGUAGE = octave OCTAVE = @OCTAVE@ SCRIPTSUFFIX = _runme.m +PCHSUPPORT = @PCHSUPPORT@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -28,14 +29,6 @@ CPP_TEST_BROKEN += \ li_std_set \ li_std_stream -#C_TEST_CASES += - -# -# This test only works with modern C compilers -# -#C_TEST_CASES += \ -# complextest - include $(srcdir)/../common.mk # Overridden variables here @@ -61,6 +54,23 @@ CSRCS = octave_empty.c +$(swig_and_compile_multi_cpp) $(run_testcase) +# Pre-compile Octave headers, if supported + +ifeq (yes,$(PCHSUPPORT)) + +export OCTHEADERSSRC = @top_srcdir@/Lib/octave/octheaders.hpp +export OCTHEADERS = @top_builddir@/Examples/test-suite/octave/octheaders.hpp +export OCTHEADERSGCH = $(OCTHEADERS).gch +export SWIGOCTHDROPT = -DSWIG_OCTAVE_EXTERNAL_OCTHEADERS +export IOCTHEADERS = -I@top_builddir@/Examples/test-suite/octave @PCHINCLUDEARG@ $(OCTHEADERS)@PCHINCLUDEEXT@ + +$(OCTHEADERSGCH): $(OCTHEADERSSRC) + $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile octave_precompile_headers + +$(NOT_BROKEN_TEST_CASES) $(BROKEN_TEST_CASES): $(OCTHEADERSGCH) + +endif + # Runs the testcase. A testcase is only run if # a file is found which has _runme.m appended after the testcase name. run_testcase = \ diff --git a/Examples/test-suite/octave/abstract_access_runme.m b/Examples/test-suite/octave/abstract_access_runme.m index e49343a92..e47223c47 100644 --- a/Examples/test-suite/octave/abstract_access_runme.m +++ b/Examples/test-suite/octave/abstract_access_runme.m @@ -2,6 +2,6 @@ abstract_access d = abstract_access.D(); if (d.do_x() != 1) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/abstract_typedef_runme.m b/Examples/test-suite/octave/abstract_typedef_runme.m index e57f71504..6f90b8159 100644 --- a/Examples/test-suite/octave/abstract_typedef_runme.m +++ b/Examples/test-suite/octave/abstract_typedef_runme.m @@ -10,7 +10,7 @@ a = A(); if (a.write(e) != 1) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/callback_runme.m b/Examples/test-suite/octave/callback_runme.m index db9f7888d..95df598f1 100644 --- a/Examples/test-suite/octave/callback_runme.m +++ b/Examples/test-suite/octave/callback_runme.m @@ -2,39 +2,39 @@ _callback callback if (foo(2) != 2) - error + error("failed"); endif if (A_bar(2) != 4) - error + error("failed"); endif if (foobar(3, _callback.foo) != foo(3)) - error + error("failed"); endif if (foobar(3, foo) != foo(3)) - error + error("failed"); endif if (foobar(3, A_bar) != A_bar(3)) - error + error("failed"); endif if (foobar(3, foof) != foof(3)) - error + error("failed"); endif if (foobar_i(3, foo_i) != foo_i(3)) - error + error("failed"); endif if (foobar_d(3.5, foo_d) != foo_d(3.5)) - error + error("failed"); endif a = A(); if (foobarm(3, a, A.foom_cb_ptr) != a.foom(3)) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/class_ignore_runme.m b/Examples/test-suite/octave/class_ignore_runme.m index 3e52047c2..53cad9570 100644 --- a/Examples/test-suite/octave/class_ignore_runme.m +++ b/Examples/test-suite/octave/class_ignore_runme.m @@ -8,5 +8,5 @@ class_ignore a = class_ignore.Bar(); if (!strcmp(class_ignore.do_blah(a),"Bar::blah")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/class_scope_weird_runme.m b/Examples/test-suite/octave/class_scope_weird_runme.m index 2fc857808..b0e975359 100644 --- a/Examples/test-suite/octave/class_scope_weird_runme.m +++ b/Examples/test-suite/octave/class_scope_weird_runme.m @@ -3,5 +3,5 @@ class_scope_weird f = class_scope_weird.Foo(); g = class_scope_weird.Foo(3); if (f.bar(3) != 3) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/compactdefaultargs_runme.m b/Examples/test-suite/octave/compactdefaultargs_runme.m index 08e872724..ada60dcbe 100644 --- a/Examples/test-suite/octave/compactdefaultargs_runme.m +++ b/Examples/test-suite/octave/compactdefaultargs_runme.m @@ -4,21 +4,21 @@ defaults1 = Defaults1(1000); defaults1 = Defaults1(); if (defaults1.ret(10.0) != 10.0) - error + error("failed"); endif if (defaults1.ret() != -1.0) - error + error("failed"); endif defaults2 = Defaults2(1000); defaults2 = Defaults2(); if (defaults2.ret(10.0) != 10.0) - error + error("failed"); endif if (defaults2.ret() != -1.0) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/constructor_copy_runme.m b/Examples/test-suite/octave/constructor_copy_runme.m index e450214c6..b6d3c3b6a 100644 --- a/Examples/test-suite/octave/constructor_copy_runme.m +++ b/Examples/test-suite/octave/constructor_copy_runme.m @@ -10,7 +10,7 @@ f11 = Foo1(f1); if (f1.x != f11.x) - error + error("failed"); endif @@ -23,7 +23,7 @@ catch end_try_catch if (!good) - error + error("failed"); endif @@ -31,7 +31,7 @@ bi = Bari(5); bc = Bari(bi); if (bi.x != bc.x) - error + error("failed"); endif @@ -44,6 +44,6 @@ catch end_try_catch if (!good) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/default_args_runme.m b/Examples/test-suite/octave/default_args_runme.m index 3d00f63e0..d2c6b4a6f 100644 --- a/Examples/test-suite/octave/default_args_runme.m +++ b/Examples/test-suite/octave/default_args_runme.m @@ -7,19 +7,19 @@ default_args if (default_args.Statics.staticmethod() != 60) - error + error("failed"); endif if (default_args.cfunc1(1) != 2) - error + error("failed"); endif if (default_args.cfunc2(1) != 3) - error + error("failed"); endif if (default_args.cfunc3(1) != 4) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/director_abstract_runme.m b/Examples/test-suite/octave/director_abstract_runme.m index 657e2e1d9..c96cf7554 100644 --- a/Examples/test-suite/octave/director_abstract_runme.m +++ b/Examples/test-suite/octave/director_abstract_runme.m @@ -28,17 +28,17 @@ MyExample3=@() subclass(director_abstract.Example3_i(),'Color',@(self,r,g,b) b); me1 = MyExample1(); if (director_abstract.Example1.get_color(me1, 1,2,3) != 1) - error + error("failed"); endif me2 = MyExample2(1,2); if (me2.get_color(me2, 1,2,3) != 2) - error + error("failed"); endif me3 = MyExample3(); if (me3.get_color(me3, 1,2,3) != 3) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/director_basic_runme.m b/Examples/test-suite/octave/director_basic_runme.m index 9de54a385..9a411a703 100644 --- a/Examples/test-suite/octave/director_basic_runme.m +++ b/Examples/test-suite/octave/director_basic_runme.m @@ -33,7 +33,7 @@ endif a = director_basic.A1(1); if (a.rg(2) != 2) - error + error("failed"); endif function self=OctClass() @@ -62,16 +62,16 @@ bd = dd.cmethod(b); cc.method(b); if (c.cmethod != 7) - error + error("failed"); endif if (bc.x != 34) - error + error("failed"); endif if (bd.x != 16) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/director_enum_runme.m b/Examples/test-suite/octave/director_enum_runme.m index 96f158d39..59a5ccf8b 100644 --- a/Examples/test-suite/octave/director_enum_runme.m +++ b/Examples/test-suite/octave/director_enum_runme.m @@ -6,5 +6,5 @@ b = director_enum.Foo(); a = MyFoo(); if (a.say_hi(director_enum.hello) != b.say_hello(director_enum.hi)) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/director_nested_runme.m b/Examples/test-suite/octave/director_nested_runme.m index 6e1d0ded9..614af0c60 100644 --- a/Examples/test-suite/octave/director_nested_runme.m +++ b/Examples/test-suite/octave/director_nested_runme.m @@ -31,9 +31,9 @@ c = FooBar_int_get_self(cc); c.advance(); if (!strcmp(c.get_name(),"FooBar::get_name hello")) - error + error("failed"); endif if (!strcmp(c.name(),"FooBar::get_name hello")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/director_unroll_runme.m b/Examples/test-suite/octave/director_unroll_runme.m index 6ca213c4c..607b9d5ef 100644 --- a/Examples/test-suite/octave/director_unroll_runme.m +++ b/Examples/test-suite/octave/director_unroll_runme.m @@ -11,6 +11,6 @@ c = b.get(); if (swig_this(a) != swig_this(c)) a,c - error + error("failed"); endif diff --git a/Examples/test-suite/octave/enum_template_runme.m b/Examples/test-suite/octave/enum_template_runme.m index a9f940a9f..1474ce1cc 100644 --- a/Examples/test-suite/octave/enum_template_runme.m +++ b/Examples/test-suite/octave/enum_template_runme.m @@ -6,13 +6,13 @@ endif enum_template if (enum_template.MakeETest() != 1) - error + error("failed"); endif enum_template.TakeETest(0); try a=enum_template.TakeETest(0); - error + error("failed"); catch end_try_catch diff --git a/Examples/test-suite/octave/enums_runme.m b/Examples/test-suite/octave/enums_runme.m index b654d9d04..5f6bd6951 100644 --- a/Examples/test-suite/octave/enums_runme.m +++ b/Examples/test-suite/octave/enums_runme.m @@ -6,18 +6,18 @@ enums.bar3(1) enums.bar1(1) if (enums.cvar.enumInstance != 2) - error + error("failed"); endif if (enums.cvar.Slap != 10) - error + error("failed"); endif if (enums.cvar.Mine != 11) - error + error("failed"); endif if (enums.cvar.Thigh != 12) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/extend_template_ns_runme.m b/Examples/test-suite/octave/extend_template_ns_runme.m index e79a00dda..7196fac73 100644 --- a/Examples/test-suite/octave/extend_template_ns_runme.m +++ b/Examples/test-suite/octave/extend_template_ns_runme.m @@ -7,9 +7,9 @@ extend_template_ns f = Foo_One(); if (f.test1(37) != 37) - error + error("failed"); endif if (f.test2(42) != 42) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/extend_template_runme.m b/Examples/test-suite/octave/extend_template_runme.m index 1cad7bfc9..125bd4a5a 100644 --- a/Examples/test-suite/octave/extend_template_runme.m +++ b/Examples/test-suite/octave/extend_template_runme.m @@ -2,9 +2,9 @@ extend_template f = extend_template.Foo_0(); if (f.test1(37) != 37) - error + error("failed"); endif if (f.test2(42) != 42) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/extend_variable_runme.m b/Examples/test-suite/octave/extend_variable_runme.m index c55b6c55c..89af26c9d 100644 --- a/Examples/test-suite/octave/extend_variable_runme.m +++ b/Examples/test-suite/octave/extend_variable_runme.m @@ -1,6 +1,6 @@ extend_variable if (Foo.Bar != 42) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/friends_runme.m b/Examples/test-suite/octave/friends_runme.m index 31211567f..50a5b20ef 100644 --- a/Examples/test-suite/octave/friends_runme.m +++ b/Examples/test-suite/octave/friends_runme.m @@ -8,25 +8,25 @@ friends a = friends.A(2); if (friends.get_val1(a) != 2) - error + error("failed"); endif if (friends.get_val2(a) != 4) - error + error("failed"); endif if (friends.get_val3(a) != 6) - error + error("failed"); endif # nice overload working fine if (friends.get_val1(1,2,3) != 1) - error + error("failed"); endif b = friends.B(3); # David's case if (friends.mix(a,b) != 5) - error + error("failed"); endif di = friends.D_d(2); @@ -34,18 +34,18 @@ dd = friends.D_d(3.3); # incredible template overloading working just fine if (friends.get_val1(di) != 2) - error + error("failed"); endif if (friends.get_val1(dd) != 3.3) - error + error("failed"); endif friends.set(di, 4); friends.set(dd, 1.3); if (friends.get_val1(di) != 4) - error + error("failed"); endif if (friends.get_val1(dd) != 1.3) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/grouping_runme.m b/Examples/test-suite/octave/grouping_runme.m index 6d1a2d673..4e2c9ea2d 100644 --- a/Examples/test-suite/octave/grouping_runme.m +++ b/Examples/test-suite/octave/grouping_runme.m @@ -7,14 +7,14 @@ grouping x = grouping.test1(42); if (x != 42) - error + error("failed"); endif grouping.test2(42); x = (grouping.do_unary(37, grouping.NEGATE)); if (x != -37) - error + error("failed"); endif grouping.cvar.test3 = 42; diff --git a/Examples/test-suite/octave/iadd_runme.m b/Examples/test-suite/octave/iadd_runme.m index c386c669e..70cd75dae 100644 --- a/Examples/test-suite/octave/iadd_runme.m +++ b/Examples/test-suite/octave/iadd_runme.m @@ -6,5 +6,5 @@ f.AsA.x = 3; f.AsA += f.AsA; if (f.AsA.x != 6) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/inout_runme.m b/Examples/test-suite/octave/inout_runme.m index 74caaff46..c5d293eb6 100644 --- a/Examples/test-suite/octave/inout_runme.m +++ b/Examples/test-suite/octave/inout_runme.m @@ -2,26 +2,26 @@ inout a = inout.AddOne1(1); if (a != 2) - error + error("failed"); endif a = inout.AddOne3(1,1,1); if (a != [2,2,2]) - error + error("failed"); endif a = inout.AddOne1p((1,1)); if (a != (2,2)) - error + error("failed"); endif a = inout.AddOne2p((1,1),1); if (a != [(2,2),2]) - error + error("failed"); endif a = inout.AddOne3p(1,(1,1),1); if (a != [2,(2,2),2]) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/inplaceadd_runme.m b/Examples/test-suite/octave/inplaceadd_runme.m index 2bc193793..50b680aba 100644 --- a/Examples/test-suite/octave/inplaceadd_runme.m +++ b/Examples/test-suite/octave/inplaceadd_runme.m @@ -3,22 +3,22 @@ a = inplaceadd.A(7); a += 5; if (a.val != 12) - error + error("failed"); endif a -= 5; if a.val != 7: - error + error("failed"); endif a *= 2; if (a.val != 14) - error + error("failed"); endif a += a; if (a.val != 28) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/input_runme.m b/Examples/test-suite/octave/input_runme.m index 1a92d032b..477ffaac1 100644 --- a/Examples/test-suite/octave/input_runme.m +++ b/Examples/test-suite/octave/input_runme.m @@ -7,21 +7,21 @@ input f = Foo(); if (f.foo(2) != 4) - error + error("failed"); endif try a=f.foo(); - error + error("failed"); catch end_try_catch if (!strcmp(sfoo("Hello"),"Hello world")) - error + error("failed"); endif try a=sfoo(); - error + error("failed"); catch end_try_catch diff --git a/Examples/test-suite/octave/li_attribute_runme.m b/Examples/test-suite/octave/li_attribute_runme.m index ed051d9df..5e239045f 100644 --- a/Examples/test-suite/octave/li_attribute_runme.m +++ b/Examples/test-suite/octave/li_attribute_runme.m @@ -8,7 +8,7 @@ li_attribute aa = li_attribute.A(1,2,3); if (aa.a != 1) - error + error("failed"); endif aa.a = 3; if (aa.a != 3) @@ -20,31 +20,31 @@ if (aa.b != 2) endif aa.b = 5; if (aa.b != 5) - error + error("failed"); endif if (aa.d != aa.b) - error + error("failed"); endif if (aa.c != 3) - error + error("failed"); endif pi = li_attribute.Param_i(7); if (pi.value != 7) - error + error("failed"); endif pi.value=3; if (pi.value != 3) - error + error("failed"); endif b = li_attribute.B(aa); if (b.a.c != 3) - error + error("failed"); endif # class/struct attribute with get/set methods using return/pass by reference @@ -53,38 +53,38 @@ myFoo.x = 8; myClass = li_attribute.MyClass(); myClass.Foo = myFoo; if (myClass.Foo.x != 8) - error + error("failed"); endif # class/struct attribute with get/set methods using return/pass by value myClassVal = li_attribute.MyClassVal(); if (myClassVal.ReadWriteFoo.x != -1) - error + error("failed"); endif if (myClassVal.ReadOnlyFoo.x != -1) - error + error("failed"); endif myClassVal.ReadWriteFoo = myFoo; if (myClassVal.ReadWriteFoo.x != 8) - error + error("failed"); endif if (myClassVal.ReadOnlyFoo.x != 8) - error + error("failed"); endif # string attribute with get/set methods using return/pass by value myStringyClass = li_attribute.MyStringyClass("initial string"); if (myStringyClass.ReadWriteString != "initial string") - error + error("failed"); endif if (myStringyClass.ReadOnlyString != "initial string") - error + error("failed"); endif myStringyClass.ReadWriteString = "changed string"; if (myStringyClass.ReadWriteString != "changed string") - error + error("failed"); endif if (myStringyClass.ReadOnlyString != "changed string") - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_carrays_cpp_runme.m b/Examples/test-suite/octave/li_carrays_cpp_runme.m index b3b520920..57e3e9a87 100644 --- a/Examples/test-suite/octave/li_carrays_cpp_runme.m +++ b/Examples/test-suite/octave/li_carrays_cpp_runme.m @@ -11,5 +11,5 @@ d(0) = 7; d(5) = d(0) + 3; if (d(5) + d(0) != 17) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_carrays_runme.m b/Examples/test-suite/octave/li_carrays_runme.m index c6b5f1619..5f180cce3 100644 --- a/Examples/test-suite/octave/li_carrays_runme.m +++ b/Examples/test-suite/octave/li_carrays_runme.m @@ -11,5 +11,5 @@ d(0) = 7; d(5) = d(0) + 3; if (d(5) + d(0) != 17) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_cmalloc_runme.m b/Examples/test-suite/octave/li_cmalloc_runme.m index 92bcd9515..5daea2cb9 100644 --- a/Examples/test-suite/octave/li_cmalloc_runme.m +++ b/Examples/test-suite/octave/li_cmalloc_runme.m @@ -17,6 +17,6 @@ catch end_try_catch if (ok != 1) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_cpointer_cpp_runme.m b/Examples/test-suite/octave/li_cpointer_cpp_runme.m index 463cf44f8..3551a17a9 100644 --- a/Examples/test-suite/octave/li_cpointer_cpp_runme.m +++ b/Examples/test-suite/octave/li_cpointer_cpp_runme.m @@ -5,7 +5,7 @@ p = new_intp(); intp_assign(p,3); if (intp_value(p) != 3) - error + error("failed"); endif delete_intp(p); diff --git a/Examples/test-suite/octave/li_cpointer_runme.m b/Examples/test-suite/octave/li_cpointer_runme.m index ce055cddd..995cc2abf 100644 --- a/Examples/test-suite/octave/li_cpointer_runme.m +++ b/Examples/test-suite/octave/li_cpointer_runme.m @@ -10,7 +10,7 @@ p = new_intp(); intp_assign(p,3); if (intp_value(p) != 3) - error + error("failed"); endif delete_intp(p); diff --git a/Examples/test-suite/octave/li_cstring_runme.m b/Examples/test-suite/octave/li_cstring_runme.m index 8aea6b709..4a706d33f 100644 --- a/Examples/test-suite/octave/li_cstring_runme.m +++ b/Examples/test-suite/octave/li_cstring_runme.m @@ -7,15 +7,15 @@ li_cstring if (count("ab\0ab\0ab\0", 0) != 3) - error + error("failed"); endif if (!strcmp(test1(),"Hello World")) - error + error("failed"); endif if (!strcmp(test2()," !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_")) - error + error("failed"); endif if (!strcmp(test3("hello"),"hello-suffix")) @@ -27,18 +27,18 @@ if (!strcmp(test4("hello"),"hello-suffix")) endif if (!strcmp(test5(4),'xxxx')) - error + error("failed"); endif if (!strcmp(test6(10),'xxxxx')) - error + error("failed"); endif if (!strcmp(test7(),"Hello world!")) - error + error("failed"); endif if (!strcmp(test8()," !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_cwstring_runme.m b/Examples/test-suite/octave/li_cwstring_runme.m index 1fb0962e7..5b9055110 100644 --- a/Examples/test-suite/octave/li_cwstring_runme.m +++ b/Examples/test-suite/octave/li_cwstring_runme.m @@ -6,38 +6,38 @@ endif li_cwstring if (count("ab\0ab\0ab\0", 0) != 3) - error + error("failed"); endif if (!strcmp(test1(),"Hello World")) - error + error("failed"); endif if (!strcmp(test2()," !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_")) - error + error("failed"); endif if (!strcmp(test3("hello"),"hello-suffix")) - error + error("failed"); endif if (!strcmp(test4("hello"),"hello-suffix")) - error + error("failed"); endif if (!strcmp(test5(4),'xxxx')) - error + error("failed"); endif if (!strcmp(test6(10),'xxxxx')) - error + error("failed"); endif if (!strcmp(test7(),"Hello world!")) - error + error("failed"); endif if (!strcmp(test8()," !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_factory_runme.m b/Examples/test-suite/octave/li_factory_runme.m index 5ea9b779f..7c07825f4 100644 --- a/Examples/test-suite/octave/li_factory_runme.m +++ b/Examples/test-suite/octave/li_factory_runme.m @@ -8,11 +8,11 @@ li_factory circle = Geometry_create(Geometry.CIRCLE); r = circle.radius(); if (r != 1.5) - error + error("failed"); endif point = Geometry_create(Geometry.POINT); w = point.width(); if (w != 1.0) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_std_carray_runme.m b/Examples/test-suite/octave/li_std_carray_runme.m index 4943fa8a2..f7212dc9a 100644 --- a/Examples/test-suite/octave/li_std_carray_runme.m +++ b/Examples/test-suite/octave/li_std_carray_runme.m @@ -9,7 +9,7 @@ endfor i = 0; for d in v3, if (d != i) - error + error("failed"); endif i = i + 1; endfor @@ -29,7 +29,7 @@ for v3 in m3, j = 0; for d in v3, if (d != i + j) - error + error("failed"); endif j = j + 1; endfor @@ -39,7 +39,7 @@ endfor for i=0:len(m3), for j=0:len(m3), if (m3(i,j) != i + j) - error + error("failed"); endif endfor endfor diff --git a/Examples/test-suite/octave/li_std_containers_overload_runme.m b/Examples/test-suite/octave/li_std_containers_overload_runme.m new file mode 100644 index 000000000..786d63466 --- /dev/null +++ b/Examples/test-suite/octave/li_std_containers_overload_runme.m @@ -0,0 +1,37 @@ +# do not dump Octave core +if exist("crash_dumps_octave_core", "builtin") + crash_dumps_octave_core(0); +endif + +li_std_containers_overload + +function check(got, expected) + if (!strcmp(got, expected)) + error("Failed check. '%s' != '%s'", got, expected) + endif +end + +v = VectorX(); +check(VectorOverload(v), "vector"); + +v = VectorY(); +check(VectorOverload(v), "vector"); + +v = VectorInt(); +check(VectorOverload(v), "vector"); + +v = VectorString(); +check(VectorOverload(v), "vector"); + +# TODO: Conversion from an Octave sequence not implemented yet +# v = {X()}; +# check(VectorOverload(v), "vector"); + +# v = {Y()}; +# check(VectorOverload(v), "vector"); + +# v = {1, 2, 3}; +# check(VectorOverload(v), "vector"); + +# v = {"aaa", "bbb", "ccc"}; +# check(VectorOverload(v), "vector"); diff --git a/Examples/test-suite/octave/li_std_set_runme.m b/Examples/test-suite/octave/li_std_set_runme.m index 9bd4f152c..7f43f2f13 100644 --- a/Examples/test-suite/octave/li_std_set_runme.m +++ b/Examples/test-suite/octave/li_std_set_runme.m @@ -11,15 +11,15 @@ for i in s: sum = sum + i if (sum != "abc") - error + error("failed"); i = s.__iter__() if i.next() != "a": - error + error("failed"); if i.next() != "b": - error + error("failed"); if i.next() != "c": - error + error("failed"); b = s.begin() @@ -28,7 +28,7 @@ sum = "" while (b != e): sum = sum + b.next() if sum != "abc": - error + error("failed"); b = s.rbegin() e = s.rend() @@ -37,7 +37,7 @@ while (b != e): sum = sum + b.next() if sum != "cba": - error + error("failed"); @@ -49,11 +49,11 @@ si.append(3) i = si.__iter__() if i.next() != 1: - error + error("failed"); if i.next() != 2: - error + error("failed"); if i.next() != 3: - error + error("failed"); @@ -68,17 +68,17 @@ sum = "" while (b != e): sum = sum + b.next() if sum != "ac": - error + error("failed"); b = s.begin() e = s.end() if e - b != 2: - error + error("failed"); m = b + 1 if m.value() != "c": - error + error("failed"); @@ -93,4 +93,4 @@ for i in s: sum = sum + (i,) if sum != (1, 'hello', (1, 2)): - error + error("failed"); diff --git a/Examples/test-suite/octave/li_std_stream_runme.m b/Examples/test-suite/octave/li_std_stream_runme.m index bf9402e16..cedc8e59c 100644 --- a/Examples/test-suite/octave/li_std_stream_runme.m +++ b/Examples/test-suite/octave/li_std_stream_runme.m @@ -8,6 +8,6 @@ o << a << " " << 2345 << " " << 1.435; if (o.str() != "A class 2345 1.435") - error + error("failed"); endif diff --git a/Examples/test-suite/octave/li_std_string_extra_runme.m b/Examples/test-suite/octave/li_std_string_extra_runme.m index 8d506af8a..15e18eec7 100644 --- a/Examples/test-suite/octave/li_std_string_extra_runme.m +++ b/Examples/test-suite/octave/li_std_string_extra_runme.m @@ -140,23 +140,23 @@ endif if (li_std_string_extra.test_reference_input("hello") != "hello") - error + error("failed"); endif s = li_std_string_extra.test_reference_inout("hello"); if (s != "hellohello") - error + error("failed"); endif if (li_std_string_extra.stdstring_empty() != "") - error + error("failed"); endif if (li_std_string_extra.c_empty() != "") - error + error("failed"); endif #if (li_std_string_extra.c_null() != None) -# error +# error("failed"); #endif diff --git a/Examples/test-suite/octave/li_std_wstream_runme.m b/Examples/test-suite/octave/li_std_wstream_runme.m index a017e8acd..4f1c62166 100644 --- a/Examples/test-suite/octave/li_std_wstream_runme.m +++ b/Examples/test-suite/octave/li_std_wstream_runme.m @@ -9,6 +9,6 @@ o = wostringstream(); o << a << u" " << 2345 << u" " << 1.435 << wends; if (o.str() != "A class 2345 1.435\0") - error + error("failed"); endif diff --git a/Examples/test-suite/octave/multi_import_runme.m b/Examples/test-suite/octave/multi_import_runme.m index 2b7a610d4..d22ff5c81 100644 --- a/Examples/test-suite/octave/multi_import_runme.m +++ b/Examples/test-suite/octave/multi_import_runme.m @@ -8,22 +8,22 @@ multi_import_b; x = multi_import_b.XXX(); if (x.testx() != 0) - error + error("failed"); endif y = multi_import_b.YYY(); if (y.testx() != 0) - error + error("failed"); endif if (y.testy() != 1) - error + error("failed"); endif z = multi_import_a.ZZZ(); if (z.testx() != 0) - error + error("failed"); endif if (z.testz() != 2) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/namespace_typemap_runme.m b/Examples/test-suite/octave/namespace_typemap_runme.m index ca3730773..d7e338104 100644 --- a/Examples/test-suite/octave/namespace_typemap_runme.m +++ b/Examples/test-suite/octave/namespace_typemap_runme.m @@ -1,106 +1,106 @@ namespace_typemap if (!strcmp(stest1("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest2("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest3("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest4("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest5("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest6("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest7("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest8("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest9("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest10("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest11("hello"),"hello")) - error + error("failed"); endif if (!strcmp(stest12("hello"),"hello")) - error + error("failed"); endif c = complex(2,3); r = real(c); if (ctest1(c) != r) - error + error("failed"); endif if (ctest2(c) != r) - error + error("failed"); endif if (ctest3(c) != r) - error + error("failed"); endif if (ctest4(c) != r) - error + error("failed"); endif if (ctest5(c) != r) - error + error("failed"); endif if (ctest6(c) != r) - error + error("failed"); endif if (ctest7(c) != r) - error + error("failed"); endif if (ctest8(c) != r) - error + error("failed"); endif if (ctest9(c) != r) - error + error("failed"); endif if (ctest10(c) != r) - error + error("failed"); endif if (ctest11(c) != r) - error + error("failed"); endif if (ctest12(c) != r) - error + error("failed"); endif try ttest1(-14) - error + error("failed"); catch end_try_catch diff --git a/Examples/test-suite/octave/naturalvar_runme.m b/Examples/test-suite/octave/naturalvar_runme.m index 6059b0273..40546f26c 100644 --- a/Examples/test-suite/octave/naturalvar_runme.m +++ b/Examples/test-suite/octave/naturalvar_runme.m @@ -14,6 +14,6 @@ cvar.s = "hello"; b.s = "hello"; if (b.s != cvar.s) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/overload_extend2_runme.m b/Examples/test-suite/octave/overload_extend2_runme.m index 6db6b66bb..e4611948e 100644 --- a/Examples/test-suite/octave/overload_extend2_runme.m +++ b/Examples/test-suite/octave/overload_extend2_runme.m @@ -2,29 +2,29 @@ overload_extend2 f = overload_extend2.Foo(); if (f.test(3) != 1) - error + error("failed"); endif if (f.test("hello") != 2) - error + error("failed"); endif if (f.test(3.5,2.5) != 3) - error + error("failed"); endif if (f.test("hello",20) != 1020) - error + error("failed"); endif if (f.test("hello",20,100) != 120) - error + error("failed"); endif # C default args if (f.test(f) != 30) - error + error("failed"); endif if (f.test(f,100) != 120) - error + error("failed"); endif if (f.test(f,100,200) != 300) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/overload_extend_c_runme.m b/Examples/test-suite/octave/overload_extend_c_runme.m index 79b92ca47..2a6c5c21e 100644 --- a/Examples/test-suite/octave/overload_extend_c_runme.m +++ b/Examples/test-suite/octave/overload_extend_c_runme.m @@ -7,18 +7,18 @@ overload_extend_c f = overload_extend_c.Foo(); if (f.test() != 0) - error + error("failed"); endif if (f.test(3) != 1) - error + error("failed"); endif if (f.test("hello") != 2) - error + error("failed"); endif if (f.test(3,2) != 5) - error + error("failed"); endif if (f.test(3.1)-.1 != 1003) # :) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/overload_extend_runme.m b/Examples/test-suite/octave/overload_extend_runme.m index d9959804f..a29f1910e 100644 --- a/Examples/test-suite/octave/overload_extend_runme.m +++ b/Examples/test-suite/octave/overload_extend_runme.m @@ -7,18 +7,18 @@ overload_extend f = overload_extend.Foo(); if (f.test() != 0) - error + error("failed"); endif if (f.test(3) != 1) - error + error("failed"); endif if (f.test("hello") != 2) - error + error("failed"); endif if (f.test(3,2) != 5) - error + error("failed"); endif if (f.test(3.1)-.1 != 1003) # :) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/preproc_runme.m b/Examples/test-suite/octave/preproc_runme.m index e9af66e78..80f1d32ba 100644 --- a/Examples/test-suite/octave/preproc_runme.m +++ b/Examples/test-suite/octave/preproc_runme.m @@ -6,18 +6,18 @@ endif preproc if (preproc.cvar.endif != 1) - error + error("failed"); endif if (preproc.cvar.define != 1) - error + error("failed"); endif if (preproc.cvar.defined != 1) - error + error("failed"); endif if (2*preproc.one != preproc.two) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/primitive_ref_runme.m b/Examples/test-suite/octave/primitive_ref_runme.m index 68a5750c3..799b6db17 100644 --- a/Examples/test-suite/octave/primitive_ref_runme.m +++ b/Examples/test-suite/octave/primitive_ref_runme.m @@ -1,53 +1,53 @@ primitive_ref if (ref_int(3) != 3) - error + error("failed"); endif if (ref_uint(3) != 3) - error + error("failed"); endif if (ref_short(3) != 3) - error + error("failed"); endif if (ref_ushort(3) != 3) - error + error("failed"); endif if (ref_long(3) != 3) - error + error("failed"); endif if (ref_ulong(3) != 3) - error + error("failed"); endif if (ref_schar(3) != 3) - error + error("failed"); endif if (ref_uchar(3) != 3) - error + error("failed"); endif if (ref_float(3.5) != 3.5) - error + error("failed"); endif if (ref_double(3.5) != 3.5) - error + error("failed"); endif if (ref_bool(true) != true) - error + error("failed"); endif if (!strcmp(ref_char('x'),'x')) - error + error("failed"); endif if (ref_over(0) != 0) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/reference_global_vars_runme.m b/Examples/test-suite/octave/reference_global_vars_runme.m index 67ad9c514..c7f4f56b7 100644 --- a/Examples/test-suite/octave/reference_global_vars_runme.m +++ b/Examples/test-suite/octave/reference_global_vars_runme.m @@ -2,90 +2,90 @@ reference_global_vars # const class reference variable if (getconstTC().num != 33) - error + error("failed"); endif # primitive reference variables cvar.var_bool = createref_bool(false); if (value_bool(cvar.var_bool) != 0) - error + error("failed"); endif cvar.var_bool = createref_bool(true); if (value_bool(cvar.var_bool) != 1) - error + error("failed"); endif cvar.var_char = createref_char('w'); if (!strcmp(value_char(cvar.var_char),'w')) - error + error("failed"); endif cvar.var_unsigned_char = createref_unsigned_char(10); if (value_unsigned_char(cvar.var_unsigned_char) != 10) - error + error("failed"); endif cvar.var_signed_char = createref_signed_char(10); if (value_signed_char(cvar.var_signed_char) != 10) - error + error("failed"); endif cvar.var_short = createref_short(10); if (value_short(cvar.var_short) != 10) - error + error("failed"); endif cvar.var_unsigned_short = createref_unsigned_short(10); if (value_unsigned_short(cvar.var_unsigned_short) != 10) - error + error("failed"); endif cvar.var_int = createref_int(10); if (value_int(cvar.var_int) != 10) - error + error("failed"); endif cvar.var_unsigned_int = createref_unsigned_int(10); if (value_unsigned_int(cvar.var_unsigned_int) != 10) - error + error("failed"); endif cvar.var_long = createref_long(10); if (value_long(cvar.var_long) != 10) - error + error("failed"); endif cvar.var_unsigned_long = createref_unsigned_long(10); if (value_unsigned_long(cvar.var_unsigned_long) != 10) - error + error("failed"); endif cvar.var_long_long = createref_long_long(int64(0x6FFFFFFFFFFFFFF8)); if (value_long_long(cvar.var_long_long) != int64(0x6FFFFFFFFFFFFFF8)) - error + error("failed"); endif #ull = abs(0xFFFFFFF2FFFFFFF0) ull = uint64(55834574864); cvar.var_unsigned_long_long = createref_unsigned_long_long(ull); if (value_unsigned_long_long(cvar.var_unsigned_long_long) != ull) - error + error("failed"); endif cvar.var_float = createref_float(10.5); if (value_float(cvar.var_float) != 10.5) - error + error("failed"); endif cvar.var_double = createref_double(10.5); if (value_double(cvar.var_double) != 10.5) - error + error("failed"); endif # class reference variable cvar.var_TestClass = createref_TestClass(TestClass(20)); if (value_TestClass(cvar.var_TestClass).num != 20) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/rename_scope_runme.m b/Examples/test-suite/octave/rename_scope_runme.m index 154f99dfe..776d218c5 100644 --- a/Examples/test-suite/octave/rename_scope_runme.m +++ b/Examples/test-suite/octave/rename_scope_runme.m @@ -4,11 +4,11 @@ a = Natural_UP(); b = Natural_BP(); if (a.rtest() != 1) - error + error("failed"); endif if (b.rtest() != 1) - error + error("failed"); endif f = @equals; diff --git a/Examples/test-suite/octave/ret_by_value_runme.m b/Examples/test-suite/octave/ret_by_value_runme.m index 67f80aae2..c1c508353 100644 --- a/Examples/test-suite/octave/ret_by_value_runme.m +++ b/Examples/test-suite/octave/ret_by_value_runme.m @@ -7,9 +7,9 @@ ret_by_value a = ret_by_value.get_test(); if (a.myInt != 100) - error + error("failed"); endif if (a.myShort != 200) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/smart_pointer_extend_runme.m b/Examples/test-suite/octave/smart_pointer_extend_runme.m index 6c9258e6d..cf82f7350 100644 --- a/Examples/test-suite/octave/smart_pointer_extend_runme.m +++ b/Examples/test-suite/octave/smart_pointer_extend_runme.m @@ -9,7 +9,7 @@ f = Foo(); b = Bar(f); if (b.extension() != f.extension()) - error + error("failed"); endif @@ -18,15 +18,15 @@ d = CDerived(); p = CPtr(); if (b.bar() != p.bar()) - error + error("failed"); endif if (d.foo() != p.foo()) - error + error("failed"); endif if (b.hello() != p.hello()) - error + error("failed"); endif @@ -36,11 +36,11 @@ d = DFoo(); dp = DPtrFoo(d); if (d.SExt(1) != dp.SExt(1)) - error + error("failed"); endif if (d.Ext(1) != dp.Ext(1)) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/smart_pointer_member_runme.m b/Examples/test-suite/octave/smart_pointer_member_runme.m index 30251c3a8..1c2d0e9ed 100644 --- a/Examples/test-suite/octave/smart_pointer_member_runme.m +++ b/Examples/test-suite/octave/smart_pointer_member_runme.m @@ -4,7 +4,7 @@ f = Foo(); f.y = 1; if (f.y != 1) - error + error("failed"); endif b = Bar(f); @@ -15,18 +15,18 @@ if (f.y != 2) endif if (swig_this(b.x) != swig_this(f.x)) - error + error("failed"); endif if (b.z != f.z) - error + error("failed"); endif try if (Foo.z == Bar.z) - error + error("failed"); endif - error + error("failed"); catch end_try_catch diff --git a/Examples/test-suite/octave/smart_pointer_multi_runme.m b/Examples/test-suite/octave/smart_pointer_multi_runme.m index 71ef9109a..ea15d04b9 100644 --- a/Examples/test-suite/octave/smart_pointer_multi_runme.m +++ b/Examples/test-suite/octave/smart_pointer_multi_runme.m @@ -7,11 +7,11 @@ g = Grok(b); s.x = 3; if (s.getx() != 3) - error + error("failed"); endif g.x = 4; if (g.getx() != 4) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/smart_pointer_multi_typedef_runme.m b/Examples/test-suite/octave/smart_pointer_multi_typedef_runme.m index 4b77e0eea..c2ab78714 100644 --- a/Examples/test-suite/octave/smart_pointer_multi_typedef_runme.m +++ b/Examples/test-suite/octave/smart_pointer_multi_typedef_runme.m @@ -7,12 +7,12 @@ g = Grok(b); s.x = 3; if (s.getx() != 3) - error + error("failed"); endif g.x = 4; if (g.getx() != 4) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/smart_pointer_overload_runme.m b/Examples/test-suite/octave/smart_pointer_overload_runme.m index a5df0ded4..1bfb68354 100644 --- a/Examples/test-suite/octave/smart_pointer_overload_runme.m +++ b/Examples/test-suite/octave/smart_pointer_overload_runme.m @@ -10,23 +10,23 @@ b = Bar(f); if (f.test(3) != 1) - error + error("failed"); endif if (f.test(3.5) != 2) - error + error("failed"); endif if (f.test("hello") != 3) - error + error("failed"); endif if (b.test(3) != 1) - error + error("failed"); endif if (b.test(3.5) != 2) - error + error("failed"); endif if (b.test("hello") != 3) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/smart_pointer_rename_runme.m b/Examples/test-suite/octave/smart_pointer_rename_runme.m index 5eb6d4c3c..307bd8f95 100644 --- a/Examples/test-suite/octave/smart_pointer_rename_runme.m +++ b/Examples/test-suite/octave/smart_pointer_rename_runme.m @@ -9,14 +9,14 @@ f = Foo(); b = Bar(f); if (b.test() != 3) - error + error("failed"); endif if (b.ftest1(1) != 1) - error + error("failed"); endif if (b.ftest2(2,3) != 2) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/smart_pointer_simple_runme.m b/Examples/test-suite/octave/smart_pointer_simple_runme.m index 30b1387c4..c15c43ca9 100644 --- a/Examples/test-suite/octave/smart_pointer_simple_runme.m +++ b/Examples/test-suite/octave/smart_pointer_simple_runme.m @@ -10,11 +10,11 @@ b = Bar(f); b.x = 3; if (b.getx() != 3) - error + error("failed"); endif fp = b.__deref__(); fp.x = 4; if (fp.getx() != 4) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/smart_pointer_templatevariables_runme.m b/Examples/test-suite/octave/smart_pointer_templatevariables_runme.m index 4884fa24b..ee45f68f9 100644 --- a/Examples/test-suite/octave/smart_pointer_templatevariables_runme.m +++ b/Examples/test-suite/octave/smart_pointer_templatevariables_runme.m @@ -3,17 +3,17 @@ smart_pointer_templatevariables d = DiffImContainerPtr_D(create(1234, 5678)); if (d.id != 1234) - error + error("failed"); endif #if (d.xyz != 5678): -# error +# error("failed"); d.id = 4321; #d.xyz = 8765 if (d.id != 4321) - error + error("failed"); endif #if (d.xyz != 8765): -# error +# error("failed"); diff --git a/Examples/test-suite/octave/smart_pointer_typedef_runme.m b/Examples/test-suite/octave/smart_pointer_typedef_runme.m index 0e1c8a61e..3a094670f 100644 --- a/Examples/test-suite/octave/smart_pointer_typedef_runme.m +++ b/Examples/test-suite/octave/smart_pointer_typedef_runme.m @@ -10,11 +10,11 @@ b = Bar(f); b.x = 3; if (b.getx() != 3) - error + error("failed"); endif fp = b.__deref__(); fp.x = 4; if (fp.getx() != 4) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/static_const_member_2_runme.m b/Examples/test-suite/octave/static_const_member_2_runme.m index 73260bae7..8619fd1eb 100644 --- a/Examples/test-suite/octave/static_const_member_2_runme.m +++ b/Examples/test-suite/octave/static_const_member_2_runme.m @@ -18,6 +18,6 @@ end_try_catch if (Foo.BAZ.val != 2*Foo.BAR.val) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/std_containers_runme.m b/Examples/test-suite/octave/std_containers_runme.m index eae3d5d9f..d069b585c 100644 --- a/Examples/test-suite/octave/std_containers_runme.m +++ b/Examples/test-suite/octave/std_containers_runme.m @@ -132,7 +132,7 @@ s.append(3); j=1; for i in s, if (i != j) - error + error("failed"); endif j = j + 1; endfor diff --git a/Examples/test-suite/octave/struct_value_runme.m b/Examples/test-suite/octave/struct_value_runme.m index ff344047e..7f7448bb6 100644 --- a/Examples/test-suite/octave/struct_value_runme.m +++ b/Examples/test-suite/octave/struct_value_runme.m @@ -9,10 +9,10 @@ b = struct_value.Bar(); b.a.x = 3; if (b.a.x != 3) - error + error("failed"); endif b.b.x = 3; if (b.b.x != 3) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/swigobject_runme.m b/Examples/test-suite/octave/swigobject_runme.m index 73167e497..9ab3aa8c6 100644 --- a/Examples/test-suite/octave/swigobject_runme.m +++ b/Examples/test-suite/octave/swigobject_runme.m @@ -11,7 +11,7 @@ a1 = a_ptr(a); a2 = a_ptr(a); if (swig_this(a1) != swig_this(a2)) - error + error("failed"); endif @@ -20,7 +20,7 @@ xstr1 = printf("0x%x",lthis); xstr2 = pointer_str(a); if (xstr1 != xstr2) - error + error("failed"); endif s = str(a.this); @@ -29,5 +29,5 @@ r = repr(a.this); v1 = v_ptr(a); v2 = v_ptr(a); if (uint64(v1) != uint64(v2)) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/template_extend1_runme.m b/Examples/test-suite/octave/template_extend1_runme.m index 5035debf5..05e534107 100644 --- a/Examples/test-suite/octave/template_extend1_runme.m +++ b/Examples/test-suite/octave/template_extend1_runme.m @@ -9,9 +9,9 @@ a = template_extend1.lBaz(); b = template_extend1.dBaz(); if (!strcmp(a.foo(),"lBaz::foo")) - error + error("failed"); endif if (!strcmp(b.foo(),"dBaz::foo")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/template_extend2_runme.m b/Examples/test-suite/octave/template_extend2_runme.m index 24472a9ed..e9b5fb799 100644 --- a/Examples/test-suite/octave/template_extend2_runme.m +++ b/Examples/test-suite/octave/template_extend2_runme.m @@ -9,9 +9,9 @@ a = template_extend2.lBaz(); b = template_extend2.dBaz(); if (!strcmp(a.foo(),"lBaz::foo")) - error + error("failed"); endif if (!strcmp(b.foo(),"dBaz::foo")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/template_inherit_runme.m b/Examples/test-suite/octave/template_inherit_runme.m index 368cce227..72d7e7511 100644 --- a/Examples/test-suite/octave/template_inherit_runme.m +++ b/Examples/test-suite/octave/template_inherit_runme.m @@ -12,62 +12,62 @@ e = FooUInt(); f = BarUInt(); if (!strcmp(a.blah(),"Foo")) - error + error("failed"); endif if (!strcmp(b.blah(),"Foo")) - error + error("failed"); endif if (!strcmp(e.blah(),"Foo")) - error + error("failed"); endif if (!strcmp(c.blah(),"Bar")) - error + error("failed"); endif if (!strcmp(d.blah(),"Bar")) - error + error("failed"); endif if (!strcmp(f.blah(),"Bar")) - error + error("failed"); endif if (!strcmp(c.foomethod(),"foomethod")) - error + error("failed"); endif if (!strcmp(d.foomethod(),"foomethod")) - error + error("failed"); endif if (!strcmp(f.foomethod(),"foomethod")) - error + error("failed"); endif if (!strcmp(invoke_blah_int(a),"Foo")) - error + error("failed"); endif if (!strcmp(invoke_blah_int(c),"Bar")) - error + error("failed"); endif if (!strcmp(invoke_blah_double(b),"Foo")) - error + error("failed"); endif if (!strcmp(invoke_blah_double(d),"Bar")) - error + error("failed"); endif if (!strcmp(invoke_blah_uint(e),"Foo")) - error + error("failed"); endif if (!strcmp(invoke_blah_uint(f),"Bar")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/template_ns4_runme.m b/Examples/test-suite/octave/template_ns4_runme.m index b5746427b..6dff55694 100644 --- a/Examples/test-suite/octave/template_ns4_runme.m +++ b/Examples/test-suite/octave/template_ns4_runme.m @@ -7,5 +7,5 @@ template_ns4 d = make_Class_DD(); if (!strcmp(d.test(),"test")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/template_ns_runme.m b/Examples/test-suite/octave/template_ns_runme.m index 29a2f53f6..44b13e62c 100644 --- a/Examples/test-suite/octave/template_ns_runme.m +++ b/Examples/test-suite/octave/template_ns_runme.m @@ -3,19 +3,19 @@ p1 = pairii(2,3); p2 = pairii(p1); if (p2.first != 2) - error + error("failed"); endif if (p2.second != 3) - error + error("failed"); endif p3 = pairdd(3.5,2.5); p4 = pairdd(p3); if (p4.first != 3.5) - error + error("failed"); endif if (p4.second != 2.5) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/template_tbase_template_runme.m b/Examples/test-suite/octave/template_tbase_template_runme.m index da8ec4c69..b1bfd8f7d 100644 --- a/Examples/test-suite/octave/template_tbase_template_runme.m +++ b/Examples/test-suite/octave/template_tbase_template_runme.m @@ -2,5 +2,5 @@ template_tbase_template a = make_Class_dd(); if (!strcmp(a.test(),"test")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/template_typedef_cplx2_runme.m b/Examples/test-suite/octave/template_typedef_cplx2_runme.m index a72e0f1e0..eb783fe81 100644 --- a/Examples/test-suite/octave/template_typedef_cplx2_runme.m +++ b/Examples/test-suite/octave/template_typedef_cplx2_runme.m @@ -15,7 +15,7 @@ end_try_catch if (strfind('ArithUnaryFunction',swig_type(d)) != 1) d error("is not an ArithUnaryFunction") - error + error("failed"); endif try @@ -77,7 +77,7 @@ end_try_catch if (strfind('ArithUnaryFunction',swig_type(g)) != 1) g error("is not an ArithUnaryFunction") - error + error("failed"); endif @@ -98,6 +98,6 @@ try a = g.get_value(); catch error(g, "has not get_value() method") - error + error("failed"); end_try_catch diff --git a/Examples/test-suite/octave/template_typedef_runme.m b/Examples/test-suite/octave/template_typedef_runme.m index 8d8af795b..2a734e207 100644 --- a/Examples/test-suite/octave/template_typedef_runme.m +++ b/Examples/test-suite/octave/template_typedef_runme.m @@ -8,7 +8,7 @@ try a = swig_this(d); a = swig_this(c); catch - error + error("failed"); end_try_catch try @@ -37,15 +37,15 @@ end_try_catch # the old large format if (strcmp("",swig_typequery("vfncs::ArithUnaryFunction::argument_type,vfncs::arith_traits::result_type > *"))) - error + error("failed"); endif # the reduced format if (strcmp("",swig_typequery("vfncs::ArithUnaryFunction *"))) - error + error("failed"); endif # this is a bad name if (!strcmp("",swig_typequery("vfncs::ArithUnaryFunction *"))) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/typemap_namespace_runme.m b/Examples/test-suite/octave/typemap_namespace_runme.m index ec62a3910..e67781c66 100644 --- a/Examples/test-suite/octave/typemap_namespace_runme.m +++ b/Examples/test-suite/octave/typemap_namespace_runme.m @@ -1,10 +1,10 @@ typemap_namespace if (!strcmp(test1("hello"),"hello")) - error + error("failed"); endif if (!strcmp(test2("hello"),"hello")) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/typemap_ns_using_runme.m b/Examples/test-suite/octave/typemap_ns_using_runme.m index dd3f657f0..d94241b9c 100644 --- a/Examples/test-suite/octave/typemap_ns_using_runme.m +++ b/Examples/test-suite/octave/typemap_ns_using_runme.m @@ -1,5 +1,5 @@ typemap_ns_using if (typemap_ns_using.spam(37) != 37) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/types_directive_runme.m b/Examples/test-suite/octave/types_directive_runme.m index 0757c6c39..5ad4af1bb 100644 --- a/Examples/test-suite/octave/types_directive_runme.m +++ b/Examples/test-suite/octave/types_directive_runme.m @@ -3,13 +3,13 @@ types_directive d1 = Time1(2001, 2, 3, 60); newDate = add(d1, 7); # check that a Time1 instance is accepted where Date is expected if (newDate.day != 10) - error + error("failed"); endif d2 = Time2(1999, 8, 7, 60); newDate = add(d2, 7); # check that a Time2 instance is accepted where Date is expected if (newDate.day != 14) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/using1_runme.m b/Examples/test-suite/octave/using1_runme.m index 9253a1d35..e25128ec7 100644 --- a/Examples/test-suite/octave/using1_runme.m +++ b/Examples/test-suite/octave/using1_runme.m @@ -6,5 +6,5 @@ endif using1 if (using1.spam(37) != 37) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/using2_runme.m b/Examples/test-suite/octave/using2_runme.m index 7cc668940..0213ee7c6 100644 --- a/Examples/test-suite/octave/using2_runme.m +++ b/Examples/test-suite/octave/using2_runme.m @@ -6,5 +6,5 @@ endif using2 if (using2.spam(37) != 37) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/virtual_poly_runme.m b/Examples/test-suite/octave/virtual_poly_runme.m index 0c7c95153..363f86798 100644 --- a/Examples/test-suite/octave/virtual_poly_runme.m +++ b/Examples/test-suite/octave/virtual_poly_runme.m @@ -10,23 +10,23 @@ dc = d.copy(); ic = i.copy(); if (d.get() != dc.get()) - error + error("failed"); endif if (i.get() != ic.get()) - error + error("failed"); endif virtual_poly.incr(ic); if ((i.get() + 1) != ic.get()) - error + error("failed"); endif dr = d.ref_this(); if (d.get() != dr.get()) - error + error("failed"); endif @@ -35,10 +35,10 @@ endif # ddc = virtual_poly.NDouble_narrow(d.nnumber()); if (d.get() != ddc.get()) - error + error("failed"); endif dic = virtual_poly.NInt_narrow(i.nnumber()); if (i.get() != dic.get()) - error + error("failed"); endif diff --git a/Examples/test-suite/octave/voidtest_runme.m b/Examples/test-suite/octave/voidtest_runme.m index fb411ee4e..c4815a597 100644 --- a/Examples/test-suite/octave/voidtest_runme.m +++ b/Examples/test-suite/octave/voidtest_runme.m @@ -27,16 +27,16 @@ end_try_catch v1 = voidtest.vfunc1(f); v2 = voidtest.vfunc2(f); if (swig_this(v1) != swig_this(v2)) - error + error("failed"); endif v3 = voidtest.vfunc3(v1); if (swig_this(v3) != swig_this(f)) - error + error("failed"); endif v4 = voidtest.vfunc1(f); if (swig_this(v4) != swig_this(v1)) - error + error("failed"); endif diff --git a/Examples/test-suite/overload_arrays.i b/Examples/test-suite/overload_arrays.i index 272c96a3d..e6bd09adf 100644 --- a/Examples/test-suite/overload_arrays.i +++ b/Examples/test-suite/overload_arrays.i @@ -2,10 +2,6 @@ // Based on overload_simple testcase %module overload_arrays -#ifdef SWIGCHICKEN -%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) fbool; -#endif - #ifdef SWIGLUA // lua only has one numeric type, so most of the overloads shadow each other creating warnings %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) foo; diff --git a/Examples/test-suite/overload_polymorphic.i b/Examples/test-suite/overload_polymorphic.i index ac004f948..72aabd840 100644 --- a/Examples/test-suite/overload_polymorphic.i +++ b/Examples/test-suite/overload_polymorphic.i @@ -23,4 +23,7 @@ class Unknown; int test2(Unknown* unknown) { return 0; } int test2(Base* base) { return 1; } +int test3(const char*, const Base* = 0, bool = false) { return 0; } +int test3(Base&, const char* = 0, const Base* = 0, bool = false) { return 1; } + %} diff --git a/Examples/test-suite/overload_simple.i b/Examples/test-suite/overload_simple.i index ba1900b40..fa2e335bb 100644 --- a/Examples/test-suite/overload_simple.i +++ b/Examples/test-suite/overload_simple.i @@ -1,10 +1,6 @@ // Simple tests of overloaded functions %module overload_simple -#ifdef SWIGCHICKEN -%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) fbool; -#endif - #ifdef SWIGLUA // lua only has one numeric type, so most of the overloads shadow each other creating warnings %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) foo; diff --git a/Examples/test-suite/perl5/Makefile.in b/Examples/test-suite/perl5/Makefile.in index 48d5fa5d1..6388e5b32 100644 --- a/Examples/test-suite/perl5/Makefile.in +++ b/Examples/test-suite/perl5/Makefile.in @@ -16,11 +16,13 @@ CPP_TEST_CASES += \ li_cstring \ li_cdata_carrays_cpp \ li_reference \ + memberin1 \ director_nestedmodule \ C_TEST_CASES += \ li_cstring \ li_cdata_carrays \ + multivalue \ include $(srcdir)/../common.mk diff --git a/Examples/test-suite/perl5/li_typemaps_runme.pl b/Examples/test-suite/perl5/li_typemaps_runme.pl index a573b89a0..2755862a2 100644 --- a/Examples/test-suite/perl5/li_typemaps_runme.pl +++ b/Examples/test-suite/perl5/li_typemaps_runme.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl use strict; use warnings; -use Test::More tests => 415; +use Test::More tests => 416; BEGIN { use_ok('li_typemaps') } require_ok('li_typemaps'); @@ -75,10 +75,11 @@ SKIP: { batch('ulonglong', $c); } -my($foo, $int) = li_typemaps::out_foo(10); +my($foo, $int, $int2) = li_typemaps::out_foo(10); isa_ok($foo, 'li_typemaps::Foo'); is($foo->{a}, 10); is($int, 20); +is($int2, 30); my($a, $b) = li_typemaps::inoutr_int2(13, 31); is($a, 13); diff --git a/Examples/test-suite/perl5/multivalue_runme.pl b/Examples/test-suite/perl5/multivalue_runme.pl new file mode 100644 index 000000000..b58a58a11 --- /dev/null +++ b/Examples/test-suite/perl5/multivalue_runme.pl @@ -0,0 +1,20 @@ +use strict; +use warnings; +use Test::More tests => 8; + +BEGIN { use_ok('multivalue') } +require_ok('multivalue'); + +my ($q, $r); + +($q, $r) = multivalue::divide_l(37, 5); +is($q, 7, "Test divide_l quotient"); +is($r, 2, "Test divide_l remainder"); + +($q, $r) = multivalue::divide_v(41, 7); +is($q, 5, "Test divide_v quotient"); +is($r, 6, "Test divide_v remainder"); + +($q, $r) = multivalue::divide_mv(91, 13); +is($q, 7, "Test divide_mv quotient"); +is($r, 0, "Test divide_mv remainder"); diff --git a/Examples/test-suite/php/Makefile.in b/Examples/test-suite/php/Makefile.in index 64f0d1f9d..b64918df7 100644 --- a/Examples/test-suite/php/Makefile.in +++ b/Examples/test-suite/php/Makefile.in @@ -11,10 +11,19 @@ top_builddir = @top_builddir@ CPP_TEST_CASES += \ callback \ + director_stl \ + exception_partial_info \ + inout \ + li_cdata_carrays_cpp \ li_factory \ php_iterator \ php_namewarn_rename \ php_pragma \ + prefix \ + +C_TEST_CASES += \ + li_cdata_carrays \ + multivalue \ include $(srcdir)/../common.mk @@ -62,9 +71,9 @@ missingtests: missingcpptests missingctests # found, runs testcase.php, except for multicpptests. run_testcase = \ if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ - $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) RUNTOOL='$(RUNTOOL)' php_run; \ + $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_EXTENSION=$(TARGETPREFIX)$*@PHP_SO@ PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) RUNTOOL='$(RUNTOOL)' php_run; \ elif [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*.php -a ! -f $(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)/$*.list ]; then \ - $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*.php RUNTOOL='$(RUNTOOL)' php_run; \ + $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_EXTENSION=$(TARGETPREFIX)$*@PHP_SO@ PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*.php RUNTOOL='$(RUNTOOL)' php_run; \ fi # Clean: remove the generated .php file @@ -79,3 +88,4 @@ clean: rm -f mod_a.php mod_b.php php_mod_a.h php_mod_b.h rm -f multi_import_a.php multi_import_b.php php_multi_import_a.h php_multi_import_b.h rm -f packageoption_a.php packageoption_b.php packageoption_c.php php_packageoption_a.h php_packageoption_b.h php_packageoption_c.h + rm -f template_typedef_cplx2.php php_template_typedef_cplx2.h diff --git a/Examples/test-suite/php/abstract_inherit_ok_runme.php b/Examples/test-suite/php/abstract_inherit_ok_runme.php index c2c343dac..6cfea2341 100644 --- a/Examples/test-suite/php/abstract_inherit_ok_runme.php +++ b/Examples/test-suite/php/abstract_inherit_ok_runme.php @@ -1,7 +1,6 @@ blah(),"spam object method"); check::done(); -?> diff --git a/Examples/test-suite/php/abstract_inherit_runme.php b/Examples/test-suite/php/abstract_inherit_runme.php index 514bbc3b0..6a0180d78 100644 --- a/Examples/test-suite/php/abstract_inherit_runme.php +++ b/Examples/test-suite/php/abstract_inherit_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/add_link_runme.php b/Examples/test-suite/php/add_link_runme.php index 3e16fa1df..073dee36d 100644 --- a/Examples/test-suite/php/add_link_runme.php +++ b/Examples/test-suite/php/add_link_runme.php @@ -1,10 +1,9 @@ diff --git a/Examples/test-suite/php/argout_runme.php b/Examples/test-suite/php/argout_runme.php index 8b66613fd..d233cf0f6 100644 --- a/Examples/test-suite/php/argout_runme.php +++ b/Examples/test-suite/php/argout_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/arrayptr_runme.php b/Examples/test-suite/php/arrayptr_runme.php deleted file mode 100644 index 86b7f8628..000000000 --- a/Examples/test-suite/php/arrayptr_runme.php +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/Examples/test-suite/php/arrays_global_runme.php b/Examples/test-suite/php/arrays_global_runme.php index 95a300775..6a97db91e 100644 --- a/Examples/test-suite/php/arrays_global_runme.php +++ b/Examples/test-suite/php/arrays_global_runme.php @@ -1,11 +1,11 @@ diff --git a/Examples/test-suite/php/arrays_global_twodim_runme.php b/Examples/test-suite/php/arrays_global_twodim_runme.php index d9f50a6de..e6fbf52d9 100644 --- a/Examples/test-suite/php/arrays_global_twodim_runme.php +++ b/Examples/test-suite/php/arrays_global_twodim_runme.php @@ -1,11 +1,11 @@ diff --git a/Examples/test-suite/php/arrays_runme.php b/Examples/test-suite/php/arrays_runme.php index c6e9e8f70..eb06fbfd8 100644 --- a/Examples/test-suite/php/arrays_runme.php +++ b/Examples/test-suite/php/arrays_runme.php @@ -1,10 +1,10 @@ array_c,"a",'$as->array_c=="a"'); check::equal(isset($as->array_const_i),TRUE,'isset($as->array_const_i)'); check::done(); -?> diff --git a/Examples/test-suite/php/arrays_scope_runme.php b/Examples/test-suite/php/arrays_scope_runme.php index 11c180870..f18037ca7 100644 --- a/Examples/test-suite/php/arrays_scope_runme.php +++ b/Examples/test-suite/php/arrays_scope_runme.php @@ -1,16 +1,14 @@ diff --git a/Examples/test-suite/php/callback_runme.php b/Examples/test-suite/php/callback_runme.php index fefa32502..717185649 100644 --- a/Examples/test-suite/php/callback_runme.php +++ b/Examples/test-suite/php/callback_runme.php @@ -1,9 +1,10 @@ diff --git a/Examples/test-suite/php/casts_runme.php b/Examples/test-suite/php/casts_runme.php index a9623a328..6234f0fab 100644 --- a/Examples/test-suite/php/casts_runme.php +++ b/Examples/test-suite/php/casts_runme.php @@ -1,13 +1,12 @@ hello(); check::done(); -?> diff --git a/Examples/test-suite/php/char_strings_runme.php b/Examples/test-suite/php/char_strings_runme.php index e06ee9d2b..7dc8fe74d 100644 --- a/Examples/test-suite/php/char_strings_runme.php +++ b/Examples/test-suite/php/char_strings_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/class_ignore_runme.php b/Examples/test-suite/php/class_ignore_runme.php index ae4881f27..f52bc1a13 100644 --- a/Examples/test-suite/php/class_ignore_runme.php +++ b/Examples/test-suite/php/class_ignore_runme.php @@ -1,9 +1,8 @@ diff --git a/Examples/test-suite/php/conversion_namespace_runme.php b/Examples/test-suite/php/conversion_namespace_runme.php index e21ff7438..858bf89d9 100644 --- a/Examples/test-suite/php/conversion_namespace_runme.php +++ b/Examples/test-suite/php/conversion_namespace_runme.php @@ -1,7 +1,6 @@ toFoo(); check::classname("foo",$foo); check::done(); -?> diff --git a/Examples/test-suite/php/conversion_ns_template_runme.php b/Examples/test-suite/php/conversion_ns_template_runme.php index 9702eedb7..4157b106a 100644 --- a/Examples/test-suite/php/conversion_ns_template_runme.php +++ b/Examples/test-suite/php/conversion_ns_template_runme.php @@ -1,10 +1,8 @@ diff --git a/Examples/test-suite/php/conversion_runme.php b/Examples/test-suite/php/conversion_runme.php index 1a10ff4f4..858bf89d9 100644 --- a/Examples/test-suite/php/conversion_runme.php +++ b/Examples/test-suite/php/conversion_runme.php @@ -1,7 +1,6 @@ toFoo(); check::classname("foo",$foo); check::done(); -?> diff --git a/Examples/test-suite/php/cpp11_strongly_typed_enumerations_runme.php b/Examples/test-suite/php/cpp11_strongly_typed_enumerations_runme.php index bee59b209..82296deb7 100644 --- a/Examples/test-suite/php/cpp11_strongly_typed_enumerations_runme.php +++ b/Examples/test-suite/php/cpp11_strongly_typed_enumerations_runme.php @@ -1,7 +1,6 @@ class1Test2(Class1::Enum12_Val5c), 1121); enumCheck(globalTest1(Enum1_Val5a), 13); enumCheck(globalTest2(Class1::Enum12_Val5c), 1121); #enumCheck(globalTest3(Class1::Struct1.Enum12_Val5f), 3121); - -?> diff --git a/Examples/test-suite/php/cpp_basic_runme.php b/Examples/test-suite/php/cpp_basic_runme.php index b24cf7000..fb34bc936 100644 --- a/Examples/test-suite/php/cpp_basic_runme.php +++ b/Examples/test-suite/php/cpp_basic_runme.php @@ -1,14 +1,13 @@ func_ptr = get_func1_ptr(); @@ -16,5 +15,12 @@ check::equal(test_func_ptr($f, 7), 2*7*3, "get_func1_ptr() didn't work"); $f->func_ptr = get_func2_ptr(); check::equal(test_func_ptr($f, 7), -7*3, "get_func2_ptr() didn't work"); +// Test that custom properties work - standard PHP objects support them, +// so PHP developers will expect them to work for SWIG-wrapped objects too. +check::equal($f->custom_prop, NULL, "Test unset custom property"); +$f->custom_prop = "test"; +check::equal($f->custom_prop, "test", "Test custom property setting"); +$f->custom_prop = 42; +check::equal($f->custom_prop, 42, "Test custom property setting"); + check::done(); -?> diff --git a/Examples/test-suite/php/cpp_static_runme.php b/Examples/test-suite/php/cpp_static_runme.php index 20b50dd9e..a1fd85c2e 100644 --- a/Examples/test-suite/php/cpp_static_runme.php +++ b/Examples/test-suite/php/cpp_static_runme.php @@ -1,14 +1,12 @@ diff --git a/Examples/test-suite/php/director_abstract_runme.php b/Examples/test-suite/php/director_abstract_runme.php index 1a119cfd5..bb424f9ea 100644 --- a/Examples/test-suite/php/director_abstract_runme.php +++ b/Examples/test-suite/php/director_abstract_runme.php @@ -1,13 +1,12 @@ isAbstract(), true, "Example3_i abstractness failed"); check::done(); -?> diff --git a/Examples/test-suite/php/director_basic_runme.php b/Examples/test-suite/php/director_basic_runme.php index 478a36f80..db7adefc1 100644 --- a/Examples/test-suite/php/director_basic_runme.php +++ b/Examples/test-suite/php/director_basic_runme.php @@ -1,14 +1,12 @@ x, 34, "bc failed"); check::equal($bd->x, 16, "bd failed"); check::done(); -?> diff --git a/Examples/test-suite/php/director_classic_runme.php b/Examples/test-suite/php/director_classic_runme.php index a44881e04..e2ac1f7a7 100644 --- a/Examples/test-suite/php/director_classic_runme.php +++ b/Examples/test-suite/php/director_classic_runme.php @@ -1,13 +1,12 @@ id(); if ($debug) print $ret . "\n"; - # TODO: Currently we do not track the dynamic type of returned - # objects, so in case it's possible that the dynamic type is not equal - # to the static type, we skip this check. - if (get_parent_class($person) === false) - check::equal($ret, $expected, "#3 failed"); + check::equal($ret, $expected, "#3 failed"); $caller->resetCallback(); if ($debug) @@ -147,4 +142,3 @@ mycheck($person, "TargetLangOrphanChild"); unset($person); check::done(); -?> diff --git a/Examples/test-suite/php/director_default_runme.php b/Examples/test-suite/php/director_default_runme.php index c459ce3ec..92e415041 100644 --- a/Examples/test-suite/php/director_default_runme.php +++ b/Examples/test-suite/php/director_default_runme.php @@ -1,13 +1,12 @@ diff --git a/Examples/test-suite/php/director_detect_runme.php b/Examples/test-suite/php/director_detect_runme.php index a6d3aebd6..ae92f7a0c 100644 --- a/Examples/test-suite/php/director_detect_runme.php +++ b/Examples/test-suite/php/director_detect_runme.php @@ -1,13 +1,12 @@ val, 5, "b: Bad virtual detection"); check::equal($vc, 6, "c: Bad virtual detection"); check::done(); -?> diff --git a/Examples/test-suite/php/director_enum_runme.php b/Examples/test-suite/php/director_enum_runme.php index 0571ec0da..21e07a57b 100644 --- a/Examples/test-suite/php/director_enum_runme.php +++ b/Examples/test-suite/php/director_enum_runme.php @@ -1,13 +1,12 @@ say_hi(director_enum::hello), $b->say_hello(director_enum::hi), "say failed"); check::done(); -?> diff --git a/Examples/test-suite/php/director_exception_runme.php b/Examples/test-suite/php/director_exception_runme.php index dd2d04e8a..e49c12da6 100644 --- a/Examples/test-suite/php/director_exception_runme.php +++ b/Examples/test-suite/php/director_exception_runme.php @@ -1,13 +1,12 @@ pong(); @@ -124,4 +121,3 @@ try { } check::done(); -?> diff --git a/Examples/test-suite/php/director_extend_runme.php b/Examples/test-suite/php/director_extend_runme.php index 7aa2e0f78..418985476 100644 --- a/Examples/test-suite/php/director_extend_runme.php +++ b/Examples/test-suite/php/director_extend_runme.php @@ -1,13 +1,12 @@ dummy(), 666, "1st call"); check::equal($m->dummy(), 666, "2st call"); // Locked system check::done(); -?> diff --git a/Examples/test-suite/php/director_finalizer_runme.php b/Examples/test-suite/php/director_finalizer_runme.php index 96bb5c179..f3a0c2c40 100644 --- a/Examples/test-suite/php/director_finalizer_runme.php +++ b/Examples/test-suite/php/director_finalizer_runme.php @@ -1,18 +1,22 @@ orStatus(2); + # It's not safe to call methods on the C++ object from the PHP destructor + # if the object has been disowned, since the C++ object will already have + # been destroyed by the time the PHP destructor runs. + if ($this->thisown) { + $this->orStatus(2); + } if (method_exists(get_parent_class(), "__destruct")) { parent::__destruct(); } @@ -41,21 +45,24 @@ resetStatus(); $a = new MyFoo(); $a->thisown = 0; +check::equal(getStatus(), 0, "shadow release does not fire destructor of disowned object"); + deleteFoo($a); unset($a); -check::equal(getStatus(), 3, "getStatus() failed #4"); +# getStatus() would ideally return 3 here. +check::equal(getStatus(), 1, "getStatus() failed #4"); resetStatus(); $a = new MyFoo(); $a->thisown = 0; -deleteFoo(launder($a)); +$g = launder($a); unset($a); - -check::equal(getStatus(), 3, "getStatus() failed #5"); +deleteFoo($g); +# getStatus() would ideally return 3 here. +check::equal(getStatus(), 1, "getStatus() failed #5"); resetStatus(); check::done(); -?> diff --git a/Examples/test-suite/php/director_frob_runme.php b/Examples/test-suite/php/director_frob_runme.php index 450a1234b..732b9d500 100644 --- a/Examples/test-suite/php/director_frob_runme.php +++ b/Examples/test-suite/php/director_frob_runme.php @@ -1,14 +1,13 @@ abs_method(); @@ -16,4 +15,3 @@ $s = $foo->abs_method(); check::equal($s, "Bravo::abs_method()", "s failed"); check::done(); -?> diff --git a/Examples/test-suite/php/director_nested_runme.php b/Examples/test-suite/php/director_nested_runme.php index 9a094a182..adf9f6206 100644 --- a/Examples/test-suite/php/director_nested_runme.php +++ b/Examples/test-suite/php/director_nested_runme.php @@ -1,13 +1,12 @@ advance(); check::equal($c->get_name(), "FooBar::get_name hello", "get_name failed"); @@ -71,4 +67,3 @@ check::equal($c->get_name(), "FooBar::get_name hello", "get_name failed"); check::equal($c->name(), "FooBar::get_name hello", "name failed"); check::done(); -?> diff --git a/Examples/test-suite/php/director_overload_runme.php b/Examples/test-suite/php/director_overload_runme.php new file mode 100644 index 000000000..07b485d95 --- /dev/null +++ b/Examples/test-suite/php/director_overload_runme.php @@ -0,0 +1,14 @@ +rw(), 42, "get_set() initial value not 42"); +check::equal($o->rw(7), null, "get_set() failed to set"); +check::equal($o->rw(), 7, "get_set() didn't return back set value"); + +check::done(); diff --git a/Examples/test-suite/php/director_pass_by_value_runme.php b/Examples/test-suite/php/director_pass_by_value_runme.php index 8a8b84d67..d3763292f 100644 --- a/Examples/test-suite/php/director_pass_by_value_runme.php +++ b/Examples/test-suite/php/director_pass_by_value_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/director_profile_runme.php b/Examples/test-suite/php/director_profile_runme.php index c6f4c3c94..219ec815a 100644 --- a/Examples/test-suite/php/director_profile_runme.php +++ b/Examples/test-suite/php/director_profile_runme.php @@ -1,13 +1,12 @@ diff --git a/Examples/test-suite/php/director_protected_runme.php b/Examples/test-suite/php/director_protected_runme.php index e759fed25..b73c8f872 100644 --- a/Examples/test-suite/php/director_protected_runme.php +++ b/Examples/test-suite/php/director_protected_runme.php @@ -1,11 +1,12 @@ callping(), "Bar::ping();", "bad fb3::callping"); check::equal($fb3->callcheer(), "FooBar3::cheer();", "bad fb3::callcheer"); check::done(); -?> diff --git a/Examples/test-suite/php/director_stl_runme.php b/Examples/test-suite/php/director_stl_runme.php index f7a5c0aa0..654251a30 100644 --- a/Examples/test-suite/php/director_stl_runme.php +++ b/Examples/test-suite/php/director_stl_runme.php @@ -1,13 +1,12 @@ tvidents($vs);*/ check::done(); -?> diff --git a/Examples/test-suite/php/director_string_runme.php b/Examples/test-suite/php/director_string_runme.php index 77e84c9bf..3127f13fb 100644 --- a/Examples/test-suite/php/director_string_runme.php +++ b/Examples/test-suite/php/director_string_runme.php @@ -1,14 +1,13 @@ call_process_func(); check::equal($b->smem, "hello", "smem failed"); check::done(); -?> diff --git a/Examples/test-suite/php/director_thread_runme.php b/Examples/test-suite/php/director_thread_runme.php index 2a640a022..190dbad71 100644 --- a/Examples/test-suite/php/director_thread_runme.php +++ b/Examples/test-suite/php/director_thread_runme.php @@ -1,18 +1,17 @@ val >= 0) { $d->stop(); check::done(); -?> diff --git a/Examples/test-suite/php/director_unroll_runme.php b/Examples/test-suite/php/director_unroll_runme.php index e3101887d..7f94753f5 100644 --- a/Examples/test-suite/php/director_unroll_runme.php +++ b/Examples/test-suite/php/director_unroll_runme.php @@ -1,14 +1,13 @@ set($a); $c = $b->get(); -// FIXME: This doesn't work for checking that they wrap the same C++ object -// because the two objects have different PHP resources, and we can't easily -// look inside those resources to see which C++ objects they refer to. -//check::equal($a->_cPtr, $c->_cPtr, "_cPtr check failed"); +// FIXME: The python version checks that a.this == c.this, but we don't seem +// to have a way to check this with the PHP bindings we generate. check::done(); -?> diff --git a/Examples/test-suite/php/enum_scope_template_runme.php b/Examples/test-suite/php/enum_scope_template_runme.php index 85ba467b7..d5aed62f7 100644 --- a/Examples/test-suite/php/enum_scope_template_runme.php +++ b/Examples/test-suite/php/enum_scope_template_runme.php @@ -1,15 +1,16 @@ diff --git a/Examples/test-suite/php/evil_diamond_ns_runme.php b/Examples/test-suite/php/evil_diamond_ns_runme.php index fcce0f767..f2115bf36 100644 --- a/Examples/test-suite/php/evil_diamond_ns_runme.php +++ b/Examples/test-suite/php/evil_diamond_ns_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/evil_diamond_prop_runme.php b/Examples/test-suite/php/evil_diamond_prop_runme.php index 9bdb7435f..611f17d6a 100644 --- a/Examples/test-suite/php/evil_diamond_prop_runme.php +++ b/Examples/test-suite/php/evil_diamond_prop_runme.php @@ -1,7 +1,6 @@ _foo,"1==spam->_foo"); check::equal(2,$spam->_bar,"2==spam->_bar"); // multiple inheritance not supported in PHP -set_error_handler(NULL, 0); // Don't complain that _baz is unknown. check::equal(null,$spam->_baz,"null==spam->_baz"); -restore_error_handler(); check::equal(4,$spam->_spam,"4==spam->_spam"); check::done(); -?> diff --git a/Examples/test-suite/php/evil_diamond_runme.php b/Examples/test-suite/php/evil_diamond_runme.php index a587ca359..7d01c98ec 100644 --- a/Examples/test-suite/php/evil_diamond_runme.php +++ b/Examples/test-suite/php/evil_diamond_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/exception_order_runme.php b/Examples/test-suite/php/exception_order_runme.php index 77f115fa1..9a2c9118b 100644 --- a/Examples/test-suite/php/exception_order_runme.php +++ b/Examples/test-suite/php/exception_order_runme.php @@ -1,10 +1,9 @@ getMessage(), 'C++ E2 * exception thrown', ''); } -?> diff --git a/Examples/test-suite/php/extend_template_ns_runme.php b/Examples/test-suite/php/extend_template_ns_runme.php index e6d3e9f73..46158672b 100644 --- a/Examples/test-suite/php/extend_template_ns_runme.php +++ b/Examples/test-suite/php/extend_template_ns_runme.php @@ -1,7 +1,6 @@ test1(2),"test1"); check::equal(3,$foo->test2(3),"test2"); check::done(); -?> diff --git a/Examples/test-suite/php/extend_template_runme.php b/Examples/test-suite/php/extend_template_runme.php index 41bde4458..a6579dce9 100644 --- a/Examples/test-suite/php/extend_template_runme.php +++ b/Examples/test-suite/php/extend_template_runme.php @@ -1,7 +1,6 @@ test1(2),"test1"); check::equal(3,$foo->test2(3),"test2"); check::done(); -?> diff --git a/Examples/test-suite/php/global_vars_runme.php b/Examples/test-suite/php/global_vars_runme.php new file mode 100644 index 000000000..c3fe7d8aa --- /dev/null +++ b/Examples/test-suite/php/global_vars_runme.php @@ -0,0 +1,27 @@ + diff --git a/Examples/test-suite/php/ignore_parameter_runme.php b/Examples/test-suite/php/ignore_parameter_runme.php index b9c2b777d..d9db2d795 100644 --- a/Examples/test-suite/php/ignore_parameter_runme.php +++ b/Examples/test-suite/php/ignore_parameter_runme.php @@ -1,10 +1,9 @@ diff --git a/Examples/test-suite/php/import_nomodule_runme.php b/Examples/test-suite/php/import_nomodule_runme.php index e5ea761f7..e639c781d 100644 --- a/Examples/test-suite/php/import_nomodule_runme.php +++ b/Examples/test-suite/php/import_nomodule_runme.php @@ -1,14 +1,16 @@ diff --git a/Examples/test-suite/php/li_carrays_cpp_runme.php b/Examples/test-suite/php/li_carrays_cpp_runme.php index 3e8a443f6..ccbcf7dde 100644 --- a/Examples/test-suite/php/li_carrays_cpp_runme.php +++ b/Examples/test-suite/php/li_carrays_cpp_runme.php @@ -1,16 +1,16 @@ setitem(5, $d->getitem(0) + 3); check::equal($d->getitem(0) + $d->getitem(5), 17., "7+10==17"); check::done(); -?> diff --git a/Examples/test-suite/php/li_carrays_runme.php b/Examples/test-suite/php/li_carrays_runme.php index abe358101..df54e04f5 100644 --- a/Examples/test-suite/php/li_carrays_runme.php +++ b/Examples/test-suite/php/li_carrays_runme.php @@ -1,16 +1,16 @@ setitem(5, $d->getitem(0) + 3); check::equal($d->getitem(0) + $d->getitem(5), 17., "7+10==17"); check::done(); -?> diff --git a/Examples/test-suite/php/li_factory_runme.php b/Examples/test-suite/php/li_factory_runme.php index 982d7b1fd..3ccdd035f 100644 --- a/Examples/test-suite/php/li_factory_runme.php +++ b/Examples/test-suite/php/li_factory_runme.php @@ -1,13 +1,12 @@ width(); check::equal($w, 1.0, "w failed"); check::done(); -?> diff --git a/Examples/test-suite/php/li_std_string_runme.php b/Examples/test-suite/php/li_std_string_runme.php index 04ee3fc86..680b7ce98 100644 --- a/Examples/test-suite/php/li_std_string_runme.php +++ b/Examples/test-suite/php/li_std_string_runme.php @@ -1,11 +1,34 @@ ConstMemberString, "const member string", "ConstMembe check::equal(Structure::StaticMemberString2(), "static member string 2", "StaticMemberString2 test 1"); Structure::StaticMemberString2($s); check::equal(Structure::StaticMemberString2(), $s, "StaticMemberString2 test 2"); -// below broken ? -//check::equal(Structure::ConstStaticMemberString(), "const static member string", "ConstStaticMemberString test"); +check::equal(Structure::ConstStaticMemberString(), "const static member string", "ConstStaticMemberString test"); // This used to give "Undefined variable: r" li_std_string::test_const_reference_returning_void("foo"); check::done(); -?> diff --git a/Examples/test-suite/php/li_std_vector_member_var_runme.php b/Examples/test-suite/php/li_std_vector_member_var_runme.php index 238350352..32ce484fc 100644 --- a/Examples/test-suite/php/li_std_vector_member_var_runme.php +++ b/Examples/test-suite/php/li_std_vector_member_var_runme.php @@ -1,7 +1,6 @@ start_t->x, 4, "S::x != 4"); check::equal($T->length, 7, "T::length != 7"); check::done(); -?> diff --git a/Examples/test-suite/php/member_pointer_const_runme.php b/Examples/test-suite/php/member_pointer_const_runme.php new file mode 100644 index 000000000..3f55549a8 --- /dev/null +++ b/Examples/test-suite/php/member_pointer_const_runme.php @@ -0,0 +1,59 @@ +makeMore(); check::equal(get_class($bar), "Foo", "regular failed"); check::done(); -?> diff --git a/Examples/test-suite/php/newobject3_runme.php b/Examples/test-suite/php/newobject3_runme.php index edd5d8608..8efa9891d 100644 --- a/Examples/test-suite/php/newobject3_runme.php +++ b/Examples/test-suite/php/newobject3_runme.php @@ -1,7 +1,6 @@ create(0), "create(0) should be NULL"); check::isnull($factory->create(7, -1), "create(7, -1) should be NULL"); check::isnull($factory->create(0, -1), "create(0, -1) should be NULL"); check::isnull($factory->create("bad", -1), "create(\"bad\", -1) should be NULL"); - -?> diff --git a/Examples/test-suite/php/overload_null_runme.php b/Examples/test-suite/php/overload_null_runme.php index 22824d4fb..b4b28e44f 100644 --- a/Examples/test-suite/php/overload_null_runme.php +++ b/Examples/test-suite/php/overload_null_runme.php @@ -1,7 +1,6 @@ byval1forwardref($x), "test 21"); check::equal(22, $o->byval2forwardref($x), "test 22"); check::done(); -?> diff --git a/Examples/test-suite/php/overload_polymorphic_runme.php b/Examples/test-suite/php/overload_polymorphic_runme.php new file mode 100644 index 000000000..908988291 --- /dev/null +++ b/Examples/test-suite/php/overload_polymorphic_runme.php @@ -0,0 +1,12 @@ + diff --git a/Examples/test-suite/php/overload_return_type_runme.php b/Examples/test-suite/php/overload_return_type_runme.php index 4fa19d22a..5f01bbe19 100644 --- a/Examples/test-suite/php/overload_return_type_runme.php +++ b/Examples/test-suite/php/overload_return_type_runme.php @@ -1,7 +1,6 @@ foo(1), 0, ""); @@ -9,5 +8,3 @@ check::classname("A", $b->foo("test")); check::equal(overload_return_type::foo(), 1, "overload_return_type::foo() should be 1"); check::equal(overload_return_type::bar(), 1, "overload_return_type::bar() should be 1"); - -?> diff --git a/Examples/test-suite/php/php_iterator_runme.php b/Examples/test-suite/php/php_iterator_runme.php index fd645ccb2..76b4757fc 100644 --- a/Examples/test-suite/php/php_iterator_runme.php +++ b/Examples/test-suite/php/php_iterator_runme.php @@ -1,9 +1,9 @@ $v) { check::equal($s, '(0=>2)(1=>3)(2=>4)', 'Simple iteration failed'); check::done(); -?> diff --git a/Examples/test-suite/php/php_pragma_runme.php b/Examples/test-suite/php/php_pragma_runme.php index c76cfc9b5..e70f2ceda 100644 --- a/Examples/test-suite/php/php_pragma_runme.php +++ b/Examples/test-suite/php/php_pragma_runme.php @@ -1,11 +1,7 @@ getVersion(),"1.5==version(php_pragma)"); check::done(); - -?> diff --git a/Examples/test-suite/php/pointer_reference_runme.php b/Examples/test-suite/php/pointer_reference_runme.php index 52946177e..a8a511271 100644 --- a/Examples/test-suite/php/pointer_reference_runme.php +++ b/Examples/test-suite/php/pointer_reference_runme.php @@ -1,7 +1,6 @@ value, 10, "pointer_reference::get() failed"); @@ -15,4 +14,3 @@ check::equal(pointer_reference::overloading(1), 111, "overload test 1 failed"); check::equal(pointer_reference::overloading($ss), 222, "overload test 2 failed"); check::done(); -?> diff --git a/Examples/test-suite/php/prefix_runme.php b/Examples/test-suite/php/prefix_runme.php index fcf7c66f6..d1c0ab1ea 100644 --- a/Examples/test-suite/php/prefix_runme.php +++ b/Examples/test-suite/php/prefix_runme.php @@ -1,13 +1,12 @@ get_self(); check::done(); -?> diff --git a/Examples/test-suite/php/preproc_constants_c_runme.php b/Examples/test-suite/php/preproc_constants_c_runme.php index 20868dcc0..a26892b42 100644 --- a/Examples/test-suite/php/preproc_constants_c_runme.php +++ b/Examples/test-suite/php/preproc_constants_c_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/preproc_constants_runme.php b/Examples/test-suite/php/preproc_constants_runme.php index bd216c269..7f45a1bae 100644 --- a/Examples/test-suite/php/preproc_constants_runme.php +++ b/Examples/test-suite/php/preproc_constants_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/primitive_ref_runme.php b/Examples/test-suite/php/primitive_ref_runme.php index 263a28074..9b281cf50 100644 --- a/Examples/test-suite/php/primitive_ref_runme.php +++ b/Examples/test-suite/php/primitive_ref_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/rename_scope_runme.php b/Examples/test-suite/php/rename_scope_runme.php index df620d796..e1db4f59c 100644 --- a/Examples/test-suite/php/rename_scope_runme.php +++ b/Examples/test-suite/php/rename_scope_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/skel.php b/Examples/test-suite/php/skel.php index 780a999ed..7fdebc7d6 100644 --- a/Examples/test-suite/php/skel.php +++ b/Examples/test-suite/php/skel.php @@ -2,14 +2,12 @@ // Sample test file require "tests.php"; -require "____.php"; // No new functions check::functions(array()); // No new classes check::classes(array()); -// now new vars +// No new vars check::globals(array()); check::done(); -?> diff --git a/Examples/test-suite/php/smart_pointer_rename_runme.php b/Examples/test-suite/php/smart_pointer_rename_runme.php index 26692dde5..094860386 100644 --- a/Examples/test-suite/php/smart_pointer_rename_runme.php +++ b/Examples/test-suite/php/smart_pointer_rename_runme.php @@ -1,7 +1,6 @@ test(),"bar->test"); check::classname("foo",$bar->__deref__()); check::done(); -?> diff --git a/Examples/test-suite/php/swig_exception_runme.php b/Examples/test-suite/php/swig_exception_runme.php index 76641996e..37a7a59ee 100644 --- a/Examples/test-suite/php/swig_exception_runme.php +++ b/Examples/test-suite/php/swig_exception_runme.php @@ -1,6 +1,5 @@ diff --git a/Examples/test-suite/php/sym_runme.php b/Examples/test-suite/php/sym_runme.php index 127d28fd9..7e8f914c1 100644 --- a/Examples/test-suite/php/sym_runme.php +++ b/Examples/test-suite/php/sym_runme.php @@ -1,13 +1,12 @@ jam(),"flam-jam","flam()->jam==flam-jam"); check::equal($flam->jar(),"flam-jar","flam()->jar==flam-jar"); check::done(); -?> diff --git a/Examples/test-suite/php/template_arg_typename_runme.php b/Examples/test-suite/php/template_arg_typename_runme.php index e609240e7..c7fcbbd9d 100644 --- a/Examples/test-suite/php/template_arg_typename_runme.php +++ b/Examples/test-suite/php/template_arg_typename_runme.php @@ -1,7 +1,6 @@ diff --git a/Examples/test-suite/php/template_construct_runme.php b/Examples/test-suite/php/template_construct_runme.php index b227d9fec..d09bc4d37 100644 --- a/Examples/test-suite/php/template_construct_runme.php +++ b/Examples/test-suite/php/template_construct_runme.php @@ -1,11 +1,9 @@ diff --git a/Examples/test-suite/php/tests.php b/Examples/test-suite/php/tests.php index 20fa1ed98..cec6e581f 100644 --- a/Examples/test-suite/php/tests.php +++ b/Examples/test-suite/php/tests.php @@ -1,86 +1,24 @@ getClassNames(), + function ($e) { return !preg_match('/^SWIG\\\\/', $e); })); foreach($classes as $class) { if (! class_exists($class)) $missing[]=$class; else unset($extra[$class]); @@ -164,15 +103,16 @@ class check { if (! is_array($functions)) $functions=array($functions); $message=array(); $missing=array(); - $extra=array_flip(check::get_extra_functions()); - + $extra = self::$_extension->getFunctions(); foreach ($functions as $func) { if (! function_exists($func)) $missing[]=$func; else unset($extra[$func]); } + $extra = array_filter(array_keys($extra), + function ($e) { return !preg_match('/_[gs]et$/', $e); }); if ($missing) $message[]=sprintf("Functions missing: %s",join(",",$missing)); if ($message) return check::fail(join("\n ",$message)); - if ($extra) $message[]=sprintf("These extra functions are defined: %s",join(",",array_keys($extra))); + if ($extra) $message[]=sprintf("These extra functions are defined: %s",join(",",$extra)); if ($message) return check::warn(join("\n ",$message)); return TRUE; } @@ -181,19 +121,19 @@ class check { if (! is_array($globals)) $globals=array($globals); $message=array(); $missing=array(); - $extra=array_flip(check::get_extra_globals()); + $extra = self::$_extension->getFunctions(); foreach ($globals as $glob) { - if (self::GETSET) { - if (! isset($extra[$glob])) $missing[]=$glob; - else unset($extra[$glob]); - } else { - if (! isset($GLOBALS[$glob])) $missing[]=$glob; - else unset($extra[$glob]); + if (! function_exists($glob . "_get") && ! function_exists($glob . "_set")) $missing[]=$glob; + else { + unset($extra[$glob . "_get"]); + unset($extra[$glob . "_set"]); } } + $extra = array_filter(array_keys($extra), + function ($e) { return preg_match('/_[gs]et$/', $e); }); if ($missing) $message[]=sprintf("Globals missing: %s",join(",",$missing)); if ($message) return check::fail(join("\n ",$message)); - if ($extra) $message[]=sprintf("These extra globals are defined: %s",join(",",array_keys($extra))); + if ($extra) $message[]=sprintf("These extra globals are defined: %s",join(",",$extra)); if ($message) return check::warn(join("\n ",$message)); return TRUE; @@ -210,24 +150,13 @@ class check { return TRUE; } - static function resource($a,$b,$message) { - $resource=trim(check::var_dump($a)); - if (! preg_match("/^resource\([0-9]+\) of type \($b\)/i", $resource)) - return check::fail($message); + static function equivalent($a,$b,$message) { + if (! ($a==$b)) return check::fail($message . ": '$a'!='$b'"); return TRUE; } static function isnull($a,$message) { - $value=trim(check::var_dump($a)); - return check::equal($value,"NULL",$message); - } - - static function var_dump($arg) { - ob_start(); - var_dump($arg); - $result=ob_get_contents(); - ob_end_clean(); - return $result; + return check::equal($a,NULL,$message); } static function fail($pattern) { @@ -246,4 +175,5 @@ class check { # print $_SERVER[argv][0]." ok\n"; } } -?> + +check::init(); diff --git a/Examples/test-suite/php/threads_exception_runme.php b/Examples/test-suite/php/threads_exception_runme.php index 80717eb88..38873dffd 100644 --- a/Examples/test-suite/php/threads_exception_runme.php +++ b/Examples/test-suite/php/threads_exception_runme.php @@ -1,14 +1,13 @@ diff --git a/Examples/test-suite/php/typemap_ns_using_runme.php b/Examples/test-suite/php/typemap_ns_using_runme.php index 6a599f008..e15427856 100644 --- a/Examples/test-suite/php/typemap_ns_using_runme.php +++ b/Examples/test-suite/php/typemap_ns_using_runme.php @@ -1,9 +1,8 @@ diff --git a/Examples/test-suite/php/using1_runme.php b/Examples/test-suite/php/using1_runme.php index 51841bc78..e15427856 100644 --- a/Examples/test-suite/php/using1_runme.php +++ b/Examples/test-suite/php/using1_runme.php @@ -1,9 +1,8 @@ diff --git a/Examples/test-suite/php/using2_runme.php b/Examples/test-suite/php/using2_runme.php index 391a98f52..e15427856 100644 --- a/Examples/test-suite/php/using2_runme.php +++ b/Examples/test-suite/php/using2_runme.php @@ -1,9 +1,8 @@ diff --git a/Examples/test-suite/php/valuewrapper_base_runme.php b/Examples/test-suite/php/valuewrapper_base_runme.php index 6a1abdbd2..3f4c38e5b 100644 --- a/Examples/test-suite/php/valuewrapper_base_runme.php +++ b/Examples/test-suite/php/valuewrapper_base_runme.php @@ -1,13 +1,11 @@ diff --git a/Examples/test-suite/php/virtual_vs_nonvirtual_base_runme.php b/Examples/test-suite/php/virtual_vs_nonvirtual_base_runme.php index 0d4aa3d5f..abfb4d307 100644 --- a/Examples/test-suite/php/virtual_vs_nonvirtual_base_runme.php +++ b/Examples/test-suite/php/virtual_vs_nonvirtual_base_runme.php @@ -1,11 +1,8 @@ getInner()->get(), $fail->getInner()->get(), "should both be 10"); - -?> diff --git a/Examples/test-suite/php/wrapmacro_runme.php b/Examples/test-suite/php/wrapmacro_runme.php index f32da990e..18b2ef1e1 100644 --- a/Examples/test-suite/php/wrapmacro_runme.php +++ b/Examples/test-suite/php/wrapmacro_runme.php @@ -1,12 +1,10 @@ diff --git a/Examples/test-suite/php_namewarn_rename.i b/Examples/test-suite/php_namewarn_rename.i index d84e2196f..bb54dba5e 100644 --- a/Examples/test-suite/php_namewarn_rename.i +++ b/Examples/test-suite/php_namewarn_rename.i @@ -5,6 +5,9 @@ %warnfilter(SWIGWARN_PARSE_KEYWORD) stdClass; %warnfilter(SWIGWARN_PARSE_KEYWORD) directory; %warnfilter(SWIGWARN_PARSE_KEYWORD) Hello::empty(); +%warnfilter(SWIGWARN_PARSE_KEYWORD) null; +%warnfilter(SWIGWARN_PARSE_KEYWORD) True; +%warnfilter(SWIGWARN_PARSE_KEYWORD) FALSE; #endif %ignore prev::operator++; @@ -36,4 +39,15 @@ prev operator++(int) { return *this; } }; + class null + { + }; + + class True + { + }; + + class FALSE + { + }; %} diff --git a/Examples/test-suite/pike/Makefile.in b/Examples/test-suite/pike/Makefile.in deleted file mode 100644 index 6e1bdfbff..000000000 --- a/Examples/test-suite/pike/Makefile.in +++ /dev/null @@ -1,49 +0,0 @@ -####################################################################### -# Makefile for Pike test-suite -####################################################################### - -LANGUAGE = pike -PIKE = pike -SCRIPTSUFFIX = _runme.pike - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -top_builddir = @top_builddir@ - -include $(srcdir)/../common.mk - -# Overridden variables here -# none! - -# Custom tests - tests with additional commandline options -# none! - -# Rules for the different types of tests -%.cpptest: - $(setup) - +$(swig_and_compile_cpp) - $(run_testcase) - -%.ctest: - $(setup) - +$(swig_and_compile_c) - $(run_testcase) - -%.multicpptest: - $(setup) - +$(swig_and_compile_multi_cpp) - $(run_testcase) - -# Runs the testcase. A testcase is only run if -# a file is found which has _runme.pike appended after the testcase name. -run_testcase = \ - if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ - env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(PIKE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ - fi - -# Clean: remove the generated .pike file -%.clean: - @rm -f $*.pike; - -clean: - $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' pike_clean diff --git a/Examples/test-suite/prefix.i b/Examples/test-suite/prefix.i index b0cb31205..90cdf5593 100644 --- a/Examples/test-suite/prefix.i +++ b/Examples/test-suite/prefix.i @@ -11,4 +11,10 @@ public: } }; +// This failed in git pre 4.1.0 - the calls to the parent class' magic __get, +// __set and __isset methods weren't getting the prefix. +class Bar : public Foo { +public: +}; + %} diff --git a/Examples/test-suite/preproc.i b/Examples/test-suite/preproc.i index 215fdd0ef..1bcdcf7ac 100644 --- a/Examples/test-suite/preproc.i +++ b/Examples/test-suite/preproc.i @@ -298,11 +298,6 @@ inline const char* mangle_macro ## #@__VA_ARGS__ () { /* chiao */ #endif; -#ifdef SWIGCHICKEN -/* define is a scheme keyword (and thus an invalid variable name), so SWIG warns about it */ -%warnfilter(SWIGWARN_PARSE_KEYWORD) define; -#endif - #ifdef SWIGRUBY %rename(ddefined) defined; #endif diff --git a/Examples/test-suite/private_assign.i b/Examples/test-suite/private_assign.i index acc4d0bc9..d9ba70cf4 100644 --- a/Examples/test-suite/private_assign.i +++ b/Examples/test-suite/private_assign.i @@ -14,6 +14,8 @@ return *this; } public: + Foo() { } + Foo(const Foo &f) { } // copy ctor can still be public, however. void bar() { } }; diff --git a/Examples/test-suite/python/Makefile.in b/Examples/test-suite/python/Makefile.in index be06f7e51..0bdbad51e 100644 --- a/Examples/test-suite/python/Makefile.in +++ b/Examples/test-suite/python/Makefile.in @@ -10,19 +10,9 @@ endif LANGUAGE = python PYTHON = $(PYBIN) +SCRIPTSUFFIX = _runme.py PYCODESTYLE = @PYCODESTYLE@ -PYCODESTYLE_FLAGS = --ignore=E252,E30,E402,E501,E731,W291,W391 - -#*_runme.py for Python 2.x, *_runme3.py for Python 3.x -PY2SCRIPTSUFFIX = _runme.py -PY3SCRIPTSUFFIX = _runme3.py -PY2TO3 = @PY2TO3@ -x import - -ifeq (,$(PY3)) - SCRIPTSUFFIX = $(PY2SCRIPTSUFFIX) -else - SCRIPTSUFFIX = $(PY3SCRIPTSUFFIX) -endif +PYCODESTYLE_FLAGS = --ignore=E252,E30,E402,E501,E731,E741,W291,W391 srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -85,6 +75,7 @@ CPP11_TEST_CASES = \ cpp11_shared_ptr_const \ cpp11_shared_ptr_nullptr_in_containers \ cpp11_shared_ptr_overload \ + cpp11_shared_ptr_template_upcast \ cpp11_shared_ptr_upcast \ cpp11_std_unordered_map \ cpp11_std_unordered_multimap \ @@ -92,22 +83,16 @@ CPP11_TEST_CASES = \ cpp11_std_unordered_set \ C_TEST_CASES += \ + ccomplextest \ file_test \ li_cstring \ li_cwstring \ python_nondynamic \ python_varargs_typemap \ -# -# This test only works with modern C compilers -# -#C_TEST_CASES += \ -# complextest - include $(srcdir)/../common.mk # Overridden variables here -SCRIPTDIR = . LIBS = -L. VALGRIND_OPT += --suppressions=pythonswig.supp @@ -116,35 +101,25 @@ VALGRIND_OPT += --suppressions=pythonswig.supp # Rules for the different types of tests %.cpptest: - +$(convert_testcase) $(setup) +$(swig_and_compile_cpp) $(check_pep8) $(run_testcase) %.ctest: - +$(convert_testcase) $(setup) +$(swig_and_compile_c) $(check_pep8) $(run_testcase) %.multicpptest: - +$(convert_testcase) $(setup) +$(swig_and_compile_multi_cpp) $(check_pep8_multi_cpp) $(run_testcase) - -# Runs the testcase. A testcase is only run if -# a file is found which has _runme.py (or _runme3.py for Python 3) appended after the testcase name. - -py_runme = $(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) -py2_runme = $(SCRIPTPREFIX)$*$(PY2SCRIPTSUFFIX) -py3_runme = $(SCRIPTPREFIX)$*$(PY3SCRIPTSUFFIX) - +# Python code style checking ifneq (,$(PYCODESTYLE)) check_pep8 = $(COMPILETOOL) $(PYCODESTYLE) $(PYCODESTYLE_FLAGS) $(SCRIPTPREFIX)$*.py @@ -154,77 +129,24 @@ check_pep8_multi_cpp = \ done endif -run_python = env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PYTHONPATH=.:$(srcdir):$$PYTHONPATH $(RUNTOOL) $(PYTHON) $(py_runme) - +# Runs the testcase. A testcase is only run if +# a file is found which has _runme.py appended after the testcase name. run_testcase = \ - if [ -f $(SCRIPTDIR)/$(py_runme) ]; then \ - $(run_python);\ + if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PYTHONPATH=.:$(srcdir):$$PYTHONPATH $(RUNTOOL) $(PYTHON) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ fi -# Grab runme file ready for running: copied for out of source tree builds, and/or run 2to3 -# Note terminal (double colon) rules creating runme files to fix possible infinite recursion, -# see https://github.com/swig/swig/pull/688 -ifeq ($(SCRIPTDIR),$(srcdir)) - # in source tree build - ifeq (,$(PY3)) - convert_testcase = - else - convert_testcase = \ - if [ -f $(srcdir)/$(py2_runme) ]; then \ - $(MAKE) $(SCRIPTDIR)/$(py_runme); \ - fi - -# For converting python 2 tests into Python 3 tests -$(SCRIPTDIR)/$(SCRIPTPREFIX)%$(SCRIPTSUFFIX):: $(srcdir)/$(SCRIPTPREFIX)%$(PY2SCRIPTSUFFIX) - cp $< $@ - $(PY2TO3) -w $@ >/dev/null 2>&1 - - endif -else - # out of source tree build - ifeq (,$(PY3)) - convert_testcase = \ - if [ -f $(srcdir)/$(py2_runme) ]; then \ - $(MAKE) $(SCRIPTDIR)/$(py_runme); \ - fi - -$(SCRIPTDIR)/$(SCRIPTPREFIX)%$(SCRIPTSUFFIX):: $(srcdir)/$(SCRIPTPREFIX)%$(PY2SCRIPTSUFFIX) - cp $< $@ - - else - convert_testcase = \ - if [ -f $(srcdir)/$(py2_runme) ]; then \ - $(MAKE) $(SCRIPTDIR)/$(py_runme); \ - elif [ -f $(srcdir)/$(py3_runme) ]; then \ - $(MAKE) $(SCRIPTDIR)/$(py3_runme); \ - fi - -# For when there is a _runme3.py instead of a _runme.py, ie a Python 3 only run test -$(SCRIPTDIR)/$(SCRIPTPREFIX)%$(SCRIPTSUFFIX):: $(srcdir)/$(SCRIPTPREFIX)%$(PY3SCRIPTSUFFIX) - cp $< $@ - -# For converting python 2 tests into Python 3 tests -$(SCRIPTDIR)/$(SCRIPTPREFIX)%$(SCRIPTSUFFIX):: $(srcdir)/$(SCRIPTPREFIX)%$(PY2SCRIPTSUFFIX) - cp $< $@ - $(PY2TO3) -w $@ >/dev/null 2>&1 - - endif - -endif - # Clean: remove the generated .py file -# We only remove the _runme3.py if it is generated by 2to3 from a _runme.py. %.clean: @rm -f $*.py - @if test -f $(srcdir)/$(py2_runme); then rm -f $(SCRIPTDIR)/$(py3_runme) $(SCRIPTDIR)/$(py3_runme).bak; fi - @if test "x$(SCRIPTDIR)" != "x$(srcdir)"; then rm -f $(SCRIPTDIR)/$(py_runme); fi clean: $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' python_clean - rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.py hugemod_b.py hugemod_runme.py rm -f clientdata_prop_a.py clientdata_prop_b.py import_stl_a.py import_stl_b.py + rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.py hugemod_b.py hugemod_runme.py rm -f imports_a.py imports_b.py mod_a.py mod_b.py multi_import_a.py rm -f multi_import_b.py packageoption_a.py packageoption_b.py packageoption_c.py + rm -f template_typedef_cplx2.py hugemod_runme = hugemod$(SCRIPTPREFIX) diff --git a/Examples/test-suite/python/argcargvtest_runme.py b/Examples/test-suite/python/argcargvtest_runme.py index b0345746f..eb57f79ea 100644 --- a/Examples/test-suite/python/argcargvtest_runme.py +++ b/Examples/test-suite/python/argcargvtest_runme.py @@ -6,7 +6,6 @@ if mainc(largs) != 3: targs = ("hi", "hola") if mainv(targs, 1) != "hola": - print(mainv(targs, 1)) raise RuntimeError("bad main typemap") targs = ("hi", "hola") diff --git a/Examples/test-suite/python/array_member_runme.py b/Examples/test-suite/python/array_member_runme.py index de6e0f3e7..2708a6f37 100644 --- a/Examples/test-suite/python/array_member_runme.py +++ b/Examples/test-suite/python/array_member_runme.py @@ -5,7 +5,7 @@ f.data = cvar.global_data for i in range(0, 8): if get_value(f.data, i) != get_value(cvar.global_data, i): - raise RuntimeError, "Bad array assignment" + raise RuntimeError("Bad array assignment") for i in range(0, 8): @@ -15,4 +15,4 @@ cvar.global_data = f.data for i in range(0, 8): if get_value(f.data, i) != get_value(cvar.global_data, i): - raise RuntimeError, "Bad array assignment" + raise RuntimeError("Bad array assignment") diff --git a/Examples/test-suite/python/autodoc_runme.py b/Examples/test-suite/python/autodoc_runme.py index 6002d49fe..7bc918644 100644 --- a/Examples/test-suite/python/autodoc_runme.py +++ b/Examples/test-suite/python/autodoc_runme.py @@ -279,3 +279,5 @@ check(inspect.getdoc(process3), "process3(int _from, int _in, int var) -> int") check(inspect.getdoc(process4), "process4(int _from=0, int _in=1, int var=2) -> int") check(inspect.getdoc(process_complex_defval), "process_complex_defval(val=PROCESS_DEFAULT_VALUE, factor=some_type(-1)) -> int") + +check(inspect.getdoc(a_structure.__init__), "__init__(a_structure self) -> a_structure", None, skip) diff --git a/Examples/test-suite/python/ccomplextest_runme.py b/Examples/test-suite/python/ccomplextest_runme.py new file mode 100644 index 000000000..63a663f50 --- /dev/null +++ b/Examples/test-suite/python/ccomplextest_runme.py @@ -0,0 +1,22 @@ +import ccomplextest + +a = complex(-1, 2) + +if ccomplextest.has_c99_complex(): + if ccomplextest.Conj(a) != a.conjugate(): + raise RuntimeError("bad complex mapping") + + if ccomplextest.Conjf(a) != a.conjugate(): + raise RuntimeError("bad complex mapping") + + if ccomplextest.Conj2(a) != a.conjugate(): + raise RuntimeError("bad complex mapping") + + if ccomplextest.Conjf2(a) != a.conjugate(): + raise RuntimeError("bad complex mapping") + + if ccomplextest.Conj3(a) != a.conjugate(): + raise RuntimeError("bad complex mapping") + + if ccomplextest.Conjf3(a) != a.conjugate(): + raise RuntimeError("bad complex mapping") diff --git a/Examples/test-suite/python/char_binary_runme.py b/Examples/test-suite/python/char_binary_runme.py index 0425fe1c9..39c0b2447 100644 --- a/Examples/test-suite/python/char_binary_runme.py +++ b/Examples/test-suite/python/char_binary_runme.py @@ -2,16 +2,14 @@ from char_binary import * t = Test() if t.strlen("hile") != 4: - print t.strlen("hile") - raise RuntimeError, "bad multi-arg typemap" + raise RuntimeError("bad multi-arg typemap {}".format(t.strlen("hile"))) if t.ustrlen("hile") != 4: - print t.ustrlen("hile") - raise RuntimeError, "bad multi-arg typemap" + raise RuntimeError("bad multi-arg typemap {}".format(t.ustrlen("hile"))) if t.strlen("hil\0") != 4: - raise RuntimeError, "bad multi-arg typemap" + raise RuntimeError("bad multi-arg typemap") if t.ustrlen("hil\0") != 4: - raise RuntimeError, "bad multi-arg typemap" + raise RuntimeError("bad multi-arg typemap") # # creating a raw char* @@ -25,18 +23,17 @@ pchar_setitem(pc, 4, 0) if t.strlen(pc) != 4: - raise RuntimeError, "bad multi-arg typemap" + raise RuntimeError("bad multi-arg typemap") if t.ustrlen(pc) != 4: - raise RuntimeError, "bad multi-arg typemap" + raise RuntimeError("bad multi-arg typemap") cvar.var_pchar = pc if cvar.var_pchar != "hola": - print cvar.var_pchar - raise RuntimeError, "bad pointer case" + raise RuntimeError("bad pointer case {}".format(cvar.var_pchar)) cvar.var_namet = pc # if cvar.var_namet != "hola\0": if cvar.var_namet != "hola": - raise RuntimeError, "bad pointer case" + raise RuntimeError("bad pointer case") delete_pchar(pc) diff --git a/Examples/test-suite/python/complextest_runme.py b/Examples/test-suite/python/complextest_runme.py index 5cfc7ccab..1b9ad6629 100644 --- a/Examples/test-suite/python/complextest_runme.py +++ b/Examples/test-suite/python/complextest_runme.py @@ -3,17 +3,16 @@ import complextest a = complex(-1, 2) if complextest.Conj(a) != a.conjugate(): - raise RuntimeError, "bad complex mapping" + raise RuntimeError("bad complex mapping") if complextest.Conjf(a) != a.conjugate(): - raise RuntimeError, "bad complex mapping" + raise RuntimeError("bad complex mapping") if complextest.Conj2(a) != a.conjugate(): - raise RuntimeError, "bad complex mapping" + raise RuntimeError("bad complex mapping") if complextest.Conjf2(a) != a.conjugate(): - raise RuntimeError, "bad complex mapping" - + raise RuntimeError("bad complex mapping") v = (complex(1, 2), complex(2, 3), complex(4, 3), 1) @@ -27,4 +26,4 @@ p = complextest.ComplexPair() p.z1 = complex(0, 1) p.z2 = complex(0, -1) if complextest.Conj(p.z2) != p.z1: - raise RuntimeError, "bad complex mapping" + raise RuntimeError("bad complex mapping") diff --git a/Examples/test-suite/python/constover_runme.py b/Examples/test-suite/python/constover_runme.py index 2d28a55cc..0c03967f6 100644 --- a/Examples/test-suite/python/constover_runme.py +++ b/Examples/test-suite/python/constover_runme.py @@ -4,33 +4,26 @@ error = 0 p = constover.test("test") if p != "test": - print "test failed!" - error = 1 + raise RuntimeError("test failed!") p = constover.test_pconst("test") if p != "test_pconst": - print "test_pconst failed!" - error = 1 + raise RuntimeError("test_pconst failed!") f = constover.Foo() p = f.test("test") if p != "test": - print "member-test failed!" - error = 1 + raise RuntimeError("member-test failed!") p = f.test_pconst("test") if p != "test_pconst": - print "member-test_pconst failed!" - error = 1 + raise RuntimeError("member-test_pconst failed!") p = f.test_constm("test") if p != "test_constmethod": - print "member-test_constm failed!" - error = 1 + raise RuntimeError("member-test_constm failed!") p = f.test_pconstm("test") if p != "test_pconstmethod": - print "member-test_pconstm failed!" - error = 1 + raise RuntimeError("member-test_pconstm failed!") -sys.exit(error) diff --git a/Examples/test-suite/python/contract_runme.py b/Examples/test-suite/python/contract_runme.py index cd75a51d2..b6bab3a09 100644 --- a/Examples/test-suite/python/contract_runme.py +++ b/Examples/test-suite/python/contract_runme.py @@ -2,141 +2,141 @@ import contract contract.test_preassert(1, 2) try: - contract.test_preassert(-1) - print "Failed! Preassertions are broken" -except: + contract.test_preassert(-1, 3) + raise Exception("Failed! Preassertions are broken") +except RuntimeError: pass contract.test_postassert(3) try: contract.test_postassert(-3) - print "Failed! Postassertions are broken" -except: + raise Exception("Failed! Postassertions are broken") +except RuntimeError: pass contract.test_prepost(2, 3) contract.test_prepost(5, -4) try: contract.test_prepost(-3, 4) - print "Failed! Preassertions are broken" -except: + raise Exception("Failed! Preassertions are broken") +except RuntimeError: pass try: contract.test_prepost(4, -10) - print "Failed! Postassertions are broken" + raise Exception("Failed! Postassertions are broken") -except: +except RuntimeError: pass f = contract.Foo() f.test_preassert(4, 5) try: f.test_preassert(-2, 3) - print "Failed! Method preassertion." -except: + raise Exception("Failed! Method preassertion.") +except RuntimeError: pass f.test_postassert(4) try: f.test_postassert(-4) - print "Failed! Method postassertion" -except: + raise Exception("Failed! Method postassertion") +except RuntimeError: pass f.test_prepost(3, 4) f.test_prepost(4, -3) try: f.test_prepost(-4, 2) - print "Failed! Method preassertion." -except: + raise Exception("Failed! Method preassertion.") +except RuntimeError: pass try: f.test_prepost(4, -10) - print "Failed! Method postassertion." -except: + raise Exception("Failed! Method postassertion.") +except RuntimeError: pass contract.Foo_stest_prepost(4, 0) try: contract.Foo_stest_prepost(-4, 2) - print "Failed! Static method preassertion" -except: + raise Exception("Failed! Static method preassertion") +except RuntimeError: pass try: contract.Foo_stest_prepost(4, -10) - print "Failed! Static method posteassertion" -except: + raise Exception("Failed! Static method posteassertion") +except RuntimeError: pass b = contract.Bar() try: b.test_prepost(2, -4) - print "Failed! Inherited preassertion." -except: + raise Exception("Failed! Inherited preassertion.") +except RuntimeError: pass d = contract.D() try: d.foo(-1, 1, 1, 1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.foo(1, -1, 1, 1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.foo(1, 1, -1, 1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.foo(1, 1, 1, -1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.foo(1, 1, 1, 1, -1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.bar(-1, 1, 1, 1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.bar(1, -1, 1, 1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.bar(1, 1, -1, 1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.bar(1, 1, 1, -1, 1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass try: d.bar(1, 1, 1, 1, -1) - print "Failed! Inherited preassertion (D)." -except: + raise Exception("Failed! Inherited preassertion (D).") +except RuntimeError: pass # Namespace my = contract.myClass(1) try: my = contract.myClass(0) - print "Failed! constructor preassertion" -except: + raise Exception("Failed! constructor preassertion") +except RuntimeError: pass diff --git a/Examples/test-suite/python/cpp11_alternate_function_syntax_runme.py b/Examples/test-suite/python/cpp11_alternate_function_syntax_runme.py index cc7b5cd91..e46a4772f 100644 --- a/Examples/test-suite/python/cpp11_alternate_function_syntax_runme.py +++ b/Examples/test-suite/python/cpp11_alternate_function_syntax_runme.py @@ -4,20 +4,20 @@ a = cpp11_alternate_function_syntax.SomeStruct() res = a.addNormal(4, 5) if res != 9: - raise RuntimeError, ("SomeStruct::addNormal(4,5) returns ", res, " should be 9.") + raise RuntimeError("SomeStruct::addNormal(4,5) returns ", res, " should be 9.") res = a.addAlternate(4, 5) if res != 9: - raise RuntimeError, ("SomeStruct::addAlternate(4,5) returns ", res, " should be 9.") + raise RuntimeError("SomeStruct::addAlternate(4,5) returns ", res, " should be 9.") res = a.addAlternateConst(4, 5) if res != 9: - raise RuntimeError, ("SomeStruct::addAlternateConst(4,5) returns ", res, " should be 9.") + raise RuntimeError("SomeStruct::addAlternateConst(4,5) returns ", res, " should be 9.") res = a.addAlternateNoExcept(4, 5) if res != 9: - raise RuntimeError, ("SomeStruct::addAlternateNoExcept(4,5) returns ", res, " should be 9.") + raise RuntimeError("SomeStruct::addAlternateNoExcept(4,5) returns ", res, " should be 9.") res = a.addAlternateConstNoExcept(4, 5) if res != 9: - raise RuntimeError, ("SomeStruct::addAlternateConstNoExcept(4,5) returns ", res, " should be 9.") + raise RuntimeError("SomeStruct::addAlternateConstNoExcept(4,5) returns ", res, " should be 9.") diff --git a/Examples/test-suite/python/cpp11_decltype_runme.py b/Examples/test-suite/python/cpp11_decltype_runme.py index 1650d9004..a18f334dc 100644 --- a/Examples/test-suite/python/cpp11_decltype_runme.py +++ b/Examples/test-suite/python/cpp11_decltype_runme.py @@ -3,16 +3,16 @@ import cpp11_decltype a = cpp11_decltype.A() a.i = 5 if a.i != 5: - raise RuntimeError, "Assignment to a.i failed." + raise RuntimeError("Assignment to a.i failed.") a.j = 10 if a.j != 10: - raise RuntimeError, "Assignment to a.j failed." + raise RuntimeError("Assignment to a.j failed.") b = a.foo(5) if b != 10: - raise RuntimeError, "foo(5) should return 10." + raise RuntimeError("foo(5) should return 10.") b = a.foo(6) if b != 0: - raise RuntimeError, "foo(6) should return 0." + raise RuntimeError("foo(6) should return 0.") diff --git a/Examples/test-suite/python/cpp11_hash_tables_runme.py b/Examples/test-suite/python/cpp11_hash_tables_runme.py index 7b772ff9a..3e7be49d0 100644 --- a/Examples/test-suite/python/cpp11_hash_tables_runme.py +++ b/Examples/test-suite/python/cpp11_hash_tables_runme.py @@ -10,14 +10,14 @@ for x in [cpp11_hash_tables.MapIntInt({1:7}), cpp11_hash_tables.UnorderedMultiMapIntInt({1:7}) ]: - swig_assert_equal([(k, v) for k, v in x.iteritems()], [(1, 7)]) - swig_assert_equal(x.keys(), [1]) - swig_assert_equal(x.values(), [7]) - swig_assert_equal(x.items(), [(1, 7)]) + swig_assert_equal([(k, v) for k, v in x.items()], [(1, 7)]) + swig_assert_equal(list(x.keys()), [1]) + swig_assert_equal(list(x.values()), [7]) + swig_assert_equal(list(x.items()), [(1, 7)]) swig_assert_equal([k for k in x], [1]) - swig_assert_equal([i for i in x.iterkeys()], [1]) - swig_assert_equal([i for i in x.itervalues()], [7]) - swig_assert_equal([i for i in x.iteritems()], [(1, 7)]) + swig_assert_equal([i for i in x.keys()], [1]) + swig_assert_equal([i for i in x.values()], [7]) + swig_assert_equal([i for i in x.items()], [(1, 7)]) swig_assert_equal(x[1], 7) swig_assert_equal(2 in x, False) @@ -33,7 +33,7 @@ for x in [cpp11_hash_tables.MapIntInt({1:7}), for x in [cpp11_hash_tables.MultiMapIntInt({1:7}), cpp11_hash_tables.UnorderedMultiMapIntInt({1:7})]: x[1] = 9 - swig_assert_equal(sorted([v for k, v in x.iteritems()]), [7, 9]) + swig_assert_equal(sorted([v for k, v in x.items()]), [7, 9]) swig_assert_equal(len(x), 2) for x in [cpp11_hash_tables.SetInt([1]), diff --git a/Examples/test-suite/python/cpp11_null_pointer_constant_runme.py b/Examples/test-suite/python/cpp11_null_pointer_constant_runme.py index 54a8fe0eb..c39760344 100644 --- a/Examples/test-suite/python/cpp11_null_pointer_constant_runme.py +++ b/Examples/test-suite/python/cpp11_null_pointer_constant_runme.py @@ -3,15 +3,15 @@ import cpp11_null_pointer_constant a = cpp11_null_pointer_constant.A() if a._myA != None: - raise RuntimeError, ( + raise RuntimeError( "cpp11_null_pointer_constant: _myA should be None, but is ", a._myA) b = cpp11_null_pointer_constant.A() if a._myA != b._myA: - raise RuntimeError, ( + raise RuntimeError( "cpp11_null_pointer_constant: a._myA should be the same as b._myA, but ", a._myA, "!=", b._myA) a._myA = cpp11_null_pointer_constant.A() if a._myA == None: - raise RuntimeError, ( - "cpp11_null_pointer_constant: _myA should be object, but is None") + raise RuntimeError(( + "cpp11_null_pointer_constant: _myA should be object, but is None")) diff --git a/Examples/test-suite/python/cpp11_raw_string_literals_runme.py b/Examples/test-suite/python/cpp11_raw_string_literals_runme.py index 6a587b860..90e450f8b 100644 --- a/Examples/test-suite/python/cpp11_raw_string_literals_runme.py +++ b/Examples/test-suite/python/cpp11_raw_string_literals_runme.py @@ -34,19 +34,19 @@ if cvar.aa != "Wide string": raise RuntimeError if cvar.bb != "UTF-8 string": - raise RuntimeError, cvar.wide + raise RuntimeError(cvar.wide) if cvar.xx != ")I'm an \"ascii\" \\ string.": - raise RuntimeError, cvar.xx + raise RuntimeError(cvar.xx) if cvar.ee != ")I'm an \"ascii\" \\ string.": - raise RuntimeError, cvar.ee + raise RuntimeError(cvar.ee) if cvar.ff != "I'm a \"raw wide\" \\ string.": - raise RuntimeError, cvar.ff + raise RuntimeError(cvar.ff) if cvar.gg != "I'm a \"raw UTF-8\" \\ string.": - raise RuntimeError, cvar.gg + raise RuntimeError(cvar.gg) def check(got, expected): diff --git a/Examples/test-suite/python/cpp11_result_of_runme.py b/Examples/test-suite/python/cpp11_result_of_runme.py index 4469efd81..691d2a2d8 100644 --- a/Examples/test-suite/python/cpp11_result_of_runme.py +++ b/Examples/test-suite/python/cpp11_result_of_runme.py @@ -2,10 +2,10 @@ import cpp11_result_of result = cpp11_result_of.test_result(cpp11_result_of.SQUARE, 3.0) if result != 9.0: - raise RuntimeError, "test_result(square, 3.0) is not 9.0. Got: " + str( - result) + raise RuntimeError("test_result(square, 3.0) is not 9.0. Got: " + str( + result)) result = cpp11_result_of.test_result_alternative1(cpp11_result_of.SQUARE, 3.0) if result != 9.0: - raise RuntimeError, "test_result_alternative1(square, 3.0) is not 9.0. Got: " + str( - result) + raise RuntimeError("test_result_alternative1(square, 3.0) is not 9.0. Got: " + str( + result)) diff --git a/Examples/test-suite/python/cpp11_rvalue_reference_runme.py b/Examples/test-suite/python/cpp11_rvalue_reference_runme.py index c1cd3bf26..85d64a581 100644 --- a/Examples/test-suite/python/cpp11_rvalue_reference_runme.py +++ b/Examples/test-suite/python/cpp11_rvalue_reference_runme.py @@ -4,24 +4,24 @@ a = cpp11_rvalue_reference.A() a.setAcopy(5) if a.getAcopy() != 5: - raise RunTimeError, ("int A::getAcopy() value is ", + raise RunTimeError("int A::getAcopy() value is ", a.getAcopy(), " should be 5") ptr = a.getAptr() a.setAptr(ptr) if a.getAcopy() != 5: - raise RunTimeError, ("after A::setAptr(): int A::getAcopy() value is ", a.getAcopy( + raise RunTimeError("after A::setAptr(): int A::getAcopy() value is ", a.getAcopy( ), " should be 5") a.setAref(ptr) if a.getAcopy() != 5: - raise RunTimeError, ("after A::setAref(): int A::getAcopy() value is ", a.getAcopy( + raise RunTimeError("after A::setAref(): int A::getAcopy() value is ", a.getAcopy( ), " should be 5") rvalueref = a.getAmove() a.setAmove(rvalueref) if a.getAcopy() != 5: - raise RunTimeError, ("after A::setAmove(): int A::getAcopy() value is ", a.getAcopy( + raise RunTimeError("after A::setAmove(): int A::getAcopy() value is ", a.getAcopy( ), " should be 5") diff --git a/Examples/test-suite/python/cpp11_shared_ptr_template_upcast_runme.py b/Examples/test-suite/python/cpp11_shared_ptr_template_upcast_runme.py new file mode 100644 index 000000000..08a95c2ce --- /dev/null +++ b/Examples/test-suite/python/cpp11_shared_ptr_template_upcast_runme.py @@ -0,0 +1,5 @@ +from cpp11_shared_ptr_template_upcast import * + +pd = MakePrintableDerived(20) +pd.GetResult() +pd.GetFormatted() diff --git a/Examples/test-suite/python/cpp11_shared_ptr_upcast_runme.py b/Examples/test-suite/python/cpp11_shared_ptr_upcast_runme.py new file mode 100644 index 000000000..08546a45e --- /dev/null +++ b/Examples/test-suite/python/cpp11_shared_ptr_upcast_runme.py @@ -0,0 +1,63 @@ +from cpp11_shared_ptr_upcast import * + +# This is a port from the Ruby equivalent test and some tests ported from +# Examples/test-suite/ruby/cpp11_shared_ptr_upcast_runme.rb are not working and commented out with: +# not working: + +def swig_assert_equal_simple(expected, got): + if expected != got: + raise RuntimeError("Expected: {}. Got: {}") + +# non-overloaded +swig_assert_equal_simple(7, derived_num1(Derived(7))) +swig_assert_equal_simple(7, derived_num2([Derived(7)])) +swig_assert_equal_simple(7, derived_num3({0: Derived(7)})) + +swig_assert_equal_simple(-1, base_num1(Derived(7))) +swig_assert_equal_simple(-1, base_num2([Derived(7)])) +swig_assert_equal_simple(-1, base_num3({0: Derived(7)})) + +swig_assert_equal_simple(999, derived_num1(None)) +# not working: swig_assert_equal_simple(999, derived_num2([None])) +# not working: swig_assert_equal_simple(999, derived_num3({0: None})) + +swig_assert_equal_simple(999, base_num1(None)) +# not working: swig_assert_equal_simple(999, base_num2([None])) +# not working: swig_assert_equal_simple(999, base_num3({0: None})) + +# overloaded +swig_assert_equal_simple(7, derived_num(Derived(7))) +swig_assert_equal_simple(7, derived_num([Derived(7)])) +swig_assert_equal_simple(7, derived_num({0: Derived(7)})) + +swig_assert_equal_simple(-1, base_num(Derived(7))) +swig_assert_equal_simple(-1, base_num([Derived(7)])) +swig_assert_equal_simple(-1, base_num({0: Derived(7)})) + +# ptr to shared_ptr +swig_assert_equal_simple(7, derived2_num1(Derived2(7))) +swig_assert_equal_simple(7, derived2_num2([Derived2(7)])) +swig_assert_equal_simple(7, derived2_num3({0: Derived2(7)})) + +swig_assert_equal_simple(-1, base2_num1(Derived2(7))) + +# not working: try: +# not working: # Upcast for pointers to shared_ptr in this generic framework has not been implemented +# not working: swig_assert_equal_simple(-1, base2_num2([Derived2(7)])) +# not working: raise RuntimeError, "Failed to catch TypeError" +# not working: except TypeError: +# not working: pass +# not working: try: +# not working: # Upcast for pointers to shared_ptr in this generic framework has not been implemented +# not working: swig_assert_equal_simple(-1, base2_num3({0: Derived2(7)})) +# not working: raise RuntimeError, "Failed to catch TypeError" +# not working: except TypeError: +# not working: pass + +swig_assert_equal_simple(888, derived2_num1(None)) +swig_assert_equal_simple(999, derived2_num2([None])) # although 888 would be more consistent +swig_assert_equal_simple(999, derived2_num3({0: None})) # although 888 would be more consistent + +swig_assert_equal_simple(888, base2_num1(None)) +swig_assert_equal_simple(999, base2_num2([None])) # although 888 would be more consistent +swig_assert_equal_simple(999, base2_num3({0: None})) # although 888 would be more consistent diff --git a/Examples/test-suite/python/cpp11_std_array_runme.py b/Examples/test-suite/python/cpp11_std_array_runme.py index e5e7373dd..9e11a3e5b 100644 --- a/Examples/test-suite/python/cpp11_std_array_runme.py +++ b/Examples/test-suite/python/cpp11_std_array_runme.py @@ -3,7 +3,7 @@ import sys def failed(a, b, msg): - raise RuntimeError, msg + " " + str(list(a)) + " " + str(list(b)) + raise RuntimeError(msg + " " + str(list(a)) + " " + str(list(b))) def compare_sequences(a, b): @@ -26,8 +26,8 @@ def steps_exception(swigarray, i, j, step): a = swigarray[i::step] else: a = swigarray[i:j:step] - raise RuntimeError, "swigarray[" + str(i) + ":" + str(j) + ":" + str(step) + "] missed steps exception for " + str(list(swigarray)) - except ValueError, e: + raise RuntimeError("swigarray[" + str(i) + ":" + str(j) + ":" + str(step) + "] missed steps exception for " + str(list(swigarray))) + except ValueError as e: # print("exception: {}".format(e)) pass @@ -43,16 +43,16 @@ def del_exception(swigarray, i, j, step): del swigarray[i::step] else: del swigarray[i:j:step] - raise RuntimeError, "swigarray[" + str(i) + ":" + str(j) + ":" + str(step) + "] missed del exception for " + str(list(swigarray)) - except ValueError, e: + raise RuntimeError("swigarray[" + str(i) + ":" + str(j) + ":" + str(step) + "] missed del exception for " + str(list(swigarray))) + except ValueError as e: # print("exception: {}".format(e)) pass def setslice_exception(swigarray, newval): try: swigarray[::] = newval - raise RuntimeError, "swigarray[::] = " + str(newval) + " missed set exception for swigarray:" + str(list(swigarray)) - except TypeError, e: + raise RuntimeError("swigarray[::] = " + str(newval) + " missed set exception for swigarray:" + str(list(swigarray))) + except TypeError as e: # print("exception: {}".format(e)) pass diff --git a/Examples/test-suite/python/cpp11_uniform_initialization_runme.py b/Examples/test-suite/python/cpp11_uniform_initialization_runme.py index ecb468ccb..b01557a6f 100644 --- a/Examples/test-suite/python/cpp11_uniform_initialization_runme.py +++ b/Examples/test-suite/python/cpp11_uniform_initialization_runme.py @@ -9,13 +9,13 @@ if var2.getX() != 2: m = cpp11_uniform_initialization.MoreInit() if m.charptr != None: - raise RuntimeError, m.charptr + raise RuntimeError(m.charptr) m.charptr = "hello sir" if m.charptr != "hello sir": - raise RuntimeError, m.charptr + raise RuntimeError(m.charptr) if m.more1(m.vi) != 15: - raise RuntimeError, m.vi + raise RuntimeError(m.vi) if m.more1([-1, 1, 2]) != 2: - raise RuntimeError, m.vi + raise RuntimeError(m.vi) if m.more1() != 10: raise RuntimeError diff --git a/Examples/test-suite/python/cpp_enum_runme.py b/Examples/test-suite/python/cpp_enum_runme.py index 5f1e91c97..910d378e4 100644 --- a/Examples/test-suite/python/cpp_enum_runme.py +++ b/Examples/test-suite/python/cpp_enum_runme.py @@ -3,21 +3,17 @@ import cpp_enum f = cpp_enum.Foo() if f.hola != f.Hello: - print f.hola - raise RuntimeError + raise RuntimeError("f.hola: {}".format(f.hola)) f.hola = f.Hi if f.hola != f.Hi: - print f.hola - raise RuntimeError + raise RuntimeError("f.hola: {}".format(f.hola)) f.hola = f.Hello if f.hola != f.Hello: - print f.hola - raise RuntimeError + raise RuntimeError("f.hola: {}".format(f.hola)) cpp_enum.cvar.hi = cpp_enum.Hello if cpp_enum.cvar.hi != cpp_enum.Hello: - print cpp_enum.cvar.hi - raise RuntimeError + raise RuntimeError("cpp_enum.cvar.hi: {}".format(cpp_enum.cvar.hi)) diff --git a/Examples/test-suite/python/cpp_parameters_runme.py b/Examples/test-suite/python/cpp_parameters_runme.py new file mode 100644 index 000000000..99d14ad74 --- /dev/null +++ b/Examples/test-suite/python/cpp_parameters_runme.py @@ -0,0 +1,296 @@ +from cpp_parameters import * + +# Testing correct and incorrect parameter counts being passed (kwargs and non-kwargs) +# Note that the implementation depends a lot on whether zero, one, two or more args are being wrapped + +def is_python_fastproxy(): + """Return True if SWIG is generating Python code using -fastproxy.""" + import cpp_parameters + # Note: _swig_new_instance_method is only generated when using -fastproxy + return hasattr(cpp_parameters, "_swig_new_instance_method") + +# Zero parameters expected +x = Zero() +try: + x = Zero(z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x = Zero(0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + x.zero(z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x.zero(0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + Zero.stat_zero(z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + Zero.stat_zero(0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + global_zero(z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + global_zero(0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +# One mandatory parameter expected +x = One(1) +try: + x = One(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x = One(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + x.one(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x.one(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + One.stat_one(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + One.stat_one(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + global_one(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + global_one(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +# Two mandatory parameters expected +x = Two(1, 2) +try: + x = Two(a=1, b=2, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x = Two(1, 2, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + x.two(a=1, b=2, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x.two(1, 2, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + Two.stat_two(a=1, b=2, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + Two.stat_two(1, 2, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + global_two(a=1, b=2, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + global_two(1, 2, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +# Single optional parameter expected +x = Single(1) +try: + x = Single(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x = Single(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + x.single(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + x.single(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + Single.stat_single(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + Single.stat_single(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +try: + global_single(a=1, z=0) + raise RuntimeError("Missed throw") +except TypeError: + pass +try: + global_single(1, 0) + raise RuntimeError("Missed throw") +except TypeError: + pass + +# Test that -builtin option throws TypeError if kwargs are used even when they look like they should work, kwargs are not supported unless using -keyword. +# Also same for -fastproxy option except that kwargs are supported by default for constructors. TODO: Fix inconsistency. + +if is_python_builtin() or is_python_fastproxy(): + # One mandatory parameter in API + x = One(1) + if is_python_fastproxy(): + x = One(a=1) + else: + try: + x = One(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + x.one(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + One.stat_one(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + global_one(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + + # Two mandatory parameters in API + x = Two(1, 2) + if is_python_fastproxy(): + x = Two(a=1, b=2) + else: + try: + x = Two(a=1, b=2) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + x.two(a=1, b=2) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + Two.stat_two(a=1, b=2) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + global_two(a=1, b=2) + raise RuntimeError("Missed throw") + except TypeError: + pass + + # Single optional parameter in API + x = Single(1) + if is_python_fastproxy(): + x = Single(a=1) + else: + try: + x = Single(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + x.single(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + Single.stat_single(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + try: + global_single(a=1) + raise RuntimeError("Missed throw") + except TypeError: + pass + +else: + # Non-builtin should work as expected + # One mandatory parameter in API + x = One(a=1) + x.one(a=1) + One.stat_one(a=1) + global_one(a=1) + + # Two mandatory parameters in API + x = Two(a=1, b=2) + x.two(a=1, b=2) + Two.stat_two(a=1, b=2) + global_two(a=1, b=2) + + # Single optional parameter in API + x = Single(a=1) + x.single(a=1) + Single.stat_single(a=1) + global_single(a=1) diff --git a/Examples/test-suite/python/default_args_runme.py b/Examples/test-suite/python/default_args_runme.py index 14ef8c594..0ce47ab79 100644 --- a/Examples/test-suite/python/default_args_runme.py +++ b/Examples/test-suite/python/default_args_runme.py @@ -108,48 +108,34 @@ def run(module_name): if Klass_inc().val != 0: raise RuntimeError("Klass::inc failed") - tricky_failure = False tricky = default_args.TrickyInPython() if tricky.value_m1(10) != -1: - print "trickyvalue_m1 failed" - tricky_failure = True + raise RuntimeError("trickyvalue_m1 failed") if tricky.value_m1(10, 10) != 10: - print "trickyvalue_m1 failed" - tricky_failure = True + raise RuntimeError("trickyvalue_m1 failed") if tricky.value_0xabcdef(10) != 0xabcdef: - print "trickyvalue_0xabcdef failed" - tricky_failure = True + raise RuntimeError("trickyvalue_0xabcdef failed") if tricky.value_0644(10) != 420: - print "trickyvalue_0644 failed" - tricky_failure = True + raise RuntimeError("trickyvalue_0644 failed") if tricky.value_perm(10) != 420: - print "trickyvalue_perm failed" - tricky_failure = True + raise RuntimeError("trickyvalue_perm failed") if tricky.value_m01(10) != -1: - print "trickyvalue_m01 failed" - tricky_failure = True + raise RuntimeError("trickyvalue_m01 failed") if not tricky.booltest2(): - print "booltest2 failed" - tricky_failure = True + raise RuntimeError("booltest2 failed") if tricky.max_32bit_int1() != 0x7FFFFFFF: - print "max_32bit_int1 failed" - tricky_failure = True + raise RuntimeError("max_32bit_int1 failed") if tricky.min_32bit_int1() != -2147483648: - print "min_32bit_int1 failed" - tricky_failure = True + raise RuntimeError("min_32bit_int1 failed") if tricky.max_32bit_int2() != 0x7FFFFFFF: - print "max_32bit_int2 failed" - tricky_failure = True + raise RuntimeError("max_32bit_int2 failed") tricky.too_big_32bit_int1() tricky.too_small_32bit_int1() tricky.too_big_32bit_int2() tricky.too_small_32bit_int2() - if tricky_failure: - raise RuntimeError - default_args.seek() default_args.seek(10) diff --git a/Examples/test-suite/python/default_constructor_runme.py b/Examples/test-suite/python/default_constructor_runme.py index 1e877adda..2943dc960 100644 --- a/Examples/test-suite/python/default_constructor_runme.py +++ b/Examples/test-suite/python/default_constructor_runme.py @@ -16,24 +16,24 @@ dc.delete_AA(aa) try: b = dc.new_B() - print "Whoa. new_BB created." -except: + raise RuntimeError("Whoa. new_BB created.") +except TypeError: pass del_b = dc.delete_B try: bb = dc.new_BB() - print "Whoa. new_BB created." -except: + raise RuntimeError("Whoa. new_BB created.") +except AttributeError: pass del_bb = dc.delete_BB try: c = dc.new_C() - print "Whoa. new_C created." -except: + raise RuntimeError("Whoa. new_C created.") +except AttributeError: pass del_c = dc.delete_C @@ -43,24 +43,24 @@ dc.delete_CC(cc) try: d = dc.new_D() - print "Whoa. new_D created" -except: + raise RuntimeError("Whoa. new_D created") +except AttributeError: pass del_d = dc.delete_D try: dd = dc.new_DD() - print "Whoa. new_DD created" -except: + raise RuntimeError("Whoa. new_DD created") +except AttributeError: pass dd = dc.delete_DD try: ad = dc.new_AD() - print "Whoa. new_AD created" -except: + raise RuntimeError("Whoa. new_AD created") +except AttributeError: pass del_ad = dc.delete_AD @@ -73,8 +73,8 @@ dc.delete_EE(ee) try: eb = dc.new_EB() - print "Whoa. new_EB created" -except: + raise RuntimeError("Whoa. new_EB created") +except AttributeError: pass del_eb = dc.delete_EB @@ -83,7 +83,7 @@ f = dc.new_F() try: del_f = dc.delete_F - print "Whoa. delete_F created" + raise RuntimeError("Whoa. delete_F created") except AttributeError: pass @@ -93,7 +93,7 @@ g = dc.new_G() try: del_g = dc.delete_G - print "Whoa. delete_G created" + raise RuntimeError("Whoa. delete_G created") except AttributeError: pass diff --git a/Examples/test-suite/python/director_abstract_runme.py b/Examples/test-suite/python/director_abstract_runme.py index 333b75fe5..c8c4b36dc 100644 --- a/Examples/test-suite/python/director_abstract_runme.py +++ b/Examples/test-suite/python/director_abstract_runme.py @@ -13,10 +13,10 @@ class MyFoo(director_abstract.Foo): a = MyFoo() if a.ping() != "MyFoo::ping()": - raise RuntimeError, a.ping() + raise RuntimeError(a.ping()) if a.pong() != "Foo::pong();MyFoo::ping()": - raise RuntimeError, a.pong() + raise RuntimeError(a.pong()) class MyExample1(director_abstract.Example1): diff --git a/Examples/test-suite/python/director_alternating_runme.py b/Examples/test-suite/python/director_alternating_runme.py index a93ffec34..dc85351b5 100644 --- a/Examples/test-suite/python/director_alternating_runme.py +++ b/Examples/test-suite/python/director_alternating_runme.py @@ -2,4 +2,4 @@ from director_alternating import * id = getBar().id() if id != idFromGetBar(): - raise RuntimeError, "Got wrong id: " + str(id) + raise RuntimeError("Got wrong id: " + str(id)) diff --git a/Examples/test-suite/python/director_basic_runme.py b/Examples/test-suite/python/director_basic_runme.py index 6564c95a2..79cd0e2eb 100644 --- a/Examples/test-suite/python/director_basic_runme.py +++ b/Examples/test-suite/python/director_basic_runme.py @@ -10,18 +10,18 @@ class PyFoo(director_basic.Foo): a = PyFoo() if a.ping() != "PyFoo::ping()": - raise RuntimeError, a.ping() + raise RuntimeError(a.ping()) if a.pong() != "Foo::pong();PyFoo::ping()": - raise RuntimeError, a.pong() + raise RuntimeError(a.pong()) b = director_basic.Foo() if b.ping() != "Foo::ping()": - raise RuntimeError, b.ping() + raise RuntimeError(b.ping()) if b.pong() != "Foo::pong();Foo::ping()": - raise RuntimeError, b.pong() + raise RuntimeError(b.pong()) a = director_basic.A1(1) diff --git a/Examples/test-suite/python/director_comparison_operators_runme.py b/Examples/test-suite/python/director_comparison_operators_runme.py new file mode 100644 index 000000000..e9bf9438d --- /dev/null +++ b/Examples/test-suite/python/director_comparison_operators_runme.py @@ -0,0 +1,11 @@ +import director_comparison_operators + + +class PyFoo(director_comparison_operators.Foo): + pass + + +a = PyFoo() + +if a.test() != "a=1,b=2": + raise RuntimeError(a.test()) diff --git a/Examples/test-suite/python/director_detect_runme.py b/Examples/test-suite/python/director_detect_runme.py index 345051982..b9c73eb45 100644 --- a/Examples/test-suite/python/director_detect_runme.py +++ b/Examples/test-suite/python/director_detect_runme.py @@ -35,4 +35,4 @@ c = b.clone() vc = c.get_value() if (v != 3) or (b.val != 5) or (vc != 6): - raise RuntimeError, "Bad virtual detection" + raise RuntimeError("Bad virtual detection") diff --git a/Examples/test-suite/python/director_exception_runme.py b/Examples/test-suite/python/director_exception_runme.py index 06856f30a..458983c6a 100644 --- a/Examples/test-suite/python/director_exception_runme.py +++ b/Examples/test-suite/python/director_exception_runme.py @@ -10,7 +10,7 @@ class MyException(Exception): class MyFoo(Foo): def ping(self): - raise NotImplementedError, "MyFoo::ping() EXCEPTION" + raise NotImplementedError("MyFoo::ping() EXCEPTION") class MyFoo2(Foo): @@ -28,74 +28,58 @@ class MyFoo3(Foo): class MyFoo4(Foo): def ping(self, *args): - print(type("bad", "call")) # throws TypeError message: type() takes 1 or 3 arguments + t = type("bad", "call") # throws TypeError message: type() takes 1 or 3 arguments return "Foo4.ping" # Check that the NotImplementedError raised by MyFoo.ping() is returned by # MyFoo.pong(). -ok = 0 a = MyFoo() b = launder(a) try: b.pong() -except NotImplementedError, e: - if str(e) == "MyFoo::ping() EXCEPTION": - ok = 1 - else: - print "Unexpected error message: %s" % str(e) -except: + raise RuntimeError("Exception was not thrown") +except NotImplementedError as e: + if not str(e) == "MyFoo::ping() EXCEPTION": + raise RuntimeError("Unexpected error message: %s" % str(e)) +except TypeError: pass -if not ok: - raise RuntimeError # Check that the director returns the appropriate TypeError if the return type # is wrong. -ok = 0 a = MyFoo2() b = launder(a) try: b.pong() -except TypeError, e: + raise RuntimeError("Exception was not thrown") +except TypeError as e: # fastdispatch mode adds on Additional Information to the exception message - just check the main exception message exists - if str(e).startswith("SWIG director type mismatch in output value of type 'std::string'"): - ok = 1 - else: - print "Unexpected error message: %s" % str(e) -if not ok: - raise RuntimeError + if not str(e).startswith("SWIG director type mismatch in output value of type 'std::string'"): + raise RuntimeError("Unexpected error message: %s" % str(e)) # Check that the director can return an exception which requires two arguments # to the constructor, without mangling it. -ok = 0 a = MyFoo3() b = launder(a) try: b.pong() -except MyException, e: - if e.msg == "foobar": - ok = 1 - else: - print "Unexpected error message: %s" % str(e) -if not ok: - raise RuntimeError + raise RuntimeError("Exception was not thrown") +except MyException as e: + if e.msg != "foobar": + raise RuntimeError("Unexpected error message: %s" % str(e)) # Check that the director returns the appropriate TypeError thrown in a director method -ok = 0 a = MyFoo4() b = launder(a) try: b.pong() + raise RuntimeError("Exception was not thrown") except TypeError as e: - if str(e).startswith("type() takes 1 or 3 arguments"): - ok = 1 - else: - print "Unexpected error message: %s" % str(e) -if not ok: - raise RuntimeError + if not str(e).startswith("type() takes 1 or 3 arguments"): + raise RuntimeError("Unexpected error message: %s" % str(e)) # This is expected to fail with -builtin option diff --git a/Examples/test-suite/python/director_extend_runme.py b/Examples/test-suite/python/director_extend_runme.py index a5aad8245..870443d1f 100644 --- a/Examples/test-suite/python/director_extend_runme.py +++ b/Examples/test-suite/python/director_extend_runme.py @@ -17,6 +17,6 @@ class MyObject(SpObject): m = MyObject() if m.dummy() != 666: - raise RuntimeError, "1st call" + raise RuntimeError("1st call") if m.dummy() != 666: # Locked system - raise RuntimeError, "2nd call" + raise RuntimeError("2nd call") diff --git a/Examples/test-suite/python/director_frob_runme.py b/Examples/test-suite/python/director_frob_runme.py index 0ef4ad900..6c8fcad06 100644 --- a/Examples/test-suite/python/director_frob_runme.py +++ b/Examples/test-suite/python/director_frob_runme.py @@ -4,4 +4,4 @@ foo = Bravo() s = foo.abs_method() if s != "Bravo::abs_method()": - raise RuntimeError, s + raise RuntimeError(s) diff --git a/Examples/test-suite/python/director_nested_runme.py b/Examples/test-suite/python/director_nested_runme.py index f3d973630..b2c4b0d40 100644 --- a/Examples/test-suite/python/director_nested_runme.py +++ b/Examples/test-suite/python/director_nested_runme.py @@ -14,7 +14,7 @@ class A(FooBar_int): a = A() if a.step() != "Bar::step;Foo::advance;Bar::do_advance;A::do_step;": - raise RuntimeError, "Bad A virtual resolution" + raise RuntimeError("Bad A virtual resolution") class B(FooBar_int): @@ -34,7 +34,7 @@ class B(FooBar_int): b = B() if b.step() != "Bar::step;Foo::advance;B::do_advance;B::do_step;": - raise RuntimeError, "Bad B virtual resolution" + raise RuntimeError("Bad B virtual resolution") class C(FooBar_int): diff --git a/Examples/test-suite/python/director_profile_runme.py b/Examples/test-suite/python/director_profile_runme.py index 035007c61..7c269c3f7 100644 --- a/Examples/test-suite/python/director_profile_runme.py +++ b/Examples/test-suite/python/director_profile_runme.py @@ -38,4 +38,4 @@ while i: a = fi(a) # 20 i -= 1 -print a +print("a: {}".format(a)) diff --git a/Examples/test-suite/python/director_protected_runme.py b/Examples/test-suite/python/director_protected_runme.py index c3118a7c0..94eab69a6 100644 --- a/Examples/test-suite/python/director_protected_runme.py +++ b/Examples/test-suite/python/director_protected_runme.py @@ -35,7 +35,7 @@ try: raise RuntimeError pass except: - raise RuntimeError, "bad FooBar::used" + raise RuntimeError("bad FooBar::used") try: s = fb2.used() @@ -43,7 +43,7 @@ try: raise RuntimeError pass except: - raise RuntimeError, "bad FooBar2::used" + raise RuntimeError("bad FooBar2::used") try: s = b.pong() @@ -51,7 +51,7 @@ try: raise RuntimeError pass except: - raise RuntimeError, "bad Bar::pong" + raise RuntimeError("bad Bar::pong") try: s = f.pong() @@ -59,7 +59,7 @@ try: raise RuntimeError pass except: - raise RuntimeError, " bad Foo::pong" + raise RuntimeError(" bad Foo::pong") try: s = fb.pong() @@ -67,7 +67,7 @@ try: raise RuntimeError pass except: - raise RuntimeError, " bad FooBar::pong" + raise RuntimeError(" bad FooBar::pong") protected = 1 try: @@ -76,7 +76,7 @@ try: except: pass if not protected: - raise RuntimeError, "Foo::ping is protected" + raise RuntimeError("Foo::ping is protected") protected = 1 try: @@ -85,7 +85,7 @@ try: except: pass if not protected: - raise RuntimeError, "Foo::ping is protected" + raise RuntimeError("Foo::ping is protected") protected = 1 @@ -95,7 +95,7 @@ try: except: pass if not protected: - raise RuntimeError, "FooBar::pang is protected" + raise RuntimeError("FooBar::pang is protected") protected = 1 @@ -105,7 +105,7 @@ try: except: pass if not protected: - raise RuntimeError, "Bar::cheer is protected" + raise RuntimeError("Bar::cheer is protected") protected = 1 try: @@ -114,19 +114,19 @@ try: except: pass if not protected: - raise RuntimeError, "Foo::cheer is protected" + raise RuntimeError("Foo::cheer is protected") if fb3.cheer() != "FooBar3::cheer();": - raise RuntimeError, "bad fb3::cheer" + raise RuntimeError("bad fb3::cheer") if fb2.callping() != "FooBar2::ping();": - raise RuntimeError, "bad fb2.callping" + raise RuntimeError("bad fb2.callping") if fb2.callcheer() != "FooBar2::pang();Bar::pong();Foo::pong();FooBar2::ping();": - raise RuntimeError, "bad fb2.callcheer" + raise RuntimeError("bad fb2.callcheer") if fb3.callping() != "Bar::ping();": - raise RuntimeError, "bad fb3.callping" + raise RuntimeError("bad fb3.callping") if fb3.callcheer() != "FooBar3::cheer();": - raise RuntimeError, "bad fb3.callcheer" + raise RuntimeError("bad fb3.callcheer") diff --git a/Examples/test-suite/python/director_smartptr_runme.py b/Examples/test-suite/python/director_smartptr_runme.py index 23e22d0fb..b4cbafe32 100644 --- a/Examples/test-suite/python/director_smartptr_runme.py +++ b/Examples/test-suite/python/director_smartptr_runme.py @@ -31,7 +31,7 @@ class director_smartptr_MyBarFooDerived(FooDerived): def check(got, expected): if (got != expected): - raise RuntimeError, "Failed, got: " + got + " expected: " + expected + raise RuntimeError("Failed, got: " + got + " expected: " + expected) fooBar = FooBar() diff --git a/Examples/test-suite/python/director_string_runme.py b/Examples/test-suite/python/director_string_runme.py index dcd47d647..c6d4c8121 100644 --- a/Examples/test-suite/python/director_string_runme.py +++ b/Examples/test-suite/python/director_string_runme.py @@ -18,12 +18,10 @@ b = B("hello") b.get(0) if b.get_first() != "hello world!": - print b.get_first() - raise RuntimeError + raise RuntimeError("b.get_first(): {}".format(b.get_first())) b.call_process_func() if b.smem != "hello": - print smem - raise RuntimeError + raise RuntimeError("smem: {}".format(smem)) diff --git a/Examples/test-suite/python/director_thread_runme.py b/Examples/test-suite/python/director_thread_runme.py index 4fcf3bfd1..21a8ce1b0 100644 --- a/Examples/test-suite/python/director_thread_runme.py +++ b/Examples/test-suite/python/director_thread_runme.py @@ -14,7 +14,6 @@ d = Derived() d.run() if d.val >= 0: - print d.val - raise RuntimeError + raise RuntimeError("d.val: {}".format(d.val)) d.stop() diff --git a/Examples/test-suite/python/director_unroll_runme.py b/Examples/test-suite/python/director_unroll_runme.py index 60bc05585..ea602d8e2 100644 --- a/Examples/test-suite/python/director_unroll_runme.py +++ b/Examples/test-suite/python/director_unroll_runme.py @@ -16,5 +16,4 @@ c = b.get() if not (a.this == c.this): - print a, c - raise RuntimeError + raise RuntimeError("{} {}".format(a, c)) diff --git a/Examples/test-suite/python/director_wstring_runme.py b/Examples/test-suite/python/director_wstring_runme.py index 242b27582..5facc1f1d 100644 --- a/Examples/test-suite/python/director_wstring_runme.py +++ b/Examples/test-suite/python/director_wstring_runme.py @@ -7,22 +7,20 @@ class B(A): A.__init__(self, string) def get_first(self): - return A.get_first(self) + u" world!" + return A.get_first(self) + " world!" - def process_text(self, string): - self.smem = u"hello" + def process_text(self, s): + self.smem = s -b = B(u"hello") +b = B("hello") b.get(0) -if b.get_first() != u"hello world!": - print b.get_first() - raise RuntimeError +if b.get_first() != "hello world!": + raise RuntimeError("b.get_first(): {}".format(b.get_first())) b.call_process_func() -if b.smem != u"hello": - print smem - raise RuntimeError +if b.smem != "hello": + raise RuntimeError("smem: {}".format(smem)) diff --git a/Examples/test-suite/python/doxygen_basic_translate_runme.py b/Examples/test-suite/python/doxygen_basic_translate_runme.py index 9ef8dbd52..4cd500178 100644 --- a/Examples/test-suite/python/doxygen_basic_translate_runme.py +++ b/Examples/test-suite/python/doxygen_basic_translate_runme.py @@ -60,7 +60,7 @@ comment_verifier.check(inspect.getdoc(doxygen_basic_translate.function5), comment_verifier.check(inspect.getdoc(doxygen_basic_translate.function6), """\ Test for default args -:type a: int +:type a: int, optional :param a: Some parameter, default is 42""" ) comment_verifier.check(inspect.getdoc(doxygen_basic_translate.function7), @@ -70,6 +70,16 @@ Test for a parameter with difficult type :type a: :py:class:`Shape` :param a: Very strange param""" ) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate.function8), + """\ +Test variadic function +:param ...: extra args""" +) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate.function9), + """\ +Test unnamed argument +:param baz: Description of baz""" +) comment_verifier.check(inspect.getdoc(doxygen_basic_translate.Atan2), """\ diff --git a/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py b/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py index b75045d59..a24f5defc 100644 --- a/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py +++ b/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py @@ -58,7 +58,7 @@ comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style2.function5), comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style2.function6), """\ Test for default args -:type a: int +:type a: int, optional :param a: Some parameter, default is 42""" ) comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style2.function7), diff --git a/Examples/test-suite/python/doxygen_basic_translate_style3_runme.py b/Examples/test-suite/python/doxygen_basic_translate_style3_runme.py new file mode 100644 index 000000000..687270351 --- /dev/null +++ b/Examples/test-suite/python/doxygen_basic_translate_style3_runme.py @@ -0,0 +1,82 @@ +import doxygen_basic_translate_style3 +import inspect +import string +import sys +import comment_verifier + +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.function), + """\ +Brief description. + +The comment text. + +Author: Some author + +:rtype: int +:return: Some number + +See also: function2""" +) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.function2), + """\ +A test of a very very very very very very very very very very very very very very very very +very very very very very long comment string.""" +) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.function3), + """*Overload 1:* +A test for overloaded functions +This is function **one** + +| + +*Overload 2:* +A test for overloaded functions +This is function **two**""" +) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.function4), + """\ +A test of some mixed tag usage +If: CONDITION { +This *code* fragment shows us something . +Title: Minuses: +* it\'s senseless +* it\'s stupid +* it\'s null + +Warning: This may not work as expected + +.. code-block:: c++ + + int main() { while(true); } + + int testBlankLine() {} +}""" +) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.function5), + """This is a post comment.""" +) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.function6), + """\ +Test for default args +:type a: int, optional +:param a: Some parameter, default is 42""" +) +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.function7), + """\ +Test for a parameter with difficult type +(mostly for python) +:type a: :py:class:`Shape` +:param a: Very strange param""" +) + +comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style3.Atan2), + """\ +Multiple parameters test. + +:type y: float +:param y: Vertical coordinate. +:type x: float +:param x: Horizontal coordinate. +:rtype: float +:return: Arc tangent of ``y/x``.""" +) diff --git a/Examples/test-suite/python/doxygen_code_blocks_runme.py b/Examples/test-suite/python/doxygen_code_blocks_runme.py new file mode 100644 index 000000000..46a0a3d84 --- /dev/null +++ b/Examples/test-suite/python/doxygen_code_blocks_runme.py @@ -0,0 +1,58 @@ +import doxygen_code_blocks +import inspect +import string +import sys +import comment_verifier + +comment_verifier.check(inspect.getdoc(doxygen_code_blocks.function), + """\ +Test for code blocks + +.. code-block:: c++ + + simple code block + +More advanced usage with C++ characters: + +.. code-block:: c++ + + std::vector first; // empty vector of ints + std::vector second (4,100); // four ints with value 100 + std::vector third (second.begin(),second.end()); // iterating through second + std::vector fourth (third); // a copy of third + // the iterator constructor can also be used to construct from arrays: + int myints[] = {16,2,77,29}; + std::vector fifth (myints, myints + sizeof(myints) / sizeof(int) ); + + std::cout << "The contents of fifth are:"; + for (std::vector::iterator it = fifth.begin(); it != fifth.end(); ++it) + std::cout << ' ' << *it; + std::cout << '\\n'; + +A code block for C: + +.. code-block:: c + + printf("hello world"); + +A code block for Java: + +.. code-block:: java + + public class HelloWorld { + public static void main(String[] args) { + // Prints "Hello, World" to the terminal window. + System.out.println("Hello, World"); + } + } + +A code block for python: + +.. code-block:: python + + print('hello world') + +A python doctest example: + +>>> 1 + 1 +2""") diff --git a/Examples/test-suite/python/doxygen_misc_constructs_runme.py b/Examples/test-suite/python/doxygen_misc_constructs_runme.py index 11aa53ba3..44f607fee 100644 --- a/Examples/test-suite/python/doxygen_misc_constructs_runme.py +++ b/Examples/test-suite/python/doxygen_misc_constructs_runme.py @@ -12,7 +12,7 @@ comment_verifier.check(inspect.getdoc(doxygen_misc_constructs.getAddress), :param fileName: name of the file, where the source line is located :type line: int :param line: line number -:type isGetSize: boolean +:type isGetSize: boolean, optional :param isGetSize: if set, for every object location both address and size are returned Connection::getId() """) @@ -131,3 +131,13 @@ Spaces at the start of line should be taken into account: :type fileName: string :param fileName: name of the log file""" ); + +comment_verifier.check(inspect.getdoc(doxygen_misc_constructs.doc_ends_with_quote), + r'''This doc comment ends with a quote: "and that's ok"''' +); + +comment_verifier.check(inspect.getdoc(doxygen_misc_constructs.doc_with_triple_quotes), + r'''This comment contains embedded triple-quoted string: + + """How quaint"""''' +); diff --git a/Examples/test-suite/python/doxygen_translate_all_tags_runme.py b/Examples/test-suite/python/doxygen_translate_all_tags_runme.py index df1c0eba5..e884cf9ef 100644 --- a/Examples/test-suite/python/doxygen_translate_all_tags_runme.py +++ b/Examples/test-suite/python/doxygen_translate_all_tags_runme.py @@ -82,7 +82,7 @@ r"""Comment for **func03()**. *italicword* -emphazedWord +*emphazedWord* @@ -175,7 +175,7 @@ This will only appear in LATeX -someMember Some description follows +someMember Some description follows with text after @@ -196,7 +196,7 @@ is the note! This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. -someword +``someword`` @@ -209,7 +209,13 @@ Maybe even multiline :type a: int -:param a: the first param""") +:param a: the first param +:type b: int, in +:param b: parameter with intent(in) +:type c: int, out +:param c: parameter with intent(out) +:type d: int, in/out +:param d: parameter with intent(in,out)""") comment_verifier.check(inspect.getdoc(doxygen_translate_all_tags.func08), r"""Text after anchor. diff --git a/Examples/test-suite/python/doxygen_translate_runme.py b/Examples/test-suite/python/doxygen_translate_runme.py index d698ba873..38dca2ef9 100644 --- a/Examples/test-suite/python/doxygen_translate_runme.py +++ b/Examples/test-suite/python/doxygen_translate_runme.py @@ -80,7 +80,7 @@ is the note! This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. -someword +``someword`` diff --git a/Examples/test-suite/python/dynamic_cast_runme.py b/Examples/test-suite/python/dynamic_cast_runme.py index 59e86d34c..ae080833b 100644 --- a/Examples/test-suite/python/dynamic_cast_runme.py +++ b/Examples/test-suite/python/dynamic_cast_runme.py @@ -8,4 +8,4 @@ y = b.blah() a = dynamic_cast.do_test(y) if a != "Bar::test": - print "Failed!!" + raise RuntimeError("Failed!!") diff --git a/Examples/test-suite/python/exception_order_runme.py b/Examples/test-suite/python/exception_order_runme.py index c53521e3e..5c1529999 100644 --- a/Examples/test-suite/python/exception_order_runme.py +++ b/Examples/test-suite/python/exception_order_runme.py @@ -9,36 +9,35 @@ a = A() try: a.foo() -except E1, e: +except E1 as e: pass except: - raise RuntimeError, "bad exception order" + raise RuntimeError("bad exception order") try: a.bar() -except E2, e: +except E2 as e: pass except: - raise RuntimeError, "bad exception order" + raise RuntimeError("bad exception order") try: a.foobar() -except RuntimeError, e: +except RuntimeError as e: if e.args[0] != "postcatch unknown": - print "bad exception order", - raise RuntimeError, e.args + raise RuntimeError("bad exception order {}".format(e.args)) try: a.barfoo(1) -except E1, e: +except E1 as e: pass except: - raise RuntimeError, "bad exception order" + raise RuntimeError("bad exception order") try: a.barfoo(2) -except E2, e: +except E2 as e: pass except: - raise RuntimeError, "bad exception order" + raise RuntimeError("bad exception order") diff --git a/Examples/test-suite/python/fvirtual_runme.py b/Examples/test-suite/python/fvirtual_runme.py index 99f5dc6b0..fe211b441 100644 --- a/Examples/test-suite/python/fvirtual_runme.py +++ b/Examples/test-suite/python/fvirtual_runme.py @@ -5,4 +5,4 @@ n = Node() i = sw.addChild(n) if i != 2: - raise RuntimeError, "addChild" + raise RuntimeError("addChild") diff --git a/Examples/test-suite/python/global_functions_runme.py b/Examples/test-suite/python/global_functions_runme.py index f411261b6..4aab1b082 100644 --- a/Examples/test-suite/python/global_functions_runme.py +++ b/Examples/test-suite/python/global_functions_runme.py @@ -11,7 +11,7 @@ check(global_two(2, 2), 4) fail = True try: global_void(1) -except TypeError, e: +except TypeError as e: fail = False if fail: raise RuntimeError("argument count check failed") @@ -19,7 +19,7 @@ if fail: fail = True try: global_one() -except TypeError, e: +except TypeError as e: fail = False if fail: raise RuntimeError("argument count check failed") @@ -27,7 +27,7 @@ if fail: fail = True try: global_one(2, 2) -except TypeError, e: +except TypeError as e: fail = False if fail: @@ -36,7 +36,7 @@ if fail: fail = True try: global_two(1) -except TypeError, e: +except TypeError as e: fail = False if fail: @@ -45,7 +45,7 @@ if fail: fail = True try: global_two(3, 3, 3) -except TypeError, e: +except TypeError as e: fail = False if fail: diff --git a/Examples/test-suite/python/global_vars_runme.py b/Examples/test-suite/python/global_vars_runme.py index 3ef0b494f..015519ec8 100644 --- a/Examples/test-suite/python/global_vars_runme.py +++ b/Examples/test-suite/python/global_vars_runme.py @@ -20,7 +20,7 @@ if x != 9876: fail = True try: global_vars.cvar.notexist = "something" -except AttributeError, e: +except AttributeError as e: fail = False if fail: raise RuntimeError("AttributeError should have been thrown") @@ -28,7 +28,7 @@ if fail: fail = True try: g = global_vars.cvar.notexist -except AttributeError, e: +except AttributeError as e: fail = False if fail: raise RuntimeError("AttributeError should have been thrown") diff --git a/Examples/test-suite/python/import_stl_runme.py b/Examples/test-suite/python/import_stl_runme.py index 69fe812b9..d0efbd083 100644 --- a/Examples/test-suite/python/import_stl_runme.py +++ b/Examples/test-suite/python/import_stl_runme.py @@ -3,4 +3,4 @@ import import_stl_a v_new = import_stl_b.process_vector([1, 2, 3]) if v_new != (1, 2, 3, 4): - raise RuntimeError, v_new + raise RuntimeError(v_new) diff --git a/Examples/test-suite/python/inctest_runme.py b/Examples/test-suite/python/inctest_runme.py index fa3492932..c2746560d 100644 --- a/Examples/test-suite/python/inctest_runme.py +++ b/Examples/test-suite/python/inctest_runme.py @@ -1,31 +1,21 @@ import inctest -error = 0 try: a = inctest.A() except: - print "didn't find A" - print "therefore, I didn't include 'testdir/subdir1/hello.i'" - error = 1 + raise RuntimeError("didn't find A, therefore, I didn't include 'testdir/subdir1/hello.i'") pass try: b = inctest.B() except: - print "didn't find B" - print "therefore, I didn't include 'testdir/subdir2/hello.i'" - error = 1 + raise RuntimeError("didn't find B, therefore, I didn't include 'testdir/subdir2/hello.i'") pass -if error == 1: - raise RuntimeError - # Check the import in subdirectory worked if inctest.importtest1(5) != 15: - print "import test 1 failed" - raise RuntimeError + raise RuntimeError("import test 1 failed") if inctest.importtest2("black") != "white": - print "import test 2 failed" - raise RuntimeError + raise RuntimeError("import test 2 failed") diff --git a/Examples/test-suite/python/inherit_missing_runme.py b/Examples/test-suite/python/inherit_missing_runme.py index 044c166fb..57a245e44 100644 --- a/Examples/test-suite/python/inherit_missing_runme.py +++ b/Examples/test-suite/python/inherit_missing_runme.py @@ -6,14 +6,14 @@ c = inherit_missing.Spam() x = inherit_missing.do_blah(a) if x != "Foo::blah": - print "Whoa! Bad return", x + raise RuntimeError("Whoa! Bad return {}".format(x)) x = inherit_missing.do_blah(b) if x != "Bar::blah": - print "Whoa! Bad return", x + raise RuntimeError("Whoa! Bad return {}".format(x)) x = inherit_missing.do_blah(c) if x != "Spam::blah": - print "Whoa! Bad return", x + raise RuntimeError("Whoa! Bad return {}".format(x)) inherit_missing.delete_Foo(a) diff --git a/Examples/test-suite/python/inplaceadd_runme.py b/Examples/test-suite/python/inplaceadd_runme.py index 7f292cbb5..3d5a1fd40 100644 --- a/Examples/test-suite/python/inplaceadd_runme.py +++ b/Examples/test-suite/python/inplaceadd_runme.py @@ -3,8 +3,7 @@ a = inplaceadd.A(7) a += 5 if a.val != 12: - print a.val - raise RuntimeError + raise RuntimeError("a.val: {}".format(a.val)) a -= 5 if a.val != 7: diff --git a/Examples/test-suite/python/kwargs_feature_runme.py b/Examples/test-suite/python/kwargs_feature_runme.py index a2d4731ab..387658ec3 100644 --- a/Examples/test-suite/python/kwargs_feature_runme.py +++ b/Examples/test-suite/python/kwargs_feature_runme.py @@ -79,3 +79,61 @@ if rfoo(n=11, x=22) != -11: if rfoo(x=11, n=22) != 11: raise RuntimeError + +# Extended constructors +e = Extending0() +e = Extending1(one=1) +e = Extending1(1) +e = Extending2(1, "two") +e = Extending2(1, two="two") +e = Extending2(two="two", one=1) +e = ExtendingOptArgs1() +e = ExtendingOptArgs1(1) +e = ExtendingOptArgs2(one=1) +e = ExtendingOptArgs2() +e = ExtendingOptArgs2(one=1) +e = ExtendingOptArgs2(two="two") +e = ExtendingOptArgs2(two="two", one=1) + +# Invalid kwargs test +h = Hello() +try: + h = Hello(nonexistent=10) + raise RuntimeError("missed exception") +except TypeError as e: + pass + +f = Foo(1) +f = Foo(a=1) +try: + f = Foo(nonexistent=10) + raise RuntimeError("missed exception") +except TypeError as e: + pass + +try: + f = Foo(a=1, nonexistent=10) + raise RuntimeError("missed exception") +except TypeError as e: + pass + +try: + f = Foo(1, nonexistent=10) + raise RuntimeError("missed exception") +except TypeError as e: + pass + +# Varargs +f = VarargConstructor(fmt="Ciao") +f.vararg_method(fmt="Bonjour") +try: + f = VarargConstructor(nonexistent="Ciao") + raise RuntimeError("missed exception") +except TypeError as e: + pass + +try: + f.vararg_method(nonexistent="Bonjour") + raise RuntimeError("missed exception") +except TypeError as e: + pass diff --git a/Examples/test-suite/python/li_attribute_runme.py b/Examples/test-suite/python/li_attribute_runme.py index 80e793618..d26bf0b68 100644 --- a/Examples/test-suite/python/li_attribute_runme.py +++ b/Examples/test-suite/python/li_attribute_runme.py @@ -8,12 +8,10 @@ if aa.a != 1: raise RuntimeError aa.a = 3 if aa.a != 3: - print aa.a - raise RuntimeError + raise RuntimeError("aa.a: {}".format(aa.a)) if aa.b != 2: - print aa.b - raise RuntimeError + raise RuntimeError("aa.b: {}".format(aa.b)) aa.b = 5 if aa.b != 5: raise RuntimeError @@ -47,6 +45,9 @@ myClass = li_attribute.MyClass() myClass.Foo = myFoo if myClass.Foo.x != 8: raise RuntimeError +myClass.Foo2 = myFoo +if myClass.Foo2.x != 8: + raise RuntimeError # class/struct attribute with get/set methods using return/pass by value myClassVal = li_attribute.MyClassVal() @@ -77,7 +78,7 @@ if myStringyClass.ReadOnlyString != "changed string": try: x = myFoo.does_not_exist raise RuntimeError -except AttributeError, e: +except AttributeError as e: if str(e).find("does_not_exist") == -1: raise RuntimeError diff --git a/Examples/test-suite/python/li_attribute_template_runme.py b/Examples/test-suite/python/li_attribute_template_runme.py index d33b12309..f0a774995 100644 --- a/Examples/test-suite/python/li_attribute_template_runme.py +++ b/Examples/test-suite/python/li_attribute_template_runme.py @@ -7,8 +7,7 @@ chell = li_attribute_template.Cintint(1, 2, 3) def rassert(what, master): if what != master: - print what - raise RuntimeError + raise RuntimeError("what: {}".format(what)) # Testing primitive by value attribute rassert(chell.a, 1) diff --git a/Examples/test-suite/python/li_boost_shared_ptr_runme.py b/Examples/test-suite/python/li_boost_shared_ptr_runme.py index c960625ad..ecda7fdb1 100644 --- a/Examples/test-suite/python/li_boost_shared_ptr_runme.py +++ b/Examples/test-suite/python/li_boost_shared_ptr_runme.py @@ -10,7 +10,7 @@ class li_boost_shared_ptr_runme: def main(self): if (debug): - print "Started" + print("Started") li_boost_shared_ptr.cvar.debug_shared = debug @@ -32,7 +32,7 @@ class li_boost_shared_ptr_runme: "shared_ptr wrapper count=%s" % wrapper_count) if (debug): - print "Finished" + print("Finished") def runtest(self): # simple shared_ptr usage - created in C++ diff --git a/Examples/test-suite/python/li_cstring_runme.py b/Examples/test-suite/python/li_cstring_runme.py index b718f1352..d22fc261b 100644 --- a/Examples/test-suite/python/li_cstring_runme.py +++ b/Examples/test-suite/python/li_cstring_runme.py @@ -11,12 +11,10 @@ if test2() != " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ raise RuntimeError if test3("hello") != "hello-suffix": - print test3("hello") - raise RuntimeError + raise RuntimeError("test3(\"hello\")") if test4("hello") != "hello-suffix": - print test4("hello") - raise RuntimeError + raise RuntimeError("test4(\"hello\")") if test5(4) != "xxxx": raise RuntimeError diff --git a/Examples/test-suite/python/li_cwstring_runme.py b/Examples/test-suite/python/li_cwstring_runme.py index 5dd7b9b20..9216445c6 100644 --- a/Examples/test-suite/python/li_cwstring_runme.py +++ b/Examples/test-suite/python/li_cwstring_runme.py @@ -1,28 +1,28 @@ from li_cwstring import * -if count(u"ab\0ab\0ab\0", 0) != 3: +if count("ab\0ab\0ab\0", 0) != 3: raise RuntimeError -if test1() != u"Hello World": +if test1() != "Hello World": raise RuntimeError -if test2() != u" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_": +if test2() != " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_": raise RuntimeError -if test3("hello") != u"hello-suffix": +if test3("hello") != "hello-suffix": raise RuntimeError -if test4("hello") != u"hello-suffix": +if test4("hello") != "hello-suffix": raise RuntimeError -if test5(4) != u"xxxx": +if test5(4) != "xxxx": raise RuntimeError -if test6(10) != u"xxxxx": +if test6(10) != "xxxxx": raise RuntimeError -if test7() != u"Hello world!": +if test7() != "Hello world!": raise RuntimeError -if test8() != u" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_": +if test8() != " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_": raise RuntimeError diff --git a/Examples/test-suite/python/li_implicit_runme.py b/Examples/test-suite/python/li_implicit_runme.py index d8dd0fdcc..5d5c6caa0 100644 --- a/Examples/test-suite/python/li_implicit_runme.py +++ b/Examples/test-suite/python/li_implicit_runme.py @@ -9,8 +9,8 @@ ad, get(ad) ab, get(ab) if get(ai) != get(1): - raise RuntimeError, "bad implicit type" + raise RuntimeError("bad implicit type") if get(ad) != get(2.0): - raise RuntimeError, "bad implicit type" + raise RuntimeError("bad implicit type") if get(ab) != get(b): - raise RuntimeError, "bad implicit type" + raise RuntimeError("bad implicit type") diff --git a/Examples/test-suite/python/li_std_containers_int_runme.py b/Examples/test-suite/python/li_std_containers_int_runme.py index 941838a5f..f346de220 100644 --- a/Examples/test-suite/python/li_std_containers_int_runme.py +++ b/Examples/test-suite/python/li_std_containers_int_runme.py @@ -6,7 +6,7 @@ import sys def failed(a, b, msg): - raise RuntimeError, msg + " " + str(list(a)) + " " + str(list(b)) + raise RuntimeError(msg + " " + str(list(a)) + " " + str(list(b))) def compare_sequences(a, b): @@ -26,7 +26,7 @@ def compare_containers(pythonlist, swigvector, swiglist): def container_insert_step(i, j, step, newval): - ps = range(6) + ps = list(range(6)) iv = vector_int(ps) il = list_int(ps) @@ -43,9 +43,9 @@ def container_insert_step(i, j, step, newval): else: ps[i:j:step] = newval ps_error = None - except ValueError, e: + except ValueError as e: ps_error = e - except IndexError, e: + except IndexError as e: ps_error = e # std::vector @@ -61,9 +61,9 @@ def container_insert_step(i, j, step, newval): else: iv[i:j:step] = newval iv_error = None - except ValueError, e: + except ValueError as e: iv_error = e - except IndexError, e: + except IndexError as e: iv_error = e # std::list @@ -79,14 +79,14 @@ def container_insert_step(i, j, step, newval): else: il[i:j:step] = newval il_error = None - except ValueError, e: + except ValueError as e: il_error = e - except IndexError, e: + except IndexError as e: il_error = e if not((type(ps_error) == type(iv_error)) and (type(ps_error) == type(il_error))): - raise RuntimeError, "ValueError exception not consistently thrown: " + \ - str(ps_error) + " " + str(iv_error) + " " + str(il_error) + raise RuntimeError("ValueError exception not consistently thrown: " + \ + str(ps_error) + " " + str(iv_error) + " " + str(il_error)) compare_containers(ps, iv, il) @@ -94,7 +94,7 @@ def container_insert_step(i, j, step, newval): # Check std::vector and std::list delete behaves same as Python list # delete including exceptions def container_delete_step(i, j, step): - ps = range(6) + ps = list(range(6)) iv = vector_int(ps) il = list_int(ps) @@ -111,9 +111,9 @@ def container_delete_step(i, j, step): else: del ps[i:j:step] ps_error = None - except ValueError, e: + except ValueError as e: ps_error = e - except IndexError, e: + except IndexError as e: ps_error = e # std::vector @@ -129,9 +129,9 @@ def container_delete_step(i, j, step): else: del iv[i:j:step] iv_error = None - except ValueError, e: + except ValueError as e: iv_error = e - except IndexError, e: + except IndexError as e: iv_error = e # std::list @@ -147,14 +147,14 @@ def container_delete_step(i, j, step): else: del il[i:j:step] il_error = None - except ValueError, e: + except ValueError as e: il_error = e - except IndexError, e: + except IndexError as e: il_error = e if not((type(ps_error) == type(iv_error)) and (type(ps_error) == type(il_error))): - raise RuntimeError, "ValueError exception not consistently thrown: " + \ - str(ps_error) + " " + str(iv_error) + " " + str(il_error) + raise RuntimeError("ValueError exception not consistently thrown: " + \ + str(ps_error) + " " + str(iv_error) + " " + str(il_error)) compare_containers(ps, iv, il) @@ -252,7 +252,7 @@ for start in [-102, -100, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 10 for step in range(-7, 7): container_delete_step(start, end, step) -ps = range(6) +ps = list(range(6)) iv = vector_int(ps) il = list_int(ps) del ps[:] diff --git a/Examples/test-suite/python/li_std_containers_overload_runme.py b/Examples/test-suite/python/li_std_containers_overload_runme.py new file mode 100644 index 000000000..dcb383511 --- /dev/null +++ b/Examples/test-suite/python/li_std_containers_overload_runme.py @@ -0,0 +1,29 @@ +from li_std_containers_overload import * + +def check(got, expected): + if got != expected: + raise RuntimeError("Failed check. '{}' != '{}'".format(got, expected)) + +v = VectorX() +check(VectorOverload(v), "vector") + +v = VectorY() +check(VectorOverload(v), "vector") + +v = VectorInt() +check(VectorOverload(v), "vector") + +v = VectorString() +check(VectorOverload(v), "vector") + +v = [X()] +check(VectorOverload(v), "vector") + +v = [Y()] +check(VectorOverload(v), "vector") + +v = [1, 2, 3] +check(VectorOverload(v), "vector") + +v = ["aaa", "bbb", "ccc"] +check(VectorOverload(v), "vector") diff --git a/Examples/test-suite/python/li_std_map_runme.py b/Examples/test-suite/python/li_std_map_runme.py index ac214dd45..765527ea4 100644 --- a/Examples/test-suite/python/li_std_map_runme.py +++ b/Examples/test-suite/python/li_std_map_runme.py @@ -25,8 +25,7 @@ for k in m: for k in m: if pm[k].this != m[k].this: - print pm[k], m[k] - raise RuntimeError + raise RuntimeError("Not equal {} {}".format(pm[k], m[k])) m = {} @@ -51,31 +50,31 @@ mii[1] = 2 if mii[1] != 2: raise RuntimeError -if mii.keys() != [1]: +if list(mii.keys()) != [1]: raise RuntimeError("keys") -if mii.values() != [2]: +if list(mii.values()) != [2]: raise RuntimeError("values") -if mii.items() != [(1, 2)]: +if list(mii.items()) != [(1, 2)]: raise RuntimeError("items") if [k for k in mii] != [1]: raise RuntimeError("iteration") -if [i for i in mii.iterkeys()] != [1]: +if [i for i in mii.keys()] != [1]: raise RuntimeError("iterkeys") -if [i for i in mii.itervalues()] != [2]: +if [i for i in mii.values()] != [2]: raise RuntimeError("itervalues") -if [i for i in mii.iteritems()] != [(1, 2)]: +if [i for i in mii.items()] != [(1, 2)]: raise RuntimeError("iteritems") slmap = li_std_map.StringLengthNumberMap() li_std_map.populate(slmap) -keys = " ".join([k for k in slmap.keys()]) +keys = " ".join([k for k in list(slmap.keys())]) if keys != "a aa zzz xxxx aaaaa": raise RuntimeError("Keys are wrong or in wrong order: " + keys) -values = " ".join([str(v) for v in slmap.values()]) +values = " ".join([str(v) for v in list(slmap.values())]) if values != "1 2 3 4 5": raise RuntimeError("Values are wrong or in wrong order: " + values) diff --git a/Examples/test-suite/python/li_std_pair_runme.py b/Examples/test-suite/python/li_std_pair_runme.py new file mode 100644 index 000000000..4150e5cc8 --- /dev/null +++ b/Examples/test-suite/python/li_std_pair_runme.py @@ -0,0 +1,47 @@ +from li_std_pair import * + +def check(flag): + if not flag: + raise RuntimeError("Check failed") + +intPair = makeIntPair(7, 6) +check(isinstance(intPair, tuple)) +check(len(intPair) == 2) +check(intPair[0] == 7) +check(intPair[1] == 6) + +intPairConstRef = makeIntPairConstRef(7, 6) +check(isinstance(intPairConstRef, tuple)) +check(intPairConstRef[0] == 7) +check(intPairConstRef[1] == 6) + +# +# Each of these should return a reference to a wrapped +# std::pair object (i.e. an IntPair instance). +# +intPairPtr = makeIntPairPtr(7, 6) +check(isinstance(intPairPtr, IntPair)) +check(intPairPtr[0] == 7) +check(intPairPtr[1] == 6) + +intPairRef = makeIntPairRef(7, 6) +check(isinstance(intPairRef, IntPair)) +check(intPairRef[0] == 7) +check(intPairRef[1] == 6) +# +# Now test various input typemaps. Each of the wrapped C++ functions +# (product1, product2 and product3) is expecting an argument of a +# different type (see li_std_pair.i). Typemaps should be in place to +# convert this tuple into the expected argument type. +# +check(product1(intPair) == 42) +check(product2(intPair) == 42) +# check(product3(intPair) == 42) # TODO, if desirable to match Ruby wrappers behaviour. Requires equivalent to typemap(in) std::pair* in Lib/ruby/std_pair.i and further fixes to stop recursive calls to swig::asptr which this testcase shows. Plus further changes for any type of sequence type (including other STL containers) to be accepted by all methods taking an STL container to match Ruby behaviour. + +# +# Similarly, each of the input typemaps should know what to do +# with an IntPair instance. +# +check(product1(intPairPtr) == 42) +check(product2(intPairPtr) == 42) +check(product3(intPairPtr) == 42) diff --git a/Examples/test-suite/python/li_std_set_runme.py b/Examples/test-suite/python/li_std_set_runme.py index 5e5b72442..34a1eb19c 100644 --- a/Examples/test-suite/python/li_std_set_runme.py +++ b/Examples/test-suite/python/li_std_set_runme.py @@ -14,11 +14,11 @@ if sum != "abc": raise RuntimeError i = s.__iter__() -if i.next() != "a": +if next(i) != "a": raise RuntimeError -if i.next() != "b": +if next(i) != "b": raise RuntimeError -if i.next() != "c": +if next(i) != "c": raise RuntimeError @@ -26,7 +26,7 @@ b = s.begin() e = s.end() sum = "" while (b != e): - sum = sum + b.next() + sum = sum + next(b) if sum != "abc": raise RuntimeError @@ -34,7 +34,7 @@ b = s.rbegin() e = s.rend() sum = "" while (b != e): - sum = sum + b.next() + sum = sum + next(b) if sum != "cba": raise RuntimeError @@ -47,25 +47,25 @@ si.append(2) si.append(3) i = si.__iter__() -if i.next() != 1: +if next(i) != 1: raise RuntimeError -if i.next() != 2: +if next(i) != 2: raise RuntimeError -if i.next() != 3: +if next(i) != 3: raise RuntimeError if si[0] != 1: raise RuntimeError i = s.begin() -i.next() +next(i) s.erase(i) b = s.begin() e = s.end() sum = "" while (b != e): - sum = sum + b.next() + sum = sum + next(b) if sum != "ac": raise RuntimeError diff --git a/Examples/test-suite/python/li_std_stream_runme.py b/Examples/test-suite/python/li_std_stream_runme.py index 08c308856..a4526f07b 100644 --- a/Examples/test-suite/python/li_std_stream_runme.py +++ b/Examples/test-suite/python/li_std_stream_runme.py @@ -9,5 +9,4 @@ o << a << " " << 2345 << " " << 1.435 if o.str() != "A class 2345 1.435": - print "\"%s\"" % (o.str(),) - raise RuntimeError + raise RuntimeError("str failed: \"%s\"".format(o.str())) diff --git a/Examples/test-suite/python/li_std_string_extra_runme.py b/Examples/test-suite/python/li_std_string_extra_runme.py index 087d92b19..96c64163d 100644 --- a/Examples/test-suite/python/li_std_string_extra_runme.py +++ b/Examples/test-suite/python/li_std_string_extra_runme.py @@ -4,17 +4,16 @@ x = "hello" if li_std_string_extra.test_ccvalue(x) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_cvalue(x) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_value(x) != x: - print x, li_std_string_extra.test_value(x) - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping {} {}".format(x, li_std_string_extra.test_value(x))) if li_std_string_extra.test_const_reference(x) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") s = li_std_string_extra.string("he") @@ -23,45 +22,43 @@ s = li_std_string_extra.string("he") s = s + "llo" if s != x: - print s, x - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping {} {}".format(s, x)) if s[1:4] != x[1:4]: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_value(s) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_const_reference(s) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") a = li_std_string_extra.A(s) if li_std_string_extra.test_value(a) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_const_reference(a) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") b = li_std_string_extra.string(" world") s = a + b if a + b != "hello world": - print a + b - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping {}".format(a + b)) if a + " world" != "hello world": - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") # This is expected to fail with -builtin option # Reverse operators not supported in builtin types if not li_std_string_extra.is_python_builtin(): if "hello" + b != "hello world": - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") c = "hello" + b if c.find_last_of("l") != 9: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") s = "hello world" @@ -69,33 +66,33 @@ b = li_std_string_extra.B("hi") b.name = li_std_string_extra.string("hello") if b.name != "hello": - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") b.a = li_std_string_extra.A("hello") if b.a != "hello": - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_value_basic1(x) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_value_basic2(x) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_value_basic3(x) != x: - raise RuntimeError, "bad string mapping" + raise RuntimeError("bad string mapping") if li_std_string_extra.test_value_basic_overload(x) != x: - raise RuntimeError, "bad overload string" + raise RuntimeError("bad overload string") if li_std_string_extra.test_value_basic_overload(123) != "int": - raise RuntimeError, "bad overload int" + raise RuntimeError("bad overload int") try: li_std_string_extra.test_value_basic_overload([x]) - raise RuntimeError, "should throw TypeError" + raise RuntimeError("should throw TypeError") except TypeError as e: if str(e).find("Possible C/C++ prototypes are:") == -1: raise RuntimeError("Incorrect error message text:\n{}".format(e)) @@ -103,7 +100,7 @@ except TypeError as e: try: li_std_string_extra.test_value_basic_overload([123]) - raise RuntimeError, "should throw TypeError" + raise RuntimeError("should throw TypeError") except TypeError as e: if str(e).find("Possible C/C++ prototypes are:") == -1: raise RuntimeError("Incorrect error message text:\n{}".format(e)) @@ -112,30 +109,30 @@ except TypeError as e: # Global variables s = "initial string" if li_std_string_extra.cvar.GlobalString2 != "global string 2": - raise RuntimeError, "GlobalString2 test 1" + raise RuntimeError("GlobalString2 test 1") li_std_string_extra.cvar.GlobalString2 = s if li_std_string_extra.cvar.GlobalString2 != s: - raise RuntimeError, "GlobalString2 test 2" + raise RuntimeError("GlobalString2 test 2") if li_std_string_extra.cvar.ConstGlobalString != "const global string": - raise RuntimeError, "ConstGlobalString test" + raise RuntimeError("ConstGlobalString test") # Member variables myStructure = li_std_string_extra.Structure() if myStructure.MemberString2 != "member string 2": - raise RuntimeError, "MemberString2 test 1" + raise RuntimeError("MemberString2 test 1") myStructure.MemberString2 = s if myStructure.MemberString2 != s: - raise RuntimeError, "MemberString2 test 2" + raise RuntimeError("MemberString2 test 2") if myStructure.ConstMemberString != "const member string": - raise RuntimeError, "ConstMemberString test" + raise RuntimeError("ConstMemberString test") if li_std_string_extra.cvar.Structure_StaticMemberString2 != "static member string 2": - raise RuntimeError, "StaticMemberString2 test 1" + raise RuntimeError("StaticMemberString2 test 1") li_std_string_extra.cvar.Structure_StaticMemberString2 = s if li_std_string_extra.cvar.Structure_StaticMemberString2 != s: - raise RuntimeError, "StaticMemberString2 test 2" + raise RuntimeError("StaticMemberString2 test 2") if li_std_string_extra.cvar.Structure_ConstStaticMemberString != "const static member string": - raise RuntimeError, "ConstStaticMemberString test" + raise RuntimeError("ConstStaticMemberString test") if li_std_string_extra.test_reference_input("hello") != "hello": diff --git a/Examples/test-suite/python/li_std_vector_enum_runme.py b/Examples/test-suite/python/li_std_vector_enum_runme.py index 318d1bff6..587f20b37 100644 --- a/Examples/test-suite/python/li_std_vector_enum_runme.py +++ b/Examples/test-suite/python/li_std_vector_enum_runme.py @@ -14,7 +14,7 @@ check(ev.nums[2], 30) it = ev.nums.iterator() v = it.value() check(v, 10) -it.next() +next(it) v = it.value() check(v, 20) diff --git a/Examples/test-suite/python/li_std_vector_extra_runme.py b/Examples/test-suite/python/li_std_vector_extra_runme.py index 59e729a27..40444552b 100644 --- a/Examples/test-suite/python/li_std_vector_extra_runme.py +++ b/Examples/test-suite/python/li_std_vector_extra_runme.py @@ -23,20 +23,20 @@ bv[2] = bool(4) bv[3] = bool(0) if bv[0] != bv[2]: - raise RuntimeError, "bad std::vector mapping" + raise RuntimeError("bad std::vector mapping") b = B(5) va = VecA([b, None, b, b]) if va[0].f(1) != 6: - raise RuntimeError, "bad std::vector mapping" + raise RuntimeError("bad std::vector mapping") if vecAptr(va) != 6: - raise RuntimeError, "bad std::vector mapping" + raise RuntimeError("bad std::vector mapping") b.val = 7 if va[3].f(1) != 8: - raise RuntimeError, "bad std::vector mapping" + raise RuntimeError("bad std::vector mapping") ip = PtrInt() @@ -47,7 +47,7 @@ ArrInt_setitem(ap, 2, 123) vi = IntPtrVector((ip, ap, None)) if ArrInt_getitem(vi[0], 0) != ArrInt_getitem(vi[1], 2): - raise RuntimeError, "bad std::vector mapping" + raise RuntimeError("bad std::vector mapping") delete_ArrInt(ap) @@ -57,42 +57,42 @@ a = halfs([10, 8, 4, 3]) v = IntVector() v[0:2] = [1, 2] if v[0] != 1 or v[1] != 2: - raise RuntimeError, "bad setslice" + raise RuntimeError("bad setslice") if v[0:-1][0] != 1: - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice") if v[0:-2].size() != 0: - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice") v[0:1] = [2] if v[0] != 2: - raise RuntimeError, "bad setslice" + raise RuntimeError("bad setslice") v[1:] = [3] if v[1] != 3: - raise RuntimeError, "bad setslice" + raise RuntimeError("bad setslice") v[2:] = [3] if v[2] != 3: - raise RuntimeError, "bad setslice" + raise RuntimeError("bad setslice") if v[0:][0] != v[0]: - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice") del v[:] if v.size() != 0: - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice") del v[:] if v.size() != 0: - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice") v = vecStr(["hello ", "world"]) if v[0] != "hello world": - raise RuntimeError, "bad std::string+std::vector" + raise RuntimeError("bad std::string+std::vector") pv = pyvector([1, "hello", (1, 2)]) diff --git a/Examples/test-suite/python/li_std_wstream_runme.py b/Examples/test-suite/python/li_std_wstream_runme.py index 045645b61..0ecdddbf8 100644 --- a/Examples/test-suite/python/li_std_wstream_runme.py +++ b/Examples/test-suite/python/li_std_wstream_runme.py @@ -5,8 +5,7 @@ a = A() o = wostringstream() -o << a << u" " << 2345 << u" " << 1.435 << wends +o << a << " " << 2345 << " " << 1.435 << wends if o.str() != "A class 2345 1.435\0": - print "\"%s\"" % (o.str(),) - raise RuntimeError + raise RuntimeError("str failed: \"%s\"".format(o.str())) diff --git a/Examples/test-suite/python/li_std_wstring_inherit_runme.py b/Examples/test-suite/python/li_std_wstring_inherit_runme.py index 558914e7e..bd585890c 100644 --- a/Examples/test-suite/python/li_std_wstring_inherit_runme.py +++ b/Examples/test-suite/python/li_std_wstring_inherit_runme.py @@ -1,14 +1,13 @@ import li_std_wstring_inherit import sys -x = u"hello" +x = "hello" -s = li_std_wstring_inherit.wstring(u"he") -s = s + u"llo" +s = li_std_wstring_inherit.wstring("he") +s = s + "llo" if s != x: - print s, x - raise RuntimeError("bad string mapping") + raise RuntimeError("bad string mapping {} {}".format(s, x)) if s[1:4] != x[1:4]: raise RuntimeError("bad string mapping") @@ -34,12 +33,12 @@ if not li_std_wstring_inherit.is_python_builtin(): b = li_std_wstring_inherit.B("hi") -b.name = li_std_wstring_inherit.wstring(u"hello") +b.name = li_std_wstring_inherit.wstring("hello") if b.name != "hello": raise RuntimeError("bad string mapping") b.a = li_std_wstring_inherit.A("hello") -if b.a != u"hello": +if b.a != "hello": raise RuntimeError("bad string mapping") diff --git a/Examples/test-suite/python/li_std_wstring_runme.py b/Examples/test-suite/python/li_std_wstring_runme.py index c6210e2de..ca8dc3184 100644 --- a/Examples/test-suite/python/li_std_wstring_runme.py +++ b/Examples/test-suite/python/li_std_wstring_runme.py @@ -5,10 +5,10 @@ def check_equal(a, b): if a != b: raise RuntimeError("failed {} {}".format(a, b)) -h = u"h" +h = "h" check_equal(li_std_wstring.test_wcvalue(h), h) -x = u"abc" +x = "abc" check_equal(li_std_wstring.test_ccvalue(x), x) check_equal(li_std_wstring.test_cvalue(x), x) @@ -54,6 +54,12 @@ check_equal(li_std_wstring.test_value(x), x) check_equal(li_std_wstring.test_ccvalue(x), "abc") check_equal(li_std_wstring.test_wchar_overload(x), "abc") +ts = li_std_wstring.wchar_test_struct() +ts.wchar_t_member = h +check_equal(ts.wchar_t_member, h) +ts.wchar_t_ptr_member = s +check_equal(ts.wchar_t_ptr_member, s) + ################### Python specific # Byte strings only converted in Python 2 @@ -72,7 +78,7 @@ except TypeError: # Check surrogateescape if sys.version_info[0:2] > (3, 1): - x = u"h\udce9llo" # surrogate escaped representation of C char*: "h\xe9llo" + x = "h\udce9llo" # surrogate escaped representation of C char*: "h\xe9llo" if li_std_wstring.non_utf8_c_str() != x: raise RuntimeError("surrogateescape not working") if li_std_wstring.size_wstring(x) != 5 and len(x) != 5: diff --git a/Examples/test-suite/python/minherit_runme.py b/Examples/test-suite/python/minherit_runme.py index b7e7d019c..8638d2357 100644 --- a/Examples/test-suite/python/minherit_runme.py +++ b/Examples/test-suite/python/minherit_runme.py @@ -7,31 +7,31 @@ c = minherit.FooBar() d = minherit.Spam() if a.xget() != 1: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if b.yget() != 2: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if c.xget() != 1 or c.yget() != 2 or c.zget() != 3: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if d.xget() != 1 or d.yget() != 2 or d.zget() != 3 or d.wget() != 4: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if minherit.xget(a) != 1: - raise RuntimeError, "Bad attribute value %d" % (minherit.xget(a)) + raise RuntimeError("Bad attribute value %d" % (minherit.xget(a))) if minherit.yget(b) != 2: - raise RuntimeError, "Bad attribute value %d" % (minherit.yget(b)) + raise RuntimeError("Bad attribute value %d" % (minherit.yget(b))) if minherit.xget(c) != 1 or minherit.yget(c) != 2 or minherit.zget(c) != 3: - raise RuntimeError, "Bad attribute value %d %d %d" % ( - minherit.xget(c), minherit.yget(c), minherit.zget(c)) + raise RuntimeError("Bad attribute value %d %d %d" % ( + minherit.xget(c), minherit.yget(c), minherit.zget(c))) if minherit.xget(d) != 1 or minherit.yget(d) != 2 or minherit.zget(d) != 3 or minherit.wget(d) != 4: - raise RuntimeError, "Bad attribute value %d %d %d %d" % ( - minherit.xget(d), minherit.yget(d), minherit.zget(d), minherit.wget(d)) + raise RuntimeError("Bad attribute value %d %d %d %d" % ( + minherit.xget(d), minherit.yget(d), minherit.zget(d), minherit.wget(d))) # Cleanse all of the pointers and see what happens @@ -41,27 +41,27 @@ cc = minherit.toFooBarPtr(c) dd = minherit.toSpamPtr(d) if aa.xget() != 1: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if bb.yget() != 2: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if cc.xget() != 1 or cc.yget() != 2 or cc.zget() != 3: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if dd.xget() != 1 or dd.yget() != 2 or dd.zget() != 3 or dd.wget() != 4: - raise RuntimeError, "Bad attribute value" + raise RuntimeError("Bad attribute value") if minherit.xget(aa) != 1: - raise RuntimeError, "Bad attribute value %d" % (minherit.xget(aa)) + raise RuntimeError("Bad attribute value %d" % (minherit.xget(aa))) if minherit.yget(bb) != 2: - raise RuntimeError, "Bad attribute value %d" % (minherit.yget(bb)) + raise RuntimeError("Bad attribute value %d" % (minherit.yget(bb))) if minherit.xget(cc) != 1 or minherit.yget(cc) != 2 or minherit.zget(cc) != 3: - raise RuntimeError, "Bad attribute value %d %d %d" % ( - minherit.xget(cc), minherit.yget(cc), minherit.zget(cc)) + raise RuntimeError("Bad attribute value %d %d %d" % ( + minherit.xget(cc), minherit.yget(cc), minherit.zget(cc))) if minherit.xget(dd) != 1 or minherit.yget(dd) != 2 or minherit.zget(dd) != 3 or minherit.wget(dd) != 4: - raise RuntimeError, "Bad attribute value %d %d %d %d" % ( - minherit.xget(dd), minherit.yget(dd), minherit.zget(dd), minherit.wget(dd)) + raise RuntimeError("Bad attribute value %d %d %d %d" % ( + minherit.xget(dd), minherit.yget(dd), minherit.zget(dd), minherit.wget(dd))) diff --git a/Examples/test-suite/python/namespace_class_runme.py b/Examples/test-suite/python/namespace_class_runme.py index aa5165562..9349f2430 100644 --- a/Examples/test-suite/python/namespace_class_runme.py +++ b/Examples/test-suite/python/namespace_class_runme.py @@ -7,7 +7,7 @@ except: error = 0 if (error): - raise RuntimeError, "Private1 is private" + raise RuntimeError("Private1 is private") try: p = Private2() @@ -16,7 +16,7 @@ except: error = 0 if (error): - raise RuntimeError, "Private2 is private" + raise RuntimeError("Private2 is private") EulerT3D.toFrame(1, 1, 1) diff --git a/Examples/test-suite/python/not_c_keywords_runme.py b/Examples/test-suite/python/not_c_keywords_runme.py new file mode 100644 index 000000000..7f0772407 --- /dev/null +++ b/Examples/test-suite/python/not_c_keywords_runme.py @@ -0,0 +1,7 @@ +from not_c_keywords import * + +cs = ComplexStruct() +cs.init() +if cs.complex != 123: + raise RuntimeError("complex not correct") +cs.complex = 456 diff --git a/Examples/test-suite/python/overload_complicated_runme.py b/Examples/test-suite/python/overload_complicated_runme.py index 2593c4f16..8794da12b 100644 --- a/Examples/test-suite/python/overload_complicated_runme.py +++ b/Examples/test-suite/python/overload_complicated_runme.py @@ -10,38 +10,38 @@ p = Pop(pInt, False) # Check overloaded in const only and pointers/references which target # languages cannot disambiguate if p.hip(False) != 701: - raise RuntimeError, "Test 1 failed" + raise RuntimeError("Test 1 failed") if p.hip(pInt) != 702: - raise RuntimeError, "Test 2 failed" + raise RuntimeError("Test 2 failed") # Reverse the order for the above if p.hop(pInt) != 805: - raise RuntimeError, "Test 3 failed" + raise RuntimeError("Test 3 failed") if p.hop(False) != 801: - raise RuntimeError, "Test 4 failed" + raise RuntimeError("Test 4 failed") # Few more variations and order shuffled if p.pop(False) != 901: - raise RuntimeError, "Test 5 failed" + raise RuntimeError("Test 5 failed") if p.pop(pInt) != 904: - raise RuntimeError, "Test 6 failed" + raise RuntimeError("Test 6 failed") if p.pop() != 905: - raise RuntimeError, "Test 7 failed" + raise RuntimeError("Test 7 failed") # Overload on const only if p.bop(pInt) != 1001: - raise RuntimeError, "Test 8 failed" + raise RuntimeError("Test 8 failed") if p.bip(pInt) != 2002: - raise RuntimeError, "Test 9 failed" + raise RuntimeError("Test 9 failed") # Globals if muzak(False) != 3001: - raise RuntimeError, "Test 10 failed" + raise RuntimeError("Test 10 failed") if muzak(pInt) != 3002: - raise RuntimeError, "Test 11 failed" + raise RuntimeError("Test 11 failed") diff --git a/Examples/test-suite/python/overload_simple_runme.py b/Examples/test-suite/python/overload_simple_runme.py index 6d72ec081..8ad813b86 100644 --- a/Examples/test-suite/python/overload_simple_runme.py +++ b/Examples/test-suite/python/overload_simple_runme.py @@ -1,95 +1,95 @@ from overload_simple import * if foo(3) != "foo:int": - raise RuntimeError, "foo(int)" + raise RuntimeError("foo(int)") if foo(3.0) != "foo:double": - raise RuntimeError, "foo(double)" + raise RuntimeError("foo(double)") if foo("hello") != "foo:char *": - raise RuntimeError, "foo(char *)" + raise RuntimeError("foo(char *)") f = Foo() b = Bar() if foo(f) != "foo:Foo *": - raise RuntimeError, "foo(Foo *)" + raise RuntimeError("foo(Foo *)") if foo(b) != "foo:Bar *": - raise RuntimeError, "foo(Bar *)" + raise RuntimeError("foo(Bar *)") v = malloc_void(32) if foo(v) != "foo:void *": - raise RuntimeError, "foo(void *)" + raise RuntimeError("foo(void *)") s = Spam() if s.foo(3) != "foo:int": - raise RuntimeError, "Spam::foo(int)" + raise RuntimeError("Spam::foo(int)") if s.foo(3.0) != "foo:double": - raise RuntimeError, "Spam::foo(double)" + raise RuntimeError("Spam::foo(double)") if s.foo("hello") != "foo:char *": - raise RuntimeError, "Spam::foo(char *)" + raise RuntimeError("Spam::foo(char *)") if s.foo(f) != "foo:Foo *": - raise RuntimeError, "Spam::foo(Foo *)" + raise RuntimeError("Spam::foo(Foo *)") if s.foo(b) != "foo:Bar *": - raise RuntimeError, "Spam::foo(Bar *)" + raise RuntimeError("Spam::foo(Bar *)") if s.foo(v) != "foo:void *": - raise RuntimeError, "Spam::foo(void *)" + raise RuntimeError("Spam::foo(void *)") if Spam_bar(3) != "bar:int": - raise RuntimeError, "Spam::bar(int)" + raise RuntimeError("Spam::bar(int)") if Spam_bar(3.0) != "bar:double": - raise RuntimeError, "Spam::bar(double)" + raise RuntimeError("Spam::bar(double)") if Spam_bar("hello") != "bar:char *": - raise RuntimeError, "Spam::bar(char *)" + raise RuntimeError("Spam::bar(char *)") if Spam_bar(f) != "bar:Foo *": - raise RuntimeError, "Spam::bar(Foo *)" + raise RuntimeError("Spam::bar(Foo *)") if Spam_bar(b) != "bar:Bar *": - raise RuntimeError, "Spam::bar(Bar *)" + raise RuntimeError("Spam::bar(Bar *)") if Spam_bar(v) != "bar:void *": - raise RuntimeError, "Spam::bar(void *)" + raise RuntimeError("Spam::bar(void *)") # Test constructors s = Spam() if s.type != "none": - raise RuntimeError, "Spam()" + raise RuntimeError("Spam()") s = Spam(3) if s.type != "int": - raise RuntimeError, "Spam(int)" + raise RuntimeError("Spam(int)") s = Spam(3.4) if s.type != "double": - raise RuntimeError, "Spam(double)" + raise RuntimeError("Spam(double)") s = Spam("hello") if s.type != "char *": - raise RuntimeError, "Spam(char *)" + raise RuntimeError("Spam(char *)") s = Spam(f) if s.type != "Foo *": - raise RuntimeError, "Spam(Foo *)" + raise RuntimeError("Spam(Foo *)") s = Spam(b) if s.type != "Bar *": - raise RuntimeError, "Spam(Bar *)" + raise RuntimeError("Spam(Bar *)") s = Spam(v) if s.type != "void *": - raise RuntimeError, "Spam(void *)" + raise RuntimeError("Spam(void *)") free_void(v) diff --git a/Examples/test-suite/python/overload_subtype_runme.py b/Examples/test-suite/python/overload_subtype_runme.py index 3f32a5583..b02e62ff3 100644 --- a/Examples/test-suite/python/overload_subtype_runme.py +++ b/Examples/test-suite/python/overload_subtype_runme.py @@ -4,7 +4,7 @@ f = Foo() b = Bar() if spam(f) != 1: - raise RuntimeError, "foo" + raise RuntimeError("foo") if spam(b) != 2: - raise RuntimeError, "bar" + raise RuntimeError("bar") diff --git a/Examples/test-suite/python/overload_template_fast_runme.py b/Examples/test-suite/python/overload_template_fast_runme.py index ca3cac9b5..e4eb33288 100644 --- a/Examples/test-suite/python/overload_template_fast_runme.py +++ b/Examples/test-suite/python/overload_template_fast_runme.py @@ -7,74 +7,74 @@ b = maximum(3.4, 5.2) # mix 1 if (mix1("hi") != 101): - raise RuntimeError, ("mix1(const char*)") + raise RuntimeError(("mix1(const char*)")) if (mix1(1.0, 1.0) != 102): - raise RuntimeError, ("mix1(double, const double &)") + raise RuntimeError(("mix1(double, const double &)")) if (mix1(1.0) != 103): - raise RuntimeError, ("mix1(double)") + raise RuntimeError(("mix1(double)")) # mix 2 if (mix2("hi") != 101): - raise RuntimeError, ("mix2(const char*)") + raise RuntimeError(("mix2(const char*)")) if (mix2(1.0, 1.0) != 102): - raise RuntimeError, ("mix2(double, const double &)") + raise RuntimeError(("mix2(double, const double &)")) if (mix2(1.0) != 103): - raise RuntimeError, ("mix2(double)") + raise RuntimeError(("mix2(double)")) # mix 3 if (mix3("hi") != 101): - raise RuntimeError, ("mix3(const char*)") + raise RuntimeError(("mix3(const char*)")) if (mix3(1.0, 1.0) != 102): - raise RuntimeError, ("mix3(double, const double &)") + raise RuntimeError(("mix3(double, const double &)")) if (mix3(1.0) != 103): - raise RuntimeError, ("mix3(double)") + raise RuntimeError(("mix3(double)")) # Combination 1 if (overtparams1(100) != 10): - raise RuntimeError, ("overtparams1(int)") + raise RuntimeError(("overtparams1(int)")) if (overtparams1(100.0, 100) != 20): - raise RuntimeError, ("overtparams1(double, int)") + raise RuntimeError(("overtparams1(double, int)")) # Combination 2 if (overtparams2(100.0, 100) != 40): - raise RuntimeError, ("overtparams2(double, int)") + raise RuntimeError(("overtparams2(double, int)")) # Combination 3 if (overloaded() != 60): - raise RuntimeError, ("overloaded()") + raise RuntimeError(("overloaded()")) if (overloaded(100.0, 100) != 70): - raise RuntimeError, ("overloaded(double, int)") + raise RuntimeError(("overloaded(double, int)")) # Combination 4 if (overloadedagain("hello") != 80): - raise RuntimeError, ("overloadedagain(const char *)") + raise RuntimeError(("overloadedagain(const char *)")) if (overloadedagain() != 90): - raise RuntimeError, ("overloadedagain(double)") + raise RuntimeError(("overloadedagain(double)")) # specializations if (specialization(10) != 202): - raise RuntimeError, ("specialization(int)") + raise RuntimeError(("specialization(int)")) if (specialization(10.0) != 203): - raise RuntimeError, ("specialization(double)") + raise RuntimeError(("specialization(double)")) if (specialization(10, 10) != 204): - raise RuntimeError, ("specialization(int, int)") + raise RuntimeError(("specialization(int, int)")) if (specialization(10.0, 10.0) != 205): - raise RuntimeError, ("specialization(double, double)") + raise RuntimeError(("specialization(double, double)")) if (specialization("hi", "hi") != 201): - raise RuntimeError, ("specialization(const char *, const char *)") + raise RuntimeError(("specialization(const char *, const char *)")) # simple specialization @@ -84,61 +84,61 @@ xyz_double() # a bit of everything if (overload("hi") != 0): - raise RuntimeError, ("overload()") + raise RuntimeError(("overload()")) if (overload(1) != 10): - raise RuntimeError, ("overload(int t)") + raise RuntimeError(("overload(int t)")) if (overload(1, 1) != 20): - raise RuntimeError, ("overload(int t, const int &)") + raise RuntimeError(("overload(int t, const int &)")) if (overload(1, "hello") != 30): - raise RuntimeError, ("overload(int t, const char *)") + raise RuntimeError(("overload(int t, const char *)")) k = Klass() if (overload(k) != 10): - raise RuntimeError, ("overload(Klass t)") + raise RuntimeError(("overload(Klass t)")) if (overload(k, k) != 20): - raise RuntimeError, ("overload(Klass t, const Klass &)") + raise RuntimeError(("overload(Klass t, const Klass &)")) if (overload(k, "hello") != 30): - raise RuntimeError, ("overload(Klass t, const char *)") + raise RuntimeError(("overload(Klass t, const char *)")) if (overload(10.0, "hi") != 40): - raise RuntimeError, ("overload(double t, const char *)") + raise RuntimeError(("overload(double t, const char *)")) if (overload() != 50): - raise RuntimeError, ("overload(const char *)") + raise RuntimeError(("overload(const char *)")) # everything put in a namespace if (nsoverload("hi") != 1000): - raise RuntimeError, ("nsoverload()") + raise RuntimeError(("nsoverload()")) if (nsoverload(1) != 1010): - raise RuntimeError, ("nsoverload(int t)") + raise RuntimeError(("nsoverload(int t)")) if (nsoverload(1, 1) != 1020): - raise RuntimeError, ("nsoverload(int t, const int &)") + raise RuntimeError(("nsoverload(int t, const int &)")) if (nsoverload(1, "hello") != 1030): - raise RuntimeError, ("nsoverload(int t, const char *)") + raise RuntimeError(("nsoverload(int t, const char *)")) if (nsoverload(k) != 1010): - raise RuntimeError, ("nsoverload(Klass t)") + raise RuntimeError(("nsoverload(Klass t)")) if (nsoverload(k, k) != 1020): - raise RuntimeError, ("nsoverload(Klass t, const Klass &)") + raise RuntimeError(("nsoverload(Klass t, const Klass &)")) if (nsoverload(k, "hello") != 1030): - raise RuntimeError, ("nsoverload(Klass t, const char *)") + raise RuntimeError(("nsoverload(Klass t, const char *)")) if (nsoverload(10.0, "hi") != 1040): - raise RuntimeError, ("nsoverload(double t, const char *)") + raise RuntimeError(("nsoverload(double t, const char *)")) if (nsoverload() != 1050): - raise RuntimeError, ("nsoverload(const char *)") + raise RuntimeError(("nsoverload(const char *)")) A.foo(1) diff --git a/Examples/test-suite/python/overload_template_runme.py b/Examples/test-suite/python/overload_template_runme.py index 014ec71cb..a484d8f0e 100644 --- a/Examples/test-suite/python/overload_template_runme.py +++ b/Examples/test-suite/python/overload_template_runme.py @@ -6,74 +6,74 @@ b = maximum(3.4, 5.2) # mix 1 if (mix1("hi") != 101): - raise RuntimeError, ("mix1(const char*)") + raise RuntimeError(("mix1(const char*)")) if (mix1(1.0, 1.0) != 102): - raise RuntimeError, ("mix1(double, const double &)") + raise RuntimeError(("mix1(double, const double &)")) if (mix1(1.0) != 103): - raise RuntimeError, ("mix1(double)") + raise RuntimeError(("mix1(double)")) # mix 2 if (mix2("hi") != 101): - raise RuntimeError, ("mix2(const char*)") + raise RuntimeError(("mix2(const char*)")) if (mix2(1.0, 1.0) != 102): - raise RuntimeError, ("mix2(double, const double &)") + raise RuntimeError(("mix2(double, const double &)")) if (mix2(1.0) != 103): - raise RuntimeError, ("mix2(double)") + raise RuntimeError(("mix2(double)")) # mix 3 if (mix3("hi") != 101): - raise RuntimeError, ("mix3(const char*)") + raise RuntimeError(("mix3(const char*)")) if (mix3(1.0, 1.0) != 102): - raise RuntimeError, ("mix3(double, const double &)") + raise RuntimeError(("mix3(double, const double &)")) if (mix3(1.0) != 103): - raise RuntimeError, ("mix3(double)") + raise RuntimeError(("mix3(double)")) # Combination 1 if (overtparams1(100) != 10): - raise RuntimeError, ("overtparams1(int)") + raise RuntimeError(("overtparams1(int)")) if (overtparams1(100.0, 100) != 20): - raise RuntimeError, ("overtparams1(double, int)") + raise RuntimeError(("overtparams1(double, int)")) # Combination 2 if (overtparams2(100.0, 100) != 40): - raise RuntimeError, ("overtparams2(double, int)") + raise RuntimeError(("overtparams2(double, int)")) # Combination 3 if (overloaded() != 60): - raise RuntimeError, ("overloaded()") + raise RuntimeError(("overloaded()")) if (overloaded(100.0, 100) != 70): - raise RuntimeError, ("overloaded(double, int)") + raise RuntimeError(("overloaded(double, int)")) # Combination 4 if (overloadedagain("hello") != 80): - raise RuntimeError, ("overloadedagain(const char *)") + raise RuntimeError(("overloadedagain(const char *)")) if (overloadedagain() != 90): - raise RuntimeError, ("overloadedagain(double)") + raise RuntimeError(("overloadedagain(double)")) # specializations if (specialization(10) != 202): - raise RuntimeError, ("specialization(int)") + raise RuntimeError(("specialization(int)")) if (specialization(10.0) != 203): - raise RuntimeError, ("specialization(double)") + raise RuntimeError(("specialization(double)")) if (specialization(10, 10) != 204): - raise RuntimeError, ("specialization(int, int)") + raise RuntimeError(("specialization(int, int)")) if (specialization(10.0, 10.0) != 205): - raise RuntimeError, ("specialization(double, double)") + raise RuntimeError(("specialization(double, double)")) if (specialization("hi", "hi") != 201): - raise RuntimeError, ("specialization(const char *, const char *)") + raise RuntimeError(("specialization(const char *, const char *)")) # simple specialization @@ -83,61 +83,61 @@ xyz_double() # a bit of everything if (overload("hi") != 0): - raise RuntimeError, ("overload()") + raise RuntimeError(("overload()")) if (overload(1) != 10): - raise RuntimeError, ("overload(int t)") + raise RuntimeError(("overload(int t)")) if (overload(1, 1) != 20): - raise RuntimeError, ("overload(int t, const int &)") + raise RuntimeError(("overload(int t, const int &)")) if (overload(1, "hello") != 30): - raise RuntimeError, ("overload(int t, const char *)") + raise RuntimeError(("overload(int t, const char *)")) k = Klass() if (overload(k) != 10): - raise RuntimeError, ("overload(Klass t)") + raise RuntimeError(("overload(Klass t)")) if (overload(k, k) != 20): - raise RuntimeError, ("overload(Klass t, const Klass &)") + raise RuntimeError(("overload(Klass t, const Klass &)")) if (overload(k, "hello") != 30): - raise RuntimeError, ("overload(Klass t, const char *)") + raise RuntimeError(("overload(Klass t, const char *)")) if (overload(10.0, "hi") != 40): - raise RuntimeError, ("overload(double t, const char *)") + raise RuntimeError(("overload(double t, const char *)")) if (overload() != 50): - raise RuntimeError, ("overload(const char *)") + raise RuntimeError(("overload(const char *)")) # everything put in a namespace if (nsoverload("hi") != 1000): - raise RuntimeError, ("nsoverload()") + raise RuntimeError(("nsoverload()")) if (nsoverload(1) != 1010): - raise RuntimeError, ("nsoverload(int t)") + raise RuntimeError(("nsoverload(int t)")) if (nsoverload(1, 1) != 1020): - raise RuntimeError, ("nsoverload(int t, const int &)") + raise RuntimeError(("nsoverload(int t, const int &)")) if (nsoverload(1, "hello") != 1030): - raise RuntimeError, ("nsoverload(int t, const char *)") + raise RuntimeError(("nsoverload(int t, const char *)")) if (nsoverload(k) != 1010): - raise RuntimeError, ("nsoverload(Klass t)") + raise RuntimeError(("nsoverload(Klass t)")) if (nsoverload(k, k) != 1020): - raise RuntimeError, ("nsoverload(Klass t, const Klass &)") + raise RuntimeError(("nsoverload(Klass t, const Klass &)")) if (nsoverload(k, "hello") != 1030): - raise RuntimeError, ("nsoverload(Klass t, const char *)") + raise RuntimeError(("nsoverload(Klass t, const char *)")) if (nsoverload(10.0, "hi") != 1040): - raise RuntimeError, ("nsoverload(double t, const char *)") + raise RuntimeError(("nsoverload(double t, const char *)")) if (nsoverload() != 1050): - raise RuntimeError, ("nsoverload(const char *)") + raise RuntimeError(("nsoverload(const char *)")) A_foo(1) diff --git a/Examples/test-suite/python/pointer_reference_runme.py b/Examples/test-suite/python/pointer_reference_runme.py index b9b47881d..f12648696 100644 --- a/Examples/test-suite/python/pointer_reference_runme.py +++ b/Examples/test-suite/python/pointer_reference_runme.py @@ -2,15 +2,15 @@ import pointer_reference s = pointer_reference.get() if s.value != 10: - raise RuntimeError, "get test failed" + raise RuntimeError("get test failed") ss = pointer_reference.Struct(20) pointer_reference.set(ss) if pointer_reference.cvar.Struct_instance.value != 20: - raise RuntimeError, "set test failed" + raise RuntimeError("set test failed") if pointer_reference.overloading(1) != 111: - raise RuntimeError, "overload test 1 failed" + raise RuntimeError("overload test 1 failed") if pointer_reference.overloading(ss) != 222: - raise RuntimeError, "overload test 2 failed" + raise RuntimeError("overload test 2 failed") diff --git a/Examples/test-suite/python/primitive_types_runme.py b/Examples/test-suite/python/primitive_types_runme.py index 04588ddf2..7ed4b52d1 100644 --- a/Examples/test-suite/python/primitive_types_runme.py +++ b/Examples/test-suite/python/primitive_types_runme.py @@ -31,8 +31,7 @@ v_check() def pyerror(name, val, cte): - print "bad val/cte", name, val, cte - raise RuntimeError + raise RuntimeError("bad val/cte {} {} {}".format(name, val, cte)) pass if cvar.var_bool != cct_bool: @@ -173,7 +172,7 @@ p = PyTest() # internal call check if t.c_check() != p.c_check(): - raise RuntimeError, "bad director" + raise RuntimeError("bad director") p.var_bool = p.stc_bool p.var_schar = p.stc_schar @@ -228,63 +227,57 @@ t.v_check() # this value contains a '0' char! if def_namet != "hola": - print "bad namet", def_namet - raise RuntimeError + raise RuntimeError("bad namet {}".format(def_namet)) t.var_namet = def_namet if t.var_namet != def_namet: - print "bad namet", t.var_namet, def_namet - raise RuntimeError + raise RuntimeError("bad namet {} {}".format(t.var_namet, def_namet)) t.var_namet = "hola" if t.var_namet != "hola": - print "bad namet", t.var_namet - raise RuntimeError + raise RuntimeError("bad namet {}".format(t.var_namet)) t.var_namet = "hol" if t.var_namet != "hol": # if t.var_namet != "hol\0\0": - print "bad namet", t.var_namet - raise RuntimeError + raise RuntimeError("bad namet {}".format(t.var_namet)) cvar.var_char = "\0" if cvar.var_char != "\0": - raise RuntimeError, "bad char '0' case" + raise RuntimeError("bad char '0' case") cvar.var_char = 0 if cvar.var_char != "\0": - raise RuntimeError, "bad char '0' case" + raise RuntimeError("bad char '0' case") cvar.var_namet = "\0" # if cvar.var_namet != "\0\0\0\0\0": if cvar.var_namet != "": - print "hola", "", cvar.var_namet - raise RuntimeError, "bad char '\0' case" + raise RuntimeError("bad char '\0' case hola {}".format(cvar.var_namet)) cvar.var_namet = "" # if cvar.var_namet != "\0\0\0\0\0": if cvar.var_namet != "": - raise RuntimeError, "bad char empty case" + raise RuntimeError("bad char empty case") cvar.var_pchar = None if cvar.var_pchar != None: - raise RuntimeError, "bad None case" + raise RuntimeError("bad None case") cvar.var_pchar = "" if cvar.var_pchar != "": - print "%c" % (cvar.var_pchar[0],) - raise RuntimeError, "bad char empty case" + raise RuntimeError("bad char empty case %c" % (cvar.var_pchar[0],)) cvar.var_pcharc = None if cvar.var_pcharc != None: - raise RuntimeError, "bad None case" + raise RuntimeError("bad None case") cvar.var_pcharc = "" if cvar.var_pcharc != "": - raise RuntimeError, "bad char empty case" + raise RuntimeError("bad char empty case") # @@ -300,13 +293,12 @@ pchar_setitem(pc, 4, 0) cvar.var_pchar = pc if cvar.var_pchar != "hola": - print cvar.var_pchar - raise RuntimeError, "bad pointer case" + raise RuntimeError("bad pointer case {}".format(cvar.var_pchar)) cvar.var_namet = pc # if cvar.var_namet != "hola\0": if cvar.var_namet != "hola": - raise RuntimeError, "bad pointer case" + raise RuntimeError("bad pointer case") delete_pchar(pc) @@ -325,7 +317,7 @@ except OverflowError: error = 1 pass if error: - raise RuntimeError, "bad uchar typemap" + raise RuntimeError("bad uchar typemap") try: @@ -338,7 +330,7 @@ except TypeError: error = 1 pass if error: - raise RuntimeError, "bad char typemap" + raise RuntimeError("bad char typemap") try: error = 0 @@ -350,7 +342,7 @@ except OverflowError: error = 1 pass if error: - raise RuntimeError, "bad ushort typemap" + raise RuntimeError("bad ushort typemap") try: error = 0 @@ -362,7 +354,7 @@ except OverflowError: error = 1 pass if error: - raise RuntimeError, "bad uint typemap" + raise RuntimeError("bad uint typemap") try: error = 0 @@ -374,7 +366,7 @@ except OverflowError: error = 1 pass if error: - raise RuntimeError, "bad sizet typemap" + raise RuntimeError("bad sizet typemap") try: error = 0 @@ -386,7 +378,7 @@ except OverflowError: error = 1 pass if error: - raise RuntimeError, "bad ulong typemap" + raise RuntimeError("bad ulong typemap") # # @@ -400,43 +392,43 @@ except TypeError: error = 1 pass if error: - raise RuntimeError, "bad namet typemap" + raise RuntimeError("bad namet typemap") # # # t2 = p.vtest(t) if t.var_namet != t2.var_namet: - raise RuntimeError, "bad SWIGTYPE* typemap" + raise RuntimeError("bad SWIGTYPE* typemap") if cvar.fixsize != "ho\0la\0\0\0": - raise RuntimeError, "bad FIXSIZE typemap" + raise RuntimeError("bad FIXSIZE typemap") cvar.fixsize = "ho" if cvar.fixsize != "ho\0\0\0\0\0\0": - raise RuntimeError, "bad FIXSIZE typemap" + raise RuntimeError("bad FIXSIZE typemap") f = Foo(3) f1 = fptr_val(f) f2 = fptr_ref(f) if f1._a != f2._a: - raise RuntimeError, "bad const ptr& typemap" + raise RuntimeError("bad const ptr& typemap") v = char_foo(1, 3) if v != 3: - raise RuntimeError, "bad int typemap" + raise RuntimeError("bad int typemap") s = char_foo(1, "hello") if s != "hello": - raise RuntimeError, "bad char* typemap" + raise RuntimeError("bad char* typemap") v = SetPos(1, 3) if v != 4: - raise RuntimeError, "bad int typemap" + raise RuntimeError("bad int typemap") # # Check the bounds for converting various types @@ -481,7 +473,7 @@ maxullong = 2 * maxllong + 1 # Make sure Python 2's sys.maxint is the same as the maxlong we calculated if sys.version_info[0] <= 2 and maxlong != sys.maxint: - raise RuntimeError, "sys.maxint is not the maximum value of a signed long" + raise RuntimeError("sys.maxint is not the maximum value of a signed long") def checkType(t, e, val, delta): """t = Test object, e = type name (e.g. ulong), val = max or min allowed value, delta = +1 for max, -1 for min""" @@ -511,7 +503,7 @@ def checkType(t, e, val, delta): except OverflowError: pass if error: - raise RuntimeError, "bad " + e + " typemap" + raise RuntimeError("bad " + e + " typemap") def checkFull(t, e, maxval, minval): """Check the maximum and minimum bounds for the type given by e""" @@ -543,17 +535,17 @@ def checkOverload(t, name, val, delta, prevval, limit): if val != prevval: # Make sure the most extreme value of this type gives the name of this type if t.ovr_str(val) != name: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") # Make sure a more extreme value doesn't give the name of this type try: if t.ovr_str(val + delta) == name: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") if val == limit: # Should raise TypeError here since this is the largest integral type - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") except TypeError: if val != limit: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") # Check that overloading works: uchar > schar > ushort > short > uint > int > ulong > long > ullong > llong checkOverload(t, "uchar", maxuchar, +1, 0, maxullong) @@ -568,22 +560,22 @@ checkOverload(t, "long", minlong, -1, minint, minllong) checkOverload(t, "llong", minllong, -1, minlong, minllong) # Make sure that large ints can be converted to doubles properly -if val_double(sys.maxint + 1) != float(sys.maxint + 1): - raise RuntimeError, "bad double typemap" -if val_double(-sys.maxint - 2) != float(-sys.maxint - 2): - raise RuntimeError, "bad double typemap" +if val_double(sys.maxsize + 1) != float(sys.maxsize + 1): + raise RuntimeError("bad double typemap") +if val_double(-sys.maxsize - 2) != float(-sys.maxsize - 2): + raise RuntimeError("bad double typemap") # Check the minimum and maximum values that fit in ptrdiff_t and size_t def checkType(name, maxfunc, maxval, minfunc, minval, echofunc): if maxfunc() != maxval: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") if minfunc() != minval: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") if echofunc(maxval) != maxval: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") if echofunc(minval) != minval: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") error = 0 try: echofunc(maxval + 1) @@ -591,14 +583,14 @@ def checkType(name, maxfunc, maxval, minfunc, minval, echofunc): except OverflowError: pass if error == 1: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") try: echofunc(minval - 1) error = 1 except OverflowError: pass if error == 1: - raise RuntimeError, "bad " + name + " typemap" + raise RuntimeError("bad " + name + " typemap") # sys.maxsize is the largest value supported by Py_ssize_t, which should be the same as ptrdiff_t if sys.version_info[0:2] >= (2, 6): diff --git a/Examples/test-suite/python/python_abstractbase_runme3.py b/Examples/test-suite/python/python_abstractbase_runme.py similarity index 100% rename from Examples/test-suite/python/python_abstractbase_runme3.py rename to Examples/test-suite/python/python_abstractbase_runme.py diff --git a/Examples/test-suite/python/python_append_runme.py b/Examples/test-suite/python/python_append_runme.py index eddda53ff..e5f6b07cf 100644 --- a/Examples/test-suite/python/python_append_runme.py +++ b/Examples/test-suite/python/python_append_runme.py @@ -21,3 +21,16 @@ if grabstaticpath() != None: Test.static_func() if grabstaticpath() != os.path.basename(mypath): raise RuntimeError("grabstaticpath failed") + +# slots test +fs = ForSlots() +if fs.ValidVariable != 99: + raise RuntimeError("ValidVariable failed") +fs.ValidVariable = 11 +if fs.ValidVariable != 11: + raise RuntimeError("ValidVariable failed") +try: + fs.Invalid = 22 + raise RuntimeError("It should not be possible to set a random variable name") +except AttributeError: + pass diff --git a/Examples/test-suite/python/python_builtin_runme.py b/Examples/test-suite/python/python_builtin_runme.py index 26e757ca7..8a42a2607 100644 --- a/Examples/test-suite/python/python_builtin_runme.py +++ b/Examples/test-suite/python/python_builtin_runme.py @@ -32,7 +32,7 @@ if is_python_builtin(): passed = False try: h = hash(ExceptionHashFunction()) - except RuntimeError, e: + except RuntimeError as e: passed = str(e).find("oops") != -1 pass diff --git a/Examples/test-suite/python/python_destructor_exception_runme.py b/Examples/test-suite/python/python_destructor_exception_runme.py index ee71ab33b..47659531b 100644 --- a/Examples/test-suite/python/python_destructor_exception_runme.py +++ b/Examples/test-suite/python/python_destructor_exception_runme.py @@ -1,7 +1,11 @@ import python_destructor_exception -from StringIO import StringIO import sys +if sys.version_info[0:2] < (3, 0): + import StringIO as io +else: + import io + def error_function(): python_destructor_exception.ClassWithThrowingDestructor().GetBlah() @@ -9,13 +13,13 @@ def runtest(): attributeErrorOccurred = False try: error_function() - except AttributeError, e: + except AttributeError: attributeErrorOccurred = True return attributeErrorOccurred def test1(): stderr_saved = sys.stderr - buffer = StringIO() + buffer = io.StringIO() attributeErrorOccurred = False try: # Suppress stderr while making this call to suppress the output shown by PyErr_WriteUnraisable diff --git a/Examples/test-suite/python/python_nondynamic_runme.py b/Examples/test-suite/python/python_nondynamic_runme.py index fbb60ad36..524f4d1c4 100644 --- a/Examples/test-suite/python/python_nondynamic_runme.py +++ b/Examples/test-suite/python/python_nondynamic_runme.py @@ -51,9 +51,7 @@ if python_nondynamic.retrieve_A_b(bb) != 5: raise RuntimeError("b not set correc try: bb.c = 3 - print("bb.c = {}".format(bb.c)) - print("B.c = {}".format(B.c)) - raise RuntimeError("B.c class variable messes up nondynamic-ness of B") + raise RuntimeError("B.c class variable messes up nondynamic-ness of B bb.c={} B.c={}".format(bb.c, B.c)) except AttributeError as e: debug_print(e) pass @@ -99,9 +97,7 @@ if is_python_modern() and not python_nondynamic.is_python_builtin(): if not python_nondynamic.is_python_builtin(): try: bb.cc = 3 - print("bb.cc = {}".format(bb.cc)) - print("B.cc = {}".format(B.cc)) - raise RuntimeError("B.cc class variable messes up nondynamic-ness of B") + raise RuntimeError("B.cc class variable messes up nondynamic-ness of B bb.cc={} B.cc={}".format(bb.cc, B.cc)) except AttributeError as e: debug_print(e) pass diff --git a/Examples/test-suite/python/python_overload_simple_cast_runme.py b/Examples/test-suite/python/python_overload_simple_cast_runme.py index d4cb8a37a..fc398ab29 100644 --- a/Examples/test-suite/python/python_overload_simple_cast_runme.py +++ b/Examples/test-suite/python/python_overload_simple_cast_runme.py @@ -30,136 +30,136 @@ except: good = 1 if not good: - raise RuntimeError, "fint(int)" + raise RuntimeError("fint(int)") if fint(ad) != "fint:int": - raise RuntimeError, "fint(int)" + raise RuntimeError("fint(int)") if fdouble(ad) != "fdouble:double": - raise RuntimeError, "fdouble(double)" + raise RuntimeError("fdouble(double)") if fint(ai) != "fint:int": - raise RuntimeError, "fint(int)" + raise RuntimeError("fint(int)") if fint(5.0) != "fint:int": - raise RuntimeError, "fint(int)" + raise RuntimeError("fint(int)") if fint(3) != "fint:int": - raise RuntimeError, "fint(int)" + raise RuntimeError("fint(int)") if fint(3.0) != "fint:int": - raise RuntimeError, "fint(int)" + raise RuntimeError("fint(int)") if fdouble(ad) != "fdouble:double": - raise RuntimeError, "fdouble(double)" + raise RuntimeError("fdouble(double)") if fdouble(3) != "fdouble:double": - raise RuntimeError, "fdouble(double)" + raise RuntimeError("fdouble(double)") if fdouble(3.0) != "fdouble:double": - raise RuntimeError, "fdouble(double)" + raise RuntimeError("fdouble(double)") if fid(3, 3.0) != "fid:intdouble": - raise RuntimeError, "fid:intdouble" + raise RuntimeError("fid:intdouble") if fid(3.0, 3) != "fid:doubleint": - raise RuntimeError, "fid:doubleint" + raise RuntimeError("fid:doubleint") if fid(ad, ai) != "fid:doubleint": - raise RuntimeError, "fid:doubleint" + raise RuntimeError("fid:doubleint") if fid(ai, ad) != "fid:intdouble": - raise RuntimeError, "fid:intdouble" + raise RuntimeError("fid:intdouble") if foo(3) != "foo:int": - raise RuntimeError, "foo(int)" + raise RuntimeError("foo(int)") if foo(3.0) != "foo:double": - raise RuntimeError, "foo(double)" + raise RuntimeError("foo(double)") if foo("hello") != "foo:char *": - raise RuntimeError, "foo(char *)" + raise RuntimeError("foo(char *)") f = Foo() b = Bar() if foo(f) != "foo:Foo *": - raise RuntimeError, "foo(Foo *)" + raise RuntimeError("foo(Foo *)") if foo(b) != "foo:Bar *": - raise RuntimeError, "foo(Bar *)" + raise RuntimeError("foo(Bar *)") v = malloc_void(32) if foo(v) != "foo:void *": - raise RuntimeError, "foo(void *)" + raise RuntimeError("foo(void *)") s = Spam() if s.foo(3) != "foo:int": - raise RuntimeError, "Spam::foo(int)" + raise RuntimeError("Spam::foo(int)") if s.foo(3.0) != "foo:double": - raise RuntimeError, "Spam::foo(double)" + raise RuntimeError("Spam::foo(double)") if s.foo("hello") != "foo:char *": - raise RuntimeError, "Spam::foo(char *)" + raise RuntimeError("Spam::foo(char *)") if s.foo(f) != "foo:Foo *": - raise RuntimeError, "Spam::foo(Foo *)" + raise RuntimeError("Spam::foo(Foo *)") if s.foo(b) != "foo:Bar *": - raise RuntimeError, "Spam::foo(Bar *)" + raise RuntimeError("Spam::foo(Bar *)") if s.foo(v) != "foo:void *": - raise RuntimeError, "Spam::foo(void *)" + raise RuntimeError("Spam::foo(void *)") if Spam_bar(3) != "bar:int": - raise RuntimeError, "Spam::bar(int)" + raise RuntimeError("Spam::bar(int)") if Spam_bar(3.0) != "bar:double": - raise RuntimeError, "Spam::bar(double)" + raise RuntimeError("Spam::bar(double)") if Spam_bar("hello") != "bar:char *": - raise RuntimeError, "Spam::bar(char *)" + raise RuntimeError("Spam::bar(char *)") if Spam_bar(f) != "bar:Foo *": - raise RuntimeError, "Spam::bar(Foo *)" + raise RuntimeError("Spam::bar(Foo *)") if Spam_bar(b) != "bar:Bar *": - raise RuntimeError, "Spam::bar(Bar *)" + raise RuntimeError("Spam::bar(Bar *)") if Spam_bar(v) != "bar:void *": - raise RuntimeError, "Spam::bar(void *)" + raise RuntimeError("Spam::bar(void *)") # Test constructors s = Spam() if s.type != "none": - raise RuntimeError, "Spam()" + raise RuntimeError("Spam()") s = Spam(3) if s.type != "int": - raise RuntimeError, "Spam(int)" + raise RuntimeError("Spam(int)") s = Spam(3.4) if s.type != "double": - raise RuntimeError, "Spam(double)" + raise RuntimeError("Spam(double)") s = Spam("hello") if s.type != "char *": - raise RuntimeError, "Spam(char *)" + raise RuntimeError("Spam(char *)") s = Spam(f) if s.type != "Foo *": - raise RuntimeError, "Spam(Foo *)" + raise RuntimeError("Spam(Foo *)") s = Spam(b) if s.type != "Bar *": - raise RuntimeError, "Spam(Bar *)" + raise RuntimeError("Spam(Bar *)") s = Spam(v) if s.type != "void *": - raise RuntimeError, "Spam(void *)" + raise RuntimeError("Spam(void *)") # unsigned long long @@ -168,13 +168,13 @@ ullmaxd = 9007199254740992.0 ullmin = 0 ullmind = 0.0 if ull(ullmin) != ullmin: - raise RuntimeError, "ull(ullmin)" + raise RuntimeError("ull(ullmin)") if ull(ullmax) != ullmax: - raise RuntimeError, "ull(ullmax)" + raise RuntimeError("ull(ullmax)") if ull(ullmind) != ullmind: - raise RuntimeError, "ull(ullmind)" + raise RuntimeError("ull(ullmind)") if ull(ullmaxd) != ullmaxd: - raise RuntimeError, "ull(ullmaxd)" + raise RuntimeError("ull(ullmaxd)") # long long llmax = 9223372036854775807 # 0x7fffffffffffffff @@ -183,13 +183,13 @@ llmin = -9223372036854775808 llmaxd = 9007199254740992.0 llmind = -9007199254740992.0 if ll(llmin) != llmin: - raise RuntimeError, "ll(llmin)" + raise RuntimeError("ll(llmin)") if ll(llmax) != llmax: - raise RuntimeError, "ll(llmax)" + raise RuntimeError("ll(llmax)") if ll(llmind) != llmind: - raise RuntimeError, "ll(llmind)" + raise RuntimeError("ll(llmind)") if ll(llmaxd) != llmaxd: - raise RuntimeError, "ll(llmaxd)" + raise RuntimeError("ll(llmaxd)") free_void(v) diff --git a/Examples/test-suite/python/python_pickle_runme.py b/Examples/test-suite/python/python_pickle_runme.py index 27c67ae10..cbe425fa2 100644 --- a/Examples/test-suite/python/python_pickle_runme.py +++ b/Examples/test-suite/python/python_pickle_runme.py @@ -15,15 +15,15 @@ check(p) r = p.__reduce__() if python_pickle.cvar.debug: - print "__reduce__ returned:", r + print("__reduce__ returned: {}".format(r)) pickle_string = pickle.dumps(p) newp = pickle.loads(pickle_string) check(newp) # Not yet working... some crash and others are not producing a sensible "can't be pickled" error #nfp = python_pickle.NotForPickling("no no") -#print nfp.__reduce__() +#print("{}".format(nfp.__reduce__())) #pickle_string = pickle.dumps(nfp) -#print pickle_string +#print("{}".format(pickle_string)) #newp = pickle.loads(pickle_string) -#print newp.msg +#print("{}".format(newp.msg)) diff --git a/Examples/test-suite/python/python_pybuffer_runme.py b/Examples/test-suite/python/python_pybuffer_runme.py index 8ecdb523b..65079200b 100644 --- a/Examples/test-suite/python/python_pybuffer_runme.py +++ b/Examples/test-suite/python/python_pybuffer_runme.py @@ -17,13 +17,13 @@ if len(sys.argv) >= 2 and sys.argv[1] == "benchmark": a = bytearray(b"hello world") for i in range(k): python_pybuffer.title1(a) - print "Time used by bytearray:", time.time() - t + print("Time used by bytearray: {}".format(time.time() - t)) t = time.time() b = "hello world" for i in range(k): python_pybuffer.title2(b) - print "Time used by string:", time.time() - t + print("Time used by string: {}".format(time.time() - t)) else: # run the test case buf1 = bytearray(10) @@ -44,3 +44,27 @@ else: buf3 = bytearray(b"hello") python_pybuffer.title1(buf3) check(buf3 == b"Hello") + + try: + python_pybuffer.func1(1) + raise RuntimeError("should throw TypeError") + except TypeError as e: + check("(char *buf1, int len)" in str(e)) + + try: + python_pybuffer.func2(1) + raise RuntimeError("should throw TypeError") + except TypeError as e: + check("(char *buf2)" in str(e)) + + try: + python_pybuffer.func3(1) + raise RuntimeError("should throw TypeError") + except TypeError as e: + check("(const char *buf3, int len)" in str(e)) + + try: + python_pybuffer.func4(1) + raise RuntimeError("should throw TypeError") + except TypeError as e: + check("(const char *buf4)" in str(e)) diff --git a/Examples/test-suite/python/python_richcompare_runme.py b/Examples/test-suite/python/python_richcompare_runme.py index 724d1d73c..988a3f91f 100644 --- a/Examples/test-suite/python/python_richcompare_runme.py +++ b/Examples/test-suite/python/python_richcompare_runme.py @@ -114,22 +114,22 @@ else: try: res = base1 < 42 raise RuntimeError("Failed to throw") - except TypeError,e: + except TypeError as e: check_unorderable_types(e) try: res = base1 <= 42 raise RuntimeError("Failed to throw") - except TypeError,e: + except TypeError as e: check_unorderable_types(e) try: res = base1 > 42 raise RuntimeError("Failed to throw") - except TypeError,e: + except TypeError as e: check_unorderable_types(e) try: res = base1 >= 42 raise RuntimeError("Failed to throw") - except TypeError,e: + except TypeError as e: check_unorderable_types(e) # Check inequalities used for ordering diff --git a/Examples/test-suite/python/python_strict_unicode_runme.py b/Examples/test-suite/python/python_strict_unicode_runme.py index e7fae2556..79c768de1 100644 --- a/Examples/test-suite/python/python_strict_unicode_runme.py +++ b/Examples/test-suite/python/python_strict_unicode_runme.py @@ -1,8 +1,20 @@ import python_strict_unicode +import sys test_bytes = b"hello \x01world\x99" BYTES = b"BYTES" -test_unicode = u"h\udce9llo w\u00f6rld" + +if sys.version_info[0:2] < (3, 0): + # Python 3.0-3.2 results in a SyntaxError when using u"" string literals, so we use a + # convoluted unicode string construction using unicode() and unichr(). + # Conventional Python 2 syntax shown in comments. + test_unicode = unicode("h" + unichr(0xdce9) + "llo w" + unichr(0x00f6) + "rld") # u"h\udce9llo w\u00f6rld" + UNICODE = unicode("UNICODE") + type_unicode_string = type(UNICODE) +else: + test_unicode = "h\udce9llo w\u00f6rld" + UNICODE = "UNICODE" + type_unicode_string = type(UNICODE) # Test that byte string inputs and outputs work as expected bdbl = python_strict_unicode.double_str(test_bytes) @@ -20,12 +32,12 @@ if type(bout) != type(BYTES): udbl = python_strict_unicode.double_wstr(test_unicode) if udbl != test_unicode + test_unicode: raise RuntimeError("Failed to double wide string") -if type(udbl) != type(u""): +if type(udbl) != type_unicode_string: raise RuntimeError("Wrong type output for wide string") uout = python_strict_unicode.same_wstr(test_unicode) if uout != test_unicode: raise RuntimeError("Failed to copy wchar_t*") -if type(uout) != type(u""): +if type(uout) != type_unicode_string: raise RuntimeError("Wrong type output for wchar_t*") # Test that overloading is handled properly @@ -35,9 +47,9 @@ if bovr != BYTES: if type(bovr) != type(BYTES): raise RuntimeError("Wrong type output from overload") uovr = python_strict_unicode.overload(test_unicode) -if uovr != u"UNICODE": +if uovr != UNICODE: raise RuntimeError("Failed to return unicode from overload") -if type(uovr) != type(u""): +if type(uovr) != type_unicode_string: raise RuntimeERror("Wrong type output from overload") # Test that bytes aren't accepted as wide strings and unicode isn't accepted as narrow strings diff --git a/Examples/test-suite/python/return_const_value_runme.py b/Examples/test-suite/python/return_const_value_runme.py index ff3bd5f02..809eed97a 100644 --- a/Examples/test-suite/python/return_const_value_runme.py +++ b/Examples/test-suite/python/return_const_value_runme.py @@ -3,10 +3,8 @@ import sys p = return_const_value.Foo_ptr_getPtr() if (p.getVal() != 17): - print "Runtime test1 failed. p.getVal()=", p.getVal() - sys.exit(1) + raise RuntimeError("Runtime test1 failed. p.getVal()={}".format(p.getVal())) p = return_const_value.Foo_ptr_getConstPtr() if (p.getVal() != 17): - print "Runtime test2 failed. p.getVal()=", p.getVal() - sys.exit(1) + raise RuntimeError("Runtime test2 failed. p.getVal()={}".format(p.getVal())) diff --git a/Examples/test-suite/python/smart_pointer_member_runme.py b/Examples/test-suite/python/smart_pointer_member_runme.py index d2ed87e79..9758b0ba4 100644 --- a/Examples/test-suite/python/smart_pointer_member_runme.py +++ b/Examples/test-suite/python/smart_pointer_member_runme.py @@ -11,9 +11,7 @@ b = Bar(f) b.y = 2 if f.y != 2: - print f.y - print b.y - raise RuntimeError + raise RuntimeError("Failed {} {}".format(f.y, b.y)) if b.x != f.x: raise RuntimeError diff --git a/Examples/test-suite/python/smart_pointer_not_runme.py b/Examples/test-suite/python/smart_pointer_not_runme.py index 69704c4ef..8cd9f11f3 100644 --- a/Examples/test-suite/python/smart_pointer_not_runme.py +++ b/Examples/test-suite/python/smart_pointer_not_runme.py @@ -7,36 +7,36 @@ g = Grok(f) try: x = b.x - print "Error! b.x" -except: + raise RuntimeError("Error! b.x") +except AttributeError: pass try: x = s.x - print "Error! s.x" -except: + raise RuntimeError("Error! s.x") +except AttributeError: pass try: x = g.x - print "Error! g.x" -except: + raise RuntimeError("Error! g.x") +except AttributeError: pass try: x = b.getx() - print "Error! b.getx()" -except: + raise RuntimeError("Error! b.getx()") +except AttributeError: pass try: x = s.getx() - print "Error! s.getx()" -except: + raise RuntimeError("Error! s.getx()") +except AttributeError: pass try: x = g.getx() - print "Error! g.getx()" -except: + raise RuntimeError("Error! g.getx()") +except AttributeError: pass diff --git a/Examples/test-suite/python/std_containers_runme.py b/Examples/test-suite/python/std_containers_runme.py index 7404cd5f4..820c8f454 100644 --- a/Examples/test-suite/python/std_containers_runme.py +++ b/Examples/test-suite/python/std_containers_runme.py @@ -7,34 +7,33 @@ cube = (((1, 2), (3, 4)), ((5, 6), (7, 8))) icube = std_containers.cident(cube) for i in range(0, len(cube)): if cube[i] != icube[i]: - raise RuntimeError, "bad cident" + raise RuntimeError("bad cident") p = (1, 2) if p != std_containers.pident(p): - raise RuntimeError, "bad pident" + raise RuntimeError("bad pident") v = (1, 2, 3, 4, 5, 6) iv = std_containers.vident(v) for i in range(0, len(v)): if v[i] != iv[i]: - raise RuntimeError, "bad vident" + raise RuntimeError("bad vident") iv = std_containers.videntu(v) for i in range(0, len(v)): if v[i] != iv[i]: - raise RuntimeError, "bad videntu" + raise RuntimeError("bad videntu") vu = std_containers.vector_ui(v) if vu[2] != std_containers.videntu(vu)[2]: - raise RuntimeError, "bad videntu" + raise RuntimeError("bad videntu") if v[0:3][1] != vu[0:3][1]: - print v[0:3][1], vu[0:3][1] - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice {} {}".format(v[0:3][1], vu[0:3][1])) m = ((1, 2, 3), (2, 3), (3, 4)) @@ -43,20 +42,20 @@ im = std_containers.midenti(m) for i in range(0, len(m)): for j in range(0, len(m[i])): if m[i][j] != im[i][j]: - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice") m = ((True, False, True), (True, True), (True, True)) im = std_containers.midentb(m) for i in range(0, len(m)): for j in range(0, len(m[i])): if m[i][j] != im[i][j]: - raise RuntimeError, "bad getslice" + raise RuntimeError("bad getslice") mi = std_containers.imatrix(m) mc = std_containers.cmatrix(m) if mi[0][1] != mc[0][1]: - raise RuntimeError, "bad matrix" + raise RuntimeError("bad matrix") map = {} @@ -67,7 +66,7 @@ map["3"] = 2 imap = std_containers.mapident(map) for k in map: if map[k] != imap[k]: - raise RuntimeError, "bad map" + raise RuntimeError("bad map") # Test __contains__ (required for 'x in y' to work) if not imap.__contains__("hello"): diff --git a/Examples/test-suite/python/struct_value_runme.py b/Examples/test-suite/python/struct_value_runme.py index aa3ece38c..9fe5c815c 100644 --- a/Examples/test-suite/python/struct_value_runme.py +++ b/Examples/test-suite/python/struct_value_runme.py @@ -17,7 +17,7 @@ b.added = 123 if b.added != 123: raise RuntimeError("Wrong attribute value") -if not b.__dict__.has_key("added"): +if "added" not in b.__dict__: raise RuntimeError("Missing added attribute in __dict__") @@ -28,7 +28,7 @@ class PyBar(struct_value.Bar): struct_value.Bar.__init__(self) pybar = PyBar() -if not pybar.__dict__.has_key("extra"): +if "extra" not in pybar.__dict__: raise RuntimeError("Missing extra attribute in __dict__") if pybar.extra != "hi": raise RuntimeError("Incorrect attribute value for extra") diff --git a/Examples/test-suite/python/swigobject_runme.py b/Examples/test-suite/python/swigobject_runme.py index de232f580..e28e187c9 100644 --- a/Examples/test-suite/python/swigobject_runme.py +++ b/Examples/test-suite/python/swigobject_runme.py @@ -1,5 +1,5 @@ - from swigobject import * +import sys a = A() @@ -11,7 +11,11 @@ if a1.this != a2.this: raise RuntimeError -lthis = long(a.this) +if sys.version_info[0:2] < (3, 0): + lthis = long(a.this) +else: + lthis = int(a.this) + # match pointer value, but deal with leading zeros on 8/16 bit systems and # different C++ compilers interpretation of %p xstr1 = "%016X" % (lthis,) @@ -23,13 +27,17 @@ xstr2 = str.lstrip(xstr2, "0") xstr2 = str.upper(xstr2) if xstr1 != xstr2: - print xstr1, xstr2 - raise RuntimeError + raise RuntimeError("Not equal failed {} {}".format(xstr1, xstr2)) s = str(a.this) r = repr(a.this) v1 = v_ptr(a) v2 = v_ptr(a) -if long(v1) != long(v2): - raise RuntimeError + +if sys.version_info[0:2] < (3, 0): + if long(v1) != long(v2): + raise RuntimeError +else: + if int(v1) != int(v2): + raise RuntimeError diff --git a/Examples/test-suite/python/template_classes_runme.py b/Examples/test-suite/python/template_classes_runme.py index 38b2d7a62..1bd133975 100644 --- a/Examples/test-suite/python/template_classes_runme.py +++ b/Examples/test-suite/python/template_classes_runme.py @@ -13,7 +13,7 @@ RectangleInt.static_onearg(1) fail = True try: rectangle.setPoint() -except TypeError, e: +except TypeError as e: fail = False if fail: raise RuntimeError("argument count check failed") @@ -22,7 +22,7 @@ if fail: fail = True try: rectangle.getPoint(0) -except TypeError, e: +except TypeError as e: fail = False if fail: raise RuntimeError("argument count check failed") @@ -30,7 +30,7 @@ if fail: fail = True try: RectangleInt.static_noargs(0) -except TypeError, e: +except TypeError as e: fail = False if fail: raise RuntimeError("argument count check failed") @@ -38,7 +38,7 @@ if fail: fail = True try: RectangleInt.static_onearg() -except TypeError, e: +except TypeError as e: fail = False if fail: raise RuntimeError("argument count check failed") diff --git a/Examples/test-suite/python/template_default_arg_runme.py b/Examples/test-suite/python/template_default_arg_runme.py index 91b1e0e8c..e9ef00f99 100644 --- a/Examples/test-suite/python/template_default_arg_runme.py +++ b/Examples/test-suite/python/template_default_arg_runme.py @@ -7,25 +7,25 @@ helloInt.foo(template_default_arg.Hello_int.hi) x = template_default_arg.X_int() if (x.meth(20.0, 200) != 200): - raise RuntimeError, ("X_int test 1 failed") + raise RuntimeError(("X_int test 1 failed")) if (x.meth(20) != 20): - raise RuntimeError, ("X_int test 2 failed") + raise RuntimeError(("X_int test 2 failed")) if (x.meth() != 0): - raise RuntimeError, ("X_int test 3 failed") + raise RuntimeError(("X_int test 3 failed")) y = template_default_arg.Y_unsigned() if (y.meth(20.0, 200) != 200): - raise RuntimeError, ("Y_unsigned test 1 failed") + raise RuntimeError(("Y_unsigned test 1 failed")) if (y.meth(20) != 20): - raise RuntimeError, ("Y_unsigned test 2 failed") + raise RuntimeError(("Y_unsigned test 2 failed")) if (y.meth() != 0): - raise RuntimeError, ("Y_unsigned test 3 failed") + raise RuntimeError(("Y_unsigned test 3 failed")) x = template_default_arg.X_longlong() x = template_default_arg.X_longlong(20.0) -x = template_default_arg.X_longlong(20.0, 200L) +x = template_default_arg.X_longlong(20.0, 200) x = template_default_arg.X_int() @@ -54,40 +54,40 @@ fzc = x.meth(fz) # plain function: int ott(Foo) if (template_default_arg.ott(template_default_arg.Foo_int()) != 30): - raise RuntimeError, ("ott test 1 failed") + raise RuntimeError(("ott test 1 failed")) # %template(ott) ott if (template_default_arg.ott() != 10): - raise RuntimeError, ("ott test 2 failed") + raise RuntimeError(("ott test 2 failed")) if (template_default_arg.ott(1) != 10): - raise RuntimeError, ("ott test 3 failed") + raise RuntimeError(("ott test 3 failed")) if (template_default_arg.ott(1, 1) != 10): - raise RuntimeError, ("ott test 4 failed") + raise RuntimeError(("ott test 4 failed")) if (template_default_arg.ott("hi") != 20): - raise RuntimeError, ("ott test 5 failed") + raise RuntimeError(("ott test 5 failed")) if (template_default_arg.ott("hi", 1) != 20): - raise RuntimeError, ("ott test 6 failed") + raise RuntimeError(("ott test 6 failed")) if (template_default_arg.ott("hi", 1, 1) != 20): - raise RuntimeError, ("ott test 7 failed") + raise RuntimeError(("ott test 7 failed")) # %template(ott) ott if (template_default_arg.ottstring(template_default_arg.Hello_int(), "hi") != 40): - raise RuntimeError, ("ott test 8 failed") + raise RuntimeError(("ott test 8 failed")) if (template_default_arg.ottstring(template_default_arg.Hello_int()) != 40): - raise RuntimeError, ("ott test 9 failed") + raise RuntimeError(("ott test 9 failed")) # %template(ott) ott if (template_default_arg.ottint(template_default_arg.Hello_int(), 1) != 50): - raise RuntimeError, ("ott test 10 failed") + raise RuntimeError(("ott test 10 failed")) if (template_default_arg.ottint(template_default_arg.Hello_int()) != 50): - raise RuntimeError, ("ott test 11 failed") + raise RuntimeError(("ott test 11 failed")) # %template(ott) ott if (template_default_arg.ott(template_default_arg.Hello_int(), 1.0) != 60): - raise RuntimeError, ("ott test 12 failed") + raise RuntimeError(("ott test 12 failed")) if (template_default_arg.ott(template_default_arg.Hello_int()) != 60): - raise RuntimeError, ("ott test 13 failed") + raise RuntimeError(("ott test 13 failed")) diff --git a/Examples/test-suite/python/template_template_parameters_runme.py b/Examples/test-suite/python/template_template_parameters_runme.py new file mode 100644 index 000000000..4b0e27d9c --- /dev/null +++ b/Examples/test-suite/python/template_template_parameters_runme.py @@ -0,0 +1,30 @@ +from template_template_parameters import * + +# Test first part +listBool = ListFastBool() +listBool.item = True +x_boolean = listBool.allotype +if listBool.item != True: + raise RuntimeError("Failed") + +listDouble = ListDefaultDouble() +listDouble.item = 10.2 +x_double = listDouble.allotype +if listDouble.item != 10.2: + raise RuntimeError("Failed") + +# Test second part +floatTestStruct = FloatTestStruct() +floatContainer2 = floatTestStruct.x +floatContainer2.x = 8.1 +intTestStruct = IntTestStruct() +intContainer1 = intTestStruct.x +intContainer1.x = 91 +if intContainer1.x != 91: + raise RuntimeError("Failed") +if intTestStruct.x.x != 91: + raise RuntimeError("Failed") +intTestStructReturned = TestStructContainer1Method(intTestStruct) +if intTestStructReturned.x.x != 101: + raise RuntimeError("Failed") + diff --git a/Examples/test-suite/python/template_typedef_cplx2_runme.py b/Examples/test-suite/python/template_typedef_cplx2_runme.py index 161bd51fc..23f19efb9 100644 --- a/Examples/test-suite/python/template_typedef_cplx2_runme.py +++ b/Examples/test-suite/python/template_typedef_cplx2_runme.py @@ -8,25 +8,21 @@ try: d = make_Identity_double() a = d.this except: - print d, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(d)) s = "%s" % d if str.find(s, "ArithUnaryFunction") == -1: - print d, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(d)) try: e = make_Multiplies_double_double_double_double(d, d) a = e.this except: - print e, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(e)) s = "%s" % e if str.find(s, "ArithUnaryFunction") == -1: - print e, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(e)) # @@ -37,25 +33,21 @@ try: c = make_Identity_complex() a = c.this except: - print c, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(c)) s = "%s" % c if str.find(s, "ArithUnaryFunction") == -1: - print c, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(c)) try: f = make_Multiplies_complex_complex_complex_complex(c, c) a = f.this except: - print f, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(f)) s = "%s" % f if str.find(s, "ArithUnaryFunction") == -1: - print f, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(f)) # # Mix case @@ -65,29 +57,24 @@ try: g = make_Multiplies_double_double_complex_complex(d, c) a = g.this except: - print g, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(g)) s = "%s" % g if str.find(s, "ArithUnaryFunction") == -1: - print g, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(g)) try: h = make_Multiplies_complex_complex_double_double(c, d) a = h.this except: - print h, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(h)) s = "%s" % h if str.find(s, "ArithUnaryFunction") == -1: - print h, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(h)) try: a = g.get_value() except: - print g, "has not get_value() method" - raise RuntimeError + raise RuntimeError("{}, has not get_value() method".format(g)) diff --git a/Examples/test-suite/python/template_typedef_cplx_runme.py b/Examples/test-suite/python/template_typedef_cplx_runme.py index 1846739eb..69d5642d6 100644 --- a/Examples/test-suite/python/template_typedef_cplx_runme.py +++ b/Examples/test-suite/python/template_typedef_cplx_runme.py @@ -8,25 +8,21 @@ try: d = make_Identity_double() a = d.this except: - print d, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(d)) s = "%s" % d if str.find(s, "ArithUnaryFunction") == -1: - print d, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(d)) try: e = make_Multiplies_double_double_double_double(d, d) a = e.this except: - print e, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(e)) s = "%s" % e if str.find(s, "ArithUnaryFunction") == -1: - print e, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(e)) # @@ -37,25 +33,21 @@ try: c = make_Identity_complex() a = c.this except: - print c, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(c)) s = "%s" % c if str.find(s, "ArithUnaryFunction") == -1: - print c, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(c)) try: f = make_Multiplies_complex_complex_complex_complex(c, c) a = f.this except: - print f, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(f)) s = "%s" % f if str.find(s, "ArithUnaryFunction") == -1: - print f, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(f)) # # Mix case @@ -65,23 +57,19 @@ try: g = make_Multiplies_double_double_complex_complex(d, c) a = g.this except: - print g, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(g)) s = "%s" % g if str.find(s, "ArithUnaryFunction") == -1: - print g, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(g)) try: h = make_Multiplies_complex_complex_double_double(c, d) a = h.this except: - print h, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(h)) s = "%s" % h if str.find(s, "ArithUnaryFunction") == -1: - print h, "is not an ArithUnaryFunction" - raise RuntimeError + raise RuntimeError("{} is not an ArithUnaryFunction".format(h)) diff --git a/Examples/test-suite/python/template_typedef_runme.py b/Examples/test-suite/python/template_typedef_runme.py index 16695bada..5723e4f59 100644 --- a/Examples/test-suite/python/template_typedef_runme.py +++ b/Examples/test-suite/python/template_typedef_runme.py @@ -14,22 +14,19 @@ try: e = make_Multiplies_float_float_float_float(d, d) a = e.this except: - print e, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(e)) try: f = make_Multiplies_reald_reald_reald_reald(c, c) a = f.this except: - print f, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(f)) try: g = make_Multiplies_float_float_reald_reald(d, c) a = g.this except: - print g, "is not an instance" - raise RuntimeError + raise RuntimeError("{} is not an instance".format(g)) # the old large format diff --git a/Examples/test-suite/python/template_typemaps_typedef2_runme.py b/Examples/test-suite/python/template_typemaps_typedef2_runme.py index 258f44366..da26a9f76 100644 --- a/Examples/test-suite/python/template_typemaps_typedef2_runme.py +++ b/Examples/test-suite/python/template_typemaps_typedef2_runme.py @@ -5,7 +5,7 @@ m1 = MultimapIntA() dummy_pair = m1.make_dummy_pair() val = m1.typemap_test(dummy_pair).val if val != 1234: - raise RuntimeError, "typemaps not working" + raise RuntimeError("typemaps not working") m2 = MultimapAInt() @@ -13,24 +13,24 @@ m2 = MultimapAInt() #dummy_pair = m2.make_dummy_pair() #val = m2.typemap_test(dummy_pair) -# print val +# print("{}".format(val)) # if val != 4321: # raise RuntimeError, "typemaps not working" if typedef_test1(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test1 not working" + raise RuntimeError("typedef_test1 not working") if typedef_test2(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test2 not working" + raise RuntimeError("typedef_test2 not working") if typedef_test3(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test3 not working" + raise RuntimeError("typedef_test3 not working") if typedef_test4(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test4 not working" + raise RuntimeError("typedef_test4 not working") if typedef_test5(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test5 not working" + raise RuntimeError("typedef_test5 not working") if typedef_test6(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test6 not working" + raise RuntimeError("typedef_test6 not working") diff --git a/Examples/test-suite/python/template_typemaps_typedef_runme.py b/Examples/test-suite/python/template_typemaps_typedef_runme.py index 1ca3f835c..a5209b71f 100644 --- a/Examples/test-suite/python/template_typemaps_typedef_runme.py +++ b/Examples/test-suite/python/template_typemaps_typedef_runme.py @@ -5,7 +5,7 @@ m1 = MultimapIntA() dummy_pair = m1.make_dummy_pair() val = m1.typemap_test(dummy_pair).val if val != 1234: - raise RuntimeError, "typemaps not working" + raise RuntimeError("typemaps not working") m2 = MultimapAInt() @@ -13,24 +13,24 @@ m2 = MultimapAInt() #dummy_pair = m2.make_dummy_pair() #val = m2.typemap_test(dummy_pair) -# print val +# print("{}".format(val)) # if val != 4321: # raise RuntimeError, "typemaps not working" if typedef_test1(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test1 not working" + raise RuntimeError("typedef_test1 not working") if typedef_test2(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test2 not working" + raise RuntimeError("typedef_test2 not working") if typedef_test3(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test3 not working" + raise RuntimeError("typedef_test3 not working") if typedef_test4(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test4 not working" + raise RuntimeError("typedef_test4 not working") if typedef_test5(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test5 not working" + raise RuntimeError("typedef_test5 not working") if typedef_test6(dummy_pair).val != 1234: - raise RuntimeError, "typedef_test6 not working" + raise RuntimeError("typedef_test6 not working") diff --git a/Examples/test-suite/python/threads_exception_runme.py b/Examples/test-suite/python/threads_exception_runme.py index 056bd849b..e3f6299e7 100644 --- a/Examples/test-suite/python/threads_exception_runme.py +++ b/Examples/test-suite/python/threads_exception_runme.py @@ -3,18 +3,18 @@ import threads_exception t = threads_exception.Test() try: t.unknown() -except RuntimeError, e: +except RuntimeError as e: pass try: t.simple() -except RuntimeError, e: +except RuntimeError as e: if e.args[0] != 37: raise RuntimeError try: t.message() -except RuntimeError, e: +except RuntimeError as e: if e.args[0] != "I died.": raise RuntimeError @@ -23,18 +23,18 @@ except RuntimeError, e: if not threads_exception.is_python_builtin(): try: t.hosed() - except threads_exception.Exc, e: + except threads_exception.Exc as e: code = e.code if code != 42: - raise RuntimeError, "bad... code: %d" % code + raise RuntimeError("bad... code: %d" % code) msg = e.msg if msg != "Hosed": - raise RuntimeError, "bad... msg: '%s' len: %d" % (msg, len(msg)) + raise RuntimeError("bad... msg: '%s' len: %d" % (msg, len(msg))) for i in range(1, 4): try: t.multi(i) - except RuntimeError, e: + except RuntimeError as e: pass - except threads_exception.Exc, e: + except threads_exception.Exc as e: pass diff --git a/Examples/test-suite/python/typedef_inherit_runme.py b/Examples/test-suite/python/typedef_inherit_runme.py index 6b7f2d872..3c552ec65 100644 --- a/Examples/test-suite/python/typedef_inherit_runme.py +++ b/Examples/test-suite/python/typedef_inherit_runme.py @@ -5,19 +5,19 @@ b = typedef_inherit.Bar() x = typedef_inherit.do_blah(a) if x != "Foo::blah": - print "Whoa! Bad return", x + raise RuntimeError("Whoa! Bad return {}".format(x)) x = typedef_inherit.do_blah(b) if x != "Bar::blah": - print "Whoa! Bad return", x + raise RuntimeError("Whoa! Bad return {}".format(x)) c = typedef_inherit.Spam() d = typedef_inherit.Grok() x = typedef_inherit.do_blah2(c) if x != "Spam::blah": - print "Whoa! Bad return", x + raise RuntimeError("Whoa! Bad return {}".format(x)) x = typedef_inherit.do_blah2(d) if x != "Grok::blah": - print "Whoa! Bad return", x + raise RuntimeError("Whoa! Bad return {}".format(x)) diff --git a/Examples/test-suite/python/typedef_scope_runme.py b/Examples/test-suite/python/typedef_scope_runme.py index edd3e9f3a..0294c4a07 100644 --- a/Examples/test-suite/python/typedef_scope_runme.py +++ b/Examples/test-suite/python/typedef_scope_runme.py @@ -3,8 +3,8 @@ import typedef_scope b = typedef_scope.Bar() x = b.test1(42, "hello") if x != 42: - print "Failed!!" + raise RuntimeError("Failed!!") x = b.test2(42, "hello") if x != "hello": - print "Failed!!" + raise RuntimeError("Failed!!") diff --git a/Examples/test-suite/python/typemap_arrays_runme.py b/Examples/test-suite/python/typemap_arrays_runme.py index ea0f08d6b..7bc45f908 100644 --- a/Examples/test-suite/python/typemap_arrays_runme.py +++ b/Examples/test-suite/python/typemap_arrays_runme.py @@ -1,4 +1,4 @@ from typemap_arrays import * if sumA(None) != 60: - raise RuntimeError, "Sum is wrong" + raise RuntimeError("Sum is wrong") diff --git a/Examples/test-suite/python/typename_runme.py b/Examples/test-suite/python/typename_runme.py index aac936fde..a4f76fc36 100644 --- a/Examples/test-suite/python/typename_runme.py +++ b/Examples/test-suite/python/typename_runme.py @@ -4,8 +4,8 @@ f = typename.Foo() b = typename.Bar() x = typename.twoFoo(f) -if not isinstance(x, types.FloatType): - raise RuntimeError, "Wrong return type (FloatType) !" +if not isinstance(x, float): + raise RuntimeError("Wrong return type (FloatType) !") y = typename.twoBar(b) -if not isinstance(y, types.IntType): - raise RuntimeError, "Wrong return type (IntType)!" +if not isinstance(y, int): + raise RuntimeError("Wrong return type (IntType)!") diff --git a/Examples/test-suite/python/unicode_strings_runme.py b/Examples/test-suite/python/unicode_strings_runme.py index 4e661f00e..57bd7abca 100644 --- a/Examples/test-suite/python/unicode_strings_runme.py +++ b/Examples/test-suite/python/unicode_strings_runme.py @@ -2,12 +2,8 @@ import sys import unicode_strings -# The 'u' string prefix isn't valid in Python 3.0 - 3.2 and is redundant -# in 3.3+. Since this file is run through 2to3 before testing, though, -# mark this as a unicode string in 2.x so it'll become a str in 3.x. -test_string = u"h\udce9llo w\u00f6rld" - if sys.version_info[0:2] >= (3, 1): + test_string = "h\udce9llo w\u00f6rld" if unicode_strings.non_utf8_c_str() != test_string: raise ValueError("Test comparison mismatch") if unicode_strings.non_utf8_std_string() != test_string: @@ -19,19 +15,24 @@ def check(s1, s2): # Testing SWIG_PYTHON_2_UNICODE flag which allows unicode strings to be passed to C if sys.version_info[0:2] < (3, 0): + # Python 3.0-3.2 results in a SyntaxError when using u"" string literals, so we use a + # convoluted unicode string construction using unicode() and unichr(). + # Conventional Python 2 syntax shown in comments. check(unicode_strings.charstring("hello1"), "hello1") - check(unicode_strings.charstring(str(u"hello2")), "hello2") - check(unicode_strings.charstring(u"hello3"), "hello3") - check(unicode_strings.charstring(unicode("hello4")), "hello4") - unicode_strings.charstring(u"hell\xb05") - unicode_strings.charstring(u"hell\u00f66") - -low_surrogate_string = u"\udcff" -try: + check(unicode_strings.charstring(str(unicode("hello2"))), "hello2") # u"hello2" + check(unicode_strings.charstring(unicode("hello3")), "hello3") # u"hello3" + check(unicode_strings.charstring(str("hello4")), "hello4") + unicode_strings.charstring(unicode("hell" + unichr(0xb0) + "5")) # u"hell\xb05" + unicode_strings.charstring(unicode("hell" + unichr(0x00f6) +"6")) # u"hell\u00f66" + low_surrogate_string = unichr(0xdcff) # u"\udcff" unicode_strings.instring(low_surrogate_string) - # Will succeed with Python 2 -except TypeError, e: - # Python 3 will fail the PyUnicode_AsUTF8String conversion resulting in a TypeError. - # The real error is actually: - # UnicodeEncodeError: 'utf-8' codec can't encode character '\udcff' in position 0: surrogates not allowed - pass +else: + low_surrogate_string = "\udcff" + try: + unicode_strings.instring(low_surrogate_string) + raise RuntimeError("Exception should have been thrown") + except TypeError as e: + # Python 3 will fail the PyUnicode_AsUTF8String conversion resulting in a TypeError. + # The real error is actually: + # UnicodeEncodeError: 'utf-8' codec can't encode character '\udcff' in position 0: surrogates not allowed + pass diff --git a/Examples/test-suite/python/unions_runme.py b/Examples/test-suite/python/unions_runme.py index 387a048c8..5a3ee3b5c 100644 --- a/Examples/test-suite/python/unions_runme.py +++ b/Examples/test-suite/python/unions_runme.py @@ -3,7 +3,6 @@ # union embedded within a struct can be set and read correctly. import unions -import sys import string # Create new instances of SmallStruct and BigStruct for later use @@ -23,28 +22,23 @@ eut.number = 1 eut.uni.small = small Jill1 = eut.uni.small.jill if (Jill1 != 200): - print "Runtime test1 failed. eut.uni.small.jill=", Jill1 - sys.exit(1) + raise RuntimeError("Runtime test1 failed. eut.uni.small.jill={}".format(Jill1)) Num1 = eut.number if (Num1 != 1): - print "Runtime test2 failed. eut.number=", Num1 - sys.exit(1) + raise RuntimeError("Runtime test2 failed. eut.number=".format(Num1)) # Secondly check the BigStruct in EmbeddedUnionTest eut.number = 2 eut.uni.big = big Jack1 = eut.uni.big.jack if (Jack1 != 300): - print "Runtime test3 failed. eut.uni.big.jack=", Jack1 - sys.exit(1) + raise RuntimeError("Runtime test3 failed. eut.uni.big.jack={}".format(Jack1)) Jill2 = eut.uni.big.smallstruct.jill if (Jill2 != 200): - print "Runtime test4 failed. eut.uni.big.smallstruct.jill=", Jill2 - sys.exit(1) + raise RuntimeError("Runtime test4 failed. eut.uni.big.smallstruct.jill={}".format(Jill2)) Num2 = eut.number if (Num2 != 2): - print "Runtime test5 failed. eut.number=", Num2 - sys.exit(1) + raise RuntimeError("Runtime test5 failed. eut.number={}".format(Num2)) diff --git a/Examples/test-suite/python/using_composition_runme.py b/Examples/test-suite/python/using_composition_runme.py index c4f339095..67f72bc2f 100644 --- a/Examples/test-suite/python/using_composition_runme.py +++ b/Examples/test-suite/python/using_composition_runme.py @@ -2,32 +2,32 @@ from using_composition import * f = FooBar() if f.blah(3) != 3: - raise RuntimeError, "FooBar::blah(int)" + raise RuntimeError("FooBar::blah(int)") if f.blah(3.5) != 3.5: - raise RuntimeError, "FooBar::blah(double)" + raise RuntimeError("FooBar::blah(double)") if f.blah("hello") != "hello": - raise RuntimeError, "FooBar::blah(char *)" + raise RuntimeError("FooBar::blah(char *)") f = FooBar2() if f.blah(3) != 3: - raise RuntimeError, "FooBar2::blah(int)" + raise RuntimeError("FooBar2::blah(int)") if f.blah(3.5) != 3.5: - raise RuntimeError, "FooBar2::blah(double)" + raise RuntimeError("FooBar2::blah(double)") if f.blah("hello") != "hello": - raise RuntimeError, "FooBar2::blah(char *)" + raise RuntimeError("FooBar2::blah(char *)") f = FooBar3() if f.blah(3) != 3: - raise RuntimeError, "FooBar3::blah(int)" + raise RuntimeError("FooBar3::blah(int)") if f.blah(3.5) != 3.5: - raise RuntimeError, "FooBar3::blah(double)" + raise RuntimeError("FooBar3::blah(double)") if f.blah("hello") != "hello": - raise RuntimeError, "FooBar3::blah(char *)" + raise RuntimeError("FooBar3::blah(char *)") diff --git a/Examples/test-suite/python/using_extend_runme.py b/Examples/test-suite/python/using_extend_runme.py index 038a1686a..7e0912926 100644 --- a/Examples/test-suite/python/using_extend_runme.py +++ b/Examples/test-suite/python/using_extend_runme.py @@ -2,20 +2,20 @@ from using_extend import * f = FooBar() if f.blah(3) != 3: - raise RuntimeError, "blah(int)" + raise RuntimeError("blah(int)") if f.blah(3.5) != 3.5: - raise RuntimeError, "blah(double)" + raise RuntimeError("blah(double)") if f.blah("hello") != "hello": - raise RuntimeError, "blah(char *)" + raise RuntimeError("blah(char *)") if f.blah(3, 4) != 7: - raise RuntimeError, "blah(int,int)" + raise RuntimeError("blah(int,int)") if f.blah(3.5, 7.5) != (3.5 + 7.5): - raise RuntimeError, "blah(double,double)" + raise RuntimeError("blah(double,double)") if f.duh(3) != 3: - raise RuntimeError, "duh(int)" + raise RuntimeError("duh(int)") diff --git a/Examples/test-suite/python/using_inherit_runme.py b/Examples/test-suite/python/using_inherit_runme.py index 4fd595968..ccdeece8d 100644 --- a/Examples/test-suite/python/using_inherit_runme.py +++ b/Examples/test-suite/python/using_inherit_runme.py @@ -2,47 +2,47 @@ from using_inherit import * b = Bar() if b.test(3) != 3: - raise RuntimeError, "Bar::test(int)" + raise RuntimeError("Bar::test(int)") if b.test(3.5) != 3.5: - raise RuntimeError, "Bar::test(double)" + raise RuntimeError("Bar::test(double)") b = Bar2() if b.test(3) != 6: - raise RuntimeError, "Bar2::test(int)" + raise RuntimeError("Bar2::test(int)") if b.test(3.5) != 7.0: - raise RuntimeError, "Bar2::test(double)" + raise RuntimeError("Bar2::test(double)") b = Bar3() if b.test(3) != 6: - raise RuntimeError, "Bar3::test(int)" + raise RuntimeError("Bar3::test(int)") if b.test(3.5) != 7.0: - raise RuntimeError, "Bar3::test(double)" + raise RuntimeError("Bar3::test(double)") b = Bar4() if b.test(3) != 6: - raise RuntimeError, "Bar4::test(int)" + raise RuntimeError("Bar4::test(int)") if b.test(3.5) != 7.0: - raise RuntimeError, "Bar4::test(double)" + raise RuntimeError("Bar4::test(double)") b = Fred1() if b.test(3) != 3: - raise RuntimeError, "Fred1::test(int)" + raise RuntimeError("Fred1::test(int)") if b.test(3.5) != 7.0: - raise RuntimeError, "Fred1::test(double)" + raise RuntimeError("Fred1::test(double)") b = Fred2() if b.test(3) != 3: - raise RuntimeError, "Fred2::test(int)" + raise RuntimeError("Fred2::test(int)") if b.test(3.5) != 7.0: - raise RuntimeError, "Fred2::test(double)" + raise RuntimeError("Fred2::test(double)") diff --git a/Examples/test-suite/python/using_private_runme.py b/Examples/test-suite/python/using_private_runme.py index 00c9a8d25..9e0a15f12 100644 --- a/Examples/test-suite/python/using_private_runme.py +++ b/Examples/test-suite/python/using_private_runme.py @@ -4,10 +4,10 @@ f = FooBar() f.x = 3 if f.blah(4) != 4: - raise RuntimeError, "blah(int)" + raise RuntimeError("blah(int)") if f.defaulted() != -1: - raise RuntimeError, "defaulted()" + raise RuntimeError("defaulted()") if f.defaulted(222) != 222: - raise RuntimeError, "defaulted(222)" + raise RuntimeError("defaulted(222)") diff --git a/Examples/test-suite/python/using_protected_runme.py b/Examples/test-suite/python/using_protected_runme.py index 525a1cde4..dd477237e 100644 --- a/Examples/test-suite/python/using_protected_runme.py +++ b/Examples/test-suite/python/using_protected_runme.py @@ -4,4 +4,4 @@ f = FooBar() f.x = 3 if f.blah(4) != 4: - raise RuntimeError, "blah(int)" + raise RuntimeError("blah(int)") diff --git a/Examples/test-suite/python/varargs_overload_runme.py b/Examples/test-suite/python/varargs_overload_runme.py index 6f5a70222..ffa763450 100644 --- a/Examples/test-suite/python/varargs_overload_runme.py +++ b/Examples/test-suite/python/varargs_overload_runme.py @@ -1,62 +1,62 @@ import varargs_overload if varargs_overload.vararg_over1("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over1(2) != "2": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over2("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over2(2, 2.2) != "2 2.2": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over3("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over3(2, 2.2, "hey") != "2 2.2 hey": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over4("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over4(123) != "123": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over4("Hello", 123) != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") # Same as above but non-vararg function declared first if varargs_overload.vararg_over6("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over6(2) != "2": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over7("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over7(2, 2.2) != "2 2.2": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over8("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over8(2, 2.2, "hey") != "2 2.2 hey": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over9("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over9(123) != "123": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs_overload.vararg_over9("Hello", 123) != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") diff --git a/Examples/test-suite/python/varargs_runme.py b/Examples/test-suite/python/varargs_runme.py index 277ea757a..13f85a75f 100644 --- a/Examples/test-suite/python/varargs_runme.py +++ b/Examples/test-suite/python/varargs_runme.py @@ -1,31 +1,35 @@ import varargs if varargs.test("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") + +vc = varargs.VarargConstructor("Hey there") +if vc.str != "Hey there": + raise RuntimeError("Failed") f = varargs.Foo("Greetings") if f.str != "Greetings": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if f.test("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs.test_def("Hello", 1) != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs.test_def("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") ### if varargs.test_plenty("Hello") != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs.test_plenty("Hello", 1) != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") if varargs.test_plenty("Hello", 1, 2) != "Hello": - raise RuntimeError, "Failed" + raise RuntimeError("Failed") try: varargs.test_plenty("Hello", 1, 2, 3) diff --git a/Examples/test-suite/python/virtual_derivation_runme.py b/Examples/test-suite/python/virtual_derivation_runme.py index 68546c6eb..21014bd02 100644 --- a/Examples/test-suite/python/virtual_derivation_runme.py +++ b/Examples/test-suite/python/virtual_derivation_runme.py @@ -4,4 +4,4 @@ from virtual_derivation import * # b = B(3) if b.get_a() != b.get_b(): - raise RuntimeError, "something is really wrong" + raise RuntimeError("something is really wrong") diff --git a/Examples/test-suite/python_append.i b/Examples/test-suite/python_append.i index 049494319..883097ec6 100644 --- a/Examples/test-suite/python_append.i +++ b/Examples/test-suite/python_append.i @@ -42,13 +42,31 @@ import os.path %} %inline %{ - class Test { public: static void static_func() {}; void funk() {}; }; +%} +// Github issue #1674 +%extend ForSlots { + %pythoncode %{ + __slots__ = ["this"] + %} +} +// While __slots__ does not contain 'ValidVariable' in the list, it is still possible +// to set 'ValidVariable'. A little odd, but the whole attribute setting is bypassed +// for setting C/C++ member variables. +// Not sure how to test the equivalent for -builtin. +%inline %{ +struct ForSlots { + int ValidVariable; + ForSlots() : ValidVariable(99) {} +}; +%} + +%inline %{ #ifdef SWIGPYTHON_BUILTIN bool is_python_builtin() { return true; } #else diff --git a/Examples/test-suite/r/Makefile.in b/Examples/test-suite/r/Makefile.in index 33e9d90da..98835b958 100644 --- a/Examples/test-suite/r/Makefile.in +++ b/Examples/test-suite/r/Makefile.in @@ -18,6 +18,7 @@ C_TEST_CASES += \ CPP_TEST_CASES += \ r_double_delete \ + r_memory_leak \ r_overload_array \ r_sexp \ r_overload_comma \ diff --git a/Examples/test-suite/r/abstract_access_runme.R b/Examples/test-suite/r/abstract_access_runme.R new file mode 100644 index 000000000..f6fb4099d --- /dev/null +++ b/Examples/test-suite/r/abstract_access_runme.R @@ -0,0 +1,74 @@ +clargs <- commandArgs(trailing=TRUE) +source(file.path(clargs[1], "unittest.R")) + +dyn.load(paste("abstract_access", .Platform$dynlib.ext, sep="")) +source("abstract_access.R") + +dd <- D() +unittest(1, dd$z()) +unittest(1, dd$do_x()) + +## Original version allowed dd$z <- 2 +tryCatch({ + dd$z <- 2 + # force an error if the previous line doesn't raise an exception + stop("Test Failure A") +}, error = function(e) { + if (e$message == "Test Failure A") { + # Raise the error again to cause a failed test + stop(e) + } + message("Correct - no dollar assignment method found") +} +) + +tryCatch({ + dd[["z"]] <- 2 + # force an error if the previous line doesn't raise an exception + stop("Test Failure B") +}, error = function(e) { + if (e$message == "Test Failure B") { + # Raise the error again to cause a failed test + stop(e) + } + message("Correct - no dollar assignment method found") +} +) + +## The methods are attached to the parent class - see if we can get +## them +tryCatch({ + m1 <- getMethod('$', "_p_A") +}, error = function(e) { + stop("No $ method found - there should be one") +} +) + +## These methods should not be present +## They correspond to the tests that are expected +## to fail above. +tryCatch({ + m2 <- getMethod('$<-', "_p_A") + # force an error if the previous line doesn't raise an exception + stop("Test Failure C") +}, error = function(e) { + if (e$message == "Test Failure C") { + # Raise the error again to cause a failed test + stop(e) + } + message("Correct - no dollar assignment method found") +} +) + +tryCatch({ + m3 <- getMethod('[[<-', "_p_A") + # force an error if the previous line doesn't raise an exception + stop("Test Failure D") +}, error = function(e) { + if (e$message == "Test Failure D") { + # Raise the error again to cause a failed test + stop(e) + } + message("Correct - no list assignment method found") +} +) diff --git a/Examples/test-suite/r/r_memory_leak_runme.R b/Examples/test-suite/r/r_memory_leak_runme.R new file mode 100644 index 000000000..ef6533aef --- /dev/null +++ b/Examples/test-suite/r/r_memory_leak_runme.R @@ -0,0 +1,26 @@ +clargs <- commandArgs(trailing=TRUE) +source(file.path(clargs[1], "unittest.R")) + +dyn.load(paste("r_memory_leak", .Platform$dynlib.ext, sep="")) +source("r_memory_leak.R") +cacheMetaData(1) + +a <- Foo(); +unittest(Foo_get_count(), 1); +b <- Foo(); +unittest(Foo_get_count(), 2); + +# Normal behaviour +invisible(trigger_internal_swig_exception("no problem", a)); +unittest(Foo_get_count(), 2); +# SWIG exception introduced +result <- tryCatch({ + trigger_internal_swig_exception("null", b); +}, warning = function(w) { + # print(" Hum... We received a warning, but this should be an error"); + unittest(1,0); +}, error = function(e) { + # print(" Gotcha!"); + unittest(1,1); +}) +unittest(Foo_get_count(), 2); diff --git a/Examples/test-suite/r_memory_leak.i b/Examples/test-suite/r_memory_leak.i new file mode 100644 index 000000000..a240097e3 --- /dev/null +++ b/Examples/test-suite/r_memory_leak.i @@ -0,0 +1,40 @@ +%module r_memory_leak + +%include + +%typemap(in) Foo* foo +{ + $1 = new Foo; +} +%typemap(freearg) Foo* foo +{ + printf(" \" Object deleted\"\n"); + delete $1; +} +%typemap(out) Foo* verify_no_memory_leak +{ + if ($1 == NULL) + SWIG_exception_fail(SWIG_RuntimeError, "Let's see how the bindings manage this exception!"); +} +%typemap(scoerceout) Foo* + %{ if (!is.null($result) && !is.logical($result)) {$result <- new("$R_class", ref=$result) ;}; %} + +%inline %{ + #include + + class Foo { + static unsigned count; + public: + Foo() { ++count; } + ~Foo() { --count; } + static unsigned get_count() { return count; } + }; + + unsigned Foo::count = 0; + + static Foo* trigger_internal_swig_exception(const std::string& message, Foo* foo) + { + return (message == "null") ? NULL : foo; + }; + +%} diff --git a/Examples/test-suite/rname.i b/Examples/test-suite/rname.i index 09d6e3e3b..b7cf5d22b 100644 --- a/Examples/test-suite/rname.i +++ b/Examples/test-suite/rname.i @@ -22,7 +22,7 @@ %rename (newname) Space::Base::oldname(double d) const; /* Rename derived class method only */ -%rename (Xfunc) Space::Derived::fn(Base baseValue, Base* basePtr, Base& baseRef); +%rename (Xfunc) Space::Derived::fn1(Base baseValue, Base* basePtr, Base& baseRef); %inline %{ class Bar { @@ -43,14 +43,14 @@ class Base { public: Base(){}; virtual ~Base(){}; - void fn(Base baseValue, Base* basePtr, Base& baseRef){} + void fn1(Base baseValue, Base* basePtr, Base& baseRef){} virtual const char * oldname(double d) const { return "Base"; } }; class Derived : public Base { public: Derived(){} ~Derived(){} - void fn(Base baseValue, Base* basePtr, Base& baseRef){} + void fn1(Base baseValue, Base* basePtr, Base& baseRef){} virtual const char * oldname(double d) const { return "Derived"; } }; } diff --git a/Examples/test-suite/ruby/Makefile.in b/Examples/test-suite/ruby/Makefile.in index d75cdb058..f982eca1f 100644 --- a/Examples/test-suite/ruby/Makefile.in +++ b/Examples/test-suite/ruby/Makefile.in @@ -23,6 +23,7 @@ CPP_TEST_CASES = \ li_std_wstring_inherit \ primitive_types \ ruby_alias_method \ + ruby_global_immutable_vars_cpp \ ruby_keywords \ ruby_minherit_shared_ptr \ ruby_naming \ @@ -48,6 +49,7 @@ C_TEST_CASES += \ li_cstring \ ruby_alias_global_function \ ruby_alias_module_function \ + ruby_global_immutable_vars \ ruby_manual_proxy \ include $(srcdir)/../common.mk @@ -57,6 +59,8 @@ SWIGOPT += -w801 -noautorename -features autodoc=4 # Custom tests - tests with additional commandline options ruby_alias_global_function.ctest: SWIGOPT += -globalmodule +ruby_global_immutable_vars.ctest: SWIGOPT += -globalmodule +ruby_global_immutable_vars_cpp.cpptest: SWIGOPT += -globalmodule ruby_naming.cpptest: SWIGOPT += -autorename # Rules for the different types of tests @@ -80,6 +84,8 @@ ruby_naming.cpptest: SWIGOPT += -autorename run_testcase = \ if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(RUBY) $(RUBYFLAGS) -I$(srcdir):. $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ + elif [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*.so ] ; then \ + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(RUBY) $(RUBYFLAGS) -I$(srcdir):. -r$(SCRIPTDIR)/$(SCRIPTPREFIX)$*.so -e '' ; \ fi # Clean diff --git a/Examples/test-suite/ruby/constant_directive_runme.rb b/Examples/test-suite/ruby/constant_directive_runme.rb new file mode 100644 index 000000000..ae6cf4fb3 --- /dev/null +++ b/Examples/test-suite/ruby/constant_directive_runme.rb @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'swig_assert' +require 'constant_directive' + +swig_assert("Constant_directive::TYPE1_CONSTANT1.is_a?(Constant_directive::Type1)", binding) +swig_assert("Constant_directive::getType1Instance().is_a?(Constant_directive::Type1)", binding) + +swig_assert_equal('Constant_directive::TYPE1_CONSTANT1.val', '1', binding) +swig_assert_equal('Constant_directive::TYPE1_CONSTANT2.val', '2', binding) +swig_assert_equal('Constant_directive::TYPE1_CONSTANT3.val', '3', binding) +swig_assert_equal('Constant_directive::TYPE1CONST_CONSTANT1.val', '1', binding) +swig_assert_equal('Constant_directive::TYPE1CPTR_CONSTANT1.val', '1', binding) diff --git a/Examples/test-suite/ruby/contract_runme.rb b/Examples/test-suite/ruby/contract_runme.rb new file mode 100644 index 000000000..df7fd3d8f --- /dev/null +++ b/Examples/test-suite/ruby/contract_runme.rb @@ -0,0 +1,69 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'swig_assert' +require 'contract' + +def swig_assert_runtime_error(msg, type, &block) + begin + yield(block) + raise SwigRubyError.new("#{msg} failed") + rescue RuntimeError => e + reason = e.to_s + if reason =~ /\bcontract violation\b/i && reason =~ /\b#{type}\b/i + # OK + else + raise e + end + end +end + +Contract::test_preassert(1, 2) +swig_assert_runtime_error("Preassertions", "require") { Contract::test_preassert(-1, 3) } + +Contract::test_postassert(3) +swig_assert_runtime_error("Postassertions", "ensure") { Contract::test_postassert(-3) } + +Contract::test_prepost(2, 3) +Contract::test_prepost(5, -4) +swig_assert_runtime_error("Preassertions", "require") { Contract::test_prepost(-3, 4) } +swig_assert_runtime_error("Postassertions", "ensure") { Contract::test_prepost(4, -10) } + +f = Contract::Foo.new +f.test_preassert(4, 5) +swig_assert_runtime_error("Method preassertion", "require") { f.test_preassert(-2, 3) } + +f.test_postassert(4) +swig_assert_runtime_error("Method postassertion", "ensure") { f.test_postassert(-4) } + +f.test_prepost(3, 4) +f.test_prepost(4, -3) +swig_assert_runtime_error("Method preassertion", "require") { f.test_prepost(-4, 2) } +swig_assert_runtime_error("Method postassertion", "ensure") { f.test_prepost(4, -10) } + +Contract::Foo.stest_prepost(4, 0) +swig_assert_runtime_error("Static method preassertion", "require") { Contract::Foo.stest_prepost(-4, 2) } +swig_assert_runtime_error("Static method postassertion", "ensure") { Contract::Foo.stest_prepost(4, -10) } + +b = Contract::Bar.new +swig_assert_runtime_error("Inherited preassertion", "require") { b.test_prepost(2, -4) } + +d = Contract::D.new +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.foo(-1, 1, 1, 1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.foo(1, -1, 1, 1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.foo(1, 1, -1, 1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.foo(1, 1, 1, -1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.foo(1, 1, 1, 1, -1) } + +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.bar(-1, 1, 1, 1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.bar(1, -1, 1, 1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.bar(1, 1, -1, 1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.bar(1, 1, 1, -1, 1) } +swig_assert_runtime_error("Inherited preassertion (D)", "require") { d.bar(1, 1, 1, 1, -1) } + +# namespace +Contract::MyClass.new(1) +swig_assert_runtime_error("Constructor preassertion", "require") { Contract::MyClass.new(0) } + diff --git a/Examples/test-suite/ruby/cpp11_alias_nested_template_scoping_runme.rb b/Examples/test-suite/ruby/cpp11_alias_nested_template_scoping_runme.rb new file mode 100644 index 000000000..c6e2b8559 --- /dev/null +++ b/Examples/test-suite/ruby/cpp11_alias_nested_template_scoping_runme.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'swig_assert' +require 'cpp11_alias_nested_template_scoping' + +ys = Cpp11_alias_nested_template_scoping::Yshort.new +val = ys.create1 +val = ys.create2 +val = ys.create3 +val = ys.create4 +val = ys.create5 +val = ys.create6 +val = ys.create7 + +val = ys.create13 + +val = ys.create15 +val = ys.create16 +val = ys.create17 + diff --git a/Examples/test-suite/ruby/cpp17_nested_namespaces_runme.rb b/Examples/test-suite/ruby/cpp17_nested_namespaces_runme.rb new file mode 100644 index 000000000..e9e841179 --- /dev/null +++ b/Examples/test-suite/ruby/cpp17_nested_namespaces_runme.rb @@ -0,0 +1,24 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'cpp17_nested_namespaces' + +Cpp17_nested_namespaces::A1Struct.new.A1Method +Cpp17_nested_namespaces::B1Struct.new.B1Method +Cpp17_nested_namespaces::C1Struct.new.C1Method + +Cpp17_nested_namespaces.createA1Struct().A1Method +Cpp17_nested_namespaces.createB1Struct().B1Method +Cpp17_nested_namespaces.createC1Struct().C1Method + +Cpp17_nested_namespaces::B2Struct.new.B2Method +Cpp17_nested_namespaces::C2Struct.new.C2Method +Cpp17_nested_namespaces.createB2Struct().B2Method +Cpp17_nested_namespaces.createC2Struct().C2Method + +Cpp17_nested_namespaces::B3Struct.new.B3Method +Cpp17_nested_namespaces::C3Struct.new.C3Method +Cpp17_nested_namespaces.createB3Struct().B3Method +Cpp17_nested_namespaces.createC3Struct().C3Method diff --git a/Examples/test-suite/ruby/cpp_enum_runme.rb b/Examples/test-suite/ruby/cpp_enum_runme.rb new file mode 100644 index 000000000..0a395e0e0 --- /dev/null +++ b/Examples/test-suite/ruby/cpp_enum_runme.rb @@ -0,0 +1,19 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'swig_assert' +require 'cpp_enum' + +f = Cpp_enum::Foo.new +swig_assert_equal('f.hola', 'Cpp_enum::Foo::Hello', binding) + +f.hola = Cpp_enum::Foo::Hi +swig_assert_equal('f.hola', 'Cpp_enum::Foo::Hi', binding) + +f.hola = Cpp_enum::Foo::Hello +swig_assert_equal('f.hola', 'Cpp_enum::Foo::Hello', binding) + +Cpp_enum::hi = Cpp_enum::Hello +swig_assert_equal('Cpp_enum::hi', 'Cpp_enum::Hello', binding) diff --git a/Examples/test-suite/ruby/cpp_static_runme.rb b/Examples/test-suite/ruby/cpp_static_runme.rb new file mode 100644 index 000000000..85bdb7028 --- /dev/null +++ b/Examples/test-suite/ruby/cpp_static_runme.rb @@ -0,0 +1,26 @@ +#!/usr/bin/env ruby +# +# This test implementation is derived from its Python counterpart. +# + +require 'swig_assert' +require 'cpp_static' + +Cpp_static::StaticFunctionTest.static_func() +Cpp_static::StaticFunctionTest.static_func_2(1) +Cpp_static::StaticFunctionTest.static_func_3(1, 2) + +swig_assert_equal("Cpp_static::StaticMemberTest.static_int", "99", binding) +Cpp_static::StaticMemberTest.static_int = 10 +swig_assert_equal("Cpp_static::StaticMemberTest.static_int", "10", binding) + +swig_assert_equal("Cpp_static::StaticBase.statty", "11", binding) +swig_assert_equal("Cpp_static::StaticBase.grab_statty_base", "11", binding) +swig_assert_equal("Cpp_static::StaticDerived.statty", "111", binding) +swig_assert_equal("Cpp_static::StaticDerived.grab_statty_derived", "111", binding) +Cpp_static::StaticBase.statty = 22 +Cpp_static::StaticDerived.statty = 222 +swig_assert_equal("Cpp_static::StaticBase.statty", "22", binding) +swig_assert_equal("Cpp_static::StaticBase.grab_statty_base", "22", binding) +swig_assert_equal("Cpp_static::StaticDerived.statty", "222", binding) +swig_assert_equal("Cpp_static::StaticDerived.grab_statty_derived", "222", binding) diff --git a/Examples/test-suite/ruby/enums_runme.rb b/Examples/test-suite/ruby/enums_runme.rb index cafac25fa..274d59568 100644 --- a/Examples/test-suite/ruby/enums_runme.rb +++ b/Examples/test-suite/ruby/enums_runme.rb @@ -25,10 +25,7 @@ Enums::BAR1 == 0 Enums::BAR2 == 1 EOF -# -# @bug: -# -# swig_assert_each_line( < e + had_exception = true +end +swig_assert(had_exception, nil, + "Global_immutable_vars_cpp::global_immutable_var is writable (expected to be immutable)") + +had_exception = false +begin + Global_immutable_vars_cpp::specific_immutable_var = 81 +rescue NoMethodError => e + had_exception = true +end +swig_assert(had_exception, nil, + "Global_immutable_vars_cpp::specific_immutable_var is writable (expected to be immutable)") + +swig_assert(Global_immutable_vars_cpp::check_values(80, 41, 82, 83, 44) == 1, nil, "Check values failed") diff --git a/Examples/test-suite/ruby/global_immutable_vars_runme.rb b/Examples/test-suite/ruby/global_immutable_vars_runme.rb new file mode 100644 index 000000000..ffbea270f --- /dev/null +++ b/Examples/test-suite/ruby/global_immutable_vars_runme.rb @@ -0,0 +1,52 @@ +#!/usr/bin/env ruby +# +# Here the proper generation of mutable and immutable variables is tested +# in the target language. +# Immutable variables do not have "=" methods generated by SWIG, +# therefore trying to assign these variables shall throw a NoMethodError +# exception. +# + +require 'swig_assert' + +require 'global_immutable_vars' + +# first check if all variables can be read +swig_assert_each_line( < e + had_exception = true +end +swig_assert(had_exception, nil, + "Global_immutable_vars::global_immutable_var is writable (expected to be immutable)") + +had_exception = false +begin + Global_immutable_vars::specific_immutable_var = 81 +rescue NoMethodError => e + had_exception = true +end +swig_assert(had_exception, nil, + "Global_immutable_vars::specific_immutable_var is writable (expected to be immutable)") + +swig_assert(Global_immutable_vars::check_values(80, 41, 82, 83, 44) == 1, nil, "Check values failed") diff --git a/Examples/test-suite/ruby/import_fragments_runme.rb b/Examples/test-suite/ruby/import_fragments_runme.rb new file mode 100644 index 000000000..a529980c0 --- /dev/null +++ b/Examples/test-suite/ruby/import_fragments_runme.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# +# +# +# + +require 'swig_assert' + +exception_file = nil + +begin + require 'import_fragments' +rescue LoadError => e + # due to missing import_fragments_a + exception_file = e.respond_to?(:path) ? e.path : e.to_s.sub(/.* -- /, '') +end + +swig_assert(exception_file == "import_fragments_a", + msg: "Loading should have failed due to missing 'import_fragments_a'") + diff --git a/Examples/test-suite/ruby/li_std_auto_ptr_runme.rb b/Examples/test-suite/ruby/li_std_auto_ptr_runme.rb new file mode 100644 index 000000000..cec48a58c --- /dev/null +++ b/Examples/test-suite/ruby/li_std_auto_ptr_runme.rb @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby + +require 'swig_assert' + +require 'li_std_auto_ptr' + +def gc_check(expected_count) +# GC.start(full_mark: true, immediate_sweep: true) + GC.start +# GC is not reliably run, skip check +# swig_assert_equal_simple(expected_count, Li_std_auto_ptr::Klass::getTotal_count()) +end + +k1 = Li_std_auto_ptr::makeKlassAutoPtr("first") +k2 = Li_std_auto_ptr::makeKlassAutoPtr("second") +swig_assert_equal_simple(2, Li_std_auto_ptr::Klass::getTotal_count()) + +gc_check(2) +k1 = nil +gc_check(1) + +swig_assert_equal_simple(k2.getLabel(), "second") +gc_check(1) + +k2 = nil +gc_check(0) + diff --git a/Examples/test-suite/ruby/li_std_containers_overload_runme.rb b/Examples/test-suite/ruby/li_std_containers_overload_runme.rb new file mode 100644 index 000000000..913b6113a --- /dev/null +++ b/Examples/test-suite/ruby/li_std_containers_overload_runme.rb @@ -0,0 +1,44 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# +# +# +# + +require 'swig_assert' + +require 'li_std_containers_overload' + +include Li_std_containers_overload + +def check(got, expected) + if (got != expected) + raise RuntimeError, "Failed check. '#{got}' != '#{expected}'" + end +end + +v = VectorX.new() +check(VectorOverload(v), "vector") + +v = VectorY.new() +check(VectorOverload(v), "vector") + +v = VectorInt.new() +check(VectorOverload(v), "vector") + +v = VectorString.new() +check(VectorOverload(v), "vector") + +v = [X.new()] +check(VectorOverload(v), "vector") + +v = [Y.new()] +check(VectorOverload(v), "vector") + +v = [1, 2, 3] +check(VectorOverload(v), "vector") + +v = ["aaa", "bbb", "ccc"] +check(VectorOverload(v), "vector") diff --git a/Examples/test-suite/ruby/li_std_functors_runme.rb b/Examples/test-suite/ruby/li_std_functors_runme.rb index 5623d49f0..a2a7c6f3d 100644 --- a/Examples/test-suite/ruby/li_std_functors_runme.rb +++ b/Examples/test-suite/ruby/li_std_functors_runme.rb @@ -63,7 +63,9 @@ def test yield method(:_map), Li_std_functors::Map end -# these should fail and not segfault +# these should fail and not segfault but currently do segfault with Ruby 2.6 +# in GitHub Actions environment +if RUBY_VERSION != '2.6.6' begin Li_std_functors::Set.new('sd') rescue @@ -72,5 +74,4 @@ end test do |proc, container| proc.call(container) end - - +end diff --git a/Examples/test-suite/ruby/li_std_wstring_runme.rb b/Examples/test-suite/ruby/li_std_wstring_runme.rb index 4922d8d90..170f80ebf 100644 --- a/Examples/test-suite/ruby/li_std_wstring_runme.rb +++ b/Examples/test-suite/ruby/li_std_wstring_runme.rb @@ -50,3 +50,10 @@ x = "abc\0def" swig_assert_equal("Li_std_wstring.test_value(x)", "x", binding) swig_assert_equal("Li_std_wstring.test_ccvalue(x)", '"abc"', binding) swig_assert_equal("Li_std_wstring.test_wchar_overload(x)", '"abc"', binding) + +ts = Li_std_wstring::Wchar_test_struct.new +ts.wchar_t_member = h +swig_assert_equal("ts.wchar_t_member", "h", binding) +ts.wchar_t_ptr_member = s +swig_assert_equal("ts.wchar_t_ptr_member", "s", binding) + diff --git a/Examples/test-suite/ruby/multiple_inheritance_abstract_runme.rb b/Examples/test-suite/ruby/multiple_inheritance_abstract_runme.rb new file mode 100644 index 000000000..01e9e6e4e --- /dev/null +++ b/Examples/test-suite/ruby/multiple_inheritance_abstract_runme.rb @@ -0,0 +1,243 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'swig_assert' +require 'multiple_inheritance_abstract' + +# Test base class as a parameter in Ruby + +def jcbase1b(cb1) + cb1.cbase1y +end + +def jabase1(ab1) + ab1.abase1 +end + +def jcbase2(cb2) + cb2.cbase2 +end + +# test Derived1 +d1 = Multiple_inheritance_abstract::Derived1.new +swig_assert_equal('d1.cbase1y', '3', binding, 'Derived1::cbase1y() failed') +swig_assert_equal('d1.cbase2', '4', binding, 'Derived1::cbase2() failed') + +# test Derived2 +d2 = Multiple_inheritance_abstract::Derived2.new +swig_assert_equal('d2.cbase1y', '6', binding, 'Derived2::cbase1y() failed') +swig_assert_equal('d2.abase1', '5', binding, 'Derived2::cbase1y() failed') + +# test Derived3 +d3 = Multiple_inheritance_abstract::Derived3.new +swig_assert_equal('d3.cbase1y', '7', binding, 'Derived3::cbase1y() failed') +swig_assert_equal('d3.cbase2', '8', binding, 'Derived3::cbase2() failed') +swig_assert_equal('d3.abase1', '9', binding, 'Derived3::abase1() failed') + +# test Bottom1 +b1 = Multiple_inheritance_abstract::Bottom1.new +swig_assert_equal('b1.cbase1y', '103', binding, 'Bottom1::cbase1y() failed') +swig_assert_equal('b1.cbase2', '104', binding, 'Bottom1::cbase2() failed') + +# test Bottom2 +b2 = Multiple_inheritance_abstract::Bottom2.new +swig_assert_equal('b2.cbase1y', '206', binding, 'Bottom2::cbase1y() failed') +swig_assert_equal('b2.abase1', '205', binding, 'Bottom2::abase1() failed') + +# test Bottom3 +b3 = Multiple_inheritance_abstract::Bottom3.new +swig_assert_equal('b3.cbase1y', '307', binding, 'Bottom3::cbase1y() failed') +swig_assert_equal('b3.cbase2', '308', binding, 'Bottom3::cbase2() failed') +swig_assert_equal('b3.abase1', '309', binding, 'Bottom3::abase1() failed') + +# test interfaces from C++ classes +cb1 = Multiple_inheritance_abstract::CBase1.new +cb2 = Multiple_inheritance_abstract::CBase2.new +swig_assert_equal('cb1.cbase1y', '1', binding, 'CBase1::cbase1y() failed') +swig_assert_equal('cb2.cbase2', '2', binding, 'CBase2::cbase2() failed') + +# test nspace class as return value +ab1 = d3.cloneit +swig_assert_equal('ab1.abase1', '9', binding, 'Derived3::abase1() through ABase1 failed') + +# test concrete base class as return value +cb6 = d2.cloneit +cb7 = d1.cloneit +swig_assert_equal('cb6.cbase1y', '6', binding, 'Derived2::cbase1y() through CBase1 failed') +swig_assert_equal('cb7.cbase2', '4', binding, 'Derived1:cbase2() through ABase1 failed') + +# test multi inheritance +cb3 = Multiple_inheritance_abstract::Derived1.new +cb4 = Multiple_inheritance_abstract::Derived3.new +cb5 = Multiple_inheritance_abstract::Derived3.new +ab6 = Multiple_inheritance_abstract::Derived2.new +swig_assert_equal('cb3.cbase1y', '3', binding, 'Derived1::cbase1y() through CBase1 failed') +swig_assert_equal('cb4.cbase1y', '7', binding, 'Derived3::cbase1y() through CBase1 failed') +swig_assert_equal('cb5.cbase2', '8', binding, 'Derived3::cbase2() through CBase2 failed') +swig_assert_equal('ab6.abase1', '5', binding, 'Derived2::abase1() through ABase1 failed') + +# test base classes as parameter in Ruby +swig_assert_equal('jcbase1b(d1)', '3', binding, 'jcbase1b() through Derived1 as parameter failed') +swig_assert_equal('jcbase1b(d2)', '6', binding, 'jcbase1b() through Derived2 as parameter failed') +swig_assert_equal('jcbase1b(d3)', '7', binding, 'jcbase1b() through Derived3 as parameter failed') +swig_assert_equal('jcbase2(d1)', '4', binding, 'jcbase2() through Derived1 as parameter failed') +swig_assert_equal('jcbase2(d3)', '8', binding, 'jcbase2() through Derived3 as parameter failed') +swig_assert_equal('jabase1(d2)', '5', binding, 'jabase1() through Derived2 as parameter failed') +swig_assert_equal('jabase1(d3)', '9', binding, 'jabase1() through Derived3 as parameter failed') + +# value parameters +# test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase1(d1)', '1', binding, 'InputValCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase1(d2)', '1', binding, 'InputValCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase1(d3)', '1', binding, 'InputValCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase2(d3)', '2', binding, 'InputValCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase2(d1)', '2', binding, 'InputValCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase1(cb1)', '1', binding, 'InputValCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase2(cb2)', '2', binding, 'InputValCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase1(b1)', '1', binding, 'InputValCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase1(b2)', '1', binding, 'InputValCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase1(b3)', '1', binding, 'InputValCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase2(b3)', '2', binding, 'InputValCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValCBase2(b1)', '2', binding, 'InputValCBase2(), Bottom1 as a parameter failed') + +# pointer parameters +# test ABase1 as a parameter +swig_assert_equal('Multiple_inheritance_abstract::InputPtrABase1(d2)', '5', binding, 'InputPtrABase1() through Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrABase1(d3)', '9', binding, 'InputPtrABase1() through Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrABase1(b2)', '205', binding, 'InputPtrABase1() through Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrABase1(b3)', '309', binding, 'InputPtrABase1() through Bottom3 as a parameter failed') + +# test CBase1 CBase2 as parameters +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase1(d1)', '3', binding, 'InputPtrCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase1(d2)', '6', binding, 'InputPtrCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase1(d3)', '7', binding, 'InputPtrCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase2(d3)', '8', binding, 'InputPtrCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase2(d1)', '4', binding, 'InputPtrCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase1(cb1)', '1', binding, 'InputPtrCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase2(cb2)', '2', binding, 'InputPtrCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase1(b1)', '103', binding, 'InputPtrCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase1(b2)', '206', binding, 'InputPtrCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase1(b3)', '307', binding, 'InputPtrCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase2(b3)', '308', binding, 'InputPtrCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrCBase2(b1)', '104', binding, 'InputPtrCBase2(), Bottom1 as a parameter failed') + +# reference parameters +# test ABase1 as a parameter +swig_assert_equal('Multiple_inheritance_abstract::InputRefABase1(d2)', '5', binding, 'InputRefABase1() through Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefABase1(d3)', '9', binding, 'InputRefABase1() through Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefABase1(b2)', '205', binding, 'InputRefABase1() through Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefABase1(b3)', '309', binding, 'InputRefABase1() through Bottom3 as a parameter failed') + +# test CBase1 CBase2 as parameters +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase1(d1)', '3', binding, 'InputRefCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase1(d2)', '6', binding, 'InputRefCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase1(d3)', '7', binding, 'InputRefCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase2(d3)', '8', binding, 'InputRefCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase2(d1)', '4', binding, 'InputRefCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase1(cb1)', '1', binding, 'InputRefCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase2(cb2)', '2', binding, 'InputRefCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase1(b1)', '103', binding, 'InputRefCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase1(b2)', '206', binding, 'InputRefCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase1(b3)', '307', binding, 'InputRefCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase2(b3)', '308', binding, 'InputRefCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefCBase2(b1)', '104', binding, 'InputRefCBase2(), Bottom1 as a parameter failed') + +# const reference pointer parameters +# test ABase1 as a parameter +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefABase1(d2)', '5', binding, 'InputCPtrRefABase1() through Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefABase1(d3)', '9', binding, 'InputCPtrRefABase1() through Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefABase1(b2)', '205', binding, 'InputCPtrRefABase1() through Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefABase1(b3)', '309', binding, 'InputCPtrRefABase1() through Bottom3 as a parameter failed') + +# test CBase1 CBase2 as parameters +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase1(d1)', '3', binding, 'InputCPtrRefCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase1(d2)', '6', binding, 'InputCPtrRefCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase1(d3)', '7', binding, 'InputCPtrRefCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase2(d3)', '8', binding, 'InputCPtrRefCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase2(d1)', '4', binding, 'InputCPtrRefCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase1(cb1)', '1', binding, 'InputCPtrRefCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase2(cb2)', '2', binding, 'InputCPtrRefCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase1(b1)', '103', binding, 'InputCPtrRefCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase1(b2)', '206', binding, 'InputCPtrRefCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase1(b3)', '307', binding, 'InputCPtrRefCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase2(b3)', '308', binding, 'InputCPtrRefCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefCBase2(b1)', '104', binding, 'InputCPtrRefCBase2(), Bottom1 as a parameter failed') + +# derived classes as parameters +swig_assert_equal('Multiple_inheritance_abstract::InputValDerived1(d1)', '3+4', binding, 'InputValDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValDerived2(d2)', '6+5', binding, 'InputValDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValDerived3(d3)', '7+8+9', binding, 'InputValDerived3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputRefDerived1(d1)', '3+4', binding, 'InputRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefDerived2(d2)', '6+5', binding, 'InputRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefDerived3(d3)', '7+8+9', binding, 'InputRefDerived3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputPtrDerived1(d1)', '3+4', binding, 'InputPtrDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrDerived2(d2)', '6+5', binding, 'InputPtrDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrDerived3(d3)', '7+8+9', binding, 'InputPtrDerived3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefDerived1(d1)', '3+4', binding, 'InputCPtrRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefDerived2(d2)', '6+5', binding, 'InputCPtrRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefDerived3(d3)', '7+8+9', binding, 'InputCPtrRefDerived3() failed') + +# bottom classes as Derived parameters +swig_assert_equal('Multiple_inheritance_abstract::InputValDerived1(b1)', '3+4', binding, 'InputValDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValDerived2(b2)', '6+5', binding, 'InputValDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValDerived3(b3)', '7+8+9', binding, 'InputValDerived3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputRefDerived1(b1)', '103+104', binding, 'InputRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefDerived2(b2)', '206+205', binding, 'InputRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefDerived3(b3)', '307+308+309', binding, 'InputRefDerived3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputPtrDerived1(b1)', '103+104', binding, 'InputPtrDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrDerived2(b2)', '206+205', binding, 'InputPtrDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrDerived3(b3)', '307+308+309', binding, 'InputPtrDerived3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefDerived1(b1)', '103+104', binding, 'InputCPtrRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefDerived2(b2)', '206+205', binding, 'InputCPtrRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefDerived3(b3)', '307+308+309', binding, 'InputCPtrRefDerived3() failed') + +# bottom classes as Bottom parameters +swig_assert_equal('Multiple_inheritance_abstract::InputValBottom1(b1)', '103+104', binding, 'InputValBottom1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValBottom2(b2)', '206+205', binding, 'InputValBottom2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputValBottom3(b3)', '307+308+309', binding, 'InputValBottom3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputRefBottom1(b1)', '103+104', binding, 'InputRefBottom1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefBottom2(b2)', '206+205', binding, 'InputRefBottom2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputRefBottom3(b3)', '307+308+309', binding, 'InputRefBottom3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputPtrBottom1(b1)', '103+104', binding, 'InputPtrBottom1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrBottom2(b2)', '206+205', binding, 'InputPtrBottom2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputPtrBottom3(b3)', '307+308+309', binding, 'InputPtrBottom3() failed') + +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefBottom1(b1)', '103+104', binding, 'InputCPtrRefBottom1() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefBottom2(b2)', '206+205', binding, 'InputCPtrRefBottom2() failed') +swig_assert_equal('Multiple_inheritance_abstract::InputCPtrRefBottom3(b3)', '307+308+309', binding, 'InputCPtrRefBottom3() failed') + +# return pointers +swig_assert_equal('Multiple_inheritance_abstract::MakePtrDerived1_CBase1().cbase1y', '3', binding, 'MakePtrDerived1_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakePtrDerived1_CBase2().cbase2', '4', binding, 'MakePtrDerived1_CBase2 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakePtrDerived2_CBase1().cbase1y', '6', binding, 'MakePtrDerived2_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakePtrDerived2_ABase1().abase1', '5', binding, 'MakePtrDerived2_ABase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakePtrDerived3_ABase1().abase1', '9', binding, 'MakePtrDerived3_ABase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakePtrDerived3_CBase1().cbase1y', '7', binding, 'MakePtrDerived3_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakePtrDerived3_CBase2().cbase2', '8', binding, 'MakePtrDerived3_CBase2 failed') + +# return references +swig_assert_equal('Multiple_inheritance_abstract::MakeRefDerived1_CBase1().cbase1y', '3', binding, 'MakeRefDerived1_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeRefDerived1_CBase2().cbase2', '4', binding, 'MakeRefDerived1_CBase2 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeRefDerived2_CBase1().cbase1y', '6', binding, 'MakeRefDerived2_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeRefDerived2_ABase1().abase1', '5', binding, 'MakeRefDerived2_ABase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeRefDerived3_ABase1().abase1', '9', binding, 'MakeRefDerived3_ABase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeRefDerived3_CBase1().cbase1y', '7', binding, 'MakeRefDerived3_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeRefDerived3_CBase2().cbase2', '8', binding, 'MakeRefDerived3_CBase2 failed') + +# return by value (sliced objects) +swig_assert_equal('Multiple_inheritance_abstract::MakeValDerived1_CBase1().cbase1y', '1', binding, 'MakeValDerived1_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeValDerived1_CBase2().cbase2', '2', binding, 'MakeValDerived1_CBase2 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeValDerived2_CBase1().cbase1y', '1', binding, 'MakeValDerived2_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeValDerived3_CBase1().cbase1y', '1', binding, 'MakeValDerived3_CBase1 failed') +swig_assert_equal('Multiple_inheritance_abstract::MakeValDerived3_CBase2().cbase2', '2', binding, 'MakeValDerived3_CBase2 failed') + diff --git a/Examples/test-suite/ruby/multiple_inheritance_nspace_runme.rb b/Examples/test-suite/ruby/multiple_inheritance_nspace_runme.rb new file mode 100644 index 000000000..fb28a0f83 --- /dev/null +++ b/Examples/test-suite/ruby/multiple_inheritance_nspace_runme.rb @@ -0,0 +1,243 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'swig_assert' +require 'multiple_inheritance_nspace' + +# Test base class as a parameter in Ruby + +def jcbase1b(cb1) + cb1.cbase1y +end + +def jabase1(ab1) + ab1.abase1 +end + +def jcbase2(cb2) + cb2.cbase2 +end + +# test Derived1 +d1 = Multiple_inheritance_nspace::Derived1.new +swig_assert_equal('d1.cbase1y', '3', binding, 'Derived1::cbase1y() failed') +swig_assert_equal('d1.cbase2', '4', binding, 'Derived1::cbase2() failed') + +# test Derived2 +d2 = Multiple_inheritance_nspace::Derived2.new +swig_assert_equal('d2.cbase1y', '6', binding, 'Derived2::cbase1y() failed') +swig_assert_equal('d2.abase1', '5', binding, 'Derived2::cbase1y() failed') + +# test Derived3 +d3 = Multiple_inheritance_nspace::Derived3.new +swig_assert_equal('d3.cbase1y', '7', binding, 'Derived3::cbase1y() failed') +swig_assert_equal('d3.cbase2', '8', binding, 'Derived3::cbase2() failed') +swig_assert_equal('d3.abase1', '9', binding, 'Derived3::abase1() failed') + +# test Bottom1 +b1 = Multiple_inheritance_nspace::Bottom1.new +swig_assert_equal('b1.cbase1y', '103', binding, 'Bottom1::cbase1y() failed') +swig_assert_equal('b1.cbase2', '104', binding, 'Bottom1::cbase2() failed') + +# test Bottom2 +b2 = Multiple_inheritance_nspace::Bottom2.new +swig_assert_equal('b2.cbase1y', '206', binding, 'Bottom2::cbase1y() failed') +swig_assert_equal('b2.abase1', '205', binding, 'Bottom2::abase1() failed') + +# test Bottom3 +b3 = Multiple_inheritance_nspace::Bottom3.new +swig_assert_equal('b3.cbase1y', '307', binding, 'Bottom3::cbase1y() failed') +swig_assert_equal('b3.cbase2', '308', binding, 'Bottom3::cbase2() failed') +swig_assert_equal('b3.abase1', '309', binding, 'Bottom3::abase1() failed') + +# test interfaces from C++ classes +cb1 = Multiple_inheritance_nspace::CBase1.new +cb2 = Multiple_inheritance_nspace::CBase2.new +swig_assert_equal('cb1.cbase1y', '1', binding, 'CBase1::cbase1y() failed') +swig_assert_equal('cb2.cbase2', '2', binding, 'CBase2::cbase2() failed') + +# test nspace class as return value +ab1 = d3.cloneit +swig_assert_equal('ab1.abase1', '9', binding, 'Derived3::abase1() through ABase1 failed') + +# test concrete base class as return value +cb6 = d2.cloneit +cb7 = d1.cloneit +swig_assert_equal('cb6.cbase1y', '6', binding, 'Derived2::cbase1y() through CBase1 failed') +swig_assert_equal('cb7.cbase2', '4', binding, 'Derived1:cbase2() through ABase1 failed') + +# test multi inheritance +cb3 = Multiple_inheritance_nspace::Derived1.new +cb4 = Multiple_inheritance_nspace::Derived3.new +cb5 = Multiple_inheritance_nspace::Derived3.new +ab6 = Multiple_inheritance_nspace::Derived2.new +swig_assert_equal('cb3.cbase1y', '3', binding, 'Derived1::cbase1y() through CBase1 failed') +swig_assert_equal('cb4.cbase1y', '7', binding, 'Derived3::cbase1y() through CBase1 failed') +swig_assert_equal('cb5.cbase2', '8', binding, 'Derived3::cbase2() through CBase2 failed') +swig_assert_equal('ab6.abase1', '5', binding, 'Derived2::abase1() through ABase1 failed') + +# test base classes as parameter in Ruby +swig_assert_equal('jcbase1b(d1)', '3', binding, 'jcbase1b() through Derived1 as parameter failed') +swig_assert_equal('jcbase1b(d2)', '6', binding, 'jcbase1b() through Derived2 as parameter failed') +swig_assert_equal('jcbase1b(d3)', '7', binding, 'jcbase1b() through Derived3 as parameter failed') +swig_assert_equal('jcbase2(d1)', '4', binding, 'jcbase2() through Derived1 as parameter failed') +swig_assert_equal('jcbase2(d3)', '8', binding, 'jcbase2() through Derived3 as parameter failed') +swig_assert_equal('jabase1(d2)', '5', binding, 'jabase1() through Derived2 as parameter failed') +swig_assert_equal('jabase1(d3)', '9', binding, 'jabase1() through Derived3 as parameter failed') + +# value parameters +# test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase1(d1)', '1', binding, 'InputValCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase1(d2)', '1', binding, 'InputValCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase1(d3)', '1', binding, 'InputValCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase2(d3)', '2', binding, 'InputValCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase2(d1)', '2', binding, 'InputValCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase1(cb1)', '1', binding, 'InputValCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase2(cb2)', '2', binding, 'InputValCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase1(b1)', '1', binding, 'InputValCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase1(b2)', '1', binding, 'InputValCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase1(b3)', '1', binding, 'InputValCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase2(b3)', '2', binding, 'InputValCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValCBase2(b1)', '2', binding, 'InputValCBase2(), Bottom1 as a parameter failed') + +# pointer parameters +# test ABase1 as a parameter +swig_assert_equal('Multiple_inheritance_nspace::InputPtrABase1(d2)', '5', binding, 'InputPtrABase1() through Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrABase1(d3)', '9', binding, 'InputPtrABase1() through Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrABase1(b2)', '205', binding, 'InputPtrABase1() through Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrABase1(b3)', '309', binding, 'InputPtrABase1() through Bottom3 as a parameter failed') + +# test CBase1 CBase2 as parameters +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase1(d1)', '3', binding, 'InputPtrCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase1(d2)', '6', binding, 'InputPtrCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase1(d3)', '7', binding, 'InputPtrCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase2(d3)', '8', binding, 'InputPtrCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase2(d1)', '4', binding, 'InputPtrCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase1(cb1)', '1', binding, 'InputPtrCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase2(cb2)', '2', binding, 'InputPtrCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase1(b1)', '103', binding, 'InputPtrCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase1(b2)', '206', binding, 'InputPtrCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase1(b3)', '307', binding, 'InputPtrCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase2(b3)', '308', binding, 'InputPtrCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrCBase2(b1)', '104', binding, 'InputPtrCBase2(), Bottom1 as a parameter failed') + +# reference parameters +# test ABase1 as a parameter +swig_assert_equal('Multiple_inheritance_nspace::InputRefABase1(d2)', '5', binding, 'InputRefABase1() through Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefABase1(d3)', '9', binding, 'InputRefABase1() through Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefABase1(b2)', '205', binding, 'InputRefABase1() through Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefABase1(b3)', '309', binding, 'InputRefABase1() through Bottom3 as a parameter failed') + +# test CBase1 CBase2 as parameters +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase1(d1)', '3', binding, 'InputRefCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase1(d2)', '6', binding, 'InputRefCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase1(d3)', '7', binding, 'InputRefCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase2(d3)', '8', binding, 'InputRefCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase2(d1)', '4', binding, 'InputRefCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase1(cb1)', '1', binding, 'InputRefCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase2(cb2)', '2', binding, 'InputRefCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase1(b1)', '103', binding, 'InputRefCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase1(b2)', '206', binding, 'InputRefCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase1(b3)', '307', binding, 'InputRefCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase2(b3)', '308', binding, 'InputRefCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefCBase2(b1)', '104', binding, 'InputRefCBase2(), Bottom1 as a parameter failed') + +# const reference pointer parameters +# test ABase1 as a parameter +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefABase1(d2)', '5', binding, 'InputCPtrRefABase1() through Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefABase1(d3)', '9', binding, 'InputCPtrRefABase1() through Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefABase1(b2)', '205', binding, 'InputCPtrRefABase1() through Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefABase1(b3)', '309', binding, 'InputCPtrRefABase1() through Bottom3 as a parameter failed') + +# test CBase1 CBase2 as parameters +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase1(d1)', '3', binding, 'InputCPtrRefCBase1(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase1(d2)', '6', binding, 'InputCPtrRefCBase1(), Derived2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase1(d3)', '7', binding, 'InputCPtrRefCBase1(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase2(d3)', '8', binding, 'InputCPtrRefCBase2(), Derived3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase2(d1)', '4', binding, 'InputCPtrRefCBase2(), Derived1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase1(cb1)', '1', binding, 'InputCPtrRefCBase1(), CBase1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase2(cb2)', '2', binding, 'InputCPtrRefCBase2(), CBase2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase1(b1)', '103', binding, 'InputCPtrRefCBase1(), Bottom1 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase1(b2)', '206', binding, 'InputCPtrRefCBase1(), Bottom2 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase1(b3)', '307', binding, 'InputCPtrRefCBase1(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase2(b3)', '308', binding, 'InputCPtrRefCBase2(), Bottom3 as a parameter failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefCBase2(b1)', '104', binding, 'InputCPtrRefCBase2(), Bottom1 as a parameter failed') + +# derived classes as parameters +swig_assert_equal('Multiple_inheritance_nspace::InputValDerived1(d1)', '3+4', binding, 'InputValDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValDerived2(d2)', '6+5', binding, 'InputValDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValDerived3(d3)', '7+8+9', binding, 'InputValDerived3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputRefDerived1(d1)', '3+4', binding, 'InputRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefDerived2(d2)', '6+5', binding, 'InputRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefDerived3(d3)', '7+8+9', binding, 'InputRefDerived3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputPtrDerived1(d1)', '3+4', binding, 'InputPtrDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrDerived2(d2)', '6+5', binding, 'InputPtrDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrDerived3(d3)', '7+8+9', binding, 'InputPtrDerived3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefDerived1(d1)', '3+4', binding, 'InputCPtrRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefDerived2(d2)', '6+5', binding, 'InputCPtrRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefDerived3(d3)', '7+8+9', binding, 'InputCPtrRefDerived3() failed') + +# bottom classes as Derived parameters +swig_assert_equal('Multiple_inheritance_nspace::InputValDerived1(b1)', '3+4', binding, 'InputValDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValDerived2(b2)', '6+5', binding, 'InputValDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValDerived3(b3)', '7+8+9', binding, 'InputValDerived3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputRefDerived1(b1)', '103+104', binding, 'InputRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefDerived2(b2)', '206+205', binding, 'InputRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefDerived3(b3)', '307+308+309', binding, 'InputRefDerived3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputPtrDerived1(b1)', '103+104', binding, 'InputPtrDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrDerived2(b2)', '206+205', binding, 'InputPtrDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrDerived3(b3)', '307+308+309', binding, 'InputPtrDerived3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefDerived1(b1)', '103+104', binding, 'InputCPtrRefDerived1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefDerived2(b2)', '206+205', binding, 'InputCPtrRefDerived2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefDerived3(b3)', '307+308+309', binding, 'InputCPtrRefDerived3() failed') + +# bottom classes as Bottom parameters +swig_assert_equal('Multiple_inheritance_nspace::InputValBottom1(b1)', '103+104', binding, 'InputValBottom1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValBottom2(b2)', '206+205', binding, 'InputValBottom2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputValBottom3(b3)', '307+308+309', binding, 'InputValBottom3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputRefBottom1(b1)', '103+104', binding, 'InputRefBottom1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefBottom2(b2)', '206+205', binding, 'InputRefBottom2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputRefBottom3(b3)', '307+308+309', binding, 'InputRefBottom3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputPtrBottom1(b1)', '103+104', binding, 'InputPtrBottom1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrBottom2(b2)', '206+205', binding, 'InputPtrBottom2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputPtrBottom3(b3)', '307+308+309', binding, 'InputPtrBottom3() failed') + +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefBottom1(b1)', '103+104', binding, 'InputCPtrRefBottom1() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefBottom2(b2)', '206+205', binding, 'InputCPtrRefBottom2() failed') +swig_assert_equal('Multiple_inheritance_nspace::InputCPtrRefBottom3(b3)', '307+308+309', binding, 'InputCPtrRefBottom3() failed') + +# return pointers +swig_assert_equal('Multiple_inheritance_nspace::MakePtrDerived1_CBase1().cbase1y', '3', binding, 'MakePtrDerived1_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakePtrDerived1_CBase2().cbase2', '4', binding, 'MakePtrDerived1_CBase2 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakePtrDerived2_CBase1().cbase1y', '6', binding, 'MakePtrDerived2_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakePtrDerived2_ABase1().abase1', '5', binding, 'MakePtrDerived2_ABase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakePtrDerived3_ABase1().abase1', '9', binding, 'MakePtrDerived3_ABase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakePtrDerived3_CBase1().cbase1y', '7', binding, 'MakePtrDerived3_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakePtrDerived3_CBase2().cbase2', '8', binding, 'MakePtrDerived3_CBase2 failed') + +# return references +swig_assert_equal('Multiple_inheritance_nspace::MakeRefDerived1_CBase1().cbase1y', '3', binding, 'MakeRefDerived1_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeRefDerived1_CBase2().cbase2', '4', binding, 'MakeRefDerived1_CBase2 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeRefDerived2_CBase1().cbase1y', '6', binding, 'MakeRefDerived2_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeRefDerived2_ABase1().abase1', '5', binding, 'MakeRefDerived2_ABase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeRefDerived3_ABase1().abase1', '9', binding, 'MakeRefDerived3_ABase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeRefDerived3_CBase1().cbase1y', '7', binding, 'MakeRefDerived3_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeRefDerived3_CBase2().cbase2', '8', binding, 'MakeRefDerived3_CBase2 failed') + +# return by value (sliced objects) +swig_assert_equal('Multiple_inheritance_nspace::MakeValDerived1_CBase1().cbase1y', '1', binding, 'MakeValDerived1_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeValDerived1_CBase2().cbase2', '2', binding, 'MakeValDerived1_CBase2 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeValDerived2_CBase1().cbase1y', '1', binding, 'MakeValDerived2_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeValDerived3_CBase1().cbase1y', '1', binding, 'MakeValDerived3_CBase1 failed') +swig_assert_equal('Multiple_inheritance_nspace::MakeValDerived3_CBase2().cbase2', '2', binding, 'MakeValDerived3_CBase2 failed') + diff --git a/Examples/test-suite/ruby/namespace_chase_runme.rb b/Examples/test-suite/ruby/namespace_chase_runme.rb new file mode 100644 index 000000000..c5f227dfd --- /dev/null +++ b/Examples/test-suite/ruby/namespace_chase_runme.rb @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'swig_assert' +require 'namespace_chase' + +s1a = Namespace_chase::Struct1A.new +s1b = Namespace_chase::Struct1B.new +s1c = Namespace_chase::Struct1C.new + +Namespace_chase.sss3a(s1a, s1b, s1c) +Namespace_chase.sss3b(s1a, s1b, s1c) diff --git a/Examples/test-suite/ruby/namespace_class_runme.rb b/Examples/test-suite/ruby/namespace_class_runme.rb new file mode 100644 index 000000000..fd9345814 --- /dev/null +++ b/Examples/test-suite/ruby/namespace_class_runme.rb @@ -0,0 +1,40 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'swig_assert' +require 'namespace_class' + +begin + p = Namespace_class::Private1.new + raise SwigRubyError.new("Private1 is private") +rescue NameError => e + # OK +end + +begin + p = Namespace_class::Private2.new + raise SwigRubyError.new("Private2 is private") +rescue NameError => e + # OK +end + +Namespace_class::EulerT3D.toFrame(1, 1, 1) + +b = Namespace_class::BooT_i.new +b = Namespace_class::BooT_H.new + + +f = Namespace_class::FooT_i.new +f.quack(1) + +f = Namespace_class::FooT_d.new +f.moo(1) + +f = Namespace_class::FooT_H.new +f.foo(Namespace_class::Hi) + +f_type = f.class.to_s +swig_assert_equal('f_type', '"Namespace_class::FooT_H"', binding) + diff --git a/Examples/test-suite/ruby/namespace_forward_declaration_runme.rb b/Examples/test-suite/ruby/namespace_forward_declaration_runme.rb new file mode 100644 index 000000000..0e6b50eb8 --- /dev/null +++ b/Examples/test-suite/ruby/namespace_forward_declaration_runme.rb @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'swig_assert' +require 'namespace_forward_declaration' + +xxx = Namespace_forward_declaration::XXX.new +Namespace_forward_declaration.testXXX1(xxx) +Namespace_forward_declaration.testXXX2(xxx) +Namespace_forward_declaration.testXXX3(xxx) +yyy = Namespace_forward_declaration::YYY.new +Namespace_forward_declaration.testYYY1(yyy) +Namespace_forward_declaration.testYYY2(yyy) +Namespace_forward_declaration.testYYY3(yyy) diff --git a/Examples/test-suite/ruby/namespace_virtual_method_runme.rb b/Examples/test-suite/ruby/namespace_virtual_method_runme.rb new file mode 100644 index 000000000..54e4a7a21 --- /dev/null +++ b/Examples/test-suite/ruby/namespace_virtual_method_runme.rb @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'namespace_virtual_method' + +x = Namespace_virtual_method::Spam.new diff --git a/Examples/test-suite/ruby/nested_class_runme.rb b/Examples/test-suite/ruby/nested_class_runme.rb new file mode 100644 index 000000000..2cf3bf96a --- /dev/null +++ b/Examples/test-suite/ruby/nested_class_runme.rb @@ -0,0 +1,54 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'swig_assert' +require 'nested_class' + +outer = Nested_class::Outer.new +is1 = outer.makeInnerStruct1 +ic1 = outer.makeInnerClass1 +iu1 = outer.makeInnerUnion1 + +is2 = outer.makeInnerStruct2 +ic2 = outer.makeInnerClass2 +iu2 = outer.makeInnerUnion2 + +ic4 = outer.makeInnerClass4Typedef +is4 = outer.makeInnerStruct4Typedef +iu4 = outer.makeInnerUnion4Typedef + +ic5 = outer.makeInnerClass5 +is5 = outer.makeInnerStruct5 +iu5 = outer.makeInnerUnion5 + +ic5 = outer.makeInnerClass5Typedef +is5 = outer.makeInnerStruct5Typedef +iu5 = outer.makeInnerUnion5Typedef + +im1 = outer.MultipleInstance1 +im2 = outer.MultipleInstance2 +im3 = outer.MultipleInstance3 +im4 = outer.MultipleInstance4 + +im1 = outer.MultipleDerivedInstance1 +im2 = outer.MultipleDerivedInstance2 +im3 = outer.MultipleDerivedInstance3 +im4 = outer.MultipleDerivedInstance4 + +im1 = outer.MultipleDerivedInstance1 +im2 = outer.MultipleDerivedInstance2 +im3 = outer.MultipleDerivedInstance3 +im4 = outer.MultipleDerivedInstance4 + +mat1 = outer.makeInnerMultipleAnonTypedef1 +mat2 = outer.makeInnerMultipleAnonTypedef2 +mat3 = outer.makeInnerMultipleAnonTypedef3 + +mnt = outer.makeInnerMultipleNamedTypedef +mnt1 = outer.makeInnerMultipleNamedTypedef1 +mnt2 = outer.makeInnerMultipleNamedTypedef2 +mnt3 = outer.makeInnerMultipleNamedTypedef3 + +isn = outer.makeInnerSameName diff --git a/Examples/test-suite/ruby/nested_directors_runme.rb b/Examples/test-suite/ruby/nested_directors_runme.rb new file mode 100644 index 000000000..b2020b3d4 --- /dev/null +++ b/Examples/test-suite/ruby/nested_directors_runme.rb @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its C# counterpart. +# + +require 'swig_assert' +require 'nested_directors' + +# nested classes not yet supported +#class CNested < Nested_directors::Base::Nest +# def GetValue +# true +# end +#end + +class CSub < Nested_directors::Sub + def GetValue + super + end + def Test + GetValue() + end +end + +#n = CNested.new +#swig_assert('n.GetValue()', binding) + +s = CSub.new +swig_assert('s.Test()', binding) diff --git a/Examples/test-suite/ruby/nested_in_template_runme.rb b/Examples/test-suite/ruby/nested_in_template_runme.rb new file mode 100644 index 000000000..4d3b721a1 --- /dev/null +++ b/Examples/test-suite/ruby/nested_in_template_runme.rb @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'swig_assert' +require 'nested_in_template' + + +cd = Nested_in_template::ConcreteDerived.new(88) +swig_assert_equal('cd.m_value', '88', binding, 'ConcreteDerived not created correctly') diff --git a/Examples/test-suite/ruby/nested_scope_flat_runme.rb b/Examples/test-suite/ruby/nested_scope_flat_runme.rb new file mode 100644 index 000000000..bd7ee7c91 --- /dev/null +++ b/Examples/test-suite/ruby/nested_scope_flat_runme.rb @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby +# +# Check the availability of expected classes and their member variables. +# + +require 'swig_assert' +require 'nested_scope_flat' + +Nested_scope_flat::Global_.new +Nested_scope_flat::Outer1.new +nested2 = Nested_scope_flat::Nested2.new +nested2.data = 42 +swig_assert_equal("nested2.data", "42", binding) +Nested_scope_flat::Klass.new + +Nested_scope_flat::Abstract_int +cannot_instantiate = false +begin + Nested_scope_flat::Abstract_int.new +rescue TypeError + cannot_instantiate = true +end +swig_assert_simple(cannot_instantiate) + +Nested_scope_flat::Real.new.Method() diff --git a/Examples/test-suite/ruby/nested_template_base_runme.rb b/Examples/test-suite/ruby/nested_template_base_runme.rb new file mode 100644 index 000000000..a4f293365 --- /dev/null +++ b/Examples/test-suite/ruby/nested_template_base_runme.rb @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'swig_assert' +require 'nested_template_base' + +ois = Nested_template_base::InnerS.new(123) +oic = Nested_template_base::InnerC.new + +# Check base method is available +swig_assert_equal('oic.outer(ois).val', '123', binding, 'Wrong value calling outer') + +# Check non-derived class using base class +swig_assert_equal('oic.innerc().outer(ois).val', '123', binding, 'Wrong value calling innerc') diff --git a/Examples/test-suite/ruby/nested_workaround_runme.rb b/Examples/test-suite/ruby/nested_workaround_runme.rb new file mode 100644 index 000000000..645bdd321 --- /dev/null +++ b/Examples/test-suite/ruby/nested_workaround_runme.rb @@ -0,0 +1,21 @@ +#!/usr/bin/env ruby +# +# This test implementation is derived from its Java counterpart. +# + +require 'swig_assert' +require 'nested_workaround' + +begin + inner = Nested_workaround::Inner.new(5) + outer = Nested_workaround::Outer.new + newInner = outer.doubleInnerValue(inner) + swig_assert_equal("newInner.getValue", "10", binding) +end + +begin + outer = Nested_workaround::Outer.new + inner = outer.createInner(3) + newInner = outer.doubleInnerValue(inner) + swig_assert_equal("outer.getInnerValue(newInner)", "6", binding) +end diff --git a/Examples/test-suite/ruby/newobject2_runme.rb b/Examples/test-suite/ruby/newobject2_runme.rb index 04129f4aa..b7ebea097 100644 --- a/Examples/test-suite/ruby/newobject2_runme.rb +++ b/Examples/test-suite/ruby/newobject2_runme.rb @@ -18,10 +18,12 @@ require 'newobject2' include Newobject2 GC.track_class = Foo +GC.disable GC.stats if $VERBOSE 100.times { foo1 = makeFoo } GC.stats if $VERBOSE swig_assert( 'fooCount == 100', nil, "but is #{fooCount}" ) +GC.enable GC.start swig_assert( 'fooCount <= 1', nil, "but is #{fooCount}" ) diff --git a/Examples/test-suite/ruby/preproc_runme.rb b/Examples/test-suite/ruby/preproc_runme.rb new file mode 100644 index 000000000..4b4a9157d --- /dev/null +++ b/Examples/test-suite/ruby/preproc_runme.rb @@ -0,0 +1,40 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'swig_assert' + +# This extension to the Warning class is intended for suppressing expected +# Ruby warning messages about invalid or redefined Ruby constants - basically +# the equivalent of %warnfilter(SWIGWARN_RUBY_WRONG_NAME) but for the moment +# the wrapper library is loaded by the Ruby interpreter. +# Note: This only works for Ruby 2.4 and later +if Object.const_defined?(:Warning) && Warning.respond_to?(:warn) + module CustomWarningFilter + def warn(*args) + msg = args[0] + if msg =~ /[Aa]lready initialized constant Preproc::A[56]/ || + msg =~ /invalid name .?__GMP_HAVE_/ + # ignore + else + super + end + end + end + Warning.extend CustomWarningFilter +end + +require 'preproc' + +swig_assert_equal('Preproc::endif', '1', binding) +swig_assert_equal('Preproc::define', '1', binding) +swig_assert_equal('Preproc::ddefined', '1', binding) + +swig_assert_equal('2 * Preproc::One', 'Preproc::Two', binding) + +swig_assert_equal('Preproc::methodX(99)', '199', binding) + +t1 = Preproc::TcxMessageTest +t2 = Preproc::TcxMessageBug + diff --git a/Examples/test-suite/ruby/ruby_global_immutable_vars_cpp_runme.rb b/Examples/test-suite/ruby/ruby_global_immutable_vars_cpp_runme.rb new file mode 100644 index 000000000..5523b59f4 --- /dev/null +++ b/Examples/test-suite/ruby/ruby_global_immutable_vars_cpp_runme.rb @@ -0,0 +1,48 @@ +#!/usr/bin/env ruby +# +# C++ version of ruby_global_immutable_vars_runme.rb. +# + +require 'swig_assert' + +require 'ruby_global_immutable_vars_cpp' + +# first check if all variables can be read +swig_assert_each_line( < e + had_exception = true +end +swig_assert(had_exception, nil, + "$global_immutable_var is writable (expected to be immutable)") + +had_exception = false +begin + $specific_immutable_var = 81 +rescue NameError => e + had_exception = true +end +swig_assert(had_exception, nil, + "$specific_immutable_var is writable (expected to be immutable)") + +swig_assert(check_values(80, 41, 82, 83, 44) == 1, nil, "Check values failed") diff --git a/Examples/test-suite/ruby/ruby_global_immutable_vars_runme.rb b/Examples/test-suite/ruby/ruby_global_immutable_vars_runme.rb new file mode 100644 index 000000000..45a8506ba --- /dev/null +++ b/Examples/test-suite/ruby/ruby_global_immutable_vars_runme.rb @@ -0,0 +1,52 @@ +#!/usr/bin/env ruby +# +# This test program is similar to global_immutable_vars_runme.rb +# with the difference that the global variables to check are also +# Ruby global variables (SWIG Ruby option "-globalmodule"). +# +# Immutable global variables shall throw a NameError exception. +# + +require 'swig_assert' + +require 'ruby_global_immutable_vars' + +# first check if all variables can be read +swig_assert_each_line( < e + had_exception = true +end +swig_assert(had_exception, nil, + "$global_immutable_var is writable (expected to be immutable)") + +had_exception = false +begin + $specific_immutable_var = 81 +rescue NameError => e + had_exception = true +end +swig_assert(had_exception, nil, + "$specific_immutable_var is writable (expected to be immutable)") + +swig_assert(check_values(80, 41, 82, 83, 44) == 1, nil, "Check values failed") diff --git a/Examples/test-suite/ruby/template_nested_flat_runme.rb b/Examples/test-suite/ruby/template_nested_flat_runme.rb new file mode 100644 index 000000000..5d0907f80 --- /dev/null +++ b/Examples/test-suite/ruby/template_nested_flat_runme.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Java counterpart. +# + +require 'swig_assert' +require 'template_nested_flat' + +Template_nested_flat::T_NormalTemplateNormalClass.new.tmethod(Template_nested_flat::NormalClass.new) +Template_nested_flat::OuterClass.new.T_OuterTMethodNormalClass(Template_nested_flat::NormalClass.new) + +tf = Template_nested_flat::TemplateFuncs.new +swig_assert_equal("tf.T_TemplateFuncs1Int(-10)", "-10", binding) +swig_assert_equal("tf.T_TemplateFuncs2Double(-12.3)", "-12.3", binding) + +tn = Template_nested_flat::T_NestedOuterTemplateDouble.new +swig_assert_equal("tn.hohum(-12.3)", "-12.3", binding) + +inner1 = Template_nested_flat::OuterClass.new.useInner1(Template_nested_flat::T_OuterClassInner1Int.new) +inner2 = Template_nested_flat::T_OuterClassInner2NormalClass.new +inner2.embeddedVar = 2 +inner22 = Template_nested_flat::OuterClass.new.useInner2Again(inner2) +inner3 = Template_nested_flat::T_OuterClassInner1Double.new diff --git a/Examples/test-suite/ruby/template_static_runme.rb b/Examples/test-suite/ruby/template_static_runme.rb new file mode 100644 index 000000000..83c40e177 --- /dev/null +++ b/Examples/test-suite/ruby/template_static_runme.rb @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby +# +# This test implementation is directly derived from its Python counterpart. +# + +require 'template_static' + +Template_static::Foo_i.test +Template_static::Foo_d.test +Template_static::Foo::test +Template_static::Foo::bar_double(1) + diff --git a/Examples/test-suite/ruby_global_immutable_vars.i b/Examples/test-suite/ruby_global_immutable_vars.i new file mode 100644 index 000000000..6f067d269 --- /dev/null +++ b/Examples/test-suite/ruby_global_immutable_vars.i @@ -0,0 +1,34 @@ +%module ruby_global_immutable_vars + +// This copy of global_immutable_vars.i shall be compiled with the +// SWIG Ruby option "-globalmodule" in order to check the code path +// for registering global methods (in contrast to module methods). + +%inline %{ + int default_mutable_var = 40; +%} + +%immutable; +%feature("immutable", "0") specific_mutable_var; + +%inline %{ + int global_immutable_var = 41; + int specific_mutable_var = 42; +%} + +%mutable; +%immutable specific_immutable_var; +%inline %{ + int global_mutable_var = 43; + int specific_immutable_var = 44; + + int check_values(int default_mutable, int global_immutable, int specific_mutable, int global_mutable, int specific_immutable) { + return + default_mutable == default_mutable_var && + global_immutable == global_immutable_var && + specific_mutable == specific_mutable_var && + global_mutable == global_mutable_var && + specific_immutable == specific_immutable_var; + } +%} + diff --git a/Examples/test-suite/ruby_global_immutable_vars_cpp.i b/Examples/test-suite/ruby_global_immutable_vars_cpp.i new file mode 100644 index 000000000..511390e20 --- /dev/null +++ b/Examples/test-suite/ruby_global_immutable_vars_cpp.i @@ -0,0 +1,32 @@ +%module ruby_global_immutable_vars_cpp + +// C++ version of ruby_global_immutable_vars.i + +%inline %{ + int default_mutable_var = 40; +%} + +%immutable; +%feature("immutable", "0") specific_mutable_var; + +%inline %{ + int global_immutable_var = 41; + int specific_mutable_var = 42; +%} + +%mutable; +%immutable specific_immutable_var; +%inline %{ + int global_mutable_var = 43; + int specific_immutable_var = 44; + + int check_values(int default_mutable, int global_immutable, int specific_mutable, int global_mutable, int specific_immutable) { + return + default_mutable == default_mutable_var && + global_immutable == global_immutable_var && + specific_mutable == specific_mutable_var && + global_mutable == global_mutable_var && + specific_immutable == specific_immutable_var; + } +%} + diff --git a/Examples/test-suite/schemerunme/li_typemaps.scm b/Examples/test-suite/schemerunme/li_typemaps.scm index 161e803bb..a24bbdaf0 100644 --- a/Examples/test-suite/schemerunme/li_typemaps.scm +++ b/Examples/test-suite/schemerunme/li_typemaps.scm @@ -24,8 +24,8 @@ ;(check "ulonglong" 6432 =) ;; The checking of inoutr-int2 and out-foo is done in the individual -;; language runme scripts, since chicken returns multiple values -;; and must be checked with call-with-values, while guile just returns a list +;; language runme scripts, since how multiple values are returned +;; differs between scheme variants. ;(call-with-values (lambda () (inoutr-int2 3 -2)) ; (lambda (a b) diff --git a/Examples/test-suite/schemerunme/li_typemaps_proxy.scm b/Examples/test-suite/schemerunme/li_typemaps_proxy.scm index f61d4fee5..07bb8556f 100644 --- a/Examples/test-suite/schemerunme/li_typemaps_proxy.scm +++ b/Examples/test-suite/schemerunme/li_typemaps_proxy.scm @@ -24,8 +24,8 @@ (check "ulonglong" 6432 =) ;; The checking of inoutr-int2 and out-foo is done in the individual -;; language runme scripts, since chicken returns multiple values -;; and must be checked with call-with-values, while guile just returns a list +;; language runme scripts, since how multiple values are returned +;; differs between scheme variants. ;(call-with-values (lambda () (inoutr-int2 3 -2)) ; (lambda (a b) diff --git a/Examples/test-suite/sizet.i b/Examples/test-suite/sizet.i index 537914155..6b70f680d 100644 --- a/Examples/test-suite/sizet.i +++ b/Examples/test-suite/sizet.i @@ -3,9 +3,7 @@ #include %} -#ifndef SWIGCHICKEN %include "std_common.i" -#endif %inline { diff --git a/Examples/test-suite/template_default.i b/Examples/test-suite/template_default.i index d771ef09e..83ffd5427 100644 --- a/Examples/test-suite/template_default.i +++ b/Examples/test-suite/template_default.i @@ -196,7 +196,6 @@ namespace ns1 { %} -#ifndef SWIGCHICKEN %include std_vector.i %{ @@ -211,6 +210,3 @@ void q(double = 0) {} %constant void (*Bf)(std::vector *p = 0) = g; %constant void (*Cf)(double = 0) = q; - - -#endif diff --git a/Examples/test-suite/template_nested.i b/Examples/test-suite/template_nested.i index 67668fb1a..941ec9e3a 100644 --- a/Examples/test-suite/template_nested.i +++ b/Examples/test-suite/template_nested.i @@ -1,11 +1,11 @@ %module template_nested -#if !defined(SWIGCSHARP) && !defined(SWIGJAVA) -%feature ("flatnested"); -#endif - // Test nested templates - that is template classes and template methods within a class. +#if !defined(SWIGCSHARP) && !defined(SWIGJAVA) +#pragma SWIG nowarn=SWIGWARN_PARSE_NAMED_NESTED_CLASS +#endif + namespace ns { template struct ForwardTemplate; } diff --git a/Examples/test-suite/template_nested_flat.i b/Examples/test-suite/template_nested_flat.i new file mode 100644 index 000000000..3c1d8bfef --- /dev/null +++ b/Examples/test-suite/template_nested_flat.i @@ -0,0 +1,7 @@ +%module template_nested_flat + +// Test nested templates ("flatnested" version of template_nested.i) + +%feature ("flatnested"); + +%include "template_nested.i" diff --git a/Examples/test-suite/template_static.i b/Examples/test-suite/template_static.i index bbca99490..dafb9ca5c 100644 --- a/Examples/test-suite/template_static.i +++ b/Examples/test-suite/template_static.i @@ -19,6 +19,7 @@ template int foo::test = 0; namespace toto { class Foo { public: + static int test; template static double bar(int i) { return 1.0; @@ -28,6 +29,7 @@ namespace toto { int i; }; } +int toto::Foo::test = 5; %} %template(bar_double) toto::Foo::bar; diff --git a/Examples/test-suite/template_template_parameters.i b/Examples/test-suite/template_template_parameters.i index 89197229e..53b18b0b0 100644 --- a/Examples/test-suite/template_template_parameters.i +++ b/Examples/test-suite/template_template_parameters.i @@ -2,6 +2,9 @@ %inline %{ + +/* part 1 */ + namespace pfc { template class t_alloc> class array_t {}; template class alloc_fast { @@ -16,7 +19,7 @@ class list_tt : public list_impl_t > { public: t_item item; -// typename t_alloc::alloc_type allotype; // SWIG can't handle this yet + typename t_alloc::alloc_type allotype; // SWIG can handle this now void xx() { typename t_alloc::alloc_type atype; // this type is the same as t_item type atype = true; @@ -29,11 +32,42 @@ void TestInstantiations() { (void) myArrayInt; (void) myListImplInt; } + +/* part 2 */ + +template +struct Container1 { + T x; +}; +template +struct Container2 { + U x; +}; +template class TemplateTemplateT> +struct TestStruct { + TemplateTemplateT x; +}; + +TestStruct TestStructContainer1Method(TestStruct ts1) { + ts1.x.x += 10; + return ts1; +} + %} +/* part 1 */ %template(ListImplFastBool) list_impl_t >; %template(ListFastBool) list_tt; %template(ListImplFastDouble) list_impl_t >; %template(ListDefaultDouble) list_tt; +%template(BoolAllocFast) pfc::alloc_fast; +%template(DoubleAllocFast) pfc::alloc_fast; + +/* part 2 */ +%template(IntContainer1) Container1; +%template(FloatContainer2) Container2; +%template(IntTestStruct) TestStruct; +%template(FloatTestStruct) TestStruct; + diff --git a/Examples/test-suite/typemap_template_parms.i b/Examples/test-suite/typemap_template_parms.i index fd0f7f51a..90231e827 100644 --- a/Examples/test-suite/typemap_template_parms.i +++ b/Examples/test-suite/typemap_template_parms.i @@ -26,3 +26,16 @@ template struct X { %} %template(Xint) X; + + +// The function name and parameter name are both 'labels' +%inline %{ +template +void labels(T labels) {} +void voido(int vooo) {} +%} + +// TODO: R has a problem with parameter names clashing with the function name +#if !defined(SWIGR) +%template(ShortLabels) labels; +#endif diff --git a/Examples/test-suite/types_directive.i b/Examples/test-suite/types_directive.i index 26cb6aeeb..530c338ae 100644 --- a/Examples/test-suite/types_directive.i +++ b/Examples/test-suite/types_directive.i @@ -19,10 +19,11 @@ struct Date { }; struct Time1 { - Time1(unsigned int year, unsigned int month, unsigned int day, unsigned int seconds) : date(year, month, day), seconds(seconds) {} + Time1(unsigned int year, unsigned int month, unsigned int day, unsigned int seconds) : padding(), date(year, month, day), seconds(seconds) {} Date &dateFromTime() { return date; } + unsigned int padding; // so that memory layout is not the same as Date Date date; unsigned int seconds; }; diff --git a/Examples/test-suite/uffi/Makefile.in b/Examples/test-suite/uffi/Makefile.in deleted file mode 100644 index 5d6dc110c..000000000 --- a/Examples/test-suite/uffi/Makefile.in +++ /dev/null @@ -1,51 +0,0 @@ -####################################################################### -# Makefile for uffi test-suite -####################################################################### - -LANGUAGE = uffi -UFFI = @UFFIBIN@ -SCRIPTSUFFIX = _runme.lisp - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -top_builddir = @top_builddir@ - -include $(srcdir)/../common.mk - -# Overridden variables here -# no C++ tests for now -CPP_TEST_CASES = -#C_TEST_CASES += - -# Custom tests - tests with additional commandline options -# none! - -# Rules for the different types of tests -%.cpptest: - $(setup) - +$(swig_and_compile_cpp) - $(run_testcase) - -%.ctest: - $(setup) - +$(swig_and_compile_c) - $(run_testcase) - -%.multicpptest: - $(setup) - +$(swig_and_compile_multi_cpp) - $(run_testcase) - -# Runs the testcase. A testcase is only run if -# a file is found which has _runme.lisp appended after the testcase name. -run_testcase = \ - if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ - env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(UFFI) -batch -s $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ - fi - -# Clean: (does nothing, we dont generate extra uffi code) -%.clean: - @exit 0 - -clean: - $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' uffi_clean diff --git a/Examples/test-suite/varargs.i b/Examples/test-suite/varargs.i index dd56cb073..68c7a1714 100644 --- a/Examples/test-suite/varargs.i +++ b/Examples/test-suite/varargs.i @@ -1,17 +1,31 @@ -// Tests SWIG's *default* handling of varargs (function varargs, not preprocessor varargs). +// Tests SWIG's handling of varargs (function varargs, not preprocessor varargs). // The default behavior is to simply ignore the varargs. %module varargs +// Default handling of varargs + +%inline %{ +char *test(const char *fmt, ...) { + return (char *) fmt; +} + +struct VarargConstructor { + char *str; + VarargConstructor(const char *fmt, ...) { + str = new char[strlen(fmt) + 1]; + strcpy(str, fmt); + } +}; +%} + +// %varargs support + %varargs(int mode = 0) test_def; %varargs(int mode = 0) Foo::Foo; %varargs(int mode = 0) Foo::statictest(const char*fmt, ...); %varargs(2, int mode = 0) test_plenty(const char*fmt, ...); %inline %{ -char *test(const char *fmt, ...) { - return (char *) fmt; -} - const char *test_def(const char *fmt, ...) { return fmt; } @@ -40,5 +54,4 @@ public: const char *test_plenty(const char *fmt, ...) { return fmt; } - %} diff --git a/Lib/allegrocl/allegrocl.swg b/Lib/allegrocl/allegrocl.swg deleted file mode 100644 index 524aa7c11..000000000 --- a/Lib/allegrocl/allegrocl.swg +++ /dev/null @@ -1,615 +0,0 @@ -/* Define a C preprocessor symbol that can be used in interface files - to distinguish between the SWIG language modules. */ - -#define SWIG_ALLEGRO_CL - -#define %ffargs(...) %feature("ffargs", "1", ##__VA_ARGS__) -%ffargs(strings_convert="t"); - -/* typemaps for argument and result type conversions. */ -%typemap(lin,numinputs=1) SWIGTYPE "(cl::let (($out $in))\n $body)"; - -%typemap(lout) bool, char, unsigned char, signed char, - short, signed short, unsigned short, - int, signed int, unsigned int, - long, signed long, unsigned long, - float, double, long double, char *, void *, - enum SWIGTYPE "(cl::setq ACL_ffresult $body)"; -%typemap(lout) void "$body"; -#ifdef __cplusplus -%typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE && -%{ (cl:let* ((address $body) - (new-inst (cl:make-instance '$lclass :foreign-address address))) - (cl:when (cl:and $owner (cl:not (cl:zerop address))) - (excl:schedule-finalization new-inst #'$ldestructor)) - (cl:setq ACL_ffresult new-inst)) %} - -%typemap(lout) SWIGTYPE "(cl::let* ((address $body)\n (new-inst (cl::make-instance '$lclass :foreign-address address)))\n (cl::unless (cl::zerop address)\n (excl:schedule-finalization new-inst #'$ldestructor))\n (cl::setq ACL_ffresult new-inst))"; -#else -%typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE -%{ (cl:let* ((address $body) - (new-inst (cl:make-instance '$lclass :foreign-address address))) - (cl:setq ACL_ffresult new-inst)) %} -#endif - -%typemap(lisptype) bool, const bool "cl:boolean"; -%typemap(lisptype) char, const char "cl:character"; -%typemap(lisptype) unsigned char, const unsigned char "cl:integer"; -%typemap(lisptype) signed char, const signed char "cl:integer"; - -%typemap(ffitype) bool, const bool ":int"; -%typemap(ffitype) char, const char, - signed char, const signed char ":char"; -%typemap(ffitype) unsigned char, const unsigned char ":unsigned-char"; -%typemap(ffitype) short, const short, - signed short, const signed short ":short"; -%typemap(ffitype) unsigned short, const unsigned short ":unsigned-short"; -%typemap(ffitype) int, const int, signed int, const signed int ":int"; -%typemap(ffitype) unsigned int, const unsigned int ":unsigned-int"; -%typemap(ffitype) long, const long, signed long, const signed long ":long"; -%typemap(ffitype) unsigned long, const unsigned long ":unsigned-long"; -%typemap(ffitype) float, const float ":float"; -%typemap(ffitype) double, const double ":double"; -%typemap(ffitype) char *, const char *, signed char *, - const signed char *, signed char &, - const signed char & "(* :char)"; -%typemap(ffitype) unsigned char *, const unsigned char *, - unsigned char &, const unsigned char & "(* :unsigned-char)"; -%typemap(ffitype) short *, const short *, short &, - const short & "(* :short)"; -%typemap(ffitype) unsigned short *, const unsigned short *, - unsigned short &, const unsigned short & "(* :unsigned-short)"; -%typemap(ffitype) int *, const int *, int &, const int & "(* :int)"; -%typemap(ffitype) unsigned int *, const unsigned int *, - unsigned int &, const unsigned int & "(* :unsigned-int)"; -%typemap(ffitype) void * "(* :void)"; -%typemap(ffitype) void ":void"; -%typemap(ffitype) enum SWIGTYPE ":int"; -%typemap(ffitype) SWIGTYPE & "(* :void)"; -%typemap(ffitype) SWIGTYPE && "(* :void)"; - -/* const typemaps -idea: marshall all primitive c types to their respective lisp types -to maintain const corretness. For pointers/references, all bets -are off if you try to modify them. - -idea: add a constant-p slot to the base foreign-pointer class. For -constant pointer/references check this value when setting (around method?) -and error if a setf operation is performed on the address of this object. - -*/ - -/* -%exception %{ - try { - $action - } catch (...) { - return $null; - } -%} - -*/ - -// %typemap(throws) SWIGTYPE { -// (void)$1; -// SWIG_fail; -// } - -%typemap(ctype) bool, const bool "int"; -%typemap(ctype) char, unsigned char, signed char, - short, signed short, unsigned short, - int, signed int, unsigned int, - long, signed long, unsigned long, - float, double, long double, char *, void *, void, - enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], - SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE &&, const SWIGTYPE "$1_ltype"; -%typemap(ctype) SWIGTYPE "$&1_type"; - -%typemap(in) bool "$1 = (bool)$input;"; -%typemap(in) char, unsigned char, signed char, - short, signed short, unsigned short, - int, signed int, unsigned int, - long, signed long, unsigned long, - float, double, long double, char *, void *, void, - enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], - SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;"; -%typemap(in) SWIGTYPE "$1 = *$input;"; - -/* We don't need to do any actual C-side typechecking, but need to - use the precedence values to choose which overloaded function - interfaces to generate when conflicts arise. */ - -/* predefined precedence values - -Symbolic Name Precedence Value ------------------------------- ------------------ -SWIG_TYPECHECK_POINTER 0 -SWIG_TYPECHECK_VOIDPTR 10 -SWIG_TYPECHECK_BOOL 15 -SWIG_TYPECHECK_UINT8 20 -SWIG_TYPECHECK_INT8 25 -SWIG_TYPECHECK_UINT16 30 -SWIG_TYPECHECK_INT16 35 -SWIG_TYPECHECK_UINT32 40 -SWIG_TYPECHECK_INT32 45 -SWIG_TYPECHECK_UINT64 50 -SWIG_TYPECHECK_INT64 55 -SWIG_TYPECHECK_UINT128 60 -SWIG_TYPECHECK_INT128 65 -SWIG_TYPECHECK_INTEGER 70 -SWIG_TYPECHECK_FLOAT 80 -SWIG_TYPECHECK_DOUBLE 90 -SWIG_TYPECHECK_COMPLEX 100 -SWIG_TYPECHECK_UNICHAR 110 -SWIG_TYPECHECK_UNISTRING 120 -SWIG_TYPECHECK_CHAR 130 -SWIG_TYPECHECK_STRING 140 -SWIG_TYPECHECK_BOOL_ARRAY 1015 -SWIG_TYPECHECK_INT8_ARRAY 1025 -SWIG_TYPECHECK_INT16_ARRAY 1035 -SWIG_TYPECHECK_INT32_ARRAY 1045 -SWIG_TYPECHECK_INT64_ARRAY 1055 -SWIG_TYPECHECK_INT128_ARRAY 1065 -SWIG_TYPECHECK_FLOAT_ARRAY 1080 -SWIG_TYPECHECK_DOUBLE_ARRAY 1090 -SWIG_TYPECHECK_CHAR_ARRAY 1130 -SWIG_TYPECHECK_STRING_ARRAY 1140 -*/ - -%typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; }; -%typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; }; -%typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; }; -%typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; }; -%typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; }; -%typecheck(SWIG_TYPECHECK_INTEGER) - unsigned char, signed char, - short, signed short, unsigned short, - int, signed int, unsigned int, - long, signed long, unsigned long, - enum SWIGTYPE { $1 = 1; }; -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, - SWIGTYPE[], SWIGTYPE[ANY], - SWIGTYPE { $1 = 1; }; - -/* This maps C/C++ types to Lisp classes for overload dispatch */ - -%typemap(lispclass) bool "t"; -%typemap(lispclass) char "cl:character"; -%typemap(lispclass) unsigned char, signed char, - short, signed short, unsigned short, - int, signed int, unsigned int, - long, signed long, unsigned long, - enum SWIGTYPE "cl:integer"; -%typemap(lispclass) float "cl:single-float"; -%typemap(lispclass) double "cl:double-float"; -%typemap(lispclass) char * "cl:string"; - -%typemap(out) void ""; -%typemap(out) bool "$result = (int)$1;"; -%typemap(out) char, unsigned char, signed char, - short, signed short, unsigned short, - int, signed int, unsigned int, - long, signed long, unsigned long, - float, double, long double, char *, void *, - enum SWIGTYPE, SWIGTYPE *, - SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;"; -#ifdef __cplusplus -%typemap(out) SWIGTYPE "$result = new $1_ltype($1);"; -#else -%typemap(out) SWIGTYPE { - $result = ($&1_ltype) malloc(sizeof($1_type)); - memmove($result, &$1, sizeof($1_type)); -} -#endif - -////////////////////////////////////////////////////////////// -// UCS-2 string conversion - -// should this be SWIG_TYPECHECK_CHAR? -%typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; }; - -%typemap(in) wchar_t "$1 = $input;"; -%typemap(lin,numinputs=1) wchar_t "(cl::let (($out (cl:char-code $in)))\n $body)"; -%typemap(lin,numinputs=1) wchar_t * "(excl:with-native-string ($out $in -:external-format #+little-endian :fat-le #-little-endian :fat)\n -$body)" - -%typemap(out) wchar_t "$result = $1;"; -%typemap(lout) wchar_t "(cl::setq ACL_ffresult (cl::code-char $body))"; -%typemap(lout) wchar_t * "(cl::setq ACL_ffresult (excl:native-to-string $body -:external-format #+little-endian :fat-le #-little-endian :fat))"; - -%typemap(ffitype) wchar_t ":unsigned-short"; -%typemap(lisptype) wchar_t ""; -%typemap(ctype) wchar_t "wchar_t"; -%typemap(lispclass) wchar_t "cl:character"; -%typemap(lispclass) wchar_t * "cl:string"; -////////////////////////////////////////////////////////////// - -/* Array reference typemaps */ -%apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } -%apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } - -/* const pointers */ -%apply SWIGTYPE * { SWIGTYPE *const } -%apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } -%apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } - -/* name conversion for overloaded operators. */ -#ifdef __cplusplus -%rename(__add__) *::operator+; -%rename(__pos__) *::operator+(); -%rename(__pos__) *::operator+() const; - -%rename(__sub__) *::operator-; -%rename(__neg__) *::operator-() const; -%rename(__neg__) *::operator-(); - -%rename(__mul__) *::operator*; -%rename(__deref__) *::operator*(); -%rename(__deref__) *::operator*() const; - -%rename(__div__) *::operator/; -%rename(__mod__) *::operator%; -%rename(__logxor__) *::operator^; -%rename(__logand__) *::operator&; -%rename(__logior__) *::operator|; -%rename(__lognot__) *::operator~(); -%rename(__lognot__) *::operator~() const; - -%rename(__not__) *::operator!(); -%rename(__not__) *::operator!() const; - -%rename(__assign__) *::operator=; - -%rename(__add_assign__) *::operator+=; -%rename(__sub_assign__) *::operator-=; -%rename(__mul_assign__) *::operator*=; -%rename(__div_assign__) *::operator/=; -%rename(__mod_assign__) *::operator%=; -%rename(__logxor_assign__) *::operator^=; -%rename(__logand_assign__) *::operator&=; -%rename(__logior_assign__) *::operator|=; - -%rename(__lshift__) *::operator<<; -%rename(__lshift_assign__) *::operator<<=; -%rename(__rshift__) *::operator>>; -%rename(__rshift_assign__) *::operator>>=; - -%rename(__eq__) *::operator==; -%rename(__ne__) *::operator!=; -%rename(__lt__) *::operator<; -%rename(__gt__) *::operator>; -%rename(__lte__) *::operator<=; -%rename(__gte__) *::operator>=; - -%rename(__and__) *::operator&&; -%rename(__or__) *::operator||; - -%rename(__preincr__) *::operator++(); -%rename(__postincr__) *::operator++(int); -%rename(__predecr__) *::operator--(); -%rename(__postdecr__) *::operator--(int); - -%rename(__comma__) *::operator,(); -%rename(__comma__) *::operator,() const; - -%rename(__member_ref__) *::operator->; -%rename(__member_func_ref__) *::operator->*; - -%rename(__funcall__) *::operator(); -%rename(__aref__) *::operator[]; - -%rename(__bool__) *::operator bool(); -%rename(__bool__) *::operator bool() const; -#endif - -%insert("lisphead") %{ -(eval-when (:compile-toplevel :load-toplevel :execute) - - ;; avoid compiling ef-templates at runtime - (excl:find-external-format :fat) - (excl:find-external-format :fat-le) - -;;; You can define your own identifier converter if you want. -;;; Use the -identifier-converter command line argument to -;;; specify its name. - -(eval-when (:compile-toplevel :load-toplevel :execute) - (cl::defparameter *swig-export-list* nil)) - -(cl::defconstant *void* :..void..) - -;; parsers to aid in finding SWIG definitions in files. -(cl::defun scm-p1 (form) - (let* ((info (cl::second form)) - (id (car info)) - (id-args (if (eq (cl::car form) 'swig-dispatcher) - (cl::cdr info) - (cl::cddr info)))) - (cl::apply *swig-identifier-converter* id - (cl::progn (cl::when (cl::eq (cl::car form) 'swig-dispatcher) - (cl::remf id-args :arities)) - id-args)))) - -(cl::defmacro defswig1 (name (&rest args) &body body) - `(cl::progn (cl::defmacro ,name ,args - ,@body) - (excl::define-simple-parser ,name scm-p1)) ) - -(cl::defmacro defswig2 (name (&rest args) &body body) - `(cl::progn (cl::defmacro ,name ,args - ,@body) - (excl::define-simple-parser ,name second))) - -(defun read-symbol-from-string (string) - (cl::multiple-value-bind (result position) - (cl::read-from-string string nil "eof" :preserve-whitespace t) - (cl::if (cl::and (cl::symbolp result) - (cl::eql position (cl::length string))) - result - (cl::multiple-value-bind (sym) - (cl::intern string) - sym)))) - -(cl::defun full-name (id type arity class) - ; We need some kind of a hack here to handle template classes - ; and other synonym types right. We need the original name. - (let*( (sym (read-symbol-from-string - (if (eq *swig-identifier-converter* 'identifier-convert-lispify) - (string-lispify id) - id))) - (sym-class (find-class sym nil)) - (id (cond ( (not sym-class) - id ) - ( (and sym-class - (not (eq (class-name sym-class) - sym))) - (class-name sym-class) ) - ( t - id ))) ) - (cl::case type - (:getter (cl::format nil "~@[~A_~]~A" class id)) - (:constructor (cl::format nil "new_~A~@[~A~]" id arity)) - (:destructor (cl::format nil "delete_~A" id)) - (:type (cl::format nil "ff_~A" id)) - (:slot id) - (:ff-operator (cl::format nil "ffi_~A" id)) - (otherwise (cl::format nil "~@[~A_~]~A~@[~A~]" - class id arity))))) - -(cl::defun identifier-convert-null (id &key type class arity) - (cl::if (cl::eq type :setter) - `(cl::setf ,(identifier-convert-null - id :type :getter :class class :arity arity)) - (read-symbol-from-string (full-name id type arity class)))) - -(cl::defun string-lispify (str) - (cl::let ( (cname (excl::replace-regexp str "_" "-")) - (lastcase :other) - newcase char res ) - (cl::dotimes (n (cl::length cname)) - (cl::setf char (cl::schar cname n)) - (excl::if* (cl::alpha-char-p char) - then - (cl::setf newcase (cl::if (cl::upper-case-p char) :upper :lower)) - (cl::when (cl::and (cl::eq lastcase :lower) - (cl::eq newcase :upper)) - ;; case change... add a dash - (cl::push #\- res) - (cl::setf newcase :other)) - (cl::push (cl::char-downcase char) res) - (cl::setf lastcase newcase) - else - (cl::push char res) - (cl::setf lastcase :other))) - (cl::coerce (cl::nreverse res) 'string))) - -(cl::defun identifier-convert-lispify (cname &key type class arity) - (cl::assert (cl::stringp cname)) - (cl::when (cl::eq type :setter) - (cl::return-from identifier-convert-lispify - `(cl::setf ,(identifier-convert-lispify - cname :type :getter :class class :arity arity)))) - (cl::setq cname (full-name cname type arity class)) - (cl::if (cl::eq type :constant) - (cl::setf cname (cl::format nil "*~A*" cname))) - (read-symbol-from-string (string-lispify cname))) - -(cl::defun id-convert-and-export (name &rest kwargs) - (cl::multiple-value-bind (symbol package) - (cl::apply *swig-identifier-converter* name kwargs) - (cl::let ((args (cl::list (cl::if (cl::consp symbol) - (cl::cadr symbol) symbol) - (cl::or package cl::*package*)))) - (cl::apply #'cl::export args) - (cl::pushnew args *swig-export-list*)) - symbol)) - -(cl::defmacro swig-insert-id (name namespace &key (type :type) class) - `(cl::let ((cl::*package* (cl::find-package ,(package-name-for-namespace namespace)))) - (id-convert-and-export ,name :type ,type :class ,class))) - -(defswig2 swig-defconstant (string value) - (cl::let ((symbol (id-convert-and-export string :type :constant))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (cl::defconstant ,symbol ,value)))) - -(cl::defun maybe-reorder-args (funcname arglist) - ;; in the foreign setter function the new value will be the last argument - ;; in Lisp it needs to be the first - (cl::if (cl::consp funcname) - (cl::append (cl::last arglist) (cl::butlast arglist)) - arglist)) - -(cl::defun maybe-return-value (funcname arglist) - ;; setf functions should return the new value - (cl::when (cl::consp funcname) - `(,(cl::if (cl::consp (cl::car arglist)) - (cl::caar arglist) - (cl::car arglist))))) - -(cl::defun swig-anyvarargs-p (arglist) - (cl::member :SWIG__varargs_ arglist)) - -(defswig1 swig-defun ((name &optional (mangled-name name) - &key (type :operator) class arity) - arglist kwargs - &body body) - (cl::let* ((symbol (id-convert-and-export name :type type - :arity arity :class class)) - (mangle (excl::if* (cl::string-equal name mangled-name) - then (id-convert-and-export - (cl::cond - ((cl::eq type :setter) (cl::format nil "~A-set" name)) - ((cl::eq type :getter) (cl::format nil "~A-get" name)) - (t name)) - :type :ff-operator :arity arity :class class) - else (cl::intern mangled-name))) - (defun-args (maybe-reorder-args - symbol - (cl::mapcar #'cl::car (cl::and (cl::not (cl::equal arglist '(:void))) - (cl::loop as i in arglist - when (cl::eq (cl::car i) :p+) - collect (cl::cdr i)))))) - (ffargs (cl::if (cl::equal arglist '(:void)) - arglist - (cl::mapcar #'cl::cdr arglist))) - ) - (cl::when (swig-anyvarargs-p ffargs) - (cl::setq ffargs '())) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (excl::compiler-let ((*record-xref-info* nil)) - (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) - (cl::macrolet ((swig-ff-call (&rest args) - (cl::cons ',mangle args))) - (cl::defun ,symbol ,defun-args - ,@body - ,@(maybe-return-value symbol defun-args)))))) - -(defswig1 swig-defmethod ((name &optional (mangled-name name) - &key (type :operator) class arity) - ffargs kwargs - &body body) - (cl::let* ((symbol (id-convert-and-export name :type type - :arity arity :class class)) - (mangle (cl::intern mangled-name)) - (defmethod-args (maybe-reorder-args - symbol - (cl::unless (cl::equal ffargs '(:void)) - (cl::loop for (lisparg name dispatch) in ffargs - when (eq lisparg :p+) - collect `(,name ,dispatch))))) - (ffargs (cl::if (cl::equal ffargs '(:void)) - ffargs - (cl::loop for (nil name nil . ffi) in ffargs - collect `(,name ,@ffi))))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (excl::compiler-let ((*record-xref-info* nil)) - (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) - (cl::macrolet ((swig-ff-call (&rest args) - (cl::cons ',mangle args))) - (cl::defmethod ,symbol ,defmethod-args - ,@body - ,@(maybe-return-value symbol defmethod-args)))))) - -(defswig1 swig-dispatcher ((name &key (type :operator) class arities)) - (cl::let ((symbol (id-convert-and-export name - :type type :class class))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (cl::defun ,symbol (&rest args) - (cl::case (cl::length args) - ,@(cl::loop for arity in arities - for symbol-n = (id-convert-and-export name - :type type :class class :arity arity) - collect `(,arity (cl::apply #',symbol-n args))) - (t (cl::error "No applicable wrapper-methods for foreign call ~a with args ~a of classes ~a" ',symbol args (cl::mapcar #'(cl::lambda (x) (cl::class-name (cl::class-of x))) args))) - ))))) - -(defswig2 swig-def-foreign-stub (name) - (cl::let ((lsymbol (id-convert-and-export name :type :class)) - (symbol (id-convert-and-export name :type :type))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (ff:def-foreign-type ,symbol (:class )) - (cl::defclass ,lsymbol (ff:foreign-pointer) ())))) - -(defswig2 swig-def-foreign-class (name supers &rest rest) - (cl::let ((lsymbol (id-convert-and-export name :type :class)) - (symbol (id-convert-and-export name :type :type))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (ff:def-foreign-type ,symbol ,@rest) - (cl::defclass ,lsymbol ,supers - ((foreign-type :initform ',symbol :initarg :foreign-type - :accessor foreign-pointer-type)))))) - -(defswig2 swig-def-foreign-type (name &rest rest) - (cl::let ((symbol (id-convert-and-export name :type :type))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (ff:def-foreign-type ,symbol ,@rest)))) - -(defswig2 swig-def-synonym-type (synonym of ff-synonym) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (cl::setf (cl::find-class ',synonym) (cl::find-class ',of)) - (ff:def-foreign-type ,ff-synonym (:struct )))) - -(cl::defun package-name-for-namespace (namespace) - (excl::list-to-delimited-string - (cl::cons *swig-module-name* - (cl::mapcar #'(cl::lambda (name) - (cl::string - (cl::funcall *swig-identifier-converter* - name - :type :namespace))) - namespace)) - ".")) - -(cl::defmacro swig-defpackage (namespace) - (cl::let* ((parent-namespaces (cl::maplist #'cl::reverse (cl::cdr (cl::reverse namespace)))) - (parent-strings (cl::mapcar #'package-name-for-namespace - parent-namespaces)) - (string (package-name-for-namespace namespace))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (cl::defpackage ,string - (:use :swig :ff #+ignore '(:common-lisp :ff :excl) - ,@parent-strings ,*swig-module-name*) - (:import-from :cl :* :nil :t))))) - -(cl::defmacro swig-in-package (namespace) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (cl::in-package ,(package-name-for-namespace namespace)))) - -(defswig2 swig-defvar (name mangled-name &key type (ftype :unsigned-natural)) - (cl::let ((symbol (id-convert-and-export name :type type))) - `(cl::eval-when (:compile-toplevel :load-toplevel :execute) - (ff:def-foreign-variable (,symbol ,mangled-name) :type ,ftype)))) - -) ;; eval-when - -(cl::eval-when (:compile-toplevel :execute) - (cl::flet ((starts-with-p (str prefix) - (cl::and (cl::>= (cl::length str) (cl::length prefix)) - (cl::string= str prefix :end1 (cl::length prefix))))) - (cl::export (cl::loop for sym being each present-symbol of cl::*package* - when (cl::or (starts-with-p (cl::symbol-name sym) (cl::symbol-name :swig-)) - (starts-with-p (cl::symbol-name sym) (cl::symbol-name :identifier-convert-))) - collect sym)))) - -%} - -typedef void *__SWIGACL_FwdReference; - -%{ - -#ifdef __cplusplus -# define EXTERN extern "C" -#else -# define EXTERN extern -#endif - -#define EXPORT EXTERN SWIGEXPORT - -typedef void *__SWIGACL_FwdReference; - -#include -#include -%} diff --git a/Lib/allegrocl/inout_typemaps.i b/Lib/allegrocl/inout_typemaps.i deleted file mode 100644 index d8d61feed..000000000 --- a/Lib/allegrocl/inout_typemaps.i +++ /dev/null @@ -1,111 +0,0 @@ -/* inout_typemaps.i - - Support for INPUT, OUTPUT, and INOUT typemaps. OUTPUT variables are returned - as multiple values. - -*/ - - -/* Note that this macro automatically adds a pointer to the type passed in. - As a result, INOUT typemaps for char are for 'char *'. The definition - of typemaps for 'char' takes advantage of this, believing that it's more - likely to see an INOUT argument for strings, than a single char. */ -%define INOUT_TYPEMAP(type_, OUTresult_, INbind_) -// OUTPUT map. -%typemap(lin,numinputs=0) type_ *OUTPUT, type_ &OUTPUT -%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) - $body - OUTresult_ - (ff:free-fobject $out)) %} - -// INPUT map. -%typemap(in) type_ *INPUT, type_ &INPUT -%{ $1 = &$input; %} - -%typemap(ctype) type_ *INPUT, type_ &INPUT "$*1_ltype"; - - -// INOUT map. -// careful here. the input string is converted to a C string -// with length equal to the input string. This should be large -// enough to contain whatever OUTPUT value will be stored in it. -%typemap(lin,numinputs=1) type_ *INOUT, type_ &INOUT -%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) - INbind_ - $body - OUTresult_ - (ff:free-fobject $out)) %} - -%enddef - -// $in, $out, $lclass, -// $in_fftype, $*in_fftype - -INOUT_TYPEMAP(int, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -INOUT_TYPEMAP(short, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -INOUT_TYPEMAP(long, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -INOUT_TYPEMAP(unsigned int, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -INOUT_TYPEMAP(unsigned short, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -INOUT_TYPEMAP(unsigned long, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -// char * mapping for passing strings. didn't quite work -// INOUT_TYPEMAP(char, -// (cl::push (excl:native-to-string $out) ACL_result), -// (cl::setf (ff:fslot-value-typed (cl::quote $in_fftype) :c $out) -// (excl:string-to-native $in))) -INOUT_TYPEMAP(float, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -INOUT_TYPEMAP(double, - (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); -INOUT_TYPEMAP(bool, - (cl::push (not (zerop (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out))) - ACL_result), - (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) (if $in 1 0))); - -%typemap(lisptype) bool *INPUT, bool &INPUT "boolean"; - -// long long support not yet complete -// INOUT_TYPEMAP(long long); -// INOUT_TYPEMAP(unsigned long long); - -// char *OUTPUT map. -// for this to work, swig needs to know how large an array to allocate. -// you can fake this by -// %typemap(ffitype) char *myarg "(:array :char 30)"; -// %apply char *OUTPUT { char *myarg }; -%typemap(lin,numinputs=0) char *OUTPUT, char &OUTPUT -%{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) - $body - (cl::push (excl:native-to-string $out) ACL_result) - (ff:free-fobject $out)) %} - -// char *INPUT map. -%typemap(in) char *INPUT, char &INPUT -%{ $1 = &$input; %} -%typemap(ctype) char *INPUT, char &INPUT "$*1_ltype"; - -// char *INOUT map. -%typemap(lin,numinputs=1) char *INOUT, char &INOUT -%{(cl::let (($out (excl:string-to-native $in))) - $body - (cl::push (excl:native-to-string $out) ACL_result) - (ff:free-fobject $out)) %} - -// uncomment this if you want INOUT mappings for chars instead of strings. -// INOUT_TYPEMAP(char, -// (cl::push (code-char (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out)) -// ACL_result), -// (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); diff --git a/Lib/allegrocl/longlongs.i b/Lib/allegrocl/longlongs.i deleted file mode 100644 index a15adcdda..000000000 --- a/Lib/allegrocl/longlongs.i +++ /dev/null @@ -1,49 +0,0 @@ -/* ----------------------------------------------------------------------------- - * longlongs.i - * - * Typemap addition for support of 'long long' type and 'unsigned long long - * Makes use of swig-def-foreign-class, so this header should be loaded - * after allegrocl.swg and after any custom user identifier-conversion - * functions have been defined. - * ----------------------------------------------------------------------------- */ - -#ifdef Acl64Bit -%typemap(ctype) long long, unsigned long long "$1_ltype"; -%typemap(out) long long, unsigned long long "$result = $1;"; - -%typemap(ffitype) long long ":nat"; -%typemap(ffitype) unsigned long long ":unsigned-nat"; - -%typemap(lout) long long, unsigned long long " #+64bit (cl::setq ACL_ffresult $body)"; - -#else -%typemap(out) long long, unsigned long long "$result = &$1;"; -%typemap(ffitype) long long "(:struct (l1 :long) (l2 :long))"; - -%typemap(ffitype) unsigned long long "(:struct (l1 :unsigned-long) (l2 :unsigned-long))"; - -%typemap(lout) long long -" (cl::setq ACL_ffresult (make-instance '#.(swig-insert-id \"longlong\" () :type :class) - :foreign-address $body))"; - -%typemap(lout) unsigned long long -" (cl:setq ACL_ffresult (make-instance '#.(swig-insert-id \"ulonglong\" () :type :class) - :foreign-address $body))"; - -#endif - -%typemap(in) long long, unsigned long long "$1 = $input;"; - - -%insert("lisphead") %{ - -#-64bit -(swig-def-foreign-class "longlong" - (ff:foreign-pointer) - (:struct (l1 :long) (l2 :long))) - -#-64bit -(swig-def-foreign-class "ulonglong" - (ff:foreign-pointer) - (:struct (l1 :unsigned-long) (l2 :unsigned-long))) -%} diff --git a/Lib/allegrocl/std_list.i b/Lib/allegrocl/std_list.i deleted file mode 100644 index a3660c9f7..000000000 --- a/Lib/allegrocl/std_list.i +++ /dev/null @@ -1,230 +0,0 @@ -/* ----------------------------------------------------------------------------- - * std_list.i - * - * SWIG typemaps for std::list types - * - * To use, add: - * - * %include "std_list.i" - * - * to your interface file. You will also need to include a template directive - * for each instance of the list container you want to use in your application. - * e.g. - * - * %template (intlist) std::list; - * %template (floatlist) std::list; - * ----------------------------------------------------------------------------- */ - -%module std_list -%warnfilter(468) std::list; - -%{ -#include -#include -%} - - -namespace std{ - template class list - { - public: - typedef size_t size_type; - typedef ptrdiff_t difference_type; - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef T &iterator; - typedef const T& const_iterator; - - list(); - list(unsigned int size, const T& value = T()); - list(const list& other); - - void assign(unsigned int n, const T& value); - void swap(list &x); - - const_reference front(); - const_reference back(); - const_iterator begin(); - const_iterator end(); - - void resize(unsigned int n, T c = T()); - bool empty() const; - - void push_front(const T& INPUT); - void push_back(const T& INPUT); - - void pop_front(); - void pop_back(); - void clear(); - unsigned int size() const; - unsigned int max_size() const; - void resize(unsigned int n, const T& INPUT); - - void remove(const T& INPUT); - void unique(); - void reverse(); - void sort(); - - %extend - { - %typemap(lout) T &__getitem__ "(cl::setq ACL_ffresult (ff:fslot-value-typed '$*out_fftype :c $body))"; - %typemap(lout) T *__getitem__ "(cl::setq ACL_ffresult (make-instance '$lclass :foreign-address $body))"; - - const_reference __getitem__(int i) throw (std::out_of_range) - { - std::list::iterator first = self->begin(); - int size = int(self->size()); - if (i<0) i += size; - if (i>=0 && i::iterator first = self->begin(); - int size = int(self->size()); - if (i<0) i += size; - if (i>=0 && i::iterator first = self->begin(); - int size = int(self->size()); - if (i<0) i += size; - if (i>=0 && ierase(first); - } - else throw std::out_of_range("list index out of range"); - } - std::list __getslice__(int i,int j) - { - std::list::iterator first = self->begin(); - std::list::iterator end = self->end(); - - int size = int(self->size()); - if (i<0) i += size; - if (j<0) j += size; - if (i<0) i = 0; - if (j>size) j = size; - if (i>=j) i=j; - if (i>=0 && i=0) - { - for (int k=0;k tmp(j-i); - if (j>i) std::copy(first,end,tmp.begin()); - return tmp; - } - else throw std::out_of_range("list index out of range"); - } - void __delslice__(int i,int j) - { - std::list::iterator first = self->begin(); - std::list::iterator end = self->end(); - - int size = int(self->size()); - if (i<0) i += size; - if (j<0) j += size; - if (i<0) i = 0; - if (j>size) j = size; - - for (int k=0;kerase(first,end); - } - void __setslice__(int i,int j, const std::list& v) - { - std::list::iterator first = self->begin(); - std::list::iterator end = self->end(); - - int size = int(self->size()); - if (i<0) i += size; - if (j<0) j += size; - if (i<0) i = 0; - if (j>size) j = size; - - for (int k=0;kerase(first,end); - if (i+1 <= int(self->size())) - { - first = self->begin(); - for (int k=0;kinsert(first,v.begin(),v.end()); - } - else self->insert(self->end(),v.begin(),v.end()); - } - } - unsigned int __len__() - { - return self->size(); - } - bool __nonzero__() - { - return !(self->empty()); - } - void append(const T& INPUT) - { - self->push_back(INPUT); - } - void pop() - { - self->pop_back(); - } - } - }; -} - - - - - - diff --git a/Lib/allegrocl/std_string.i b/Lib/allegrocl/std_string.i deleted file mode 100644 index cbcd250a9..000000000 --- a/Lib/allegrocl/std_string.i +++ /dev/null @@ -1,209 +0,0 @@ -/* ----------------------------------------------------------------------------- - * std_string.i - * - * SWIG typemaps for std::string - * ----------------------------------------------------------------------------- */ - -// ------------------------------------------------------------------------ -// std::string is typemapped by value -// This can prevent exporting methods which return a string -// in order for the user to modify it. -// However, I think I'll wait until someone asks for it... -// ------------------------------------------------------------------------ - -// %include -%warnfilter(404) std::string; -%warnfilter(404) std::wstring; - -%{ -#include -%} - -// %include - -// %naturalvar std::string; -// %naturalvar std::wstring; - -namespace std { - typedef unsigned long size_t; - typedef signed long ptrdiff_t; - - template class basic_string { - public: - typedef charT *pointer; - typedef charT &reference; - typedef const charT &const_reference; - typedef size_t size_type; - typedef ptrdiff_t difference_type; - basic_string(); - basic_string( charT *str ); - size_type size(); - charT operator []( int pos ) const; - charT *c_str() const; - basic_string &operator = ( const basic_string &ws ); - basic_string &operator = ( const charT *str ); - basic_string &append( const basic_string &other ); - basic_string &append( const charT *str ); - void push_back( charT c ); - void clear(); - void reserve( size_type t ); - void resize( size_type n, charT c = charT() ); - int compare( const basic_string &other ) const; - int compare( const charT *str ) const; - basic_string &insert( size_type pos, - const basic_string &str ); - size_type find( const basic_string &other, int pos = 0 ) const; - size_type find( charT c, int pos = 0 ) const; - %extend { - bool operator == ( const basic_string &other ) const { - return self->compare( other ) == 0; - } - bool operator != ( const basic_string &other ) const { - return self->compare( other ) != 0; - } - bool operator < ( const basic_string &other ) const { - return self->compare( other ) == -1; - } - bool operator > ( const basic_string &other ) const { - return self->compare( other ) == 1; - } - bool operator <= ( const basic_string &other ) const { - return self->compare( other ) != 1; - } - bool operator >= ( const basic_string &other ) const { - return self->compare( other ) != -1; - } - - } - }; - - %template(string) basic_string; - %template(wstring) basic_string; - - %apply char * { string }; - %apply wchar_t * { wstring }; - - typedef basic_string string; - typedef basic_string wstring; - - // automatically convert constant std::strings to cl:strings - %typemap(ctype) string "char *"; - %typemap(in) string "$1.assign($input);"; - %typemap(out) string "$result = (char *)(&$1)->c_str();"; - %typemap(lisptype) string "cl:string"; - %typemap(lout) string "(cl::setq ACL_ffresult $body)"; - - %typemap(ctype) const string *"char *"; - %typemap(in) const string * "$1.assign($input);"; - %typemap(out) const string * "$result = (char *)($1)->c_str();"; - %typemap(lisptype) const string * "cl:string"; - %typemap(lout) const string * "(cl::setq ACL_ffresult $body)"; - - %typemap(ctype) wstring "wchar_t *"; - %typemap(in) wstring "$1.assign($input);"; - %typemap(out) wstring "$result = (wchar_t *)(&$1)->c_str();"; - %typemap(lisptype) wstring "cl:string"; - %typemap(lout) wstring "(cl::setq ACL_ffresult (excl:native-to-string $body -:external-format #+little-endian :fat-le #-little-endian :fat))"; - - %typemap(ctype) const wstring *"char *"; - %typemap(in) const wstring * "$1.assign($input);"; - %typemap(out) const wstring * "$result = (char *)($1)->c_str();"; - %typemap(lisptype) const wstring * "cl:string"; - %typemap(lout) const wstring * "(cl::setq ACL_ffresult $body)"; - - /* Overloading check */ -// %typemap(in) string { -// if (caml_ptr_check($input)) -// $1.assign((char *)caml_ptr_val($input,0), -// caml_string_len($input)); -// else -// SWIG_exception(SWIG_TypeError, "string expected"); -// } - -// %typemap(in) const string & ($*1_ltype temp) { -// if (caml_ptr_check($input)) { -// temp.assign((char *)caml_ptr_val($input,0), -// caml_string_len($input)); -// $1 = &temp; -// } else { -// SWIG_exception(SWIG_TypeError, "string expected"); -// } -// } - -// %typemap(in) string & ($*1_ltype temp) { -// if (caml_ptr_check($input)) { -// temp.assign((char *)caml_ptr_val($input,0), -// caml_string_len($input)); -// $1 = &temp; -// } else { -// SWIG_exception(SWIG_TypeError, "string expected"); -// } -// } - -// %typemap(in) string * ($*1_ltype *temp) { -// if (caml_ptr_check($input)) { -// temp = new $*1_ltype((char *)caml_ptr_val($input,0), -// caml_string_len($input)); -// $1 = temp; -// } else { -// SWIG_exception(SWIG_TypeError, "string expected"); -// } -// } - -// %typemap(free) string * ($*1_ltype *temp) { -// delete temp; -// } - -// %typemap(argout) string & { -// caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), -// (*$1).size())); -// } - -// %typemap(directorout) string { -// $result.assign((char *)caml_ptr_val($input,0), -// caml_string_len($input)); -// } - -// %typemap(out) string { -// $result = caml_val_string_len($1.c_str(),$1.size()); -// } - -// %typemap(out) string * { -// $result = caml_val_string_len((*$1).c_str(),(*$1).size()); -// } -} - -// #ifdef ENABLE_CHARPTR_ARRAY -// char **c_charptr_array( const std::vector &str_v ); - -// %{ -// SWIGEXT char **c_charptr_array( const std::vector &str_v ) { -// char **out = new char *[str_v.size() + 1]; -// out[str_v.size()] = 0; -// for( int i = 0; i < str_v.size(); i++ ) { -// out[i] = (char *)str_v[i].c_str(); -// } -// return out; -// } -// %} -// #endif - -// #ifdef ENABLE_STRING_VECTOR -// %template (StringVector) std::vector; - -// %insert(ml) %{ -// (* Some STL convenience items *) - -// let string_array_to_vector sa = -// let nv = _new_StringVector C_void in -// array_to_vector nv (fun x -> C_string x) sa ; nv - -// let c_string_array ar = -// _c_charptr_array (string_array_to_vector ar) -// %} - -// %insert(mli) %{ -// val c_string_array: string array -> c_obj -// %} -// #endif diff --git a/Lib/allegrocl/typemaps.i b/Lib/allegrocl/typemaps.i deleted file mode 100644 index 293d1cd34..000000000 --- a/Lib/allegrocl/typemaps.i +++ /dev/null @@ -1,4 +0,0 @@ -/* Unused for Allegro CL module */ - -%include "inout_typemaps.i" -%include "longlongs.i" diff --git a/Lib/cdata.i b/Lib/cdata.i index 3e16f31ec..602c59faf 100644 --- a/Lib/cdata.i +++ b/Lib/cdata.i @@ -43,7 +43,7 @@ typedef struct SWIGCDATA { $2 = $input->len; } -#elif SWIGPHP7 +#elif SWIGPHP %typemap(out) SWIGCDATA { ZVAL_STRINGL($result, $1.data, $1.len); diff --git a/Lib/chicken/chicken.swg b/Lib/chicken/chicken.swg deleted file mode 100644 index 7df676754..000000000 --- a/Lib/chicken/chicken.swg +++ /dev/null @@ -1,809 +0,0 @@ -/* ----------------------------------------------------------------------------- - * chicken.swg - * - * CHICKEN configuration module. - * ----------------------------------------------------------------------------- */ - -/* chicken.h has to appear first. */ - -%insert(runtime) %{ -#include -#include -%} - -%insert(runtime) "swigrun.swg" // Common C API type-checking code -%insert(runtime) "swigerrors.swg" // SWIG errors -%insert(runtime) "chickenrun.swg" // CHICKEN run-time code - -/* ----------------------------------------------------------------------------- - * standard typemaps - * ----------------------------------------------------------------------------- */ - -/* - CHICKEN: C - ---------- - - fixnum: int, short, unsigned int, unsigned short, unsigned char, - signed char - - char: char - - bool: bool - - flonum: float, double, long, long long, unsigned long, unsigned long - long - */ - -/* --- Primitive types --- */ - -%define SIMPLE_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) - -%typemap(in) type_ -%{ if (!checker ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); - } - $1 = ($1_ltype) from_scheme ($input); %} - -/* Const primitive references. Passed by value */ - -%typemap(in) const type_ & ($*1_ltype temp) -%{ if (!checker ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); - } - temp = ($*1_ltype) from_scheme ($input); - $1 = &temp; %} - -/* --- Variable input --- */ -%typemap(varin) type_ -%{ if (!checker ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use '$1_ltype' for variable '$name' of type 'type_'"); - } - $1 = ($1_ltype) from_scheme ($input); %} - -#if "storage_" == "0" - -%typemap(out) type_ -%{ - $result = to_scheme (convtype ($1)); -%} - -/* References to primitive types. Return by value */ - -%typemap(out) const type_ & -%{ - $result = to_scheme (convtype (*$1)); -%} - -/* --- Variable output --- */ -%typemap(varout) type_ -%{ - $result = to_scheme (convtype ($varname)); -%} - -%typemap(throws) type_ -%{ - SWIG_Chicken_ThrowException(to_scheme ( convtype ($1))); -%} - -#else - -%typemap(out) type_ -%{ - { - C_word *space = C_alloc(storage_); - $result = to_scheme (&space, convtype ($1)); - } -%} - -/* References to primitive types. Return by value */ - -%typemap(out) const type_ & -%{ - { - C_word *space = C_alloc(storage_); - $result = to_scheme (&space, convtype (*$1)); - } -%} - -/* --- Variable output --- */ -%typemap(varout) type_ -%{ - { - C_word *space = C_alloc(storage_); - $result = to_scheme (&space, convtype ($varname)); - } -%} - -%typemap(throws) type_ -%{ - { - C_word *space = C_alloc(storage_); - SWIG_Chicken_ThrowException(to_scheme (&space, convtype ($1))); - } -%} - -#endif - -/* --- Constants --- */ - -%typemap(constcode) type_ -"static const $1_type $result = $value;" - -%enddef - -SIMPLE_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); -//SIMPLE_TYPEMAP(enum SWIGTYPE, C_unfix, C_fix, C_swig_is_fixnum, (int), 0); -SIMPLE_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); -SIMPLE_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); -SIMPLE_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); -SIMPLE_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (unsigned int), C_SIZEOF_FLONUM); -SIMPLE_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); -SIMPLE_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); -SIMPLE_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); -SIMPLE_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); -SIMPLE_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); -SIMPLE_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); -SIMPLE_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); -SIMPLE_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); -SIMPLE_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); - -/* enum SWIGTYPE */ -%apply int { enum SWIGTYPE }; -%apply const int& { const enum SWIGTYPE& }; -%apply const int& { const enum SWIGTYPE&& }; - -%typemap(varin) enum SWIGTYPE -{ - if (!C_swig_is_fixnum($input) && sizeof(int) != sizeof($1)) { - swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "enum variable '$name' can not be set"); - } - *((int *)(void *)&$1) = C_unfix($input); -} - - -/* --- Input arguments --- */ - -/* Strings */ - -%typemap(in) char * -{ if ($input == C_SCHEME_FALSE) { - $1 = NULL; - } - else { - if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'char *'"); - } - $1 = ($ltype) SWIG_MakeString ($input); - } -} - -%typemap(freearg) char * "if ($1 != NULL) { free ($1); }" - -/* Pointers, references, and arrays */ -%typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && { - $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, $disown); -} - -%typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *DISOWN { - $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, SWIG_POINTER_DISOWN); -} - -/* Void pointer. Accepts any kind of pointer */ -%typemap(in) void * { - $1 = ($1_ltype)SWIG_MustGetPtr($input, NULL, $argnum, 0); -} - -%typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE * { - $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, SWIG_POINTER_DISOWN); -} - -%typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE & { - $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); -} - -%typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE && { - $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); -} - -%typemap(varin) SWIGTYPE [] { - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "Type error"); -} - -%typemap(varin) SWIGTYPE [ANY] { - void *temp; - int ii; - $1_basetype *b = 0; - temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); - b = ($1_basetype *) $1; - for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); -} - -%typemap(varin) void * { - $1 = SWIG_MustGetPtr($input, NULL, 1, 0); -} - -%typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - $result = SWIG_NewPointerObj($1, $descriptor, $owner); -} - -%typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); - $result = SWIG_NewPointerObj($1, ty, $owner); -} - -%typemap(varout) SWIGTYPE *, SWIGTYPE [] { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - $result = SWIG_NewPointerObj($varname, $descriptor, 0); -} - -%typemap(varout) SWIGTYPE & { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); -} - -%typemap(varout) SWIGTYPE && { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); -} - -/* special typemaps for class pointers */ -%typemap(in) SWIGTYPE (CLASS::*) { - char err_msg[256]; - - if (C_swig_is_pair($input)) { - /* try and convert pointer object */ - void *result; - if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { - C_word ptr = C_block_item($input,0); - if (C_swig_is_string(ptr)) { - SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); - } else { - snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); - } - } else { - snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); - } - } else { - snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); - } -} - -%typemap(out) SWIGTYPE (CLASS::*) { - size_t ptr_size = sizeof($type); - C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); - char *temp = (char *)malloc(2*ptr_size); - C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); - - SWIG_PackData(temp, (void *) &$1, ptr_size); - $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); - free(temp); -} - -%typemap(varin) SWIGTYPE (CLASS::*) { - char err_msg[256]; - - if (C_swig_is_pair($input)) { - /* try and convert pointer object */ - void *result; - if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { - C_word ptr = C_block_item($input,0); - if (C_swig_is_string(ptr)) { - SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); - } else { - snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); - } - } else { - snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); - } - } else { - snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); - } -} - -%typemap(varout) SWIGTYPE (CLASS::*) { - size_t ptr_size = sizeof($type); - C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); - char *temp = (char *)malloc(2*ptr_size); - C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); - - SWIG_PackData(temp, (void *) &$varname, ptr_size); - $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); - free(temp); -} - - - -/* Pass-by-value */ - -%typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE($&1_ltype argp) { - argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); - $1 = *argp; -} - -%typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE { - $&1_ltype argp; - argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); - $1 = *argp; -} - -%typemap(out) SWIGTYPE -#ifdef __cplusplus -{ - $&1_ltype resultptr; - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - resultptr = new $1_ltype((const $1_ltype &) $1); - $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); -} -#else -{ - $&1_ltype resultptr; - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - resultptr = ($&1_ltype) malloc(sizeof($1_type)); - memmove(resultptr, &$1, sizeof($1_type)); - $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); -} -#endif - -%typemap(varout) SWIGTYPE -#ifdef __cplusplus -{ - $&1_ltype resultptr; - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - resultptr = new $1_ltype((const $1_ltype&) $1); - $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); -} -#else -{ - $&1_ltype resultptr; - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - resultptr = ($&1_ltype) malloc(sizeof($1_type)); - memmove(resultptr, &$1, sizeof($1_type)); - $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); -} -#endif - -/* --- Output values --- */ - -/* Strings */ - -%typemap(out) - char * -{ char *s = (char*) $1; - if ($1 == NULL) { - $result = C_SCHEME_FALSE; - } - else { - int string_len = strlen ((char *) ($1)); - C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); - $result = C_string (&string_space, string_len, s); - } -} - -%typemap(varout) - char * -{ char *s = (char*) $varname; - if ($varname == NULL) { - $result = C_SCHEME_FALSE; - } - else { - int string_len = strlen ($varname); - C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); - $result = C_string (&string_space, string_len, s); - } -} - -%typemap(throws) char * -{ - if ($1 == NULL) { - SWIG_Chicken_ThrowException(C_SCHEME_FALSE); - } else { - int string_len = strlen($1); - C_word *string_space = C_alloc(C_SIZEOF_STRING(string_len)); - SWIG_Chicken_ThrowException(C_string(&string_space, string_len, (char *) $1)); - } -} - -/* Void */ -%typemap(out) void -%{ -$result = C_SCHEME_UNDEFINED; -%} - -/* Special typemap for character array return values */ - -%typemap(out) - char [ANY], const char [ANY] -%{ if ($1 == NULL) { - $result = C_SCHEME_FALSE; - } - else { - const int string_len = strlen ($1); - C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); - $result = C_string (&string_space, string_len, $1); - } %} - -/* Primitive types--return by value */ - -/* --- Variable input --- */ - -/* A string */ -#ifdef __cplusplus -%typemap(varin) char * { - if ($input == C_SCHEME_FALSE) { - $1 = NULL; - } - else if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); - } - else { - char *temp = C_c_string ($input); - int len = C_header_size ($input); - if ($1) delete [] $1; - $1 = ($type) new char[len+1]; - strncpy((char*)$1, temp, len); - ((char*)$1) [len] = 0; - } -} -%typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { - if ($input == C_SCHEME_FALSE) { - $1 = NULL; - } - else if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); - } - else { - char *temp = C_c_string ($input); - int len = C_header_size ($input); - $1 = ($type) new char[len+1]; - strncpy((char*)$1,temp,len); - ((char*)$1) [len] = 0; - } -} -#else -%typemap(varin) char * { - if ($input == C_SCHEME_FALSE) { - $1 = NULL; - } - else if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); - } - else { - char *temp = C_c_string ($input); - int len = C_header_size ($input); - if ($1) free((char*) $1); - $1 = ($type) malloc(len+1); - strncpy((char*)$1,temp,len); - ((char*)$1) [len] = 0; - } -} -%typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { - if ($input == C_SCHEME_FALSE) { - $1 = NULL; - } - else if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); - } - else { - char *temp = C_c_string ($input); - int len = C_header_size ($input); - $1 = ($type) malloc(len+1); - strncpy((char*)$1,temp,len); - ((char*)$1) [len] = 0; - } -} -#endif - -%typemap(varin) char [] { - swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "C/C++ variable '$name' is read-only"); -} - -/* Special case for string array variables */ -%typemap(varin) char [ANY] { - if ($input == C_SCHEME_FALSE) { - memset($1,0,$1_dim0*sizeof(char)); - } - else if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); - } - else { - char *temp = C_c_string ($input); - strncpy($1,temp,$1_dim0*sizeof(char)); - } -} - -/* --- Variable output --- */ - -/* Void */ -%typemap(varout) void "$result = C_SCHEME_UNDEFINED;"; - -/* Special typemap for character array return values */ -%typemap(varout) char [ANY], const char [ANY] -%{ if ($varname == NULL) { - $result = C_SCHEME_FALSE; - } - else { - const int string_len = strlen ($varname); - C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); - $result = C_string (&string_space, string_len, (char *) $varname); - } -%} - - -/* --- Constants --- */ - -%typemap(constcode) char * -"static const char *$result = $value;" - -%typemap(constcode) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] -"static const void *$result = (void*) $value;" - -/* ------------------------------------------------------------ - * String & length - * ------------------------------------------------------------ */ - -%typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { - if ($input == C_SCHEME_FALSE) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use a null/#f string for a char*, int arguments"); - } - else if (C_swig_is_string ($input)) { - $1 = ($1_ltype) C_c_string ($input); - $2 = ($2_ltype) C_header_size ($input); - } - else { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'string'"); - } -} - -/* ------------------------------------------------------------ - * CHICKEN types - * ------------------------------------------------------------ */ - -%typemap(in) C_word "$1 = $input;"; -%typemap(out) C_word "$result = $1;"; - -/* ------------------------------------------------------------ - * Typechecking rules - * ------------------------------------------------------------ */ - -%typecheck(SWIG_TYPECHECK_INTEGER) - bool, const bool & -{ - $1 = C_swig_is_bool ($input); -} - -%typecheck(SWIG_TYPECHECK_INTEGER) - int, short, - unsigned int, unsigned short, - signed char, unsigned char, - const int &, const short &, - const unsigned int &, const unsigned short &, - enum SWIGTYPE -{ - $1 = C_swig_is_fixnum ($input); -} - -%typecheck(SWIG_TYPECHECK_INTEGER) - long, - unsigned long, - long long, unsigned long long, - const long &, - const unsigned long &, - const long long &, const unsigned long long & -{ - $1 = (C_swig_is_bool ($input) || - C_swig_is_fixnum ($input) || - C_swig_is_flonum ($input)) ? 1 : 0; -} - -%typecheck(SWIG_TYPECHECK_DOUBLE) - float, double, - const float &, const double & -{ - $1 = C_swig_is_flonum ($input); -} - -%typecheck(SWIG_TYPECHECK_CHAR) char { - $1 = C_swig_is_string ($input); -} - -%typecheck(SWIG_TYPECHECK_STRING) char * { - $1 = C_swig_is_string ($input); -} - -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { - void *ptr; - $1 = !SWIG_ConvertPtr($input, &ptr, $1_descriptor, 0); -} - -%typecheck(SWIG_TYPECHECK_VOIDPTR) void * { - void *ptr; - $1 = !SWIG_ConvertPtr($input, &ptr, 0, 0); -} - -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & -{ - void *ptr = 0; - if (SWIG_ConvertPtr($input, &ptr, $descriptor, SWIG_POINTER_NO_NULL)) { - $1 = 0; - } else { - $1 = 1; - } -} - -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE && -{ - void *ptr = 0; - if (SWIG_ConvertPtr($input, &ptr, $descriptor, SWIG_POINTER_NO_NULL)) { - $1 = 0; - } else { - $1 = 1; - } -} - -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE -{ - void *ptr = 0; - if (SWIG_ConvertPtr($input, &ptr, $&descriptor, SWIG_POINTER_NO_NULL)) { - $1 = 0; - } else { - $1 = 1; - } -} - - -/* ------------------------------------------------------------ - * Exception handling - * ------------------------------------------------------------ */ - -/* ------------------------------------------------------------ - * --- Exception handling --- - * ------------------------------------------------------------ */ - -%typemap(throws) SWIGTYPE { - $<ype temp = new $ltype($1); - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - C_word ptr = SWIG_NewPointerObj(temp, $&descriptor,1); - SWIG_Chicken_ThrowException(ptr); -} - -%typemap(throws) SWIGTYPE * { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); - SWIG_Chicken_ThrowException(ptr); -} - -%typemap(throws) SWIGTYPE [ANY] { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); - SWIG_Chicken_ThrowException(ptr); -} - -%typemap(throws) SWIGTYPE & { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); - SWIG_Chicken_ThrowException(ptr); -} - -%typemap(throws) SWIGTYPE && { - C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); - C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); - SWIG_Chicken_ThrowException(ptr); -} - -/* ------------------------------------------------------------ - * ANSI C typemaps - * ------------------------------------------------------------ */ - -%apply unsigned long { size_t }; - -/* ------------------------------------------------------------ - * Various - * ------------------------------------------------------------ */ - -/* Array reference typemaps */ -%apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } -%apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } - -/* const pointers */ -%apply SWIGTYPE * { SWIGTYPE *const } -%apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } -%apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } - -/* ------------------------------------------------------------ - * Overloaded operator support - * ------------------------------------------------------------ */ - -#ifdef __cplusplus -%rename(__add__) *::operator+; -%rename(__pos__) *::operator+(); -%rename(__pos__) *::operator+() const; -%rename(__sub__) *::operator-; -%rename(__neg__) *::operator-(); -%rename(__neg__) *::operator-() const; -%rename(__mul__) *::operator*; -%rename(__div__) *::operator/; -%rename(__mod__) *::operator%; -%rename(__lshift__) *::operator<<; -%rename(__rshift__) *::operator>>; -%rename(__and__) *::operator&; -%rename(__or__) *::operator|; -%rename(__xor__) *::operator^; -%rename(__invert__) *::operator~; -%rename(__iadd__) *::operator+=; -%rename(__isub__) *::operator-=; -%rename(__imul__) *::operator*=; -%rename(__idiv__) *::operator/=; -%rename(__imod__) *::operator%=; -%rename(__ilshift__) *::operator<<=; -%rename(__irshift__) *::operator>>=; -%rename(__iand__) *::operator&=; -%rename(__ior__) *::operator|=; -%rename(__ixor__) *::operator^=; -%rename(__lt__) *::operator<; -%rename(__le__) *::operator<=; -%rename(__gt__) *::operator>; -%rename(__ge__) *::operator>=; -%rename(__eq__) *::operator==; -%rename(__ne__) *::operator!=; - -/* Special cases */ -%rename(__call__) *::operator(); - -#endif -/* Warnings for certain CHICKEN keywords */ -%include - -/* TinyCLOS <--> Low-level CHICKEN */ - -%typemap("clos_in") SIMPLE_CLOS_OBJECT * "(slot-ref $input (quote this))" -%typemap("clos_out") SIMPLE_CLOS_OBJECT * "(make $class (quote this) $1)" - -%insert(header) %{ -#ifdef __cplusplus -extern "C" { -#endif -/* Chicken initialization function */ -SWIGEXPORT void SWIG_init(C_word, C_word, C_word) C_noret; -#ifdef __cplusplus -} -#endif -%} - -%insert(closprefix) "swigclosprefix.scm" - -%insert(init) "swiginit.swg" - -%insert(init) %{ -/* CHICKEN initialization function */ -#ifdef __cplusplus -extern "C" { -#endif -SWIGEXPORT void SWIG_init(C_word argc, C_word closure, C_word continuation) { - int i; - C_word sym; - C_word tmp; - C_word *a; - C_word ret; - C_word *return_vec; - - SWIG_InitializeModule(0); - SWIG_PropagateClientData(); - ret = C_SCHEME_TRUE; - -#if $veclength - return_vec = C_alloc(C_SIZEOF_VECTOR($veclength)); - ret = (C_word) return_vec; - *(return_vec++) = C_VECTOR_TYPE | $veclength; -#endif - - a = C_alloc(2*$nummethods$symsize); - -%} diff --git a/Lib/chicken/chickenkw.swg b/Lib/chicken/chickenkw.swg deleted file mode 100644 index d2c26c74c..000000000 --- a/Lib/chicken/chickenkw.swg +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef CHICKEN_CHICKENKW_SWG_ -#define CHICKEN_CHICKENKW_SWG_ - -/* Warnings for certain CHICKEN keywords. From Section 7.1.1 of - Revised^5 Report on the Algorithmic Language Scheme */ -#define CHICKENKW(x) %namewarn("314: '" #x "' is a R^5RS syntatic keyword") #x - -CHICKENKW(else); -CHICKENKW(=>); -CHICKENKW(define); -CHICKENKW(unquote); -CHICKENKW(unquote-splicing); -CHICKENKW(quote); -CHICKENKW(lambda); -CHICKENKW(if); -CHICKENKW(set!); -CHICKENKW(begin); -CHICKENKW(cond); -CHICKENKW(and); -CHICKENKW(or); -CHICKENKW(case); -CHICKENKW(let); -CHICKENKW(let*); -CHICKENKW(letrec); -CHICKENKW(do); -CHICKENKW(delay); -CHICKENKW(quasiquote); - -#undef CHICKENKW - -#endif //CHICKEN_CHICKENKW_SWG_ diff --git a/Lib/chicken/chickenrun.swg b/Lib/chicken/chickenrun.swg deleted file mode 100644 index bb14b4bc9..000000000 --- a/Lib/chicken/chickenrun.swg +++ /dev/null @@ -1,375 +0,0 @@ -/* ----------------------------------------------------------------------------- - * chickenrun.swg - * ----------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include -#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__BORLANDC__) || defined(_WATCOM) -# ifndef snprintf -# define snprintf _snprintf -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define SWIG_malloc(size) \ - malloc(size) -#define SWIG_free(mem) \ - free(mem) -#define SWIG_MakeString(c) \ - SWIG_Chicken_MakeString(c) -#define SWIG_ConvertPtr(s, result, type, flags) \ - SWIG_Chicken_ConvertPtr(s, result, type, flags) -#define SWIG_MustGetPtr(s, type, argnum, flags) \ - SWIG_Chicken_MustGetPtr(s, type, argnum, flags) -#define SWIG_NewPointerObj(ptr, type, owner) \ - SWIG_Chicken_NewPointerObj((void*)ptr, type, owner, &known_space) -#define swig_barf SWIG_Chicken_Barf -#define SWIG_ThrowException(val) SWIG_Chicken_ThrowException(val) - -#define SWIG_contract_assert(expr, message) if (!(expr)) { \ - SWIG_Chicken_Barf(SWIG_BARF1_CONTRACT_ASSERT, C_text(message)); } else - -/* Runtime API */ -#define SWIG_GetModule(clientdata) SWIG_Chicken_GetModule(clientdata) -#define SWIG_SetModule(clientdata, pointer) SWIG_Chicken_SetModule(pointer) - -#define C_swig_is_bool(x) C_truep (C_booleanp (x)) -#define C_swig_is_char(x) C_truep (C_charp (x)) -#define C_swig_is_fixnum(x) C_truep (C_fixnump (x)) -#define C_swig_is_flonum(x) (C_truep (C_blockp (x)) && C_truep (C_flonump (x))) -#define C_swig_is_string(x) (C_truep (C_blockp (x)) && C_truep (C_stringp (x))) -#define C_swig_is_vector(x) (C_truep (C_blockp (x)) && C_truep (C_vectorp (x))) -#define C_swig_is_list(x) (C_truep (C_i_listp (x))) -#define C_swig_is_pair(x) (C_truep (C_blockp(x)) && C_truep (C_pairp(x))) -#define C_swig_is_ptr(x) (C_truep (C_blockp (x)) && C_truep (C_pointerp (x))) -#define C_swig_is_swigpointer(x) (C_truep (C_blockp(x)) && C_truep (C_swigpointerp(x))) -#define C_swig_is_closurep(x) (C_truep (C_blockp(x)) && C_truep(C_closurep(x))) -#define C_swig_is_number(x) (C_swig_is_fixnum(x) || C_swig_is_flonum(x)) -#define C_swig_is_long(x) C_swig_is_number(x) - -#define C_swig_sizeof_closure(num) (num+1) - -#define SWIG_Chicken_SetupArgout { \ - C_word *a = C_alloc(C_swig_sizeof_closure(2)); \ - C_word *closure = a; \ - *(a++)=C_CLOSURE_TYPE|2; \ - *(a++)=(C_word)SWIG_Chicken_ApplyResults; \ - *(a++)=continuation; \ - continuation=(C_word)closure; \ -} - -#define SWIG_APPEND_VALUE(obj) { \ - C_word val = (C_word)(obj); \ - if (val != C_SCHEME_UNDEFINED) { \ - C_word *a = C_alloc(C_swig_sizeof_closure(3)); \ - C_word *closure = a; \ - *(a++)=C_CLOSURE_TYPE|3; \ - *(a++)=(C_word)SWIG_Chicken_MultiResultBuild; \ - *(a++)=(C_word)continuation; \ - *(a++)=val; \ - continuation=(C_word)closure; \ - } } - -#define SWIG_Chicken_FindCreateProxy(func,obj) \ - if (C_swig_is_swigpointer(obj)) { \ - swig_type_info *t = (swig_type_info *) C_block_item(obj, 1); \ - if (t && t->clientdata && ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create) { \ - func = CHICKEN_gc_root_ref( ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create); \ - } else { \ - func = C_SCHEME_FALSE; \ - } \ - } else { \ - func = C_SCHEME_FALSE; \ - } - - -enum { - SWIG_BARF1_BAD_ARGUMENT_TYPE /* 1 arg */, - SWIG_BARF1_ARGUMENT_NULL /* 1 arg */, - SWIG_BARF1_CONTRACT_ASSERT /* 1 arg */, -}; - -typedef C_word (*swig_chicken_destructor)(C_word,C_word,C_word,C_word); -typedef struct swig_chicken_clientdata { - void *gc_proxy_create; - swig_chicken_destructor destroy; -} swig_chicken_clientdata; - -static char * -SWIG_Chicken_MakeString(C_word str) { - char *ret; - size_t l; - - l = C_header_size(str); - ret = (char *) SWIG_malloc( (l + 1) * sizeof(char)); - if (!ret) return NULL; - - memcpy(ret, C_c_string(str), l); - ret[l] = '\0'; - return ret; -} - -static C_word SWIG_Chicken_LookupSymbol(char *name, C_SYMBOL_TABLE *stable) { - C_word *a = C_alloc(C_SIZEOF_STRING (strlen (name))); - C_word n = C_string2(&a, name); - C_word sym = C_find_symbol(n, stable); - if (C_truep(sym)) { - return C_symbol_value(sym); - } else { - return C_SCHEME_FALSE; - } -} - -/* Just a helper function. Do not export it */ -static void SWIG_Chicken_Panic (C_char *) C_noret; -static void SWIG_Chicken_Panic (C_char *msg) -{ - C_word *a = C_alloc (C_SIZEOF_STRING (strlen (msg))); - C_word scmmsg = C_string2 (&a, msg); - C_halt (scmmsg); - exit (5); /* should never get here */ -} - -static void -SWIG_Chicken_Barf(int code, C_char *msg, ...) C_noret; -static void -SWIG_Chicken_Barf(int code, C_char *msg, ...) -{ - char *errorhook = C_text("\003syserror-hook"); - C_word *a = C_alloc (C_SIZEOF_STRING (strlen (errorhook))); - C_word err = C_intern2 (&a, errorhook); - int c = -1; - int i, barfval; - va_list v; - - - C_temporary_stack = C_temporary_stack_bottom; - err = C_block_item(err, 0); - - if(C_immediatep (err)) - SWIG_Chicken_Panic (C_text ("`##sys#error-hook' is not defined")); - - switch (code) { - case SWIG_BARF1_BAD_ARGUMENT_TYPE: - barfval = C_BAD_ARGUMENT_TYPE_ERROR; - c = 1; - break; - case SWIG_BARF1_ARGUMENT_NULL: - barfval = C_BAD_ARGUMENT_TYPE_ERROR; - c = 1; - break; - case SWIG_BARF1_CONTRACT_ASSERT: - barfval = C_BAD_ARGUMENT_TYPE_ERROR; - c = 1; - break; - default: - SWIG_Chicken_Panic (C_text (msg)); - }; - - if(c > 0 && !C_immediatep (err)) { - C_save (C_fix (barfval)); - - i = c; - if (i) { - C_word *b = C_alloc (C_SIZEOF_STRING (strlen (msg))); - C_word scmmsg = C_string2 (&b, msg); - C_save (scmmsg); - i--; - } - - va_start (v, msg); - - while(i--) - C_save (va_arg (v, C_word)); - - va_end (v); - C_do_apply (c + 1, err, - C_SCHEME_UNDEFINED); /* <- no continuation is passed: - '##sys#error-hook' may not - return! */ - } - else if (msg) { - SWIG_Chicken_Panic (msg); - } - else { - SWIG_Chicken_Panic (C_text ("unspecified panic")); - } -} - -static void SWIG_Chicken_ThrowException(C_word value) C_noret; -static void SWIG_Chicken_ThrowException(C_word value) -{ - char *aborthook = C_text("\003sysabort"); - C_word *a = C_alloc(C_SIZEOF_STRING(strlen(aborthook))); - C_word abort = C_intern2(&a, aborthook); - - abort = C_block_item(abort, 0); - if (C_immediatep(abort)) - SWIG_Chicken_Panic(C_text("`##sys#abort' is not defined")); - - C_save(value); - C_do_apply(1, abort, C_SCHEME_UNDEFINED); -} - -static void -SWIG_Chicken_Finalizer(C_word argc, C_word closure, C_word continuation, C_word s) -{ - swig_type_info *type; - swig_chicken_clientdata *cdata; - - if (argc == 3 && s != C_SCHEME_FALSE && C_swig_is_swigpointer(s)) { - type = (swig_type_info *) C_block_item(s, 1); - if (type) { - cdata = (swig_chicken_clientdata *) type->clientdata; - if (cdata && cdata->destroy) { - /* this will not return, but will continue correctly */ - cdata->destroy(3,closure,continuation,s); - } - } - } - C_kontinue(continuation, C_SCHEME_UNDEFINED); -} -static C_word finalizer_obj[2] = {(C_word) (C_CLOSURE_TYPE|1), (C_word) SWIG_Chicken_Finalizer}; - -static C_word -SWIG_Chicken_NewPointerObj(void *ptr, swig_type_info *type, int owner, C_word **data) -{ - swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) type->clientdata; - - if (ptr == NULL) - return C_SCHEME_FALSE; - else { - C_word cptr = C_swigmpointer(data, ptr, type); - /* add finalizer to object */ - #ifndef SWIG_CHICKEN_NO_COLLECTION - if (owner) - C_do_register_finalizer(cptr, (C_word) finalizer_obj); - #endif - - return cptr; - } -} - -/* Return 0 if successful. */ -static int -SWIG_Chicken_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags) -{ - swig_cast_info *cast; - swig_type_info *from; - - if (s == C_SCHEME_FALSE) { - *result = NULL; - return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; - } else if (C_swig_is_swigpointer(s)) { - /* try and convert type */ - from = (swig_type_info *) C_block_item(s, 1); - if (!from) return 1; - if (type) { - cast = SWIG_TypeCheckStruct(from, type); - if (cast) { - int newmemory = 0; - *result = SWIG_TypeCast(cast, (void *) C_block_item(s, 0), &newmemory); - assert(!newmemory); /* newmemory handling not yet implemented */ - } else { - return 1; - } - } else { - *result = (void *) C_block_item(s, 0); - } - - /* check if we are disowning this object */ - if (flags & SWIG_POINTER_DISOWN) { - C_do_unregister_finalizer(s); - } - } else { - return 1; - } - - return 0; -} - -static SWIGINLINE void * -SWIG_Chicken_MustGetPtr (C_word s, swig_type_info *type, int argnum, int flags) -{ - void *result; - char err_msg[256]; - if (SWIG_Chicken_ConvertPtr(s, &result, type, flags)) { - /* type mismatch */ - snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", argnum, (type->str ? type->str : type->name)); - SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); - } - return result; -} - -static char *chicken_runtimevar_name = "type_pointer" SWIG_TYPE_TABLE_NAME; - -static swig_module_info * -SWIG_Chicken_GetModule(void *SWIGUNUSEDPARM(clientdata)) { - swig_module_info *ret = 0; - C_word sym; - - /* lookup the type pointer... it is stored in its own symbol table */ - C_SYMBOL_TABLE *stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); - if (stable != NULL) { - sym = SWIG_Chicken_LookupSymbol(chicken_runtimevar_name, stable); - if (C_truep(sym) && C_swig_is_ptr(sym)) { - ret = (swig_module_info *) C_block_item(sym, 0); - } - } - - return ret; -} - -static void -SWIG_Chicken_SetModule(swig_module_info *module) { - C_word *a; - C_SYMBOL_TABLE *stable; - C_word sym; - C_word pointer; - static C_word *space = 0; - - /* type pointer is stored in its own symbol table */ - stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); - if (stable == NULL) { - stable = C_new_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION, 16); - } - - if (!space) { - space = (C_word *) C_malloc((C_SIZEOF_POINTER + C_SIZEOF_INTERNED_SYMBOL(C_strlen(chicken_runtimevar_name))) * sizeof(C_word)); - } - a = space; - pointer = C_mpointer(&a, (void *) module); - sym = C_intern_in(&a, C_strlen(chicken_runtimevar_name), chicken_runtimevar_name, stable); - C_set_block_item(sym, 0, pointer); -} - -static C_word SWIG_Chicken_MultiResultBuild(C_word num, C_word closure, C_word lst) { - C_word cont = C_block_item(closure,1); - C_word obj = C_block_item(closure,2); - C_word func; - - SWIG_Chicken_FindCreateProxy(func,obj); - - if (C_swig_is_closurep(func)) { - ((C_proc4)(void *)C_block_item(func, 0))(4,func,cont,obj,lst); - } else { - C_word *a = C_alloc(C_SIZEOF_PAIR); - C_kontinue(cont,C_pair(&a,obj,lst)); - } - return C_SCHEME_UNDEFINED; /* never reached */ -} - -static C_word SWIG_Chicken_ApplyResults(C_word num, C_word closure, C_word result) { - C_apply_values(3,C_SCHEME_UNDEFINED,C_block_item(closure,1),result); - return C_SCHEME_UNDEFINED; /* never reached */ -} - -#ifdef __cplusplus -} -#endif diff --git a/Lib/chicken/extra-install.list b/Lib/chicken/extra-install.list deleted file mode 100644 index 48721cee0..000000000 --- a/Lib/chicken/extra-install.list +++ /dev/null @@ -1,3 +0,0 @@ -swigclosprefix.scm -multi-generic.scm -tinyclos-multi-generic.patch diff --git a/Lib/chicken/multi-generic.scm b/Lib/chicken/multi-generic.scm deleted file mode 100644 index 9d2e31d34..000000000 --- a/Lib/chicken/multi-generic.scm +++ /dev/null @@ -1,152 +0,0 @@ -;; This file is no longer necessary with Chicken versions above 1.92 -;; -;; This file overrides two functions inside TinyCLOS to provide support -;; for multi-argument generics. There are many ways of linking this file -;; into your code... all that needs to happen is this file must be -;; executed after loading TinyCLOS but before any SWIG modules are loaded -;; -;; something like the following -;; (require 'tinyclos) -;; (load "multi-generic") -;; (declare (uses swigmod)) -;; -;; An alternative to loading this scheme code directly is to add a -;; (declare (unit multi-generic)) to the top of this file, and then -;; compile this into the final executable or something. Or compile -;; this into an extension. - -;; Lastly, to override TinyCLOS method creation, two functions are -;; overridden: see the end of this file for which two are overridden. -;; You might want to remove those two lines and then exert more control over -;; which functions are used when. - -;; Comments, bugs, suggestions: send either to chicken-users@nongnu.org or to -;; Most code copied from TinyCLOS - -(define (make - 'name "multi-generic" - 'direct-supers (list ) - 'direct-slots '())) - -(letrec ([applicable? - (lambda (c arg) - (memq c (class-cpl (class-of arg))))] - - [more-specific? - (lambda (c1 c2 arg) - (memq c2 (memq c1 (class-cpl (class-of arg)))))] - - [filter-in - (lambda (f l) - (if (null? l) - '() - (let ([h (##sys#slot l 0)] - [r (##sys#slot l 1)] ) - (if (f h) - (cons h (filter-in f r)) - (filter-in f r) ) ) ) )]) - -(add-method compute-apply-generic - (make-method (list ) - (lambda (call-next-method generic) - (lambda args - (let ([cam (let ([x (compute-apply-methods generic)] - [y ((compute-methods generic) args)] ) - (lambda (args) (x y args)) ) ] ) - (cam args) ) ) ) ) ) - - - -(add-method compute-methods - (make-method (list ) - (lambda (call-next-method generic) - (lambda (args) - (let ([applicable - (filter-in (lambda (method) - (let check-applicable ([list1 (method-specializers method)] - [list2 args]) - (cond ((null? list1) #t) - ((null? list2) #f) - (else - (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) - (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) - (generic-methods generic) ) ] ) - (if (or (null? applicable) (null? (##sys#slot applicable 1))) - applicable - (let ([cmms (compute-method-more-specific? generic)]) - (sort applicable (lambda (m1 m2) (cmms m1 m2 args))) ) ) ) ) ) ) ) - -(add-method compute-method-more-specific? - (make-method (list ) - (lambda (call-next-method generic) - (lambda (m1 m2 args) - (let loop ((specls1 (method-specializers m1)) - (specls2 (method-specializers m2)) - (args args)) - (cond-expand - [unsafe - (let ((c1 (##sys#slot specls1 0)) - (c2 (##sys#slot specls2 0)) - (arg (##sys#slot args 0))) - (if (eq? c1 c2) - (loop (##sys#slot specls1 1) - (##sys#slot specls2 1) - (##sys#slot args 1)) - (more-specific? c1 c2 arg))) ] - [else - (cond ((and (null? specls1) (null? specls2)) - (##sys#error "two methods are equally specific" generic)) - ;((or (null? specls1) (null? specls2)) - ; (##sys#error "two methods have different number of specializers" generic)) - ((null? specls1) #f) - ((null? specls2) #t) - ((null? args) - (##sys#error "fewer arguments than specializers" generic)) - (else - (let ((c1 (##sys#slot specls1 0)) - (c2 (##sys#slot specls2 0)) - (arg (##sys#slot args 0))) - (if (eq? c1 c2) - (loop (##sys#slot specls1 1) - (##sys#slot specls2 1) - (##sys#slot args 1)) - (more-specific? c1 c2 arg)))) ) ] ) ) ) ) ) ) - -) ;; end of letrec - -(define multi-add-method - (lambda (generic method) - (slot-set! - generic - 'methods - (let filter-in-method ([methods (slot-ref generic 'methods)]) - (if (null? methods) - (list method) - (let ([l1 (length (method-specializers method))] - [l2 (length (method-specializers (##sys#slot methods 0)))]) - (cond ((> l1 l2) - (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))) - ((< l1 l2) - (cons method methods)) - (else - (let check-method ([ms1 (method-specializers method)] - [ms2 (method-specializers (##sys#slot methods 0))]) - (cond ((and (null? ms1) (null? ms2)) - (cons method (##sys#slot methods 1))) ;; skip the method already in the generic - ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) - (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) - (else - (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))))))))))) - - (##sys#setslot (##sys#slot generic (- (##sys#size generic) 2)) 1 (compute-apply-generic generic)) )) - -(define (multi-add-global-method val sym specializers proc) - (let ((generic (if (procedure? val) val (make 'name (##sys#symbol->string sym))))) - (multi-add-method generic (make-method specializers proc)) - generic)) - -;; Might want to remove these, or perhaps do something like -;; (define old-add-method ##tinyclos#add-method) -;; and then you can switch between creating multi-generics and TinyCLOS generics. -(set! ##tinyclos#add-method multi-add-method) -(set! ##tinyclos#add-global-method multi-add-global-method) diff --git a/Lib/chicken/std_string.i b/Lib/chicken/std_string.i deleted file mode 100644 index fa77c1533..000000000 --- a/Lib/chicken/std_string.i +++ /dev/null @@ -1,96 +0,0 @@ -/* ----------------------------------------------------------------------------- - * std_string.i - * - * SWIG typemaps for std::string - * ----------------------------------------------------------------------------- */ - -%{ -#include -%} - -namespace std { - %naturalvar string; - - - %insert(closprefix) %{ (declare (hide )) %} - %nodefault string; - %rename("std-string") string; - class string { - public: - ~string() {} - }; - %extend string { - char *str; - } - %{ - #define std_string_str_get(s) ((char *)((s)->c_str())) - #define std_string_str_set(s,v) (s->assign((char *)(v))) - %} - - %typemap(typecheck) string = char *; - %typemap(typecheck) const string & = char *; - - %typemap(in) string (char * tempptr) { - if ($input == C_SCHEME_FALSE) { - $1.resize(0); - } else { - if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, - "Argument #$argnum is not a string"); - } - tempptr = SWIG_MakeString($input); - $1.assign(tempptr); - if (tempptr) SWIG_free(tempptr); - } - } - - %typemap(in) const string& ($*1_ltype temp, char *tempptr) { - - if ($input == C_SCHEME_FALSE) { - temp.resize(0); - $1 = &temp; - } else { - if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, - "Argument #$argnum is not a string"); - } - tempptr = SWIG_MakeString($input); - temp.assign(tempptr); - if (tempptr) SWIG_free(tempptr); - $1 = &temp; - } - } - - %typemap(out) string { - int size = $1.size(); - C_word *space = C_alloc (C_SIZEOF_STRING (size)); - $result = C_string (&space, size, (char *) $1.c_str()); - } - - %typemap(out) const string& { - int size = $1->size(); - C_word *space = C_alloc (C_SIZEOF_STRING (size)); - $result = C_string (&space, size, (char *) $1->c_str()); - } - - %typemap(varin) string { - if ($input == C_SCHEME_FALSE) { - $1.resize(0); - } else { - char *tempptr; - if (!C_swig_is_string ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, - "Argument #$argnum is not a string"); - } - tempptr = SWIG_MakeString($input); - $1.assign(tempptr); - if (tempptr) SWIG_free(tempptr); - } - } - - %typemap(varout) string { - int size = $1.size(); - C_word *space = C_alloc (C_SIZEOF_STRING (size)); - $result = C_string (&space, size, (char *) $1.c_str()); - } -} diff --git a/Lib/chicken/swigclosprefix.scm b/Lib/chicken/swigclosprefix.scm deleted file mode 100644 index e4bd72b71..000000000 --- a/Lib/chicken/swigclosprefix.scm +++ /dev/null @@ -1,31 +0,0 @@ -(declare (hide swig-initialize)) - -(define (swig-initialize obj initargs create) - (slot-set! obj 'swig-this - (if (memq 'swig-this initargs) - (cadr initargs) - (let ((ret (apply create initargs))) - (if (instance? ret) - (slot-ref ret 'swig-this) - ret))))) - -(define-class () (void)) - -(define-method (compute-getter-and-setter (class ) slot allocator) - (if (not (memq ':swig-virtual slot)) - (call-next-method) - (let ((getter (let search-get ((lst slot)) - (if (null? lst) - #f - (if (eq? (car lst) ':swig-get) - (cadr lst) - (search-get (cdr lst)))))) - (setter (let search-set ((lst slot)) - (if (null? lst) - #f - (if (eq? (car lst) ':swig-set) - (cadr lst) - (search-set (cdr lst))))))) - (values - (lambda (o) (getter (slot-ref o 'swig-this))) - (lambda (o new) (setter (slot-ref o 'swig-this) new) new))))) diff --git a/Lib/chicken/tinyclos-multi-generic.patch b/Lib/chicken/tinyclos-multi-generic.patch deleted file mode 100644 index 2e585960e..000000000 --- a/Lib/chicken/tinyclos-multi-generic.patch +++ /dev/null @@ -1,150 +0,0 @@ -# This patch is against chicken 1.92, but it should work just fine -# with older versions of chicken. It adds support for mulit-argument -# generics, that is, generics now correctly handle adding methods -# with different lengths of specializer lists - -# This patch has been committed into the CHICKEN darcs repository, -# so chicken versions above 1.92 work fine. - -# Comments, bugs, suggestions send to chicken-users@nongnu.org - -# Patch written by John Lenz - ---- tinyclos.scm.old 2005-04-05 01:13:56.000000000 -0500 -+++ tinyclos.scm 2005-04-11 16:37:23.746181489 -0500 -@@ -37,8 +37,10 @@ - - (include "parameters") - -+(cond-expand [(not chicken-compile-shared) (declare (unit tinyclos))] -+ [else] ) -+ - (declare -- (unit tinyclos) - (uses extras) - (usual-integrations) - (fixnum) -@@ -234,7 +236,10 @@ - y = C_block_item(y, 1); - } - } -- return(C_block_item(v, i + 1)); -+ if (x == C_SCHEME_END_OF_LIST && y == C_SCHEME_END_OF_LIST) -+ return(C_block_item(v, i + 1)); -+ else -+ goto mismatch; - } - else if(free_index == -1) free_index = i; - mismatch: -@@ -438,7 +443,7 @@ - (define hash-arg-list - (foreign-lambda* unsigned-int ((scheme-object args) (scheme-object svector)) " - C_word tag, h, x; -- int n, i, j; -+ int n, i, j, len = 0; - for(i = 0; args != C_SCHEME_END_OF_LIST; args = C_block_item(args, 1)) { - x = C_block_item(args, 0); - if(C_immediatep(x)) { -@@ -481,8 +486,9 @@ - default: i += 255; - } - } -+ ++len; - } -- return(i & (C_METHOD_CACHE_SIZE - 1));") ) -+ return((i + len) & (C_METHOD_CACHE_SIZE - 1));") ) - - - ; -@@ -868,13 +874,27 @@ - (##tinyclos#slot-set! - generic - 'methods -- (cons method -- (filter-in -- (lambda (m) -- (let ([ms1 (method-specializers m)] -- [ms2 (method-specializers method)] ) -- (not (every2 (lambda (x y) (eq? x y)) ms1 ms2) ) ) ) -- (##tinyclos#slot-ref generic 'methods)))) -+ (let* ([ms1 (method-specializers method)] -+ [l1 (length ms1)] ) -+ (let filter-in-method ([methods (##tinyclos#slot-ref generic 'methods)]) -+ (if (null? methods) -+ (list method) -+ (let* ([mm (##sys#slot methods 0)] -+ [ms2 (method-specializers mm)] -+ [l2 (length ms2)]) -+ (cond ((> l1 l2) -+ (cons mm (filter-in-method (##sys#slot methods 1)))) -+ ((< l1 l2) -+ (cons method methods)) -+ (else -+ (let check-method ([ms1 ms1] -+ [ms2 ms2]) -+ (cond ((and (null? ms1) (null? ms2)) -+ (cons method (##sys#slot methods 1))) ;; skip the method already in the generic -+ ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) -+ (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) -+ (else -+ (cons mm (filter-in-method (##sys#slot methods 1))))))))))))) - (if (memq generic generic-invocation-generics) - (set! method-cache-tag (vector)) - (%entity-cache-set! generic #f) ) -@@ -925,11 +945,13 @@ - (memq (car args) generic-invocation-generics)) - (let ([proc - (method-procedure -+ ; select the first method of one argument - (let lp ([lis (generic-methods generic)]) -- (let ([tail (##sys#slot lis 1)]) -- (if (null? tail) -- (##sys#slot lis 0) -- (lp tail)) ) ) ) ] ) -+ (if (null? lis) -+ (##sys#error "Unable to find original compute-apply-generic") -+ (if (= (length (method-specializers (##sys#slot lis 0))) 1) -+ (##sys#slot lis 0) -+ (lp (##sys#slot lis 1)))))) ] ) - (lambda (args) (apply proc #f args)) ) - (let ([x (compute-apply-methods generic)] - [y ((compute-methods generic) args)] ) -@@ -946,9 +968,13 @@ - (lambda (args) - (let ([applicable - (filter-in (lambda (method) -- (every2 applicable? -- (method-specializers method) -- args)) -+ (let check-applicable ([list1 (method-specializers method)] -+ [list2 args]) -+ (cond ((null? list1) #t) -+ ((null? list2) #f) -+ (else -+ (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) -+ (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) - (generic-methods generic) ) ] ) - (if (or (null? applicable) (null? (##sys#slot applicable 1))) - applicable -@@ -975,8 +1001,10 @@ - [else - (cond ((and (null? specls1) (null? specls2)) - (##sys#error "two methods are equally specific" generic)) -- ((or (null? specls1) (null? specls2)) -- (##sys#error "two methods have different number of specializers" generic)) -+ ;((or (null? specls1) (null? specls2)) -+ ; (##sys#error "two methods have different number of specializers" generic)) -+ ((null? specls1) #f) -+ ((null? specls2) #t) - ((null? args) - (##sys#error "fewer arguments than specializers" generic)) - (else -@@ -1210,7 +1238,7 @@ - (define (make-primitive-class "structure")) - (define (make-primitive-class "procedure" )) - (define (make-primitive-class "end-of-file")) --(define (make-primitive-class "environment" )) ; (Benedikt insisted on this) -+(define (make-primitive-class "environment" )) - (define (make-primitive-class "hash-table" )) - (define (make-primitive-class "promise" )) - (define (make-primitive-class "queue" )) diff --git a/Lib/chicken/typemaps.i b/Lib/chicken/typemaps.i deleted file mode 100644 index fd587fd68..000000000 --- a/Lib/chicken/typemaps.i +++ /dev/null @@ -1,314 +0,0 @@ -/* ----------------------------------------------------------------------------- - * typemaps.i - * - * Pointer handling - * - * These mappings provide support for input/output arguments and - * common uses for C/C++ pointers. INOUT mappings allow for C/C++ - * pointer variables in addition to input/output arguments. - * ----------------------------------------------------------------------------- */ - -// INPUT typemaps. -// These remap a C pointer to be an "INPUT" value which is passed by value -// instead of reference. - -/* -The following methods can be applied to turn a pointer into a simple -"input" value. That is, instead of passing a pointer to an object, -you would use a real value instead. - - int *INPUT - short *INPUT - long *INPUT - long long *INPUT - unsigned int *INPUT - unsigned short *INPUT - unsigned long *INPUT - unsigned long long *INPUT - unsigned char *INPUT - char *INPUT - bool *INPUT - float *INPUT - double *INPUT - -To use these, suppose you had a C function like this : - - double fadd(double *a, double *b) { - return *a+*b; - } - -You could wrap it with SWIG as follows : - - %include - double fadd(double *INPUT, double *INPUT); - -or you can use the %apply directive : - - %include - %apply double *INPUT { double *a, double *b }; - double fadd(double *a, double *b); - -*/ - -// OUTPUT typemaps. These typemaps are used for parameters that -// are output only. The output value is appended to the result as -// a list element. - -/* -The following methods can be applied to turn a pointer into an "output" -value. When calling a function, no input value would be given for -a parameter, but an output value would be returned. In the case of -multiple output values, they are returned in the form of a Scheme list. - - int *OUTPUT - short *OUTPUT - long *OUTPUT - long long *OUTPUT - unsigned int *OUTPUT - unsigned short *OUTPUT - unsigned long *OUTPUT - unsigned long long *OUTPUT - unsigned char *OUTPUT - char *OUTPUT - bool *OUTPUT - float *OUTPUT - double *OUTPUT - -For example, suppose you were trying to wrap the modf() function in the -C math library which splits x into integral and fractional parts (and -returns the integer part in one of its parameters).K: - - double modf(double x, double *ip); - -You could wrap it with SWIG as follows : - - %include - double modf(double x, double *OUTPUT); - -or you can use the %apply directive : - - %include - %apply double *OUTPUT { double *ip }; - double modf(double x, double *ip); - -*/ - -//---------------------------------------------------------------------- -// -// T_OUTPUT typemap (and helper function) to return multiple argouts as -// a tuple instead of a list. -// -//---------------------------------------------------------------------- - -// Simple types - -%define INOUT_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) - -%typemap(in) type_ *INPUT($*1_ltype temp), type_ &INPUT($*1_ltype temp) -%{ if (!checker ($input)) { - swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); - } - temp = ($*1_ltype) from_scheme ($input); - $1 = &temp; %} - -%typemap(typecheck) type_ *INPUT = type_; -%typemap(typecheck) type_ &INPUT = type_; - -%typemap(in, numinputs=0) type_ *OUTPUT($*1_ltype temp), type_ &OUTPUT($*1_ltype temp) -" $1 = &temp;" - -#if "storage_" == "0" - -%typemap(argout) type_ *OUTPUT, type_ &OUTPUT -%{ - if ($1 == NULL) { - swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Argument #$argnum must be non-null"); - } - SWIG_APPEND_VALUE(to_scheme (convtype (*$1))); -%} - -#else - -%typemap(argout) type_ *OUTPUT, type_ &OUTPUT -%{ - { - C_word *known_space = C_alloc(storage_); - if ($1 == NULL) { - swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Variable '$1' must be non-null"); - } - SWIG_APPEND_VALUE(to_scheme (&known_space, convtype (*$1))); - } -%} - -#endif - -%enddef - -INOUT_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); -INOUT_TYPEMAP(enum SWIGTYPE, C_num_to_int, C_fix, C_swig_is_number, (int), 0); -INOUT_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); -INOUT_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); -INOUT_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); -INOUT_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (int), C_SIZEOF_FLONUM); -INOUT_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); -INOUT_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); -INOUT_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); -INOUT_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); -INOUT_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); -INOUT_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); -INOUT_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); -INOUT_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); -INOUT_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); - -// INOUT -// Mappings for an argument that is both an input and output -// parameter - -/* -The following methods can be applied to make a function parameter both -an input and output value. This combines the behavior of both the -"INPUT" and "OUTPUT" methods described earlier. Output values are -returned in the form of a CHICKEN tuple. - - int *INOUT - short *INOUT - long *INOUT - long long *INOUT - unsigned int *INOUT - unsigned short *INOUT - unsigned long *INOUT - unsigned long long *INOUT - unsigned char *INOUT - char *INOUT - bool *INOUT - float *INOUT - double *INOUT - -For example, suppose you were trying to wrap the following function : - - void neg(double *x) { - *x = -(*x); - } - -You could wrap it with SWIG as follows : - - %include - void neg(double *INOUT); - -or you can use the %apply directive : - - %include - %apply double *INOUT { double *x }; - void neg(double *x); - -As well, you can wrap variables with : - - %include - %apply double *INOUT { double *y }; - extern double *y; - -Unlike C, this mapping does not directly modify the input value (since -this makes no sense in CHICKEN). Rather, the modified input value shows -up as the return value of the function. Thus, to apply this function -to a CHICKEN variable you might do this : - - x = neg(x) - -Note : previous versions of SWIG used the symbol 'BOTH' to mark -input/output arguments. This is still supported, but will be slowly -phased out in future releases. - -*/ - -%typemap(in) int *INOUT = int *INPUT; -%typemap(in) enum SWIGTYPE *INOUT = enum SWIGTYPE *INPUT; -%typemap(in) short *INOUT = short *INPUT; -%typemap(in) long *INOUT = long *INPUT; -%typemap(in) long long *INOUT = long long *INPUT; -%typemap(in) unsigned *INOUT = unsigned *INPUT; -%typemap(in) unsigned short *INOUT = unsigned short *INPUT; -%typemap(in) unsigned long *INOUT = unsigned long *INPUT; -%typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; -%typemap(in) unsigned char *INOUT = unsigned char *INPUT; -%typemap(in) char *INOUT = char *INPUT; -%typemap(in) bool *INOUT = bool *INPUT; -%typemap(in) float *INOUT = float *INPUT; -%typemap(in) double *INOUT = double *INPUT; - -%typemap(in) int &INOUT = int &INPUT; -%typemap(in) enum SWIGTYPE &INOUT = enum SWIGTYPE &INPUT; -%typemap(in) short &INOUT = short &INPUT; -%typemap(in) long &INOUT = long &INPUT; -%typemap(in) long long &INOUT = long long &INPUT; -%typemap(in) unsigned &INOUT = unsigned &INPUT; -%typemap(in) unsigned short &INOUT = unsigned short &INPUT; -%typemap(in) unsigned long &INOUT = unsigned long &INPUT; -%typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; -%typemap(in) unsigned char &INOUT = unsigned char &INPUT; -%typemap(in) char &INOUT = char &INPUT; -%typemap(in) bool &INOUT = bool &INPUT; -%typemap(in) float &INOUT = float &INPUT; -%typemap(in) double &INOUT = double &INPUT; - -%typemap(argout) int *INOUT = int *OUTPUT; -%typemap(argout) enum SWIGTYPE *INOUT = enum SWIGTYPE *OUTPUT; -%typemap(argout) short *INOUT = short *OUTPUT; -%typemap(argout) long *INOUT = long *OUTPUT; -%typemap(argout) long long *INOUT = long long *OUTPUT; -%typemap(argout) unsigned *INOUT = unsigned *OUTPUT; -%typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; -%typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; -%typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; -%typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; -%typemap(argout) bool *INOUT = bool *OUTPUT; -%typemap(argout) float *INOUT = float *OUTPUT; -%typemap(argout) double *INOUT = double *OUTPUT; - -%typemap(argout) int &INOUT = int &OUTPUT; -%typemap(argout) enum SWIGTYPE &INOUT = enum SWIGTYPE &OUTPUT; -%typemap(argout) short &INOUT = short &OUTPUT; -%typemap(argout) long &INOUT = long &OUTPUT; -%typemap(argout) long long &INOUT = long long &OUTPUT; -%typemap(argout) unsigned &INOUT = unsigned &OUTPUT; -%typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; -%typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; -%typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; -%typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; -%typemap(argout) char &INOUT = char &OUTPUT; -%typemap(argout) bool &INOUT = bool &OUTPUT; -%typemap(argout) float &INOUT = float &OUTPUT; -%typemap(argout) double &INOUT = double &OUTPUT; - -/* Overloading information */ - -%typemap(typecheck) double *INOUT = double; -%typemap(typecheck) bool *INOUT = bool; -%typemap(typecheck) char *INOUT = char; -%typemap(typecheck) signed char *INOUT = signed char; -%typemap(typecheck) unsigned char *INOUT = unsigned char; -%typemap(typecheck) unsigned long *INOUT = unsigned long; -%typemap(typecheck) unsigned long long *INOUT = unsigned long long; -%typemap(typecheck) unsigned short *INOUT = unsigned short; -%typemap(typecheck) unsigned int *INOUT = unsigned int; -%typemap(typecheck) long *INOUT = long; -%typemap(typecheck) long long *INOUT = long long; -%typemap(typecheck) short *INOUT = short; -%typemap(typecheck) int *INOUT = int; -%typemap(typecheck) enum SWIGTYPE *INOUT = enum SWIGTYPE; -%typemap(typecheck) float *INOUT = float; - -%typemap(typecheck) double &INOUT = double; -%typemap(typecheck) bool &INOUT = bool; -%typemap(typecheck) char &INOUT = char; -%typemap(typecheck) signed char &INOUT = signed char; -%typemap(typecheck) unsigned char &INOUT = unsigned char; -%typemap(typecheck) unsigned long &INOUT = unsigned long; -%typemap(typecheck) unsigned long long &INOUT = unsigned long long; -%typemap(typecheck) unsigned short &INOUT = unsigned short; -%typemap(typecheck) unsigned int &INOUT = unsigned int; -%typemap(typecheck) long &INOUT = long; -%typemap(typecheck) long long &INOUT = long long; -%typemap(typecheck) short &INOUT = short; -%typemap(typecheck) int &INOUT = int; -%typemap(typecheck) enum SWIGTYPE &INOUT = enum SWIGTYPE; -%typemap(typecheck) float &INOUT = float; diff --git a/Lib/clisp/clisp.swg b/Lib/clisp/clisp.swg deleted file mode 100644 index e1d330cb3..000000000 --- a/Lib/clisp/clisp.swg +++ /dev/null @@ -1,32 +0,0 @@ -/* ----------------------------------------------------------------------------- - * clisp.swg - * ----------------------------------------------------------------------------- */ - -/* Define a C preprocessor symbol that can be used in interface files - to distinguish between the SWIG language modules. */ - -#define SWIG_CLISP - -/* Typespecs for basic types. */ - -%typemap(in) void "NIL"; - -%typemap(in) char "character"; -%typemap(in) char * "ffi:c-string"; -%typemap(in) unsigned char "ffi:uchar"; -%typemap(in) signed char "ffi:char"; - -%typemap(in) short "ffi:short"; -%typemap(in) signed short "ffi:short"; -%typemap(in) unsigned short "ffi:ushort"; - -%typemap(in) int "ffi:int"; -%typemap(in) signed int "ffi:int"; -%typemap(in) unsigned int "ffi:uint"; - -%typemap(in) long "ffi:long"; -%typemap(in) signed long "ffi:long"; -%typemap(in) unsigned long "ffi:ulong"; - -%typemap(in) float "SINGLE-FLOAT"; -%typemap(in) double "DOUBLE-FLOAT"; diff --git a/Lib/csharp/csharp.swg b/Lib/csharp/csharp.swg index 832206386..0e180f576 100644 --- a/Lib/csharp/csharp.swg +++ b/Lib/csharp/csharp.swg @@ -875,6 +875,15 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { global::System.IntPtr ret = $imcall;$excode return ret; } +%typemap(csvarin, excode=SWIGEXCODE2) void *VOID_INT_PTR %{ + set { + $imcall;$excode + } %} +%typemap(csvarout, excode=SWIGEXCODE2) void *VOID_INT_PTR %{ + get { + global::System.IntPtr ret = $imcall;$excode + return ret; + } %} %typemap(csdirectorin) void *VOID_INT_PTR "$iminput" %typemap(csdirectorout) void *VOID_INT_PTR "$cscall" @@ -885,6 +894,7 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { %typemap(csinterfaces) SWIGTYPE "global::System.IDisposable" %typemap(csinterfaces) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csinterfaces_derived) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" +%typemap(csinterfacemodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public interface" // csbody typemaps... these are in macros so that the visibility of the methods can be easily changed by users. diff --git a/Lib/csharp/std_auto_ptr.i b/Lib/csharp/std_auto_ptr.i index d7e5f167e..1d91c9872 100644 --- a/Lib/csharp/std_auto_ptr.i +++ b/Lib/csharp/std_auto_ptr.i @@ -1,5 +1,5 @@ /* - The typemaps here allow to handle functions returning std::auto_ptr<>, + The typemaps here allow handling functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). diff --git a/Lib/csharp/wchar.i b/Lib/csharp/wchar.i index 79fb5a8cf..1ece767da 100644 --- a/Lib/csharp/wchar.i +++ b/Lib/csharp/wchar.i @@ -53,7 +53,7 @@ SWIGEXPORT void SWIGSTDCALL SWIGRegisterWStringCallback_$module(SWIG_CSharpWStri // wchar_t %typemap(ctype) wchar_t "wchar_t" -%typemap(imtype) wchar_t "char" +%typemap(imtype) wchar_t "char" // Requires adding CharSet=CharSet.Unicode to the DllImport to correctly marshal Unicode characters %typemap(cstype) wchar_t "char" %typemap(csin) wchar_t "$csinput" @@ -92,7 +92,7 @@ SWIGEXPORT void SWIGSTDCALL SWIGRegisterWStringCallback_$module(SWIG_CSharpWStri } %} %typemap(csvarout, excode=SWIGEXCODE2) wchar_t * %{ get { - string ret = $imcall;$excode + string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringUni($imcall);$excode return ret; } %} diff --git a/Lib/d/wrapperloader.swg b/Lib/d/wrapperloader.swg index b3c1d0dcf..67e03bfc8 100644 --- a/Lib/d/wrapperloader.swg +++ b/Lib/d/wrapperloader.swg @@ -40,9 +40,10 @@ private { } else { version(D_Version2) { static import std.conv; + } else { + static import std.c.string; } static import std.string; - static import std.c.string; } version(D_Version2) { @@ -112,7 +113,7 @@ private { version(Tango) { import tango.sys.Common; } else version(linux) { - import std.c.linux.linux; + import core.sys.posix.dlfcn; } else { extern(C) { const RTLD_NOW = 2; diff --git a/Lib/exception.i b/Lib/exception.i index ee9ce9bc6..7508b409b 100644 --- a/Lib/exception.i +++ b/Lib/exception.i @@ -12,10 +12,20 @@ %insert("runtime") "swigerrors.swg" -#ifdef SWIGPHP7 +#ifdef SWIGPHP %{ -#include "zend_exceptions.h" -#define SWIG_exception(code, msg) do { zend_throw_exception(NULL, (char*)msg, code); goto thrown; } while (0) +#if PHP_MAJOR >= 8 +# define SWIG_HANDLE_VALUE_ERROR_FOR_PHP8 code == SWIG_ValueError ? zend_ce_value_error : +#else +# define SWIG_HANDLE_VALUE_ERROR_FOR_PHP8 +#endif +#define SWIG_exception(code, msg) do { zend_throw_exception( \ + code == SWIG_TypeError ? zend_ce_type_error : \ + SWIG_HANDLE_VALUE_ERROR_FOR_PHP8 \ + code == SWIG_DivisionByZero ? zend_ce_division_by_zero_error : \ + code == SWIG_SyntaxError ? zend_ce_parse_error : \ + code == SWIG_OverflowError ? zend_ce_arithmetic_error : \ + NULL, msg, code); SWIG_fail; } while (0) %} #endif diff --git a/Lib/go/goruntime.swg b/Lib/go/goruntime.swg index 269a4eefd..c3401b1a8 100644 --- a/Lib/go/goruntime.swg +++ b/Lib/go/goruntime.swg @@ -23,46 +23,38 @@ static void* Swig_malloc(int c) { %} -#if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ #include %} -#endif #if SWIGGO_INTGO_SIZE == 32 %insert(runtime) %{ typedef int intgo; typedef unsigned int uintgo; %} -#if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef int intgo; typedef unsigned int uintgo; %} -#endif #elif SWIGGO_INTGO_SIZE == 64 %insert(runtime) %{ typedef long long intgo; typedef unsigned long long uintgo; %} -#if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef long long intgo; typedef unsigned long long uintgo; %} -#endif #else %insert(runtime) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} -#if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} #endif -#endif #ifndef SWIGGO_GCCGO // Set the host compiler struct attribute that will be @@ -89,8 +81,6 @@ typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} -#ifdef SWIGGO_CGO - %insert(cgo_comment_typedefs) %{ typedef struct { char *p; intgo n; } _gostring_; @@ -98,91 +88,7 @@ typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} -#endif - -#ifndef SWIGGO_GCCGO -/* Boilerplate for C/C++ code when using 6g/8g. This code is compiled - with gcc. */ -%insert(runtime) %{ - -#define swiggo_size_assert_eq(x, y, name) typedef char name[(x-y)*(x-y)*-2+1]; -#define swiggo_size_assert(t, n) swiggo_size_assert_eq(sizeof(t), n, swiggo_sizeof_##t##_is_not_##n) - -swiggo_size_assert(char, 1) -swiggo_size_assert(short, 2) -swiggo_size_assert(int, 4) -typedef long long swiggo_long_long; -swiggo_size_assert(swiggo_long_long, 8) -swiggo_size_assert(float, 4) -swiggo_size_assert(double, 8) - -#ifdef __cplusplus -extern "C" { -#endif -extern void crosscall2(void (*fn)(void *, int), void *, int); -extern char* _cgo_topofstack(void) __attribute__ ((weak)); -extern void _cgo_allocate(void *, int); -extern void _cgo_panic(void *, int); -#ifdef __cplusplus -} -#endif - -static char *_swig_topofstack() { - if (_cgo_topofstack) { - return _cgo_topofstack(); - } else { - return 0; - } -} - -static void _swig_gopanic(const char *p) { - struct { - const char *p; - } SWIGSTRUCTPACKED a; - a.p = p; - crosscall2(_cgo_panic, &a, (int) sizeof a); -} - -%} - -#if !SWIGGO_CGO - -/* This is here for backward compatibility, but it will not work - with Go 1.5 or later. Do not use it in new code. */ -%insert(runtime) %{ - -static void *_swig_goallocate(size_t len) { - struct { - size_t len; - void *ret; - } SWIGSTRUCTPACKED a; - a.len = len; - crosscall2(_cgo_allocate, &a, (int) sizeof a); - return a.ret; -} - -%} - -#endif - -#if !SWIGGO_CGO - -/* Boilerplate for C code when using 6g/8g. This code is compiled - with 6c/8c. */ -%insert(gc_header) %{ -#include "runtime.h" -#include "cgocall.h" - -#pragma dataflag 16 -static void *cgocall = runtime·cgocall; -#pragma dataflag 16 -void *·_cgo_runtime_cgocall = &cgocall; - -%} - -#endif - -#else +#ifdef SWIGGO_GCCGO /* Boilerplate for C/C++ code when using gccgo. */ %insert(runtime) %{ @@ -201,115 +107,12 @@ extern void _cgo_panic(const char *); #define _swig_gopanic _cgo_panic %} -#if !SWIGGO_CGO - -%insert(runtime) %{ - -/* Implementations of SwigCgocall and friends for different versions - of gccgo. The Go code will call these functions using C names with - a prefix of the module name. The implementations here call the - routine in libgo. The routines to call vary depending on the gccgo - version. We assume that the version of gcc used to compile this - file is the same as the version of gccgo. */ - -#ifdef __cplusplus -extern "C" { #endif -#define SWIG_GCC_VERSION \ - (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) - -#if SWIG_GCC_VERSION < 40700 -#define SwigDoCgocall() -#define SwigDoCgocallDone() -#define SwigDoCgocallBack() -#define SwigDoCgocallBackDone() -#elif SWIG_GCC_VERSION == 40700 -void SwigDoCgocall(void) __asm__("libgo_syscall.syscall.Entersyscall"); -void SwigDoCgocallDone(void) __asm__("libgo_syscall.syscall.Exitsyscall"); -void SwigDoCgocallBack(void) __asm__("libgo_syscall.syscall.Exitsyscall"); -void SwigDoCgocallBackDone(void) __asm__("libgo_syscall.syscall.Entersyscall"); -#else -void SwigDoCgocall(void) __asm__("syscall.Cgocall"); -void SwigDoCgocallDone(void) __asm__("syscall.CgocallDone"); -void SwigDoCgocallBack(void) __asm__("syscall.CgocallBack"); -void SwigDoCgocallBackDone(void) __asm__("syscall.CgocallBackDone"); -#endif - -#define SWIGSTRINGIFY2(s) #s -#define SWIGSTRINGIFY(s) SWIGSTRINGIFY2(s) - -void SwigCgocall() - __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocall"); -void SwigCgocall() { - SwigDoCgocall(); -} - -void SwigCgocallDone() - __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallDone"); -void SwigCgocallDone() { - SwigDoCgocallDone(); -} - -void SwigCgocallBack() - __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBack"); -void SwigCgocallBack() { - SwigDoCgocallBack(); -} - -void SwigCgocallBackDone() - __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBackDone"); -void SwigCgocallBackDone() { - SwigDoCgocallBackDone(); -} - -#undef SWIGSTRINGIFY -#undef SWIGSTRINGIFY2 - -#ifdef __cplusplus -} -#endif - -%} - -#endif - -#endif - -#if !SWIGGO_CGO - -%insert(runtime) %{ - -/* This is here for backward compatibility, but it will not work - with Go 1.5 or later. Do not use it in new code. */ -static _gostring_ _swig_makegostring(const char *p, size_t l) { - _gostring_ ret; - ret.p = (char*)_swig_goallocate(l + 1); - memcpy(ret.p, p, l); - ret.n = l; - return ret; -} - -%} - -#endif - -%insert(runtime) %{ - -#define SWIG_contract_assert(expr, msg) \ - if (!(expr)) { _swig_gopanic(msg); } else -%} - #ifndef SWIGGO_GCCGO %go_import("unsafe", _ "runtime/cgo") -#if !SWIGGO_CGO -%insert(go_header) %{ -var _cgo_runtime_cgocall func(unsafe.Pointer, uintptr) -%} -#endif - #else %go_import("syscall", "unsafe") diff --git a/Lib/guile/typemaps.i b/Lib/guile/typemaps.i index cfccced88..84a754d8b 100644 --- a/Lib/guile/typemaps.i +++ b/Lib/guile/typemaps.i @@ -378,26 +378,26 @@ typedef unsigned long SCM; #define %argument_fail(code, type, name, argn) scm_wrong_type_arg((char *) FUNC_NAME, argn, $input); #define %as_voidptr(ptr) (void*)(ptr) -%typemap(in) SWIGTYPE (CLASS::*) { - int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); +%typemap(in) SWIGTYPE (CLASS::*) { + int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($1), $descriptor); if (!SWIG_IsOK(res)) { - %argument_fail(res,"$type",$symname, $argnum); + %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { - %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); + %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($1), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { - int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); + int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($1), $descriptor); if (!SWIG_IsOK(res)) { scm_wrong_type_arg((char *) FUNC_NAME, 1, $input); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { - %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); + %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($1), $descriptor)); } /* ------------------------------------------------------------ diff --git a/Lib/java/arrays_java.i b/Lib/java/arrays_java.i index dd38438a3..a57da64b4 100644 --- a/Lib/java/arrays_java.i +++ b/Lib/java/arrays_java.i @@ -104,7 +104,7 @@ JAVA_ARRAYS_DECL(int, jint, Int, Int) /* int[] */ JAVA_ARRAYS_DECL(unsigned int, jlong, Long, Uint) /* unsigned int[] */ JAVA_ARRAYS_DECL(long, jint, Int, Long) /* long[] */ JAVA_ARRAYS_DECL(unsigned long, jlong, Long, Ulong) /* unsigned long[] */ -JAVA_ARRAYS_DECL(jlong, jlong, Long, Longlong) /* long long[] */ +JAVA_ARRAYS_DECL(long long, jlong, Long, Longlong) /* long long[] */ JAVA_ARRAYS_DECL(float, jfloat, Float, Float) /* float[] */ JAVA_ARRAYS_DECL(double, jdouble, Double, Double) /* double[] */ @@ -128,7 +128,7 @@ JAVA_ARRAYS_IMPL(int, jint, Int, Int) /* int[] */ JAVA_ARRAYS_IMPL(unsigned int, jlong, Long, Uint) /* unsigned int[] */ JAVA_ARRAYS_IMPL(long, jint, Int, Long) /* long[] */ JAVA_ARRAYS_IMPL(unsigned long, jlong, Long, Ulong) /* unsigned long[] */ -JAVA_ARRAYS_IMPL(jlong, jlong, Long, Longlong) /* long long[] */ +JAVA_ARRAYS_IMPL(long long, jlong, Long, Longlong) /* long long[] */ JAVA_ARRAYS_IMPL(float, jfloat, Float, Float) /* float[] */ JAVA_ARRAYS_IMPL(double, jdouble, Double, Double) /* double[] */ diff --git a/Lib/java/director.swg b/Lib/java/director.swg index d3bd162ec..e911a3da7 100644 --- a/Lib/java/director.swg +++ b/Lib/java/director.swg @@ -215,6 +215,15 @@ namespace Swig { } }; + struct SwigDirectorMethod { + const char *name; + const char *desc; + jmethodID methid; + SwigDirectorMethod(JNIEnv *jenv, jclass baseclass, const char *name, const char *desc) : name(name), desc(desc) { + methid = jenv->GetMethodID(baseclass, name, desc); + } + }; + /* Java object wrapper */ JObjectWrapper swig_self_; @@ -238,6 +247,11 @@ namespace Swig { } } + jclass swig_new_global_ref(JNIEnv *jenv, const char *classname) { + jclass clz = jenv->FindClass(classname); + return clz ? (jclass)jenv->NewGlobalRef(clz) : 0; + } + public: Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() { /* Acquire the Java VM pointer */ diff --git a/Lib/java/java.swg b/Lib/java/java.swg index e9309331a..8f95f3a3b 100644 --- a/Lib/java/java.swg +++ b/Lib/java/java.swg @@ -1196,6 +1196,7 @@ Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javaimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javainterfaces) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" +%typemap(javainterfacemodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public interface" /* javabody typemaps */ diff --git a/Lib/java/javahead.swg b/Lib/java/javahead.swg index 685bba198..1fc327909 100644 --- a/Lib/java/javahead.swg +++ b/Lib/java/javahead.swg @@ -5,7 +5,7 @@ * ----------------------------------------------------------------------------- */ -/* JNI function calls require different calling conventions for C and C++. These JCALL macros are used so +/* JNI function calls require different calling conventions for C and C++. These JCALL macros are used so * that the same typemaps can be used for generating code for both C and C++. The SWIG preprocessor can expand * the macros thereby generating the correct calling convention. It is thus essential that all typemaps that * use the macros are not within %{ %} brackets as they won't be run through the SWIG preprocessor. */ @@ -30,18 +30,6 @@ #endif %insert(runtime) %{ -/* Fix for jlong on some versions of gcc on Windows */ -#if defined(__GNUC__) && !defined(__INTEL_COMPILER) - typedef long long __int64; -#endif - -/* Fix for jlong on 64-bit x86 Solaris */ -#if defined(__x86_64) -# ifdef _LP64 -# undef _LP64 -# endif -#endif - #include #include #include @@ -50,15 +38,16 @@ %insert(runtime) %{ /* Support for throwing Java exceptions */ typedef enum { - SWIG_JavaOutOfMemoryError = 1, - SWIG_JavaIOException, - SWIG_JavaRuntimeException, + SWIG_JavaOutOfMemoryError = 1, + SWIG_JavaIOException, + SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaDirectorPureVirtual, - SWIG_JavaUnknownError + SWIG_JavaUnknownError, + SWIG_JavaIllegalStateException, } SWIG_JavaExceptionCodes; typedef struct { @@ -80,6 +69,7 @@ static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionC { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, + { SWIG_JavaIllegalStateException, "java/lang/IllegalStateException" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; diff --git a/Lib/java/std_auto_ptr.i b/Lib/java/std_auto_ptr.i index 9b3cd7315..69ac2841f 100644 --- a/Lib/java/std_auto_ptr.i +++ b/Lib/java/std_auto_ptr.i @@ -1,5 +1,5 @@ /* - The typemaps here allow to handle functions returning std::auto_ptr<>, + The typemaps here allow handling functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). diff --git a/Lib/java/swiginterface.i b/Lib/java/swiginterface.i index 334464157..0a0f7806a 100644 --- a/Lib/java/swiginterface.i +++ b/Lib/java/swiginterface.i @@ -28,7 +28,7 @@ } %typemap(javaout) CTYPE *const& { long cPtr = $jnicall; - return (cPtr == 0) ? null : ($javainterfacename)new $javaclassname(cPtr, $owner); + return (cPtr == 0) ? null : ($*javainterfacename)new $*javaclassname(cPtr, $owner); } %typemap(javadirectorin) CTYPE "($&javainterfacename)new $&javaclassname($jniinput, true)" diff --git a/Lib/javascript/jsc/arrays_javascript.i b/Lib/javascript/jsc/arrays_javascript.i index b9199d86b..713b7ef23 100644 --- a/Lib/javascript/jsc/arrays_javascript.i +++ b/Lib/javascript/jsc/arrays_javascript.i @@ -21,34 +21,39 @@ * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ -%fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} + +%fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} +%fragment("SWIG_JSCOutInt", "header", fragment=SWIG_From_frag(int)) {} +%fragment("SWIG_JSCOutNumber", "header", fragment=SWIG_From_frag(double)) {} -%typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] - (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { +%define JAVASCRIPT_ARRAYS_IN_DECL(NAME, CTYPE, ANY, ANYLENGTH) + +%typemap(in, fragment=NAME) CTYPE[ANY] { if (JSValueIsObject(context, $input)) { + int i; // Convert into Array - array = JSValueToObject(context, $input, NULL); + JSObjectRef array = JSValueToObject(context, $input, NULL); - length = $1_dim0; + int length = ANYLENGTH; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { - jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); + JSValueRef jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); + $*1_ltype temp; // Get primitive value from JSObject - res = SWIG_AsVal(int)(jsvalue, &temp); + int res = SWIG_AsVal(CTYPE)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } - } else { @@ -56,68 +61,34 @@ } } -%typemap(freearg) int[], int[ANY] { +%typemap(freearg) CTYPE[ANY] { free($1); } -%typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) -{ - length = $1_dim0; +%enddef + +%define JAVASCRIPT_ARRAYS_OUT_DECL(NAME, CTYPE) + +%typemap(out, fragment=NAME) CTYPE[ANY] { + int length = $1_dim0; JSValueRef values[length]; + int i; for (i = 0; i < length; i++) { - values[i] = SWIG_From(int)($1[i]); + values[i] = SWIG_From(CTYPE)($1[i]); } $result = JSObjectMakeArray(context, length, values, NULL); } -%typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] - (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { - if (JSValueIsObject(context, $input)) - { - // Convert into Array - array = JSValueToObject(context, $input, NULL); +%enddef - length = $1_dim0; +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetIntProperty", int, , SWIGJSC_ArrayLength(context, array)) +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetIntProperty", int, ANY, $1_dim0) +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetNumberProperty", double, , SWIGJSC_ArrayLength(context, array)) +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetNumberProperty", double, ANY, $1_dim0) - $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); +JAVASCRIPT_ARRAYS_OUT_DECL("SWIG_JSCOutInt", int) +JAVASCRIPT_ARRAYS_OUT_DECL("SWIG_JSCOutNumber", double) - // Get each element from array - for (i = 0; i < length; i++) - { - jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); - - // Get primitive value from JSObject - res = SWIG_AsVal(double)(jsvalue, &temp); - if (!SWIG_IsOK(res)) - { - SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); - } - arg$argnum[i] = temp; - } - - } - else - { - SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); - } -} - -%typemap(freearg) double[], double[ANY] { - free($1); -} - -%typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) -{ - length = $1_dim0; - JSValueRef values[length]; - - for (i = 0; i < length; i++) - { - values[i] = SWIG_From(double)($1[i]); - } - - $result = JSObjectMakeArray(context, length, values, NULL); -} diff --git a/Lib/javascript/jsc/ccomplex.i b/Lib/javascript/jsc/ccomplex.i index 50f0f95fe..e58dbf719 100644 --- a/Lib/javascript/jsc/ccomplex.i +++ b/Lib/javascript/jsc/ccomplex.i @@ -12,15 +12,16 @@ #include %} +#define complex _Complex /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) -%swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); -%swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); -%swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); +%swig_cplxflt_convn(float _Complex, CCplxConst, creal, cimag); +%swig_cplxdbl_convn(double _Complex, CCplxConst, creal, cimag); +%swig_cplxdbl_convn(_Complex, CCplxConst, creal, cimag); /* declaring the typemaps */ -%typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); -%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); -%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float _Complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double _Complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, _Complex); diff --git a/Lib/javascript/jsc/javascriptcomplex.swg b/Lib/javascript/jsc/javascriptcomplex.swg index 7be120b3b..dcc205dbd 100644 --- a/Lib/javascript/jsc/javascriptcomplex.swg +++ b/Lib/javascript/jsc/javascriptcomplex.swg @@ -127,7 +127,7 @@ SWIG_AsVal_dec(Type)(JSValueRef o, Type *val) float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { - if (val) *val = Constructor(re, 0.0); + if (val) *val = Constructor(re, 0.0f); return res; } } diff --git a/Lib/javascript/jsc/javascriptinit.swg b/Lib/javascript/jsc/javascriptinit.swg index a32ba336c..b0138b39a 100644 --- a/Lib/javascript/jsc/javascriptinit.swg +++ b/Lib/javascript/jsc/javascriptinit.swg @@ -1,14 +1,59 @@ %insert(init) %{ SWIGRUNTIME void -SWIG_JSC_SetModule(swig_module_info *swig_module) {} +SWIG_JSC_SetModule(JSGlobalContextRef context, swig_module_info *swig_module) { + JSObjectRef globalObject; + JSStringRef moduleName; + JSClassDefinition classDef; + JSClassRef classRef; + JSObjectRef object; + if(context == 0){ + return; + } + + globalObject = JSContextGetGlobalObject(context); + moduleName = JSStringCreateWithUTF8CString("swig_module_info_data"); + + classDef = kJSClassDefinitionEmpty; + classRef = JSClassCreate(&classDef); + + object = JSObjectMake(context, classRef, NULL); + JSObjectSetPrivate(object, (void*)swig_module); + + JSObjectSetProperty(context, globalObject, moduleName, object, kJSPropertyAttributeNone, NULL); + + JSClassRelease(classRef); + JSStringRelease(moduleName); +} SWIGRUNTIME swig_module_info * -SWIG_JSC_GetModule(void) { - return 0; +SWIG_JSC_GetModule(JSGlobalContextRef context) { + JSObjectRef globalObject; + JSStringRef moduleName; + JSValueRef value; + JSObjectRef object; + + if(context == 0){ + return 0; + } + + globalObject = JSContextGetGlobalObject(context); + moduleName = JSStringCreateWithUTF8CString("swig_module_info_data"); + + if(JSObjectHasProperty(context, globalObject, moduleName) == false) { + JSStringRelease(moduleName); + return 0; + } + + value = JSObjectGetProperty(context, globalObject, moduleName, NULL); + object = JSValueToObject(context, value, NULL); + JSStringRelease(moduleName); + + return (swig_module_info*)JSObjectGetPrivate(object); } -#define SWIG_GetModule(clientdata) SWIG_JSC_GetModule() -#define SWIG_SetModule(clientdata, pointer) SWIG_JSC_SetModule(pointer) +#define SWIG_GetModule(clientdata) SWIG_JSC_GetModule(clientdata) +#define SWIG_SetModule(clientdata, pointer) SWIG_JSC_SetModule(clientdata, pointer) +#define SWIG_INIT_CLIENT_DATA_TYPE JSGlobalContextRef %} %insert(init) "swiginit.swg" @@ -26,7 +71,7 @@ extern "C" { #endif bool SWIGJSC_INIT (JSGlobalContextRef context, JSObjectRef *exports) { - SWIG_InitializeModule(0); + SWIG_InitializeModule(context); %} /* ----------------------------------------------------------------------------- diff --git a/Lib/javascript/jsc/javascriptrun.swg b/Lib/javascript/jsc/javascriptrun.swg index 4a8fc5be5..d092ea4ab 100644 --- a/Lib/javascript/jsc/javascriptrun.swg +++ b/Lib/javascript/jsc/javascriptrun.swg @@ -117,27 +117,25 @@ SWIGRUNTIME int SWIG_JSC_ConvertInstancePtr(JSContextRef context, JSObjectRef ob SwigPrivData *cdata; cdata = (SwigPrivData *) JSObjectGetPrivate(objRef); - if(cdata == NULL) { + if (cdata == NULL) { return SWIG_ERROR; } - if(cdata->info != info) { - bool type_valid = false; - swig_cast_info *t = info->cast; - while(t != NULL) { - if(t->type == cdata->info) { - type_valid = true; - break; - } - t = t->next; - } - if(!type_valid) { - return SWIG_TypeError; + assert(ptr); + *ptr = NULL; + if (cdata->info == info) { + *ptr = cdata->swigCObject; + } else { + swig_cast_info *tc = SWIG_TypeCheckStruct(cdata->info, info); + if (tc) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc, cdata->swigCObject, &newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } else { + return SWIG_ERROR; } } - *ptr = cdata->swigCObject; - - if(flags & SWIG_POINTER_DISOWN) { + if (flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } @@ -317,6 +315,30 @@ unsigned int SWIGJSC_ArrayLength(JSContextRef context, JSObjectRef arr) { } } +SWIGRUNTIME +bool SWIGJSC_ValueIsArray(JSContextRef context, JSValueRef value) { + if (JSValueIsObject(context, value)) { + static JSStringRef ArrayString = NULL; + static JSStringRef isArrayString = NULL; + JSObjectRef array = NULL; + JSObjectRef isArray = NULL; + JSValueRef retval = NULL; + + if (!ArrayString) + ArrayString = JSStringCreateWithUTF8CString("Array"); + if (!isArrayString) + isArrayString = JSStringCreateWithUTF8CString("isArray"); + + array = (JSObjectRef)JSObjectGetProperty(context, JSContextGetGlobalObject(context), ArrayString, NULL); + isArray = (JSObjectRef)JSObjectGetProperty(context, array, isArrayString, NULL); + retval = JSObjectCallAsFunction(context, isArray, NULL, 1, &value, NULL); + + if (JSValueIsBoolean(context, retval)) + return JSValueToBoolean(context, retval); + } + return false; +} + SWIGRUNTIME JSValueRef SWIGJSC_AppendOutput(JSContextRef context, JSValueRef value, JSValueRef obj) { JSObjectRef arr; @@ -324,6 +346,8 @@ JSValueRef SWIGJSC_AppendOutput(JSContextRef context, JSValueRef value, JSValueR if (JSValueIsUndefined(context, value)) { arr = JSObjectMakeArray(context, 0, 0, 0); + } else if (!SWIGJSC_ValueIsArray(context, value)) { + arr = JSObjectMakeArray(context, 1, &value, 0); } else { arr = JSValueToObject(context, value, 0); } diff --git a/Lib/javascript/jsc/javascriptruntime.swg b/Lib/javascript/jsc/javascriptruntime.swg index 8f8390890..a626390cc 100644 --- a/Lib/javascript/jsc/javascriptruntime.swg +++ b/Lib/javascript/jsc/javascriptruntime.swg @@ -11,6 +11,7 @@ #include #include #include +#include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ diff --git a/Lib/javascript/v8/arrays_javascript.i b/Lib/javascript/v8/arrays_javascript.i index 22b50be8f..6dc7e4b9b 100644 --- a/Lib/javascript/v8/arrays_javascript.i +++ b/Lib/javascript/v8/arrays_javascript.i @@ -21,105 +21,66 @@ * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ -%fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} + +%fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} +%fragment("SWIG_JSCOutInt", "header", fragment=SWIG_From_frag(int)) {} +%fragment("SWIG_JSCOutNumber", "header", fragment=SWIG_From_frag(double)) {} -%typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] - (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { - if ($input->IsArray()) - { +%define JAVASCRIPT_ARRAYS_IN_DECL(NAME, CTYPE, ANY, ANYLENGTH) + +%typemap(in, fragment=NAME) CTYPE[ANY] { + if ($input->IsArray()) { // Convert into Array - array = v8::Local::Cast($input); + v8::Local array = v8::Local::Cast($input); - length = $1_dim0; + int length = ANYLENGTH; - $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); + $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array - for (i = 0; i < length; i++) - { - jsvalue = array->Get(i); + for (int i = 0; i < length; i++) { + v8::Local jsvalue = SWIGV8_ARRAY_GET(array, i); + $*1_ltype temp; // Get primitive value from JSObject - res = SWIG_AsVal(int)(jsvalue, &temp); - if (!SWIG_IsOK(res)) - { + int res = SWIG_AsVal(CTYPE)(jsvalue, &temp); + if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } - - } - else - { - SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); + } else { + SWIG_exception_fail(SWIG_ERROR, "$input is not an array"); } } -%typemap(freearg) int[], int[ANY] { - free($1); +%typemap(freearg) CTYPE[ANY] { + free($1); } -%typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) -{ - length = $1_dim0; - v8::Local array = v8::Array::New(length); +%enddef - for (i = 0; i < length; i++) - { - array->Set(i, SWIG_From(int)($1[i])); +%define JAVASCRIPT_ARRAYS_OUT_DECL(NAME, CTYPE) + +%typemap(out, fragment=NAME) CTYPE[ANY] { + int length = $1_dim0; + v8::Local array = SWIGV8_ARRAY_NEW(length); + + for (int i = 0; i < length; i++) { + SWIGV8_ARRAY_SET(array, i, SWIG_From(CTYPE)($1[i])); } - $result = array; } -%typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] - (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { - if ($input->IsArray()) - { - // Convert into Array - array = v8::Local::Cast($input); +%enddef - length = $1_dim0; +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetIntProperty", int, , array->Length()) +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetIntProperty", int, ANY, $1_dim0) +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetNumberProperty", double, , array->Length()) +JAVASCRIPT_ARRAYS_IN_DECL("SWIG_JSCGetNumberProperty", double, ANY, $1_dim0) - $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); +JAVASCRIPT_ARRAYS_OUT_DECL("SWIG_JSCOutInt", int) +JAVASCRIPT_ARRAYS_OUT_DECL("SWIG_JSCOutNumber", double) - // Get each element from array - for (i = 0; i < length; i++) - { - jsvalue = array->Get(i); - - // Get primitive value from JSObject - res = SWIG_AsVal(double)(jsvalue, &temp); - if (!SWIG_IsOK(res)) - { - SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); - } - arg$argnum[i] = temp; - } - - } - else - { - SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); - } -} - -%typemap(freearg) double[], double[ANY] { - free($1); -} - -%typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) -{ - length = $1_dim0; - v8::Local array = v8::Array::New(length); - - for (i = 0; i < length; i++) - { - array->Set(i, SWIG_From(double)($1[i])); - } - - - $result = array; -} diff --git a/Lib/javascript/v8/ccomplex.i b/Lib/javascript/v8/ccomplex.i index 8eda920bb..e58dbf719 100644 --- a/Lib/javascript/v8/ccomplex.i +++ b/Lib/javascript/v8/ccomplex.i @@ -6,21 +6,22 @@ * ----------------------------------------------------------------------------- */ -%include +%include %{ #include %} +#define complex _Complex /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) -%swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); -%swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); -%swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); +%swig_cplxflt_convn(float _Complex, CCplxConst, creal, cimag); +%swig_cplxdbl_convn(double _Complex, CCplxConst, creal, cimag); +%swig_cplxdbl_convn(_Complex, CCplxConst, creal, cimag); /* declaring the typemaps */ -%typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); -%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); -%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float _Complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double _Complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, _Complex); diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg index c4aaf3db0..2abed9488 100644 --- a/Lib/javascript/v8/javascriptcode.swg +++ b/Lib/javascript/v8/javascriptcode.swg @@ -10,9 +10,10 @@ %fragment("js_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); - - v8::Handle self = args.Holder(); + + SWIGV8_OBJECT self = args.Holder(); $jslocals + if(self->InternalFieldCount() < 1) SWIG_exception_fail(SWIG_ERROR, "Illegal call of constructor $jswrapper."); if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode @@ -53,7 +54,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); OverloadErrorHandler errorHandler; - v8::Handle self; + SWIGV8_VALUE self; // switch all cases by means of series of if-returns. $jsdispatchcases @@ -77,9 +78,10 @@ fail: %fragment("js_overloaded_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) { SWIGV8_HANDLESCOPE(); - - v8::Handle self = args.Holder(); + + SWIGV8_OBJECT self = args.Holder(); $jslocals + if(self->InternalFieldCount() < 1) SWIG_exception_fail(SWIG_ERROR, "Illegal call of constructor $jswrapper."); if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode @@ -226,7 +228,7 @@ static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8Pr #endif SWIGV8_HANDLESCOPE(); - v8::Handle jsresult; + SWIGV8_VALUE jsresult; $jslocals $jscode SWIGV8_RETURN_INFO(jsresult, info); @@ -271,7 +273,7 @@ fail: static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); - v8::Handle jsresult; + SWIGV8_VALUE jsresult; $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); @@ -296,7 +298,7 @@ fail: static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); - v8::Handle jsresult; + SWIGV8_VALUE jsresult; OverloadErrorHandler errorHandler; $jscode @@ -320,7 +322,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler { SWIGV8_HANDLESCOPE(); - v8::Handle jsresult; + SWIGV8_VALUE jsresult; $jslocals $jscode SWIGV8_RETURN(jsresult); @@ -374,7 +376,7 @@ fail: %fragment("jsv8_define_class_template", "templates") %{ /* Name: $jsmangledname, Type: $jsmangledtype, Dtor: $jsdtor */ - v8::Handle $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname"); + SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname"); SWIGV8_SET_CLASS_TEMPL($jsmangledname_clientData.class_templ, $jsmangledname_class); $jsmangledname_clientData.dtor = $jsdtor; if (SWIGTYPE_$jsmangledtype->clientdata == 0) { @@ -420,11 +422,18 @@ fail: %fragment("jsv8_create_class_instance", "templates") %{ /* Class: $jsname ($jsmangledname) */ - v8::Handle $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname"); + SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname"); $jsmangledname_class_0->SetCallHandler($jsctor); $jsmangledname_class_0->Inherit($jsmangledname_class); +#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) $jsmangledname_class_0->SetHiddenPrototype(true); v8::Handle $jsmangledname_obj = $jsmangledname_class_0->GetFunction(); +#elif (SWIG_V8_VERSION < 0x0704) + $jsmangledname_class_0->SetHiddenPrototype(true); + v8::Local $jsmangledname_obj = $jsmangledname_class_0->GetFunction(); +#else + v8::Local $jsmangledname_obj = $jsmangledname_class_0->GetFunction(context).ToLocalChecked(); +#endif %} /* ----------------------------------------------------------------------------- @@ -435,7 +444,12 @@ fail: * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_class", "templates") %{ +#if (V8_MAJOR_VERSION-0) < 5 $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); +#else + SWIGV8_MAYBE_CHECK($jsparent_obj->Set(context, SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj)); +#endif + %} /* ----------------------------------------------------------------------------- @@ -444,7 +458,7 @@ fail: * ----------------------------------------------------------------------------- */ %fragment("jsv8_create_namespace", "templates") %{ - v8::Handle $jsmangledname_obj = SWIGV8_OBJECT_NEW(); + SWIGV8_OBJECT $jsmangledname_obj = SWIGV8_OBJECT_NEW(); %} /* ----------------------------------------------------------------------------- @@ -455,7 +469,11 @@ fail: * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_namespace", "templates") %{ +#if (V8_MAJOR_VERSION-0) < 5 $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); +#else + SWIGV8_MAYBE_CHECK($jsparent_obj->Set(context, SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj)); +#endif %} /* ----------------------------------------------------------------------------- @@ -491,7 +509,7 @@ fail: * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_function", "templates") %{ - SWIGV8_AddStaticFunction($jsparent_obj, "$jsname", $jswrapper); + SWIGV8_AddStaticFunction($jsparent_obj, "$jsname", $jswrapper, context); %} /* ----------------------------------------------------------------------------- @@ -505,5 +523,5 @@ fail: * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_variable", "templates") %{ - SWIGV8_AddStaticVariable($jsparent_obj, "$jsname", $jsgetter, $jssetter); + SWIGV8_AddStaticVariable($jsparent_obj, "$jsname", $jsgetter, $jssetter, context); %} diff --git a/Lib/javascript/v8/javascriptcomplex.swg b/Lib/javascript/v8/javascriptcomplex.swg index d3b4aaffa..7b3c5547e 100644 --- a/Lib/javascript/v8/javascriptcomplex.swg +++ b/Lib/javascript/v8/javascriptcomplex.swg @@ -12,15 +12,15 @@ %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(double)) { -SWIGINTERNINLINE v8::Handle +SWIGINTERNINLINE SWIGV8_VALUE SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) { SWIGV8_HANDLESCOPE_ESC(); - v8::Local vals = SWIGV8_ARRAY_NEW(); + v8::Local vals = SWIGV8_ARRAY_NEW(0); - vals->Set(0, SWIG_From(double)(Real(c))); - vals->Set(1, SWIG_From(double)(Imag(c))); + SWIGV8_ARRAY_SET(vals, 0, SWIG_From(double)(Real(c))); + SWIGV8_ARRAY_SET(vals, 1, SWIG_From(double)(Imag(c))); SWIGV8_ESCAPE(vals); } } @@ -32,30 +32,30 @@ SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int -SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) +SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { - v8::Handle array = v8::Handle::Cast(o); + SWIGV8_ARRAY array = SWIGV8_ARRAY::Cast(o); - if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); + if (array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; - res = SWIG_AsVal(double)(array->Get(0), &re); - if(!SWIG_IsOK(res)) { + res = SWIG_AsVal(double)(SWIGV8_ARRAY_GET(array, 0), &re); + if (!SWIG_IsOK(res)) { return SWIG_TypeError; } - res = SWIG_AsVal(double)(array->Get(1), &im); - if(!SWIG_IsOK(res)) { + res = SWIG_AsVal(double)(SWIGV8_ARRAY_GET(array, 1), &im); + if (!SWIG_IsOK(res)) { return SWIG_TypeError; } if (val) *val = Constructor(re, im); return SWIG_OK; - } else if(o->IsNumber()){ + } else if (o->IsNumber()) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { @@ -74,24 +74,24 @@ SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int -SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) +SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { - v8::Handle array = v8::Handle::Cast(o); + SWIGV8_ARRAY array = SWIGV8_ARRAY::Cast(o); - if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); + if (array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; - res = SWIG_AsVal(double)(array->Get(0), &re); - if(!SWIG_IsOK(res)) { + res = SWIG_AsVal(double)(SWIGV8_ARRAY_GET(array, 0), &re); + if (!SWIG_IsOK(res)) { return SWIG_TypeError; } - res = SWIG_AsVal(double)(array->Get(1), &im); - if(!SWIG_IsOK(res)) { + res = SWIG_AsVal(double)(SWIGV8_ARRAY_GET(array, 1), &im); + if (!SWIG_IsOK(res)) { return SWIG_TypeError; } @@ -102,7 +102,7 @@ SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) } else { return SWIG_OverflowError; } - } else if(o->IsNumber()){ + } else if (o->IsNumber()) { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg index 80fbd7aa1..fdbff000e 100644 --- a/Lib/javascript/v8/javascripthelpers.swg +++ b/Lib/javascript/v8/javascripthelpers.swg @@ -21,19 +21,19 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid; /** * Creates a class template for a class with specified initialization function. */ -SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const char* symbol) { +SWIGRUNTIME SWIGV8_FUNCTION_TEMPLATE SWIGV8_CreateClassTemplate(const char* symbol) { SWIGV8_HANDLESCOPE_ESC(); v8::Local class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID(); class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol)); - v8::Handle inst_templ = class_templ->InstanceTemplate(); + SWIGV8_OBJECT_TEMPLATE inst_templ = class_templ->InstanceTemplate(); inst_templ->SetInternalFieldCount(1); - v8::Handle equals_templ = class_templ->PrototypeTemplate(); + SWIGV8_OBJECT_TEMPLATE equals_templ = class_templ->PrototypeTemplate(); equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals)); - v8::Handle cptr_templ = class_templ->PrototypeTemplate(); + SWIGV8_OBJECT_TEMPLATE cptr_templ = class_templ->PrototypeTemplate(); cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr)); SWIGV8_ESCAPE(class_templ); @@ -42,38 +42,43 @@ SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const ch /** * Registers a class method with given name for a given class template. */ -SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle class_templ, const char* symbol, +SWIGRUNTIME void SWIGV8_AddMemberFunction(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol, SwigV8FunctionCallback _func) { - v8::Handle proto_templ = class_templ->PrototypeTemplate(); + SWIGV8_OBJECT_TEMPLATE proto_templ = class_templ->PrototypeTemplate(); proto_templ->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)); } /** * Registers a class property with given name for a given class template. */ -SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Handle class_templ, const char* symbol, +SWIGRUNTIME void SWIGV8_AddMemberVariable(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol, SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { - v8::Handle proto_templ = class_templ->InstanceTemplate(); + SWIGV8_OBJECT_TEMPLATE proto_templ = class_templ->InstanceTemplate(); proto_templ->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); } /** * Registers a class method with given name for a given object. */ -SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Handle obj, const char* symbol, - const SwigV8FunctionCallback& _func) { +SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol, + const SwigV8FunctionCallback& _func, v8::Local context) { +#if (V8_MAJOR_VERSION-0) < 5 obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction()); +#else + SWIGV8_MAYBE_CHECK(obj->Set(context, SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction(context).ToLocalChecked())); +#endif } /** * Registers a class method with given name for a given object. */ -SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle obj, const char* symbol, - SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { +SWIGRUNTIME void SWIGV8_AddStaticVariable(SWIGV8_OBJECT obj, const char* symbol, + SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter, + v8::Local context) { #if (V8_MAJOR_VERSION-0) < 5 obj->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); #else - obj->SetAccessor(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW(symbol), getter, setter); + SWIGV8_MAYBE_CHECK(obj->SetAccessor(context, SWIGV8_SYMBOL_NEW(symbol), getter, setter)); #endif } diff --git a/Lib/javascript/v8/javascriptinit.swg b/Lib/javascript/v8/javascriptinit.swg index 8faf2dd8e..772189787 100644 --- a/Lib/javascript/v8/javascriptinit.swg +++ b/Lib/javascript/v8/javascriptinit.swg @@ -5,27 +5,27 @@ %insert(init) %{ SWIGRUNTIME void -SWIG_V8_SetModule(void *, swig_module_info *swig_module) { - v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); +SWIG_V8_SetModule(v8::Local context, swig_module_info *swig_module) { + v8::Local global_obj = context->Global(); v8::Local mod = SWIGV8_EXTERNAL_NEW(swig_module); assert(!mod.IsEmpty()); #if (V8_MAJOR_VERSION-0) < 5 global_obj->SetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data"), mod); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data")); - global_obj->SetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey, mod); + global_obj->SetPrivate(context, privateKey, mod); #endif } SWIGRUNTIME swig_module_info * -SWIG_V8_GetModule(void *) { - v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); +SWIG_V8_GetModule(v8::Local context) { + v8::Local global_obj = context->Global(); #if (V8_MAJOR_VERSION-0) < 5 v8::Local moduleinfo = global_obj->GetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data")); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data")); v8::Local moduleinfo; - if (!global_obj->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&moduleinfo)) + if (!global_obj->GetPrivate(context, privateKey).ToLocal(&moduleinfo)) return 0; #endif @@ -52,6 +52,7 @@ SWIG_V8_GetModule(void *) { #define SWIG_GetModule(clientdata) SWIG_V8_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_V8_SetModule(clientdata, pointer) +#define SWIG_INIT_CLIENT_DATA_TYPE v8::Local %} @@ -64,20 +65,20 @@ SWIG_V8_GetModule(void *) { %} %insert(init) %{ +#if !defined(NODE_MODULE_VERSION) || (NODE_MODULE_VERSION < 12) // Note: 'extern "C"'' disables name mangling which makes it easier to load the symbol manually -// TODO: is it ok to do that? -extern "C" -#if (NODE_MODULE_VERSION < 0x000C) -void SWIGV8_INIT (v8::Handle exports) +extern "C" void SWIGV8_INIT (SWIGV8_OBJECT exports_obj) +#elif (NODE_MODULE_VERSION < 64) +void SWIGV8_INIT (SWIGV8_OBJECT exports_obj, SWIGV8_VALUE /*module*/, void*) #else -void SWIGV8_INIT (v8::Handle exports, v8::Handle /*module*/) +void SWIGV8_INIT (SWIGV8_OBJECT exports_obj, SWIGV8_VALUE /*module*/, v8::Local context, void*) #endif { - SWIG_InitializeModule(static_cast(&exports)); +#if !defined(NODE_MODULE_VERSION) || NODE_MODULE_VERSION < 64 + v8::Local context = SWIGV8_CURRENT_CONTEXT(); +#endif - SWIGV8_HANDLESCOPE(); - - v8::Handle exports_obj = exports; + SWIG_InitializeModule(context); %} @@ -124,6 +125,10 @@ void SWIGV8_INIT (v8::Handle exports, v8::Handle /*modul } #if defined(BUILDING_NODE_EXTENSION) +#if (NODE_MODULE_VERSION < 64) NODE_MODULE($jsname, $jsname_initialize) +#else +NODE_MODULE_CONTEXT_AWARE($jsname, $jsname_initialize) +#endif #endif %} diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg index f76be983b..0af406b90 100644 --- a/Lib/javascript/v8/javascriptprimtypes.swg +++ b/Lib/javascript/v8/javascriptprimtypes.swg @@ -6,7 +6,7 @@ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE -v8::Handle +SWIGV8_VALUE SWIG_From_dec(bool)(bool value) { return SWIGV8_BOOLEAN_NEW(value); @@ -16,7 +16,7 @@ SWIG_From_dec(bool)(bool value) %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN -int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val) +int SWIG_AsVal_dec(bool)(SWIGV8_VALUE obj, bool *val) { if(!obj->IsBoolean()) { return SWIG_ERROR; @@ -31,7 +31,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val) %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE -v8::Handle SWIG_From_dec(int)(int value) +SWIGV8_VALUE SWIG_From_dec(int)(int value) { return SWIGV8_INT32_NEW(value); } @@ -39,7 +39,7 @@ v8::Handle SWIG_From_dec(int)(int value) %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERN -int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val) +int SWIG_AsVal_dec(int)(SWIGV8_VALUE valRef, int* val) { if (!valRef->IsNumber()) { return SWIG_TypeError; @@ -54,7 +54,7 @@ int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val) %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE -v8::Handle SWIG_From_dec(long)(long value) +SWIGV8_VALUE SWIG_From_dec(long)(long value) { return SWIGV8_NUMBER_NEW(value); } @@ -63,7 +63,7 @@ v8::Handle SWIG_From_dec(long)(long value) %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN -int SWIG_AsVal_dec(long)(v8::Handle obj, long* val) +int SWIG_AsVal_dec(long)(SWIGV8_VALUE obj, long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; @@ -79,17 +79,16 @@ int SWIG_AsVal_dec(long)(v8::Handle obj, long* val) %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE -v8::Handle SWIG_From_dec(unsigned long)(unsigned long value) +SWIGV8_VALUE SWIG_From_dec(unsigned long)(unsigned long value) { - return (value > LONG_MAX) ? - SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); + return SWIGV8_INTEGER_NEW_UNS(value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN -int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val) +int SWIG_AsVal_dec(unsigned long)(SWIGV8_VALUE obj, unsigned long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; @@ -115,7 +114,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val) fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE -v8::Handle SWIG_From_dec(long long)(long long value) +SWIGV8_VALUE SWIG_From_dec(long long)(long long value) { return SWIGV8_NUMBER_NEW(value); } @@ -128,7 +127,7 @@ v8::Handle SWIG_From_dec(long long)(long long value) fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN -int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val) +int SWIG_AsVal_dec(long long)(SWIGV8_VALUE obj, long long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; @@ -148,10 +147,9 @@ int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val) fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE -v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value) +SWIGV8_VALUE SWIG_From_dec(unsigned long long)(unsigned long long value) { - return (value > LONG_MAX) ? - SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); + return SWIGV8_INTEGER_NEW_UNS(value); } %#endif } @@ -162,7 +160,7 @@ v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN -int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long long *val) +int SWIG_AsVal_dec(unsigned long long)(SWIGV8_VALUE obj, unsigned long long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; @@ -185,7 +183,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long %fragment(SWIG_From_frag(double),"header") { SWIGINTERN -v8::Handle SWIG_From_dec(double) (double val) +SWIGV8_VALUE SWIG_From_dec(double) (double val) { return SWIGV8_NUMBER_NEW(val); } @@ -193,7 +191,7 @@ v8::Handle SWIG_From_dec(double) (double val) %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN -int SWIG_AsVal_dec(double)(v8::Handle obj, double *val) +int SWIG_AsVal_dec(double)(SWIGV8_VALUE obj, double *val) { if(!obj->IsNumber()) { return SWIG_TypeError; @@ -203,4 +201,3 @@ int SWIG_AsVal_dec(double)(v8::Handle obj, double *val) return SWIG_OK; } } - diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg index 2452f4040..2df342416 100644 --- a/Lib/javascript/v8/javascriptrun.swg +++ b/Lib/javascript/v8/javascriptrun.swg @@ -1,6 +1,7 @@ /* --------------------------------------------------------------------------- * These typedefs and defines are used to deal with v8 API changes * + * Useful table of versions: https://nodejs.org/en/download/releases/ * ---------------------------------------------------------------------------*/ // First v8 version that uses "SetWeak" and not "MakeWeak" @@ -9,8 +10,10 @@ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803) #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len) -#else +#elif (SWIG_V8_VERSION < 0x0704) #define SWIGV8_STRING_NEW2(cstr, len) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::String::kNormalString, len) +#else +#define SWIGV8_STRING_NEW2(cstr, len) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::NewStringType::kNormal, len)).ToLocalChecked() #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) @@ -51,12 +54,25 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_ADJUST_MEMORY(size) v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(size) #define SWIGV8_CURRENT_CONTEXT() v8::Isolate::GetCurrent()->GetCurrentContext() #define SWIGV8_THROW_EXCEPTION(err) v8::Isolate::GetCurrent()->ThrowException(err) -#define SWIGV8_STRING_NEW(str) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str) -#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym) +#if (SWIG_V8_VERSION < 0x0704) +#define SWIGV8_STRING_NEW(str) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str, v8::String::kNormalString) +#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::String::kNormalString) +#else +#define SWIGV8_STRING_NEW(str) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str, v8::NewStringType::kNormal)).ToLocalChecked() +#define SWIGV8_SYMBOL_NEW(sym) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::NewStringType::kNormal)).ToLocalChecked() +#endif +#endif + +#if (V8_MAJOR_VERSION-0) < 5 +#define SWIGV8_MAYBE_CHECK(maybe) maybe +#elif (SWIG_V8_VERSION < 0x0704) +#define SWIGV8_MAYBE_CHECK(maybe) maybe.FromJust() +#else +#define SWIGV8_MAYBE_CHECK(maybe) maybe.Check() #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318) -#define SWIGV8_ARRAY_NEW() v8::Array::New() +#define SWIGV8_ARRAY_NEW(size) v8::Array::New(size) #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(func) @@ -67,9 +83,16 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_NUMBER_NEW(num) v8::Number::New(num) #define SWIGV8_OBJECT_NEW() v8::Object::New() #define SWIGV8_UNDEFINED() v8::Undefined() +#define SWIGV8_ARRAY v8::Handle +#define SWIGV8_FUNCTION_TEMPLATE v8::Handle +#define SWIGV8_OBJECT v8::Handle +#define SWIGV8_OBJECT_TEMPLATE v8::Handle +#define SWIGV8_VALUE v8::Handle #define SWIGV8_NULL() v8::Null() +#define SWIGV8_ARRAY_GET(array, index) (array)->Get(index) +#define SWIGV8_ARRAY_SET(array, index, value) (array)->Set(index, value) #else -#define SWIGV8_ARRAY_NEW() v8::Array::New(v8::Isolate::GetCurrent()) +#define SWIGV8_ARRAY_NEW(size) v8::Array::New(v8::Isolate::GetCurrent(), size) #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(v8::Isolate::GetCurrent(), bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(v8::Isolate::GetCurrent(), val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), func) @@ -80,7 +103,14 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_NUMBER_NEW(num) v8::Number::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent()) #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent()) +#define SWIGV8_ARRAY v8::Local +#define SWIGV8_FUNCTION_TEMPLATE v8::Local +#define SWIGV8_OBJECT v8::Local +#define SWIGV8_OBJECT_TEMPLATE v8::Local +#define SWIGV8_VALUE v8::Local #define SWIGV8_NULL() v8::Null(v8::Isolate::GetCurrent()) +#define SWIGV8_ARRAY_GET(array, index) (array)->Get(SWIGV8_CURRENT_CONTEXT(), index).ToLocalChecked() +#define SWIGV8_ARRAY_SET(array, index, value) SWIGV8_MAYBE_CHECK((array)->Set(SWIGV8_CURRENT_CONTEXT(), index, value)) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) @@ -91,15 +121,7 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ.Reset(v8::Isolate::GetCurrent(), class); #endif -#ifdef NODE_VERSION -#if NODE_VERSION_AT_LEAST(10, 12, 0) -#define SWIG_NODE_AT_LEAST_1012 -#endif -#endif - -//Necessary to check Node.js version because V8 API changes are backported in Node.js -#if (defined(NODE_VERSION) && !defined(SWIG_NODE_AT_LEAST_1012)) || \ - (!defined(NODE_VERSION) && (V8_MAJOR_VERSION-0) < 7) +#if (V8_MAJOR_VERSION-0) < 6 || (SWIG_V8_VERSION < 0x0608) #define SWIGV8_TO_OBJECT(handle) (handle)->ToObject() #define SWIGV8_TO_STRING(handle) (handle)->ToString() #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue() @@ -112,9 +134,13 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked() #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() -#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len) #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent()) +#if (SWIG_V8_VERSION < 0x0704) +#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() +#else +#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(v8::Isolate::GetCurrent()) +#endif #endif /* --------------------------------------------------------------------------- @@ -163,7 +189,7 @@ public: SWIGV8_THROW_EXCEPTION(err); } } - v8::Handle err; + SWIGV8_VALUE err; }; /* --------------------------------------------------------------------------- @@ -228,7 +254,7 @@ public: SWIGRUNTIME v8::Persistent SWIGV8_SWIGTYPE_Proxy_class_templ; -SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void **ptr, swig_type_info *info, int flags) { +SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(SWIGV8_OBJECT objRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; @@ -252,8 +278,13 @@ SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void * if(!type_valid) { return SWIG_TypeError; } + int newmemory = 0; + *ptr = SWIG_TypeCast(tc, cdata->swigCObject, &newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } else { + *ptr = cdata->swigCObject; } - *ptr = cdata->swigCObject; + if(flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } @@ -280,11 +311,11 @@ SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo valRef, void **ptr) { +SWIGRUNTIME int SWIG_V8_GetInstancePtr(SWIGV8_VALUE valRef, void **ptr) { if(!valRef->IsObject()) { return SWIG_TypeError; } - v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); + SWIGV8_OBJECT objRef = SWIGV8_OBJECT::Cast(valRef); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; @@ -304,7 +335,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle valRef, void **ptr) return SWIG_OK; } -SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, swig_type_info *info, int flags) { +SWIGRUNTIME void SWIGV8_SetPrivateData(SWIGV8_OBJECT obj, void *ptr, swig_type_info *info, int flags) { SWIGV8_Proxy *cdata = new SWIGV8_Proxy(); cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; @@ -361,13 +392,14 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, sw cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); -#else +#elif (SWIG_V8_VERSION < 0x0704) cdata->handle.MarkIndependent(); +// Looks like future versions do not require that anymore: +// https://monorail-prod.appspot.com/p/chromium/issues/detail?id=923361#c11 #endif - } -SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swig_type_info *info, int flags) { +SWIGRUNTIME int SWIG_V8_ConvertPtr(SWIGV8_VALUE valRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); /* special case: JavaScript null => C NULL pointer */ @@ -378,14 +410,14 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swi if(!valRef->IsObject()) { return SWIG_TypeError; } - v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); + SWIGV8_OBJECT objRef = SWIGV8_OBJECT::Cast(valRef); return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags); } -SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) { +SWIGRUNTIME SWIGV8_VALUE SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE_ESC(); - v8::Handle class_templ; + SWIGV8_FUNCTION_TEMPLATE class_templ; if (ptr == NULL) { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) @@ -412,8 +444,12 @@ SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_inf } #endif -// v8::Handle result = class_templ->InstanceTemplate()->NewInstance(); +#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Local result = class_templ->InstanceTemplate()->NewInstance(); +#else + v8::Local result = class_templ->InstanceTemplate()->NewInstance(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked(); +#endif + SWIGV8_SetPrivateData(result, ptr, info, flags); SWIGV8_ESCAPE(result); @@ -433,7 +469,7 @@ SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_inf SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); - v8::Handle jsresult; + SWIGV8_VALUE jsresult; void *arg1 = (void *) 0 ; void *arg2 = (void *) 0 ; bool result; @@ -463,7 +499,7 @@ fail: SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); - v8::Handle jsresult; + SWIGV8_VALUE jsresult; void *arg1 = (void *) 0 ; long result; int res1; @@ -502,10 +538,10 @@ public: }; SWIGRUNTIMEINLINE -int SwigV8Packed_Check(v8::Handle valRef) { +int SwigV8Packed_Check(SWIGV8_VALUE valRef) { SWIGV8_HANDLESCOPE(); - v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); + SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef); if(objRef->InternalFieldCount() < 1) return false; #if (V8_MAJOR_VERSION-0) < 5 v8::Handle flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__")); @@ -519,13 +555,13 @@ int SwigV8Packed_Check(v8::Handle valRef) { } SWIGRUNTIME -swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr, size_t size) { +swig_type_info *SwigV8Packed_UnpackData(SWIGV8_VALUE valRef, void *ptr, size_t size) { if (SwigV8Packed_Check(valRef)) { SWIGV8_HANDLESCOPE(); SwigV8PackedData *sobj; - v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); + SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); @@ -542,7 +578,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr, } SWIGRUNTIME -int SWIGV8_ConvertPacked(v8::Handle valRef, void *ptr, size_t sz, swig_type_info *ty) { +int SWIGV8_ConvertPacked(SWIGV8_VALUE valRef, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigV8Packed_UnpackData(valRef, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { @@ -590,7 +626,7 @@ SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) { +SWIGV8_VALUE SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) { SWIGV8_HANDLESCOPE_ESC(); SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type); @@ -636,11 +672,14 @@ v8::Handle SWIGV8_NewPackedObj(void *data, size_t size, swig_type_inf cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); -#else +#elif (SWIG_V8_VERSION < 0x0704) cdata->handle.MarkIndependent(); +// Looks like future versions do not require that anymore: +// https://monorail-prod.appspot.com/p/chromium/issues/detail?id=923361#c11 #endif SWIGV8_ESCAPE(obj); + } #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIGV8_ConvertPacked(obj, ptr, sz, ty) @@ -654,22 +693,18 @@ v8::Handle SWIGV8_NewPackedObj(void *data, size_t size, swig_type_inf SWIGRUNTIME -#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) -v8::Handle SWIGV8_AppendOutput(v8::Handle result, v8::Handle obj) { -#else -v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handle obj) { -#endif +SWIGV8_VALUE SWIGV8_AppendOutput(SWIGV8_VALUE result, SWIGV8_VALUE obj) { SWIGV8_HANDLESCOPE_ESC(); if (result->IsUndefined()) { - result = SWIGV8_ARRAY_NEW(); + result = SWIGV8_ARRAY_NEW(0); + } else if (!result->IsArray()) { + SWIGV8_ARRAY tmparr = SWIGV8_ARRAY_NEW(0); + SWIGV8_ARRAY_SET(tmparr, 0, result); + result = tmparr; } -#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) - v8::Handle arr = v8::Handle::Cast(result); -#else - v8::Local arr = v8::Local::Cast(result); -#endif - arr->Set(arr->Length(), obj); + SWIGV8_ARRAY arr = SWIGV8_ARRAY::Cast(result); + SWIGV8_ARRAY_SET(arr, arr->Length(), obj); SWIGV8_ESCAPE(arr); } diff --git a/Lib/javascript/v8/javascriptruntime.swg b/Lib/javascript/v8/javascriptruntime.swg index c78e04efb..115554a5a 100644 --- a/Lib/javascript/v8/javascriptruntime.swg +++ b/Lib/javascript/v8/javascriptruntime.swg @@ -56,9 +56,15 @@ %insert(runtime) %{ #include +#if defined(V8_MAJOR_VERSION) && defined(V8_MINOR_VERSION) +#undef SWIG_V8_VERSION +#define SWIG_V8_VERSION (V8_MAJOR_VERSION * 256 + V8_MINOR_VERSION) +#endif + #include #include #include +#include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg index e767a6d66..42d0b86b5 100644 --- a/Lib/javascript/v8/javascriptstrings.swg +++ b/Lib/javascript/v8/javascriptstrings.swg @@ -4,10 +4,14 @@ * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") { SWIGINTERN int -SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc) +SWIG_AsCharPtrAndSize(SWIGV8_VALUE valRef, char** cptr, size_t* psize, int *alloc) { if(valRef->IsString()) { - v8::Handle js_str = SWIGV8_TO_STRING(valRef); +%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) + v8::Handle js_str = v8::Handle::Cast(valRef); +%#else + v8::Local js_str = v8::Local::Cast(valRef); +%#endif size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1; char* cstr = new char[len]; @@ -20,7 +24,7 @@ SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, return SWIG_OK; } else { if(valRef->IsObject()) { - v8::Handle obj = SWIGV8_TO_OBJECT(valRef); + SWIGV8_OBJECT obj = SWIGV8_OBJECT::Cast(valRef); // try if the object is a wrapped char[] swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { @@ -41,7 +45,7 @@ SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { -SWIGINTERNINLINE v8::Handle +SWIGINTERNINLINE SWIGV8_VALUE SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { @@ -49,7 +53,11 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size) // TODO: handle extra long strings return SWIGV8_UNDEFINED(); } else { +%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Handle js_str = SWIGV8_STRING_NEW2(carray, size); +%#else + v8::Local js_str = SWIGV8_STRING_NEW2(carray, size); +%#endif return js_str; } } else { diff --git a/Lib/javascript/v8/javascripttypemaps.swg b/Lib/javascript/v8/javascripttypemaps.swg index 4601698e0..cb31100c5 100644 --- a/Lib/javascript/v8/javascripttypemaps.swg +++ b/Lib/javascript/v8/javascripttypemaps.swg @@ -25,7 +25,7 @@ /* Javascript types */ -#define SWIG_Object v8::Handle +#define SWIG_Object SWIGV8_VALUE #define VOID_Object SWIGV8_UNDEFINED() /* Overload of the output/constant/exception/dirout handling */ diff --git a/Lib/javascript/v8/typemaps.i b/Lib/javascript/v8/typemaps.i index d3d8afb19..e68b6654a 100644 --- a/Lib/javascript/v8/typemaps.i +++ b/Lib/javascript/v8/typemaps.i @@ -18,7 +18,7 @@ you would use a real value instead. int *INPUT short *INPUT long *INPUT - long long *INPUT + long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT diff --git a/Lib/lua/luarun.swg b/Lib/lua/luarun.swg index 9636cdc9b..6ef2c6f15 100644 --- a/Lib/lua/luarun.swg +++ b/Lib/lua/luarun.swg @@ -289,7 +289,7 @@ to tell the two structures apart within SWIG, other than by looking at the type typedef struct { swig_type_info *type; int own; /* 1 if owned & must be destroyed */ - char data[1]; /* arbitrary amount of data */ + char data[1]; /* arbitrary amount of data */ } swig_lua_rawdata; /* Common SWIG API */ @@ -341,7 +341,7 @@ typedef struct { #define SWIG_isptrtype(L,I) (lua_isuserdata(L,I) || lua_isnil(L,I)) #ifdef __cplusplus -/* Special helper for member function pointers +/* Special helper for member function pointers it gets the address, casts it, then dereferences it */ /*#define SWIG_mem_fn_as_voidptr(a) (*((char**)&(a))) */ #endif @@ -444,7 +444,7 @@ SWIGINTERN void SWIG_Lua_elua_emulate_register(lua_State *L, const swig_elua_ent lua_pop(L,1); /*remove nil */ lua_newtable(L); SWIG_Lua_elua_emulate_register(L,entry->value.value.table); - } + } if(is_metatable) { assert(lua_istable(L,-1)); lua_pushvalue(L,-1); @@ -453,11 +453,11 @@ SWIGINTERN void SWIG_Lua_elua_emulate_register(lua_State *L, const swig_elua_ent break; case LUA_TUSERDATA: - if(entry->value.value.userdata.member) + if(entry->value.value.userdata.member) SWIG_NewMemberObj(L,entry->value.value.userdata.pvalue, entry->value.value.userdata.lvalue, *(entry->value.value.userdata.ptype)); - else + else SWIG_NewPointerObj(L,entry->value.value.userdata.pvalue, *(entry->value.value.userdata.ptype),0); break; @@ -502,7 +502,7 @@ SWIGINTERN int SWIG_Lua_emulate_elua_getmetatable(lua_State *L) } assert(lua_gettop(L) == 2); return 1; - + fail: lua_error(L); return 0; @@ -520,7 +520,7 @@ SWIGINTERN void SWIG_Lua_emulate_elua_swap_getmetatable(lua_State *L) lua_pushcfunction(L, SWIG_Lua_emulate_elua_getmetatable); lua_rawset(L,-3); lua_pop(L,2); - + } /* END OF REMOVE */ @@ -1039,17 +1039,11 @@ SWIGINTERN int SWIG_Lua_class_tostring(lua_State *L) { /* there should be 1 param passed in (1) userdata (not the metatable) */ - const char *className; - void* userData; + swig_lua_userdata* userData; assert(lua_isuserdata(L,1)); /* just in case */ - userData = lua_touserdata(L,1); /* get the userdata address for later */ - lua_getmetatable(L,1); /* get the meta table */ - assert(lua_istable(L,-1)); /* just in case */ + userData = (swig_lua_userdata*)lua_touserdata(L,1); /* get the userdata address */ - lua_getfield(L, -1, ".type"); - className = lua_tostring(L, -1); - - lua_pushfstring(L, "<%s userdata: %p>", className, userData); + lua_pushfstring(L, "", userData->type->str, userData->ptr); return 1; } @@ -1061,7 +1055,7 @@ SWIGINTERN int SWIG_Lua_class_disown(lua_State *L) swig_lua_userdata *usr; assert(lua_isuserdata(L,-1)); /* just in case */ usr=(swig_lua_userdata*)lua_touserdata(L,-1); /* get it */ - + usr->own = 0; /* clear our ownership */ return 0; } @@ -1170,7 +1164,7 @@ SWIGINTERN void SWIG_Lua_get_class_metatable(lua_State *L,const char *cname) Each class structure has a list of pointers to the base class structures. This function fills them. It cannot be done at compile time, as this will not work with hireachies -spread over more than one swig file. +spread over more than one swig file. Therefore it must be done at runtime, querying the SWIG type system. */ SWIGINTERN void SWIG_Lua_init_base_class(lua_State *L,swig_lua_class *clss) @@ -1350,14 +1344,14 @@ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L); /*forward declaration /* The real function that resolves a metamethod. * Function searches given class and all it's bases(recursively) for first instance of something that is - * not equal to SWIG_Lua_resolve_metatmethod. (Almost always this 'something' is actual metamethod implementation + * not equal to SWIG_Lua_resolve_metamethod. (Almost always this 'something' is actual metamethod implementation * and it is a SWIG-generated C function.). It returns value on the top of the L and there is no garbage below the * answer. * Returns 1 if found, 0 otherwise. * clss is class which metatable we will search for method * metamethod_name_idx is index in L where metamethod name (as string) lies - * skip_check allows to skip searching metamethod in givel clss and immideatelly go to searching in bases. skip_check - * is not caried to subsequent recursive calls - false is always passed. It is set to true only at first call from + * skip_check allows skipping searching metamethod in the given class and immediately going to searching in bases. skip_check + * is not carried to subsequent recursive calls - false is always passed. It is set to true only at first call from * SWIG_Lua_resolve_metamethod * */ SWIGINTERN int SWIG_Lua_do_resolve_metamethod(lua_State *L, const swig_lua_class *clss, int metamethod_name_idx, @@ -1404,11 +1398,11 @@ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L) lua_checkstack(L,5); numargs = lua_gettop(L); /* number of arguments to pass to actual metamethod */ - + /* Get upvalues from closure */ lua_pushvalue(L, lua_upvalueindex(1)); /*Get function name*/ metamethod_name_idx = lua_gettop(L); - + lua_pushvalue(L, lua_upvalueindex(2)); clss = (const swig_lua_class*)(lua_touserdata(L,-1)); lua_pop(L,1); /* remove lightuserdata with clss from stack */ @@ -1440,7 +1434,7 @@ SWIGINTERN int SWIG_Lua_add_class_user_metamethod(lua_State *L, swig_lua_class * /* metamethod name - on the top of the stack */ assert(lua_isstring(L,-1)); - + key_index = lua_gettop(L); /* Check whether method is already defined in metatable */ @@ -1450,7 +1444,7 @@ SWIGINTERN int SWIG_Lua_add_class_user_metamethod(lua_State *L, swig_lua_class * lua_pop(L,1); return -1; } - lua_pop(L,1); + lua_pop(L,1); /* Iterating over immediate bases */ for(i=0;clss->bases[i];i++) @@ -1460,13 +1454,13 @@ SWIGINTERN int SWIG_Lua_add_class_user_metamethod(lua_State *L, swig_lua_class * lua_pushvalue(L, key_index); lua_rawget(L, -2); if( !lua_isnil(L,-1) ) { - lua_pushvalue(L, key_index); + lua_pushvalue(L, key_index); /* Add proxy function */ lua_pushvalue(L, key_index); /* first closure value is function name */ lua_pushlightuserdata(L, clss); /* second closure value is swig_lua_class structure */ lua_pushcclosure(L, SWIG_Lua_resolve_metamethod, 2); - + lua_rawset(L, metatable_index); success = 1; } @@ -1477,7 +1471,7 @@ SWIGINTERN int SWIG_Lua_add_class_user_metamethod(lua_State *L, swig_lua_class * break; } - return success; + return success; } SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class *clss) @@ -1503,7 +1497,7 @@ SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class } } - lua_pop(L,1); /* remove inheritable metatmethods table */ + lua_pop(L,1); /* remove inheritable metamethods table */ /* Special handling for __tostring method */ lua_pushstring(L, "__tostring"); @@ -1771,6 +1765,11 @@ SWIGRUNTIME int SWIG_Lua_ConvertPtr(lua_State *L,int index,void **ptr,swig_type *ptr=0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } + if (lua_islightuserdata(L,index)) + { + *ptr=lua_touserdata(L,index); + return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; + } usr=(swig_lua_userdata*)lua_touserdata(L,index); /* get data */ if (usr) { @@ -1816,7 +1815,7 @@ SWIGRUNTIME void SWIG_Lua_NewPackedObj(lua_State *L,void *ptr,size_t size,swig_t memcpy(raw->data,ptr,size); /* copy the data */ SWIG_Lua_AddMetatable(L,type); /* add metatable */ } - + /* converts a packed userdata. user for member fn pointers only */ SWIGRUNTIME int SWIG_Lua_ConvertPacked(lua_State *L,int index,void *ptr,size_t size,swig_type_info *type) { @@ -1915,7 +1914,7 @@ Unfortunately lua keeps changing its APIs, so we need a conditional compile In lua 5.0.X it's lua_dostring() In lua 5.1.X it's luaL_dostring() */ -SWIGINTERN int +SWIGINTERN int SWIG_Lua_dostring(lua_State *L, const char *str) { int ok,top; if (str==0 || str[0]==0) return 0; /* nothing to do */ @@ -1930,7 +1929,7 @@ SWIG_Lua_dostring(lua_State *L, const char *str) { } lua_settop(L,top); /* restore the stack */ return ok; -} +} #ifdef __cplusplus } diff --git a/Lib/lua/luatypemaps.swg b/Lib/lua/luatypemaps.swg index 8959f201e..6c92e3b59 100644 --- a/Lib/lua/luatypemaps.swg +++ b/Lib/lua/luatypemaps.swg @@ -237,13 +237,13 @@ $1=($1_ltype)&temp;%} // therefore a special wrapping functions SWIG_ConvertMember() & SWIG_NewMemberObj() were written %typemap(in,checkfn="lua_isuserdata") SWIGTYPE (CLASS::*) %{ - if (!SWIG_IsOK(SWIG_ConvertMember(L,$input,(void*)(&$1),sizeof($type),$descriptor))) + if (!SWIG_IsOK(SWIG_ConvertMember(L,$input,(void*)(&$1),sizeof($1),$descriptor))) SWIG_fail_ptr("$symname",$argnum,$descriptor); %} %typemap(out) SWIGTYPE (CLASS::*) -%{ - SWIG_NewMemberObj(L,(void*)(&$1),sizeof($type),$descriptor); SWIG_arg++; +%{ + SWIG_NewMemberObj(L,(void*)(&$1),sizeof($1),$descriptor); SWIG_arg++; %} diff --git a/Lib/math.i b/Lib/math.i index a37c92d19..ac8d9a6eb 100644 --- a/Lib/math.i +++ b/Lib/math.i @@ -9,6 +9,8 @@ #include %} +#ifndef SWIGPHP /* PHP already provides all these functions except fabs() */ + extern double cos(double x); /* Cosine of x */ @@ -54,9 +56,6 @@ extern double pow(double x, double y); extern double sqrt(double x); /* Square root. x >= 0 */ -extern double fabs(double x); -/* Absolute value of x */ - extern double ceil(double x); /* Smallest integer not less than x, as a double */ @@ -66,6 +65,13 @@ extern double floor(double x); extern double fmod(double x, double y); /* Floating-point remainder of x/y, with the same sign as x. */ +#endif + +extern double fabs(double x); +/* Absolute value of x */ + +#ifndef SWIGPHP /* PHP already provides these constants and it's an error to redefine them */ + #define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 @@ -80,3 +86,4 @@ extern double fmod(double x, double y); #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.70710678118654752440 +#endif diff --git a/Lib/modula3/modula3.swg b/Lib/modula3/modula3.swg deleted file mode 100644 index 13d06e9c6..000000000 --- a/Lib/modula3/modula3.swg +++ /dev/null @@ -1,787 +0,0 @@ -/* ----------------------------------------------------------------------------- - * modula3.swg - * - * Modula3 typemaps - * ----------------------------------------------------------------------------- */ - -%include - -/* The ctype, m3rawtype and m3wraptype typemaps work together and so there should be one of each. - * The ctype typemap contains the C type used in the signature of C wrappers for C++ functions. - * The m3rawtype typemap contains the M3 type used in the raw interface. - * The m3rawintype typemap contains the M3 type used as function argument. - * The m3rawrettype typemap contains the M3 type used as return value. - * The m3wraptype typemap contains the M3 type used in the M3 type wrapper classes and module class. */ - -/* Primitive types */ -%typemap(ctype) bool, const bool & "bool" -%typemap(ctype) char, const char & "char" -%typemap(ctype) signed char, const signed char & "signed char" -%typemap(ctype) unsigned char, const unsigned char & "unsigned short" -%typemap(ctype) short, const short & "short" -%typemap(ctype) unsigned short, const unsigned short & "unsigned short" -%typemap(ctype) int, const int & "int" -%typemap(ctype) unsigned int, const unsigned int & "unsigned int" -%typemap(ctype) long, const long & "long" -%typemap(ctype) unsigned long, const unsigned long & "unsigned long" -%typemap(ctype) long long, const long long & "long long" -%typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" -%typemap(ctype) float, const float & "float" -%typemap(ctype) double, const double & "double" -%typemap(ctype) char * "char *" -%typemap(ctype) void "void" - -%typemap(m3rawtype) bool, const bool & "BOOLEAN" -%typemap(m3rawtype) char, const char & "C.char" -%typemap(m3rawtype) signed char, const signed char & "C.signed_char" -%typemap(m3rawtype) unsigned char, const unsigned char & "C.unsigned_char" -%typemap(m3rawtype) short, const short & "C.short" -%typemap(m3rawtype) unsigned short, const unsigned short & "C.unsigned_short" -%typemap(m3rawtype) int, const int & "C.int" -%typemap(m3rawtype) unsigned int, const unsigned int & "C.unsigned_int" -%typemap(m3rawtype) long, const long & "C.long" -%typemap(m3rawtype) unsigned long, const unsigned long & "C.unsigned_long" -%typemap(m3rawtype) long long, const long long & "C.long_long" -%typemap(m3rawtype) unsigned long long, const unsigned long long & "C.unsigned_long_long" -%typemap(m3rawtype) float, const float & "C.float" -%typemap(m3rawtype) double, const double & "C.double" -%typemap(m3rawtype) long double, const long double & "C.long_double" -%typemap(m3rawtype) char * "C.char_star" -%typemap(m3rawtype) void "" -%typemap(m3rawtype) FILE "Cstdio.FILE"; -%typemap(m3rawtype) FILE * "Cstdio.FILE_star"; - - -%typemap(m3rawintype) bool *, bool &, bool "BOOLEAN" -%typemap(m3rawintype) char *, char &, char "C.char" -%typemap(m3rawintype) signed char *, signed char &, signed char "C.signed_char" -%typemap(m3rawintype) unsigned char *, unsigned char &, unsigned char "C.unsigned_char" -%typemap(m3rawintype) short *, short &, short "C.short" -%typemap(m3rawintype) unsigned short *, unsigned short &, unsigned short "C.unsigned_short" -%typemap(m3rawintype) int *, int &, int "C.int" -%typemap(m3rawintype) unsigned int *, unsigned int &, unsigned int "C.unsigned_int" -%typemap(m3rawintype) long *, long &, long "C.long" -%typemap(m3rawintype) unsigned long *, unsigned long &, unsigned long "C.unsigned_long" -%typemap(m3rawintype) long long *, long long &, long long "C.long_long" -%typemap(m3rawintype) unsigned long long *, unsigned long long &, unsigned long long "C.unsigned_long_long" -%typemap(m3rawintype) float *, float &, float "C.float" -%typemap(m3rawintype) double *, double &, double "C.double" -%typemap(m3rawintype) long double *, long double &, long double "C.long_double" -%typemap(m3rawintype) char * "C.char_star" -%typemap(m3rawintype) void "" -%typemap(m3rawintype) void * "ADDRESS" -%typemap(m3rawintype) FILE "Cstdio.FILE"; -%typemap(m3rawintype) FILE * "Cstdio.FILE_star"; - -%typemap(m3rawinmode) char *, void *, FILE * "" - - -%typemap(m3rawrettype) bool, const bool & "BOOLEAN" -%typemap(m3rawrettype) char, const char & "C.char" -%typemap(m3rawrettype) signed char, const signed char & "C.signed_char" -%typemap(m3rawrettype) unsigned char, const unsigned char & "C.unsigned_char" -%typemap(m3rawrettype) short, const short & "C.short" -%typemap(m3rawrettype) unsigned short, const unsigned short & "C.unsigned_short" -%typemap(m3rawrettype) int, const int & "C.int" -%typemap(m3rawrettype) unsigned int, const unsigned int & "C.unsigned_int" -%typemap(m3rawrettype) long, const long & "C.long" -%typemap(m3rawrettype) unsigned long, const unsigned long & "C.unsigned_long" -%typemap(m3rawrettype) long long, const long long & "C.long_long" -%typemap(m3rawrettype) unsigned long long, const unsigned long long & "C.unsigned_long_long" -%typemap(m3rawrettype) float, const float & "C.float" -%typemap(m3rawrettype) double, const double & "C.double" -%typemap(m3rawrettype) long double, const long double & "C.long_double" -%typemap(m3rawrettype) char * "C.char_star" -%typemap(m3rawrettype) void "" -%typemap(m3rawrettype) void * "ADDRESS" -%typemap(m3rawrettype) FILE "Cstdio.FILE"; -%typemap(m3rawrettype) FILE * "Cstdio.FILE_star"; - - -%typemap("m3rawtype:import") - char, const char &, - signed char, const signed char &, - unsigned char, const unsigned char &, - short, const short &, - unsigned short, const unsigned short &, - int, const int &, - unsigned int, const unsigned int &, - long, const long &, - unsigned long, const unsigned long &, - long long, const long long &, - unsigned long long, const unsigned long long &, - float, const float &, - double, const double &, - long double, const long double &, - char * - "Ctypes AS C" - -%typemap("m3rawintype:import") - char, const char &, - signed char, const signed char &, - unsigned char, const unsigned char &, - short, const short &, - unsigned short, const unsigned short &, - int, const int &, - unsigned int, const unsigned int &, - long, const long &, - unsigned long, const unsigned long &, - long long, const long long &, - unsigned long long, const unsigned long long &, - float, const float &, - double, const double &, - long double, const long double &, - char * - "Ctypes AS C" - -%typemap("m3rawrettype:import") - char, const char &, - signed char, const signed char &, - unsigned char, const unsigned char &, - short, const short &, - unsigned short, const unsigned short &, - int, const int &, - unsigned int, const unsigned int &, - long, const long &, - unsigned long, const unsigned long &, - long long, const long long &, - unsigned long long, const unsigned long long &, - float, const float &, - double, const double &, - long double, const long double &, - char * - "Ctypes AS C" - -%typemap("m3rawtype:import") - FILE, FILE * - "Cstdio"; - -%typemap("m3rawintype:import") - FILE, FILE * - "Cstdio"; - -%typemap("m3rawrettype:import") - FILE, FILE * - "Cstdio"; - -%typemap(m3wraptype) bool, const bool & "BOOLEAN" -%typemap(m3wraptype) char, const char & "CHAR" -%typemap(m3wraptype) signed char, const signed char & "CHAR" -%typemap(m3wraptype) unsigned char, const unsigned char & "CHAR" -%typemap(m3wraptype) short, const short & "Integer16.T" -%typemap(m3wraptype) unsigned short, const unsigned short & "Cardinal16.T" -%typemap(m3wraptype) int, const int & "INTEGER" -%typemap(m3wraptype) unsigned int, const unsigned int & "CARDINAL" -%typemap(m3wraptype) long, const long & "Integer32.T" -%typemap(m3wraptype) unsigned long, const unsigned long & "Cardinal32.T" -%typemap(m3wraptype) long long, const long long & "Integer64.T" -%typemap(m3wraptype) unsigned long long, const unsigned long long & "Cardinal64.T" -%typemap(m3wraptype) float, const float & "REAL" -%typemap(m3wraptype) double, const double & "LONGREAL" -%typemap(m3wraptype) long double, const long double & "EXTENDED" -%typemap(m3wraptype) char * "TEXT" -%typemap(m3wraptype) void "" -%typemap(m3wraptype) FILE "Cstdio.FILE"; -%typemap(m3wraptype) FILE * "Cstdio.FILE_star"; - -%typemap(m3wrapintype) bool, const bool *, const bool & "BOOLEAN" -%typemap(m3wrapintype) char, const char *, const char & "CHAR" -%typemap(m3wrapintype) signed char, const signed char *, const signed char & "CHAR" -%typemap(m3wrapintype) unsigned char, const unsigned char *, const unsigned char & "CHAR" -%typemap(m3wrapintype) short, const short *, const short & "INTEGER" -%typemap(m3wrapintype) unsigned short, const unsigned short *, const unsigned short & "CARDINAL" -%typemap(m3wrapintype) int, const int *, const int & "INTEGER" -%typemap(m3wrapintype) unsigned int, const unsigned int *, const unsigned int & "CARDINAL" -%typemap(m3wrapintype) long, const long *, const long & "INTEGER" -%typemap(m3wrapintype) unsigned long, const unsigned long *, const unsigned long & "CARDINAL" -%typemap(m3wrapintype) long long, const long long *, const long long & "INTEGER" -%typemap(m3wrapintype) unsigned long long, const unsigned long long *, const unsigned long long & "CARDINAL" -%typemap(m3wrapintype) float, const float *, const float & "REAL" -%typemap(m3wrapintype) double, const double *, const double & "LONGREAL" -%typemap(m3wrapintype) long double, const long double *, const long double & "EXTENDED" -%typemap(m3wrapintype) const char *, const char [] "TEXT" -%typemap(m3wrapintype,numinputs=0) void "" -%typemap(m3wrapintype) FILE "Cstdio.FILE"; -%typemap(m3wrapintype) FILE * "Cstdio.FILE_star"; - - -%typemap(m3wrapouttype) bool, bool *, bool & "BOOLEAN" -%typemap(m3wrapouttype) char, char *, char & "CHAR" -%typemap(m3wrapouttype) signed char, signed char *, signed char & "CHAR" -%typemap(m3wrapouttype) unsigned char, unsigned char *, unsigned char & "CHAR" -%typemap(m3wrapouttype) short, short *, short & "INTEGER" -%typemap(m3wrapouttype) unsigned short, unsigned short *, unsigned short & "CARDINAL" -%typemap(m3wrapouttype) int, int *, int & "INTEGER" -%typemap(m3wrapouttype) unsigned int, unsigned int *, unsigned int & "CARDINAL" -%typemap(m3wrapouttype) long, long *, long & "INTEGER" -%typemap(m3wrapouttype) unsigned long, unsigned long *, unsigned long & "CARDINAL" -%typemap(m3wrapouttype) long long, long long *, long long & "INTEGER" -%typemap(m3wrapouttype) unsigned long long, unsigned long long *, unsigned long long & "CARDINAL" -%typemap(m3wrapouttype) float, float *, float & "REAL" -%typemap(m3wrapouttype) double, double *, double & "LONGREAL" -%typemap(m3wrapouttype) long double, long double *, long double & "EXTENDED" -%typemap(m3wrapouttype) char *, char [] "TEXT" -%typemap(m3wrapouttype,numinputs=0) void "" - -%typemap(m3wraprettype) bool, const bool & "BOOLEAN" -%typemap(m3wraprettype) char, const char & "CHAR" -%typemap(m3wraprettype) signed char, const signed char & "CHAR" -%typemap(m3wraprettype) unsigned char, const unsigned char & "CHAR" -%typemap(m3wraprettype) short, const short & "INTEGER" -%typemap(m3wraprettype) unsigned short, const unsigned short & "CARDINAL" -%typemap(m3wraprettype) int, const int & "INTEGER" -%typemap(m3wraprettype) unsigned int, const unsigned int & "CARDINAL" -%typemap(m3wraprettype) long, const long & "INTEGER" -%typemap(m3wraprettype) unsigned long, const unsigned long & "CARDINAL" -%typemap(m3wraprettype) long long, const long long & "INTEGER" -%typemap(m3wraprettype) unsigned long long, const unsigned long long & "CARDINAL" -%typemap(m3wraprettype) float, const float & "REAL" -%typemap(m3wraprettype) double, const double & "LONGREAL" -%typemap(m3wraprettype) long double, const long double & "EXTENDED" -%typemap(m3wraprettype) char * "TEXT" -%typemap(m3wraprettype) void "" -%typemap(m3wraprettype) FILE "Cstdio.FILE"; -%typemap(m3wraprettype) FILE * "Cstdio.FILE_star"; - - -%typemap(ctype) char[ANY] "char *" -%typemap(m3rawtype) char[ANY] "C.char_star" -%typemap(m3rawintype) char[ANY] "C.char_star" -%typemap(m3rawrettype) char[ANY] "C.char_star" -%typemap(m3wraptype) char[ANY] "TEXT" -%typemap(m3wrapintype) char[ANY] "TEXT" -%typemap(m3wrapouttype) char[ANY] "TEXT" -%typemap(m3wraprettype) char[ANY] "TEXT" - -%typemap(m3wrapinmode) const char * %{%} -%typemap(m3wrapargvar) const char * %{$1 : C.char_star;%} -%typemap(m3wrapinconv) const char * %{$1 := M3toC.SharedTtoS($1_name);%} -%typemap(m3wrapfreearg) const char * %{M3toC.FreeSharedS($1_name,$1);%} -%typemap(m3wrapargraw) const char * %{$1%} -%typemap("m3wrapargvar:import") const char * "Ctypes AS C" -%typemap("m3wrapinconv:import") const char * "M3toC" -%typemap("m3wrapfreearg:import") const char * "M3toC" - -%typemap(m3wrapretvar) char * %{result : C.char_star;%} -%typemap(m3wrapretraw) char * %{result%} -%typemap(m3wrapretconv) char * %{M3toC.CopyStoT(result)%} -%typemap("m3wrapretvar:import") char * "Ctypes AS C" -%typemap("m3wrapretconv:import") char * "M3toC" - -%typemap(m3wrapinmode) FILE * %{%} - - -%typemap("m3wraptype:import") - FILE, FILE * - "Cstdio"; - -%typemap("m3wrapintype:import") - FILE, FILE * - "Cstdio"; - -%typemap("m3wraprettype:import") - FILE, FILE * - "Cstdio"; - - -/* Composed types */ -%typemap(ctype) SWIGTYPE "$1_type" -%typemap(m3rawtype) SWIGTYPE "$1_basetype" -%typemap(m3rawrettype) SWIGTYPE "UNTRACED REF $1_basetype" -%typemap(m3wraptype) SWIGTYPE "$1_basetype" -%typemap(m3wrapintype) SWIGTYPE "$1_basetype" -%typemap(m3wrapouttype) SWIGTYPE "$1_basetype" -%typemap(m3wraprettype) SWIGTYPE "$1_basetype" - -%typemap(ctype) SWIGTYPE [] "$1_type" -%typemap(m3rawtype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" -%typemap(m3rawtype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" -%typemap(m3rawintype) const SWIGTYPE [] "(*ARRAY OF*) $1_basetype" -%typemap(m3rawinmode) const SWIGTYPE [] "READONLY" -%typemap(m3rawintype) SWIGTYPE [] "(*ARRAY OF*) $1_basetype" -%typemap(m3rawinmode) SWIGTYPE [] "VAR" -%typemap(m3rawrettype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" -%typemap(m3rawrettype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" -%typemap(m3wraptype) SWIGTYPE [] "$1_basetype" -%typemap(m3wrapintype) const SWIGTYPE [] "ARRAY OF $1_basetype" -%typemap(m3wrapinmode) const SWIGTYPE [] "READONLY" -%typemap(m3wrapintype) SWIGTYPE [] "ARRAY OF $1_basetype" -%typemap(m3wrapinmode) SWIGTYPE [] "VAR" -%typemap(m3wrapouttype) SWIGTYPE [] "ARRAY OF $1_basetype" -%typemap(m3wraprettype) SWIGTYPE [] "REF ARRAY OF $1_basetype" - -%typemap(ctype) SWIGTYPE * "$1_type" -%typemap(m3rawtype) const SWIGTYPE * "UNTRACED REF $1_basetype" -%typemap(m3rawtype) SWIGTYPE * "UNTRACED REF $1_basetype" -%typemap(m3rawintype) const SWIGTYPE * "$1_basetype" -%typemap(m3rawinmode) const SWIGTYPE * "READONLY" -%typemap(m3rawintype) SWIGTYPE * "$1_basetype" -%typemap(m3rawinmode) SWIGTYPE * "VAR" -%typemap(m3rawrettype) const SWIGTYPE * "UNTRACED REF $1_basetype" -%typemap(m3rawrettype) SWIGTYPE * "UNTRACED REF $1_basetype" -%typemap(m3wraptype) SWIGTYPE * "$1_basetype" -%typemap(m3wrapintype) const SWIGTYPE * "$1_basetype" -%typemap(m3wrapinmode) const SWIGTYPE * "READONLY" -%typemap(m3wrapintype) SWIGTYPE * "$1_basetype" -%typemap(m3wrapinmode) SWIGTYPE * "VAR" -%typemap(m3wrapouttype) SWIGTYPE * "$1_basetype" -%typemap(m3wraprettype) SWIGTYPE * "UNTRACED REF $1_basetype" - -%typemap(ctype) SWIGTYPE & "$1_type" -%typemap(m3rawtype) const SWIGTYPE & "UNTRACED REF $1_basetype" -%typemap(m3rawtype) SWIGTYPE & "UNTRACED REF $1_basetype" -%typemap(m3rawintype) const SWIGTYPE & "$1_basetype" -%typemap(m3rawinmode) const SWIGTYPE & "READONLY" -%typemap(m3rawintype) SWIGTYPE & "$1_basetype" -%typemap(m3rawinmode) SWIGTYPE & "VAR" -%typemap(m3rawrettype) const SWIGTYPE & "UNTRACED REF $1_basetype" -%typemap(m3rawrettype) SWIGTYPE & "UNTRACED REF $1_basetype" -%typemap(m3wraptype) SWIGTYPE & "$1_basetype" -%typemap(m3wrapintype) const SWIGTYPE & "$1_basetype" -%typemap(m3wrapinmode) const SWIGTYPE & "READONLY" -%typemap(m3wrapintype) SWIGTYPE & "$1_basetype" -%typemap(m3wrapinmode) SWIGTYPE & "VAR" -%typemap(m3wrapouttype) SWIGTYPE & "$1_basetype" -%typemap(m3wraprettype) SWIGTYPE & "UNTRACED REF $1_basetype" - -%typemap(ctype) SWIGTYPE && "$1_type" -%typemap(m3rawtype) const SWIGTYPE && "UNTRACED REF $1_basetype" -%typemap(m3rawtype) SWIGTYPE && "UNTRACED REF $1_basetype" -%typemap(m3rawintype) const SWIGTYPE && "$1_basetype" -%typemap(m3rawinmode) const SWIGTYPE && "READONLY" -%typemap(m3rawintype) SWIGTYPE && "$1_basetype" -%typemap(m3rawinmode) SWIGTYPE && "VAR" -%typemap(m3rawrettype) const SWIGTYPE && "UNTRACED REF $1_basetype" -%typemap(m3rawrettype) SWIGTYPE && "UNTRACED REF $1_basetype" -%typemap(m3wraptype) SWIGTYPE && "$1_basetype" -%typemap(m3wrapintype) const SWIGTYPE && "$1_basetype" -%typemap(m3wrapinmode) const SWIGTYPE && "READONLY" -%typemap(m3wrapintype) SWIGTYPE && "$1_basetype" -%typemap(m3wrapinmode) SWIGTYPE && "VAR" -%typemap(m3wrapouttype) SWIGTYPE && "$1_basetype" -%typemap(m3wraprettype) SWIGTYPE && "UNTRACED REF $1_basetype" - -%typemap(ctype) enum SWIGTYPE "$1_type" -%typemap(m3rawtype) enum SWIGTYPE "C.int" -%typemap(m3rawintype) enum SWIGTYPE "C.int (* $1_type *)" -%typemap(m3rawrettype) enum SWIGTYPE "C.int" -%typemap(m3wraptype) enum SWIGTYPE "$*1_type" -%typemap(m3wrapintype) enum SWIGTYPE "$1_type" -%typemap(m3wrapouttype) enum SWIGTYPE "$1_type" -%typemap(m3wraprettype) enum SWIGTYPE "$*1_type" - -/* pointer to a class member */ -%typemap(ctype) SWIGTYPE (CLASS::*) "$1_type" -%typemap(m3rawtype) SWIGTYPE (CLASS::*) "REFANY" -%typemap(m3wraptype) SWIGTYPE (CLASS::*) "$1_basetype" - -/* The following are the in, out, freearg, argout typemaps. - These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */ - -/* primitive types */ -%typemap(in) bool -%{ $1 = $input ? true : false; %} - -%typemap(in) char, - signed char, - unsigned char, - short, - unsigned short, - int, - unsigned int, - long, - unsigned long, - long long, - unsigned long long, - float, - double, - enum SWIGTYPE -%{ $1 = ($1_ltype)$input; %} - -%typemap(out) bool %{ $result = $1; %} -%typemap(out) char %{ $result = $1; %} -%typemap(out) signed char %{ $result = $1; %} -%typemap(out) unsigned char %{ $result = $1; %} -%typemap(out) short %{ $result = $1; %} -%typemap(out) unsigned short %{ $result = $1; %} -%typemap(out) int %{ $result = $1; %} -%typemap(out) unsigned int %{ $result = $1; %} -%typemap(out) long %{ $result = $1; %} -%typemap(out) unsigned long %{ $result = $1; %} -%typemap(out) long long %{ $result = $1; %} -%typemap(out) unsigned long long %{ $result = $1; %} -%typemap(out) float %{ $result = $1; %} -%typemap(out) double %{ $result = $1; %} -%typemap(out) enum SWIGTYPE %{ $result = $1; %} - -/* char * - treat as String */ -%typemap(in) char * { - $1 = $input; -} -//%typemap(freearg) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } -//%typemap(out) char * { if($1) $result = JCALL1(NewStringUTF, jenv, $1); } - -%typemap(out) void "" - -/* primitive types by const reference */ -%typemap(in) const bool & (bool temp) -%{ temp = $input ? true : false; - $1 = &temp; %} - -%typemap(in) const char & (char temp), - const signed char & (signed char temp), - const unsigned char & (unsigned char temp), - const short & (short temp), - const unsigned short & (unsigned short temp), - const int & (int temp), - const unsigned int & (unsigned int temp), - const long & (long temp), - const unsigned long & (unsigned long temp), - const long long & ($*1_ltype temp), - const unsigned long long & ($*1_ltype temp), - const float & (float temp), - const double & (double temp) -%{ temp = ($*1_ltype)$input; -$1 = &temp; %} - -%typemap(out) const bool & %{ $result = *$1; %} -%typemap(out) const char & %{ $result = *$1; %} -%typemap(out) const signed char & %{ $result = *$1; %} -%typemap(out) const unsigned char & %{ $result = *$1; %} -%typemap(out) const short & %{ $result = *$1; %} -%typemap(out) const unsigned short & %{ $result = *$1; %} -%typemap(out) const int & %{ $result = *$1; %} -%typemap(out) const unsigned int & %{ $result = *$1; %} -%typemap(out) const long & %{ $result = *$1; %} -%typemap(out) const unsigned long & %{ $result = *$1; %} -%typemap(out) const long long & %{ $result = *$1; %} -%typemap(out) const unsigned long long & %{ $result = *$1; %} -%typemap(out) const float & %{ $result = *$1; %} -%typemap(out) const double & %{ $result = *$1; %} - -/* Default handling. Object passed by value. Convert to a pointer */ -%typemap(in) SWIGTYPE ($&1_type argp) -%{ argp = *($&1_ltype*)&$input; - if (!argp) { -// SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); - RETURN $null; - } - $1 = *argp; %} -%typemap(out) SWIGTYPE -#ifdef __cplusplus -%{*($&1_ltype*)&$result = new $1_ltype((const $1_ltype &)$1); %} -#else -{ - $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); - memmove($1ptr, &$1, sizeof($1_type)); - *($&1_ltype*)&$result = $1ptr; -} -#endif - -/* Generic pointers and references */ -%typemap(in) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)&$input; %} -%typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; - if(!$1) { - //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); - RETURN $null; - } %} -%typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; - if(!$1) { - //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); - RETURN $null; - } %} -%typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE (CLASS::*) %{ *($&1_ltype)&$result = $1; %} - - -/* Default array handling */ -%typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} -%typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} - -/* char[ANY] - treat as String */ -%typemap(in) char[ANY] { - $1 = $input; -} - -%typemap(argout) char[ANY] "" -%typemap(freearg) char[ANY] ""//{ if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } -%typemap(out) char[ANY] { if($1) $result = $1; } - - -/* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions - * that cannot be overloaded in C# as more than one C++ type maps to a single C# type */ - -%typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */ - bool, - const bool & - "" - -%typecheck(SWIG_TYPECHECK_CHAR) /* Java char */ - char, - const char & - "" - -%typecheck(SWIG_TYPECHECK_INT8) /* Java byte */ - signed char, - const signed char & - "" - -%typecheck(SWIG_TYPECHECK_INT16) /* Java short */ - unsigned char, - short, - const unsigned char &, - const short & - "" - -%typecheck(SWIG_TYPECHECK_INT32) /* Java int */ - unsigned short, - int, - long, - const unsigned short &, - const int &, - const long &, - enum SWIGTYPE - "" - -%typecheck(SWIG_TYPECHECK_INT64) /* Java long */ - unsigned int, - unsigned long, - long long, - const unsigned int &, - const unsigned long &, - const long long & - "" - -%typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */ - unsigned long long - "" - -%typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */ - float, - const float & - "" - -%typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */ - double, - const double & - "" - -%typecheck(SWIG_TYPECHECK_STRING) /* Java String */ - char *, - char[ANY] - "" - -%typecheck(SWIG_TYPECHECK_POINTER) /* Default */ - SWIGTYPE, - SWIGTYPE *, - SWIGTYPE &, - SWIGTYPE &&, - SWIGTYPE [], - SWIGTYPE (CLASS::*) - "" - -/* Exception handling */ - -%typemap(throws) int, - long, - short, - unsigned int, - unsigned long, - unsigned short { - char error_msg[256]; - sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); - SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg); - RETURN $null; -} - -%typemap(throws) SWIGTYPE { - (void)$1; - SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); - RETURN $null; -} - -%typemap(throws) char * { - SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1); - RETURN $null; -} - - -/* Typemaps for code generation in proxy classes and C# type wrapper classes */ - -/* The in typemap is used for converting function parameter types from the type - * used in the proxy, module or type wrapper class to the type used in the PInvoke class. */ -%typemap(m3in) bool, const bool &, - char, const char &, - signed char, const signed char &, - unsigned char, const unsigned char &, - short, const short &, - unsigned short, const unsigned short &, - int, const int &, - unsigned int, const unsigned int &, - long, const long &, - unsigned long, const unsigned long &, - long long, const long long &, - unsigned long long, const unsigned long long &, - float, const float &, - double, const double &, - char *, - char[ANY], - enum SWIGTYPE - "$input" -%typemap(m3in) SWIGTYPE "$&*1_type.getCPtr($input)" -%typemap(m3in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "$1_basetype.getCPtr($input)" - -/* The m3out typemap is used for converting function return types from the return type - * used in the PInvoke class to the type returned by the proxy, module or type wrapper class. */ -%typemap(m3out) bool, const bool &, - char, const char &, - signed char, const signed char &, - unsigned char, const unsigned char &, - short, const short &, - unsigned short, const unsigned short &, - int, const int &, - unsigned int, const unsigned int &, - long, const long &, - unsigned long, const unsigned long &, - long long, const long long &, - unsigned long long, const unsigned long long &, - float, const float &, - double, const double &, - char *, - char[ANY], - enum SWIGTYPE -%{$imcall%} - -%typemap(m3out) void %{$imcall%} - -%typemap(m3out) SWIGTYPE %{ - RETURN NEW(REF $1_basetype, $imcall); -%} -%typemap(m3out) SWIGTYPE & %{ - RETURN NEW($1_basetype, $imcall, $owner); -%} -%typemap(m3out) SWIGTYPE && %{ - RETURN NEW($1_basetype, $imcall, $owner); -%} -%typemap(m3out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ - cPtr := $imcall; - RETURN (cPtr = IntPtr.Zero) ? null : NEW($1_basetype, cPtr, $owner); -%} - -/* Properties */ -%typemap(m3varin) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ -PROCEDURE Set$var (value: $vartype) = - BEGIN - $imcall; - END Set$var; -%} - -%typemap(m3varout) bool, const bool &, - char, const char &, - signed char, const signed char &, - unsigned char, const unsigned char &, - short, const short &, - unsigned short, const unsigned short &, - int, const int &, - unsigned int, const unsigned int &, - long, const long &, - unsigned long, const unsigned long &, - long long, const long long &, - unsigned long long, const unsigned long long &, - float, const float &, - double, const double &, - char *, - char[ANY], - enum SWIGTYPE %{ -PROCEDURE Get$var (): $vartype = - BEGIN - RETURN $imcall; - END Get$var; -%} - -%typemap(m3varout) void %{ - get { - $imcall; - } %} -%typemap(m3varout) SWIGTYPE %{ - get { - RETURN new $&*1_mangle($imcall, true); - } %} -%typemap(m3varout) SWIGTYPE & %{ - get { - RETURN new $1_basetype($imcall, $owner); - } %} -%typemap(m3varout) SWIGTYPE && %{ - get { - RETURN new $1_basetype($imcall, $owner); - } %} -%typemap(m3varout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ - get { - IntPtr cPtr = $imcall; - RETURN (cPtr == IntPtr.Zero) ? null : new $1_basetype(cPtr, $owner); - } %} - -/* Typemaps used for the generation of proxy and type wrapper class code */ -%typemap(m3base) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" -%typemap(m3classmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public" -%typemap(m3code) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" -%typemap(m3imports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "using System;" -%typemap(m3interfaces) SWIGTYPE "IDisposable" -%typemap(m3interfaces_derived) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" -%typemap(m3ptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "internal" - -%typemap(m3finalize) SWIGTYPE %{ - ~$1_basetype() { - Dispose(); - } -%} - -%typemap(m3destruct, methodname="Dispose") SWIGTYPE { - if(swigCPtr != IntPtr.Zero && swigCMemOwn) { - $imcall; - swigCMemOwn = false; - } - swigCPtr = IntPtr.Zero; - GC.SuppressFinalize(this); - } - -%typemap(m3destruct_derived, methodname="Dispose") SWIGTYPE { - if(swigCPtr != IntPtr.Zero && swigCMemOwn) { - $imcall; - swigCMemOwn = false; - } - swigCPtr = IntPtr.Zero; - GC.SuppressFinalize(this); - base.Dispose(); - } - -%typemap(m3getcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ - internal static IntPtr getCPtr($1_basetype obj) { - RETURN (obj == null) ? IntPtr.Zero : obj.swigCPtr; - } -%} - -/* M3 specific directives */ -#define %m3multiretval %feature("modula3:multiretval") -#define %constnumeric(num) %feature("constnumeric","num") - -%pragma(modula3) moduleimports=%{ -IMPORT BlaBla; -%} - -%pragma(modula3) imclassimports=%{ -FROM BlaBla IMPORT Bla; -%} - -/* Some ANSI C typemaps */ - -%apply unsigned long { size_t }; - -/* Array reference typemaps */ -%apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } -%apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } - -/* const pointers */ -%apply SWIGTYPE * { SWIGTYPE *const } -%apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } -%apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } - diff --git a/Lib/modula3/modula3head.swg b/Lib/modula3/modula3head.swg deleted file mode 100644 index af96a78d1..000000000 --- a/Lib/modula3/modula3head.swg +++ /dev/null @@ -1,64 +0,0 @@ -/* ----------------------------------------------------------------------------- - * modula3head.swg - * - * Modula3 support code - * ----------------------------------------------------------------------------- */ - -%insert(runtime) %{ - -#include -#include -#include -%} - -#if 0 -%insert(runtime) %{ -/* Support for throwing Modula3 exceptions */ -typedef enum { - SWIG_JavaOutOfMemoryError = 1, - SWIG_JavaIOException, - SWIG_JavaRuntimeException, - SWIG_JavaIndexOutOfBoundsException, - SWIG_JavaArithmeticException, - SWIG_JavaIllegalArgumentException, - SWIG_JavaNullPointerException, - SWIG_JavaUnknownError -} SWIG_JavaExceptionCodes; - -typedef struct { - SWIG_JavaExceptionCodes code; - const char *java_exception; -} SWIG_JavaExceptions_t; - -#if defined(SWIG_NOINCLUDE) -void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg); -#else -%} -%insert(runtime) { -void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { - jclass excep; - static const SWIG_JavaExceptions_t java_exceptions[] = { - { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, - { SWIG_JavaIOException, "java/io/IOException" }, - { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, - { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, - { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, - { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, - { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, - { SWIG_JavaUnknownError, "java/lang/UnknownError" }, - { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; - const SWIG_JavaExceptions_t *except_ptr = java_exceptions; - - while (except_ptr->code != code && except_ptr->code) - except_ptr++; - - JCALL0(ExceptionClear, jenv); - excep = JCALL1(FindClass, jenv, except_ptr->java_exception); - if (excep) - JCALL2(ThrowNew, jenv, excep, msg); -} -} -%insert(runtime) %{ -#endif -%} -#endif diff --git a/Lib/modula3/typemaps.i b/Lib/modula3/typemaps.i deleted file mode 100644 index 1d76ab5e0..000000000 --- a/Lib/modula3/typemaps.i +++ /dev/null @@ -1,74 +0,0 @@ -/* ----------------------------------------------------------------------------- - * typemaps.i - * - * Pointer and reference handling typemap library - * - * These mappings provide support for input/output arguments and common - * uses for C/C++ pointers and C++ references. - * ----------------------------------------------------------------------------- */ - -/* These typemaps will eventually probably maybe make their way into named typemaps - * OUTPUT * and OUTPUT & as they currently break functions that return a pointer or - * reference. */ - -%typemap(ctype) bool *, bool & "bool *" -%typemap(ctype) char & "char *" -%typemap(ctype) signed char *, signed char & "signed char *" -%typemap(ctype) unsigned char *, unsigned char & "unsigned short *" -%typemap(ctype) short *, short & "short *" -%typemap(ctype) unsigned short *, unsigned short & "unsigned short *" -%typemap(ctype) int *, int & "int *" -%typemap(ctype) unsigned int *, unsigned int & "unsigned int *" -%typemap(ctype) long *, long & "long *" -%typemap(ctype) unsigned long *, unsigned long & "unsigned long *" -%typemap(ctype) long long *, long long & "long long *" -%typemap(ctype) unsigned long long *, unsigned long long & "unsigned long long *" -%typemap(ctype) float *, float & "float *" -%typemap(ctype) double *, double & "double *" - -%typemap(imtype) bool *, bool & "ref bool" -%typemap(imtype) char & "ref char" -%typemap(imtype) signed char *, signed char & "ref sbyte" -%typemap(imtype) unsigned char *, unsigned char & "ref byte" -%typemap(imtype) short *, short & "ref short" -%typemap(imtype) unsigned short *, unsigned short & "ref ushort" -%typemap(imtype) int *, int & "ref int" -%typemap(imtype) unsigned int *, unsigned int & "ref uint" -%typemap(imtype) long *, long & "ref int" -%typemap(imtype) unsigned long *, unsigned long & "ref uint" -%typemap(imtype) long long *, long long & "ref long" -%typemap(imtype) unsigned long long *, unsigned long long & "ref ulong" -%typemap(imtype) float *, float & "ref float" -%typemap(imtype) double *, double & "ref double" - -%typemap(cstype) bool *, bool & "ref bool" -%typemap(cstype) char & "ref char" -%typemap(cstype) signed char *, signed char & "ref sbyte" -%typemap(cstype) unsigned char *, unsigned char & "ref byte" -%typemap(cstype) short *, short & "ref short" -%typemap(cstype) unsigned short *, unsigned short & "ref ushort" -%typemap(cstype) int *, int & "ref int" -%typemap(cstype) unsigned int *, unsigned int & "ref uint" -%typemap(cstype) long *, long & "ref int" -%typemap(cstype) unsigned long *, unsigned long & "ref uint" -%typemap(cstype) long long *, long long & "ref long" -%typemap(cstype) unsigned long long *, unsigned long long & "ref ulong" -%typemap(cstype) float *, float & "ref float" -%typemap(cstype) double *, double & "ref double" - -%typemap(csin) bool *, bool &, - char &, - signed char *, signed char &, - unsigned char *, unsigned char &, - short *, short &, - unsigned short *, unsigned short &, - int *, int &, - unsigned int *, unsigned int &, - long *, long &, - unsigned long *, unsigned long &, - long long *, long long &, - unsigned long long *, unsigned long long &, - float *, float &, - double *, double & - "ref $csinput" - diff --git a/Lib/ocaml/carray.i b/Lib/ocaml/carray.i index 5e74c3da1..4378f7333 100644 --- a/Lib/ocaml/carray.i +++ b/Lib/ocaml/carray.i @@ -77,7 +77,7 @@ type _value = c_obj %typemap(out) SWIGTYPE [] { int i; - CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); + const CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { diff --git a/Lib/ocaml/ocaml.swg b/Lib/ocaml/ocaml.swg index ac496bdba..afb01daea 100644 --- a/Lib/ocaml/ocaml.swg +++ b/Lib/ocaml/ocaml.swg @@ -62,7 +62,7 @@ #if 0 %typemap(argout) SWIGTYPE & { - CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); + const CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, @@ -75,7 +75,7 @@ } } %typemap(argout) SWIGTYPE && { - CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); + const CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, diff --git a/Lib/ocaml/ocamlrun.swg b/Lib/ocaml/ocamlrun.swg index 3d552cc50..5a923c5fe 100644 --- a/Lib/ocaml/ocamlrun.swg +++ b/Lib/ocaml/ocamlrun.swg @@ -407,7 +407,7 @@ extern "C" { CAMLreturn((long)SWIG_Int64_val(SWIG_Field(SWIG_Field(v,0),0))); case C_enum: { SWIG_CAMLlocal1(ret); - CAML_VALUE *enum_to_int = caml_named_value(SWIG_MODULE "_enum_to_int"); + const CAML_VALUE *enum_to_int = caml_named_value(SWIG_MODULE "_enum_to_int"); if( !name ) caml_failwith( "Not an enum conversion" ); ret = caml_callback2(*enum_to_int,*caml_named_value(name),v); CAMLreturn(caml_long_val(ret)); @@ -451,7 +451,7 @@ extern "C" { CAMLparam1(v); void *outptr = NULL; swig_type_info *outdescr = NULL; - static CAML_VALUE *func_val = NULL; + static const CAML_VALUE *func_val = NULL; if( v == Val_unit ) { *out = 0; @@ -574,7 +574,7 @@ extern "C" { CAMLparam0(); SWIG_CAMLlocal1(result); - CAML_VALUE *fromval = caml_named_value(name); + const CAML_VALUE *fromval = caml_named_value(name); if (fromval) { result = caml_callback(*fromval, caml_val_ptr(ptr, descriptor)); } else { diff --git a/Lib/octave/director.swg b/Lib/octave/director.swg index bf71d18e8..5b9cd86e0 100644 --- a/Lib/octave/director.swg +++ b/Lib/octave/director.swg @@ -7,8 +7,6 @@ # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) -#include - namespace Swig { class Director { diff --git a/Lib/octave/extra-install.list b/Lib/octave/extra-install.list new file mode 100644 index 000000000..41ef94778 --- /dev/null +++ b/Lib/octave/extra-install.list @@ -0,0 +1,2 @@ +# see top-level Makefile.in +octheaders.hpp diff --git a/Lib/octave/octcomplex.swg b/Lib/octave/octcomplex.swg index a3e9ebf77..87e77a62e 100644 --- a/Lib/octave/octcomplex.swg +++ b/Lib/octave/octcomplex.swg @@ -73,7 +73,7 @@ int res = SWIG_AddCast(SWIG_AsVal(float)(ov, &d)); if (SWIG_IsOK(res)) { if (val) - *val = Constructor(d, 0.0); + *val = Constructor(d, 0.0f); return res; } } diff --git a/Lib/octave/octcontainer.swg b/Lib/octave/octcontainer.swg index 269ff7544..80d593f4f 100644 --- a/Lib/octave/octcontainer.swg +++ b/Lib/octave/octcontainer.swg @@ -11,12 +11,6 @@ * be the case. * ----------------------------------------------------------------------------- */ -%{ -#include -#include -%} - - #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS @@ -64,7 +58,6 @@ namespace swig { %fragment("OctSequence_Base","header",fragment="") { -%#include namespace std { template <> @@ -401,20 +394,14 @@ namespace swig return const_reference(_seq, n); } - bool check(bool set_err = true) const + bool check() const { int s = size(); for (int i = 0; i < s; ++i) { // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, i); octave_value item; // * todo - if (!swig::check(item)) { - if (set_err) { - char msg[1024]; - sprintf(msg, "in sequence element %d", i); - SWIG_Error(SWIG_RuntimeError, msg); - } + if (!swig::check(item)) return false; - } } return true; } diff --git a/Lib/octave/octheaders.hpp b/Lib/octave/octheaders.hpp new file mode 100644 index 000000000..abf6428e7 --- /dev/null +++ b/Lib/octave/octheaders.hpp @@ -0,0 +1,130 @@ +// +// This header includes all C++ headers required for generated Octave wrapper code. +// Using a single header file allows pre-compilation of Octave headers, as follows: +// * Check out this header file: +// swig -octave -co octheaders.hpp +// * Pre-compile header file into octheaders.hpp.gch: +// g++ -c ... octheaders.hpp +// * Use pre-compiled header file: +// g++ -c -include octheaders.hpp ... +// + +#if !defined(_SWIG_OCTAVE_OCTHEADERS_HPP) +#define _SWIG_OCTAVE_OCTHEADERS_HPP + +// Required C++ headers +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Minimal headers to define Octave version +#include +#include + +// Macro for enabling features which require Octave version >= major.minor.patch +// - Use (OCTAVE_PATCH_VERSION + 0) to handle both '' (released) and '+' (in development) patch numbers +#define SWIG_OCTAVE_PREREQ(major, minor, patch) \ + ( (OCTAVE_MAJOR_VERSION<<16) + (OCTAVE_MINOR_VERSION<<8) + (OCTAVE_PATCH_VERSION + 0) >= ((major)<<16) + ((minor)<<8) + (patch) ) + +// Reconstruct Octave major, minor, and patch versions for releases prior to 3.8.1 +#if !defined(OCTAVE_MAJOR_VERSION) + +# if !defined(OCTAVE_API_VERSION_NUMBER) + +// Hack to distinguish between Octave 3.8.0, which removed OCTAVE_API_VERSION_NUMBER but did not yet +// introduce OCTAVE_MAJOR_VERSION, and Octave <= 3.2, which did not define OCTAVE_API_VERSION_NUMBER +# include +# if defined(octave_ov_h) +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 8 +# define OCTAVE_PATCH_VERSION 0 +# else + +// Hack to distinguish between Octave 3.2 and earlier versions, before OCTAVE_API_VERSION_NUMBER existed +# define ComplexLU __ignore +# include +# undef ComplexLU +# if defined(octave_Complex_LU_h) + +// We know only that this version is prior to Octave 3.2, i.e. OCTAVE_API_VERSION_NUMBER < 37 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 1 +# define OCTAVE_PATCH_VERSION 99 + +# else + +// OCTAVE_API_VERSION_NUMBER == 37 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 2 +# define OCTAVE_PATCH_VERSION 0 + +# endif // defined(octave_Complex_LU_h) + +# endif // defined(octave_ov_h) + +// Correlation between Octave API and version numbers extracted from Octave's +// ChangeLogs; version is the *earliest* released Octave with that API number +# elif OCTAVE_API_VERSION_NUMBER >= 48 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 6 +# define OCTAVE_PATCH_VERSION 0 + +# elif OCTAVE_API_VERSION_NUMBER >= 45 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 4 +# define OCTAVE_PATCH_VERSION 1 + +# elif OCTAVE_API_VERSION_NUMBER >= 42 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 3 +# define OCTAVE_PATCH_VERSION 54 + +# elif OCTAVE_API_VERSION_NUMBER >= 41 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 3 +# define OCTAVE_PATCH_VERSION 53 + +# elif OCTAVE_API_VERSION_NUMBER >= 40 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 3 +# define OCTAVE_PATCH_VERSION 52 + +# elif OCTAVE_API_VERSION_NUMBER >= 39 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 3 +# define OCTAVE_PATCH_VERSION 51 + +# else // OCTAVE_API_VERSION_NUMBER == 38 +# define OCTAVE_MAJOR_VERSION 3 +# define OCTAVE_MINOR_VERSION 3 +# define OCTAVE_PATCH_VERSION 50 + +# endif // !defined(OCTAVE_API_VERSION_NUMBER) + +#endif // !defined(OCTAVE_MAJOR_VERSION) + +// Required Octave headers +#include +#include +#include +#include +#include +#include +#include +#if SWIG_OCTAVE_PREREQ(4,2,0) +#include +#else +#include +#endif +#include +#if SWIG_OCTAVE_PREREQ(4,2,0) +#include +#endif + +#endif // !defined(_SWIG_OCTAVE_OCTHEADERS_HPP) diff --git a/Lib/octave/octrun.swg b/Lib/octave/octrun.swg index ff614e681..1069e0e54 100644 --- a/Lib/octave/octrun.swg +++ b/Lib/octave/octrun.swg @@ -89,10 +89,6 @@ SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *point // Runtime API implementation -#include -#include -#include - typedef octave_value_list(*octave_func) (const octave_value_list &, int); class octave_swig_type; @@ -203,11 +199,7 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); std::set dispatch_classes; - private: - - DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA }; - DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_bound_func, "octave_swig_bound_func", "octave_swig_bound_func"); #else #define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(func) #endif @@ -507,10 +499,10 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); delete this; } - long swig_this() const { + size_t swig_this() const { if (!types.size()) - return (long) this; - return (long) types[0].second.ptr; + return (size_t) this; + return (size_t) types[0].second.ptr; } const char* help_text() const { if (!types.size()) @@ -1066,7 +1058,13 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); octave_swig_type *ptr; public: octave_swig_ref(octave_swig_type *_ptr = 0) - :ptr(_ptr) { } + :ptr(_ptr) + { + // Ensure type_id() is set correctly + if (t_id == -1) { + t_id = octave_swig_ref::static_type_id(); + } + } ~octave_swig_ref() { if (ptr) ptr->decref(); } @@ -1207,8 +1205,13 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); public: octave_swig_packed(swig_type_info *_type = 0, const void *_buf = 0, size_t _buf_len = 0) - : type(_type), buf((const char*)_buf, (const char*)_buf + _buf_len) { - } + : type(_type), buf((const char*)_buf, (const char*)_buf + _buf_len) + { + // Ensure type_id() is set correctly + if (t_id == -1) { + t_id = octave_swig_packed::static_type_id(); + } + } bool copy(swig_type_info *outtype, void *ptr, size_t sz) const { if (outtype && outtype != type) diff --git a/Lib/octave/octruntime.swg b/Lib/octave/octruntime.swg index f98bf4fe4..a397fb7c1 100644 --- a/Lib/octave/octruntime.swg +++ b/Lib/octave/octruntime.swg @@ -1,111 +1,10 @@ +#ifdef SWIG_OCTAVE_EXTERNAL_OCTHEADERS %insert(runtime) %{ - -#include -#include - -#include -#include - -// Macro for enabling features which require Octave version >= major.minor.patch -// - Use (OCTAVE_PATCH_VERSION + 0) to handle both '' (released) and '+' (in development) patch numbers -#define SWIG_OCTAVE_PREREQ(major, minor, patch) \ - ( (OCTAVE_MAJOR_VERSION<<16) + (OCTAVE_MINOR_VERSION<<8) + (OCTAVE_PATCH_VERSION + 0) >= ((major)<<16) + ((minor)<<8) + (patch) ) - -// Reconstruct Octave major, minor, and patch versions for releases prior to 3.8.1 -#if !defined(OCTAVE_MAJOR_VERSION) - -# if !defined(OCTAVE_API_VERSION_NUMBER) - -// Hack to distinguish between Octave 3.8.0, which removed OCTAVE_API_VERSION_NUMBER but did not yet -// introduce OCTAVE_MAJOR_VERSION, and Octave <= 3.2, which did not define OCTAVE_API_VERSION_NUMBER -# include -# if defined(octave_ov_h) -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 8 -# define OCTAVE_PATCH_VERSION 0 -# else - -// Hack to distinguish between Octave 3.2 and earlier versions, before OCTAVE_API_VERSION_NUMBER existed -# define ComplexLU __ignore -# include -# undef ComplexLU -# if defined(octave_Complex_LU_h) - -// We know only that this version is prior to Octave 3.2, i.e. OCTAVE_API_VERSION_NUMBER < 37 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 1 -# define OCTAVE_PATCH_VERSION 99 - -# else - -// OCTAVE_API_VERSION_NUMBER == 37 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 2 -# define OCTAVE_PATCH_VERSION 0 - -# endif // defined(octave_Complex_LU_h) - -# endif // defined(octave_ov_h) - -// Correlation between Octave API and version numbers extracted from Octave's -// ChangeLogs; version is the *earliest* released Octave with that API number -# elif OCTAVE_API_VERSION_NUMBER >= 48 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 6 -# define OCTAVE_PATCH_VERSION 0 - -# elif OCTAVE_API_VERSION_NUMBER >= 45 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 4 -# define OCTAVE_PATCH_VERSION 1 - -# elif OCTAVE_API_VERSION_NUMBER >= 42 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 3 -# define OCTAVE_PATCH_VERSION 54 - -# elif OCTAVE_API_VERSION_NUMBER >= 41 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 3 -# define OCTAVE_PATCH_VERSION 53 - -# elif OCTAVE_API_VERSION_NUMBER >= 40 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 3 -# define OCTAVE_PATCH_VERSION 52 - -# elif OCTAVE_API_VERSION_NUMBER >= 39 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 3 -# define OCTAVE_PATCH_VERSION 51 - -# else // OCTAVE_API_VERSION_NUMBER == 38 -# define OCTAVE_MAJOR_VERSION 3 -# define OCTAVE_MINOR_VERSION 3 -# define OCTAVE_PATCH_VERSION 50 - -# endif // !defined(OCTAVE_API_VERSION_NUMBER) - -#endif // !defined(OCTAVE_MAJOR_VERSION) - -#include -#include -#include -#include -#include -#include -#include -#if SWIG_OCTAVE_PREREQ(4,2,0) -#include -#else -#include -#endif -#include -#if SWIG_OCTAVE_PREREQ(4,2,0) -#include -#endif - +#include "octheaders.hpp" %} +#else +%insert(runtime) "octheaders.hpp"; +#endif %insert(runtime) "swigrun.swg"; %insert(runtime) "swigerrors.swg"; @@ -315,13 +214,29 @@ DEFUN_DLD( swig_octave_prereq, args, nargout, swig_octave_prereq_usage ) { return octave_value(prereq); } +static const char *const swig_exit_usage = "-*- texinfo -*- \n\ +@deftypefn {Loadable Function} {} swig_exit([@var{exit_status}])\n\ +Exit Octave without performing any memory cleanup.\n\ +@end deftypefn"; + +DEFUN_DLD( swig_exit, args, nargout, swig_exit_usage ) { + if (args.length() > 1) { + error("swig_exit: must be called with at most one arguments"); + return octave_value_list(); + } + int exit_status = 0; + if (args.length() == 1) { + exit_status = args(0).int_value(); + } + ::_Exit(exit_status); + return octave_value(); +} + static const char *const SWIG_name_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Module} {} " SWIG_name_d "\n\ Loads the SWIG-generated module `" SWIG_name_d "'.\n\ @end deftypefn"; -void __swig_atexit__(void) { ::_Exit(0); } - DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { static octave_swig_type* module_ns = 0; @@ -329,14 +244,15 @@ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { // workaround to prevent octave seg-faulting on exit: set Octave exit function // octave_exit to _Exit, which exits immediately without trying to cleanup memory. // definitely affected version 3.2.*, not sure about 3.3.*, seems to be fixed in - // version 3.4.*, but reappeared in 4.2.*, so turn on for all versions after 3.2.*. + // version 3.4.*, reappeared in 4.2.*, hack not possible in 4.4.* or later due to + // removal of octave_exit, so turn on for all versions between 3.2.*. and 4.4.*. // can be turned off with macro definition. #ifndef SWIG_OCTAVE_NO_SEGFAULT_HACK -#if SWIG_OCTAVE_PREREQ(4,4,0) - atexit(__swig_atexit__); -#elif SWIG_OCTAVE_PREREQ(3,2,0) +#if !SWIG_OCTAVE_PREREQ(4,4,0) +#if SWIG_OCTAVE_PREREQ(3,2,0) octave_exit = ::_Exit; #endif +#endif #endif // check for no input and output args @@ -376,7 +292,6 @@ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { string_vector types = typeinfo.installed_type_names(); bool register_octave_swig_ref = true; bool register_octave_swig_packed = true; - bool register_octave_swig_bound_func = true; for (int i = 0; i < types.numel(); ++i) { if (types(i) == octave_swig_ref::static_type_name()) { register_octave_swig_ref = false; @@ -384,9 +299,6 @@ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { if (types(i) == octave_swig_packed::static_type_name()) { register_octave_swig_packed = false; } - if (types(i) == octave_swig_bound_func::static_type_name()) { - register_octave_swig_bound_func = false; - } } if (register_octave_swig_ref) { octave_swig_ref::register_type(); @@ -394,9 +306,6 @@ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { if (register_octave_swig_packed) { octave_swig_packed::register_type(); } - if (register_octave_swig_bound_func) { - octave_swig_bound_func::register_type(); - } } #else octave_swig_ref::register_type(); @@ -427,6 +336,9 @@ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { if (!SWIG_Octave_InstallFunction(me, "swig_octave_prereq")) { return octave_value_list(); } + if (!SWIG_Octave_InstallFunction(me, "swig_exit")) { + return octave_value_list(); + } octave_swig_type* cvar_ns=0; if (std::string(SWIG_global_name) != ".") { diff --git a/Lib/octave/std_complex.i b/Lib/octave/std_complex.i index 30c188244..461e2fdfc 100644 --- a/Lib/octave/std_complex.i +++ b/Lib/octave/std_complex.i @@ -4,10 +4,6 @@ %include -%{ -#include -%} - namespace std { %naturalvar complex; template class complex; diff --git a/Lib/perl5/perltypemaps.swg b/Lib/perl5/perltypemaps.swg index bf1596e9f..42f8887be 100644 --- a/Lib/perl5/perltypemaps.swg +++ b/Lib/perl5/perltypemaps.swg @@ -56,7 +56,9 @@ %define %set_output(obj) $result = obj; argvi++ %enddef /* append output */ -%define %append_output(obj) if (argvi >= items) EXTEND(sp, argvi+1); %set_output(obj) %enddef +%define %append_output(obj) +if (argvi >= items) EXTEND(sp, argvi+1); +%set_output(obj) %enddef /* variable output */ %define %set_varoutput(obj) sv_setsv($result,obj) %enddef @@ -95,7 +97,7 @@ "sv_setiv(SvRV($result), PTR2IV(&$1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE (CLASS::*) { - SWIG_MakePackedObj($result, (void *) &$1, sizeof($1_type), $1_descriptor); + SWIG_MakePackedObj($result, (void *) &$1, sizeof($1), $1_descriptor); } %typemap(varout) SWIGTYPE *const = SWIGTYPE *; diff --git a/Lib/php/const.i b/Lib/php/const.i index 32b4b9b0b..3b40c2c7f 100644 --- a/Lib/php/const.i +++ b/Lib/php/const.i @@ -3,6 +3,58 @@ * * Typemaps for constants * ----------------------------------------------------------------------------- */ +%typemap(classconsttab) int, + unsigned int, + short, + unsigned short, + long, + unsigned long, + unsigned char, + signed char, + enum SWIGTYPE %{ + zend_declare_class_constant_long(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, ($1_type)$value); +%} + +%typemap(classconsttab) bool %{ + zend_declare_class_constant_bool(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, ($1_type)$value); +%} + +%typemap(classconsttab) float, + double %{ + zend_declare_class_constant_double(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, $value); +%} + +%typemap(classconsttab) char %{ +{ + char swig_char = $value; + zend_declare_class_constant_stringl(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, &swig_char, 1); +} +%} + +%typemap(classconsttab) char *, + const char *, + char [], + const char [] %{ + zend_declare_class_constant_string(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, $value); +%} + +// This creates a zend_object to wrap the pointer, and we can't do that +// before the Zend runtime has been initialised so we delay it until +// RINIT. The downside is it then happens for every request. +%typemap(classconsttab,rinit=1) SWIGTYPE *, + SWIGTYPE &, + SWIGTYPE &&, + SWIGTYPE [] %{ +{ + zval z; + ZVAL_UNDEF(&z); + SWIG_SetPointerZval(&z, (void*)$value, $1_descriptor, 0); + zval_copy_ctor(&z); + zend_declare_class_constant(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, &z); +} +%} + +%typemap(classconsttab) SWIGTYPE (CLASS::*) ""; %typemap(consttab) int, unsigned int, @@ -31,11 +83,15 @@ const char [] "SWIG_STRING_CONSTANT($symname, $value);"; -%typemap(consttab) SWIGTYPE *, +// This creates a zend_object to wrap the pointer, and we can't do that +// before the Zend runtime has been initialised so we delay it until +// RINIT. The downside is it then happens for every request. +%typemap(consttab,rinit=1) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { zend_constant c; + ZVAL_UNDEF(&c.value); SWIG_SetPointerZval(&c.value, (void*)$value, $1_descriptor, 0); zval_copy_ctor(&c.value); c.name = zend_string_init("$symname", sizeof("$symname") - 1, 0); diff --git a/Lib/php/director.swg b/Lib/php/director.swg index ea0eba8ac..68be6a3ba 100644 --- a/Lib/php/director.swg +++ b/Lib/php/director.swg @@ -8,6 +8,8 @@ #ifndef SWIG_DIRECTOR_PHP_HEADER_ #define SWIG_DIRECTOR_PHP_HEADER_ +#define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) + #include #include #include @@ -76,31 +78,39 @@ namespace Swig { }; class Director { + private: + /* flag indicating whether the object is owned by PHP or C++ */ + mutable bool swig_disown_flag; + protected: // "mutable" so we can get a non-const pointer to it in const methods. mutable zval swig_self; typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; + public: - Director(zval *self) { + Director(zval *self) : swig_disown_flag(false) { ZVAL_COPY_VALUE(&swig_self, self); } - static bool swig_is_overridden_method(const char *cname, const char *lc_fname) { - bool result = false; + ~Director() { + if (swig_disown_flag) { + Z_DELREF(swig_self); + } + } + + void swig_disown() const { + if (!swig_disown_flag) { + swig_disown_flag = true; + Z_ADDREF(swig_self); + } + } + + static bool swig_is_overridden_method(const char *cname, zval *z) { zend_string * cname_str = zend_string_init(cname, strlen(cname), 0); zend_class_entry *ce = zend_lookup_class(cname_str); - if (ce) { - zval * mptr = zend_hash_str_find(&ce->function_table, lc_fname, strlen(lc_fname)); - if (mptr) { - // common.scope points to zend_class_entry for the declaring class, - // and there's only one of those per class, so we can just use a - // pointer compare here. - result = Z_FUNC_P(mptr)->common.scope != ce; - } - } zend_string_release(cname_str); - return result; + return ce == Z_OBJCE_P(z); } template @@ -109,6 +119,12 @@ namespace Swig { swig_owner[vptr] = new GCItem_T(vptr); } } + + void swig_acquire_ownership_obj(void *vptr, int own) const { + if (vptr && own) { + swig_owner[vptr] = new GCItem_Object(own); + } + } }; /* base class for director exceptions */ @@ -121,8 +137,8 @@ namespace Swig { swig_msg += " "; swig_msg += msg; } - SWIG_ErrorCode() = code; - SWIG_ErrorMsg() = swig_msg.c_str(); + // Don't replace an already active PHP exception. + if (!EG(exception)) zend_throw_exception(NULL, swig_msg.c_str(), code); } virtual ~DirectorException() throw() { @@ -150,8 +166,7 @@ namespace Swig { }; /* any php exception that occurs during a director method call */ - class DirectorMethodException : public DirectorException - { + class DirectorMethodException : public DirectorException { public: DirectorMethodException() : DirectorException(E_ERROR, "SWIG director method error", NULL) { diff --git a/Lib/php/factory.i b/Lib/php/factory.i index c4e082dd2..5a1f9dc06 100644 --- a/Lib/php/factory.i +++ b/Lib/php/factory.i @@ -3,41 +3,41 @@ you have: ---- geometry.h -------- - struct Geometry { - enum GeomType{ - POINT, - CIRCLE - }; - - virtual ~Geometry() {} + struct Geometry { + enum GeomType{ + POINT, + CIRCLE + }; + + virtual ~Geometry() {} virtual int draw() = 0; - + // // Factory method for all the Geometry objects // - static Geometry *create(GeomType i); - }; - - struct Point : Geometry { - int draw() { return 1; } - double width() { return 1.0; } - }; - - struct Circle : Geometry { - int draw() { return 2; } - double radius() { return 1.5; } - }; - + static Geometry *create(GeomType i); + }; + + struct Point : Geometry { + int draw() { return 1; } + double width() { return 1.0; } + }; + + struct Circle : Geometry { + int draw() { return 2; } + double radius() { return 1.5; } + }; + // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { - switch (type) { - case POINT: return new Point(); - case CIRCLE: return new Circle(); - default: return 0; - } - } + switch (type) { + case POINT: return new Point(); + case CIRCLE: return new Circle(); + default: return 0; + } + } ---- geometry.h -------- @@ -57,16 +57,16 @@ NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of - + namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use - %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); + %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); + - */ /* for loop for macro with one argument */ @@ -90,13 +90,13 @@ /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef -%define %_factory_dispatch(Type) +%define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; - SWIG_SetPointerZval(return_value, SWIG_as_voidptr(dobj),$descriptor(Type *), $owner); - } + SWIG_SetPointerZval(return_value, SWIG_as_voidptr(dobj), $descriptor(Type *), $owner); + } }%enddef %define %factory(Method,Types...) @@ -104,6 +104,6 @@ if (!dcast) { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { - SWIG_SetPointerZval(return_value, SWIG_as_voidptr($1),$descriptor, $owner); + SWIG_SetPointerZval(return_value, SWIG_as_voidptr($1), $descriptor, $owner); } }%enddef diff --git a/Lib/php/globalvar.i b/Lib/php/globalvar.i deleted file mode 100644 index 6b31207a6..000000000 --- a/Lib/php/globalvar.i +++ /dev/null @@ -1,293 +0,0 @@ -/* ----------------------------------------------------------------------------- - * globalvar.i - * - * Global variables - add the variable to PHP - * ----------------------------------------------------------------------------- */ - -%typemap(varinit) char * -{ - zval z_var; - if ($1) { - ZVAL_STRING(&z_var, $1); - } else { - ZVAL_STR(&z_var, ZSTR_EMPTY_ALLOC()); - } - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) char [] -{ - zval z_var; - ZVAL_STRING(&z_var, $1); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) int, - unsigned int, - unsigned short, - short, - unsigned short, - long, - unsigned long, - signed char, - unsigned char, - enum SWIGTYPE -{ - zval z_var; - ZVAL_LONG(&z_var, (long)$1); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) bool -{ - zval z_var; - ZVAL_BOOL(&z_var, ($1)?1:0); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) float, double -{ - zval z_var; - ZVAL_DOUBLE(&z_var, (double)$1); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) char -{ - zval z_var; - char c = $1; - ZVAL_STRINGL(&z_var, &c, 1); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) SWIGTYPE *, SWIGTYPE [] -{ - zval z_var; - SWIG_SetPointerZval(&z_var, (void*)$1, $1_descriptor, 0); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) SWIGTYPE, SWIGTYPE &, SWIGTYPE && -{ - zval z_var; - SWIG_SetPointerZval(&z_var, (void*)&$1, $&1_descriptor, 0); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit) char [ANY] -{ - zval z_var; - /* varinit char [ANY] */ - ZVAL_STRINGL(&z_var, $1, $1_dim0); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &z_var); -} - -%typemap(varinit, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) -{ - zval resource; - void * p = emalloc(sizeof($1)); - memcpy(p, &$1, sizeof($1)); - ZVAL_RES(&resource, zend_register_resource(p, swig_member_ptr)); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &resource); -} - -%typemap(varin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - $1 = zval_get_long(z_var); -} - -%typemap(varin) bool -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - convert_to_boolean(z_var); - $1 = (Z_TYPE_P(z_var) == IS_TRUE); -} - -%typemap(varin) double,float -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - $1 = zval_get_double(z_var); -} - -%typemap(varin) char -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - convert_to_string(z_var); - if ($1 != Z_STRVAL_P(z_var)[0]) { - $1 = Z_STRVAL_P(z_var)[0]; - } -} - -%typemap(varin) char * -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - char *s1; - convert_to_string(z_var); - s1 = Z_STRVAL_P(z_var); - if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { - if (s1) - $1 = estrdup(s1); - else - $1 = NULL; - } -} - - -%typemap(varin) SWIGTYPE [] -{ - if ($1) { - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, $owner); - } -} - -%typemap(varin) char [ANY] -{ - zval **z_var; - char *s1; - - zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1, (void**)&z_var); - s1 = Z_STRVAL_P(z_var); - if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { - if (s1) - strncpy($1, s1, $1_dim0); - } -} - -%typemap(varin) SWIGTYPE -{ - zval *z_var; - $&1_ltype _temp; - - z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - if (SWIG_ConvertPtr(z_var, (void**)&_temp, $&1_descriptor, 0) < 0) { - SWIG_PHP_Error(E_ERROR,"Type error in value of $symname. Expected $&1_descriptor"); - } - - $1 = *($&1_ltype)_temp; -} - -%typemap(varin) SWIGTYPE *, SWIGTYPE &, SWIGTYPE && -{ - zval *z_var; - $1_ltype _temp; - - z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - if (SWIG_ConvertPtr(z_var, (void **)&_temp, $1_descriptor, 0) < 0) { - SWIG_PHP_Error(E_ERROR,"Type error in value of $symname. Expected $&1_descriptor"); - } - - $1 = ($1_ltype)_temp; -} - -%typemap(varin, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - void * p = (void*)zend_fetch_resource_ex(z_var, SWIG_MEMBER_PTR, swig_member_ptr); - memcpy(&$1, p, sizeof($1)); -} - -%typemap(varout) int, - unsigned int, - unsigned short, - short, - long, - unsigned long, - signed char, - unsigned char, - enum SWIGTYPE -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - if ($1 != ($1_ltype)Z_LVAL_P(z_var)) { - z_var->value.lval = (long)$1; - } -} - -//SAMFIX need to cast zval->type, what if zend-hash_find fails? etc? -%typemap(varout) bool -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - if ($1 != ($1_ltype)Z_LVAL_P(z_var)) { - z_var->value.lval = (long)$1; - } -} - -%typemap(varout) double, float -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - if ($1 != ($1_ltype)Z_DVAL_P(z_var)) { - z_var->value.dval = (double)$1; - } -} - -%typemap(varout) char -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - char c = $1; - if ($1 != Z_STRVAL_P(z_val)[0]) { - ZVAL_STRING(z_var, &c); - } -} - -%typemap(varout) char * -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - const char *s1 = Z_STRVAL_P(z_var); - if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { - if (s1) - efree(s1); - if ($1) { - (z_var)->value.str.val = estrdup($1); - (z_var)->value.str.len = strlen($1) + 1; - } else { - (z_var)->value.str.val = 0; - (z_var)->value.str.len = 0; - } - } -} - -%typemap(varout) SWIGTYPE -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - SWIG_SetPointerZval(z_var, (void*)&$1, $&1_descriptor, 0); -} - -%typemap(varout) SWIGTYPE [] -{ - if($1) { - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); - } -} - -%typemap(varout) char [ANY] -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - const char *s1 = Z_STRVAL_P(z_var); -deliberate error cos this code looks bogus to me - if ((s1 == NULL) || strcmp(s1, $1)) { - if ($1) { - (z_var)->value.str.val = estrdup($1); - (z_var)->value.str.len = strlen($1) + 1; - } else { - (z_var)->value.str.val = 0; - (z_var)->value.str.len = 0; - } - } -} - -%typemap(varout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE && -{ - zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); - SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); -} - -%typemap(varout, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) -{ - zval resource; - void * p = emalloc(sizeof($1)); - memcpy(p, &$1, sizeof($1)); - ZVAL_RES(&resource, zend_register_resource(p, swig_member_ptr)); - zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &resource); -} diff --git a/Lib/php/php.swg b/Lib/php/php.swg index 4eba6be2a..6e4ee2d2f 100644 --- a/Lib/php/php.swg +++ b/Lib/php/php.swg @@ -10,7 +10,6 @@ %include // PHP initialization routine. -%include // Global variables. %include // use %init %{ "/*code goes here*/ " %} @@ -86,56 +85,74 @@ /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype tmp) %{ - if (SWIG_ConvertPtr(&$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); - } - $1 = *tmp; + if (SWIG_ConvertPtr(&$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { + zend_type_error("Expected $&1_descriptor for argument $argnum of $symname"); + return; + } + $1 = *tmp; %} %typemap(directorout) SWIGTYPE ($&1_ltype tmp) %{ - /* If exit was via exception, PHP NULL is returned so skip the conversion. */ - if (!EG(exception)) { - if (SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); - $result = *tmp; - } + if (SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { + zend_type_error("Expected $&1_descriptor for argument $argnum of $symname"); + SWIG_fail; + } + $result = *tmp; %} %typemap(in) SWIGTYPE *, SWIGTYPE [] %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; + } %} -%typemap(in) SWIGTYPE & +%typemap(directorout) SWIGTYPE * (swig_owntype own), + SWIGTYPE [] (swig_owntype own) %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtrAndOwn($input, (void **)&$result, $1_descriptor, SWIG_POINTER_DISOWN, &own) < 0) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + SWIG_fail; + } + swig_acquire_ownership_obj((void*)$result, own); %} -%typemap(in) SWIGTYPE && +%typemap(in) SWIGTYPE &, + SWIGTYPE && %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; + } +%} + +%typemap(directorout) SWIGTYPE & ($1_ltype tmp), + SWIGTYPE && ($1_ltype tmp) +%{ + if (SWIG_ConvertPtr($input, (void **) &tmp, $1_descriptor, 0) < 0 || tmp == NULL) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + SWIG_fail; + } + $result = tmp; %} %typemap(in) SWIGTYPE *const& ($*ltype temp) %{ - if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $*1_descriptor"); - } - $1 = ($1_ltype)&temp; + if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) { + zend_type_error("Expected $*1_descriptor for argument $argnum of $symname"); + return; + } + $1 = ($1_ltype)&temp; %} %typemap(in) SWIGTYPE *DISOWN %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); + if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN) < 0) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; } %} @@ -146,17 +163,20 @@ %typemap(in) void * %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, 0, 0) < 0) { - /* Allow NULL from php for void* */ - if (Z_ISNULL($input)) $1=0; - else - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtr(&$input, (void **) &$1, 0, 0) < 0) { + /* Allow NULL from php for void* */ + if (Z_ISNULL($input)) { + $1=0; + } else { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; + } + } %} /* Special case when void* is passed by reference so it can be made to point to opaque api structs */ -%typemap(in) void ** ($*1_ltype ptr, int force), +%typemap(in, byref=1) void ** ($*1_ltype ptr, int force), void *& ($*1_ltype ptr, int force) { /* If they pass NULL by reference, make it into a void* @@ -165,7 +185,8 @@ /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ - SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); + zend_throw_exception(zend_ce_type_error, "Type error in argument $arg of $symname", 0); + return; } } force=0; @@ -183,8 +204,8 @@ %typemap(argout) void **, void *& %{ - if (force$argnum) { - SWIG_SetPointerZval(&$input, (void*) ptr$argnum, $*1_descriptor, 1); + if (force$argnum && Z_ISREF($input)) { + SWIG_SetPointerZval(Z_REFVAL($input), (void*) ptr$argnum, $*1_descriptor, 1); } %} @@ -370,12 +391,12 @@ SWIGTYPE &, SWIGTYPE && %{ - SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner); + SWIG_SetPointerZval($result, (void *)$1, $1_descriptor, $owner); %} %typemap(out) SWIGTYPE *const& %{ - SWIG_SetPointerZval(return_value, (void *)*$1, $*1_descriptor, $owner); + SWIG_SetPointerZval($result, (void *)*$1, $*1_descriptor, $owner); %} %typemap(directorin) SWIGTYPE *, @@ -383,19 +404,19 @@ SWIGTYPE &, SWIGTYPE && %{ - SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, ($owner)|2); + SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, $owner); %} -%typemap(out, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) +%typemap(out) SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); - RETVAL_RES(zend_register_resource(p, swig_member_ptr)); + SWIG_SetPointerZval($result, (void *)p, $&1_descriptor, 1); } -%typemap(in, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) +%typemap(in) SWIGTYPE (CLASS::*) { - void * p = (void*)zend_fetch_resource_ex(&$input, SWIG_MEMBER_PTR, swig_member_ptr); + void * p = SWIG_Z_FETCH_OBJ_P(&$input)->ptr; memcpy(&$1, p, sizeof($1)); } @@ -403,33 +424,30 @@ SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); - SWIG_SetPointerZval(return_value, (void *)$1, ty, $owner); + SWIG_SetPointerZval($result, (void *)$1, ty, $owner); } %typemap(out) SWIGTYPE +{ #ifdef __cplusplus -{ $&1_ltype resultobj = new $1_ltype((const $1_ltype &) $1); - SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); -} #else -{ - $&1_ltype resultobj = ($&1_ltype) emalloc(sizeof($1_type)); + $&1_ltype resultobj = ($&1_ltype) malloc(sizeof($1_type)); memcpy(resultobj, &$1, sizeof($1_type)); - SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); -} #endif + SWIG_SetPointerZval($result, (void *)resultobj, $&1_descriptor, 1); +} %typemap(directorin) SWIGTYPE %{ - SWIG_SetPointerZval($input, SWIG_as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&1_descriptor, 1|2); + SWIG_SetPointerZval($input, SWIG_as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&1_descriptor, 1); %} %typemap(out) void ""; %typemap(out) char [ANY] { - int len = 0; + size_t len = 0; while (len < $1_dim0 && $1[len]) ++len; RETVAL_STRINGL($1, len); } @@ -465,7 +483,10 @@ %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE) %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING) -%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char [] +%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *& + " $1 = (Z_TYPE($input) == IS_STRING || Z_TYPE($input) == IS_NULL); " + +%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char [] " $1 = (Z_TYPE($input) == IS_STRING); " %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE @@ -537,3 +558,6 @@ /* php keywords */ %include + +/* PHP known interfaces */ +%include diff --git a/Lib/php/phpinit.swg b/Lib/php/phpinit.swg index 1665f5dc4..40f7b0766 100644 --- a/Lib/php/phpinit.swg +++ b/Lib/php/phpinit.swg @@ -7,19 +7,6 @@ %init %{ SWIG_php_minit { + zend_class_entry SWIGUNUSED internal_ce; SWIG_InitializeModule((void*)&module_number); %} - -%fragment("swig_php_init_member_ptr2", "header") %{ -#define SWIG_MEMBER_PTR "CLASS::*" - -static void swig_member_ptr_dtor(zend_resource *res) { - efree(res->ptr); -} - -static int swig_member_ptr = 0; -%} - -%fragment("swig_php_init_member_ptr", "init", fragment="swig_php_init_member_ptr2") %{ - swig_member_ptr = zend_register_list_destructors_ex(swig_member_ptr_dtor, NULL, SWIG_MEMBER_PTR, module_number); -%} diff --git a/Lib/php/phpinterfaces.i b/Lib/php/phpinterfaces.i new file mode 100644 index 000000000..dda219d91 --- /dev/null +++ b/Lib/php/phpinterfaces.i @@ -0,0 +1,62 @@ +/* ----------------------------------------------------------------------------- + * phpinterfaces.i + * + * Define "known" PHP interfaces. + * + * These can be added at MINIT time (which is when PHP loads the extension + * module). + * + * Any interface can be added via phpinterfaces, but looking up the + * zend_class_entry by name has to wait until RINIT time, which means it + * happens for every request. + * ----------------------------------------------------------------------------- */ + +// Note: Abstract interfaces such as "Traversable" can't be used in +// "implements" so are not relevant here. + +%insert(header) %{ + +#define SWIG_PHP_INTERFACE_Iterator_CE zend_ce_iterator +#define SWIG_PHP_INTERFACE_Iterator_HEADER "zend_interfaces.h" + +#define SWIG_PHP_INTERFACE_IteratorAggregate_CE zend_ce_aggregate +#define SWIG_PHP_INTERFACE_IteratorAggregate_HEADER "zend_interfaces.h" + +#define SWIG_PHP_INTERFACE_ArrayAccess_CE zend_ce_arrayaccess +#define SWIG_PHP_INTERFACE_ArrayAccess_HEADER "zend_interfaces.h" + +#define SWIG_PHP_INTERFACE_Serializable_CE zend_ce_serializable +#define SWIG_PHP_INTERFACE_Serializable_HEADER "zend_interfaces.h" + +#define SWIG_PHP_INTERFACE_Countable_CE zend_ce_countable +#define SWIG_PHP_INTERFACE_Countable_HEADER "zend_interfaces.h" + +#define SWIG_PHP_INTERFACE_OuterIterator_CE spl_ce_OuterIterator +#define SWIG_PHP_INTERFACE_OuterIterator_HEADER "ext/spl/spl_iterators.h" + +#define SWIG_PHP_INTERFACE_RecursiveIterator_CE spl_ce_RecursiveIterator +#define SWIG_PHP_INTERFACE_RecursiveIterator_HEADER "ext/spl/spl_iterators.h" + +#define SWIG_PHP_INTERFACE_SeekableIterator_CE spl_ce_SeekableIterator +#define SWIG_PHP_INTERFACE_SeekableIterator_HEADER "ext/spl/spl_iterators.h" + +#define SWIG_PHP_INTERFACE_SplObserver_CE spl_ce_SplObserver +#define SWIG_PHP_INTERFACE_SplObserver_HEADER "ext/spl/spl_observer.h" + +#define SWIG_PHP_INTERFACE_SplSubject_CE spl_ce_SplSubject +#define SWIG_PHP_INTERFACE_SplSubject_HEADER "ext/spl/spl_observer.h" + +#define SWIG_PHP_INTERFACE_DateTimeInterface_CE php_date_get_interface_ce() +#define SWIG_PHP_INTERFACE_DateTimeInterface_HEADER "ext/date/php_date.h" + +// The "json" extension needs to be loaded earlier that us for this to work. +#define SWIG_PHP_INTERFACE_JsonSerializable_CE php_json_serializable_ce +#define SWIG_PHP_INTERFACE_JsonSerializable_HEADER "ext/json/php_json.h" + +// New in PHP 8.0. +#if PHP_MAJOR >= 8 +# define SWIG_PHP_INTERFACE_Stringable_CE zend_ce_stringable +# define SWIG_PHP_INTERFACE_Stringable_HEADER "zend_interfaces.h" +#endif + +%} diff --git a/Lib/php/phpkw.swg b/Lib/php/phpkw.swg index 5c5296a1f..e431fc2e4 100644 --- a/Lib/php/phpkw.swg +++ b/Lib/php/phpkw.swg @@ -55,6 +55,7 @@ PHPKW(endwhile); PHPKW(extends); PHPKW(final); PHPKW(finally); +PHPKW(fn); // as of PHP 7.4 PHPKW(for); PHPKW(foreach); PHPKW(function); @@ -65,6 +66,7 @@ PHPKW(implements); PHPKW(instanceof); PHPKW(insteadof); PHPKW(interface); +PHPKW(match); // as of PHP 8.0 PHPKW(namespace); PHPKW(new); PHPKW(or); @@ -119,6 +121,10 @@ PHPBN2(PHP_SAPI); PHPBN2(PHP_EOL); PHPBN2(PHP_INT_MAX); PHPBN2(PHP_INT_SIZE); +PHPBN2(PHP_FLOAT_DIG); // Since 7.2.0 +PHPBN2(PHP_FLOAT_EPSILON); // Since 7.2.0 +PHPBN2(PHP_FLOAT_MIN); // Since 7.2.0 +PHPBN2(PHP_FLOAT_MAX); // Since 7.2.0 PHPBN2(DEFAULT_INCLUDE_PATH); PHPBN2(PEAR_INSTALL_DIR); PHPBN2(PEAR_EXTENSION_DIR); @@ -134,6 +140,7 @@ PHPBN2(PHP_LOCALSTATEDIR); PHPBN2(PHP_CONFIG_FILE_PATH); PHPBN2(PHP_CONFIG_FILE_SCAN_DIR); PHPBN2(PHP_SHLIB_SUFFIX); +PHPBN2(PHP_FD_SETSIZE); // Since 7.1.0 PHPBN2(E_ERROR); PHPBN2(E_WARNING); PHPBN2(E_PARSE); @@ -145,6 +152,7 @@ PHPBN2(E_COMPILE_WARNING); PHPBN2(E_USER_ERROR); PHPBN2(E_USER_WARNING); PHPBN2(E_USER_NOTICE); +PHPBN2(E_RECOVERABLE_ERROR); PHPBN2(E_DEPRECATED); PHPBN2(E_USER_DEPRECATED); PHPBN2(E_ALL); @@ -156,6 +164,9 @@ PHPBN2(__COMPILER_HALT_OFFSET__); PHPBN2(PHP_OUTPUT_HANDLER_START); PHPBN2(PHP_OUTPUT_HANDLER_CONT); PHPBN2(PHP_OUTPUT_HANDLER_END); +/* Since 7.4.0 (Microsoft Windows only) */ +PHPBN2(PHP_WINDOWS_EVENT_CTRL_C); +PHPBN2(PHP_WINDOWS_EVENT_CTRL_BREAK); /* These don't actually seem to be set (tested on Linux, I guess they're * Windows only?) */ PHPBN2(PHP_WINDOWS_NT_DOMAIN_CONTROLLER); @@ -402,21 +413,6 @@ PHPBN2(CURLOPT_TCP_NODELAY); PHPBN2(CURLOPT_TIMEOUT_MS); PHPBN2(CURLOPT_CONNECTTIMEOUT_MS); PHPBN2(GMP_VERSION); -PHPBN2(SWFTEXTFIELD_USEFONT); -PHPBN2(SWFTEXTFIELD_AUTOSIZE); -PHPBN2(SWF_SOUND_NOT_COMPRESSED); -PHPBN2(SWF_SOUND_ADPCM_COMPRESSED); -PHPBN2(SWF_SOUND_MP3_COMPRESSED); -PHPBN2(SWF_SOUND_NOT_COMPRESSED_LE); -PHPBN2(SWF_SOUND_NELLY_COMPRESSED); -PHPBN2(SWF_SOUND_5KHZ); -PHPBN2(SWF_SOUND_11KHZ); -PHPBN2(SWF_SOUND_22KHZ); -PHPBN2(SWF_SOUND_44KHZ); -PHPBN2(SWF_SOUND_8BITS); -PHPBN2(SWF_SOUND_16BITS); -PHPBN2(SWF_SOUND_MONO); -PHPBN2(SWF_SOUND_STEREO); PHPBN2(OPENSSL_VERSION_NUMBER); PHPBN2(SNMP_OID_OUTPUT_FULL); PHPBN2(SNMP_OID_OUTPUT_NUMERIC); @@ -627,27 +623,26 @@ PHPBN2(PGSQL_POLLING_OK); PHPBN2(PGSQL_POLLING_READING); PHPBN2(PGSQL_POLLING_WRITING); -/* Class names reserved by PHP (case insensitive) */ +/* Class names reserved by PHP. */ +/* Check is case insensitive - these *MUST* be listed in lower case here. */ PHPCN(directory); PHPCN(stdclass); PHPCN(__php_incomplete_class); -/* Added in PHP5. */ PHPCN(exception); PHPCN(errorexception); PHPCN(php_user_filter); PHPCN(closure); PHPCN(generator); PHPCN(self); -PHPCN(static); PHPCN(parent); /* http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.other.classes */ PHPCN(bool); // As of PHP 7.0 PHPCN(int); // As of PHP 7.0 PHPCN(float); // As of PHP 7.0 PHPCN(string); // As of PHP 7.0 -PHPCN(NULL); // As of PHP 7.0 -PHPCN(TRUE); // As of PHP 7.0 -PHPCN(FALSE); // As of PHP 7.0 +PHPCN(null); // As of PHP 7.0 +PHPCN(true); // As of PHP 7.0 +PHPCN(false); // As of PHP 7.0 PHPCN(resource); // As of PHP 7.0 (currently works but reserved) PHPCN(object); // As of PHP 7.0 (currently works but reserved) PHPCN(mixed); // As of PHP 7.0 (currently works but reserved) @@ -655,6 +650,14 @@ PHPCN(numeric); // As of PHP 7.0 (currently works but reserved) /* http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.invalid-class-names */ PHPCN(iterable); // As of PHP 7.1 PHPCN(void); // As of PHP 7.1 +/* Predefined interfaces and classes, introduced in PHP 7.0.0 */ +PHPCN(arithmeticerror); +PHPCN(assertionerror); +PHPCN(divisionbyzeroerror); +PHPCN(error); +PHPCN(throwable); +PHPCN(parseerror); +PHPCN(typeerror); /* From extensions (which of these are actually predefined depends which * extensions are loaded by default). */ PHPCN(xmlwriter); diff --git a/Lib/php/phppointers.i b/Lib/php/phppointers.i index d79697b5e..8b4e75e60 100644 --- a/Lib/php/phppointers.i +++ b/Lib/php/phppointers.i @@ -2,15 +2,11 @@ %typemap(in, byref=1) TYPE *REF ($*1_ltype tmp), TYPE &REF ($*1_ltype tmp) %{ - /* First Check for SWIG wrapped type */ - if (Z_ISNULL($input)) { - $1 = 0; - } else if (Z_ISREF($input)) { - /* Not swig wrapped type, so we check if it's a PHP reference type */ - CONVERT_IN(tmp, $*1_ltype, $input); - $1 = &tmp; + if (Z_ISREF($input)) { + CONVERT_IN(tmp, $*1_ltype, $input); + $1 = &tmp; } else { - SWIG_PHP_Error(E_ERROR, SWIG_PHP_Arg_Error_Msg($argnum, Expected a reference)); + zend_type_error(SWIG_PHP_Arg_Error_Msg($argnum, Expected a reference)); } %} %typemap(argout) TYPE *REF, diff --git a/Lib/php/phprun.swg b/Lib/php/phprun.swg index a07a1b9f8..a3569a783 100644 --- a/Lib/php/phprun.swg +++ b/Lib/php/phprun.swg @@ -4,24 +4,23 @@ * PHP runtime library * ----------------------------------------------------------------------------- */ +#define swig_owntype int + #ifdef __cplusplus extern "C" { #endif -#include "zend.h" -#include "zend_API.h" -#include "zend_exceptions.h" + #include "php.h" -#if PHP_MAJOR_VERSION != 7 -# error These bindings need PHP7 - to generate PHP5 bindings use: SWIG < 4.0.0 and swig -php5 +#if PHP_MAJOR_VERSION < 7 +# error These bindings need PHP 7 or later - to generate PHP5 bindings use: SWIG < 4.0.0 and swig -php5 #endif -#include "ext/standard/php_string.h" -#include /* for abort(), used in generated code. */ +#include "zend_inheritance.h" +#include "zend_exceptions.h" +#include "zend_inheritance.h" -/* This indirection is to work around const correctness issues in older PHP. - * FIXME: Remove for PHP7? Or might user code be using it? */ -#define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_NAMED_FE(ZN, N, A) +#include /* for abort(), used in generated code. */ #define SWIG_BOOL_CONSTANT(N, V) REGISTER_BOOL_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_LONG_CONSTANT(N, V) REGISTER_LONG_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) @@ -32,13 +31,27 @@ extern "C" { REGISTER_STRINGL_CONSTANT(#N, &swig_char, 1, CONST_CS | CONST_PERSISTENT);\ } while (0) -/* ZEND_CONSTANT_SET_FLAGS is new in PHP 7.3. */ +/* ZEND_CONSTANT_SET_FLAGS was new in PHP 7.3. */ #ifdef ZEND_CONSTANT_SET_FLAGS # define SWIG_ZEND_CONSTANT_SET_FLAGS ZEND_CONSTANT_SET_FLAGS #else # define SWIG_ZEND_CONSTANT_SET_FLAGS(C, F, N) do { (C)->flags = (F); (C)->module_number = (N); } while (0) #endif +/* zend_object_alloc was new in PHP 7.3. */ +#if PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION < 3 +static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_entry *ce) { + void *obj = emalloc(obj_size + zend_object_properties_size(ce)); + memset(obj, 0, obj_size - sizeof(zval)); + return obj; +} +#endif + +/* ZEND_THIS was new in PHP 7.4. */ +#ifndef ZEND_THIS +# define ZEND_THIS &EX(This) +#endif + #ifdef __cplusplus } #endif @@ -50,10 +63,10 @@ static int default_error_code = E_ERROR; #define SWIG_PHP_Arg_Error_Msg(argnum,extramsg) "Error in argument " #argnum " "#extramsg -#define SWIG_PHP_Error(code,msg) do { SWIG_ErrorCode() = code; SWIG_ErrorMsg() = msg; SWIG_fail; } while (0) +#define SWIG_PHP_Error(code,msg) do { zend_throw_exception(NULL, msg, code); SWIG_fail; } while (0) #define SWIG_contract_assert(expr,msg) \ - if (!(expr) ) { zend_printf("Contract Assert Failed %s\n",msg ); } else + do { if (!(expr)) zend_printf("Contract Assert Failed %s\n", msg); } while (0) /* Standard SWIG API */ #define SWIG_GetModule(clientdata) SWIG_Php_GetModule() @@ -64,74 +77,49 @@ static int default_error_code = E_ERROR; typedef struct { void * ptr; int newobject; + const swig_type_info * type; + zend_object std; } swig_object_wrapper; +#define SWIG_Z_FETCH_OBJ_P(zv) php_fetch_object(Z_OBJ_P(zv)) + +static inline +swig_object_wrapper * php_fetch_object(zend_object *obj) { + return (swig_object_wrapper *)((char *)obj - XtOffsetOf(swig_object_wrapper, std)); +} + #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) static void SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) { - /* - * First test for Null pointers. Return those as PHP native NULL - */ - if (!ptr ) { + // Return PHP NULL for a C/C++ NULL pointer. + if (!ptr) { ZVAL_NULL(z); return; } - if (type->clientdata) { - swig_object_wrapper *value; - if (! (*(int *)(type->clientdata))) - zend_error(E_ERROR, "Type: %s failed to register with zend",type->name); - value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); - value->ptr=ptr; - value->newobject=(newobject & 1); - if ((newobject & 2) == 0) { - /* Just register the pointer as a resource. */ - ZVAL_RES(z, zend_register_resource(value, *(int *)(type->clientdata))); - } else { - /* - * Wrap the resource in an object, the resource will be accessible - * via the "_cPtr" member. This is currently only used by - * directorin typemaps. - */ - zval resource; - zend_class_entry *ce = NULL; - const char *type_name = type->name+3; /* +3 so: _p_Foo -> Foo */ - size_t type_name_len; - const char * p; - HashTable * ht; - /* Namespace__Foo -> Foo */ - /* FIXME: ugly and goes wrong for classes with __ in their names. */ - while ((p = strstr(type_name, "__")) != NULL) { - type_name = p + 2; - } - type_name_len = strlen(type_name); - - ZVAL_RES(&resource, zend_register_resource(value, *(int *)(type->clientdata))); - if (SWIG_PREFIX_LEN > 0) { - zend_string * classname = zend_string_alloc(SWIG_PREFIX_LEN + type_name_len, 0); - memcpy(classname->val, SWIG_PREFIX, SWIG_PREFIX_LEN); - memcpy(classname->val + SWIG_PREFIX_LEN, type_name, type_name_len); - ce = zend_lookup_class(classname); - zend_string_release(classname); - } else { - zend_string * classname = zend_string_init(type_name, type_name_len, 0); - ce = zend_lookup_class(classname); - zend_string_release(classname); - } - if (ce == NULL) { - /* class does not exist */ - ce = zend_standard_class_def; - } - - ALLOC_HASHTABLE(ht); - zend_hash_init(ht, 1, NULL, NULL, 0); - zend_hash_str_update(ht, "_cPtr", sizeof("_cPtr") - 1, &resource); - object_and_properties_init(z, ce, ht); - } + if (!type->clientdata) { + zend_type_error("Type: %s not registered with zend", type->name); return; } - zend_error(E_ERROR, "Type: %s not registered with zend",type->name); + + { + zend_object *obj; + swig_object_wrapper *value; + if (Z_TYPE_P(z) == IS_OBJECT) { + /* The PHP object is already initialised - this is the case when wrapping + * the return value from a PHP constructor. */ + obj = Z_OBJ_P(z); + } else { + zend_class_entry *ce = (zend_class_entry*)(type->clientdata); + obj = ce->create_object(ce); + ZVAL_OBJ(z, obj); + } + value = php_fetch_object(obj); + value->ptr = ptr; + value->newobject = (newobject & 1); + value->type = type; + } } /* This pointer conversion routine takes the native pointer p (along with @@ -139,15 +127,10 @@ SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) { according to ty. The resultant pointer is returned, or NULL is returned if the pointer can't be cast. - Sadly PHP has no API to find a type name from a type id, only from an - instance of a resource of the type id, so we have to pass type_name as well. - - The two functions which might call this are: - SWIG_ConvertResourcePtr which gets the type name from the resource - and the registered zend destructors for which we have one per type each - with the type name hard wired in. */ + This is called by SWIG_ConvertPtr which gets the type name from the + swig_object_wrapper. */ static void * -SWIG_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty) { +SWIG_ConvertPtrData(void * p, const char *type_name, swig_type_info *ty, int *own) { swig_cast_info *tc; void *result = 0; @@ -156,7 +139,7 @@ SWIG_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty) { return p; } - if (! type_name) { + if (! type_name) { /* can't convert p to ptr type ty if we don't know what type p is */ return NULL; } @@ -166,62 +149,36 @@ SWIG_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty) { if (tc) { int newmemory = 0; result = SWIG_TypeCast(tc, p, &newmemory); - assert(!newmemory); /* newmemory handling not yet implemented */ + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ + if (own) + *own |= SWIG_CAST_NEW_MEMORY; + } } return result; } -/* This function returns a pointer of type ty by extracting the pointer - and type info from the resource in z. z must be a resource. - If it fails, NULL is returned. - It uses SWIG_ConvertResourceData to do the real work. */ -static void * -SWIG_ConvertResourcePtr(zval *z, swig_type_info *ty, int flags) { - swig_object_wrapper *value; - void *p; - const char *type_name; - - if (Z_RES_TYPE_P(z) == -1) return NULL; - value = (swig_object_wrapper *) Z_RES_VAL_P(z); - if (flags & SWIG_POINTER_DISOWN) { - value->newobject = 0; - } - p = value->ptr; - - type_name=zend_rsrc_list_get_rsrc_type(Z_RES_P(z)); - - return SWIG_ConvertResourceData(p, type_name, ty); -} - -/* We allow passing of a RESOURCE pointing to the object or an OBJECT whose - _cPtr is a resource pointing to the object */ +/* We wrap C/C++ pointers as PHP objects. */ static int -SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) { +SWIG_ConvertPtrAndOwn(zval *z, void **ptr, swig_type_info *ty, int flags, swig_owntype *own) { + if (own) + *own = 0; + if (z == NULL) { *ptr = 0; - return 0; + return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } switch (Z_TYPE_P(z)) { case IS_OBJECT: { - HashTable * ht = Z_OBJ_HT_P(z)->get_properties(z); - if (ht) { - zval * _cPtr = zend_hash_str_find(ht, "_cPtr", sizeof("_cPtr") - 1); - if (_cPtr) { - if (Z_TYPE_P(_cPtr) == IS_INDIRECT) { - _cPtr = Z_INDIRECT_P(_cPtr); - } - if (Z_TYPE_P(_cPtr) == IS_RESOURCE) { - *ptr = SWIG_ConvertResourcePtr(_cPtr, ty, flags); - return (*ptr == NULL ? -1 : 0); - } - } + swig_object_wrapper *value = SWIG_Z_FETCH_OBJ_P(z); + *ptr = SWIG_ConvertPtrData(value->ptr, value->type->name, ty, own); + if (*ptr == NULL) return SWIG_ERROR; + if (flags & SWIG_POINTER_DISOWN) { + value->newobject = 0; } - break; + return SWIG_OK; } - case IS_RESOURCE: - *ptr = SWIG_ConvertResourcePtr(z, ty, flags); - return (*ptr == NULL ? -1 : 0); case IS_NULL: *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; @@ -230,6 +187,11 @@ SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) { return -1; } +static int +SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) { + return SWIG_ConvertPtrAndOwn(z, ptr, ty, flags, 0); +} + static const char const_name[] = "swig_runtime_data_type_pointer"; static swig_module_info *SWIG_Php_GetModule() { zval *pointer = zend_get_constant_str(const_name, sizeof(const_name) - 1); @@ -237,7 +199,7 @@ static swig_module_info *SWIG_Php_GetModule() { if (Z_TYPE_P(pointer) == IS_LONG) { return (swig_module_info *) pointer->value.lval; } - } + } return NULL; } diff --git a/Lib/php/std_common.i b/Lib/php/std_common.i index 092bf012b..1b69fc779 100644 --- a/Lib/php/std_common.i +++ b/Lib/php/std_common.i @@ -7,4 +7,3 @@ %include %apply size_t { std::size_t }; - diff --git a/Lib/php/std_map.i b/Lib/php/std_map.i index 7c0157353..fed3cf0b3 100644 --- a/Lib/php/std_map.i +++ b/Lib/php/std_map.i @@ -35,7 +35,7 @@ namespace std { map(); map(const map& other); - + unsigned int size() const; void clear(); %extend { diff --git a/Lib/php/std_string.i b/Lib/php/std_string.i index b55751f07..082a32ce1 100644 --- a/Lib/php/std_string.i +++ b/Lib/php/std_string.i @@ -33,10 +33,8 @@ namespace std { %} %typemap(directorout) string %{ - if (!EG(exception)) { convert_to_string($input); $result.assign(Z_STRVAL_P($input), Z_STRLEN_P($input)); - } %} %typemap(out) string %{ @@ -74,12 +72,10 @@ namespace std { %} %typemap(directorout) string & ($*1_ltype *temp) %{ - if (!EG(exception)) { convert_to_string($input); temp = new $*1_ltype(Z_STRVAL_P($input), Z_STRLEN_P($input)); swig_acquire_ownership(temp); $result = temp; - } %} %typemap(argout) string & %{ diff --git a/Lib/php/std_vector.i b/Lib/php/std_vector.i index e633bc3ad..382b37ca0 100644 --- a/Lib/php/std_vector.i +++ b/Lib/php/std_vector.i @@ -112,5 +112,3 @@ namespace std { %define specialize_std_vector(T) #warning "specialize_std_vector - specialization for type T no longer needed" %enddef - - diff --git a/Lib/php/stl.i b/Lib/php/stl.i index 04f86014f..38aba67b8 100644 --- a/Lib/php/stl.i +++ b/Lib/php/stl.i @@ -7,4 +7,3 @@ %include %include %include - diff --git a/Lib/php/typemaps.i b/Lib/php/typemaps.i index c248a588e..94b351113 100644 --- a/Lib/php/typemaps.i +++ b/Lib/php/typemaps.i @@ -276,7 +276,8 @@ INT_TYPEMAP(unsigned long long); /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ - SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); + zend_type_error("Expected reference or NULL for argument $arg of $symname"); + return; } } force=0; diff --git a/Lib/php/utils.i b/Lib/php/utils.i index ed6e08ff4..b8fd9091d 100644 --- a/Lib/php/utils.i +++ b/Lib/php/utils.i @@ -17,8 +17,8 @@ errno = 0; lvar = (t) strtoll(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; - /* FALL THRU */ } + /* FALL THRU */ default: lvar = (t) zval_get_long(&invar); } @@ -34,8 +34,8 @@ errno = 0; lvar = (t) strtoull(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; - /* FALL THRU */ } + /* FALL THRU */ default: lvar = (t) zval_get_long(&invar); } @@ -75,16 +75,21 @@ %} %typemap(directorout) TYPE %{ - if (!EG(exception)) { - CONVERT_IN($result, $1_ltype, *$input); - } + CONVERT_IN($result, $1_ltype, *$input); %} -%typemap(directorout) const TYPE & ($*1_ltype temp) +%typemap(directorout) const TYPE & %{ - if (!EG(exception)) { - CONVERT_IN(temp, $*1_ltype, *$input); + $*1_ltype swig_val; + CONVERT_IN(swig_val, $*1_ltype, *$input); + $1_ltype temp = new $*1_ltype(($*1_ltype)swig_val); + swig_acquire_ownership(temp); + $result = temp; +%} +%typemap(directorfree) const TYPE & +%{ + if (director) { + director->swig_release_ownership(%as_voidptr($input)); } - $result = &temp; %} %enddef diff --git a/Lib/pike/pike.swg b/Lib/pike/pike.swg deleted file mode 100644 index a36bf3ad2..000000000 --- a/Lib/pike/pike.swg +++ /dev/null @@ -1,326 +0,0 @@ -/* ----------------------------------------------------------------------------- - * pike.swg - * - * Pike configuration module. - * ----------------------------------------------------------------------------- */ - -%insert(runtime) "swigrun.swg"; // Common C API type-checking code -%insert(runtime) "pikerun.swg"; // Pike run-time code - -%insert(runtime) %{ -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -#ifdef __cplusplus -} -#endif -%} - -/* ----------------------------------------------------------------------------- - * standard typemaps - * ----------------------------------------------------------------------------- */ - -/* --- Input arguments --- */ - -/* Primitive datatypes. */ - -%typemap(in, pikedesc="tInt") - int, unsigned int, short, unsigned short, - long, unsigned long, char, signed char, unsigned char, - bool, enum SWIGTYPE, long long, unsigned long long -{ - if ($input.type != T_INT) - Pike_error("Bad argument: Expected an integer.\n"); - $1 = ($1_ltype) $input.u.integer; -} - -%typemap(in, pikedesc="tFloat") float, double { - if ($input.type != T_FLOAT) - Pike_error("Bad argument: Expected a float.\n"); - $1 = ($1_ltype) $input.u.float_number; -} - -%typemap(in, pikedesc="tStr") char *, char [ANY] { - if ($input.type != T_STRING) - Pike_error("Bad argument: Expected a string.\n"); - $1 = ($1_ltype) STR0($input.u.string); -} - -/* Pointers, references and arrays */ - -%typemap(in) SWIGTYPE *, - SWIGTYPE &, - SWIGTYPE &&, - SWIGTYPE [] - "SWIG_ConvertPtr($input.u.object, (void **) &$1, $1_descriptor, 1);" - -/* Void pointer. Accepts any kind of pointer */ -%typemap(in) void * "/* FIXME */"; - -/* Object passed by value. Convert to a pointer */ -%typemap(in) SWIGTYPE ($&1_ltype argp) "/* FIXME */"; - -/* Pointer to a class member */ -%typemap(in) SWIGTYPE (CLASS::*) "/* FIXME */"; - -/* Const primitive references. Passed by value */ - -%typemap(in, pikedesc="tInt") const int & (int temp), - const short & (short temp), - const long & (long temp), - const unsigned int & (unsigned int temp), - const unsigned short & (unsigned short temp), - const unsigned long & (unsigned long temp), - const char & (char temp), - const signed char & (signed char temp), - const unsigned char & (unsigned char temp), - const bool & (bool temp), - const long long & ($*1_ltype temp), - const unsigned long long & ($*1_ltype temp), - const enum SWIGTYPE & ($*1_ltype temp), - const enum SWIGTYPE && ($*1_ltype temp) -{ - if ($input.type != T_INT) - Pike_error("Bad argument: Expected an integer.\n"); - temp = ($*1_ltype) $input.u.integer; - $1 = &temp; -} - -%typemap(in, pikedesc="tFloat") const float & (float temp), - const double & (double temp) -{ - if ($input.type != T_FLOAT) - Pike_error("Bad argument: Expected a float.\n"); - temp = ($*1_ltype) $input.u.float_number; - $1 = &temp; -} - -/* ----------------------------------------------------------------------------- - * Output Typemaps - * ----------------------------------------------------------------------------- */ -%typemap(out, pikedesc="tInt") - int, unsigned int, - short, unsigned short, - long, unsigned long, - char, signed char, unsigned char, - bool, enum SWIGTYPE - "push_int($1);"; - -%typemap(out, pikedesc="tInt") long long "push_int64($1);"; -%typemap(out, pikedesc="tInt") unsigned long long "push_int64($1);"; -%typemap(out, pikedesc="tFloat") float, double "push_float($1);"; -%typemap(out, pikedesc="tStr") char * "push_text($1);"; - -/* Pointers, references, and arrays */ -%typemap(out, pikedesc="tObj") SWIGTYPE*, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "push_object(SWIG_NewPointerObj((void *) $1, $1_descriptor, $owner));"; - -/* Void return value; don't push anything */ -%typemap(out, pikedesc="tVoid") void ""; - -/* Dynamic casts */ - -%typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC "/* FIXME */"; - -/* Member pointer */ -%typemap(out) SWIGTYPE (CLASS::*) "/* FIXME */"; - -/* Special typemap for character array return values */ -%typemap(out, pikedesc="tStr") char [ANY], const char [ANY] "push_text($1);"; - -/* Primitive types--return by value */ -%typemap(out, pikedesc="tObj") SWIGTYPE -#ifdef __cplusplus -{ - $&1_ltype resultptr; - resultptr = new $1_ltype((const $1_ltype &) $1); - push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); -} -#else -{ - $&1_ltype resultptr; - resultptr = ($&1_ltype) malloc(sizeof($1_type)); - memmove(resultptr, &$1, sizeof($1_type)); - push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); -} -#endif - -/* References to primitive types. Return by value */ - -%typemap(out, pikedesc="tInt") const int &, const unsigned int &, - const short &, const unsigned short &, - const long &, const unsigned long &, - const char &, const signed char &, const unsigned char &, - const bool &, - const long long &, const unsigned long long &, - const enum SWIGTYPE & ($*1_ltype temp), - const enum SWIGTYPE && ($*1_ltype temp) - "push_int(*($1));"; - -%typemap(out, pikedesc="tFloat") const float &, const double & "push_float(*($1));"; - -/************************ Constant Typemaps *****************************/ - -%typemap(constant) - int, unsigned int, - short, unsigned short, - long, unsigned long, - signed char, unsigned char, - bool, enum SWIGTYPE, - long long, unsigned long long - "add_integer_constant(\"$symname\", $1, 0);"; - -%typemap(constant) char - "add_integer_constant(\"$symname\", '$1', 0);"; - -%typemap(constant) long long, unsigned long long - "add_integer_constant(\"$symname\", $1, 0);"; - -%typemap(constant) float, double - "add_float_constant(\"$symname\", $1, 0);"; - -%typemap(constant) char * - "add_string_constant(\"$symname\", \"$1\", 0);"; - -/* ------------------------------------------------------------ - * String & length - * ------------------------------------------------------------ */ - -%typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { - if ($input.type != T_STRING) - Pike_error("Bad argument: Expected a string.\n"); - $1 = ($1_ltype) STR0($input.u.string); - $2 = ($2_ltype) $input.u.string->length; -} - -/* ------------------------------------------------------------ - * ANSI C typemaps - * ------------------------------------------------------------ */ - -%typemap(in, pikedesc="tInt") size_t { - if ($input.type != T_INT) - Pike_error("Bad argument: Expected an integer.\n"); - $1 = ($1_ltype) $input.u.integer; -} - -%typemap(out) size_t = long; - -/* ------------------------------------------------------------ - * Typechecking rules - * ------------------------------------------------------------ */ - -%typecheck(SWIG_TYPECHECK_INTEGER) - int, short, long, - unsigned int, unsigned short, unsigned long, - signed char, unsigned char, - long long, unsigned long long, - const int &, const short &, const long &, - const unsigned int &, const unsigned short &, const unsigned long &, - const long long &, const unsigned long long &, - enum SWIGTYPE, enum SWIGTYPE &, SWIGTYPE &&, - bool, const bool & -{ - $1 = ($input.type == T_INT) ? 1 : 0; -} - -%typecheck(SWIG_TYPECHECK_DOUBLE) - float, double, - const float &, const double & -{ - $1 = (($input.type == T_FLOAT) || ($input.type == T_INT)) ? 1 : 0; -} - -%typecheck(SWIG_TYPECHECK_CHAR) char { - $1 = ($input.type == T_INT) ? 1 : 0; -} - -%typecheck(SWIG_TYPECHECK_STRING) char * { - $1 = ($input.type == T_STRING) ? 1 : 0; -} - -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { - void *ptr; - if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $1_descriptor, 0) == -1) { - $1 = 0; - } else { - $1 = 1; - } -} - -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { - void *ptr; - if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $&1_descriptor, 0) == -1) { - $1 = 0; - } else { - $1 = 1; - } -} - -%typecheck(SWIG_TYPECHECK_VOIDPTR) void * { - void *ptr; - if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, 0, 0) == -1) { - $1 = 0; - } else { - $1 = 1; - } -} - -/* Array reference typemaps */ -%apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } -%apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } - -/* const pointers */ -%apply SWIGTYPE * { SWIGTYPE *const } -%apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } -%apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } - -/* ------------------------------------------------------------ - * Overloaded operator support - * ------------------------------------------------------------ */ - -#ifdef __cplusplus -%rename("`+") *::operator+; -%rename("`-") *::operator-; -%rename("`*") *::operator*; -%rename("`/") *::operator/; -%rename("`%") *::operator%; -%rename("`<<") *::operator<<; -%rename("`>>") *::operator>>; -%rename("`&") *::operator&; -%rename("`|") *::operator|; -%rename("`^") *::operator^; -%rename("`~") *::operator~; -%rename("`<") *::operator<; -%rename("`>") *::operator>; -%rename("`==") *::operator==; - -/* Special cases */ -%rename("`()") *::operator(); - -#endif - -/* ------------------------------------------------------------ - * The start of the Pike initialization function - * ------------------------------------------------------------ */ - -%init "swiginit.swg" - -%init %{ -#ifdef __cplusplus -extern "C" -#endif -PIKE_MODULE_EXIT {} - -#ifdef __cplusplus -extern "C" -#endif -PIKE_MODULE_INIT -{ - struct program *pr; - SWIG_InitializeModule(0); -%} - -/* pike keywords */ -%include diff --git a/Lib/pike/pikekw.swg b/Lib/pike/pikekw.swg deleted file mode 100644 index 844b1f189..000000000 --- a/Lib/pike/pikekw.swg +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef PIKE_PIKEKW_SWG_ -#define PIKE_PIKEKW_SWG_ - -/* Warnings for Pike keywords */ -#define PIKEKW(x) %namewarn("314: '" #x "' is a pike keyword") #x - -/* - from - http://www.http://docs.linux.cz/pike/tutorial_C.html - -*/ - - -PIKEKW(array); -PIKEKW(break); -PIKEKW(case); -PIKEKW(catch); -PIKEKW(continue); -PIKEKW(default); -PIKEKW(do); -PIKEKW(else); -PIKEKW(float); -PIKEKW(for); -PIKEKW(foreach); -PIKEKW(function); -PIKEKW(gauge); -PIKEKW(if); -PIKEKW(inherit); -PIKEKW(inline); -PIKEKW(int); -PIKEKW(lambda); -PIKEKW(mapping); -PIKEKW(mixed); -PIKEKW(multiset); -PIKEKW(nomask); -PIKEKW(object); -PIKEKW(predef); -PIKEKW(private); -PIKEKW(program); -PIKEKW(protected); -PIKEKW(public); -PIKEKW(return); -PIKEKW(sscanf); -PIKEKW(static); -PIKEKW(string); -PIKEKW(switch); -PIKEKW(typeof); -PIKEKW(varargs); -PIKEKW(void); -PIKEKW(while); - - -#undef PIKEKW - -#endif //PIKE_PIKEKW_SWG_ diff --git a/Lib/pike/pikerun.swg b/Lib/pike/pikerun.swg deleted file mode 100644 index 6ec1143cf..000000000 --- a/Lib/pike/pikerun.swg +++ /dev/null @@ -1,71 +0,0 @@ -/* ----------------------------------------------------------------------------- - * pikerun.swg - * - * This file contains the runtime support for Pike modules - * and includes code for managing global variables and pointer - * type checking. - * ----------------------------------------------------------------------------- */ - -#ifdef __cplusplus -extern "C" { -#endif -#include "pike/object.h" -#include "pike/program.h" -#ifdef __cplusplus -} -#endif -#include - -/* Stores information about a wrapped object */ -typedef struct swig_object_wrapper { - void *self; - swig_type_info *type; -} swig_object_wrapper; - -#ifdef THIS -#undef THIS -#endif -#define THIS (((swig_object_wrapper *) Pike_fp->current_storage)->self) - -#define SWIG_ConvertPtr SWIG_Pike_ConvertPtr -#define SWIG_NewPointerObj SWIG_Pike_NewPointerObj -#define SWIG_GetModule(clientdata) SWIG_Pike_GetModule(clientdata) -#define SWIG_SetModule(clientdata, pointer) SWIG_Pike_SetModule(pointer) - -/* These need to be filled in before type sharing between modules will work */ -static swig_module_info *SWIG_Pike_GetModule(void *SWIGUNUSEDPARM(clientdata)) { - return 0; -} - -static void SWIG_Pike_SetModule(swig_module_info *pointer) { - -} - -/* Convert a pointer value */ -static int -SWIG_Pike_ConvertPtr(struct object *obj, void **ptr, swig_type_info *ty, int flags) { - struct program *pr; - swig_cast_info *tc; - swig_object_wrapper *obj_wrapper; - - if (ty) { - pr = (struct program *) ty->clientdata; - obj_wrapper = (swig_object_wrapper *) get_storage(obj, pr); - if (obj_wrapper && obj_wrapper->type) { - tc = SWIG_TypeCheckStruct(obj_wrapper->type, ty); - if (tc) { - int newmemory = 0; - *ptr = SWIG_TypeCast(tc, obj_wrapper->self, &newmemory); - assert(!newmemory); /* newmemory handling not yet implemented */ - return 0; - } - } - } - return -1; -} - -/* Create a new pointer object */ -static struct object * -SWIG_Pike_NewPointerObj(void *ptr, swig_type_info *type, int own) { - return 0; -} diff --git a/Lib/pike/std_string.i b/Lib/pike/std_string.i deleted file mode 100644 index b32b3c112..000000000 --- a/Lib/pike/std_string.i +++ /dev/null @@ -1,60 +0,0 @@ -/* ----------------------------------------------------------------------------- - * std_string.i - * - * SWIG typemaps for std::string - * ----------------------------------------------------------------------------- */ - -%{ -#include -%} - -namespace std { - - %naturalvar string; - - class string; - - /* Overloading check */ - - %typemap(typecheck) string = char *; - %typemap(typecheck) const string & = char *; - - %typemap(in, pikedesc="tStr") string { - if ($input.type != T_STRING) - Pike_error("Bad argument: Expected a string.\n"); - $1.assign(STR0($input.u.string)); - } - - %typemap(in, pikedesc="tStr") const string & ($*1_ltype temp) { - if ($input.type != T_STRING) - Pike_error("Bad argument: Expected a string.\n"); - temp.assign(STR0($input.u.string)); - $1 = &temp; - } - - %typemap(out, pikedesc="tStr") string "push_text($1.c_str());"; - - %typemap(out, pikedesc="tStr") const string & "push_text($1->c_str());"; - - %typemap(directorin) string, const string &, string & "$1.c_str()"; - - %typemap(directorin) string *, const string * "$1->c_str()"; - - %typemap(directorout) string { - if ($input.type == T_STRING) - $result.assign(STR0($input.u.string)); - else - throw Swig::DirectorTypeMismatchException("string expected"); - } - - %typemap(directorout) const string & ($*1_ltype temp) { - if ($input.type == T_STRING) { - temp.assign(STR0($input.u.string)); - $result = &temp; - } else { - throw Swig::DirectorTypeMismatchException("string expected"); - } - } - -} - diff --git a/Lib/python/builtin.swg b/Lib/python/builtin.swg index 28051e67b..4f31a8d54 100644 --- a/Lib/python/builtin.swg +++ b/Lib/python/builtin.swg @@ -256,6 +256,12 @@ SwigPyStaticVar_Type(void) { #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ @@ -334,6 +340,12 @@ SwigPyObjectType(void) { #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ @@ -402,11 +414,7 @@ SwigPyBuiltin_ThisClosure (PyObject *self, void *SWIGUNUSEDPARM(closure)) { SWIGINTERN void SwigPyBuiltin_SetMetaType (PyTypeObject *type, PyTypeObject *metatype) { -#if PY_VERSION_HEX >= 0x03000000 - type->ob_base.ob_base.ob_type = metatype; -#else - type->ob_type = metatype; -#endif + Py_TYPE(type) = metatype; } diff --git a/Lib/python/ccomplex.i b/Lib/python/ccomplex.i index 28872b985..b99f96a48 100644 --- a/Lib/python/ccomplex.i +++ b/Lib/python/ccomplex.i @@ -12,15 +12,16 @@ #include %} +#define complex _Complex /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) -%swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); -%swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); -%swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); +%swig_cplxflt_convn(float _Complex, CCplxConst, creal, cimag); +%swig_cplxdbl_convn(double _Complex, CCplxConst, creal, cimag); +%swig_cplxdbl_convn(_Complex, CCplxConst, creal, cimag); /* declaring the typemaps */ -%typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); -%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); -%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float _Complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double _Complex); +%typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, _Complex); diff --git a/Lib/python/defarg.swg b/Lib/python/defarg.swg index 59450bd82..ba5ff43d4 100644 --- a/Lib/python/defarg.swg +++ b/Lib/python/defarg.swg @@ -33,5 +33,5 @@ SWIGINTERN PyObject *swig_call_defargs(PyObject *self, PyObject *args) { SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } - return PyEval_CallObject(func,parms); + return PyObject_Call(func, parms, NULL); } diff --git a/Lib/python/pybuffer.i b/Lib/python/pybuffer.i index 577eb69c8..2fdaa6d6e 100644 --- a/Lib/python/pybuffer.i +++ b/Lib/python/pybuffer.i @@ -17,13 +17,13 @@ int res; Py_ssize_t size = 0; void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); - size = view.len; - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; $2 = ($2_ltype) (size/sizeof($*1_type)); } @@ -47,12 +47,12 @@ int res; void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE); - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP)", $symname, $argnum); } + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; } %enddef @@ -76,13 +76,13 @@ int res; Py_ssize_t size = 0; const void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); - size = view.len; - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { PyErr_Clear(); %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } + size = view.len; + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; $2 = ($2_ltype) (size / sizeof($*1_type)); } @@ -108,14 +108,12 @@ int res; const void *buf = 0; Py_buffer view; res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO); - buf = view.buf; - PyBuffer_Release(&view); if (res < 0) { + PyErr_Clear(); %argument_fail(res, "(TYPEMAP)", $symname, $argnum); } + buf = view.buf; + PyBuffer_Release(&view); $1 = ($1_ltype) buf; } %enddef - - - diff --git a/Lib/python/pycomplex.swg b/Lib/python/pycomplex.swg index 087c50f90..28c963617 100644 --- a/Lib/python/pycomplex.swg +++ b/Lib/python/pycomplex.swg @@ -65,7 +65,7 @@ SWIG_AsVal(Type)(PyObject *o, Type *val) float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { - if (val) *val = Constructor(re, 0.0); + if (val) *val = Constructor(re, 0.0f); return res; } } diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index ef2f725af..2ddf4c375 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -52,7 +52,7 @@ namespace swig { struct container_owner { // By default, do not add the back-reference (for value types) // Specialization below will check the reference for pointer types. - static bool back_reference(PyObject* child, PyObject* owner) { + static bool back_reference(PyObject* /*child*/, PyObject* /*owner*/) { return false; } }; @@ -69,8 +69,7 @@ namespace swig { static bool back_reference(PyObject* child, PyObject* owner) { SwigPyObject* swigThis = SWIG_Python_GetSwigThis(child); if (swigThis && (swigThis->own & SWIG_POINTER_OWN) != SWIG_POINTER_OWN) { - PyObject_SetAttr(child, container_owner_attribute(), owner); - return true; + return PyObject_SetAttr(child, container_owner_attribute(), owner) != -1; } return false; } @@ -672,19 +671,13 @@ namespace swig return const_reference(_seq, n); } - bool check(bool set_err = true) const + bool check() const { Py_ssize_t s = size(); for (Py_ssize_t i = 0; i < s; ++i) { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); - if (!swig::check(item)) { - if (set_err) { - char msg[1024]; - sprintf(msg, "in sequence element %d", (int)i); - SWIG_Error(SWIG_RuntimeError, msg); - } + if (!swig::check(item)) return false; - } } return true; } diff --git a/Lib/python/pyerrors.swg b/Lib/python/pyerrors.swg index dcd99c939..2628de8e6 100644 --- a/Lib/python/pyerrors.swg +++ b/Lib/python/pyerrors.swg @@ -95,8 +95,12 @@ SWIG_Python_RaiseOrModifyTypeError(const char *message) #else newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message); #endif - Py_XDECREF(value); - PyErr_Restore(type, newvalue, traceback); + if (newvalue) { + Py_XDECREF(value); + PyErr_Restore(type, newvalue, traceback); + } else { + PyErr_Restore(type, value, traceback); + } } else { /* Raise TypeError using given message */ PyErr_SetString(PyExc_TypeError, message); diff --git a/Lib/python/pyhead.swg b/Lib/python/pyhead.swg index c820f9016..4ae8bbe2e 100644 --- a/Lib/python/pyhead.swg +++ b/Lib/python/pyhead.swg @@ -37,15 +37,19 @@ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { -#if PY_VERSION_HEX >= 0x03000000 +#if PY_VERSION_HEX >= 0x03030000 + return (char *)PyUnicode_AsUTF8(str); +#elif PY_VERSION_HEX >= 0x03000000 char *newstr = 0; str = PyUnicode_AsUTF8String(str); if (str) { char *cstr; Py_ssize_t len; - PyBytes_AsStringAndSize(str, &cstr, &len); - newstr = (char *) malloc(len+1); - memcpy(newstr, cstr, len+1); + if (PyBytes_AsStringAndSize(str, &cstr, &len) != -1) { + newstr = (char *) malloc(len+1); + if (newstr) + memcpy(newstr, cstr, len+1); + } Py_XDECREF(str); } return newstr; @@ -54,10 +58,10 @@ SWIG_Python_str_AsChar(PyObject *str) #endif } -#if PY_VERSION_HEX >= 0x03000000 -# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) +#if PY_VERSION_HEX >= 0x03030000 || PY_VERSION_HEX < 0x03000000 +# define SWIG_Python_str_DelForPy3(x) #else -# define SWIG_Python_str_DelForPy3(x) +# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #endif @@ -75,8 +79,7 @@ SWIG_Python_str_FromChar(const char *c) # define PyObject_DEL PyObject_Del #endif -// SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user -// interface files check for it. +/* SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user interface files check for it. */ # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) diff --git a/Lib/python/pyinit.swg b/Lib/python/pyinit.swg index dfbf40b34..a6d609d56 100644 --- a/Lib/python/pyinit.swg +++ b/Lib/python/pyinit.swg @@ -186,6 +186,12 @@ swig_varlink_type(void) { #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg index 445a1e324..0025184d1 100644 --- a/Lib/python/pyrun.swg +++ b/Lib/python/pyrun.swg @@ -127,7 +127,12 @@ SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); - PyList_SetItem(result, 0, o2); + if (result) { + PyList_SET_ITEM(result, 0, o2); + } else { + Py_DECREF(obj); + return o2; + } } PyList_Append(result,obj); Py_DECREF(obj); @@ -183,6 +188,19 @@ SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssi } } +SWIGINTERN int +SWIG_Python_CheckNoKeywords(PyObject *kwargs, const char *name) { + int no_kwargs = 1; + if (kwargs) { + assert(PyDict_Check(kwargs)); + if (PyDict_Size(kwargs) > 0) { + PyErr_Format(PyExc_TypeError, "%s() does not take keyword arguments", name); + no_kwargs = 0; + } + } + return no_kwargs; +} + /* A functor is a function object with one single object argument */ #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); @@ -266,18 +284,25 @@ SwigPyClientData_New(PyObject* obj) /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; - data->newargs = obj; Py_INCREF(obj); + data->newargs = obj; } else { data->newraw = PyObject_GetAttrString(data->klass, "__new__"); if (data->newraw) { - Py_INCREF(data->newraw); - data->newargs = PyTuple_New(1); - PyTuple_SetItem(data->newargs, 0, obj); + data->newargs = PyTuple_New(1); + if (data->newargs) { + Py_INCREF(obj); + PyTuple_SET_ITEM(data->newargs, 0, obj); + } else { + Py_DECREF(data->newraw); + Py_DECREF(data->klass); + free(data); + return 0; + } } else { - data->newargs = obj; + Py_INCREF(obj); + data->newargs = obj; } - Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__"); @@ -286,10 +311,7 @@ SwigPyClientData_New(PyObject* obj) data->destroy = 0; } if (data->destroy) { - int flags; - Py_INCREF(data->destroy); - flags = PyCFunction_GET_FLAGS(data->destroy); - data->delargs = !(flags & (METH_O)); + data->delargs = !(PyCFunction_GET_FLAGS(data->destroy) & METH_O); } else { data->delargs = 0; } @@ -300,10 +322,13 @@ SwigPyClientData_New(PyObject* obj) } SWIGRUNTIME void -SwigPyClientData_Del(SwigPyClientData *data) { +SwigPyClientData_Del(SwigPyClientData *data) +{ + Py_XDECREF(data->klass); Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); + free(data); } /* =============== SwigPyObject =====================*/ @@ -330,7 +355,7 @@ SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) if (!sobj->dict) sobj->dict = PyDict_New(); - Py_INCREF(sobj->dict); + Py_XINCREF(sobj->dict); return sobj->dict; } @@ -348,18 +373,21 @@ SwigPyObject_format(const char* fmt, SwigPyObject *v) PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { - if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { - PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + PyObject *val = SwigPyObject_long(v); + if (val) { + PyObject *ofmt; + PyTuple_SET_ITEM(args, 0, val); + ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 - res = PyUnicode_Format(ofmt,args); + res = PyUnicode_Format(ofmt,args); #else - res = PyString_Format(ofmt,args); + res = PyString_Format(ofmt,args); #endif - Py_DECREF(ofmt); + Py_DECREF(ofmt); } - Py_DECREF(args); } + Py_DECREF(args); } return res; } @@ -381,18 +409,23 @@ SwigPyObject_repr(SwigPyObject *v) { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); - if (v->next) { + if (repr && v->next) { PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); + if (nrep) { # if PY_VERSION_HEX >= 0x03000000 - PyObject *joined = PyUnicode_Concat(repr, nrep); - Py_DecRef(repr); - Py_DecRef(nrep); - repr = joined; + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; # else - PyString_ConcatAndDel(&repr,nrep); + PyString_ConcatAndDel(&repr,nrep); # endif + } else { + Py_DecRef(repr); + repr = NULL; + } } - return repr; + return repr; } /* We need a version taking two PyObject* parameters so it's a valid @@ -488,8 +521,12 @@ SwigPyObject_dealloc(PyObject *v) if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); - res = SWIG_Python_CallFunctor(destroy, tmp); - Py_DECREF(tmp); + if (tmp) { + res = SWIG_Python_CallFunctor(destroy, tmp); + } else { + res = 0; + } + Py_XDECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); @@ -510,6 +547,9 @@ SwigPyObject_dealloc(PyObject *v) #endif } Py_XDECREF(next); +#ifdef SWIGPYTHON_BUILTIN + Py_XDECREF(sobj->dict); +#endif PyObject_DEL(v); } @@ -565,9 +605,9 @@ SwigPyObject_own(PyObject *v, PyObject *args) PyObject *obj = PyBool_FromLong(sobj->own); if (val) { if (PyObject_IsTrue(val)) { - SwigPyObject_acquire(v,args); + Py_DECREF(SwigPyObject_acquire(v,args)); } else { - SwigPyObject_disown(v,args); + Py_DECREF(SwigPyObject_disown(v,args)); } } return obj; @@ -696,6 +736,12 @@ SwigPyObject_TypeOnce(void) { #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ @@ -706,7 +752,7 @@ SwigPyObject_TypeOnce(void) { }; swigpyobject_type = tmp; type_init = 1; - if (PyType_Ready(&swigpyobject_type) < 0) + if (PyType_Ready(&swigpyobject_type) != 0) return NULL; } return &swigpyobject_type; @@ -721,6 +767,9 @@ SwigPyObject_New(void *ptr, swig_type_info *ty, int own) sobj->ty = ty; sobj->own = own; sobj->next = 0; +#ifdef SWIGPYTHON_BUILTIN + sobj->dict = 0; +#endif } return (PyObject *)sobj; } @@ -857,6 +906,12 @@ SwigPyPacked_TypeOnce(void) { #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif +#if PY_VERSION_HEX >= 0x03080000 + 0, /* tp_vectorcall */ +#endif +#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) + 0, /* tp_print */ +#endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ @@ -867,7 +922,7 @@ SwigPyPacked_TypeOnce(void) { }; swigpypacked_type = tmp; type_init = 1; - if (PyType_Ready(&swigpypacked_type) < 0) + if (PyType_Ready(&swigpypacked_type) != 0) return NULL; } return &swigpypacked_type; @@ -1175,16 +1230,23 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { - PyObject *dict = *dictptr; - if (dict == NULL) { - dict = PyDict_New(); - *dictptr = dict; - PyDict_SetItem(dict, SWIG_This(), swig_this); - } + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + if (dict) { + PyDict_SetItem(dict, SWIG_This(), swig_this); + } else{ + Py_DECREF(inst); + inst = 0; + } } #else - PyObject *key = SWIG_This(); - PyObject_SetAttr(inst, key, swig_this); + if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { + Py_DECREF(inst); + inst = 0; + } #endif } } else { @@ -1196,8 +1258,12 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) inst = ((PyTypeObject *)data->newargs)->tp_new((PyTypeObject *)data->newargs, empty_args, empty_kwargs); Py_DECREF(empty_kwargs); if (inst) { - PyObject_SetAttr(inst, SWIG_This(), swig_this); - Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; + if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { + Py_DECREF(inst); + inst = 0; + } else { + Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; + } } } Py_DECREF(empty_args); @@ -1214,25 +1280,25 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) return inst; } -SWIGRUNTIME void +SWIGRUNTIME int SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { - PyObject *dict; #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) - PyObject **dictptr = _PyObject_GetDictPtr(inst); - if (dictptr != NULL) { - dict = *dictptr; - if (dict == NULL) { - dict = PyDict_New(); - *dictptr = dict; - } - PyDict_SetItem(dict, SWIG_This(), swig_this); - return; - } + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + if (dict) { + return PyDict_SetItem(dict, SWIG_This(), swig_this); + } else{ + return -1; + } + } #endif - dict = PyObject_GetAttrString(inst, "__dict__"); - PyDict_SetItem(dict, SWIG_This(), swig_this); - Py_DECREF(dict); + return PyObject_SetAttr(inst, SWIG_This(), swig_this); } @@ -1244,9 +1310,10 @@ SWIG_Python_InitShadowInstance(PyObject *args) { } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { - SwigPyObject_append((PyObject*) sthis, obj[1]); + Py_DECREF(SwigPyObject_append((PyObject*) sthis, obj[1])); } else { - SWIG_Python_SetSwigThis(obj[0], obj[1]); + if (SWIG_Python_SetSwigThis(obj[0], obj[1]) != 0) + return NULL; } return SWIG_Py_Void(); } @@ -1282,7 +1349,9 @@ SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int f } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN - newobj->dict = 0; + if (newobj) { + newobj->dict = 0; + } #endif } if (newobj) { @@ -1321,6 +1390,13 @@ SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { void *SWIG_ReturnGlobalTypeList(void *); #endif +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); + return cache; +} + SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; @@ -1349,11 +1425,13 @@ SWIG_Python_DestroyModule(PyObject *obj) swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + ty->clientdata = 0; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); Swig_This_global = NULL; + Py_DECREF(SWIG_Python_TypeCache()); } SWIGRUNTIME void @@ -1367,19 +1445,14 @@ SWIG_Python_SetModule(swig_module_info *swig_module) { #endif PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { - PyModule_AddObject(module, "type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); + if (PyModule_AddObject(module, "type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer) != 0) { + Py_DECREF(pointer); + } } else { Py_XDECREF(pointer); } } -/* The python cached type query */ -SWIGRUNTIME PyObject * -SWIG_Python_TypeCache(void) { - static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); - return cache; -} - SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { @@ -1394,8 +1467,10 @@ SWIG_Python_TypeQuery(const char *type) descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCapsule_New((void*) descriptor, NULL, NULL); - PyDict_SetItem(cache, key, obj); - Py_DECREF(obj); + if (obj) { + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } } } Py_DECREF(key); @@ -1538,7 +1613,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { } if (!tp->tp_dict) { - if (PyType_Ready(tp) < 0) + if (PyType_Ready(tp) != 0) goto done; } @@ -1553,7 +1628,7 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { } else { encoded_name = PyUnicode_AsUTF8String(name); if (!encoded_name) - return -1; + goto done; } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); diff --git a/Lib/python/pystdcommon.swg b/Lib/python/pystdcommon.swg index 0242e4d35..afa71350a 100644 --- a/Lib/python/pystdcommon.swg +++ b/Lib/python/pystdcommon.swg @@ -45,11 +45,20 @@ namespace swig { template struct traits_asptr { static int asptr(PyObject *obj, Type **val) { - Type *p = 0; + int res = SWIG_ERROR; swig_type_info *descriptor = type_info(); - int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; - if (SWIG_IsOK(res)) { - if (val) *val = p; + if (val) { + Type *p = 0; + int newmem = 0; + res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; + if (SWIG_IsOK(res)) { + if (newmem & SWIG_CAST_NEW_MEMORY) { + res |= SWIG_NEWOBJMASK; + } + *val = p; + } + } else { + res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; } diff --git a/Lib/python/pystrings.swg b/Lib/python/pystrings.swg index 93f48acfa..64ed685e8 100644 --- a/Lib/python/pystrings.swg +++ b/Lib/python/pystrings.swg @@ -32,9 +32,11 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) if (alloc) *alloc = SWIG_NEWOBJ; %#endif - PyBytes_AsStringAndSize(obj, &cstr, &len); + if (PyBytes_AsStringAndSize(obj, &cstr, &len) == -1) + return SWIG_TypeError; %#else - PyString_AsStringAndSize(obj, &cstr, &len); + if (PyString_AsStringAndSize(obj, &cstr, &len) == -1) + return SWIG_TypeError; %#endif if (cptr) { if (alloc) { diff --git a/Lib/python/pythreads.swg b/Lib/python/pythreads.swg index d8797e659..8d6c5ab49 100644 --- a/Lib/python/pythreads.swg +++ b/Lib/python/pythreads.swg @@ -8,8 +8,12 @@ # define SWIG_PYTHON_USE_GIL # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ -# ifndef SWIG_PYTHON_INITIALIZE_THREADS -# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# if PY_VERSION_HEX < 0x03070000 +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# else +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { diff --git a/Lib/python/std_auto_ptr.i b/Lib/python/std_auto_ptr.i index e310e00c8..c94006a68 100644 --- a/Lib/python/std_auto_ptr.i +++ b/Lib/python/std_auto_ptr.i @@ -1,5 +1,5 @@ /* - The typemaps here allow to handle functions returning std::auto_ptr<>, + The typemaps here allow handling functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). diff --git a/Lib/python/std_map.i b/Lib/python/std_map.i index 8ae483cef..e0b7d69dc 100644 --- a/Lib/python/std_map.i +++ b/Lib/python/std_map.i @@ -101,7 +101,7 @@ %#endif res = traits_asptr_stdseq >::asptr(items, val); } else { - map_type *p; + map_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; diff --git a/Lib/python/std_multimap.i b/Lib/python/std_multimap.i index f78a5277c..bbffb6bcd 100644 --- a/Lib/python/std_multimap.i +++ b/Lib/python/std_multimap.i @@ -29,7 +29,7 @@ %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { - multimap_type *p; + multimap_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; diff --git a/Lib/python/std_pair.i b/Lib/python/std_pair.i index 172572bff..cf463cb8f 100644 --- a/Lib/python/std_pair.i +++ b/Lib/python/std_pair.i @@ -47,7 +47,7 @@ res = get_pair(first, second, val); } } else { - value_type *p; + value_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; @@ -104,7 +104,7 @@ res = get_pair(first, second, val); } } else { - value_type *p; + value_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; diff --git a/Lib/python/std_unordered_map.i b/Lib/python/std_unordered_map.i index 042d5b671..784be4c8f 100644 --- a/Lib/python/std_unordered_map.i +++ b/Lib/python/std_unordered_map.i @@ -87,7 +87,7 @@ %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { - unordered_map_type *p; + unordered_map_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; diff --git a/Lib/python/std_unordered_multimap.i b/Lib/python/std_unordered_multimap.i index 281140445..bc095ea48 100644 --- a/Lib/python/std_unordered_multimap.i +++ b/Lib/python/std_unordered_multimap.i @@ -36,7 +36,7 @@ %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { - unordered_multimap_type *p; + unordered_multimap_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; diff --git a/Lib/r/rfragments.swg b/Lib/r/rfragments.swg index b89212b05..c3b40a906 100644 --- a/Lib/r/rfragments.swg +++ b/Lib/r/rfragments.swg @@ -1,7 +1,3 @@ -#define SWIG_Error(code, msg) Rf_warning(msg); return Rf_ScalarLogical(NA_LOGICAL) - -#define SWIG_fail return Rf_ScalarLogical(NA_LOGICAL) - /* for raw pointers */ #define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_R_ConvertPtr(oc, ptr, ty, flags) #define SWIG_ConvertFunctionPtr(oc, ptr, ty) SWIG_R_ConvertPtr(oc, ptr, ty, 0) diff --git a/Lib/r/rrun.swg b/Lib/r/rrun.swg index c341321a1..798446128 100644 --- a/Lib/r/rrun.swg +++ b/Lib/r/rrun.swg @@ -1,4 +1,3 @@ - /* Remove global namespace pollution */ #if !defined(SWIG_NO_R_NO_REMAP) # define R_NO_REMAP @@ -23,6 +22,7 @@ extern "C" { #include #include #include +#include #if R_VERSION >= R_Version(2,6,0) #define VMAXTYPE void * @@ -30,6 +30,47 @@ extern "C" { #define VMAXTYPE char * #endif +/* Last error */ +static int SWIG_lasterror_code = 0; +static char SWIG_lasterror_msg[1024]; +SWIGRUNTIME void SWIG_Error(int code, const char *format, ...) { + va_list arg; + SWIG_lasterror_code = code; + va_start(arg, format); + vsnprintf(SWIG_lasterror_msg, sizeof(SWIG_lasterror_msg), format, arg); + va_end(arg); +} + +SWIGRUNTIME const char *SWIG_ErrorType(int code) { + switch (code) { + case SWIG_MemoryError: + return "SWIG:MemoryError"; + case SWIG_IOError: + return "SWIG:IOError"; + case SWIG_RuntimeError: + return "SWIG:RuntimeError"; + case SWIG_IndexError: + return "SWIG:IndexError"; + case SWIG_TypeError: + return "SWIG:TypeError"; + case SWIG_DivisionByZero: + return "SWIG:DivisionByZero"; + case SWIG_OverflowError: + return "SWIG:OverflowError"; + case SWIG_SyntaxError: + return "SWIG:SyntaxError"; + case SWIG_ValueError: + return "SWIG:ValueError"; + case SWIG_SystemError: + return "SWIG:SystemError"; + case SWIG_AttributeError: + return "SWIG:AttributeError"; + } + return "SWIG:UnknownError"; +} + +#define SWIG_fail goto fail + /* This is mainly a way to avoid having lots of local variables that may conflict with those in the routine. diff --git a/Lib/r/rtype.swg b/Lib/r/rtype.swg index bdc48c24e..8fe12230b 100644 --- a/Lib/r/rtype.swg +++ b/Lib/r/rtype.swg @@ -94,20 +94,20 @@ %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE *const, SWIGTYPE &, SWIGTYPE && - %{ if (inherits($input, "ExternalReference")) $input = slot($input,"ref") %} + %{ if (inherits($input, "ExternalReference")) $input = slot($input,"ref"); %} /* %typemap(scoercein) SWIGTYPE *, SWIGTYPE *const - %{ $input = coerceIfNotSubclass($input, "$R_class") %} + %{ $input = coerceIfNotSubclass($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE & - %{ $input = coerceIfNotSubclass($input, "$R_class") %} + %{ $input = coerceIfNotSubclass($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE && - %{ $input = coerceIfNotSubclass($input, "$R_class") %} + %{ $input = coerceIfNotSubclass($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE - %{ $input = coerceIfNotSubclass($input, "$&R_class") %} + %{ $input = coerceIfNotSubclass($input, "$&R_class"); %} */ %typemap(scoercein) SWIGTYPE[ANY] diff --git a/Lib/ruby/rubyclasses.swg b/Lib/ruby/rubyclasses.swg index f7b51bdcc..b345fcebe 100644 --- a/Lib/ruby/rubyclasses.swg +++ b/Lib/ruby/rubyclasses.swg @@ -174,7 +174,7 @@ namespace swig { return rb_inspect(_obj); } - static VALUE swig_rescue_swallow(VALUE) + static VALUE swig_rescue_swallow(VALUE, VALUE) { /* VALUE errstr = rb_obj_as_string(rb_errinfo()); @@ -203,8 +203,8 @@ namespace swig { args.id = op_id; args.nargs = 1; args.target = VALUE(other); - ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), - (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); + ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), + (VALUEFUNC(swig_rescue_swallow)), Qnil); } if (ret == Qnil) { VALUE a = rb_funcall( _obj, hash_id, 0 ); @@ -243,8 +243,8 @@ namespace swig { args.id = op_id; args.nargs = 0; args.target = Qnil; - ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), - (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); + ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), + (VALUEFUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return ret; } @@ -262,8 +262,8 @@ namespace swig { args.id = op_id; args.nargs = 1; args.target = VALUE(other); - ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), - (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); + ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), + (VALUEFUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return GC_VALUE(ret); } diff --git a/Lib/ruby/rubycomplex.swg b/Lib/ruby/rubycomplex.swg index 4e249c71f..a62bfe531 100644 --- a/Lib/ruby/rubycomplex.swg +++ b/Lib/ruby/rubycomplex.swg @@ -127,7 +127,7 @@ SWIG_AsVal(Type)(VALUE o, Type *val) float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { - if (val) *val = Constructor(re, 0.0); + if (val) *val = Constructor(re, 0.0f); return res; } } diff --git a/Lib/ruby/rubycontainer.swg b/Lib/ruby/rubycontainer.swg index e8830a715..e72330853 100644 --- a/Lib/ruby/rubycontainer.swg +++ b/Lib/ruby/rubycontainer.swg @@ -395,19 +395,13 @@ namespace swig return const_reference(_seq, n); } - bool check(bool set_err = false) const + bool check() const { int s = (int) size(); for (int i = 0; i < s; ++i) { VALUE item = rb_ary_entry(_seq, i ); - if (!swig::check(item)) { - if (set_err) { - char msg[1024]; - sprintf(msg, "in sequence element %d", i); - SWIG_Error(SWIG_RuntimeError, msg); - } + if (!swig::check(item)) return false; - } } return true; } @@ -634,7 +628,7 @@ namespace swig try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -693,9 +687,8 @@ namespace swig r = swig::from< Sequence::value_type >( *(at) ); $self->erase(at); } - catch (std::out_of_range) - { - } + catch (const std::out_of_range&) { + } return r; } } @@ -763,7 +756,7 @@ namespace swig try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -786,7 +779,7 @@ namespace swig try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -796,7 +789,7 @@ namespace swig try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -1023,7 +1016,7 @@ namespace swig { } else { return rubyseq.check() ? SWIG_OK : SWIG_ERROR; } - } catch (std::exception& e) { + } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { @@ -1063,7 +1056,7 @@ namespace swig { } else { return true; } - } catch (std::exception& e) { + } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { diff --git a/Lib/ruby/rubyhead.swg b/Lib/ruby/rubyhead.swg index 90f07cf68..bf4e36248 100644 --- a/Lib/ruby/rubyhead.swg +++ b/Lib/ruby/rubyhead.swg @@ -98,38 +98,46 @@ /* - * Need to be very careful about how these macros are defined, especially - * when compiling C++ code or C code with an ANSI C compiler. + * The following macros are used for providing the correct type of a + * function pointer to the Ruby C API. + * Starting with Ruby 2.7 (corresponding to RB_METHOD_DEFINITION_DECL being + * defined) these macros act transparently due to Ruby's moving away from + * ANYARGS and instead employing strict function signatures. * - * VALUEFUNC(f) is a macro used to typecast a C function that implements - * a Ruby method so that it can be passed as an argument to API functions - * like rb_define_method() and rb_define_singleton_method(). + * Note: In case of C (not C++) the macros are transparent even before + * Ruby 2.7 due to the fact that the Ruby C API used function declarators + * with empty parentheses, which allows for an unspecified number of + * arguments. * - * VOIDFUNC(f) is a macro used to typecast a C function that implements - * either the "mark" or "free" stuff for a Ruby Data object, so that it - * can be passed as an argument to API functions like Data_Wrap_Struct() + * PROTECTFUNC(f) is used for the function pointer argument of the Ruby + * C API function rb_protect(). + * + * VALUEFUNC(f) is used for the function pointer argument(s) of Ruby C API + * functions like rb_define_method() and rb_define_singleton_method(). + * + * VOIDFUNC(f) is used to typecast a C function that implements either + * the "mark" or "free" stuff for a Ruby Data object, so that it can be + * passed as an argument to Ruby C API functions like Data_Wrap_Struct() * and Data_Make_Struct(). + * + * SWIG_RUBY_VOID_ANYARGS_FUNC(f) is used for the function pointer + * argument(s) of Ruby C API functions like rb_define_virtual_variable(). + * + * SWIG_RUBY_INT_ANYARGS_FUNC(f) is used for the function pointer + * argument(s) of Ruby C API functions like st_foreach(). */ - -#ifdef __cplusplus -# ifndef RUBY_METHOD_FUNC /* These definitions should work for Ruby 1.4.6 */ -# define PROTECTFUNC(f) ((VALUE (*)()) f) -# define VALUEFUNC(f) ((VALUE (*)()) f) -# define VOIDFUNC(f) ((void (*)()) f) -# else -# ifndef ANYARGS /* These definitions should work for Ruby 1.6 */ -# define PROTECTFUNC(f) ((VALUE (*)()) f) -# define VALUEFUNC(f) ((VALUE (*)()) f) -# define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) -# else /* These definitions should work for Ruby 1.7+ */ -# define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) -# define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) -# define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) -# endif -# endif +#if defined(__cplusplus) && !defined(RB_METHOD_DEFINITION_DECL) +# define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) +# define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) +# define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) +# define SWIG_RUBY_VOID_ANYARGS_FUNC(f) ((void (*)(ANYARGS))(f)) +# define SWIG_RUBY_INT_ANYARGS_FUNC(f) ((int (*)(ANYARGS))(f)) #else +# define PROTECTFUNC(f) (f) # define VALUEFUNC(f) (f) # define VOIDFUNC(f) (f) +# define SWIG_RUBY_VOID_ANYARGS_FUNC(f) (f) +# define SWIG_RUBY_INT_ANYARGS_FUNC(f) (f) #endif /* Don't use for expressions have side effect */ diff --git a/Lib/ruby/rubyprimtypes.swg b/Lib/ruby/rubyprimtypes.swg index 3a848191c..4b078deea 100644 --- a/Lib/ruby/rubyprimtypes.swg +++ b/Lib/ruby/rubyprimtypes.swg @@ -10,15 +10,16 @@ %fragment("SWIG_ruby_failed","header") { SWIGINTERN VALUE -SWIG_ruby_failed(void) +SWIG_ruby_failed(VALUE SWIGUNUSEDPARM(arg1), VALUE SWIGUNUSEDPARM(arg2)) { return Qnil; } } %define %ruby_aux_method(Type, Method, Action) -SWIGINTERN VALUE SWIG_AUX_##Method##(VALUE *args) +SWIGINTERN VALUE SWIG_AUX_##Method##(VALUE arg) { + VALUE *args = (VALUE *)arg; VALUE obj = args[0]; VALUE type = TYPE(obj); Type *res = (Type *)(args[1]); @@ -79,7 +80,7 @@ SWIG_AsVal_dec(long)(VALUE obj, long* val) VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); - if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2LONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { + if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } @@ -111,7 +112,7 @@ SWIG_AsVal_dec(unsigned long)(VALUE obj, unsigned long *val) VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); - if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { + if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } @@ -149,7 +150,7 @@ SWIG_AsVal_dec(long long)(VALUE obj, long long *val) VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); - if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2LL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { + if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } @@ -187,7 +188,7 @@ SWIG_AsVal_dec(unsigned long long)(VALUE obj, unsigned long long *val) VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); - if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2ULL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { + if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } @@ -215,7 +216,7 @@ SWIG_AsVal_dec(double)(VALUE obj, double *val) VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); - if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2DBL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { + if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2DBL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } diff --git a/Lib/ruby/rubyrun.swg b/Lib/ruby/rubyrun.swg index 4b2ffe4b4..3b6fd32b0 100644 --- a/Lib/ruby/rubyrun.swg +++ b/Lib/ruby/rubyrun.swg @@ -235,6 +235,8 @@ SWIGRUNTIMEINLINE char * SWIG_Ruby_MangleStr(VALUE obj) { VALUE stype = rb_iv_get(obj, "@__swigtype__"); + if (NIL_P(stype)) + return NULL; return StringValuePtr(stype); } diff --git a/Lib/ruby/rubytracking.swg b/Lib/ruby/rubytracking.swg index b9fb249d8..1edcc5681 100644 --- a/Lib/ruby/rubytracking.swg +++ b/Lib/ruby/rubytracking.swg @@ -32,7 +32,7 @@ extern "C" { */ static st_table* swig_ruby_trackings = NULL; -static VALUE swig_ruby_trackings_count(ANYARGS) { +static VALUE swig_ruby_trackings_count(ID id, VALUE *var) { return SWIG2NUM(swig_ruby_trackings->num_entries); } @@ -69,7 +69,9 @@ SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) { swig_ruby_trackings = (st_table*)NUM2SWIG(trackings_value); } - rb_define_virtual_variable("SWIG_TRACKINGS_COUNT", swig_ruby_trackings_count, NULL); + rb_define_virtual_variable("SWIG_TRACKINGS_COUNT", + VALUEFUNC(swig_ruby_trackings_count), + SWIG_RUBY_VOID_ANYARGS_FUNC((rb_gvar_setter_t*)NULL)); } /* Add a Tracking from a C/C++ struct to a Ruby object */ @@ -118,13 +120,15 @@ SWIGRUNTIME void SWIG_RubyUnlinkObjects(void* ptr) { to the passed callback function. */ /* Proxy method to abstract the internal trackings datatype */ -static int swig_ruby_internal_iterate_callback(void* ptr, VALUE obj, void(*meth)(void* ptr, VALUE obj)) { - (*meth)(ptr, obj); +static int swig_ruby_internal_iterate_callback(st_data_t ptr, st_data_t obj, st_data_t meth) { + ((void (*) (void *, VALUE))meth)((void *)ptr, (VALUE)obj); return ST_CONTINUE; } SWIGRUNTIME void SWIG_RubyIterateTrackings( void(*meth)(void* ptr, VALUE obj) ) { - st_foreach(swig_ruby_trackings, (int (*)(ANYARGS))&swig_ruby_internal_iterate_callback, (st_data_t)meth); + st_foreach(swig_ruby_trackings, + SWIG_RUBY_INT_ANYARGS_FUNC(swig_ruby_internal_iterate_callback), + (st_data_t)meth); } #ifdef __cplusplus diff --git a/Lib/ruby/std_auto_ptr.i b/Lib/ruby/std_auto_ptr.i new file mode 100644 index 000000000..eab8ec53d --- /dev/null +++ b/Lib/ruby/std_auto_ptr.i @@ -0,0 +1,17 @@ +/* + The typemaps here allow handling functions returning std::auto_ptr<>, + which is the most common use of this type. If you have functions taking it + as parameter, these typemaps can't be used for them and you need to do + something else (e.g. use shared_ptr<> which SWIG supports fully). + */ + +%define %auto_ptr(TYPE) +%typemap (out) std::auto_ptr %{ + %set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN | %newpointer_flags)); +%} +%template() std::auto_ptr; +%enddef + +namespace std { + template class auto_ptr {}; +} diff --git a/Lib/ruby/std_shared_ptr.i b/Lib/ruby/std_shared_ptr.i index dee35ec03..086e30814 100644 --- a/Lib/ruby/std_shared_ptr.i +++ b/Lib/ruby/std_shared_ptr.i @@ -13,24 +13,27 @@ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::shared_ptr **val) { - std::shared_ptr *p = 0; + int res = SWIG_ERROR; swig_type_info *descriptor = type_info >(); - swig_ruby_owntype newmem = {0, 0}; - int res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; - if (SWIG_IsOK(res)) { - if (val) { - if (*val) { - **val = p ? *p : std::shared_ptr(); - } else { - *val = p; - if (newmem.own & SWIG_CAST_NEW_MEMORY) { - // Upcast for pointers to shared_ptr in this generic framework has not been implemented - res = SWIG_ERROR; - } - } - } - if (newmem.own & SWIG_CAST_NEW_MEMORY) - delete p; + if (val) { + std::shared_ptr *p = 0; + swig_ruby_owntype newmem = {0, 0}; + res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; + if (SWIG_IsOK(res)) { + if (*val) { + **val = p ? *p : std::shared_ptr(); + } else { + *val = p; + if (newmem.own & SWIG_CAST_NEW_MEMORY) { + // Upcast for pointers to shared_ptr in this generic framework has not been implemented + res = SWIG_ERROR; + } + } + if (newmem.own & SWIG_CAST_NEW_MEMORY) + delete p; + } + } else { + res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; } diff --git a/Lib/ruby/std_wstring.i b/Lib/ruby/std_wstring.i index 2b633438e..c5d168a0a 100644 --- a/Lib/ruby/std_wstring.i +++ b/Lib/ruby/std_wstring.i @@ -1,4 +1,15 @@ %{ +#if defined(__linux__) +#include +#if BYTE_ORDER == LITTLE_ENDIAN +#define SWIG_RUBY_ENDIAN "LE" +#elif BYTE_ORDER == BIG_ENDIAN +#define SWIG_RUBY_ENDIAN "BE" +#endif +#else +#define SWIG_RUBY_ENDIAN "LE" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -15,9 +26,9 @@ extern "C" { #ifndef SWIG_RUBY_WSTRING_ENCODING #if WCHAR_MAX == 0x7fff || WCHAR_MAX == 0xffff -#define SWIG_RUBY_WSTRING_ENCODING "UTF-16LE" +#define SWIG_RUBY_WSTRING_ENCODING "UTF-16" SWIG_RUBY_ENDIAN #elif WCHAR_MAX == 0x7fffffff || WCHAR_MAX == 0xffffffff -#define SWIG_RUBY_WSTRING_ENCODING "UTF-32LE" +#define SWIG_RUBY_WSTRING_ENCODING "UTF-32" SWIG_RUBY_ENDIAN #else #error unsupported wchar_t size. SWIG_RUBY_WSTRING_ENCODING must be given. #endif diff --git a/Lib/swiginit.swg b/Lib/swiginit.swg index 33926b10f..e50b1b46d 100644 --- a/Lib/swiginit.swg +++ b/Lib/swiginit.swg @@ -50,9 +50,12 @@ extern "C" { #define SWIGRUNTIME_DEBUG #endif +#ifndef SWIG_INIT_CLIENT_DATA_TYPE +#define SWIG_INIT_CLIENT_DATA_TYPE void * +#endif SWIGRUNTIME void -SWIG_InitializeModule(void *clientdata) { +SWIG_InitializeModule(SWIG_INIT_CLIENT_DATA_TYPE clientdata) { size_t i; swig_module_info *module_head, *iter; int init; diff --git a/Lib/swigrun.swg b/Lib/swigrun.swg index 59118ecad..5f3159916 100644 --- a/Lib/swigrun.swg +++ b/Lib/swigrun.swg @@ -115,7 +115,7 @@ SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code - allows to return the 'cast rank', for example, if you have this + allows returning the 'cast rank', for example, if you have this int food(double) int fooi(int); diff --git a/Lib/typemaps/attribute.swg b/Lib/typemaps/attribute.swg index 988113991..37c3340cf 100644 --- a/Lib/typemaps/attribute.swg +++ b/Lib/typemaps/attribute.swg @@ -224,7 +224,7 @@ #if #AccessorMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, &self_->AccessorMethod(), self_->AccessorMethod() = *val_) #else - %attribute_custom(%arg(Class), %arg(AttributeType), AccessorName, AccessorName, AccessorName, &self_->AccessorName(), self_->AccessorName() = *val_) + %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AttributeName, AttributeName, &self_->AttributeName(), self_->AttributeName() = *val_) #endif %enddef diff --git a/Lib/typemaps/swigtype.swg b/Lib/typemaps/swigtype.swg index 581de1a90..402313ebf 100644 --- a/Lib/typemaps/swigtype.swg +++ b/Lib/typemaps/swigtype.swg @@ -562,29 +562,29 @@ * ------------------------------------------------------------ */ %typemap(in) SWIGTYPE (CLASS::*) { - int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); + int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($1),$descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { - %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); + %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($1), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { - int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); + int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($1), $descriptor); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { - %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); + %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($1), $descriptor)); } %typemap(constcode,noblock=1) SWIGTYPE (CLASS::*) { - %set_constant("$symname", SWIG_NewMemberObj(%as_voidptr(&$value), sizeof($type), $descriptor)); + %set_constant("$symname", SWIG_NewMemberObj(%as_voidptr(&$value), sizeof($value), $descriptor)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) @@ -592,13 +592,13 @@ /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE (CLASS::*) { - $input = SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor); + $input = SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($1), $descriptor); } /* directorout */ %typemap(directorout) SWIGTYPE (CLASS::*) { - int swig_res = SWIG_ConvertMember($input,%as_voidptr(&$result), sizeof($type), $descriptor); + int swig_res = SWIG_ConvertMember($input,%as_voidptr(&$result), sizeof($result), $descriptor); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } diff --git a/Lib/uffi/uffi.swg b/Lib/uffi/uffi.swg deleted file mode 100644 index 41b085998..000000000 --- a/Lib/uffi/uffi.swg +++ /dev/null @@ -1,101 +0,0 @@ -/* Define a C preprocessor symbol that can be used in interface files - to distinguish between the SWIG language modules. */ - -#define SWIG_UFFI - -/* Typespecs for basic types. */ - -%typemap(ffitype) char ":char"; -%typemap(ffitype) unsigned char ":unsigned-char"; -%typemap(ffitype) signed char ":char"; -%typemap(ffitype) short ":short"; -%typemap(ffitype) signed short ":short"; -%typemap(ffitype) unsigned short ":unsigned-short"; -%typemap(ffitype) int ":int"; -%typemap(ffitype) signed int ":int"; -%typemap(ffitype) unsigned int ":unsigned-int"; -%typemap(ffitype) long ":long"; -%typemap(ffitype) signed long ":long"; -%typemap(ffitype) unsigned long ":unsigned-long"; -%typemap(ffitype) float ":float"; -%typemap(ffitype) double ":double"; -%typemap(ffitype) char * ":cstring"; -%typemap(ffitype) void * ":pointer-void"; -%typemap(ffitype) void ":void"; - -// FIXME: This is guesswork -typedef long size_t; - -%wrapper %{ -(eval-when (compile eval) - -;;; You can define your own identifier converter if you want. -;;; Use the -identifier-converter command line argument to -;;; specify its name. - -(defun identifier-convert-null (id &key type) - (declare (ignore type)) - (read-from-string id)) - -(defun identifier-convert-lispify (cname &key type) - (assert (stringp cname)) - (if (eq type :constant) - (setf cname (format nil "*~A*" cname))) - (setf cname (replace-regexp cname "_" "-")) - (let ((lastcase :other) - newcase char res) - (dotimes (n (length cname)) - (setf char (schar cname n)) - (if* (alpha-char-p char) - then - (setf newcase (if (upper-case-p char) :upper :lower)) - - (when (or (and (eq lastcase :upper) (eq newcase :lower)) - (and (eq lastcase :lower) (eq newcase :upper))) - ;; case change... add a dash - (push #\- res) - (setf newcase :other)) - - (push (char-downcase char) res) - - (setf lastcase newcase) - - else - (push char res) - (setf lastcase :other))) - (read-from-string (coerce (nreverse res) 'string)))) - -(defun identifier-convert-low-level (cname &key type) - (assert (stringp cname)) - (if (eq type :constant) - (setf cname (format nil "+~A+" cname))) - (setf cname (substitute #\- #\_ cname)) - (if (eq type :operator) - (setf cname (format nil "%~A" cname))) - (if (eq type :constant-function) - nil) - (read-from-string cname)) - - - -(defmacro swig-defconstant (string value &key (export T)) - (let ((symbol (funcall *swig-identifier-converter* string :type :constant))) - `(eval-when (compile load eval) - (uffi:def-constant ,symbol ,value ,export)))) - -(defmacro swig-defun (name &rest rest) - (let ((symbol (funcall *swig-identifier-converter* name :type :operator))) - `(eval-when (compile load eval) - (uffi:def-function (,name ,symbol) ,@rest) - (export (quote ,symbol))))) - -(defmacro swig-def-struct (name &rest fields) - "Declare a struct object" - (let ((symbol (funcall *swig-identifier-converter* name :type :type))) - `(eval-when (compile load eval) - (uffi:def-struct ,symbol ,@fields) - (export (quote ,symbol))))) - - -) ;; eval-when -%} diff --git a/Makefile.in b/Makefile.in index e529f14c4..90b96365c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -29,7 +29,7 @@ TARGET = $(TARGET_NOEXE)@EXEEXT@ SOURCE = Source CCACHE = CCache DOCS = Doc/Manual -HAVE_CXX11_COMPILER = @HAVE_CXX11_COMPILER@ +HAVE_CXX11 = @HAVE_CXX11@ swig: libfiles source ccache @@ -254,7 +254,7 @@ check-%-test-suite: echo warning: cannot $(ACTION) $* test-suite "(no dir $$dir)";\ else \ echo $(ACTION)ing $* test-suite; \ - (cd $$dir && $(MAKE) $(FLAGS) $(ACTION) HAVE_CXX11_COMPILER=$(HAVE_CXX11_COMPILER)) \ + (cd $$dir && $(MAKE) $(FLAGS) $(ACTION) HAVE_CXX11=$(HAVE_CXX11)) \ || passed=false; \ fi; \ test $$passed = true diff --git a/README b/README index 165098cb5..ba8ded0d5 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ SWIG (Simplified Wrapper and Interface Generator) -Version: 4.0.1 (in progress) +Version: 4.1.0 (in progress) Tagline: SWIG is a compiler that integrates C and C++ with languages including Perl, Python, Tcl, Ruby, PHP, Java, C#, D, Go, Lua, diff --git a/RELEASENOTES b/RELEASENOTES index 3fe78f2e2..da60d543f 100644 --- a/RELEASENOTES +++ b/RELEASENOTES @@ -7,6 +7,28 @@ Release Notes Detailed release notes are available with the release and are also published on the SWIG web site at http://swig.org/release.html. +SWIG-4.1.0 summary: +- Add PHP 8 support. +- PHP wrapping is now done entirely via PHP's C API - no more .php wrapper. + +SWIG-4.0.2 summary: +- A few fixes around doxygen comment handling. +- Ruby 2.7 support added. +- Various minor improvements to C#, D, Java, OCaml, Octave, Python, + R, Ruby. +- Considerable performance improvement running SWIG on large + interface files. + +SWIG-4.0.1 summary: +- SWIG now cleans up on error by removing all generated files. +- Add Python 3.8 support. +- Python Sphinx compatibility added for Doxygen comments. +- Some minor regressions introduced in 4.0.0 were fixed. +- Fix some C++17 compatibility problems in Python and Ruby generated + code. +- Minor improvements/fixes for C#, Java, Javascript, Lua, MzScheme, + Ocaml, Octave and Python. + SWIG-4.0.0 summary: - Support for Doxygen documentation comments which are parsed and converted into JavaDoc or PyDoc comments. diff --git a/Source/CParse/cscanner.c b/Source/CParse/cscanner.c index 4566817a0..2113b9cc6 100644 --- a/Source/CParse/cscanner.c +++ b/Source/CParse/cscanner.c @@ -93,7 +93,7 @@ int isStructuralDoxygen(String *s) { const size_t len = strlen(structuralTags[n]); if (strncmp(slashPointer, structuralTags[n], len) == 0) { /* Take care to avoid false positives with prefixes of other tags. */ - if (slashPointer[len] == '\0' || isspace(slashPointer[len])) + if (slashPointer[len] == '\0' || isspace((int)slashPointer[len])) return 1; } } @@ -428,17 +428,32 @@ static int yylook(void) { /* Concatenate or skip all consecutive comments at once. */ do { String *cmt = Scanner_text(scan); + String *cmt_modified = 0; char *loc = Char(cmt); if ((strncmp(loc, "/*@SWIG", 7) == 0) && (loc[Len(cmt)-3] == '@')) { Scanner_locator(scan, cmt); } if (scan_doxygen_comments) { /* else just skip this node, to avoid crashes in parser module*/ + + int slashStyle = 0; /* Flag for "///" style doxygen comments */ + if (strncmp(loc, "///", 3) == 0) { + slashStyle = 1; + if (Len(cmt) == 3) { + /* Modify to make length=4 to ensure that the empty comment does + get processed to preserve the newlines in the original comments. */ + cmt_modified = NewStringf("%s ", cmt); + cmt = cmt_modified; + loc = Char(cmt); + } + } + /* Check for all possible Doxygen comment start markers while ignoring comments starting with a row of asterisks or slashes just as - Doxygen itself does. */ + Doxygen itself does. Also skip empty comment (slash-star-star-slash), + which causes a crash due to begin > end. */ if (Len(cmt) > 3 && loc[0] == '/' && ((loc[1] == '/' && ((loc[2] == '/' && loc[3] != '/') || loc[2] == '!')) || - (loc[1] == '*' && ((loc[2] == '*' && loc[3] != '*') || loc[2] == '!')))) { + (loc[1] == '*' && ((loc[2] == '*' && loc[3] != '*' && loc[3] != '/') || loc[2] == '!')))) { comment_kind_t this_comment = loc[3] == '<' ? DOX_COMMENT_POST : DOX_COMMENT_PRE; if (existing_comment != DOX_COMMENT_NONE && this_comment != existing_comment) { /* We can't concatenate together Doxygen pre- and post-comments. */ @@ -461,6 +476,13 @@ static int yylook(void) { Setline(yylval.str, Scanner_start_line(scan)); Setfile(yylval.str, Scanner_file(scan)); } else { + if (slashStyle) { + /* Add a newline to the end of each doxygen "///" comment, + since they are processed individually, unlike the + slash-star style, which gets processed as a block with + newlines included. */ + Append(yylval.str, "\n"); + } Append(yylval.str, str); } @@ -471,6 +493,7 @@ static int yylook(void) { do { tok = Scanner_token(scan); } while (tok == SWIG_TOKEN_ENDLINE); + Delete(cmt_modified); } while (tok == SWIG_TOKEN_COMMENT); Scanner_pushtoken(scan, tok, Scanner_text(scan)); @@ -873,15 +896,19 @@ int yylex(void) { return (USING); if (strcmp(yytext, "namespace") == 0) return (NAMESPACE); - if (strcmp(yytext, "override") == 0) + if (strcmp(yytext, "override") == 0) { + last_id = 1; return (OVERRIDE); - if (strcmp(yytext, "final") == 0) + } + if (strcmp(yytext, "final") == 0) { + last_id = 1; return (FINAL); + } } else { if (strcmp(yytext, "class") == 0) { Swig_warning(WARN_PARSE_CLASS_KEYWORD, cparse_file, cparse_line, "class keyword used, but not in C++ mode.\n"); } - if (strcmp(yytext, "complex") == 0) { + if (strcmp(yytext, "_Complex") == 0) { yylval.type = NewSwigType(T_COMPLEX); return (TYPE_COMPLEX); } diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index 08c92b9cf..c48d3a6f2 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -1779,7 +1779,7 @@ declaration : swig_directive { $$ = $1; } } else { Swig_error(cparse_file, cparse_line, "Syntax error in input(1).\n"); } - exit(1); + SWIG_exit(EXIT_FAILURE); } /* Out of class constructor/destructor declarations */ | c_constructor_decl { @@ -3359,7 +3359,7 @@ c_decl_tail : SEMI { } else { Swig_error(cparse_file, cparse_line, "Syntax error - possibly a missing semicolon.\n"); } - exit(1); + SWIG_exit(EXIT_FAILURE); } ; @@ -3649,7 +3649,7 @@ c_constructor_decl : storage_class type LPAREN parms RPAREN ctor_end { } if (err) { Swig_error(cparse_file,cparse_line,"Syntax error in input(2).\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); } } ; @@ -4632,7 +4632,7 @@ cpp_members : cpp_member cpp_members { int start_line = cparse_line; skip_decl(); Swig_error(cparse_file,start_line,"Syntax error in input(3).\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); } cpp_members { $$ = $3; } @@ -4800,6 +4800,9 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($8.qualifier) { SwigType_push($4,$8.qualifier); } + if ($8.val) { + Setattr($$,"value",$8.val); + } Setattr($$,"refqualifier",$8.refqualifier); Setattr($$,"decl",$4); Setattr($$,"parms",$6); @@ -4818,6 +4821,9 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($8.qualifier) { SwigType_push(decl,$8.qualifier); } + if ($8.val) { + Setattr($$,"value",$8.val); + } Setattr($$,"refqualifier",$8.refqualifier); Setattr($$,"decl",decl); Setattr($$,"parms",$6); @@ -4836,6 +4842,9 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($8.qualifier) { SwigType_push(decl,$8.qualifier); } + if ($8.val) { + Setattr($$,"value",$8.val); + } Setattr($$,"refqualifier",$8.refqualifier); Setattr($$,"decl",decl); Setattr($$,"parms",$6); @@ -4856,6 +4865,9 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($9.qualifier) { SwigType_push(decl,$9.qualifier); } + if ($9.val) { + Setattr($$,"value",$9.val); + } Setattr($$,"refqualifier",$9.refqualifier); Setattr($$,"decl",decl); Setattr($$,"parms",$7); @@ -4873,7 +4885,10 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($7.qualifier) { SwigType_push(t,$7.qualifier); } - Setattr($$,"refqualifier",$7.refqualifier); + if ($7.val) { + Setattr($$,"value",$7.val); + } + Setattr($$,"refqualifier",$7.refqualifier); Setattr($$,"decl",t); Setattr($$,"parms",$5); Setattr($$,"conversion_operator","1"); @@ -6217,19 +6232,19 @@ primitive_type_list : type_specifier { } else if (Cmp($1.type,"double") == 0) { if (Cmp($2.type,"long") == 0) { $$.type = NewString("long double"); - } else if (Cmp($2.type,"complex") == 0) { - $$.type = NewString("double complex"); + } else if (Cmp($2.type,"_Complex") == 0) { + $$.type = NewString("double _Complex"); } else { err = 1; } } else if (Cmp($1.type,"float") == 0) { - if (Cmp($2.type,"complex") == 0) { - $$.type = NewString("float complex"); + if (Cmp($2.type,"_Complex") == 0) { + $$.type = NewString("float _Complex"); } else { err = 1; } - } else if (Cmp($1.type,"complex") == 0) { - $$.type = NewStringf("%s complex", $2.type); + } else if (Cmp($1.type,"_Complex") == 0) { + $$.type = NewStringf("%s _Complex", $2.type); } else { err = 1; } @@ -6279,7 +6294,7 @@ type_specifier : TYPE_INT { $$.type = 0; } | TYPE_COMPLEX { - $$.type = NewString("complex"); + $$.type = NewString("_Complex"); $$.us = 0; } | TYPE_NON_ISO_INT8 { diff --git a/Source/CParse/templ.c b/Source/CParse/templ.c index 6b1a27014..2f38cc2c2 100644 --- a/Source/CParse/templ.c +++ b/Source/CParse/templ.c @@ -26,14 +26,19 @@ void SwigType_template_init() { } -static void add_parms(ParmList *p, List *patchlist, List *typelist) { +static void add_parms(ParmList *p, List *patchlist, List *typelist, int is_pattern) { while (p) { SwigType *ty = Getattr(p, "type"); SwigType *val = Getattr(p, "value"); - SwigType *name = Getattr(p, "name"); Append(typelist, ty); Append(typelist, val); - Append(typelist, name); + if (is_pattern) { + /* Typemap patterns are not simple parameter lists. + * Output style ("out", "ret" etc) typemap names can be + * qualified names and so may need template expansion */ + SwigType *name = Getattr(p, "name"); + Append(typelist, name); + } Append(patchlist, val); p = nextSibling(p); } @@ -108,8 +113,8 @@ static void cparse_template_expand(Node *templnode, Node *n, String *tname, Stri Append(typelist, Getattr(n, "name")); } - add_parms(Getattr(n, "parms"), cpatchlist, typelist); - add_parms(Getattr(n, "throws"), cpatchlist, typelist); + add_parms(Getattr(n, "parms"), cpatchlist, typelist, 0); + add_parms(Getattr(n, "throws"), cpatchlist, typelist, 0); } else if (Equal(nodeType, "class")) { /* Patch base classes */ @@ -175,8 +180,8 @@ static void cparse_template_expand(Node *templnode, Node *n, String *tname, Stri } Append(cpatchlist, Getattr(n, "code")); Append(typelist, Getattr(n, "decl")); - add_parms(Getattr(n, "parms"), cpatchlist, typelist); - add_parms(Getattr(n, "throws"), cpatchlist, typelist); + add_parms(Getattr(n, "parms"), cpatchlist, typelist, 0); + add_parms(Getattr(n, "throws"), cpatchlist, typelist, 0); } else if (Equal(nodeType, "destructor")) { /* We only need to patch the dtor of the template itself, not the destructors of any nested classes, so check that the parent of this node is the root * template node, with the special exception for %extend which adds its methods under an intermediate node. */ @@ -217,10 +222,10 @@ static void cparse_template_expand(Node *templnode, Node *n, String *tname, Stri Append(cpatchlist, Getattr(n, "code")); Append(typelist, Getattr(n, "type")); Append(typelist, Getattr(n, "decl")); - add_parms(Getattr(n, "parms"), cpatchlist, typelist); - add_parms(Getattr(n, "kwargs"), cpatchlist, typelist); - add_parms(Getattr(n, "pattern"), cpatchlist, typelist); - add_parms(Getattr(n, "throws"), cpatchlist, typelist); + add_parms(Getattr(n, "parms"), cpatchlist, typelist, 0); + add_parms(Getattr(n, "kwargs"), cpatchlist, typelist, 0); + add_parms(Getattr(n, "pattern"), cpatchlist, typelist, 1); + add_parms(Getattr(n, "throws"), cpatchlist, typelist, 0); cn = firstChild(n); while (cn) { cparse_template_expand(templnode, cn, tname, rname, templateargs, patchlist, typelist, cpatchlist); @@ -834,6 +839,7 @@ Node *Swig_cparse_template_locate(String *name, Parm *tparms, Symtab *tscope) { String *nodeType = nodeType(n); int isclass = 0; assert(Equal(nodeType, "template")); + (void)nodeType; isclass = (Equal(Getattr(n, "templatetype"), "class")); if (!isclass) { /* If not a templated class we must have a templated function. diff --git a/Source/DOH/README b/Source/DOH/README index 8be5f652a..be90f25b4 100644 --- a/Source/DOH/README +++ b/Source/DOH/README @@ -73,11 +73,17 @@ Replace(obj, orig, rep, flags) Replace occurrences of orig with rep. Chop(obj) Remove trailing whitespace flags is one of the following: - DOH_REPLACE_ANY - DOH_REPLACE_NOQUOTE - DOH_REPLACE_ID - DOH_REPLACE_FIRST - + DOH_REPLACE_ID + DOH_REPLACE_ID_BEGIN + DOH_REPLACE_ID_END + DOH_REPLACE_NUMBER_END + +and can be combined with one or more of the following: + DOH_REPLACE_ANY + DOH_REPLACE_NOQUOTE + DOH_REPLACE_NOCOMMENT + DOH_REPLACE_FIRST + Callable Operations ------------------- Call(obj, args) Perform a function call with arguments args. diff --git a/Source/DOH/base.c b/Source/DOH/base.c index 12351dd09..f5e418893 100644 --- a/Source/DOH/base.c +++ b/Source/DOH/base.c @@ -755,25 +755,6 @@ int DohUngetc(int ch, DOH *obj) { return ungetc(ch, (FILE *) b); } -/* ----------------------------------------------------------------------------- - * DohClose() - * ----------------------------------------------------------------------------- */ - -/* -int DohClose(DOH *obj) { - DohBase *b = (DohBase *) obj; - DohObjInfo *objinfo; - if (DohCheck(obj)) { - objinfo = b->type; - if (objinfo->doh_file->doh_close) { - return (objinfo->doh_file->doh_close) (b); - } - return 0; - } - return fclose((FILE *) obj); -} -*/ - /* ----------------------------------------------------------------------------- * DohIsString() * ----------------------------------------------------------------------------- */ diff --git a/Source/DOH/doh.h b/Source/DOH/doh.h index 5a9bae2b3..fd0530e9c 100644 --- a/Source/DOH/doh.h +++ b/Source/DOH/doh.h @@ -103,7 +103,6 @@ #define DohNewFileFromFile DOH_NAMESPACE(NewFileFromFile) #define DohNewFileFromFd DOH_NAMESPACE(NewFileFromFd) #define DohFileErrorDisplay DOH_NAMESPACE(FileErrorDisplay) -#define DohClose DOH_NAMESPACE(Close) #define DohCopyto DOH_NAMESPACE(Copyto) #define DohNewList DOH_NAMESPACE(NewList) #define DohNewHash DOH_NAMESPACE(NewHash) @@ -290,11 +289,12 @@ extern char *DohStrchr(const DOHString_or_char *s1, int ch); #define DOH_REPLACE_ANY 0x01 #define DOH_REPLACE_NOQUOTE 0x02 -#define DOH_REPLACE_ID 0x04 -#define DOH_REPLACE_FIRST 0x08 -#define DOH_REPLACE_ID_BEGIN 0x10 -#define DOH_REPLACE_ID_END 0x20 -#define DOH_REPLACE_NUMBER_END 0x40 +#define DOH_REPLACE_NOCOMMENT 0x04 +#define DOH_REPLACE_ID 0x08 +#define DOH_REPLACE_FIRST 0x10 +#define DOH_REPLACE_ID_BEGIN 0x20 +#define DOH_REPLACE_ID_END 0x40 +#define DOH_REPLACE_NUMBER_END 0x80 #define Replaceall(s,t,r) DohReplace(s,t,r,DOH_REPLACE_ANY) #define Replaceid(s,t,r) DohReplace(s,t,r,DOH_REPLACE_ID) @@ -303,15 +303,12 @@ extern char *DohStrchr(const DOHString_or_char *s1, int ch); * Files * ----------------------------------------------------------------------------- */ -extern DOHFile *DohNewFile(DOH *filename, const char *mode, DOHList *outfiles); +extern DOHFile *DohNewFile(DOHString *filename, const char *mode, DOHList *outfiles); extern DOHFile *DohNewFileFromFile(FILE *f); extern DOHFile *DohNewFileFromFd(int fd); extern void DohFileErrorDisplay(DOHString * filename); -/* - Deprecated, just use DohDelete -extern int DohClose(DOH *file); -*/ extern int DohCopyto(DOHFile * input, DOHFile * output); +extern void DohCloseAllOpenFiles(void); /* ----------------------------------------------------------------------------- @@ -392,7 +389,6 @@ extern void DohMemoryDebug(void); /* #define StringChar DohStringChar */ /* #define StringEqual DohStringEqual */ -#define Close DohClose #define vPrintf DohvPrintf #define GetInt DohGetInt #define GetDouble DohGetDouble @@ -424,7 +420,6 @@ extern void DohMemoryDebug(void); #define NewFileFromFile DohNewFileFromFile #define NewFileFromFd DohNewFileFromFd #define FileErrorDisplay DohFileErrorDisplay -#define Close DohClose #define NewVoid DohNewVoid #define Keys DohKeys #define Strcmp DohStrcmp @@ -432,6 +427,7 @@ extern void DohMemoryDebug(void); #define Strstr DohStrstr #define Strchr DohStrchr #define Copyto DohCopyto +#define CloseAllOpenFiles DohCloseAllOpenFiles #define Split DohSplit #define SplitLines DohSplitLines #define Setmark DohSetmark diff --git a/Source/DOH/dohint.h b/Source/DOH/dohint.h index c073bd95b..87def9d3d 100644 --- a/Source/DOH/dohint.h +++ b/Source/DOH/dohint.h @@ -49,7 +49,6 @@ typedef struct { int (*doh_ungetc) (DOH *obj, int ch); /* Unget character */ int (*doh_seek) (DOH *obj, long offset, int whence); /* Seek */ long (*doh_tell) (DOH *obj); /* Tell */ - int (*doh_close) (DOH *obj); /* Close */ } DohFileMethods; /* String methods */ diff --git a/Source/DOH/file.c b/Source/DOH/file.c index 5c56771d0..96f700223 100644 --- a/Source/DOH/file.c +++ b/Source/DOH/file.c @@ -25,6 +25,75 @@ typedef struct { int closeondel; } DohFile; +/* ----------------------------------------------------------------------------- + * open_files_list_instance + * open_files_list_add + * open_files_list_remove + * + * Singleton list containing all the files that have been opened by DohNewFile. + * Open file pointers are held in the list as strings so as to not affect the + * reference count of the underlying DOH objects. + * ----------------------------------------------------------------------------- */ + +static DOHList *open_files_list_instance() { + static DOHList *all_open_files = 0; + if (!all_open_files) + all_open_files = DohNewList(); + return all_open_files; +} + +static void open_files_list_add(DohFile *f) { + DOHList *all_open_files = open_files_list_instance(); + DOHString *sf = NewStringf("%p", f); + Append(all_open_files, sf); + Delete(sf); +} + +static void open_files_list_remove(DohFile *f) { + int i; + int removed = 0; + DOHList *all_open_files = open_files_list_instance(); + DOHString *sf = NewStringf("%p", f); + for (i = 0; i < DohLen(all_open_files); i++) { + DOHString *sf_i = Getitem(all_open_files, i); + if (Strcmp(sf, sf_i) == 0) { + DohDelitem(all_open_files, i); + removed = 1; + break; + } + } + Delete(sf); + assert(removed); + (void)removed; +} + +/* ----------------------------------------------------------------------------- + * DohCloseAllOpenFiles() + * + * Close all opened files, to be called on program termination + * ----------------------------------------------------------------------------- */ + +void DohCloseAllOpenFiles() { + int i; + DOHList *all_open_files = open_files_list_instance(); + for (i = 0; i < DohLen(all_open_files); i++) { + DohFile *f = 0; + DOHString *sf = Getitem(all_open_files, i); + int check = sscanf(Char(sf), "%p", (void **)&f); + assert(check == 1); + (void)check; + if (f->closeondel) { + if (f->filep) { + check = fclose(f->filep); + assert(check == 0); + } + f->closeondel = 0; + f->filep = 0; + } + } + DohClear(all_open_files); +} + /* ----------------------------------------------------------------------------- * DelFile() * ----------------------------------------------------------------------------- */ @@ -40,6 +109,7 @@ static void DelFile(DOH *fo) { close(f->fd); } #endif + open_files_list_remove(f); } DohFree(f); } @@ -166,27 +236,6 @@ static int File_ungetc(DOH *fo, int ch) { return -1; } -/* ----------------------------------------------------------------------------- - * File_close() - * - * Close the file - * ----------------------------------------------------------------------------- */ - -static int File_close(DOH *fo) { - int ret = 0; - DohFile *f = (DohFile *) ObjData(fo); - if (f->filep) { - ret = fclose(f->filep); - f->filep = 0; - } else if (f->fd) { -#ifdef DOH_INTFILE - ret = close(f->fd); - f->fd = 0; -#endif - } - return ret; -} - static DohFileMethods FileFileMethods = { File_read, File_write, @@ -195,7 +244,6 @@ static DohFileMethods FileFileMethods = { File_ungetc, File_seek, File_tell, - File_close, /* close */ }; static DohObjInfo DohFileType = { @@ -231,8 +279,9 @@ static DohObjInfo DohFileType = { * If newfiles is non-zero, the filename is added to the list of new files. * ----------------------------------------------------------------------------- */ -DOH *DohNewFile(DOH *filename, const char *mode, DOHList *newfiles) { +DOH *DohNewFile(DOHString *filename, const char *mode, DOHList *newfiles) { DohFile *f; + DOH *obj; FILE *file; char *filen; @@ -251,7 +300,9 @@ DOH *DohNewFile(DOH *filename, const char *mode, DOHList *newfiles) { f->filep = file; f->fd = 0; f->closeondel = 1; - return DohObjMalloc(&DohFileType, f); + obj = DohObjMalloc(&DohFileType, f); + open_files_list_add(f); + return obj; } /* ----------------------------------------------------------------------------- diff --git a/Source/DOH/memory.c b/Source/DOH/memory.c index e0e4c68bd..4a9494e85 100644 --- a/Source/DOH/memory.c +++ b/Source/DOH/memory.c @@ -15,7 +15,7 @@ #include "dohint.h" #ifndef DOH_POOL_SIZE -#define DOH_POOL_SIZE 16384 +#define DOH_POOL_SIZE 4194304 #endif /* Checks stale DOH object use - will use a lot more memory as pool memory is not re-used. */ diff --git a/Source/DOH/string.c b/Source/DOH/string.c index 94d2737fa..093330b89 100644 --- a/Source/DOH/string.c +++ b/Source/DOH/string.c @@ -595,6 +595,13 @@ static char *end_quote(char *s) { } } +static char *end_comment(char *s) { + char *substring = strstr(s, "*/"); + if (substring) + ++substring; + return substring; +} + static char *match_simple(char *base, char *s, char *token, int tokenlen) { (void) base; (void) tokenlen; @@ -677,6 +684,7 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co int ic; int rcount = 0; int noquote = 0; + int nocomment = 0; char *c, *s, *t, *first; char *q, *q2; char *base; @@ -698,6 +706,11 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co if (flags & DOH_REPLACE_NOQUOTE) noquote = 1; + if (flags & DOH_REPLACE_NOCOMMENT) + nocomment = 1; + + assert(!(noquote && nocomment)); /* quote and comment combination not implemented */ + /* If we are not replacing inside quotes, we need to do a little extra work */ if (noquote) { q = strpbrk(base, "\"\'"); @@ -723,6 +736,31 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } + /* If we are not replacing inside comments, we need to do a little extra work */ + if (nocomment) { + q = strstr(base, "/*"); + if (!q) { + nocomment = 0; /* Well, no comments to worry about. Oh well */ + } else { + while (q && (q < s)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + return 0; + } + if (q2 > s) { + /* Find next match */ + s = (*match) (base, q2 + 1, token, tokenlen); + } + if (!s) + return 0; /* Oh well, no matches */ + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; /* No more comments */ + } + } + } + first = s; replen = (int)strlen(rep); @@ -768,6 +806,28 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } } + if (nocomment) { + q = strstr(s, "/*"); + if (!q) { + nocomment = 0; + } else { + while (q && (q < c)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + c = 0; + break; + } + if (q2 > c) + c = (*match) (base, q2 + 1, token, tokenlen); + if (!c) + break; + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; /* No more comments */ + } + } + } if (delta) { if (c) { memmove(t, s, c - s); @@ -776,7 +836,9 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co memmove(t, s, (str->str + str->len) - s + 1); } } else { - t += (c - s); + if (c) { + t += (c - s); + } } s = c; ic--; @@ -823,6 +885,29 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } } + if (nocomment) { + q = strstr(s, "/*"); + if (!q) { + break; + } else { + while (q && (q < c)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + c = 0; + break; + } + if (q2 > c) { + c = (*match) (base, q2 + 1, token, tokenlen); + if (!c) + break; + } + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; + } + } + } if (c) { rcount++; ic--; @@ -875,6 +960,29 @@ static int replace_simple(String *str, char *token, char *rep, int flags, int co } } } + if (nocomment) { + q = strstr(s, "/*"); + if (!q) { + nocomment = 0; + } else { + while (q && (q < c)) { + /* First match was found inside a comment. Try to find another match */ + q2 = end_comment(q); + if (!q2) { + c = 0; + break; + } + if (q2 > c) { + c = (*match) (base, q2 + 1, token, tokenlen); + if (!c) + break; + } + q = strstr(q2 + 1, "/*"); + if (!q) + nocomment = 0; /* No more comments */ + } + } + } if (i < (rcount - 1)) { memcpy(t, s, c - s); t += (c - s); @@ -987,7 +1095,6 @@ static DohFileMethods StringFileMethods = { String_ungetc, String_seek, String_tell, - 0, /* close */ }; static DohStringMethods StringStringMethods = { diff --git a/Source/Doxygen/doxycommands.h b/Source/Doxygen/doxycommands.h index 1f7b5fa5b..b5d65af65 100644 --- a/Source/Doxygen/doxycommands.h +++ b/Source/Doxygen/doxycommands.h @@ -18,11 +18,13 @@ const char *CMD_HTML_ONLY = "htmlonly"; // doxy commands are not processed inside this block const char *CMD_VERBATIM = "verbatim"; +const char *CMD_CODE = "code"; const char *CMD_LATEX_1 = "f$"; const char *CMD_LATEX_2 = "f{"; const char *CMD_LATEX_3 = "f["; const char *CMD_END_HTML_ONLY = "endhtmlonly"; const char *CMD_END_VERBATIM = "endverbatim"; +const char *CMD_END_CODE = "endcode"; const char *CMD_END_LATEX_1 = "f$"; const char *CMD_END_LATEX_2 = "f}"; const char *CMD_END_LATEX_3 = "f]"; diff --git a/Source/Doxygen/doxyparser.cxx b/Source/Doxygen/doxyparser.cxx index 2e826b265..d5a0a15eb 100644 --- a/Source/Doxygen/doxyparser.cxx +++ b/Source/Doxygen/doxyparser.cxx @@ -34,6 +34,30 @@ std::set DoxygenParser::doxygenSectionIndicators; const int TOKENSPERLINE = 8; //change this to change the printing behaviour of the token list const std::string END_HTML_TAG_MARK("/"); +std::string getBaseCommand(const std::string &cmd) { + if (cmd.substr(0,5) == "param") + return "param"; + else if (cmd.substr(0,4) == "code") + return "code"; + else + return cmd; +} + +// Find the first position beyond the word command. Extra logic is +// used to avoid putting the characters "," and "." in +// DOXYGEN_WORD_CHARS. +static size_t getEndOfWordCommand(const std::string &line, size_t pos) { + size_t endOfWordPos = line.find_first_not_of(DOXYGEN_WORD_CHARS, pos); + if (line.substr(pos, 6) == "param[") + // include ",", which can appear in param[in,out] + endOfWordPos = line.find_first_not_of(string(DOXYGEN_WORD_CHARS)+ ",", pos); + else if (line.substr(pos, 5) == "code{") + // include ".", which can appear in e.g. code{.py} + endOfWordPos = line.find_first_not_of(string(DOXYGEN_WORD_CHARS)+ ".", pos); + return endOfWordPos; +} + + DoxygenParser::DoxygenParser(bool noisy) : noisy(noisy) { fillTables(); } @@ -118,7 +142,7 @@ void DoxygenParser::printTree(const DoxygenEntityList &rootList) { } DoxygenParser::DoxyCommandEnum DoxygenParser::commandBelongs(const std::string &theCommand) { - DoxyCommandsMapIt it = doxygenCommands.find(stringToLower(theCommand)); + DoxyCommandsMapIt it = doxygenCommands.find(stringToLower(getBaseCommand(theCommand))); if (it != doxygenCommands.end()) { return it->second; @@ -312,7 +336,7 @@ DoxygenParser::TokenListCIt DoxygenParser::getEndOfParagraph(const TokenList &to } else if (endOfParagraph->m_tokenType == COMMAND) { - if (isSectionIndicator(endOfParagraph->m_tokenString)) { + if (isSectionIndicator(getBaseCommand(endOfParagraph->m_tokenString))) { return endOfParagraph; } else { endOfParagraph++; @@ -666,7 +690,7 @@ void DoxygenParser::addCommandUnique(const std::string &theCommand, const TokenL // \f{ ... \f} // \f{env}{ ... \f} // \f$ ... \f$ - else if (theCommand == "code" || theCommand == "verbatim" + else if (getBaseCommand(theCommand) == "code" || theCommand == "verbatim" || theCommand == "dot" || theCommand == "msc" || theCommand == "f[" || theCommand == "f{" || theCommand == "f$") { if (!endCommands.size()) { // fill in static table of end commands @@ -683,7 +707,7 @@ void DoxygenParser::addCommandUnique(const std::string &theCommand, const TokenL if (it != endCommands.end()) endCommand = it->second; else - endCommand = "end" + theCommand; + endCommand = "end" + getBaseCommand(theCommand); std::string content = getStringTilEndCommand(endCommand, tokList); aNewList.push_back(DoxygenEntity("plainstd::string", content)); @@ -1057,6 +1081,13 @@ bool DoxygenParser::addDoxyCommand(DoxygenParser::TokenList &tokList, const std: tokList.push_back(Token(COMMAND, cmd)); return true; } else { + if (cmd.empty()) { + // This actually indicates a bug in the code in this file, as this + // function shouldn't be called at all in this case. + printListError(WARN_DOXYGEN_UNKNOWN_COMMAND, "Unexpected empty Doxygen command."); + return false; + } + // This function is called for the special Doxygen commands, but also for // HTML commands (or anything that looks like them, actually) and entities. // We don't recognize all of those, so just ignore them and pass them @@ -1090,7 +1121,7 @@ size_t DoxygenParser::processVerbatimText(size_t pos, const std::string &line) { size_t endOfWordPos = line.find_first_not_of(DOXYGEN_WORD_CHARS, pos); string cmd = line.substr(pos, endOfWordPos - pos); - if (cmd == CMD_END_HTML_ONLY || cmd == CMD_END_VERBATIM || cmd == CMD_END_LATEX_1 || cmd == CMD_END_LATEX_2 || cmd == CMD_END_LATEX_3) { + if (cmd == CMD_END_HTML_ONLY || cmd == CMD_END_VERBATIM || cmd == CMD_END_LATEX_1 || cmd == CMD_END_LATEX_2 || cmd == CMD_END_LATEX_3 || cmd == CMD_END_CODE) { m_isVerbatimText = false; addDoxyCommand(m_tokenList, cmd); @@ -1154,22 +1185,43 @@ bool DoxygenParser::processEscapedChars(size_t &pos, const std::string &line) { */ void DoxygenParser::processWordCommands(size_t &pos, const std::string &line) { pos++; - size_t endOfWordPos = line.find_first_not_of(DOXYGEN_WORD_CHARS, pos); + size_t endOfWordPos = getEndOfWordCommand(line, pos); string cmd = line.substr(pos, endOfWordPos - pos); + if (cmd.empty()) { + // This was a bare backslash, just ignore it. + return; + } + addDoxyCommand(m_tokenList, cmd); - if (cmd == CMD_HTML_ONLY || cmd == CMD_VERBATIM || cmd == CMD_LATEX_1 || cmd == CMD_LATEX_2 || cmd == CMD_LATEX_3) { + // A flag for whether we want to skip leading spaces after the command + bool skipLeadingSpace = true; + + if (cmd == CMD_HTML_ONLY || cmd == CMD_VERBATIM || cmd == CMD_LATEX_1 || cmd == CMD_LATEX_2 || cmd == CMD_LATEX_3 || getBaseCommand(cmd) == CMD_CODE) { m_isVerbatimText = true; - } else { + // Skipping leading space is necessary with inline \code command, + // and it won't hurt anything for block \code (TODO: are the other + // commands also compatible with skip leading space? If so, just + // do it every time.) + if (getBaseCommand(cmd) == CMD_CODE) skipLeadingSpace = true; + else skipLeadingSpace = false; + } else if (cmd.substr(0,3) == "end") { + // If processing an "end" command such as "endlink", don't skip + // the space before the next string + skipLeadingSpace = false; + } + + if (skipLeadingSpace) { // skip any possible spaces after command, because some commands have parameters, // and spaces between command and parameter must be ignored. if (endOfWordPos != string::npos) { endOfWordPos = line.find_first_not_of(" \t", endOfWordPos); } } + pos = endOfWordPos; } diff --git a/Source/Doxygen/doxyparser.h b/Source/Doxygen/doxyparser.h index 96c71d22f..e692729ce 100644 --- a/Source/Doxygen/doxyparser.h +++ b/Source/Doxygen/doxyparser.h @@ -21,6 +21,11 @@ #include "doxyentity.h" +// Utility function to return the base part of a command that may +// include options, e.g. param[in] -> param +std::string getBaseCommand(const std::string &cmd); + + class DoxygenParser { private: diff --git a/Source/Doxygen/javadoc.cxx b/Source/Doxygen/javadoc.cxx index 72f84ab6c..d9313f981 100644 --- a/Source/Doxygen/javadoc.cxx +++ b/Source/Doxygen/javadoc.cxx @@ -334,7 +334,7 @@ std::string JavaDocConverter::translateSubtree(DoxygenEntity &doxygenEntity) { void JavaDocConverter::translateEntity(DoxygenEntity &tag, std::string &translatedComment) { std::map >::iterator it; - it = tagHandlers.find(tag.typeOfEntity); + it = tagHandlers.find(getBaseCommand(tag.typeOfEntity)); if (it != tagHandlers.end()) { (this->*(it->second.first))(tag, translatedComment, it->second.second); diff --git a/Source/Doxygen/pydoc.cxx b/Source/Doxygen/pydoc.cxx index eb489932a..c84095b8f 100644 --- a/Source/Doxygen/pydoc.cxx +++ b/Source/Doxygen/pydoc.cxx @@ -174,7 +174,8 @@ static string padCodeAndVerbatimBlocks(const string &docString) { } else { if (lastLineWasNonBlank && (line.compare(pos, 13, ".. code-block") == 0 || - line.compare(pos, 7, ".. math") == 0)) { + line.compare(pos, 7, ".. math") == 0 || + line.compare(pos, 3, ">>>") == 0)) { // Must separate code or math blocks from the previous line result += '\n'; } @@ -184,6 +185,21 @@ static string padCodeAndVerbatimBlocks(const string &docString) { return result; } +// Helper function to extract the option value from a command, +// e.g. param[in] -> in +static std::string getCommandOption(const std::string &command, char openChar, char closeChar) { + string option; + + size_t opt_begin, opt_end; + opt_begin = command.find(openChar); + opt_end = command.find(closeChar); + if (opt_begin != string::npos && opt_end != string::npos) + option = command.substr(opt_begin+1, opt_end-opt_begin-1); + + return option; +} + + /* static */ PyDocConverter::TagHandlersMap::mapped_type PyDocConverter::make_handler(tagHandler handler) { return make_pair(handler, std::string()); @@ -245,7 +261,7 @@ void PyDocConverter::fillStaticTables() { tagHandlers["date"] = make_handler(&PyDocConverter::handleParagraph); tagHandlers["deprecated"] = make_handler(&PyDocConverter::handleParagraph); tagHandlers["details"] = make_handler(&PyDocConverter::handleParagraph); - tagHandlers["em"] = make_handler(&PyDocConverter::handleParagraph, " "); + tagHandlers["em"] = make_handler(&PyDocConverter::handleTagWrap, "*"); tagHandlers["example"] = make_handler(&PyDocConverter::handleParagraph); tagHandlers["exception"] = tagHandlers["throw"] = tagHandlers["throws"] = make_handler(&PyDocConverter::handleTagException); tagHandlers["htmlonly"] = make_handler(&PyDocConverter::handleParagraph); @@ -254,7 +270,7 @@ void PyDocConverter::fillStaticTables() { tagHandlers["link"] = make_handler(&PyDocConverter::handleParagraph); tagHandlers["manonly"] = make_handler(&PyDocConverter::handleParagraph); tagHandlers["note"] = make_handler(&PyDocConverter::handleParagraph); - tagHandlers["p"] = make_handler(&PyDocConverter::handleParagraph); + tagHandlers["p"] = make_handler(&PyDocConverter::handleTagWrap, "``"); tagHandlers["partofdescription"] = make_handler(&PyDocConverter::handleParagraph); tagHandlers["rtfonly"] = make_handler(&PyDocConverter::handleParagraph); tagHandlers["remark"] = make_handler(&PyDocConverter::handleParagraph); @@ -418,16 +434,32 @@ std::string PyDocConverter::getParamType(std::string param) { ParmList *plist = CopyParmList(Getattr(currentNode, "parms")); for (Parm *p = plist; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); - if (Char(pname) != param) - continue; - - type = getPyDocType(p, pname); - break; + if (pname && Char(pname) == param) { + type = getPyDocType(p, pname); + break; + } } Delete(plist); return type; } +std::string PyDocConverter::getParamValue(std::string param) { + std::string value; + + ParmList *plist = CopyParmList(Getattr(currentNode, "parms")); + for (Parm *p = plist; p; p = nextSibling(p)) { + String *pname = Getattr(p, "name"); + if (pname && Char(pname) == param) { + String *pval = Getattr(p, "value"); + if (pval) + value = Char(pval); + break; + } + } + Delete(plist); + return value; +} + std::string PyDocConverter::translateSubtree(DoxygenEntity &doxygenEntity) { std::string translatedComment; @@ -456,7 +488,7 @@ std::string PyDocConverter::translateSubtree(DoxygenEntity &doxygenEntity) { void PyDocConverter::translateEntity(DoxygenEntity &doxyEntity, std::string &translatedComment) { // check if we have needed handler and call it std::map >::iterator it; - it = tagHandlers.find(doxyEntity.typeOfEntity); + it = tagHandlers.find(getBaseCommand(doxyEntity.typeOfEntity)); if (it != tagHandlers.end()) (this->*(it->second.first)) (doxyEntity, translatedComment, it->second.second); } @@ -531,19 +563,29 @@ void PyDocConverter::handleCode(DoxygenEntity &tag, std::string &translatedComme trimWhitespace(translatedComment); - // Use the current indent for the code-block line itself. - translatedComment += indent.getFirstLineIndent(); - - // Go out on a limb and assume that examples in the C or C++ sources use C++. - // In the worst case, we'll highlight C code using C++ syntax which is not a - // big deal (TODO: handle Doxygen code command language argument). - translatedComment += ".. code-block:: c++\n\n"; - - // Specify the level of extra indentation that will be used for - // subsequent lines within the code block. Note that the correct - // "starting indentation" is already present in the input, so we - // only need to add the desired code block indentation. - string codeIndent = m_indent; + // Check for an option given to the code command (e.g. code{.py}), + // and try to set the code-block language accordingly. + string option = getCommandOption(tag.typeOfEntity, '{', '}'); + // Set up the language option to the code-block command, which can + // be any language supported by pygments: + string codeLanguage; + if (option == ".py") + // Other possibilities here are "default" or "python3". In Sphinx + // 2.1.2, basic syntax doesn't render quite the same in these as + // with "python", which for basic keywords seems to provide + // slightly richer formatting. Another option would be to leave + // the language empty, but testing with Sphinx 1.8.5 has produced + // an error "1 argument required". + codeLanguage = "python"; + else if (option == ".java") + codeLanguage = "java"; + else if (option == ".c") + codeLanguage = "c"; + else + // If there is not a match, or if no option was given, go out on a + // limb and assume that the examples in the C or C++ sources use + // C++. + codeLanguage = "c++"; std::string code; handleTagVerbatim(tag, code, arg); @@ -552,6 +594,27 @@ void PyDocConverter::handleCode(DoxygenEntity &tag, std::string &translatedComme // command: eraseLeadingNewLine(code); + // Check for python doctest blocks, and treat them specially: + bool isDocTestBlock = false; + size_t startPos; + // ">>>" would normally appear at the beginning, but doxygen comment + // style may have space in front, so skip leading whitespace + if ((startPos=code.find_first_not_of(" \t")) != string::npos && code.substr(startPos,3) == ">>>") + isDocTestBlock = true; + + string codeIndent; + if (! isDocTestBlock) { + // Use the current indent for the code-block line itself. + translatedComment += indent.getFirstLineIndent(); + translatedComment += ".. code-block:: " + codeLanguage + "\n\n"; + + // Specify the level of extra indentation that will be used for + // subsequent lines within the code block. Note that the correct + // "starting indentation" is already present in the input, so we + // only need to add the desired code block indentation. + codeIndent = m_indent; + } + translatedComment += codeIndent; for (size_t n = 0; n < code.length(); n++) { if (code[n] == '\n') { @@ -636,8 +699,26 @@ void PyDocConverter::handleTagParam(DoxygenEntity &tag, std::string &translatedC const std::string ¶mName = paramNameEntity.data; const std::string paramType = getParamType(paramName); + const std::string paramValue = getParamValue(paramName); + + // Get command option, e.g. "in", "out", or "in,out" + string commandOpt = getCommandOption(tag.typeOfEntity, '[', ']'); + if (commandOpt == "in,out") commandOpt = "in/out"; + + // If provided, append the parameter direction to the type + // information via a suffix: + std::string suffix; + if (commandOpt.size() > 0) + suffix = ", " + commandOpt; + + // If the parameter has a default value, flag it as optional in the + // generated type definition. Particularly helpful when the python + // call is generated with *args, **kwargs. + if (paramValue.size() > 0) + suffix += ", optional"; + if (!paramType.empty()) { - translatedComment += ":type " + paramName + ": " + paramType + "\n"; + translatedComment += ":type " + paramName + ": " + paramType + suffix + "\n"; translatedComment += indent.getFirstLineIndent(); } @@ -909,3 +990,4 @@ String *PyDocConverter::makeDocumentation(Node *n) { return NewString(pyDocString.c_str()); } + diff --git a/Source/Doxygen/pydoc.h b/Source/Doxygen/pydoc.h index df8997d76..07c5ce51e 100644 --- a/Source/Doxygen/pydoc.h +++ b/Source/Doxygen/pydoc.h @@ -178,6 +178,11 @@ protected: */ std::string getParamType(std::string name); + /* + * Simple helper function to retrieve the parameter value + */ + std::string getParamValue(std::string name); + private: // temporary thing, should be refactored somehow Node *currentNode; diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h index bbb6c419b..b12cce942 100644 --- a/Source/Include/swigwarn.h +++ b/Source/Include/swigwarn.h @@ -157,9 +157,9 @@ #define WARN_TYPE_REDEFINED 404 #define WARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405 -#define WARN_TYPEMAP_SOURCETARGET 450 +#define WARN_TYPEMAP_SOURCETARGET 450 /* No longer issued */ #define WARN_TYPEMAP_CHARLEAK 451 -#define WARN_TYPEMAP_SWIGTYPE 452 +#define WARN_TYPEMAP_SWIGTYPE 452 /* No longer issued */ #define WARN_TYPEMAP_APPLY_UNDEF 453 #define WARN_TYPEMAP_SWIGTYPELEAK 454 @@ -282,6 +282,7 @@ #define WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 #define WARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 #define WARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 +#define WARN_JAVA_TYPEMAP_INTERFACEMODIFIERS_UNDEF 847 /* please leave 810-829 free for Java */ @@ -302,22 +303,11 @@ #define WARN_CSHARP_EXCODE 844 #define WARN_CSHARP_CANTHROW 845 #define WARN_CSHARP_NO_DIRECTORCONNECT_ATTR 846 +#define WARN_CSHARP_TYPEMAP_INTERFACEMODIFIERS_UNDEF 847 /* please leave 830-849 free for C# */ -#define WARN_MODULA3_TYPEMAP_TYPE_UNDEF 850 -#define WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851 -#define WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852 -#define WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853 -#define WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854 -#define WARN_MODULA3_MULTIPLE_INHERITANCE 855 -#define WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856 -#define WARN_MODULA3_UNKNOWN_PRAGMA 857 -#define WARN_MODULA3_BAD_ENUMERATION 858 -#define WARN_MODULA3_DOUBLE_ID 859 -#define WARN_MODULA3_BAD_IMPORT 860 - -/* please leave 850-869 free for Modula 3 */ +/* 850-860 were used by Modula 3 (removed in SWIG 4.1.0) - avoid reusing for now */ #define WARN_PHP_MULTIPLE_INHERITANCE 870 #define WARN_PHP_UNKNOWN_PRAGMA 871 diff --git a/Source/Modules/allegrocl.cxx b/Source/Modules/allegrocl.cxx deleted file mode 100644 index 97af186fe..000000000 --- a/Source/Modules/allegrocl.cxx +++ /dev/null @@ -1,2963 +0,0 @@ -/* ----------------------------------------------------------------------------- - * This file is part of SWIG, which is licensed as a whole under version 3 - * (or any later version) of the GNU General Public License. Some additional - * terms also apply to certain portions of SWIG. The full details of the SWIG - * license and copyrights can be found in the LICENSE and COPYRIGHT files - * included with the SWIG source code as distributed by the SWIG developers - * and at http://www.swig.org/legal.html. - * - * allegrocl.cxx - * - * ALLEGROCL language module for SWIG. - * ----------------------------------------------------------------------------- */ - -#include "swigmod.h" -#include "cparse.h" -#include - -// #define ALLEGROCL_DEBUG -// #define ALLEGROCL_WRAP_DEBUG -// #define ALLEGROCL_TYPE_DEBUG -// #define ALLEGROCL_CLASS_DEBUG - -static const char *usage = "\ -Allegro CL Options (available with -allegrocl)\n\ - -identifier-converter - \n\ - Specifies the type of conversion to do on C identifiers to convert\n\ - them to symbols. There are two built-in converters: 'null' and\n\ - 'lispify'. The default is 'null'. If you supply a name other\n\ - than one of the built-ins, then a function by that name will be\n\ - called to convert identifiers to symbols.\n\ - -[no]cwrap - Turn on or turn off generation of an intermediate C file when\n\ - creating a C interface. By default this is only done for C++ code.\n\ - -isolate - Define all SWIG helper functions in a package unique to this\n\ - module. Avoids redefinition warnings when loading multiple\n\ - SWIGged modules into the same running Allegro CL image.\n\ -"; - -static File *f_cl = 0; -String *f_clhead = NewString(""); -String *f_clwrap = NewString("(swig-in-package ())\n\n"); -static File *f_begin; -static File *f_runtime; -static File *f_cxx_header = 0; -static File *f_cxx_wrapper = 0; - -static String *module_name = 0; -static String *swig_package = 0; - -static String *identifier_converter = NewString("identifier-convert-null"); - -static bool CWrap = true; // generate wrapper file for C code by default. most correct. -static bool Generate_Wrapper = false; -static bool unique_swig_package = false; - -static SwigType *fwdref_ffi_type = NewString("__SWIGACL_FwdReference"); - -static String *current_namespace = NewString(""); -static String *current_package = NewString(""); -static Hash *defined_namespace_packages = NewHash(); -static Node *in_class = 0; - -static Node *first_linked_type = 0; -static Hash *defined_foreign_types = NewHash(); -static Hash *defined_foreign_ltypes = NewHash(); - -static String *anon_type_name = NewString("anontype"); -static int anon_type_count = 0; - -// stub -String *convert_literal(String *num_param, String *type, bool try_to_split = true); - -class ALLEGROCL:public Language { -public: - virtual void main(int argc, char *argv[]); - virtual int top(Node *n); - virtual int functionWrapper(Node *n); - virtual int namespaceDeclaration(Node *n); - virtual int constructorHandler(Node *n); - virtual int destructorHandler(Node *n); - virtual int globalvariableHandler(Node *n); - virtual int variableWrapper(Node *n); - virtual int constantWrapper(Node *n); - virtual int memberfunctionHandler(Node *n); - virtual int membervariableHandler(Node *n); - virtual int classHandler(Node *n); - virtual int emit_one(Node *n); - virtual int enumDeclaration(Node *n); - virtual int enumvalueDeclaration(Node *n); - virtual int typedefHandler(Node *n); - virtual int classforwardDeclaration(Node *n); - virtual int templateDeclaration(Node *n); - virtual int validIdentifier(String *s); -private: - int emit_defun(Node *n, File *f_cl); - int emit_dispatch_defun(Node *n); - int emit_buffered_defuns(Node *n); - int cClassHandler(Node *n); - int cppClassHandler(Node *n); -}; -static ALLEGROCL *allegrocl = 0; - -static String *trim(String *str) { - char *c = Char(str); - while (*c != '\0' && isspace((int) *c)) - ++c; - String *result = NewString(c); - Chop(result); - return result; -} - -int is_integer(String *s) { - char *c = Char(s); - if (c[0] == '#' && (c[1] == 'x' || c[1] == 'o')) - c += 2; - - while (*c) { - if (!isdigit(*c)) - return 0; - c++; - } - return 1; -} - -String *class_from_class_or_class_ref(String *type) { - SwigType *stripped = SwigType_strip_qualifiers(type); - if (SwigType_isclass(stripped)) - return stripped; - - if (SwigType_ispointer(stripped) || SwigType_isreference(stripped)) { - // Printf(stderr,"It is a pointer/reference. Is it a class?\n"); - SwigType_pop(stripped); - if (SwigType_isclass(stripped)) { - return stripped; - } - } - return 0; -} - -String *lookup_defined_foreign_type(String *k) { - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "Looking up defined type '%s'.\n Found: '%s'\n", k, Getattr(defined_foreign_types, k)); -#endif - - return Getattr(defined_foreign_types, k); -} - -String *listify_namespace(String *namespaze) { - if (Len(namespaze) == 0) - return NewString("()"); - String *result = NewStringf("(\"%s\")", namespaze); - Replaceall(result, "::", "\" \""); - return result; -} - -String *namespaced_name(Node *n, String *ns = current_namespace) { - - return NewStringf("%s%s%s", ns, (Len(ns) != 0) ? "::" : "", Getattr(n, "sym:name")); -} - -// "Namespace::Nested::Class2::Baz" -> "Baz" -static String *strip_namespaces(String *str) { - return Swig_scopename_last(str); -} - -void add_linked_type(Node *n) { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Adding linked node of type: %s(%s) %s(%p)\n\n", nodeType(n), Getattr(n, "storage"), Getattr(n, "name"), n); - // Swig_print_node(n); -#endif - if (!first_linked_type) { - first_linked_type = n; - Setattr(n, "allegrocl:last_linked_type", n); - } else { - Node *t = Getattr(first_linked_type, "allegrocl:last_linked_type"); - Setattr(t, "allegrocl:next_linked_type", n); - Setattr(first_linked_type, "allegrocl:last_linked_type", n); - } -} - -void replace_linked_type(Node *old, Node *new_node) { - Node *prev = Getattr(old, "allegrocl:prev_linked_type"); - - Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); - if (prev) - Setattr(prev, "allegrocl:next_linked_type", new_node); - Delattr(old, "allegrocl:next_linked_type"); - Delattr(old, "allegrocl:prev_linked_type"); - - // check if we're replacing the first link. - if (first_linked_type == old) { - first_linked_type = new_node; - Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(old, "allegrocl:last_linked_type")); - } - // check if we're replacing the last link. - if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) - Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); -} - -void insert_linked_type_at(Node *old, Node *new_node, int before = 1) { - Node *p = 0; - - if (!first_linked_type) { - add_linked_type(new_node); - return; - } - - if (!before) { - Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); - Setattr(old, "allegrocl:next_linked_type", new_node); - if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) - Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); - } else { - Node *c = first_linked_type; - while (c) { - if (c == old) { - break; - } else { - p = c; - c = Getattr(c, "allegrocl:next_linked_type"); - } - } - if (c == old) { - Setattr(new_node, "allegrocl:next_linked_type", c); - if (first_linked_type == c) { - first_linked_type = new_node; - Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(c, "allegrocl:last_linked_type")); - Delattr(c, "allegrocl:last_linked_type"); - } - if (p) - Setattr(p, "allegrocl:next_linked_type", new_node); - } - } -} - -Node *find_linked_type_by_name(String *name) { - Node *p = 0; - Node *c = first_linked_type; - - // Printf(stderr,"in find_linked_type_by_name '%s'...", name); - while (c) { - String *key = Getattr(c, "name"); - if (!Strcmp(key, name)) { - break; - } else { - p = c; - c = Getattr(c, "allegrocl:next_linked_type"); - } - } - // Printf(stderr,"exit find_linked_type_by_name.\n"); - - if (p && c) - Setattr(c, "allegrocl:prev_linked_type", p); - // Printf(stderr,"find_linked_type_by_name: DONE\n"); - return c; -} - -Node *get_primary_synonym_of(Node *n) { - Node *p = Getattr(n, "allegrocl:synonym-of"); - Node *prim = n; - - // Printf(stderr, "getting primary synonym of %p\n", n); - while (p) { - // Printf(stderr, " found one! %p\n", p); - prim = p; - p = Getattr(p, "allegrocl:synonym-of"); - } - // Printf(stderr,"get_primary_syn: DONE. returning %s(%p)\n", Getattr(prim,"name"),prim); - return prim; -} - -void add_forward_referenced_type(Node *n, int overwrite = 0) { - String *k = Getattr(n, "name"); - String *name = Getattr(n, "sym:name"); - String *ns = listify_namespace(current_namespace); - - String *val = Getattr(defined_foreign_types, k); - - if (!val || overwrite) { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "Adding forward reference for %s (overwrite=%d)\n", k, overwrite); -#endif - Setattr(defined_foreign_types, Copy(k), NewString("forward-reference")); - - String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns); - - Setattr(defined_foreign_ltypes, Copy(k), mangled_lname_gen); - // Printf(f_cl, ";; forward reference stub\n" - // "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n" - // , name); - -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Linking forward reference type = %s(%p)\n", k, n); -#endif - add_linked_type(n); - } -} - -void add_defined_foreign_type(Node *n, int overwrite = 0, String *k = 0, - String *name = 0, String *ns = current_namespace) { - - String *val; - String *ns_list = listify_namespace(ns); - String *templated = n ? Getattr(n, "template") : 0; - String *cDeclName = n ? Getattr(n, "name") : 0; - -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "IN A-D-F-T. (n=%p, ow=%d, k=%s, name=%s, ns=%s\n", n, overwrite, k, name, ns); - Printf(stderr, " templated = '%p', classDecl = '%p'\n", templated, cDeclName); -#endif - if (n) { - if (!name) - name = Getattr(n, "sym:name"); - if (!name) - name = strip_namespaces(Getattr(n, "name")); - if (templated) { - k = namespaced_name(n); - } else { - String *kind_of_type = Getattr(n, "kind"); - - /* - For typedefs of the form: - - typedef struct __xxx { ... } xxx; - - behavior differs between C mode and C++ mode. - - C Mode: - add_defined_foreign_type will be called once via classHandler - to define the type for 'struct __xxx' and add the mapping from - 'struct __xxx' -> 'xxx' - - It will also be called once via typedefHandler to add the - mapping 'xxx' -> 'xxx' - - C++ Mode: - add_defined_foreign_type will be called once via classHandler - to define the type for 'xxx'. it also adds the mapping from - 'xxx' -> 'xxx' and also for 'struct xxx' -> 'xxx' - - In typedefHandler, we again try to add the mapping from - 'xxx' -> 'xxx', which already exists. This second mapping - is ignored. - - Both modes: - - All references to this typedef'd struct will appear in - generated lisp code as an objectd of type 'xxx'. For - non-typedef'd structs, the classHand mapping will be - - struct __xxx -> (swig-insert-id "__xxx") - */ - // Swig_print_node(n); - String *unnamed = Getattr(n, "unnamed"); - if (kind_of_type && (!Strcmp(kind_of_type, "struct") - || !Strcmp(kind_of_type, "union")) && cDeclName && !unnamed) { - k = NewStringf("%s %s", kind_of_type, cDeclName); - } else { - if (!Strcmp(nodeType(n), "enum") && unnamed) { - name = NewStringf("%s%d", anon_type_name, anon_type_count++); - k = NewStringf("enum %s", name); - Setattr(n, "allegrocl:name", name); - - } else { - k = k ? k : Getattr(n, "name"); - } - } - } - // Swig_print_node(n); - } - - String *tname = SwigType_istemplate_templateprefix(name); - if (tname) { - String *temp = strip_namespaces(tname); - name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); - Delete(temp); - Delete(tname); - } - - val = lookup_defined_foreign_type(k); - - int is_fwd_ref = 0; - if (val) - is_fwd_ref = !Strcmp(val, "forward-reference"); - - if (!val || overwrite || is_fwd_ref) { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Adding defined type '%s' = '%s' '%s' (overwrite=%d, in-class=%d)\n", k, ns, name, overwrite, in_class); -#endif - String *mangled_name_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", name, ns_list); - String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns_list); - - Setattr(defined_foreign_types, Copy(k), Copy(mangled_name_gen)); - Setattr(defined_foreign_ltypes, Copy(k), Copy(mangled_lname_gen)); - - if (CPlusPlus) { - bool cpp_struct = Strstr(k, "struct ") ? true : false; - bool cpp_union = Strstr(k, "union ") ? true : false; - - String *cpp_type = 0; - if (cpp_struct) { - cpp_type = Copy(k); - Replaceall(cpp_type, "struct ", ""); - } else if (cpp_union) { - cpp_type = Copy(k); - Replaceall(cpp_type, "union ", ""); - } - - if (cpp_struct || cpp_union) { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, " Also adding defined type '%s' = '%s' '%s' (overwrite=%d)\n", cpp_type, ns, name, overwrite); -#endif - Setattr(defined_foreign_types, Copy(cpp_type), Copy(mangled_name_gen)); - Setattr(defined_foreign_ltypes, Copy(cpp_type), Copy(mangled_lname_gen)); - } - } -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "looking to add %s/%s(%p) to linked_type_list...\n", k, name, n); -#endif - if (is_fwd_ref) { - // Printf(stderr,"*** 1\n"); - if (n) - add_linked_type(n); - } else { - // Printf(stderr,"*** 1-a\n"); - if (SwigType_istemplate(k)) { - SwigType *resolved = SwigType_typedef_resolve_all(k); - // Printf(stderr,"*** 1-b\n"); - Node *match = find_linked_type_by_name(resolved); - Node *new_node = 0; - // Printf(stderr, "*** temp-1\n"); - if (n) { - new_node = n; - } else { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Creating a new templateInst:\n"); - Printf(stderr, " name = %s\n", resolved); - Printf(stderr, " sym:name = %s\n", name); - Printf(stderr, " real-name = %s\n", k); - Printf(stderr, " type = %s\n", resolved); - Printf(stderr, " ns = %s\n\n", ns); -#endif - new_node = NewHash(); - Setattr(new_node, "nodeType", "templateInst"); - Setattr(new_node, "name", Copy(resolved)); - Setattr(new_node, "sym:name", Copy(name)); - Setattr(new_node, "real-name", Copy(k)); - Setattr(new_node, "type", Copy(resolved)); - Setattr(new_node, "allegrocl:namespace", ns); - Setattr(new_node, "allegrocl:package", ns); - } - - if (!match) { - if (!Strcmp(nodeType(new_node), "templateInst") && in_class) { - /* this is an implicit template instantiation found while - walking a class. need to insert this into the - linked_type list before the current class definition */ -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "trying to insert a templateInst before a class\n"); -#endif - insert_linked_type_at(in_class, new_node); -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "DID IT!\n"); -#endif - } else { - // Printf(stderr,"*** 3\n"); - add_linked_type(new_node); - } - Setattr(new_node, "allegrocl:synonym:is-primary", "1"); - } else { - // a synonym type was found (held in variable 'match') - // Printf(stderr, "setting primary synonym of %p to %p\n", new_node, match); - if (new_node == match) - Printf(stderr, "Hey-4 * - '%s' is a synonym of itself!\n", Getattr(new_node, "name")); - Setattr(new_node, "allegrocl:synonym-of", match); - // Printf(stderr,"*** 4\n"); - add_linked_type(new_node); - } - } else { - Node *match; - - if (!Strcmp(nodeType(n), "cdecl") && !Strcmp(Getattr(n, "storage"), "typedef")) { - SwigType *type = SwigType_strip_qualifiers(Getattr(n, "type")); -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Examining typedef '%s' for class references. (%d)\n", type, SwigType_isclass(type)); -#endif - if (SwigType_isclass(type)) { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Found typedef of a class '%s'\n", type); -#endif - /* - For the following parsed expression: - - typedef struct __xxx { ... } xxx; - - if n is of kind "class" (defining the class 'struct __xxx' - then we add n to the linked type list. - - if n is "cdecl" node of storage "typedef" (to note - that xxx is equivalent to 'struct __xxx' then we don't - want to add this node to the linked type list. - */ - String *defined_type = lookup_defined_foreign_type(type); - String *defined_key_type = lookup_defined_foreign_type(k); - - if ((Strstr(type, "struct ") || Strstr(type, "union ")) - && defined_type && !Strcmp(defined_type, defined_key_type)) { - // mark as a synonym but don't add to linked_type list - // Printf(stderr,"*** 4.8\n"); - Setattr(n, "allegrocl:synonym", "1"); - } else { - SwigType *lookup_type = SwigType_istemplate(type) ? SwigType_typedef_resolve_all(type) : Copy(type); - match = find_linked_type_by_name(lookup_type); - if (match) { - Setattr(n, "allegrocl:synonym", "1"); - Setattr(n, "allegrocl:synonym-of", match); - Setattr(n, "real-name", Copy(lookup_type)); - - // Printf(stderr, "*** pre-5: found match of '%s'(%p)\n", Getattr(match,"name"),match); - // if(n == match) Printf(stderr, "Hey-5 *** setting synonym of %p to %p\n", n, match); - // Printf(stderr,"*** 5\n"); - add_linked_type(n); - } else { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Creating classfoward node for struct stub in typedef.\n"); -#endif - Node *new_node = NewHash(); - String *symname = Copy(type); - Replaceall(symname, "struct ", ""); - Setattr(new_node, "nodeType", "classforward"); - Setattr(new_node, "name", Copy(type)); - Setattr(new_node, "sym:name", symname); - Setattr(new_node, "allegrocl:namespace", ns); - Setattr(new_node, "allegrocl:package", ns); - - String *mangled_new_name = NewStringf("#.(swig-insert-id \"%s\" %s)", symname, ns_list); - String *mangled_new_lname = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", symname, ns_list); - Setattr(defined_foreign_types, Copy(symname), Copy(mangled_new_name)); - Setattr(defined_foreign_ltypes, Copy(symname), Copy(mangled_new_lname)); - - // Printf(stderr,"Weird! Can't find the type!\n"); - add_forward_referenced_type(new_node); - add_linked_type(new_node); - - Setattr(n, "allegrocl:synonym", "1"); - Setattr(n, "allegrocl:synonym-of", new_node); - - add_linked_type(n); - } - Delete(lookup_type); - } - } else { - // check if it's a pointer or reference to a class. - // Printf(stderr,"Checking if '%s' is a p. or r. to a class\n", type); - String *class_ref = class_from_class_or_class_ref(type); - if (class_ref) { - match = find_linked_type_by_name(class_ref); - Setattr(n, "allegrocl:synonym", "1"); - Setattr(n, "allegrocl:synonym-of", match); - add_linked_type(n); - } - } - Delete(type); - // synonym types have already been added. - // Printf(stderr,"*** 10\n"); - if (!Getattr(n, "allegrocl:synonym")) - add_linked_type(n); - } else if (Getattr(n, "template")) { - // Printf(stderr, "this is a class template node(%s)\n", nodeType(n)); - String *resolved = SwigType_typedef_resolve_all(Getattr(n, "name")); - -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, " looking up %s for linked type match with %s...\n", Getattr(n, "sym:name"), resolved); -#endif - match = find_linked_type_by_name(resolved); - if (!match) { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "found no implicit instantiation of %%template node %s(%p)\n", Getattr(n, "name"), n); -#endif - add_linked_type(n); - } else { - Node *primary = get_primary_synonym_of(match); - - Setattr(n, "allegrocl:synonym:is-primary", "1"); - Delattr(primary, "allegrocl:synonym:is-primary"); - if (n == match) - Printf(stderr, "Hey-7 * setting synonym of %p to %p\n (match = %p)", primary, n, match); - Setattr(primary, "allegrocl:synonym-of", n); - // Printf(stderr,"*** 7\n"); - add_linked_type(n); - } - } else { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "linking type '%s'(%p)\n", k, n); -#endif - // Printf(stderr,"*** 8\n"); - add_linked_type(n); - } - } - } - Delete(mangled_name_gen); - Delete(mangled_lname_gen); - } else { - if (!CPlusPlus || Strcmp(Getattr(n,"kind"),"typedef")) { - Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), - "Attempting to store a foreign type that exists: %s (%s)\n", - k, val); - } - } - - Delete(ns_list); - -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "OUT A-D-F-T\n"); -#endif -} - -void note_implicit_template_instantiation(SwigType *t) { - // the namespace of the implicit instantiation is not necessarily - // current_namespace. Attempt to cull this from the type. -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "culling namespace of '%s' from '%s'\n", t, SwigType_templateprefix(t)); -#endif - SwigType *type = Copy(t); - SwigType *tok = SwigType_pop(type); - String *implicit_ns = SwigType_istemplate(tok) ? Swig_scopename_prefix(SwigType_templateprefix(tok)) : 0; - add_defined_foreign_type(0, 0, t, t, implicit_ns ? implicit_ns : current_namespace); - - Delete(type); -} - -String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { - /* lookup defined foreign type. - if it exists, it will return a form suitable for placing - into lisp code to generate the def-foreign-type name */ - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "inside g_f_t: looking up '%s' '%s'\n", ty, name); -#endif - - String *found_type = lookup_defined_foreign_type(ty); - - if (found_type) { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "found_type '%s'\n", found_type); -#endif - return (Strcmp(found_type, "forward-reference") ? Copy(found_type) : get_ffi_type(n, fwdref_ffi_type, "")); - } else { - Node *node = NewHash(); - Setattr(node, "type", ty); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *tm = Swig_typemap_lookup("ffitype", node, name, 0); - Delete(node); - - if (tm) { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "g-f-t: found ffitype typemap '%s'\n", tm); -#endif - return NewString(tm); - } - - if (SwigType_istemplate(ty)) { - note_implicit_template_instantiation(ty); - return Copy(lookup_defined_foreign_type(ty)); - } - } - return 0; -} - -String *lookup_defined_foreign_ltype(String *l) { - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "Looking up defined ltype '%s'.\n Found: '%s'\n", l, Getattr(defined_foreign_ltypes, l)); -#endif - return Getattr(defined_foreign_ltypes, l); -} - -/* walk type and return string containing lisp version. - recursive. */ -String *internal_compose_foreign_type(Node *n, SwigType *ty) { - - SwigType *tok; - String *ffiType = NewString(""); - - // for a function type, need to walk the parm list. - while (Len(ty) != 0) { - tok = SwigType_pop(ty); - - if (SwigType_isfunction(tok)) { - // Generate Function wrapper - Printf(ffiType, "(:function "); - // walk parm list - List *pl = SwigType_parmlist(tok); - - Printf(ffiType, "("); // start parm list - for (Iterator i = First(pl); i.item; i = Next(i)) { - SwigType *f_arg = SwigType_strip_qualifiers(i.item); - Printf(ffiType, "%s ", internal_compose_foreign_type(n, f_arg)); - Delete(f_arg); - } - Printf(ffiType, ")"); // end parm list. - - // do function return type. - Printf(ffiType, " %s)", internal_compose_foreign_type(n, ty)); - break; - } else if (SwigType_ispointer(tok) || SwigType_isreference(tok)) { - Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); - } else if (SwigType_isarray(tok)) { - Printf(ffiType, "(:array %s", internal_compose_foreign_type(n, ty)); - String *atype = NewString("int"); - String *dim = convert_literal(SwigType_array_getdim(tok, 0), atype); - Delete(atype); - if (is_integer(dim)) { - Printf(ffiType, " %s)", dim); - } else { - Printf(ffiType, " #| %s |#)", SwigType_array_getdim(tok, 0)); - } - } else if (SwigType_ismemberpointer(tok)) { - // temp - Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); - } else { - String *res = get_ffi_type(n, tok, ""); - if (res) { - Printf(ffiType, "%s", res); - } else { - SwigType *resolved_type = SwigType_typedef_resolve_all(tok); - if (Cmp(resolved_type, tok) != 0) { - res = get_ffi_type(n, resolved_type, ""); - if (res) { - } else { - res = internal_compose_foreign_type(n, resolved_type); - } - if (res) - Printf(ffiType, "%s", res); - } - - if (!res) { - String *is_struct = 0; - String *tok_remove_text = 0; - String *tok_name = Copy(tok); - String *tok_key = SwigType_str(tok,0); - if ((is_struct = Strstr(tok_key, "struct ")) || Strstr(tok_key, "union ")) { - tok_remove_text = NewString(is_struct ? "struct " : "union "); - } - - /* be more permissive of opaque types. This is the swig way. - compiles will notice if these types are ultimately not - present. */ - - if(tok_remove_text) { - Replaceall(tok_name,tok_remove_text,""); - } - tok_name = strip_namespaces(tok_name); - Delete(tok_remove_text); - // Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(tok), Getline(tok), "Unable to find definition of '%s', assuming forward reference.\n", tok); - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "i-c-f-t: adding forward reference for unknown type '%s'. mapping: %s -> %s\n", tok, tok_key, tok_name); -#endif - Node *nn = NewHash(); - Setattr(nn,"nodeType","classforward"); - Setattr(nn,"kind","class"); - Setattr(nn,"sym:name",tok_name); - Setattr(nn,"name",tok_key); - Setattr(nn,"allegrocl:package",current_namespace); - - add_forward_referenced_type(nn, 0); - // tok_name is dangling here, unused. ouch. why? - Printf(ffiType, "%s", get_ffi_type(n, tok, ""), tok_name); - } - } - } - } - return ffiType; -} - -String *compose_foreign_type(Node *n, SwigType *ty, String * /*id*/ = 0) { - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "compose_foreign_type: ENTER (%s)...\n ", ty); - // Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0)); - /* String *id_ref = SwigType_str(ty, id); - Printf(stderr, "looking up typemap for %s, found '%s'(%p)\n", - id_ref, lookup_res ? Getattr(lookup_res, "code") : 0, lookup_res); - if (lookup_res) Swig_print_node(lookup_res); - */ -#endif - - /* should we allow named lookups in the typemap here? YES! */ - /* unnamed lookups should be found in get_ffi_type, called - by internal_compose_foreign_type(), below. */ - - /* I'm reverting to 'no' for the question above. I can no longer - remember why I needed it. If a user needed it, I'll find out - as soon as they upgrade. Sigh. -mutandiz 9/16/2008. */ - -/* - if(id && lookup_res) { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "compose_foreign_type: EXIT-1 (%s)\n ", Getattr(lookup_res, "code")); -#endif - return NewString(Getattr(lookup_res, "code")); - } -*/ - - SwigType *temp = SwigType_strip_qualifiers(ty); - String *res = internal_compose_foreign_type(n, temp); - Delete(temp); - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "compose_foreign_type: EXIT (%s)\n ", res); -#endif - - return res; -} - -void update_package_if_needed(Node *n, File *f = f_clwrap) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "update_package: ENTER... \n"); - Printf(stderr, " current_package = '%s'\n", current_package); - Printf(stderr, " node_package = '%s'\n", Getattr(n, "allegrocl:package")); - Printf(stderr, " node(%p) = '%s'\n", n, Getattr(n, "name")); -#endif - String *node_package = Getattr(n, "allegrocl:package"); - if (Strcmp(current_package, node_package)) { - String *lispy_package = listify_namespace(node_package); - - Delete(current_package); - current_package = Copy(node_package); - Printf(f, "\n(swig-in-package %s)\n", lispy_package); - Delete(lispy_package); - } -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "update_package: EXIT.\n"); -#endif -} - -static String *mangle_name(Node *n, char const *prefix = "ACL", String *ns = current_namespace) { - String *suffix = Getattr(n, "sym:overname"); - String *pre_mangled_name = NewStringf("%s_%s__%s%s", prefix, ns, Getattr(n, "sym:name"), suffix); - String *mangled_name = Swig_name_mangle(pre_mangled_name); - Delete(pre_mangled_name); - return mangled_name; -} - -/* utilities */ - -/* remove a pointer from ffitype. non-destructive. - (* :char) ==> :char - (* (:array :int 30)) ==> (:array :int 30) */ -String *dereference_ffitype(String *ffitype) { - char *start; - char *temp = Char(ffitype); - String *reduced_type = 0; - - if(temp && temp[0] == '(' && temp[1] == '*') { - temp += 2; - - // walk past start of pointer references - while(*temp == ' ') temp++; - start = temp; - // temp = Char(reduced_type); - reduced_type = NewString(start); - temp = Char(reduced_type); - // walk to end of string. remove closing paren - while(*temp != '\0') temp++; - *(--temp) = '\0'; - } - - return reduced_type ? reduced_type : Copy(ffitype); -} - -/* returns new string w/ parens stripped */ -String *strip_parens(String *string) { - string = Copy(string); - Replaceall(string, "(", ""); - Replaceall(string, ")", ""); - return string; -} - -int ALLEGROCL::validIdentifier(String *s) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "validIdentifier %s\n", s); -#endif - - char *c = Char(s); - - bool got_dot = false; - bool only_dots = true; - - /* Check that s is a valid common lisp symbol. There's a lot of leeway here. - A common lisp symbol is essentially any token that's not a number and - does not consist of only dots. - - We are expressly not allowing spaces in identifiers here, but spaces - could be added via the identifier converter. */ - while (*c) { - if (*c == '.') { - got_dot = true; - } else { - only_dots = false; - } - if (!isgraph(*c)) - return 0; - c++; - } - - return (got_dot && only_dots) ? 0 : 1; -} - -String *infix_to_prefix(String *val, char split_op, const String *op, String *type) { - List *ored = Split(val, split_op, -1); - - // some float hackery - if (((split_op == '+') || (split_op == '-')) && Len(ored) == 2 && - (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE)) { - // check that we're not splitting a float - String *possible_result = convert_literal(val, type, false); - if (possible_result) - return possible_result; - - } - // try parsing the split results. if any part fails, kick out. - bool part_failed = false; - if (Len(ored) > 1) { - String *result = NewStringf("(%s", op); - for (Iterator i = First(ored); i.item; i = Next(i)) { - String *converted = convert_literal(i.item, type); - if (converted) { - Printf(result, " %s", converted); - Delete(converted); - } else { - part_failed = true; - break; - } - } - Printf(result, ")"); - Delete(ored); - return part_failed ? 0 : result; - } - Delete(ored); - return 0; -} - -/* To be called by code generating the lisp interface - Will return a containing the literal based on type. - Will return null if there are problems. - - try_to_split defaults to true (see stub above). - */ -String *convert_literal(String *literal, String *type, bool try_to_split) { - String *num_param = Copy(literal); - String *trimmed = trim(num_param); - String *num = strip_parens(trimmed), *res = 0; - char *s = Char(num); - - String *ns = listify_namespace(current_namespace); - - // very basic parsing of infix expressions. - if (try_to_split && SwigType_type(type) != T_STRING) { - if ((res = infix_to_prefix(num, '|', "logior", type))) - return res; - if ((res = infix_to_prefix(num, '&', "logand", type))) - return res; - if ((res = infix_to_prefix(num, '^', "logxor", type))) - return res; - if ((res = infix_to_prefix(num, '*', "*", type))) - return res; - if ((res = infix_to_prefix(num, '/', "/", type))) - return res; - if ((res = infix_to_prefix(num, '+', "+", type))) - return res; - if ((res = infix_to_prefix(num, '-', "-", type))) - return res; - // if ((res = infix_to_prefix(num, '~', "lognot", type))) return res; - // if( (res = infix_to_prefix(num, '<<', "ash", type)) ) return res; - } - - // unary complement... - if (s[0] == '~' && Len(num) >= 2) { - String *id = NewString(++s); - String *id_conv = convert_literal(id, type, false); - Delete(id); - if (id_conv) - return NewStringf("(lognot %s)", id_conv); - s--; - } - - if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) { - // Use CL syntax for float literals - String *oldnum = Copy(num); - - // careful. may be a float identifier or float constant. - char *num_start = Char(num); - char *num_end = num_start + strlen(num_start) - 1; - - bool is_literal = isdigit(*num_start) || (*num_start == '.'); - - String *lisp_exp = 0; - if (is_literal) { - if (*num_end == 'f' || *num_end == 'F') { - lisp_exp = NewString("f"); - } else { - lisp_exp = NewString("d"); - } - - if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { - *num_end = '\0'; - num_end--; - } - - int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); - - if (!exponents) - Printf(num, "%s0", lisp_exp); - - if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { - // Printf(stderr, "Can't parse '%s' as type '%s'.\n", oldnum, type); - Delete(num); - num = 0; - } - Delete(lisp_exp); - } else { - String *id = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", - num, ns); - Delete(num); - num = id; - } - - Delete(oldnum); - Delete(trimmed); - Delete(ns); - return num; - } else if (SwigType_type(type) == T_CHAR) { - /* Use CL syntax for character literals */ - Delete(num); - Delete(trimmed); - return NewStringf("#\\%s", num_param); - } else if (SwigType_type(type) == T_STRING) { - /* Use CL syntax for string literals */ - Delete(num); - Delete(trimmed); - return NewStringf("\"%s\"", num_param); - } else if (Len(num) >= 1 && (isdigit(s[0]) || s[0] == '+' || s[0] == '-')) { - /* use CL syntax for numbers */ - String *oldnum = Copy(num); - int usuffixes = Replaceall(num, "u", "") + Replaceall(num, "U", ""); - int lsuffixes = Replaceall(num, "l", "") + Replaceall(num, "L", ""); - if (usuffixes > 1 || lsuffixes > 1) { - Printf(stderr, "Weird!! number %s looks invalid.\n", oldnum); - SWIG_exit(EXIT_FAILURE); - } - s = Char(num); - if (s[0] == '0' && Len(num) >= 2) { - /*octal or hex */ - res = NewStringf("#%c%s", tolower(s[1]) == 'x' ? 'x' : 'o', s + 2); - Delete(num); - } else { - res = num; - } - Delete(oldnum); - Delete(trimmed); - return res; - } else if (allegrocl->validIdentifier(num)) { - /* convert C/C++ identifiers to CL symbols */ - res = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); - Delete(num); - Delete(trimmed); - Delete(ns); - return res; - } else { - Delete(trimmed); - return num; - } -} - - -void emit_stub_class(Node *n) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_stub_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); - Swig_print_node(n); -#endif - - - String *name = Getattr(n, "sym:name"); - - if (Getattr(n, "allegrocl:synonym:already-been-stubbed")) - return; - - String *tname = SwigType_istemplate_templateprefix(name); - if (tname) { - String *temp = strip_namespaces(tname); - name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); - Delete(temp); - Delete(tname); - } else { - name = strip_namespaces(name); - } - - // Printf(f_clhead, ";; from emit-stub-class\n"); - update_package_if_needed(n, f_clhead); - Printf(f_clhead, ";; class template stub.\n"); - Printf(f_clhead, "(swig-def-foreign-stub \"%s\")\n", name); - - Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_stub_class: EXIT\n"); -#endif -} - -void emit_synonym(Node *synonym) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_synonym: ENTER... \n"); -#endif - - // Printf(stderr,"in emit_synonym for %s(%p)\n", Getattr(synonym,"name"),synonym); - int is_tempInst = !Strcmp(nodeType(synonym), "templateInst"); - String *synonym_type; - - Node *of = get_primary_synonym_of(synonym); - - if (is_tempInst) { - // Printf(stderr, "*** using real-name '%s'\n", Getattr(synonym,"real-name")); - synonym_type = Getattr(synonym, "real-name"); - } else { - // Printf(stderr, "*** using name '%s'\n", Getattr(synonym,"name")); - synonym_type = Getattr(synonym, "name"); - } - - String *synonym_ns = listify_namespace(Getattr(synonym, "allegrocl:namespace")); - String *syn_ltype, *syn_type, *of_ltype; - // String *of_cdeclname = Getattr(of,"allegrocl:classDeclarationName"); - String *of_ns = Getattr(of, "allegrocl:namespace"); - String *of_ns_list = listify_namespace(of_ns); - // String *of_name = of_cdeclname ? NewStringf("struct %s", Getattr(of,"name")) : NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); - // String *of_name = NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); - String *of_name = namespaced_name(of, of_ns); - - if (CPlusPlus && !Strcmp(nodeType(synonym), "cdecl")) { - String *real_name = Getattr(synonym, "real-name"); - if (!real_name) - real_name = NewString("Unknown"); // TODO: fix - syn_ltype = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", strip_namespaces(real_name), synonym_ns); - syn_type = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", strip_namespaces(real_name), synonym_ns); - } else { - syn_ltype = lookup_defined_foreign_ltype(synonym_type); - syn_type = lookup_defined_foreign_type(synonym_type); - } - - of_ltype = lookup_defined_foreign_ltype(of_name); - - // Printf(stderr,";; from emit-synonym syn='%s' of_ltype='%s'\n", syn_ltype, of_ltype); - if( of_ltype ) - Printf(f_clhead, "(swig-def-synonym-type %s\n %s\n %s)\n", syn_ltype, of_ltype, syn_type); - - Delete(synonym_ns); - Delete(of_ns_list); - Delete(of_name); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_synonym: EXIT\n"); -#endif -} - -void emit_full_class(Node *n) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_full_class: ENTER... \n"); -#endif - - String *name = Getattr(n, "sym:name"); - String *kind = Getattr(n, "kind"); - - // Printf(stderr,"in emit_full_class: '%s'(%p).", Getattr(n,"name"),n); - if (Getattr(n, "allegrocl:synonym-of")) { - // Printf(stderr,"but it's a synonym of something.\n"); - update_package_if_needed(n, f_clhead); - emit_synonym(n); - return; - } - // collect superclasses - String *bases = Getattr(n, "bases"); - String *supers = NewString("("); - if (bases) { - int first = 1; - for (Iterator i = First(bases); i.item; i = Next(i)) { - if (!first) - Printf(supers, " "); - String *s = lookup_defined_foreign_ltype(Getattr(i.item, "name")); - // String *name = Getattr(i.item,"name"); - if (s) { - Printf(supers, "%s", s); - } else { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "emit_templ_inst: did not find ltype for base class %s (%s)", Getattr(i.item, "name"), Getattr(n, "allegrocl:namespace")); -#endif - } - } - } else { - Printf(supers, "ff:foreign-pointer"); - } - - // check for "feature:aclmixins" and add those as well. - Printf(supers, " %s)", Getattr(n,"feature:aclmixins")); - - // Walk children to generate type definition. - String *slotdefs = NewString(" "); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, " walking children...\n"); -#endif - - Node *c; - for (c = firstChild(n); c; c = nextSibling(c)) { - String *storage_type = Getattr(c, "storage"); - if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) { - String *access = Getattr(c, "access"); - - // hack. why would decl have a value of "variableHandler" and now "0"? - String *childDecl = Getattr(c, "decl"); - // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); - if (!childDecl || !Strcmp(childDecl, "0")) - childDecl = NewString(""); - - SwigType *childType; - String *cname; - - // don't include types for private slots (yet). spr33959. - if(access && Strcmp(access,"public")) { - childType = NewStringf("int"); - cname = NewString("nil"); - } else { - childType = NewStringf("%s%s", childDecl, Getattr(c, "type")); - cname = Copy(Getattr(c, "name")); - } - - if (!SwigType_isfunction(childType)) { - // Printf(slotdefs, ";;; member functions don't appear as slots.\n "); - // Printf(slotdefs, ";; "); - String *ns = listify_namespace(Getattr(n, "allegrocl:package")); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); -#endif - Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, compose_foreign_type(n, childType)); - Delete(ns); - if (access && Strcmp(access, "public")) - Printf(slotdefs, " ;; %s member", access); - - Printf(slotdefs, "\n "); - } - Delete(childType); - Delete(cname); - } - } - - String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); - update_package_if_needed(n, f_clhead); - Printf(f_clhead, "(swig-def-foreign-class \"%s\"\n %s\n (:%s\n%s))\n\n", name, supers, kind, slotdefs); - - Delete(supers); - Delete(ns_list); - - Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_full_class: EXIT\n"); -#endif - -} - -void emit_class(Node *n) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); -#endif - - int is_tempInst = !Strcmp(nodeType(n), "templateInst"); - - String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); - String *name = Getattr(n, is_tempInst ? "real-name" : "name"); - - String *tname = SwigType_istemplate_templateprefix(name); - if (tname) { - String *temp = strip_namespaces(tname); - name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); - Delete(temp); - Delete(tname); - } else { - name = strip_namespaces(name); - } - - if (Getattr(n, "allegrocl:synonym:is-primary")) { - // Printf(stderr," is primary... "); - if (is_tempInst) { - emit_stub_class(n); - } else { - emit_full_class(n); - } - } else { - // Node *primary = Getattr(n,"allegrocl:synonym-of"); - Node *primary = get_primary_synonym_of(n); - if (primary && (primary != n)) { - // Printf(stderr," emitting synonym... "); - emit_stub_class(primary); - update_package_if_needed(n, f_clhead); - emit_synonym(n); - } else { - emit_full_class(n); - } - } - // Printf(stderr,"DONE\n"); - Delete(name); - Delete(ns_list); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_class: EXIT\n"); -#endif -} - -void emit_typedef(Node *n) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_typedef: ENTER... \n"); -#endif - - String *name; - String *sym_name = Getattr(n, "sym:name"); - String *type = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type")); - String *lisp_type = compose_foreign_type(n, type); - Delete(type); - Node *in_class = Getattr(n, "allegrocl:typedef:in-class"); - - // Printf(stderr,"in emit_typedef: '%s'(%p).",Getattr(n,"name"),n); - if (Getattr(n, "allegrocl:synonym-of")) { - // Printf(stderr," but it's a synonym of something.\n"); - emit_synonym(n); - return; - } - - if (in_class) { - String *class_name = Getattr(in_class, "name"); - String *tname = SwigType_istemplate_templateprefix(class_name); - if (tname) { - String *temp = strip_namespaces(tname); - class_name = NewStringf("%s%s%s", temp, SwigType_templateargs(class_name), SwigType_templatesuffix(class_name)); - Delete(temp); - Delete(tname); - } - - name = NewStringf("%s__%s", class_name, sym_name); - Setattr(n, "allegrocl:in-class", in_class); - } else { - name = sym_name ? Copy(sym_name) : Copy(Getattr(n, "name")); - } - - // leave these in for now. might want to change these to def-foreign-class at some point. -// Printf(f_clhead, ";; %s\n", SwigType_typedef_resolve_all(lisp_type)); - Printf(f_clhead, "(swig-def-foreign-type \"%s\"\n %s)\n", name, lisp_type); - - Delete(name); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_typedef: EXIT\n"); -#endif -} - -void emit_enum_type_no_wrap(Node *n) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_enum_type_no_wrap: ENTER... \n"); -#endif - - String *unnamed = Getattr(n, "unnamed"); - String *name; - // SwigType *enumtype; - - name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); - SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); - - Node *node = NewHash(); - Setattr(node, "type", tmp); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); - Delete(node); - - Delete(tmp); - - if (name) { - String *ns = listify_namespace(current_namespace); - - Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); - Delete(ns); - - // walk children. - Node *c; - for (c = firstChild(n); c; c = nextSibling(c)) { - if (!Getattr(c, "error")) { - String *val = Getattr(c, "enumvalue"); - if (!val) - val = Getattr(c, "enumvalueex"); - String *converted_val = convert_literal(val, Getattr(c, "type")); - String *valname = Getattr(c, "sym:name"); - - if (converted_val) { - Printf(f_clhead, "(swig-defconstant \"%s\" %s)\n", valname, converted_val); - Delete(converted_val); - } else { - Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse enum value '%s'. Setting to NIL\n", val); - Printf(f_clhead, "(swig-defconstant \"%s\" nil #| %s |#)\n", valname, val); - } - } - } - } - Printf(f_clhead, "\n"); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_enum_type_no_wrap: EXIT\n"); -#endif - -} - -void emit_enum_type(Node *n) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_enum_type: ENTER... \n"); -#endif - - if (!Generate_Wrapper) { - emit_enum_type_no_wrap(n); - return; - } - - String *unnamed = Getattr(n, "unnamed"); - String *name; - // SwigType *enumtype; - - name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); - SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); - - Node *node = NewHash(); - Setattr(node, "type", tmp); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); - Delete(node); - - Delete(tmp); - - if (name) { - String *ns = listify_namespace(current_namespace); - - Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); - Delete(ns); - - // walk children. - Node *c; - for(c = firstChild(n); c; c=nextSibling(c)) { - String *mangled_name = mangle_name(c, "ACL_ENUM", Getattr(c,"allegrocl:package")); - Printf(f_clhead, "(swig-defvar \"%s\" \"%s\" :type :constant :ftype :signed-long)\n", Getattr(c, "sym:name"), mangled_name); - Delete(mangled_name); - } - } -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_enum_type: EXIT\n"); -#endif - -} - -void emit_default_linked_type(Node *n) { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_default_linked_type: ENTER... \n"); -#endif - - // catchall for non class types. - if (!Strcmp(nodeType(n), "classforward")) { - Printf(f_clhead, ";; forward referenced stub.\n"); - Printf(f_clhead, "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n", Getattr(n, "sym:name")); - } else if (!Strcmp(nodeType(n), "enum")) { - emit_enum_type(n); - } else { - Printf(stderr, "Don't know how to emit node type '%s' named '%s'\n", nodeType(n), Getattr(n, "name")); - } - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_default_linked_type: EXIT\n"); -#endif - -} - -void dump_linked_types(File *f) { - Node *n = first_linked_type; - int i = 0; - while (n) { - Printf(f, "%d: (%p) node '%s' name '%s'\n", i++, n, nodeType(n), Getattr(n, "sym:name")); - - Node *t = Getattr(n, "allegrocl:synonym-of"); - if (t) - Printf(f, " synonym-of %s(%p)\n", Getattr(t, "name"), t); - n = Getattr(n, "allegrocl:next_linked_type"); - } -} - -void emit_linked_types() { - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_linked_types: ENTER... "); -#endif - - Node *n = first_linked_type; - - while (n) { - String *node_type = nodeType(n); - - // Printf(stderr,"emitting node %s(%p) of type %s.", Getattr(n,"name"),n, nodeType(n)); - if (!Strcmp(node_type, "class") || !Strcmp(node_type, "templateInst")) { - // may need to emit a stub, so it will update the package itself. - // Printf(stderr," Passing to emit_class."); - emit_class(n); - } else if (!Strcmp(nodeType(n), "cdecl")) { - // Printf(stderr," Passing to emit_typedef."); - update_package_if_needed(n, f_clhead); - emit_typedef(n); - } else { - // Printf(stderr," Passing to default_emitter."); - update_package_if_needed(n, f_clhead); - emit_default_linked_type(n); - } - - n = Getattr(n, "allegrocl:next_linked_type"); - // Printf(stderr,"returned.\n"); - } - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_linked_types: EXIT\n"); -#endif -} - -extern "C" Language *swig_allegrocl(void) { - return (allegrocl = new ALLEGROCL()); -} - -void ALLEGROCL::main(int argc, char *argv[]) { - int i; - - Preprocessor_define("SWIGALLEGROCL 1", 0); - SWIG_library_directory("allegrocl"); - SWIG_config_file("allegrocl.swg"); - - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-identifier-converter")) { - char *conv = argv[i + 1]; - - if (!conv) - Swig_arg_error(); - - Swig_mark_arg(i); - Swig_mark_arg(i + 1); - i++; - - /* check for built-ins */ - if (!strcmp(conv, "lispify")) { - Delete(identifier_converter); - identifier_converter = NewString("identifier-convert-lispify"); - } else if (!strcmp(conv, "null")) { - Delete(identifier_converter); - identifier_converter = NewString("identifier-convert-null"); - } else { - /* Must be user defined */ - Delete(identifier_converter); - identifier_converter = NewString(conv); - } - } else if (!strcmp(argv[i], "-cwrap")) { - CWrap = true; - Swig_mark_arg(i); - } else if (!strcmp(argv[i], "-nocwrap")) { - CWrap = false; - Swig_mark_arg(i); - } else if (!strcmp(argv[i], "-isolate")) { - unique_swig_package = true; - Swig_mark_arg(i); - } - - if (!strcmp(argv[i], "-help")) { - Printf(stdout, "%s\n", usage); - } - - } - - allow_overloading(); -} - -int ALLEGROCL::top(Node *n) { - module_name = Getattr(n, "name"); - String *cxx_filename = Getattr(n, "outfile"); - String *cl_filename = NewString(""); - - swig_package = unique_swig_package ? NewStringf("swig.%s", module_name) : NewString("swig"); - - Printf(cl_filename, "%s%s.cl", SWIG_output_directory(), module_name); - - f_cl = NewFile(cl_filename, "w", SWIG_output_files()); - if (!f_cl) { - Printf(stderr, "Unable to open %s for writing\n", cl_filename); - SWIG_exit(EXIT_FAILURE); - } - - Generate_Wrapper = CPlusPlus || CWrap; - - if (Generate_Wrapper) { - f_begin = NewFile(cxx_filename, "w", SWIG_output_files()); - if (!f_begin) { - Delete(f_cl); - Printf(stderr, "Unable to open %s for writing\n", cxx_filename); - SWIG_exit(EXIT_FAILURE); - } - } else - f_begin = NewString(""); - - f_runtime = NewString(""); - f_cxx_header = f_runtime; - f_cxx_wrapper = NewString(""); - - Swig_register_filebyname("header", f_cxx_header); - Swig_register_filebyname("wrapper", f_cxx_wrapper); - Swig_register_filebyname("begin", f_begin); - Swig_register_filebyname("runtime", f_runtime); - Swig_register_filebyname("lisp", f_clwrap); - Swig_register_filebyname("lisphead", f_cl); - - Swig_banner(f_begin); - - Printf(f_runtime, "\n\n#ifndef SWIGALLEGROCL\n#define SWIGALLEGROCL\n#endif\n\n"); - - Swig_banner_target_lang(f_cl, ";;"); - - Printf(f_cl, "\n" - "(defpackage :%s\n" - " (:use :common-lisp :ff :excl)\n" - " (:export #:*swig-identifier-converter* #:*swig-module-name*\n" - " #:*void* #:*swig-export-list*))\n" - "(in-package :%s)\n\n" - "(eval-when (:compile-toplevel :load-toplevel :execute)\n" - " (defparameter *swig-identifier-converter* '%s)\n" - " (defparameter *swig-module-name* :%s))\n\n", swig_package, swig_package, identifier_converter, module_name); - Printf(f_cl, "(defpackage :%s\n" " (:use :common-lisp :%s :ff :excl))\n\n", module_name, swig_package); - - Printf(f_clhead, "(in-package :%s)\n", module_name); - - Language::top(n); - -#ifdef ALLEGROCL_TYPE_DEBUG - dump_linked_types(stderr); -#endif - emit_linked_types(); - - Printf(f_clwrap, "\n(cl::in-package :%s)\n", swig_package); - Printf(f_clwrap, "\n(macrolet ((swig-do-export ()\n"); - Printf(f_clwrap, " `(dolist (s ',*swig-export-list*)\n"); - Printf(f_clwrap, " (apply #'export s))))\n"); - Printf(f_clwrap, " (swig-do-export))\n"); - Printf(f_clwrap, "\n(setq *swig-export-list* nil)\n"); - - Printf(f_cl, "%s\n", f_clhead); - Printf(f_cl, "%s\n", f_clwrap); - - Delete(f_cl); - Delete(f_clhead); - Delete(f_clwrap); - - Dump(f_runtime, f_begin); - Printf(f_begin, "%s\n", f_cxx_wrapper); - - Delete(f_runtime); - Delete(f_begin); - Delete(f_cxx_wrapper); - - // Swig_print_tree(n); - - return SWIG_OK; -} - -int any_varargs(ParmList *pl) { - Parm *p; - - for (p = pl; p; p = nextSibling(p)) { - if (SwigType_isvarargs(Getattr(p, "type"))) - return 1; - } - - return 0; -} - -String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { - Node *node = NewHash(); - Setattr(node, "type", ty); - Setattr(node, "name", name); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); - Delete(node); - - return tm ? NewString(tm) : NewString(""); -} - -Node *parent_node_skipping_extends(Node *n) { - Node *result = n; - do { - result = parentNode(result); - } - while (Cmp("extend", nodeType(result)) == 0); - return result; -} - -/* ----------------------------------------------------------------------------- - * emit_num_lin_arguments() - * - * Calculate the total number of arguments. This function is safe for use - * with multi-argument typemaps which may change the number of arguments in - * strange ways. - * ----------------------------------------------------------------------------- */ - -int emit_num_lin_arguments(ParmList *parms) { - Parm *p = parms; - int nargs = 0; - - while (p) { - // Printf(stderr,"enla: '%s' lin='%p' numinputs='%s'\n", Getattr(p,"name"), Getattr(p,"tmap:lin"), Getattr(p,"tmap:lin:numinputs")); - if (Getattr(p, "tmap:lin")) { - nargs += GetInt(p, "tmap:lin:numinputs"); - p = Getattr(p, "tmap:lin:next"); - } else { - p = nextSibling(p); - } - } - - /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ - /* - if (parms && (p = Getattr(parms,"emit:varargs"))) { - if (!nextSibling(p)) { - nargs--; - } - } - */ - return nargs; -} - -String *id_converter_type(SwigType const *type) { - SwigType *t = Copy(type); - String *result = 0; - - if (SwigType_ispointer(t)) { - SwigType_pop(t); - String *pointee = id_converter_type(t); - result = NewStringf("(:* %s)", pointee); - Delete(pointee); - } else if (SwigType_ismemberpointer(t)) { - String *klass = SwigType_parm(t); - SwigType_pop(t); - String *member = id_converter_type(t); - result = NewStringf("(:member \"%s\" %s)", klass, member); - Delete(klass); - Delete(member); - } else if (SwigType_isreference(t)) { - SwigType_pop(t); - String *referencee = id_converter_type(t); - result = NewStringf("(:& %s)", referencee); - Delete(referencee); - } else if (SwigType_isarray(t)) { - String *size = SwigType_parm(t); - SwigType_pop(t); - String *element_type = id_converter_type(t); - result = NewStringf("(:array %s \"%s\")", element_type, size); - Delete(size); - Delete(element_type); - } else if (SwigType_isfunction(t)) { - result = NewString("(:function ("); - String *parmlist_str = SwigType_parm(t); - List *parms = SwigType_parmlist(parmlist_str); - - for (Iterator i = First(parms); i.item;) { - String *parm = id_converter_type((SwigType *) i.item); - Printf(result, "%s", parm); - i = Next(i); - if (i.item) - Printf(result, " "); - Delete(parm); - } - SwigType_pop(t); - String *ret = id_converter_type(t); - Printf(result, ") %s)", ret); - - Delete(parmlist_str); - Delete(parms); - Delete(ret); - } else if (SwigType_isqualifier(t)) { - result = NewString("(:qualified ("); - String *qualifiers_str = Copy(SwigType_parm(t)); // ?! - // Replaceall below SEGVs if we don't put the Copy here... - SwigType_pop(t); - String *qualifiee = id_converter_type(t); - - Replaceall(qualifiers_str, " ", " :"); - if (Len(qualifiers_str) > 0) - Printf(result, ":"); - Printf(result, "%s) %s)", qualifiers_str, qualifiee); - - Delete(qualifiers_str); - Delete(qualifiee); - } else if (SwigType_istemplate(t)) { - result = NewStringf("(:template \"%s\")", t); - } else { /* if (SwigType_issimple(t)) */ - - if (Strstr(Char(t), "::")) { - result = listify_namespace(t); - } else { - result = NewStringf("\"%s\"", t); - } - } - - Delete(t); - return result; -} - -static ParmList *parmlist_with_names(ParmList *pl) { - ParmList *pl2 = CopyParmList(pl); - for (Parm *p = pl, *p2 = pl2; p2; p = nextSibling(p), p2 = nextSibling(p2)) { - if (!Getattr(p2, "name")) - Setattr(p2, "name", Getattr(p2, "lname")); - Setattr(p2, "name", strip_namespaces(Getattr(p2, "name"))); - Setattr(p2, "tmap:ctype", Getattr(p, "tmap:ctype")); - - String *temp = Getattr(p, "tmap:lin"); - if (temp) { - Setattr(p2, "tmap:lin", temp); - Setattr(p2, "tmap:lin:next", Getattr(p, "tmap:lin:next")); - } - } - return pl2; -} - -static String *parmlist_str_id_converter(ParmList *pl) { - String *result = NewString(""); - for (Parm *p = pl; p;) { - String *lispy_type = id_converter_type(Getattr(p, "type")); - Printf(result, "(\"%s\" %s)", Getattr(p, "name"), lispy_type); - Delete(lispy_type); - if ((p = nextSibling(p))) - Printf(result, " "); - } - return result; -} - -String *collect_others_args(Node *overload) { - String *overloaded_from = Getattr(overload, "sym:overloaded"); - String *others_args = NewString(""); - int first_overload = 1; - - for (Node *overload2 = overloaded_from; overload2; overload2 = Getattr(overload2, "sym:nextSibling")) { - if (overload2 == overload || GetInt(overload2, "overload:ignore")) - continue; - - ParmList *opl = parmlist_with_names(Getattr(overload2, "wrap:parms")); - String *args = parmlist_str_id_converter(opl); - if (!first_overload) - Printf(others_args, "\n "); - Printf(others_args, "(%s)", args); - Delete(args); - Delete(opl); - first_overload = 0; - } - return others_args; -} - -struct IDargs { - String *name; - String *type; - String *klass; - String *arity; - - IDargs():name(0), type(0), klass(0), arity(0) { - } - - String *full_quoted_str() { - String *result = no_others_quoted_str(); - if (arity) - Printf(result, " :arity %s", arity); - return result; - } - - String *no_others_quoted_str() { - String *result = NewString(""); - Printf(result, "\"%s\" :type :%s", name, type); - if (klass) - Printf(result, " :class \"%s\"", klass); - return result; - } - - String *noname_str(bool include_class = true) { - String *result = NewString(""); - Printf(result, " :type :%s", type); - if (klass && include_class) - Printf(result, " :class \"%s\"", klass); - if (arity) - Printf(result, " :arity %s", arity); - return result; - } - - String *noname_no_others_str(bool include_class = true) { - String *result = NewString(""); - Printf(result, " :type :%s", type); - if (klass && include_class) - Printf(result, " :class \"%s\"", klass); - return result; - } -}; -IDargs *id_converter_arguments(Node *n) { - IDargs *result = (IDargs *) GetVoid(n, "allegrocl:id-converter-args"); - if (!result) - result = new IDargs; - - // Base name - if (!result->name) { - result->name = Getattr(n, "allegrocl:old-sym:name"); - if (!result->name) - result->name = Getattr(n, "sym:name"); - result->name = Copy(result->name); - } - // :type - if (result->type) - Delete(result->type); - if (!Getattr(n, "allegrocl:kind")) - Setattr(n, "allegrocl:kind", "function"); - if (Strstr(Getattr(n, "name"), "operator ")) - Replaceall(Getattr(n, "allegrocl:kind"), "function", "operator"); - if (Strstr(Getattr(n, "allegrocl:kind"), "variable")) { - int name_end = Len(Getattr(n, "sym:name")) - 4; - char *str = Char(Getattr(n, "sym:name")); - String *get_set = NewString(str + name_end + 1); - result->type = Copy(Getattr(n, "allegrocl:kind")); - Replaceall(result->type, "variable", ""); - Printf(result->type, "%ster", get_set); - Delete(get_set); - } else { - result->type = Copy(Getattr(n, "allegrocl:kind")); - } - - // :class - if (Strstr(result->type, "member ")) { - Replaceall(result->type, "member ", ""); - if (!result->klass) { - result->klass = Copy(Getattr(parent_node_skipping_extends(n), "sym:name")); - } - } - // :arity - if (Getattr(n, "sym:overloaded")) { - if (result->arity) - Delete(result->arity); - result->arity = NewStringf("%d", - // emit_num_arguments(Getattr(n, "wrap:parms"))); - emit_num_lin_arguments(Getattr(n, "wrap:parms"))); - // Printf(stderr, "got arity of '%s' node '%s' '%p'\n", result->arity, Getattr(n,"name"), Getattr(n,"wrap:parms")); - } - - SetVoid(n, "allegrocl:id-converter-args", result); - return result; -} - -int ALLEGROCL::emit_buffered_defuns(Node *n) { - - Node *overloaded_from = Getattr(n, "sym:overloaded"); - - String *wrap; - - if (!overloaded_from) { - wrap = Getattr(n, "allegrocl:lisp-wrap"); - - Printf(f_clwrap, "%s\n", wrap); - Delattr(n, "allegrocl:lisp-wrap"); - Delete(wrap); - } else { - for (Node *overload = overloaded_from; overload; overload = Getattr(overload, "sym:nextSibling")) { - String *others_args = collect_others_args(overload); - wrap = Getattr(overload, "allegrocl:lisp-wrap"); - - Replaceall(wrap, "@@OTHERS-ARGS-GO-HERE@@", others_args); -// IDargs* id_args = id_converter_arguments(overload); -// Replaceall(id_args->others_args, "@@OTHERS-ARGS-GO-HERE@@", others_args); - - if (!GetInt(overload, "overload:ignore")) - Printf(f_clwrap, "%s", wrap); - - Delattr(overload, "allegrocl:lisp-wrap"); - Delete(wrap); - } - } - return SWIG_OK; -} - -String *dispatching_type(Node *n, Parm *p) { - String *result = 0; - - String *parsed = Getattr(p, "type"); //Swig_cparse_type(Getattr(p,"tmap:ctype")); - String *cl_t = SwigType_typedef_resolve_all(parsed); - - Node *node = NewHash(); - Setattr(node, "type", parsed); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *tm = Swig_typemap_lookup("lispclass", node, Getattr(p, "name"), 0); - Delete(node); - - if (tm) { - result = Copy(tm); - } else { - String *lookup_type = class_from_class_or_class_ref(parsed); - if (lookup_type) - result = lookup_defined_foreign_ltype(lookup_type); - } - - // if (!result && SwigType_ispointer(cl_t)) { - // SwigType_pop(cl_t); - // result = lookup_defined_foreign_ltype(cl_t); - // } - - if (!result) - result = NewStringf("ff:foreign-pointer"); - - // Delete(parsed); - Delete(cl_t); - return result; -} - -int ALLEGROCL::emit_dispatch_defun(Node *n) { -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_dispatch_defun: ENTER... "); -#endif - List *overloads = Swig_overload_rank(n, true); - - // Printf(stderr,"\ndispatch node=%p\n\n", n); - // Swig_print_node(n); - - Node *overloaded_from = Getattr(n,"sym:overloaded"); - bool include_class = Getattr(overloaded_from, "allegrocl:dispatcher:include-class") ? true : false; - String *id_args = id_converter_arguments(n)->noname_no_others_str(include_class); - Printf(f_clwrap, "(swig-dispatcher (\"%s\" %s :arities (", Getattr(overloaded_from, "allegrocl:dispatcher:name"), id_args); - - Delattr(overloaded_from, "allegrocl:dispatcher:include-class"); - Delattr(overloaded_from, "allegrocl:dispatcher:name"); - - int last_arity = -1; - for (Iterator i = First(overloads); i.item; i = Next(i)) { - int arity = emit_num_lin_arguments(Getattr(i.item, "wrap:parms")); - if (arity == last_arity) - continue; - - Printf(f_clwrap, "%s%d", last_arity == -1 ? "" : " ", arity); - - last_arity = arity; - } - Printf(f_clwrap, ")))\n"); - - Delete(id_args); - Delete(overloads); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_dispatch_defun: EXIT\n"); -#endif - - return SWIG_OK; -} - -int ALLEGROCL::emit_defun(Node *n, File *fcl) { -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_defun: ENTER... "); -#endif - - // avoid name conflicts between smart pointer wrappers and the wrappers for the - // actual class. - bool smartmemberwrapper = (!Cmp(Getattr(n, "view"), "memberfunctionHandler") && - Getattr(n,"allocate:smartpointeraccess")); - -#ifdef ALLEGROCL_DEBUG - int auto_generated = Cmp(Getattr(n, "view"), "globalfunctionHandler"); - Printf(stderr, "%s%sfunction %s%s%s\n", auto_generated ? "> " : "", Getattr(n, "sym:overloaded") - ? "overloaded " : "", current_namespace, (current_namespace) > 0 ? "::" : "", Getattr(n, "sym:name")); - Printf(stderr, " (view: %s)\n", Getattr(n, "view")); - Swig_print_node(n); -#endif - - - String *funcname = Getattr(n, "allegrocl:old-sym:name"); - if (smartmemberwrapper || !funcname) - funcname = Getattr(n, "sym:name"); - - String *mangled_name = Getattr(n, "wrap:name"); - ParmList *pl = parmlist_with_names(Getattr(n, "wrap:parms")); - - // attach typemap info. - Wrapper *wrap = NewWrapper(); - Swig_typemap_attach_parms("lin", pl, wrap); - // Swig_typemap_attach_parms("ffitype", pl, wrap); - Swig_typemap_lookup("lout", n, Swig_cresult_name(), 0); - - SwigType *result_type = Swig_cparse_type(Getattr(n, "tmap:ctype")); - // prime the pump, with support for OUTPUT, INOUT typemaps. - Printf(wrap->code, - "(cl::let ((ACL_ffresult %s:*void*)\n ACL_result)\n $body\n (cl::if (cl::eq ACL_ffresult %s:*void*)\n (cl::values-list ACL_result)\n (cl::values-list (cl::cons ACL_ffresult ACL_result))))", - swig_package, swig_package); - - Parm *p; - int largnum = 0, argnum = 0, first = 1; - // int varargs=0; - if (Generate_Wrapper) { - String *extra_parms = id_converter_arguments(n)->noname_str(smartmemberwrapper ? false : true); - Node *overloaded_from = Getattr(n,"sym:overloaded"); - if (overloaded_from) { - if(!GetFlag(overloaded_from,"allegrocl:dispatcher:name")) { - Setattr(overloaded_from,"allegrocl:dispatcher:name",funcname); - Setattr(overloaded_from,"allegrocl:dispatcher:include-class", smartmemberwrapper ? 0 : "1"); - // Printf(stderr, " set a:d:name='%s', a:d:i-c='%s'\n", Getattr(n,"allegrocl:dispatcher:name"), Getattr(n,"allegrocl:dispatcher:include-class")); - } - Printf(fcl, "(swig-defmethod (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); - } else - Printf(fcl, "(swig-defun (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); - Delete(extra_parms); - } - // Just C - else { - Printf(fcl, "(swig-defun (\"%s\" \"%s\")\n", funcname, Generate_Wrapper ? mangled_name : funcname); - } - - ////////////////////////////////////// - // Lisp foreign call parameter list // - ////////////////////////////////////// - Printf(fcl, " ("); - - /* Special cases */ - - if (ParmList_len(pl) == 0) { - Printf(fcl, ":void"); -/* } else if (any_varargs(pl)) { - Printf(fcl, "#| varargs |#"); - varargs=1; */ - } else { - String *largs = NewString(""); - - for (p = pl; p; p = nextSibling(p), argnum++, largnum++) { - // SwigType *argtype=Getattr(p, "type"); - SwigType *argtype = Swig_cparse_type(Getattr(p, "tmap:ctype")); - SwigType *parmtype = Getattr(p,"type"); - - if (!first) { - Printf(fcl, "\n "); - } - - /* by default, skip varargs */ - if (!SwigType_isvarargs(parmtype)) { - String *argname = NewStringf("PARM%d_%s", largnum, Getattr(p, "name")); - - // Printf(stderr,"%s\n", Getattr(p,"tmap:lin")); - String *ffitype = compose_foreign_type(n, argtype, Getattr(p,"name")); - String *deref_ffitype = dereference_ffitype(ffitype); - String *lisptype = get_lisp_type(n, parmtype, Getattr(p, "name")); - -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "lisptype of '%s' '%s' = '%s'\n", parmtype, - Getattr(p, "name"), lisptype); -#endif - - // while we're walking the parameters, generating LIN - // wrapper code... - Setattr(p, "lname", NewStringf("SWIG_arg%d", largnum)); - - String *parm_code = Getattr(p, "tmap:lin"); - if (parm_code) { - String *lname = Getattr(p, "lname"); - - Printf(largs, " %s", lname); - Replaceall(parm_code, "$in_fftype", ffitype); // must come before $in - Replaceall(parm_code, "$in", argname); - Replaceall(parm_code, "$out", lname); - Replaceall(parm_code, "$*in_fftype", deref_ffitype); - Replaceall(wrap->code, "$body", parm_code); - } - - String *dispatchtype = Getattr(n, "sym:overloaded") ? dispatching_type(n, p) : NewString(""); - - // if this parameter has been removed from the C/++ wrapper - // it shouldn't be in the lisp wrapper either. - if (!checkAttribute(p, "tmap:in:numinputs", "0")) { - Printf(fcl, "(%s %s %s %s %s)", - // parms in the ff wrapper, but not in the lisp wrapper. - (checkAttribute(p, "tmap:lin:numinputs", "0") ? ":p-" : ":p+"), argname, dispatchtype, ffitype, lisptype); - - first = 0; - } - - Delete(argname); - Delete(ffitype); - Delete(deref_ffitype); - Delete(lisptype); - } - } - - Printf(wrap->locals, "%s", largs); - } - - String *lout = Getattr(n, "tmap:lout"); - Replaceall(lout, "$owner", GetFlag(n, "feature:new") ? "t" : "nil"); - - Replaceall(wrap->code, "$body", lout); - // $lclass handling. - String *lclass = (String *) 0; - SwigType *parsed = Swig_cparse_type(Getattr(n, "tmap:ctype")); - // SwigType *cl_t = SwigType_typedef_resolve_all(parsed); - SwigType *cl_t = class_from_class_or_class_ref(parsed); - String *out_ffitype = compose_foreign_type(n, parsed); - String *deref_out_ffitype; - String *out_temp = Copy(parsed); - - if (SwigType_ispointer(out_temp)) { - SwigType_pop(out_temp); - deref_out_ffitype = compose_foreign_type(n, out_temp); - } else { - deref_out_ffitype = Copy(out_ffitype); - } - - Delete(out_temp); - - Delete(parsed); - - if (cl_t) { - lclass = lookup_defined_foreign_ltype(cl_t); - } - - int ff_foreign_ptr = 0; - if (!lclass) { - ff_foreign_ptr = 1; - lclass = NewStringf("ff:foreign-pointer"); - } -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "for output wrapping %s: type=%s, ctype=%s\n", Getattr(n, "name"), - Getattr(n, "type"), Swig_cparse_type(Getattr(n, "tmap:ctype"))); -#endif - - if (lclass) - Replaceall(wrap->code, "$lclass", lclass); - if (out_ffitype) - Replaceall(wrap->code, "$out_fftype", out_ffitype); - if (deref_out_ffitype) - Replaceall(wrap->code, "$*out_fftype", deref_out_ffitype); - - Replaceall(wrap->code, "$body", NewStringf("(swig-ff-call%s)", wrap->locals)); - String *ldestructor = Copy(lclass); - if (ff_foreign_ptr) - Replaceall(ldestructor, ldestructor, "cl::identity"); - else - Replaceall(ldestructor, ":type :class", ":type :destructor"); - Replaceall(wrap->code, "$ldestructor", ldestructor); - Delete(ldestructor); - - Printf(fcl, ")\n"); /* finish arg list */ - - ///////////////////////////////////////////////////// - // Lisp foreign call return type and optimizations // - ///////////////////////////////////////////////////// - Printf(fcl, " (:returning (%s %s)", compose_foreign_type(n, result_type), get_lisp_type(n, Getattr(n, "type"), Swig_cresult_name())); - - for (Iterator option = First(n); option.item; option = Next(option)) { - if (Strncmp("feature:ffargs:", option.key, 15)) - continue; - String *option_val = option.item; - String *option_name = NewString(Char(option.key) + 14); - Replaceall(option_name, "_", "-"); - - // TODO: varargs vs call-direct ? - Printf(fcl, "\n %s %s", option_name, option_val); - - Delete(option_name); - } - - Printf(fcl, ")\n %s)\n\n", wrap->code); - // Wrapper_print(wrap, stderr); - - Delete(result_type); - Delete(mangled_name); - Delete(pl); - DelWrapper(wrap); - -#ifdef ALLEGROCL_WRAP_DEBUG - Printf(stderr, "emit_defun: EXIT\n"); -#endif - - return SWIG_OK; -} - -int ALLEGROCL::functionWrapper(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "functionWrapper %s\n", Getattr(n,"name")); -#endif - - - ParmList *parms = CopyParmList(Getattr(n, "parms")); - Wrapper *f = NewWrapper(); - SwigType *t = Getattr(n, "type"); - String *name = Getattr(n, "name"); - - String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0); - SwigType *return_type = Swig_cparse_type(raw_return_type); - SwigType *resolved = SwigType_typedef_resolve_all(return_type); - int is_void_return = (Cmp(resolved, "void") == 0); - - Delete(resolved); - - if (!is_void_return) { - String *lresult_init = - NewStringf("= (%s)0", - SwigType_str(SwigType_strip_qualifiers(return_type),0)); - Wrapper_add_localv(f, "lresult", - SwigType_lstr(SwigType_ltype(return_type), "lresult"), - lresult_init, NIL); - Delete(lresult_init); - } - // Emit all of the local variables for holding arguments. - emit_parameter_variables(parms, f); - - // Attach the standard typemaps - Swig_typemap_attach_parms("ctype", parms, f); - Swig_typemap_attach_parms("lin", parms, f); - emit_attach_parmmaps(parms, f); - - String *mangled = mangle_name(n); - Node *overloaded = Getattr(n, "sym:overloaded"); - - // Parameter overloading - Setattr(n, "wrap:parms", parms); - Setattr(n, "wrap:name", mangled); - - if (overloaded) { - // emit warnings when overloading is impossible on the lisp side. - // basically Swig_overload_check(n), but with script_lang_wrapping - // set to true. - Delete(Swig_overload_rank(n, true)); - if (Getattr(n, "overload:ignore")) { - // if we're the last overload, make sure to force the emit - // of the rest of the overloads before we leave. - // Printf(stderr, "ignored overload %s(%p)\n", name, Getattr(n, "sym:nextSibling")); - if (!Getattr(n, "sym:nextSibling")) { - update_package_if_needed(n); - emit_buffered_defuns(n); - emit_dispatch_defun(n); - } - DelWrapper(f); - return SWIG_OK; - } - } - // Get number of required and total arguments - int num_arguments = emit_num_arguments(parms); - int gencomma = 0; - -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "Walking parameters for %s '%s'\n", Getattr(n, "allegrocl:kind"), name); -#endif - // Now walk the function parameter list and generate code to get arguments - String *name_and_parms = NewStringf("%s (", mangled); - int i; - Parm *p; - for (i = 0, p = parms; i < num_arguments; i++) { - -#ifdef ALLEGROCL_DEBUG - String *temp1 = Getattr(p,"tmap:in"); - String *temp2 = Getattr(p,"tmap:in:numinputs"); - Printf(stderr," parm %d: %s, tmap:in='%s', tmap:in:numinputs='%s'\n", i, Getattr(p,"name"), temp1 ? temp1 : "", temp2 ? temp2 : ""); -#endif - - while (p && checkAttribute(p, "tmap:in:numinputs", "0")) { - p = Getattr(p, "tmap:in:next"); - } - - if (!p) - break; - - SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); - String *arg = NewStringf("l%s", Getattr(p, "lname")); - - // Emit parameter declaration - if (gencomma) - Printf(name_and_parms, ", "); - String *parm_decl = SwigType_str(c_parm_type, arg); - Printf(name_and_parms, "%s", parm_decl); -#ifdef ALLEGROCL_DEBUG - Printf(stderr, " param: %s\n", parm_decl); -#endif - Delete(parm_decl); - gencomma = 1; - - // Emit parameter conversion code - String *parm_code = Getattr(p, "tmap:in"); - //if (!parm_code) { - // Swig_warning(...); - // p = nextSibling(p); - /*} else */ { - // canThrow(n, "in", p); - Replaceall(parm_code, "$input", arg); - Setattr(p, "emit:input", arg); - Printf(f->code, "%s\n", parm_code); - p = Getattr(p, "tmap:in:next"); - } - - Delete(arg); - } - Printf(name_and_parms, ")"); - -#ifdef ALLEGROCL_DEBUG - Printf(stderr, " arity = %d(%d)\n", emit_num_lin_arguments(parms), emit_num_lin_arguments(Getattr(n,"wrap:parms"))); -#endif - - // Emit the function definition - String *signature = SwigType_str(return_type, name_and_parms); - Printf(f->def, "EXPORT %s {", signature); - if (CPlusPlus) - Printf(f->code, " try {\n"); - - String *actioncode = emit_action(n); - - String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); - if (!is_void_return) { - if (tm) { - Replaceall(tm, "$result", "lresult"); - Printf(f->code, "%s\n", tm); - Printf(f->code, " return lresult;\n"); - Delete(tm); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, - "Unable to use return type %s in function %s.\n", - SwigType_str(t, 0), name); - } - } - - /* See if there is any return cleanup code */ - if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Printf(f->code, "%s\n", tm); - Delete(tm); - } - - emit_return_variable(n, t, f); - - if (CPlusPlus) { - Printf(f->code, " } catch (...) {\n"); - if (!is_void_return) - Printf(f->code, " return (%s)0;\n", - SwigType_str(SwigType_strip_qualifiers(return_type),0)); - Printf(f->code, " }\n"); - } - Printf(f->code, "}\n"); - - /* print this when in C mode? make this a command-line arg? */ - if (Generate_Wrapper) - Wrapper_print(f, f_cxx_wrapper); - - String *f_buffer = NewString(""); - - emit_defun(n, f_buffer); - Setattr(n, "allegrocl:lisp-wrap", f_buffer); - - if (!overloaded || !Getattr(n, "sym:nextSibling")) { - update_package_if_needed(n); - emit_buffered_defuns(n); - // this is the last overload. - if (overloaded) { - emit_dispatch_defun(n); - } - } - - DelWrapper(f); - - return SWIG_OK; -} - -int ALLEGROCL::namespaceDeclaration(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "namespaceDecl: '%s'(%p) (fc=%p)\n", Getattr(n, "sym:name"), n, firstChild(n)); -#endif - - /* don't wrap a namespace with no contents. package bloat. - also, test-suite/namespace_class.i claims an unnamed namespace - is 'private' and should not be wrapped. Complying... - */ - if (Getattr(n,"unnamed") || !firstChild(n)) - return SWIG_OK; - - String *name = Getattr(n, "sym:name"); - - String *old_namespace = current_namespace; - if (Cmp(current_namespace, "") == 0) - current_namespace = NewStringf("%s", name); - else - current_namespace = NewStringf("%s::%s", current_namespace, name); - - if (!GetInt(defined_namespace_packages, current_namespace)) { - SetInt(defined_namespace_packages, current_namespace, 1); - String *lispy_namespace = listify_namespace(current_namespace); - Printf(f_clhead, "(swig-defpackage %s)\n", lispy_namespace); - Delete(lispy_namespace); - } - - emit_children(n); - - Delete(current_namespace); - current_namespace = old_namespace; - return SWIG_OK; -} - -int ALLEGROCL::constructorHandler(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "constructorHandler %s\n", Getattr(n, "name")); -#endif - // Swig_print_node(n); - Setattr(n, "allegrocl:kind", "constructor"); - Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); - - // Let SWIG generate a global forwarding function. - return Language::constructorHandler(n); -} - -int ALLEGROCL::destructorHandler(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "destructorHandler %s\n", Getattr(n, "name")); -#endif - - Setattr(n, "allegrocl:kind", "destructor"); - Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); - - // Let SWIG generate a global forwarding function. - return Language::destructorHandler(n); -} - -int ALLEGROCL::constantWrapper(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "constantWrapper %s\n", Getattr(n, "name")); -#endif - - if (Generate_Wrapper) { - // Setattr(n,"wrap:name",mangle_name(n, "ACLPP")); - String *const_type = Getattr(n, "type"); - - String *const_val = 0; - String *raw_const = Getattr(n, "value"); - - if (SwigType_type(const_type) == T_STRING) { - const_val = NewStringf("\"%s\"", raw_const); - } else if (SwigType_type(const_type) == T_CHAR) { - const_val = NewStringf("'%s'", raw_const); - } else { - const_val = Copy(raw_const); - } - - SwigType_add_qualifier(const_type, "const"); - - String *ppcname = NewStringf("ACLppc_%s", Getattr(n, "sym:name")); - // Printf(f_runtime, "static const %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); - Printf(f_runtime, "static %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); - - Setattr(n, "name", ppcname); - SetFlag(n, "feature:immutable"); - - Delete(const_val); - return variableWrapper(n); - } - - String *type = Getattr(n, "type"); - String *value = Getattr(n, "value"); - String *converted_value = convert_literal(value, type); - String *name = Getattr(n, "sym:name"); - - Setattr(n, "allegrocl:kind", "constant"); - Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); - -#if 0 - Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); -#endif - - if (converted_value) { - Printf(f_clwrap, "(swig-defconstant \"%s\" %s)\n", name, converted_value); - } else { - Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse constant value '%s'. Setting to NIL\n", value); - Printf(f_clwrap, "(swig-defconstant \"%s\" nil #| %s |#)\n", name, value); - } - - Delete(converted_value); - - return SWIG_OK; -} - -int ALLEGROCL::globalvariableHandler(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "globalvariableHandler %s\n", Getattr(n, "name")); -#endif - - if (Generate_Wrapper) - return Language::globalvariableHandler(n); - - // String *name = Getattr(n, "name"); - SwigType *type = Getattr(n, "type"); - SwigType *rtype = SwigType_typedef_resolve_all(type); - - if (SwigType_isclass(rtype)) { - SwigType_add_pointer(type); - SwigType_add_pointer(rtype); - } - - Printf(f_clwrap, "(swig-defvar \"%s\" \"%s\" :type %s)\n", - Getattr(n, "sym:name"), Getattr(n, "sym:name"), ((SwigType_isconst(type)) ? ":constant" : ":variable")); - - return SWIG_OK; -} - -int ALLEGROCL::variableWrapper(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "variableWrapper %s\n", Getattr(n, "name")); -#endif - Setattr(n, "allegrocl:kind", "variable"); - Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); - - // Let SWIG generate a get/set function pair. - if (Generate_Wrapper) - return Language::variableWrapper(n); - - String *name = Getattr(n, "name"); - SwigType *type = Getattr(n, "type"); - SwigType *ctype; - SwigType *rtype = SwigType_typedef_resolve_all(type); - - String *mangled_name = mangle_name(n); - - int pointer_added = 0; - - if (SwigType_isclass(rtype)) { - SwigType_add_pointer(type); - SwigType_add_pointer(rtype); - pointer_added = 1; - } - - ctype = SwigType_str(type, 0); - - // EXPORT ; - // = ; - Printf(f_runtime, "EXPORT %s %s;\n%s %s = %s%s;\n", ctype, mangled_name, ctype, mangled_name, (pointer_added ? "&" : ""), name); - - Printf(f_cl, "(swig-defvar \"%s\" :type %s)\n", mangled_name, ((SwigType_isconst(type)) ? ":constant" : ":variable")); - - Printf(stderr,"***\n"); - Delete(mangled_name); - -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "DONE variable %s\n", Getattr(n, "name")); -#endif - - return SWIG_OK; -} - -int ALLEGROCL::memberfunctionHandler(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "memberfunctionHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); - Swig_print_node(n); -#endif - Setattr(n, "allegrocl:kind", "member function"); - Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); - - // Let SWIG generate a global forwarding function. - return Language::memberfunctionHandler(n); -} - -int ALLEGROCL::membervariableHandler(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "membervariableHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); -#endif - Setattr(n, "allegrocl:kind", "member variable"); - Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); - - // Let SWIG generate a get/set function pair. - return Language::membervariableHandler(n); -} - -int ALLEGROCL::typedefHandler(Node *n) { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "In typedefHandler\n"); -#endif - - SwigType *typedef_type = Getattr(n,"type"); - // has the side-effect of noting any implicit - // template instantiations in type. - String *ff_type = compose_foreign_type(n, typedef_type); - - String *sym_name = Getattr(n, "sym:name"); - - String *name; - String *type_ref; - - if (in_class) { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, " typedef in class '%s'(%p)\n", Getattr(in_class, "sym:name"), in_class); -#endif - Setattr(n, "allegrocl:typedef:in-class", in_class); - - String *class_name = Getattr(in_class, "name"); - name = NewStringf("%s__%s", class_name, sym_name); - type_ref = NewStringf("%s::%s", class_name, sym_name); - Setattr(n, "allegrocl:in-class", in_class); - } else { - name = Copy(sym_name); - type_ref = Copy(Getattr(n, "name")); - } - - Setattr(n, "allegrocl:namespace", current_namespace); - - String *lookup = lookup_defined_foreign_type(typedef_type); - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "** lookup='%s'(%p), typedef_type='%s', strcmp = '%d' strstr = '%d'\n", lookup, lookup, typedef_type, Strcmp(typedef_type,"void"), Strstr(ff_type,"__SWIGACL_FwdReference")); -#endif - - if(lookup || (!lookup && Strcmp(typedef_type,"void")) || - (!lookup && Strstr(ff_type,"__SWIGACL_FwdReference"))) { - add_defined_foreign_type(n, 0, type_ref, name); - } else { - add_forward_referenced_type(n); - } - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "Out typedefHandler\n"); -#endif - - Delete(ff_type); - - return SWIG_OK; -} - -// forward referenced classes are added specially to defined_foreign_types -int ALLEGROCL::classforwardDeclaration(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "classforwardDeclaration %s\n", Getattr(n, "name")); -#endif - - add_forward_referenced_type(n); - return SWIG_OK; -} - -int ALLEGROCL::classHandler(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "classHandler %s::%s\n", current_namespace, Getattr(n, "sym:name")); -#endif - - int result; - - if (Generate_Wrapper) - result = cppClassHandler(n); - else - result = cClassHandler(n); - - return result; -} - -int ALLEGROCL::cClassHandler(Node *n) { -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "In cClassHandler\n"); -#endif - /* Add this structure to the known lisp types */ - // Printf(stderr, "Adding %s foreign type\n", name); - String *ns = listify_namespace(current_namespace); - - add_defined_foreign_type(n); - - Delete(ns); - -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "Out cClassHandler\n"); -#endif - - return SWIG_OK; -} - -int ALLEGROCL::cppClassHandler(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "cppClassHandler %s\n", Getattr(n, "name")); -#endif - - // String *name=Getattr(n, "sym:name"); - // String *kind = Getattr(n,"kind"); - - /* Template instantiation. - Careful. - SWIG does not create instantiations of templated classes whenever - it sees a templated class reference (say, as a return type, or - in a parameter list). - - The %template directive results in a templated class instantiation - that will actually be seen by :: classHandler(). - - In this case, we don't want to error if the type already exists; - the point is to force the creation of wrappers for the templated - class. - */ - String *templated = Getattr(n, "template"); - String *t_name; - // String *ns = listify_namespace(current_namespace); - - if (templated) { - t_name = namespaced_name(n); - } else { - t_name = Getattr(n, "name"); - } - - Setattr(n, "allegrocl:namespace", current_namespace); - - /* Add this structure to the known lisp types. - Class may contain references to the type currently being - defined */ - if (!templated || !lookup_defined_foreign_type(t_name)) { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "Adding %s foreign type\n", Getattr(n, "sym:name")); -#endif - add_defined_foreign_type(n); - } else { -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "cppClassHand: type %s already exists. Assuming %%template instantiation for wrapping purposes.\n", Getattr(n, "sym:name")); -#endif - add_defined_foreign_type(n, 1); - } - - // Generate slot accessors, constructor, and destructor. - Node *prev_class = in_class; - in_class = n; - - Node *c; - // walk all member variables. -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, " MANUALLY walking class members... \n"); -#endif - for (c = firstChild(n); c; c = nextSibling(c)) { - // ping the types of all children--even protected and private - // so their types can be added to the linked_type_list. - SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), - Getattr(c, "type")); -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, "looking at child '%p' of type '%s' '%d'\n", c, childType, SwigType_isfunction(childType)); - // Swig_print_node(c); -#endif - if (!SwigType_isfunction(childType)) - Delete(compose_foreign_type(n, childType)); - - Delete(childType); - } -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, " MANUAL walk DONE.\n"); -#endif - - // this will walk all necessary methods. -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, " LANGUAGE walk of children...\n"); -#endif - Language::classHandler(n); -#ifdef ALLEGROCL_CLASS_DEBUG - Printf(stderr, " LANGUAGE walk DONE\n"); -#endif - in_class = prev_class; - - return SWIG_OK; -} - -int ALLEGROCL::emit_one(Node *n) { - // When the current package does not correspond with the current - // namespace we need to generate an IN-PACKAGE form, unless the - // current node is another namespace node. - if (Cmp(nodeType(n), "namespace") != 0 && Cmp(current_package, current_namespace) != 0) { - String *lispy_namespace = listify_namespace(current_namespace); - Printf(f_clwrap, "(swig-in-package %s)\n", lispy_namespace); - Delete(lispy_namespace); - Delete(current_package); - current_package = NewStringf("%s", current_namespace); - } - - Setattr(n, "allegrocl:package", current_package); - - return Language::emit_one(n); -} - -int ALLEGROCL::enumDeclaration(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "enumDeclaration %s\n", Getattr(n, "name")); -#endif - - if (getCurrentClass() && (cplus_mode != PUBLIC)) - return SWIG_NOWRAP; - - if (Getattr(n, "sym:name")) { - add_defined_foreign_type(n); - } - Node *c; - for (c = firstChild(n); c; c = nextSibling(c)) { - ALLEGROCL::enumvalueDeclaration(c); - // since we walk our own children, we need to add - // the current package ourselves. - Setattr(c, "allegrocl:package", current_package); - } - return SWIG_OK; -} - - -int ALLEGROCL::enumvalueDeclaration(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "enumvalueDeclaration %s\n", Getattr(n, "name")); -#endif - /* print this when in C mode? make this a command-line arg? */ - if (Generate_Wrapper) { - SwigType *enum_type = Copy(Getattr(n,"type")); - String *mangled_name = - mangle_name(n, "ACL_ENUM", - in_class ? Getattr(in_class,"name") : - current_namespace); - - SwigType_add_qualifier(enum_type,"const"); - - String *enum_decl = SwigType_str(enum_type, mangled_name); - Printf(f_cxx_wrapper, "EXPORT %s;\n", enum_decl); - Printf(f_cxx_wrapper, "%s = %s;\n", enum_decl, Getattr(n, "value")); - - Delete(mangled_name); - Delete(enum_type); - Delete(enum_decl); - } - return SWIG_OK; -} - -int ALLEGROCL::templateDeclaration(Node *n) { -#ifdef ALLEGROCL_DEBUG - Printf(stderr, "templateDeclaration %s\n", Getattr(n, "name")); -#endif - - String *type = Getattr(n, "templatetype"); - - // Printf(stderr, "tempDecl: %s %s\n", Getattr(n,"name"), - // type); - // Swig_print_node(n); - - if (!Strcmp(type, "cdecl")) { - SwigType *ty = NewStringf("%s%s", Getattr(n, "decl"), - Getattr(n, "type")); - Delete(ty); - } - - Delete(type); - - return SWIG_OK; -} - diff --git a/Source/Modules/cffi.cxx b/Source/Modules/cffi.cxx index bf3338813..6333fa153 100644 --- a/Source/Modules/cffi.cxx +++ b/Source/Modules/cffi.cxx @@ -227,7 +227,7 @@ int CFFI::classHandler(Node *n) { int CFFI::constructorHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "constructor %s\n", Getattr(n, "name")); - Printf(stderr, "constructor %s\n and %s and %s", Getattr(n, "kind"), Getattr(n, "sym:name"), Getattr(n, "allegrocl:old-sym:name")); + Printf(stderr, "constructor %s\n and %s", Getattr(n, "kind"), Getattr(n, "sym:name")); #endif Setattr(n, "cffi:constructorfunction", "1"); // Let SWIG generate a global forwarding function. @@ -426,7 +426,6 @@ void CFFI::cleanupFunction(Node *n, Wrapper *f, ParmList *parms) { if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } @@ -546,7 +545,6 @@ int CFFI::functionWrapper(Node *n) { /* See if there is any return cleanup code */ String *tm = 0; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } diff --git a/Source/Modules/chicken.cxx b/Source/Modules/chicken.cxx deleted file mode 100644 index 76b6455e2..000000000 --- a/Source/Modules/chicken.cxx +++ /dev/null @@ -1,1535 +0,0 @@ -/* ----------------------------------------------------------------------------- - * This file is part of SWIG, which is licensed as a whole under version 3 - * (or any later version) of the GNU General Public License. Some additional - * terms also apply to certain portions of SWIG. The full details of the SWIG - * license and copyrights can be found in the LICENSE and COPYRIGHT files - * included with the SWIG source code as distributed by the SWIG developers - * and at http://www.swig.org/legal.html. - * - * chicken.cxx - * - * CHICKEN language module for SWIG. - * ----------------------------------------------------------------------------- */ - -#include "swigmod.h" - -#include - -static const char *usage = "\ -\ -CHICKEN Options (available with -chicken)\n\ - -closprefix - Prepend to all clos identifiers\n\ - -noclosuses - Do not (declare (uses ...)) in scheme file\n\ - -nocollection - Do not register pointers with chicken garbage\n\ - collector and export destructors\n\ - -nounit - Do not (declare (unit ...)) in scheme file\n\ - -proxy - Export TinyCLOS class definitions\n\ - -unhideprimitive - Unhide the primitive: symbols\n\ - -useclassprefix - Prepend the class name to all clos identifiers\n\ -\n"; - -static char *module = 0; -static const char *chicken_path = "chicken"; -static int num_methods = 0; - -static File *f_begin = 0; -static File *f_runtime = 0; -static File *f_header = 0; -static File *f_wrappers = 0; -static File *f_init = 0; -static String *chickentext = 0; -static String *closprefix = 0; -static String *swigtype_ptr = 0; - - -static String *f_sym_size = 0; - -/* some options */ -static int declare_unit = 1; -static int no_collection = 0; -static int clos_uses = 1; - -/* C++ Support + Clos Classes */ -static int clos = 0; -static String *c_class_name = 0; -static String *class_name = 0; -static String *short_class_name = 0; - -static int in_class = 0; -static int have_constructor = 0; -static bool exporting_destructor = false; -static bool exporting_constructor = false; -static String *constructor_name = 0; -static String *member_name = 0; - -/* sections of the .scm code */ -static String *scm_const_defs = 0; -static String *clos_class_defines = 0; -static String *clos_methods = 0; - -/* Some clos options */ -static int useclassprefix = 0; -static String *clossymnameprefix = 0; -static int hide_primitive = 1; -static Hash *primitive_names = 0; - -/* Used for overloading constructors */ -static int has_constructor_args = 0; -static List *constructor_arg_types = 0; -static String *constructor_dispatch = 0; - -static Hash *overload_parameter_lists = 0; - -class CHICKEN:public Language { -public: - - virtual void main(int argc, char *argv[]); - virtual int top(Node *n); - virtual int functionWrapper(Node *n); - virtual int variableWrapper(Node *n); - virtual int constantWrapper(Node *n); - virtual int classHandler(Node *n); - virtual int memberfunctionHandler(Node *n); - virtual int membervariableHandler(Node *n); - virtual int constructorHandler(Node *n); - virtual int destructorHandler(Node *n); - virtual int validIdentifier(String *s); - virtual int staticmembervariableHandler(Node *n); - virtual int staticmemberfunctionHandler(Node *n); - virtual int importDirective(Node *n); - -protected: - void addMethod(String *scheme_name, String *function); - /* Return true iff T is a pointer type */ - int isPointer(SwigType *t); - void dispatchFunction(Node *n); - - String *chickenNameMapping(String *, const_String_or_char_ptr ); - String *chickenPrimitiveName(String *); - - String *runtimeCode(); - String *defaultExternalRuntimeFilename(); - String *buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname); -}; - -/* ----------------------------------------------------------------------- - * swig_chicken() - Instantiate module - * ----------------------------------------------------------------------- */ - -static Language *new_swig_chicken() { - return new CHICKEN(); -} - -extern "C" { - Language *swig_chicken(void) { - return new_swig_chicken(); - } -} - -void CHICKEN::main(int argc, char *argv[]) { - int i; - - SWIG_library_directory(chicken_path); - - // Look for certain command line options - for (i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp(argv[i], "-help") == 0) { - fputs(usage, stdout); - SWIG_exit(0); - } else if (strcmp(argv[i], "-proxy") == 0) { - clos = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i], "-closprefix") == 0) { - if (argv[i + 1]) { - clossymnameprefix = NewString(argv[i + 1]); - Swig_mark_arg(i); - Swig_mark_arg(i + 1); - i++; - } else { - Swig_arg_error(); - } - } else if (strcmp(argv[i], "-useclassprefix") == 0) { - useclassprefix = 1; - Swig_mark_arg(i); - } else if (strcmp(argv[i], "-unhideprimitive") == 0) { - hide_primitive = 0; - Swig_mark_arg(i); - } else if (strcmp(argv[i], "-nounit") == 0) { - declare_unit = 0; - Swig_mark_arg(i); - } else if (strcmp(argv[i], "-noclosuses") == 0) { - clos_uses = 0; - Swig_mark_arg(i); - } else if (strcmp(argv[i], "-nocollection") == 0) { - no_collection = 1; - Swig_mark_arg(i); - } - } - } - - if (!clos) - hide_primitive = 0; - - // Add a symbol for this module - Preprocessor_define("SWIGCHICKEN 1", 0); - - // Set name of typemaps - - SWIG_typemap_lang("chicken"); - - // Read in default typemaps */ - SWIG_config_file("chicken.swg"); - allow_overloading(); -} - -int CHICKEN::top(Node *n) { - String *chicken_filename = NewString(""); - File *f_scm; - String *scmmodule; - - /* Initialize all of the output files */ - String *outfile = Getattr(n, "outfile"); - - f_begin = NewFile(outfile, "w", SWIG_output_files()); - if (!f_begin) { - FileErrorDisplay(outfile); - SWIG_exit(EXIT_FAILURE); - } - f_runtime = NewString(""); - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - chickentext = NewString(""); - closprefix = NewString(""); - f_sym_size = NewString(""); - primitive_names = NewHash(); - overload_parameter_lists = NewHash(); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header", f_header); - Swig_register_filebyname("wrapper", f_wrappers); - Swig_register_filebyname("begin", f_begin); - Swig_register_filebyname("runtime", f_runtime); - Swig_register_filebyname("init", f_init); - - Swig_register_filebyname("chicken", chickentext); - Swig_register_filebyname("closprefix", closprefix); - - clos_class_defines = NewString(""); - clos_methods = NewString(""); - scm_const_defs = NewString(""); - - Swig_banner(f_begin); - - Printf(f_runtime, "\n\n#ifndef SWIGCHICKEN\n#define SWIGCHICKEN\n#endif\n\n"); - - if (no_collection) - Printf(f_runtime, "#define SWIG_CHICKEN_NO_COLLECTION 1\n"); - - Printf(f_runtime, "\n"); - - /* Set module name */ - module = Swig_copy_string(Char(Getattr(n, "name"))); - scmmodule = NewString(module); - Replaceall(scmmodule, "_", "-"); - - Printf(f_header, "#define SWIG_init swig_%s_init\n", module); - Printf(f_header, "#define SWIG_name \"%s\"\n", scmmodule); - - Printf(f_wrappers, "#ifdef __cplusplus\n"); - Printf(f_wrappers, "extern \"C\" {\n"); - Printf(f_wrappers, "#endif\n\n"); - - Language::top(n); - - SwigType_emit_type_table(f_runtime, f_wrappers); - - Printf(f_wrappers, "#ifdef __cplusplus\n"); - Printf(f_wrappers, "}\n"); - Printf(f_wrappers, "#endif\n"); - - Printf(f_init, "C_kontinue (continuation, ret);\n"); - Printf(f_init, "}\n\n"); - - Printf(f_init, "#ifdef __cplusplus\n"); - Printf(f_init, "}\n"); - Printf(f_init, "#endif\n"); - - Printf(chicken_filename, "%s%s.scm", SWIG_output_directory(), module); - if ((f_scm = NewFile(chicken_filename, "w", SWIG_output_files())) == 0) { - FileErrorDisplay(chicken_filename); - SWIG_exit(EXIT_FAILURE); - } - - Swig_banner_target_lang(f_scm, ";;"); - Printf(f_scm, "\n"); - - if (declare_unit) - Printv(f_scm, "(declare (unit ", scmmodule, "))\n\n", NIL); - Printv(f_scm, "(declare \n", - tab4, "(hide swig-init swig-init-return)\n", - tab4, "(foreign-declare \"C_extern void swig_", module, "_init(C_word,C_word,C_word) C_noret;\"))\n", NIL); - Printv(f_scm, "(define swig-init (##core#primitive \"swig_", module, "_init\"))\n", NIL); - Printv(f_scm, "(define swig-init-return (swig-init))\n\n", NIL); - - if (clos) { - //Printf (f_scm, "(declare (uses tinyclos))\n"); - //New chicken versions have tinyclos as an egg - Printf(f_scm, "(require-extension tinyclos)\n"); - Replaceall(closprefix, "$module", scmmodule); - Printf(f_scm, "%s\n", closprefix); - Printf(f_scm, "%s\n", clos_class_defines); - Printf(f_scm, "%s\n", clos_methods); - } else { - Printf(f_scm, "%s\n", scm_const_defs); - } - - Printf(f_scm, "%s\n", chickentext); - - Delete(f_scm); - - char buftmp[20]; - sprintf(buftmp, "%d", num_methods); - Replaceall(f_init, "$nummethods", buftmp); - Replaceall(f_init, "$symsize", f_sym_size); - - if (hide_primitive) - Replaceall(f_init, "$veclength", buftmp); - else - Replaceall(f_init, "$veclength", "0"); - - Delete(chicken_filename); - Delete(chickentext); - Delete(closprefix); - Delete(overload_parameter_lists); - - Delete(clos_class_defines); - Delete(clos_methods); - Delete(scm_const_defs); - - /* Close all of the files */ - Delete(primitive_names); - Delete(scmmodule); - Dump(f_runtime, f_begin); - Dump(f_header, f_begin); - Dump(f_wrappers, f_begin); - Wrapper_pretty_print(f_init, f_begin); - Delete(f_header); - Delete(f_wrappers); - Delete(f_sym_size); - Delete(f_init); - Delete(f_runtime); - Delete(f_begin); - return SWIG_OK; -} - -int CHICKEN::functionWrapper(Node *n) { - - String *name = Getattr(n, "name"); - String *iname = Getattr(n, "sym:name"); - SwigType *d = Getattr(n, "type"); - ParmList *l = Getattr(n, "parms"); - - Parm *p; - int i; - String *wname; - Wrapper *f; - String *mangle = NewString(""); - String *get_pointers; - String *cleanup; - String *argout; - String *tm; - String *overname = 0; - String *declfunc = 0; - String *scmname; - bool any_specialized_arg = false; - List *function_arg_types = NewList(); - - int num_required; - int num_arguments; - int have_argout; - - Printf(mangle, "\"%s\"", SwigType_manglestr(d)); - - if (Getattr(n, "sym:overloaded")) { - overname = Getattr(n, "sym:overname"); - } else { - if (!addSymbol(iname, n)) - return SWIG_ERROR; - } - - f = NewWrapper(); - wname = NewString(""); - get_pointers = NewString(""); - cleanup = NewString(""); - argout = NewString(""); - declfunc = NewString(""); - scmname = NewString(iname); - Replaceall(scmname, "_", "-"); - - /* Local vars */ - Wrapper_add_local(f, "resultobj", "C_word resultobj"); - - /* Write code to extract function parameters. */ - emit_parameter_variables(l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l, f); - Setattr(n, "wrap:parms", l); - - /* Get number of required and total arguments */ - num_arguments = emit_num_arguments(l); - num_required = emit_num_required(l); - - Append(wname, Swig_name_wrapper(iname)); - if (overname) { - Append(wname, overname); - } - // Check for interrupts - Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); - - Printv(f->def, "static ", "void ", wname, " (C_word argc, C_word closure, C_word continuation", NIL); - Printv(declfunc, "void ", wname, "(C_word,C_word,C_word", NIL); - - /* Generate code for argument marshalling */ - for (i = 0, p = l; i < num_arguments; i++) { - - while (checkAttribute(p, "tmap:in:numinputs", "0")) { - p = Getattr(p, "tmap:in:next"); - } - - SwigType *pt = Getattr(p, "type"); - String *ln = Getattr(p, "lname"); - - Printf(f->def, ", C_word scm%d", i + 1); - Printf(declfunc, ",C_word"); - - /* Look for an input typemap */ - if ((tm = Getattr(p, "tmap:in"))) { - String *parse = Getattr(p, "tmap:in:parse"); - if (!parse) { - String *source = NewStringf("scm%d", i + 1); - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", ln); - Replaceall(tm, "$input", source); - Setattr(p, "emit:input", source); /* Save the location of - the object */ - - if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { - Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); - } else { - Replaceall(tm, "$disown", "0"); - } - - if (i >= num_required) - Printf(get_pointers, "if (argc-2>%i && (%s)) {\n", i, source); - Printv(get_pointers, tm, "\n", NIL); - if (i >= num_required) - Printv(get_pointers, "}\n", NIL); - - if (clos) { - if (i < num_required) { - if (strcmp("void", Char(pt)) != 0) { - Node *class_node = 0; - String *clos_code = Getattr(p, "tmap:in:closcode"); - class_node = classLookup(pt); - if (clos_code && class_node) { - String *class_name = NewStringf("<%s>", Getattr(class_node, "sym:name")); - Replaceall(class_name, "_", "-"); - Append(function_arg_types, class_name); - Append(function_arg_types, Copy(clos_code)); - any_specialized_arg = true; - Delete(class_name); - } else { - Append(function_arg_types, ""); - Append(function_arg_types, "$input"); - } - } - } - } - Delete(source); - } - - p = Getattr(p, "tmap:in:next"); - continue; - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); - break; - } - } - - /* finish argument marshalling */ - - Printf(f->def, ") {"); - Printf(declfunc, ")"); - - if (num_required != num_arguments) { - Append(function_arg_types, "^^##optional$$"); - } - - /* First check the number of arguments is correct */ - if (num_arguments != num_required) - Printf(f->code, "if (argc-2<%i || argc-2>%i) C_bad_argc(argc,%i);\n", num_required, num_arguments, num_required + 2); - else - Printf(f->code, "if (argc!=%i) C_bad_argc(argc,%i);\n", num_arguments + 2, num_arguments + 2); - - /* Now piece together the first part of the wrapper function */ - Printv(f->code, get_pointers, NIL); - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); - Printv(f->code, tm, "\n", NIL); - p = Getattr(p, "tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - for (p = l; p;) { - if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Printv(cleanup, tm, "\n", NIL); - p = Getattr(p, "tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - have_argout = 0; - for (p = l; p;) { - if ((tm = Getattr(p, "tmap:argout"))) { - - if (!have_argout) { - have_argout = 1; - // Print initial argument output code - Printf(argout, "SWIG_Chicken_SetupArgout\n"); - } - - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", "resultobj"); - Replaceall(tm, "$arg", Getattr(p, "emit:input")); - Replaceall(tm, "$input", Getattr(p, "emit:input")); - Printf(argout, "%s", tm); - p = Getattr(p, "tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - Setattr(n, "wrap:name", wname); - - /* Emit the function call */ - String *actioncode = emit_action(n); - - /* Return the function value */ - if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "resultobj"); - Replaceall(tm, "$result", "resultobj"); - if (GetFlag(n, "feature:new")) { - Replaceall(tm, "$owner", "1"); - } else { - Replaceall(tm, "$owner", "0"); - } - - Printf(f->code, "%s", tm); - - if (have_argout) - Printf(f->code, "\nSWIG_APPEND_VALUE(resultobj);\n"); - - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); - } - emit_return_variable(n, d, f); - - /* Insert the argument output code */ - Printv(f->code, argout, NIL); - - /* Output cleanup code */ - Printv(f->code, cleanup, NIL); - - /* Look to see if there is any newfree cleanup code */ - if (GetFlag(n, "feature:new")) { - if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Printf(f->code, "%s\n", tm); - } - } - - /* See if there is any return cleanup code */ - if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Printf(f->code, "%s\n", tm); - } - - - if (have_argout) { - Printf(f->code, "C_kontinue(continuation,C_SCHEME_END_OF_LIST);\n"); - } else { - if (exporting_constructor && clos && hide_primitive) { - /* Don't return a proxy, the wrapped CLOS class is the proxy */ - Printf(f->code, "C_kontinue(continuation,resultobj);\n"); - } else { - // make the continuation the proxy creation function, if one exists - Printv(f->code, "{\n", - "C_word func;\n", - "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", - "if (C_swig_is_closurep(func))\n", - " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", - "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); - } - } - - /* Error handling code */ -#ifdef USE_FAIL - Printf(f->code, "fail:\n"); - Printv(f->code, cleanup, NIL); - Printf(f->code, "swig_panic (\"failure in " "'$symname' SWIG function wrapper\");\n"); -#endif - Printf(f->code, "}\n"); - - /* Substitute the cleanup code */ - Replaceall(f->code, "$cleanup", cleanup); - - /* Substitute the function name */ - Replaceall(f->code, "$symname", iname); - Replaceall(f->code, "$result", "resultobj"); - - /* Dump the function out */ - Printv(f_wrappers, "static ", declfunc, " C_noret;\n", NIL); - Wrapper_print(f, f_wrappers); - - /* Now register the function with the interpreter. */ - if (!Getattr(n, "sym:overloaded")) { - if (exporting_destructor && !no_collection) { - Printf(f_init, "((swig_chicken_clientdata *)(SWIGTYPE%s->clientdata))->destroy = (swig_chicken_destructor) %s;\n", swigtype_ptr, wname); - } else { - addMethod(scmname, wname); - } - - /* Only export if we are not in a class, or if in a class memberfunction */ - if (!in_class || member_name) { - String *method_def; - String *clos_name; - if (in_class) - clos_name = NewString(member_name); - else - clos_name = chickenNameMapping(scmname, ""); - - if (!any_specialized_arg) { - method_def = NewString(""); - Printv(method_def, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")", NIL); - } else { - method_def = buildClosFunctionCall(function_arg_types, clos_name, chickenPrimitiveName(scmname)); - } - Printv(clos_methods, method_def, "\n", NIL); - Delete(clos_name); - Delete(method_def); - } - - if (have_constructor && !has_constructor_args && any_specialized_arg) { - has_constructor_args = 1; - constructor_arg_types = Copy(function_arg_types); - } - } else { - /* add function_arg_types to overload hash */ - List *flist = Getattr(overload_parameter_lists, scmname); - if (!flist) { - flist = NewList(); - Setattr(overload_parameter_lists, scmname, flist); - } - - Append(flist, Copy(function_arg_types)); - - if (!Getattr(n, "sym:nextSibling")) { - dispatchFunction(n); - } - } - - - Delete(wname); - Delete(get_pointers); - Delete(cleanup); - Delete(declfunc); - Delete(mangle); - Delete(function_arg_types); - DelWrapper(f); - return SWIG_OK; -} - -int CHICKEN::variableWrapper(Node *n) { - char *name = GetChar(n, "name"); - char *iname = GetChar(n, "sym:name"); - SwigType *t = Getattr(n, "type"); - ParmList *l = Getattr(n, "parms"); - - String *wname = NewString(""); - String *mangle = NewString(""); - String *tm; - String *tm2 = NewString(""); - String *argnum = NewString("0"); - String *arg = NewString("argv[0]"); - Wrapper *f; - String *overname = 0; - String *scmname; - - scmname = NewString(iname); - Replaceall(scmname, "_", "-"); - - Printf(mangle, "\"%s\"", SwigType_manglestr(t)); - - if (Getattr(n, "sym:overloaded")) { - overname = Getattr(n, "sym:overname"); - } else { - if (!addSymbol(iname, n)) - return SWIG_ERROR; - } - - f = NewWrapper(); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l, f); - Setattr(n, "wrap:parms", l); - - // evaluation function names - Append(wname, Swig_name_wrapper(iname)); - if (overname) { - Append(wname, overname); - } - Setattr(n, "wrap:name", wname); - - // Check for interrupts - Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); - - if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { - - Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); - Printv(f->def, "static " "void ", wname, "(C_word argc, C_word closure, " "C_word continuation, C_word value) {\n", NIL); - - Wrapper_add_local(f, "resultobj", "C_word resultobj"); - - Printf(f->code, "if (argc!=2 && argc!=3) C_bad_argc(argc,2);\n"); - - /* Check for a setting of the variable value */ - if (!GetFlag(n, "feature:immutable")) { - Printf(f->code, "if (argc > 2) {\n"); - if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { - Replaceall(tm, "$source", "value"); - Replaceall(tm, "$target", name); - Replaceall(tm, "$input", "value"); - /* Printv(f->code, tm, "\n",NIL); */ - emit_action_code(n, f->code, tm); - } else { - Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); - } - Printf(f->code, "}\n"); - } - - String *varname; - if (SwigType_istemplate((char *) name)) { - varname = SwigType_namestr((char *) name); - } else { - varname = name; - } - - // Now return the value of the variable - regardless - // of evaluating or setting. - if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$source", varname); - Replaceall(tm, "$varname", varname); - Replaceall(tm, "$target", "resultobj"); - Replaceall(tm, "$result", "resultobj"); - /* Printf(f->code, "%s\n", tm); */ - emit_action_code(n, f->code, tm); - } else { - Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); - } - - Printv(f->code, "{\n", - "C_word func;\n", - "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", - "if (C_swig_is_closurep(func))\n", - " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", - "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); - - /* Error handling code */ -#ifdef USE_FAIL - Printf(f->code, "fail:\n"); - Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); -#endif - Printf(f->code, "}\n"); - - Wrapper_print(f, f_wrappers); - - /* Now register the variable with the interpreter. */ - addMethod(scmname, wname); - - if (!in_class || member_name) { - String *clos_name; - if (in_class) - clos_name = NewString(member_name); - else - clos_name = chickenNameMapping(scmname, ""); - - Node *class_node = classLookup(t); - String *clos_code = Getattr(n, "tmap:varin:closcode"); - if (class_node && clos_code && !GetFlag(n, "feature:immutable")) { - Replaceall(clos_code, "$input", "(car lst)"); - Printv(clos_methods, "(define (", clos_name, " . lst) (if (null? lst) (", chickenPrimitiveName(scmname), ") (", - chickenPrimitiveName(scmname), " ", clos_code, ")))\n", NIL); - } else { - /* Simply re-export the procedure */ - if (GetFlag(n, "feature:immutable") && GetFlag(n, "feature:constasvar")) { - Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); - Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); - } else { - Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); - } - } - Delete(clos_name); - } - } else { - Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); - } - - Delete(wname); - Delete(argnum); - Delete(arg); - Delete(tm2); - Delete(mangle); - DelWrapper(f); - return SWIG_OK; -} - -/* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - -int CHICKEN::constantWrapper(Node *n) { - - char *name = GetChar(n, "name"); - char *iname = GetChar(n, "sym:name"); - SwigType *t = Getattr(n, "type"); - ParmList *l = Getattr(n, "parms"); - String *value = Getattr(n, "value"); - - String *proc_name = NewString(""); - String *wname = NewString(""); - String *mangle = NewString(""); - String *tm; - String *tm2 = NewString(""); - String *source = NewString(""); - String *argnum = NewString("0"); - String *arg = NewString("argv[0]"); - Wrapper *f; - String *overname = 0; - String *scmname; - String *rvalue; - SwigType *nctype; - - scmname = NewString(iname); - Replaceall(scmname, "_", "-"); - - Printf(source, "swig_const_%s", iname); - Replaceall(source, "::", "__"); - - Printf(mangle, "\"%s\"", SwigType_manglestr(t)); - - if (Getattr(n, "sym:overloaded")) { - overname = Getattr(n, "sym:overname"); - } else { - if (!addSymbol(iname, n)) - return SWIG_ERROR; - } - - Append(wname, Swig_name_wrapper(iname)); - if (overname) { - Append(wname, overname); - } - - nctype = NewString(t); - if (SwigType_isconst(nctype)) { - Delete(SwigType_pop(nctype)); - } - - bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); - if (SwigType_type(nctype) == T_STRING) { - rvalue = NewStringf("\"%s\"", value); - } else if (SwigType_type(nctype) == T_CHAR && !is_enum_item) { - rvalue = NewStringf("\'%s\'", value); - } else { - rvalue = NewString(value); - } - - /* Special hook for member pointer */ - if (SwigType_type(t) == T_MPOINTER) { - Printf(f_header, "static %s = %s;\n", SwigType_str(t, source), rvalue); - } else { - if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { - Replaceall(tm, "$source", rvalue); - Replaceall(tm, "$target", source); - Replaceall(tm, "$result", source); - Replaceall(tm, "$value", rvalue); - Printf(f_header, "%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } - } - - f = NewWrapper(); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l, f); - Setattr(n, "wrap:parms", l); - - // evaluation function names - - // Check for interrupts - Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); - - if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { - - Setattr(n, "wrap:name", wname); - Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word) C_noret;\n", NIL); - - Printv(f->def, "static ", "void ", wname, "(C_word argc, C_word closure, " "C_word continuation) {\n", NIL); - - Wrapper_add_local(f, "resultobj", "C_word resultobj"); - - Printf(f->code, "if (argc!=2) C_bad_argc(argc,2);\n"); - - // Return the value of the variable - if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - - Replaceall(tm, "$source", source); - Replaceall(tm, "$varname", source); - Replaceall(tm, "$target", "resultobj"); - Replaceall(tm, "$result", "resultobj"); - /* Printf(f->code, "%s\n", tm); */ - emit_action_code(n, f->code, tm); - } else { - Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); - } - - Printv(f->code, "{\n", - "C_word func;\n", - "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", - "if (C_swig_is_closurep(func))\n", - " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", - "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); - - /* Error handling code */ -#ifdef USE_FAIL - Printf(f->code, "fail:\n"); - Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); -#endif - Printf(f->code, "}\n"); - - Wrapper_print(f, f_wrappers); - - /* Now register the variable with the interpreter. */ - addMethod(scmname, wname); - - if (!in_class || member_name) { - String *clos_name; - if (in_class) - clos_name = NewString(member_name); - else - clos_name = chickenNameMapping(scmname, ""); - if (GetFlag(n, "feature:constasvar")) { - Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); - Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); - } else { - Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); - } - Delete(clos_name); - } - - } else { - Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); - } - - Delete(wname); - Delete(nctype); - Delete(proc_name); - Delete(argnum); - Delete(arg); - Delete(tm2); - Delete(mangle); - Delete(source); - Delete(rvalue); - DelWrapper(f); - return SWIG_OK; -} - -int CHICKEN::classHandler(Node *n) { - /* Create new strings for building up a wrapper function */ - have_constructor = 0; - constructor_dispatch = 0; - constructor_name = 0; - - c_class_name = NewString(Getattr(n, "sym:name")); - class_name = NewString(""); - short_class_name = NewString(""); - Printv(class_name, "<", c_class_name, ">", NIL); - Printv(short_class_name, c_class_name, NIL); - Replaceall(class_name, "_", "-"); - Replaceall(short_class_name, "_", "-"); - - if (!addSymbol(class_name, n)) - return SWIG_ERROR; - - /* Handle inheritance */ - String *base_class = NewString(""); - List *baselist = Getattr(n, "bases"); - if (baselist && Len(baselist)) { - Iterator base = First(baselist); - while (base.item) { - if (!Getattr(base.item, "feature:ignore")) - Printv(base_class, "<", Getattr(base.item, "sym:name"), "> ", NIL); - base = Next(base); - } - } - - Replaceall(base_class, "_", "-"); - - String *scmmod = NewString(module); - Replaceall(scmmod, "_", "-"); - - Printv(clos_class_defines, "(define ", class_name, "\n", " (make 'name \"", short_class_name, "\"\n", NIL); - Delete(scmmod); - - if (Len(base_class)) { - Printv(clos_class_defines, " 'direct-supers (list ", base_class, ")\n", NIL); - } else { - Printv(clos_class_defines, " 'direct-supers (list )\n", NIL); - } - - Printf(clos_class_defines, " 'direct-slots (list 'swig-this\n"); - - String *mangled_classname = Swig_name_mangle(Getattr(n, "sym:name")); - - SwigType *ct = NewStringf("p.%s", Getattr(n, "name")); - swigtype_ptr = SwigType_manglestr(ct); - - Printf(f_runtime, "static swig_chicken_clientdata _swig_chicken_clientdata%s = { 0 };\n", mangled_classname); - Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", swigtype_ptr, ", (void *) &_swig_chicken_clientdata", mangled_classname, ");\n", NIL); - SwigType_remember(ct); - - /* Emit all of the members */ - - in_class = 1; - Language::classHandler(n); - in_class = 0; - - Printf(clos_class_defines, ")))\n\n"); - - if (have_constructor) { - Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs ", NIL); - if (constructor_arg_types) { - String *initfunc_name = NewStringf("%s@@SWIG@initmethod", class_name); - String *func_call = buildClosFunctionCall(constructor_arg_types, initfunc_name, chickenPrimitiveName(constructor_name)); - Printf(clos_methods, "%s)\n)\n", initfunc_name); - Printf(clos_methods, "(declare (hide %s))\n", initfunc_name); - Printf(clos_methods, "%s\n", func_call); - Delete(func_call); - Delete(initfunc_name); - Delete(constructor_arg_types); - constructor_arg_types = 0; - } else if (constructor_dispatch) { - Printf(clos_methods, "%s)\n)\n", constructor_dispatch); - Delete(constructor_dispatch); - constructor_dispatch = 0; - } else { - Printf(clos_methods, "%s)\n)\n", chickenPrimitiveName(constructor_name)); - } - Delete(constructor_name); - constructor_name = 0; - } else { - Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs (lambda x #f)))\n", NIL); - } - - /* export class initialization function */ - if (clos) { - String *funcname = NewString(mangled_classname); - Printf(funcname, "_swig_chicken_setclosclass"); - String *closfuncname = NewString(funcname); - Replaceall(closfuncname, "_", "-"); - - Printv(f_wrappers, "static void ", funcname, "(C_word,C_word,C_word,C_word) C_noret;\n", - "static void ", funcname, "(C_word argc, C_word closure, C_word continuation, C_word cl) {\n", - " C_trace(\"", funcname, "\");\n", - " if (argc!=3) C_bad_argc(argc,3);\n", - " swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) SWIGTYPE", swigtype_ptr, "->clientdata;\n", - " cdata->gc_proxy_create = CHICKEN_new_gc_root();\n", - " CHICKEN_gc_root_set(cdata->gc_proxy_create, cl);\n", " C_kontinue(continuation, C_SCHEME_UNDEFINED);\n", "}\n", NIL); - addMethod(closfuncname, funcname); - - Printv(clos_methods, "(", chickenPrimitiveName(closfuncname), " (lambda (x lst) (if lst ", - "(cons (make ", class_name, " 'swig-this x) lst) ", "(make ", class_name, " 'swig-this x))))\n\n", NIL); - Delete(closfuncname); - Delete(funcname); - } - - Delete(mangled_classname); - Delete(swigtype_ptr); - swigtype_ptr = 0; - - Delete(class_name); - Delete(short_class_name); - Delete(c_class_name); - class_name = 0; - short_class_name = 0; - c_class_name = 0; - - return SWIG_OK; -} - -int CHICKEN::memberfunctionHandler(Node *n) { - String *iname = Getattr(n, "sym:name"); - String *proc = NewString(iname); - Replaceall(proc, "_", "-"); - - member_name = chickenNameMapping(proc, short_class_name); - Language::memberfunctionHandler(n); - Delete(member_name); - member_name = NULL; - Delete(proc); - - return SWIG_OK; -} - -int CHICKEN::staticmemberfunctionHandler(Node *n) { - String *iname = Getattr(n, "sym:name"); - String *proc = NewString(iname); - Replaceall(proc, "_", "-"); - - member_name = NewStringf("%s-%s", short_class_name, proc); - Language::staticmemberfunctionHandler(n); - Delete(member_name); - member_name = NULL; - Delete(proc); - - return SWIG_OK; -} - -int CHICKEN::membervariableHandler(Node *n) { - String *iname = Getattr(n, "sym:name"); - //String *pb = SwigType_typedef_resolve_all(SwigType_base(Getattr(n, "type"))); - - Language::membervariableHandler(n); - - String *proc = NewString(iname); - Replaceall(proc, "_", "-"); - - //Node *class_node = Swig_symbol_clookup(pb, Getattr(n, "sym:symtab")); - Node *class_node = classLookup(Getattr(n, "type")); - - //String *getfunc = NewStringf("%s-%s-get", short_class_name, proc); - //String *setfunc = NewStringf("%s-%s-set", short_class_name, proc); - String *getfunc = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); - Replaceall(getfunc, "_", "-"); - String *setfunc = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); - Replaceall(setfunc, "_", "-"); - - Printv(clos_class_defines, " (list '", proc, " ':swig-virtual ':swig-get ", chickenPrimitiveName(getfunc), NIL); - - if (!GetFlag(n, "feature:immutable")) { - if (class_node) { - Printv(clos_class_defines, " ':swig-set (lambda (x y) (", chickenPrimitiveName(setfunc), " x (slot-ref y 'swig-this))))\n", NIL); - } else { - Printv(clos_class_defines, " ':swig-set ", chickenPrimitiveName(setfunc), ")\n", NIL); - } - } else { - Printf(clos_class_defines, ")\n"); - } - - Delete(proc); - Delete(setfunc); - Delete(getfunc); - return SWIG_OK; -} - -int CHICKEN::staticmembervariableHandler(Node *n) { - String *iname = Getattr(n, "sym:name"); - String *proc = NewString(iname); - Replaceall(proc, "_", "-"); - - member_name = NewStringf("%s-%s", short_class_name, proc); - Language::staticmembervariableHandler(n); - Delete(member_name); - member_name = NULL; - Delete(proc); - - return SWIG_OK; -} - -int CHICKEN::constructorHandler(Node *n) { - have_constructor = 1; - has_constructor_args = 0; - - - exporting_constructor = true; - Language::constructorHandler(n); - exporting_constructor = false; - - has_constructor_args = 1; - - String *iname = Getattr(n, "sym:name"); - constructor_name = Swig_name_construct(NSPACE_TODO, iname); - Replaceall(constructor_name, "_", "-"); - return SWIG_OK; -} - -int CHICKEN::destructorHandler(Node *n) { - - if (no_collection) - member_name = NewStringf("delete-%s", short_class_name); - - exporting_destructor = true; - Language::destructorHandler(n); - exporting_destructor = false; - - if (no_collection) { - Delete(member_name); - member_name = NULL; - } - - return SWIG_OK; -} - -int CHICKEN::importDirective(Node *n) { - String *modname = Getattr(n, "module"); - if (modname && clos_uses) { - - // Find the module node for this imported module. It should be the - // first child but search just in case. - Node *mod = firstChild(n); - while (mod && Strcmp(nodeType(mod), "module") != 0) - mod = nextSibling(mod); - - if (mod) { - String *name = Getattr(mod, "name"); - if (name) { - Printf(closprefix, "(declare (uses %s))\n", name); - } - } - } - - return Language::importDirective(n); -} - -String *CHICKEN::buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname) { - String *method_signature = NewString(""); - String *func_args = NewString(""); - String *func_call = NewString(""); - - Iterator arg_type; - int arg_count = 0; - int optional_arguments = 0; - - for (arg_type = First(types); arg_type.item; arg_type = Next(arg_type)) { - if (Strcmp(arg_type.item, "^^##optional$$") == 0) { - optional_arguments = 1; - } else { - Printf(method_signature, " (arg%i %s)", arg_count, arg_type.item); - arg_type = Next(arg_type); - if (!arg_type.item) - break; - - String *arg = NewStringf("arg%i", arg_count); - String *access_arg = Copy(arg_type.item); - - Replaceall(access_arg, "$input", arg); - Printf(func_args, " %s", access_arg); - - Delete(arg); - Delete(access_arg); - } - arg_count++; - } - - if (optional_arguments) { - Printf(func_call, "(define-method (%s %s . args) (apply %s %s args))", closname, method_signature, funcname, func_args); - } else { - Printf(func_call, "(define-method (%s %s) (%s %s))", closname, method_signature, funcname, func_args); - } - - Delete(method_signature); - Delete(func_args); - - return func_call; -} - -extern "C" { - - /* compares based on non-primitive names */ - static int compareTypeListsHelper(const DOH *a, const DOH *b, int opt_equal) { - List *la = (List *) a; - List *lb = (List *) b; - - Iterator ia = First(la); - Iterator ib = First(lb); - - while (ia.item && ib.item) { - int ret = Strcmp(ia.item, ib.item); - if (ret) - return ret; - ia = Next(Next(ia)); - ib = Next(Next(ib)); - } if (opt_equal && ia.item && Strcmp(ia.item, "^^##optional$$") == 0) - return 0; - if (ia.item) - return -1; - if (opt_equal && ib.item && Strcmp(ib.item, "^^##optional$$") == 0) - return 0; - if (ib.item) - return 1; - - return 0; - } - - static int compareTypeLists(const DOH *a, const DOH *b) { - return compareTypeListsHelper(a, b, 0); - } -} - -void CHICKEN::dispatchFunction(Node *n) { - /* Last node in overloaded chain */ - - int maxargs; - String *tmp = NewString(""); - String *dispatch = Swig_overload_dispatch(n, "%s (2+$numargs,closure," "continuation$commaargs);", &maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *f = NewWrapper(); - String *iname = Getattr(n, "sym:name"); - String *wname = NewString(""); - String *scmname = NewString(iname); - Replaceall(scmname, "_", "-"); - - Append(wname, Swig_name_wrapper(iname)); - - Printv(f->def, "static void real_", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); - - Printv(f->def, "static void real_", wname, "(C_word oldargc, C_word closure, C_word continuation, C_word args) {", NIL); - - Wrapper_add_local(f, "argc", "int argc"); - Printf(tmp, "C_word argv[%d]", maxargs + 1); - Wrapper_add_local(f, "argv", tmp); - Wrapper_add_local(f, "ii", "int ii"); - Wrapper_add_local(f, "t", "C_word t = args"); - Printf(f->code, "if (!C_swig_is_list (args)) {\n"); - Printf(f->code, " swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, " "\"Argument #1 must be a list of overloaded arguments\");\n"); - Printf(f->code, "}\n"); - Printf(f->code, "argc = C_unfix (C_i_length (args));\n"); - Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++, t = C_block_item (t, 1)) {\n", maxargs); - Printf(f->code, "argv[ii] = C_block_item (t, 0);\n"); - Printf(f->code, "}\n"); - - Printv(f->code, dispatch, "\n", NIL); - Printf(f->code, "swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE," "\"No matching function for overloaded '%s'\");\n", iname); - Printv(f->code, "}\n", NIL); - Wrapper_print(f, f_wrappers); - addMethod(scmname, wname); - - DelWrapper(f); - f = NewWrapper(); - - /* varargs */ - Printv(f->def, "void ", wname, "(C_word, C_word, C_word, ...) C_noret;\n", NIL); - Printv(f->def, "void ", wname, "(C_word c, C_word t0, C_word t1, ...) {", NIL); - Printv(f->code, - "C_word t2;\n", - "va_list v;\n", - "C_word *a, c2 = c;\n", - "C_save_rest (t1, c2, 2);\n", "a = C_alloc((c-2)*3);\n", "t2 = C_restore_rest (a, C_rest_count (0));\n", "real_", wname, " (3, t0, t1, t2);\n", NIL); - Printv(f->code, "}\n", NIL); - Wrapper_print(f, f_wrappers); - - /* Now deal with overloaded function when exporting clos */ - if (clos) { - List *flist = Getattr(overload_parameter_lists, scmname); - if (flist) { - Delattr(overload_parameter_lists, scmname); - - SortList(flist, compareTypeLists); - - String *clos_name; - if (have_constructor && !has_constructor_args) { - has_constructor_args = 1; - constructor_dispatch = NewStringf("%s@SWIG@new@dispatch", short_class_name); - clos_name = Copy(constructor_dispatch); - Printf(clos_methods, "(declare (hide %s))\n", clos_name); - } else if (in_class) - clos_name = NewString(member_name); - else - clos_name = chickenNameMapping(scmname, ""); - - Iterator f; - List *prev = 0; - int all_primitive = 1; - - /* first check for duplicates and an empty call */ - String *newlist = NewList(); - for (f = First(flist); f.item; f = Next(f)) { - /* check if cur is a duplicate of prev */ - if (prev && compareTypeListsHelper(f.item, prev, 1) == 0) { - Delete(f.item); - } else { - Append(newlist, f.item); - prev = f.item; - Iterator j; - for (j = First(f.item); j.item; j = Next(j)) { - if (Strcmp(j.item, "^^##optional$$") != 0 && Strcmp(j.item, "") != 0) - all_primitive = 0; - } - } - } - Delete(flist); - flist = newlist; - - if (all_primitive) { - Printf(clos_methods, "(define %s %s)\n", clos_name, chickenPrimitiveName(scmname)); - } else { - for (f = First(flist); f.item; f = Next(f)) { - /* now export clos code for argument */ - String *func_call = buildClosFunctionCall(f.item, clos_name, chickenPrimitiveName(scmname)); - Printf(clos_methods, "%s\n", func_call); - Delete(f.item); - Delete(func_call); - } - } - - Delete(clos_name); - Delete(flist); - } - } - - DelWrapper(f); - Delete(dispatch); - Delete(tmp); - Delete(wname); -} - -int CHICKEN::isPointer(SwigType *t) { - return SwigType_ispointer(SwigType_typedef_resolve_all(t)); -} - -void CHICKEN::addMethod(String *scheme_name, String *function) { - String *sym = NewString(""); - if (clos) { - Append(sym, "primitive:"); - } - Append(sym, scheme_name); - - /* add symbol to Chicken internal symbol table */ - if (hide_primitive) { - Printv(f_init, "{\n", - " C_word *p0 = a;\n", " *(a++)=C_CLOSURE_TYPE|1;\n", " *(a++)=(C_word)", function, ";\n", " C_mutate(return_vec++, (C_word)p0);\n", "}\n", NIL); - } else { - Printf(f_sym_size, "+C_SIZEOF_INTERNED_SYMBOL(%d)", Len(sym)); - Printf(f_init, "sym = C_intern (&a, %d, \"%s\");\n", Len(sym), sym); - Printv(f_init, "C_mutate ((C_word*)sym+1, (*a=C_CLOSURE_TYPE|1, a[1]=(C_word)", function, ", tmp=(C_word)a, a+=2, tmp));\n", NIL); - } - - if (hide_primitive) { - Setattr(primitive_names, scheme_name, NewStringf("(vector-ref swig-init-return %i)", num_methods)); - } else { - Setattr(primitive_names, scheme_name, Copy(sym)); - } - - num_methods++; - - Delete(sym); -} - -String *CHICKEN::chickenPrimitiveName(String *name) { - String *value = Getattr(primitive_names, name); - if (value) - return value; - else { - Swig_error(input_file, line_number, "Internal Error: attempting to reference non-existent primitive name %s\n", name); - return NewString("#f"); - } -} - -int CHICKEN::validIdentifier(String *s) { - char *c = Char(s); - /* Check whether we have an R5RS identifier. */ - /* --> * | */ - /* --> | */ - if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~'))) { - /* --> + | - | ... */ - if ((strcmp(c, "+") == 0) - || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) - return 1; - else - return 0; - } - /* --> | | */ - while (*c) { - if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') - || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') - || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') - || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') - || (*c == '-') || (*c == '.') || (*c == '@'))) - return 0; - c++; - } - return 1; -} - - /* ------------------------------------------------------------ - * closNameMapping() - * Maps the identifier from C++ to the CLOS based on command - * line parameters and such. - * If class_name = "" that means the mapping is for a function or - * variable not attached to any class. - * ------------------------------------------------------------ */ -String *CHICKEN::chickenNameMapping(String *name, const_String_or_char_ptr class_name) { - String *n = NewString(""); - - if (Strcmp(class_name, "") == 0) { - // not part of a class, so no class name to prefix - if (clossymnameprefix) { - Printf(n, "%s%s", clossymnameprefix, name); - } else { - Printf(n, "%s", name); - } - } else { - if (useclassprefix) { - Printf(n, "%s-%s", class_name, name); - } else { - if (clossymnameprefix) { - Printf(n, "%s%s", clossymnameprefix, name); - } else { - Printf(n, "%s", name); - } - } - } - return n; -} - -String *CHICKEN::runtimeCode() { - String *s = Swig_include_sys("chickenrun.swg"); - if (!s) { - Printf(stderr, "*** Unable to open 'chickenrun.swg'\n"); - s = NewString(""); - } - return s; -} - -String *CHICKEN::defaultExternalRuntimeFilename() { - return NewString("swigchickenrun.h"); -} diff --git a/Source/Modules/clisp.cxx b/Source/Modules/clisp.cxx deleted file mode 100644 index d7f197197..000000000 --- a/Source/Modules/clisp.cxx +++ /dev/null @@ -1,515 +0,0 @@ -/* ----------------------------------------------------------------------------- - * This file is part of SWIG, which is licensed as a whole under version 3 - * (or any later version) of the GNU General Public License. Some additional - * terms also apply to certain portions of SWIG. The full details of the SWIG - * license and copyrights can be found in the LICENSE and COPYRIGHT files - * included with the SWIG source code as distributed by the SWIG developers - * and at http://www.swig.org/legal.html. - * - * clisp.cxx - * - * clisp language module for SWIG. - * ----------------------------------------------------------------------------- */ - -#include "swigmod.h" - -static const char *usage = "\ -CLISP Options (available with -clisp)\n\ - -extern-all - Create clisp definitions for all the functions and\n\ - global variables otherwise only definitions for\n\ - externed functions and variables are created.\n\ - -generate-typedef - Use def-c-type to generate shortcuts according to the\n\ - typedefs in the input.\n\ -"; - -class CLISP:public Language { -public: - File *f_cl; - String *module; - virtual void main(int argc, char *argv[]); - virtual int top(Node *n); - virtual int functionWrapper(Node *n); - virtual int variableWrapper(Node *n); - virtual int constantWrapper(Node *n); - virtual int classDeclaration(Node *n); - virtual int enumDeclaration(Node *n); - virtual int typedefHandler(Node *n); - List *entries; -private: - String *get_ffi_type(Node *n, SwigType *ty); - String *convert_literal(String *num_param, String *type); - String *strip_parens(String *string); - int extern_all_flag; - int generate_typedef_flag; - int is_function; -}; - -void CLISP::main(int argc, char *argv[]) { - int i; - - Preprocessor_define("SWIGCLISP 1", 0); - SWIG_library_directory("clisp"); - SWIG_config_file("clisp.swg"); - generate_typedef_flag = 0; - extern_all_flag = 0; - - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-help")) { - Printf(stdout, "%s\n", usage); - } else if ((Strcmp(argv[i], "-extern-all") == 0)) { - extern_all_flag = 1; - Swig_mark_arg(i); - } else if ((Strcmp(argv[i], "-generate-typedef") == 0)) { - generate_typedef_flag = 1; - Swig_mark_arg(i); - } - } -} - -int CLISP::top(Node *n) { - - File *f_null = NewString(""); - module = Getattr(n, "name"); - String *output_filename; - entries = NewList(); - - /* Get the output file name */ - String *outfile = Getattr(n, "outfile"); - - if (!outfile) { - Printf(stderr, "Unable to determine outfile\n"); - SWIG_exit(EXIT_FAILURE); - } - - output_filename = NewStringf("%s%s.lisp", SWIG_output_directory(), module); - - f_cl = NewFile(output_filename, "w+", SWIG_output_files()); - if (!f_cl) { - FileErrorDisplay(output_filename); - SWIG_exit(EXIT_FAILURE); - } - - Swig_register_filebyname("header", f_null); - Swig_register_filebyname("begin", f_null); - Swig_register_filebyname("runtime", f_null); - Swig_register_filebyname("wrapper", f_null); - - String *header = NewString(""); - - Swig_banner_target_lang(header, ";;"); - - Printf(header, "\n(defpackage :%s\n (:use :common-lisp :ffi)", module); - - Language::top(n); - - Iterator i; - - long len = Len(entries); - if (len > 0) { - Printf(header, "\n (:export"); - } - //else nothing to export - - for (i = First(entries); i.item; i = Next(i)) { - Printf(header, "\n\t:%s", i.item); - } - - if (len > 0) { - Printf(header, ")"); - } - - Printf(header, ")\n"); - Printf(header, "\n(in-package :%s)\n", module); - Printf(header, "\n(default-foreign-language :stdc)\n"); - - len = Tell(f_cl); - - Printf(f_cl, "%s", header); - - long end = Tell(f_cl); - - for (len--; len >= 0; len--) { - end--; - (void)Seek(f_cl, len, SEEK_SET); - int ch = Getc(f_cl); - (void)Seek(f_cl, end, SEEK_SET); - Putc(ch, f_cl); - } - - Seek(f_cl, 0, SEEK_SET); - Write(f_cl, Char(header), Len(header)); - - Delete(f_cl); - - return SWIG_OK; -} - - -int CLISP::functionWrapper(Node *n) { - is_function = 1; - String *storage = Getattr(n, "storage"); - if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) - return SWIG_OK; - - String *func_name = Getattr(n, "sym:name"); - - ParmList *pl = Getattr(n, "parms"); - - int argnum = 0, first = 1; - - Printf(f_cl, "\n(ffi:def-call-out %s\n\t(:name \"%s\")\n", func_name, func_name); - - Append(entries, func_name); - - if (ParmList_len(pl) != 0) { - Printf(f_cl, "\t(:arguments "); - } - for (Parm *p = pl; p; p = nextSibling(p), argnum++) { - - String *argname = Getattr(p, "name"); - // SwigType *argtype; - - String *ffitype = get_ffi_type(n, Getattr(p, "type")); - - int tempargname = 0; - - if (!argname) { - argname = NewStringf("arg%d", argnum); - tempargname = 1; - } - - if (!first) { - Printf(f_cl, "\n\t\t"); - } - Printf(f_cl, "(%s %s)", argname, ffitype); - first = 0; - - Delete(ffitype); - - if (tempargname) - Delete(argname); - } - if (ParmList_len(pl) != 0) { - Printf(f_cl, ")\n"); /* finish arg list */ - } - String *ffitype = get_ffi_type(n, Getattr(n, "type")); - if (Strcmp(ffitype, "NIL")) { //when return type is not nil - Printf(f_cl, "\t(:return-type %s)\n", ffitype); - } - Printf(f_cl, "\t(:library +library-name+))\n"); - - return SWIG_OK; -} - - -int CLISP::constantWrapper(Node *n) { - is_function = 0; - String *type = Getattr(n, "type"); - String *converted_value = convert_literal(Getattr(n, "value"), type); - String *name = Getattr(n, "sym:name"); - - Printf(f_cl, "\n(defconstant %s %s)\n", name, converted_value); - Append(entries, name); - Delete(converted_value); - - return SWIG_OK; -} - -int CLISP::variableWrapper(Node *n) { - is_function = 0; - String *storage = Getattr(n, "storage"); - - if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) - return SWIG_OK; - - String *var_name = Getattr(n, "sym:name"); - String *lisp_type = get_ffi_type(n, Getattr(n, "type")); - Printf(f_cl, "\n(ffi:def-c-var %s\n (:name \"%s\")\n (:type %s)\n", var_name, var_name, lisp_type); - Printf(f_cl, "\t(:library +library-name+))\n"); - Append(entries, var_name); - - Delete(lisp_type); - return SWIG_OK; -} - -int CLISP::typedefHandler(Node *n) { - if (generate_typedef_flag) { - is_function = 0; - Printf(f_cl, "\n(ffi:def-c-type %s %s)\n", Getattr(n, "name"), get_ffi_type(n, Getattr(n, "type"))); - } - - return Language::typedefHandler(n); -} - -int CLISP::enumDeclaration(Node *n) { - if (getCurrentClass() && (cplus_mode != PUBLIC)) - return SWIG_NOWRAP; - - is_function = 0; - String *name = Getattr(n, "sym:name"); - - Printf(f_cl, "\n(ffi:def-c-enum %s ", name); - - for (Node *c = firstChild(n); c; c = nextSibling(c)) { - - String *slot_name = Getattr(c, "name"); - String *value = Getattr(c, "enumvalue"); - - Printf(f_cl, "(%s %s)", slot_name, value); - - Append(entries, slot_name); - - Delete(value); - } - - Printf(f_cl, ")\n"); - return SWIG_OK; -} - - -// Includes structs -int CLISP::classDeclaration(Node *n) { - is_function = 0; - String *name = Getattr(n, "sym:name"); - String *kind = Getattr(n, "kind"); - - if (Strcmp(kind, "struct")) { - Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); - Printf(stderr, " (name: %s)\n", name); - SWIG_exit(EXIT_FAILURE); - } - - - Printf(f_cl, "\n(ffi:def-c-struct %s", name); - - Append(entries, NewStringf("make-%s", name)); - - for (Node *c = firstChild(n); c; c = nextSibling(c)) { - - if (Strcmp(nodeType(c), "cdecl")) { - Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); - Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); - SWIG_exit(EXIT_FAILURE); - } - - String *temp = Copy(Getattr(c, "decl")); - if (temp) { - Append(temp, Getattr(c, "type")); //appending type to the end, otherwise wrong type - String *lisp_type = get_ffi_type(n, temp); - Delete(temp); - - String *slot_name = Getattr(c, "sym:name"); - Printf(f_cl, "\n\t(%s %s)", slot_name, lisp_type); - - Append(entries, NewStringf("%s-%s", name, slot_name)); - - Delete(lisp_type); - } - } - - Printf(f_cl, ")\n"); - - /* Add this structure to the known lisp types */ - //Printf(stdout, "Adding %s foreign type\n", name); - // add_defined_foreign_type(name); - - return SWIG_OK; -} - -/* utilities */ -/* returns new string w/ parens stripped */ -String *CLISP::strip_parens(String *string) { - char *s = Char(string), *p; - int len = Len(string); - String *res; - - if (len == 0 || s[0] != '(' || s[len - 1] != ')') { - return NewString(string); - } - - p = (char *) malloc(len - 2 + 1); - if (!p) { - Printf(stderr, "Malloc failed\n"); - SWIG_exit(EXIT_FAILURE); - } - - strncpy(p, s + 1, len - 1); - p[len - 2] = 0; /* null terminate */ - - res = NewString(p); - free(p); - - return res; -} - -String *CLISP::convert_literal(String *num_param, String *type) { - String *num = strip_parens(num_param), *res; - char *s = Char(num); - - /* Make sure doubles use 'd' instead of 'e' */ - if (!Strcmp(type, "double")) { - String *updated = Copy(num); - if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { - Printf(stderr, "Weird!! number %s looks invalid.\n", num); - SWIG_exit(EXIT_FAILURE); - } - Delete(num); - return updated; - } - - if (SwigType_type(type) == T_CHAR) { - /* Use CL syntax for character literals */ - return NewStringf("#\\%s", num_param); - } else if (SwigType_type(type) == T_STRING) { - /* Use CL syntax for string literals */ - return NewStringf("\"%s\"", num_param); - } - - if (Len(num) < 2 || s[0] != '0') { - return num; - } - - /* octal or hex */ - - res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); - Delete(num); - - return res; -} - -String *CLISP::get_ffi_type(Node *n, SwigType *ty) { - Node *node = NewHash(); - Setattr(node, "type", ty); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *tm = Swig_typemap_lookup("in", node, "", 0); - Delete(node); - - if (tm) { - return NewString(tm); - } else if (SwigType_ispointer(ty)) { - SwigType *cp = Copy(ty); - SwigType_del_pointer(cp); - String *inner_type = get_ffi_type(n, cp); - - if (SwigType_isfunction(cp)) { - return inner_type; - } - - SwigType *base = SwigType_base(ty); - String *base_name = SwigType_str(base, 0); - - String *str; - if (!Strcmp(base_name, "int") || !Strcmp(base_name, "float") || !Strcmp(base_name, "short") - || !Strcmp(base_name, "double") || !Strcmp(base_name, "long") || !Strcmp(base_name, "char")) { - - str = NewStringf("(ffi:c-ptr %s)", inner_type); - } else { - str = NewStringf("(ffi:c-pointer %s)", inner_type); - } - Delete(base_name); - Delete(base); - Delete(cp); - Delete(inner_type); - return str; - } else if (SwigType_isarray(ty)) { - SwigType *cp = Copy(ty); - String *array_dim = SwigType_array_getdim(ty, 0); - - if (!Strcmp(array_dim, "")) { //dimension less array convert to pointer - Delete(array_dim); - SwigType_del_array(cp); - SwigType_add_pointer(cp); - String *str = get_ffi_type(n, cp); - Delete(cp); - return str; - } else { - SwigType_pop_arrays(cp); - String *inner_type = get_ffi_type(n, cp); - Delete(cp); - - int ndim = SwigType_array_ndim(ty); - String *dimension; - if (ndim == 1) { - dimension = array_dim; - } else { - dimension = array_dim; - for (int i = 1; i < ndim; i++) { - array_dim = SwigType_array_getdim(ty, i); - Append(dimension, " "); - Append(dimension, array_dim); - Delete(array_dim); - } - String *temp = dimension; - dimension = NewStringf("(%s)", dimension); - Delete(temp); - } - String *str; - if (is_function) - str = NewStringf("(ffi:c-ptr (ffi:c-array %s %s))", inner_type, dimension); - else - str = NewStringf("(ffi:c-array %s %s)", inner_type, dimension); - - Delete(inner_type); - Delete(dimension); - return str; - } - } else if (SwigType_isfunction(ty)) { - SwigType *cp = Copy(ty); - SwigType *fn = SwigType_pop_function(cp); - String *args = NewString(""); - ParmList *pl = SwigType_function_parms(fn, n); - if (ParmList_len(pl) != 0) { - Printf(args, "(:arguments "); - } - int argnum = 0, first = 1; - for (Parm *p = pl; p; p = nextSibling(p), argnum++) { - String *argname = Getattr(p, "name"); - SwigType *argtype = Getattr(p, "type"); - String *ffitype = get_ffi_type(n, argtype); - - int tempargname = 0; - - if (!argname) { - argname = NewStringf("arg%d", argnum); - tempargname = 1; - } - if (!first) { - Printf(args, "\n\t\t"); - } - Printf(args, "(%s %s)", argname, ffitype); - first = 0; - Delete(ffitype); - if (tempargname) - Delete(argname); - } - if (ParmList_len(pl) != 0) { - Printf(args, ")\n"); /* finish arg list */ - } - String *ffitype = get_ffi_type(n, cp); - String *str = NewStringf("(ffi:c-function %s \t\t\t\t(:return-type %s))", args, ffitype); - Delete(fn); - Delete(args); - Delete(cp); - Delete(ffitype); - return str; - } - String *str = SwigType_str(ty, 0); - if (str) { - char *st = Strstr(str, "struct"); - if (st) { - st += 7; - return NewString(st); - } - char *cl = Strstr(str, "class"); - if (cl) { - cl += 6; - return NewString(cl); - } - } - return str; -} - -extern "C" Language *swig_clisp(void) { - return new CLISP(); -} diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index 76ec6a4fb..edb79e13e 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -901,8 +901,6 @@ public: // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { canThrow(n, "in", p); - Replaceall(tm, "$source", arg); /* deprecated */ - Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); @@ -921,7 +919,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { canThrow(n, "check", p); - Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); @@ -935,7 +932,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { canThrow(n, "freearg", p); - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); @@ -949,8 +945,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { canThrow(n, "argout", p); - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ - Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -982,8 +976,6 @@ public: /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { canThrow(n, "out", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ - Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) @@ -1011,7 +1003,6 @@ public: if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { canThrow(n, "newfree", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } @@ -1020,7 +1011,6 @@ public: if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { canThrow(n, "ret", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } @@ -1533,7 +1523,7 @@ public: if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) - Printf(constants_code, "(%s)%s.%s();\n", return_type, full_imclass_name, Swig_name_get(getNSpace(), symname)); + Printf(constants_code, "(%s)%s.%s();\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); @@ -1709,11 +1699,11 @@ public: * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ - void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { + void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, SwigType *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); - String *c_baseclass = SwigType_namestr(Getattr(base, "name")); + SwigType *c_baseclassname = Getattr(base, "name"); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); @@ -1733,12 +1723,11 @@ public: Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); - Delete(c_baseclass); } Delete(keys); } @@ -1749,7 +1738,7 @@ public: * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ - void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { + void upcastsCode(SwigType *smart, String *upcast_method_name, SwigType *c_classname, SwigType *c_baseclassname) { String *wname = Swig_name_wrapper(upcast_method_name); Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); @@ -1757,28 +1746,35 @@ public: Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); + String *classname = SwigType_namestr(c_classname); + String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { - SwigType *bsmart = Copy(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); - Replaceall(bsmart, rclassname, rbaseclass); - Delete(rclassname); - Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); - String *bsmartnamestr = SwigType_namestr(bsmart); + String *bsmartnamestr = SwigType_namestr(smart); + + // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates + SwigType *rclassname = SwigType_typedef_resolve_all(classname); + SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); + Replaceall(bsmartnamestr, rclassname, rbaseclassname); + Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n", " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n" "}\n", "\n", NIL); + + Delete(rbaseclassname); + Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); - Delete(bsmart); } else { Printv(upcasts_code, - "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n", - " return (", c_baseclass, " *)jarg1;\n" + "SWIGEXPORT ", baseclassname, " * SWIGSTDCALL ", wname, "(", classname, " *jarg1) {\n", + " return (", baseclassname, " *)jarg1;\n" "}\n", "\n", NIL); } + + Delete(baseclassname); + Delete(classname); Delete(wname); } @@ -1787,10 +1783,9 @@ public: * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { - String *c_classname = SwigType_namestr(Getattr(n, "name")); - String *c_baseclass = NULL; + SwigType *c_classname = Getattr(n, "name"); + SwigType *c_baseclassname = NULL; String *baseclass = NULL; - String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); @@ -1812,12 +1807,13 @@ public: Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { - String *baseclassname = Getattr(base.item, "name"); + SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { - c_baseclassname = baseclassname; - baseclass = Copy(getProxyName(baseclassname)); - if (baseclass) - c_baseclass = SwigType_namestr(baseclassname); + String *name = getProxyName(baseclassname); + if (name) { + c_baseclassname = baseclassname; + baseclass = name; + } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); @@ -1833,7 +1829,7 @@ public: if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); - bool derived = baseclass && getProxyName(c_baseclassname); + bool derived = baseclass != 0; if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; @@ -1841,7 +1837,6 @@ public: if (purebase_replace) { wanted_base = pure_baseclass; derived = false; - Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The csbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); @@ -2032,12 +2027,11 @@ public: if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); } Delete(smart); - Delete(baseclass); } /* ---------------------------------------------------------------------- @@ -2046,7 +2040,8 @@ public: void emitInterfaceDeclaration(Node *n, String *interface_name, File *f_interface) { Printv(f_interface, typemapLookup(n, "csimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); - Printf(f_interface, "public interface %s", interface_name); + Printv(f_interface, typemapLookup(n, "csinterfacemodifiers", Getattr(n, "classtypeobj"), WARN_CSHARP_TYPEMAP_INTERFACEMODIFIERS_UNDEF), NIL); + Printf(f_interface, " %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { @@ -4064,11 +4059,10 @@ public: /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); - if (Strncmp(tm, "ref ", 4) == 0) { - Replace(tm, "ref ", "", DOH_REPLACE_FIRST); + int flags = DOH_REPLACE_FIRST | DOH_REPLACE_ID_BEGIN | DOH_REPLACE_NOCOMMENT; + if (Replace(tm, "ref ", "", flags) || Replace(tm, "ref\t", "", flags)) { Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); - } else if (Strncmp(tm, "out ", 4) == 0) { - Replace(tm, "out ", "", DOH_REPLACE_FIRST); + } else if (Replace(tm, "out ", "", flags) || Replace(tm, "out\t", "", flags)) { Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else { Printf(proxy_method_types, "typeof(%s)", tm); diff --git a/Source/Modules/d.cxx b/Source/Modules/d.cxx index 5e82dfda3..b7283eac2 100644 --- a/Source/Modules/d.cxx +++ b/Source/Modules/d.cxx @@ -3140,11 +3140,10 @@ private: * Handle inheriting from D and C++ classes. */ - String *c_classname = SwigType_namestr(Getattr(n, "name")); - String *c_baseclass = NULL; - Node *basenode = NULL; - String *basename = NULL; + String *c_classname = Getattr(n, "name"); String *c_baseclassname = NULL; + Node *basenode = NULL; + String *baseclass = NULL; // Inheritance from pure D classes. Node *attributes = NewHash(); @@ -3161,13 +3160,14 @@ private: Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { - String *baseclassname = Getattr(base.item, "name"); + SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { basenode = base.item; - c_baseclassname = baseclassname; - basename = createProxyName(c_baseclassname); - if (basename) - c_baseclass = SwigType_namestr(baseclassname); + String *name = createProxyName(baseclassname); + if (name) { + c_baseclassname = baseclassname; + baseclass = name; + } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); @@ -3180,25 +3180,24 @@ private: } } - bool derived = (basename != NULL); + bool derived = baseclass != NULL; if (derived && purebase_notderived) { pure_baseclass = empty_string; } - const String *wanted_base = basename ? basename : pure_baseclass; + const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; basenode = NULL; - Delete(basename); - basename = NULL; + baseclass = NULL; if (purebase_notderived) { Swig_error(Getfile(n), Getline(n), "The dbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } - } else if (basename && Len(pure_baseclass) > 0) { + } else if (baseclass && Len(pure_baseclass) > 0) { Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base class %s ignored. Multiple inheritance is not supported in D. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the dbase typemap?\n", typemap_lookup_type, pure_baseclass); @@ -3206,7 +3205,7 @@ private: // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - writeClassUpcast(n, proxy_class_name, c_classname, c_baseclass); + writeClassUpcast(n, proxy_class_name, c_classname, c_baseclassname); } /* @@ -3354,8 +3353,7 @@ private: // Write the class body and the curly bracket closing the class definition // to the proxy module. indentCode(body); - Replaceall(body, "$dbaseclass", basename); - Delete(basename); + Replaceall(body, "$dbaseclass", baseclass); Printv(proxy_class_code, body, "\n}\n", NIL); Delete(body); @@ -3368,7 +3366,7 @@ private: /* --------------------------------------------------------------------------- * D::writeClassUpcast() * --------------------------------------------------------------------------- */ - void writeClassUpcast(Node *n, const String* d_class_name, String* c_class_name, String* c_base_name) { + void writeClassUpcast(Node *n, const String* d_class_name, SwigType* c_classname, SwigType* c_baseclassname) { SwigType *smart = Swig_cparse_smartptr(n); String *upcast_name = Swig_name_member(getNSpace(), d_class_name, (smart != 0 ? "SmartPtrUpcast" : "Upcast")); @@ -3377,36 +3375,42 @@ private: writeImDModuleFunction(upcast_name, "void*", "(void* objectRef)", upcast_wrapper_name); + String *classname = SwigType_namestr(c_classname); + String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { - SwigType *bsmart = Copy(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_class_name); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_base_name); - Replaceall(bsmart, rclassname, rbaseclass); - Delete(rclassname); - Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); - String *bsmartnamestr = SwigType_namestr(bsmart); + String *bsmartnamestr = SwigType_namestr(smart); + + // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates + SwigType *rclassname = SwigType_typedef_resolve_all(classname); + SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); + Replaceall(bsmartnamestr, rclassname, rbaseclassname); + Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * ", upcast_wrapper_name, "(", smartnamestr, " *objectRef) {\n", " return objectRef ? new ", bsmartnamestr, "(*objectRef) : 0;\n" "}\n", "\n", NIL); + + Delete(rbaseclassname); + Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); - Delete(bsmart); } else { Printv(upcasts_code, - "SWIGEXPORT ", c_base_name, " * ", upcast_wrapper_name, - "(", c_base_name, " *objectRef) {\n", - " return (", c_base_name, " *)objectRef;\n" + "SWIGEXPORT ", baseclassname, " * ", upcast_wrapper_name, + "(", baseclassname, " *objectRef) {\n", + " return (", baseclassname, " *)objectRef;\n" "}\n", "\n", NIL); } - Replaceall(upcasts_code, "$cclass", c_class_name); - Replaceall(upcasts_code, "$cbaseclass", c_base_name); + Replaceall(upcasts_code, "$cclass", classname); + Replaceall(upcasts_code, "$cbaseclass", baseclassname); + Delete(baseclassname); + Delete(classname); Delete(upcast_name); Delete(upcast_wrapper_name); Delete(smart); diff --git a/Source/Modules/directors.cxx b/Source/Modules/directors.cxx index a91d5fd9a..196974792 100644 --- a/Source/Modules/directors.cxx +++ b/Source/Modules/directors.cxx @@ -160,7 +160,7 @@ String *Swig_method_decl(SwigType *return_base_type, SwigType *decl, const_Strin SwigType *rettype_stripped = SwigType_strip_qualifiers(rettype); String *rtype = SwigType_str(rettype, 0); Append(result, rtype); - if (SwigType_issimple(rettype_stripped) && return_base_type) + if ((SwigType_issimple(rettype_stripped) && return_base_type) || SwigType_isqualifier(rettype)) Append(result, " "); Delete(rtype); Delete(rettype_stripped); @@ -175,10 +175,6 @@ String *Swig_method_decl(SwigType *return_base_type, SwigType *decl, const_Strin if (qualifiers) Printv(result, " ", qualifiers, NIL); - // Reformat result to how it has been historically - Replaceall(result, ",", ", "); - Replaceall(result, "=", " = "); - Delete(args_string); Delete(popped_decl); Delete(qualifiers); diff --git a/Source/Modules/emit.cxx b/Source/Modules/emit.cxx index 7a4c2dcfb..edfa57ccd 100644 --- a/Source/Modules/emit.cxx +++ b/Source/Modules/emit.cxx @@ -74,7 +74,6 @@ void emit_parameter_variables(ParmList *l, Wrapper *f) { while (p) { tm = Getattr(p, "tmap:arginit"); if (tm) { - Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:arginit:next"); } else { @@ -87,7 +86,6 @@ void emit_parameter_variables(ParmList *l, Wrapper *f) { while (p) { tm = Getattr(p, "tmap:default"); if (tm) { - Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:default:next"); } else { @@ -116,7 +114,6 @@ void emit_attach_parmmaps(ParmList *l, Wrapper *f) { while (p) { String *tm = Getattr(p, "tmap:in"); if (tm && checkAttribute(p, "tmap:in:numinputs", "0")) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); np = Getattr(p, "tmap:in:next"); while (p && (p != np)) { diff --git a/Source/Modules/go.cxx b/Source/Modules/go.cxx index 0163f71df..c4d61e583 100644 --- a/Source/Modules/go.cxx +++ b/Source/Modules/go.cxx @@ -115,8 +115,6 @@ class GO:public Language { String *package; // SWIG module name. String *module; - // Flag for generating cgo input files. - bool cgo_flag; // Flag for generating gccgo output. bool gccgo_flag; // Prefix to use with gccgo. @@ -137,7 +135,6 @@ class GO:public Language { /* Output files */ File *f_c_begin; File *f_go_begin; - File *f_gc_begin; /* Output fragments */ File *f_c_runtime; @@ -151,9 +148,6 @@ class GO:public Language { File *f_go_header; File *f_go_wrappers; File *f_go_directors; - File *f_gc_runtime; - File *f_gc_header; - File *f_gc_wrappers; File *f_cgo_comment; File *f_cgo_comment_typedefs; @@ -201,7 +195,6 @@ class GO:public Language { public: GO():package(NULL), module(NULL), - cgo_flag(true), gccgo_flag(false), go_prefix(NULL), prefix_option(NULL), @@ -212,7 +205,6 @@ public: intgo_type_size(0), f_c_begin(NULL), f_go_begin(NULL), - f_gc_begin(NULL), f_c_runtime(NULL), f_c_header(NULL), f_c_wrappers(NULL), @@ -224,9 +216,6 @@ public: f_go_header(NULL), f_go_wrappers(NULL), f_go_directors(NULL), - f_gc_runtime(NULL), - f_gc_header(NULL), - f_gc_wrappers(NULL), f_cgo_comment(NULL), f_cgo_comment_typedefs(NULL), saw_import(false), @@ -256,6 +245,7 @@ private: SWIG_library_directory("go"); bool display_help = false; + bool saw_nocgo_flag = false; // Process command line options. for (int i = 1; i < argc; i++) { @@ -271,10 +261,9 @@ private: } } else if (strcmp(argv[i], "-cgo") == 0) { Swig_mark_arg(i); - cgo_flag = true; } else if (strcmp(argv[i], "-no-cgo") == 0) { Swig_mark_arg(i); - cgo_flag = false; + saw_nocgo_flag = true; } else if (strcmp(argv[i], "-gccgo") == 0) { Swig_mark_arg(i); gccgo_flag = true; @@ -346,6 +335,11 @@ private: } } + if (saw_nocgo_flag) { + Printf(stderr, "SWIG -go: -no-cgo option is no longer supported\n"); + SWIG_exit(EXIT_FAILURE); + } + if (gccgo_flag && !pkgpath_option && !prefix_option) { prefix_option = NewString("go"); } @@ -353,10 +347,6 @@ private: // Add preprocessor symbol to parser. Preprocessor_define("SWIGGO 1", 0); - if (cgo_flag) { - Preprocessor_define("SWIGGO_CGO 1", 0); - } - if (gccgo_flag) { Preprocessor_define("SWIGGO_GCCGO 1", 0); } @@ -458,12 +448,6 @@ private: String *go_filename = NewString(""); Printf(go_filename, "%s%s.go", SWIG_output_directory(), module); - String *gc_filename = NULL; - if (!gccgo_flag) { - gc_filename = NewString(""); - Printf(gc_filename, "%s%s_gc.c", SWIG_output_directory(), module); - } - // Generate a unique ID based on a hash of the SWIG input. swig_uint64 hash = {0, 0}; FILE *swig_input = Swig_open(swig_filename); @@ -504,14 +488,6 @@ private: SWIG_exit(EXIT_FAILURE); } - if (!gccgo_flag && !cgo_flag) { - f_gc_begin = NewFile(gc_filename, "w", SWIG_output_files()); - if (!f_gc_begin) { - FileErrorDisplay(gc_filename); - SWIG_exit(EXIT_FAILURE); - } - } - f_c_runtime = NewString(""); f_c_header = NewString(""); f_c_wrappers = NewString(""); @@ -522,15 +498,8 @@ private: f_go_header = NewString(""); f_go_wrappers = NewString(""); f_go_directors = NewString(""); - if (!gccgo_flag && !cgo_flag) { - f_gc_runtime = NewString(""); - f_gc_header = NewString(""); - f_gc_wrappers = NewString(""); - } - if (cgo_flag) { - f_cgo_comment = NewString(""); - f_cgo_comment_typedefs = NewString(""); - } + f_cgo_comment = NewString(""); + f_cgo_comment_typedefs = NewString(""); Swig_register_filebyname("begin", f_c_begin); Swig_register_filebyname("runtime", f_c_runtime); @@ -545,16 +514,8 @@ private: Swig_register_filebyname("go_header", f_go_header); Swig_register_filebyname("go_wrapper", f_go_wrappers); Swig_register_filebyname("go_director", f_go_directors); - if (!gccgo_flag && !cgo_flag) { - Swig_register_filebyname("gc_begin", f_gc_begin); - Swig_register_filebyname("gc_runtime", f_gc_runtime); - Swig_register_filebyname("gc_header", f_gc_header); - Swig_register_filebyname("gc_wrapper", f_gc_wrappers); - } - if (cgo_flag) { - Swig_register_filebyname("cgo_comment", f_cgo_comment); - Swig_register_filebyname("cgo_comment_typedefs", f_cgo_comment_typedefs); - } + Swig_register_filebyname("cgo_comment", f_cgo_comment); + Swig_register_filebyname("cgo_comment_typedefs", f_cgo_comment_typedefs); Swig_banner(f_c_begin); if (CPlusPlus) { @@ -587,34 +548,18 @@ private: Swig_banner(f_go_begin); Printf(f_go_begin, "\n// source: %s\n", swig_filename); - if (!gccgo_flag && !cgo_flag && soname) { - Swig_banner(f_gc_begin); - Printf(f_gc_begin, "\n/* source: %s */\n\n", swig_filename); - Printf(f_gc_begin, "\n/* This file should be compiled with 6c/8c. */\n"); - Printf(f_gc_begin, "#pragma dynimport _ _ \"%s\"\n", soname); - } + Printv(f_cgo_comment_typedefs, "/*\n", NULL); - if (cgo_flag) { - Printv(f_cgo_comment_typedefs, "/*\n", NULL); - - // The cgo program defines the intgo type after our function - // definitions, but we want those definitions to be able to use - // intgo also. - Printv(f_cgo_comment_typedefs, "#define intgo swig_intgo\n", NULL); - Printv(f_cgo_comment_typedefs, "typedef void *swig_voidp;\n", NULL); - } + // The cgo program defines the intgo type after our function + // definitions, but we want those definitions to be able to use + // intgo also. + Printv(f_cgo_comment_typedefs, "#define intgo swig_intgo\n", NULL); + Printv(f_cgo_comment_typedefs, "typedef void *swig_voidp;\n", NULL); // Output module initialization code. Printf(f_go_begin, "\npackage %s\n\n", getModuleName(package)); - if (gccgo_flag && !cgo_flag) { - Printf(f_go_runtime, "func SwigCgocall()\n"); - Printf(f_go_runtime, "func SwigCgocallDone()\n"); - Printf(f_go_runtime, "func SwigCgocallBack()\n"); - Printf(f_go_runtime, "func SwigCgocallBackDone()\n\n"); - } - // All the C++ wrappers should be extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "extern \"C\" {\n", "#endif\n\n", NULL); @@ -686,21 +631,45 @@ private: // End the extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "}\n", "#endif\n\n", NULL); - if (cgo_flag) { - // End the cgo comment. - Printv(f_cgo_comment, "#undef intgo\n", NULL); - Printv(f_cgo_comment, "*/\n", NULL); - Printv(f_cgo_comment, "import \"C\"\n", NULL); - Printv(f_cgo_comment, "\n", NULL); + // End the cgo comment. + Printv(f_cgo_comment, "#undef intgo\n", NULL); + Printv(f_cgo_comment, "*/\n", NULL); + Printv(f_cgo_comment, "import \"C\"\n", NULL); + Printv(f_cgo_comment, "\n", NULL); + + bool need_panic = false; + if (Strstr(f_c_runtime, "SWIG_contract_assert(") != 0 || Strstr(f_c_wrappers, "SWIG_contract_assert(") != 0) { + Printv(f_c_begin, "\n#define SWIG_contract_assert(expr, msg) if (!(expr)) { _swig_gopanic(msg); } else\n\n", NULL); + need_panic = true; + } + + if (!gccgo_flag && (need_panic || Strstr(f_c_runtime, "_swig_gopanic") != 0 || Strstr(f_c_wrappers, "_swig_gopanic") != 0)) { + Printv(f_go_header, "//export cgo_panic_", unique_id, "\n", NULL); + Printv(f_go_header, "func cgo_panic_", unique_id, "(p *byte) {\n", NULL); + Printv(f_go_header, "\ts := (*[1024]byte)(unsafe.Pointer(p))[:]\n", NULL); + Printv(f_go_header, "\tfor i, b := range s {\n", NULL); + Printv(f_go_header, "\t\tif b == 0 {\n", NULL); + Printv(f_go_header, "\t\t\tpanic(string(s[:i]))\n", NULL); + Printv(f_go_header, "\t\t}\n", NULL); + Printv(f_go_header, "\t}\n", NULL); + Printv(f_go_header, "\tpanic(string(s))\n", NULL); + Printv(f_go_header, "}\n\n", NULL); + + Printv(f_c_begin, "\nextern\n", NULL); + Printv(f_c_begin, "#ifdef __cplusplus\n", NULL); + Printv(f_c_begin, " \"C\"\n", NULL); + Printv(f_c_begin, "#endif\n", NULL); + Printv(f_c_begin, " void cgo_panic_", unique_id, "(const char*);\n", NULL); + Printv(f_c_begin, "static void _swig_gopanic(const char *p) {\n", NULL); + Printv(f_c_begin, " cgo_panic_", unique_id, "(p);\n", NULL); + Printv(f_c_begin, "}\n\n", NULL); } Dump(f_c_runtime, f_c_begin); Dump(f_c_wrappers, f_c_begin); Dump(f_c_init, f_c_begin); - if (cgo_flag) { - Dump(f_cgo_comment_typedefs, f_go_begin); - Dump(f_cgo_comment, f_go_begin); - } + Dump(f_cgo_comment_typedefs, f_go_begin); + Dump(f_cgo_comment, f_go_begin); Dump(f_go_imports, f_go_begin); Dump(f_go_header, f_go_begin); Dump(f_go_runtime, f_go_begin); @@ -708,12 +677,6 @@ private: if (directorsEnabled()) { Dump(f_go_directors, f_go_begin); } - if (!gccgo_flag && !cgo_flag) { - Dump(f_gc_header, f_gc_begin); - Dump(f_gc_runtime, f_gc_begin); - Dump(f_gc_wrappers, f_gc_begin); - } - Delete(f_c_runtime); Delete(f_c_header); Delete(f_c_wrappers); @@ -723,21 +686,10 @@ private: Delete(f_go_header); Delete(f_go_wrappers); Delete(f_go_directors); - if (!gccgo_flag && !cgo_flag) { - Delete(f_gc_runtime); - Delete(f_gc_header); - Delete(f_gc_wrappers); - } - if (cgo_flag) { - Delete(f_cgo_comment); - Delete(f_cgo_comment_typedefs); - } - + Delete(f_cgo_comment); + Delete(f_cgo_comment_typedefs); Delete(f_c_begin); Delete(f_go_begin); - if (!gccgo_flag && !cgo_flag) { - Delete(f_gc_begin); - } return SWIG_OK; } @@ -952,7 +904,7 @@ private: ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); - int r = makeWrappers(n, name, go_name, overname, wname, NULL, parms, result, is_static); + int r = makeWrappers(n, go_name, overname, wname, NULL, parms, result, is_static); if (r != SWIG_OK) { return r; } @@ -1010,7 +962,6 @@ private: * * Write out the various function wrappers. * n: The function we are emitting. - * name: The function name. * go_name: The name of the function in Go. * overname: The overload string for overloaded function. * wname: The SWIG wrapped name--the name of the C function. @@ -1021,38 +972,15 @@ private: * is_static: Whether this is a static method or member. * ---------------------------------------------------------------------- */ - int makeWrappers(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { + int makeWrappers(Node *n, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { assert(result); int ret = SWIG_OK; - if (cgo_flag) { - int r = makeCgoWrappers(n, go_name, overname, wname, base, parms, result, is_static); - if (r != SWIG_OK) { - ret = r; - } - } else { - int r = goFunctionWrapper(n, name, go_name, overname, wname, base, parms, result, is_static); - if (r != SWIG_OK) { - ret = r; - } - - if (!gccgo_flag) { - r = gcFunctionWrapper(wname); - if (r != SWIG_OK) { - ret = r; - } - r = gccFunctionWrapper(n, base, wname, parms, result); - if (r != SWIG_OK) { - ret = r; - } - } else { - r = gccgoFunctionWrapper(n, base, wname, parms, result); - if (r != SWIG_OK) { - ret = r; - } - } + int r = makeCgoWrappers(n, go_name, overname, wname, base, parms, result, is_static); + if (r != SWIG_OK) { + ret = r; } if (class_methods) { @@ -1618,415 +1546,6 @@ private: return SWIG_OK; } - /* ---------------------------------------------------------------------- - * goFunctionWrapper() - * - * Write out a function wrapper in Go. When not implementing a - * method, the actual code is all in C; here we just declare the C - * function. When implementing a method, we have to call the C - * function, because it will have a different name. If base is not - * NULL, then we are being called to forward a virtual method to a - * base class. - * ---------------------------------------------------------------------- */ - - int goFunctionWrapper(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { - Wrapper *dummy = initGoTypemaps(parms); - - int parm_count = emit_num_arguments(parms); - int required_count = emit_num_required(parms); - - String *receiver = class_receiver; - if (receiver && is_static) { - receiver = NULL; - } - - String *nodetype = Getattr(n, "nodeType"); - bool is_constructor = Cmp(nodetype, "constructor") == 0; - bool is_destructor = Cmp(nodetype, "destructor") == 0; - if (is_constructor || is_destructor) { - assert(class_receiver); - assert(!base); - receiver = NULL; - } - - Swig_save("cgoGoWrapper", n, "type", "tmap:goout", NULL); - Setattr(n, "type", result); - - String *goout = goTypemapLookup("goout", n, "swig_r"); - - Swig_restore(n); - - bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !overname && checkFunctionVisibility(n, NULL)); - - bool needs_wrapper = (gccgo_flag || receiver || is_constructor || is_destructor || parm_count > required_count); - - bool has_goout = false; - if (goout) { - has_goout = true; - } - - // See whether any of the function parameters are represented by - // interface values. When calling the C++ code, we need to convert - // back to a uintptr. - Parm *p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - String *ty = Getattr(p, "type"); - if (goGetattr(p, "tmap:goargout")) { - has_goout = true; - needs_wrapper = true; - } else if (goTypeIsInterface(p, ty) || goGetattr(p, "tmap:goin")) { - needs_wrapper = true; - } - - if (paramNeedsEscape(p)) { - needs_wrapper = true; - } - - p = nextParm(p); - } - if (goTypeIsInterface(n, result) || goout != NULL) { - needs_wrapper = true; - } - - if (!gccgo_flag) { - Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); - } - - // If this is a method, first declare the C function we will call. - // If we do not need a wrapper, then we will only be writing a - // declaration. - String *wrapper_name = NULL; - if (needs_wrapper) { - wrapper_name = buildGoWrapperName(name, overname); - - if (gccgo_flag) { - Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); - } - - bool arg = false; - Printv(f_go_wrappers, "func ", wrapper_name, "(", NULL); - if (parm_count > required_count) { - Printv(f_go_wrappers, argName(&arg), " int", NULL); - } - Parm *p = getParm(parms); - int i = 0; - if (is_destructor) { - if (parm_count > required_count) { - Printv(f_go_wrappers, ", ", NULL); - } - Printv(f_go_wrappers, argName(&arg), " uintptr", NULL); - ++i; - p = nextParm(p); - } else if (receiver && (base || !is_constructor)) { - if (parm_count > required_count) { - Printv(f_go_wrappers, ", ", NULL); - } - Printv(f_go_wrappers, argName(&arg), " ", receiver, NULL); - if (!base) { - ++i; - p = nextParm(p); - } - } - for (; i < parm_count; ++i) { - p = getParm(p); - if (i > 0 || (base && receiver) || parm_count > required_count) { - Printv(f_go_wrappers, ", ", NULL); - } - String *tm = goWrapperType(p, Getattr(p, "type"), false); - Printv(f_go_wrappers, argName(&arg), " ", tm, NULL); - Delete(tm); - p = nextParm(p); - } - Printv(f_go_wrappers, ")", NULL); - if (is_constructor) { - Printv(f_go_wrappers, " (", argName(&arg), " ", class_receiver, ")", NULL); - } else { - if (SwigType_type(result) != T_VOID) { - String *tm = goWrapperType(n, result, true); - Printv(f_go_wrappers, " (", argName(&arg), " ", tm, ")", NULL); - Delete(tm); - } - } - - if (!gccgo_flag) { - Printv(f_go_wrappers, " {\n", NULL); - if (arg) { - Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&base))\n", NULL); - } else { - Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); - } - Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); - Printv(f_go_wrappers, "\treturn\n", NULL); - Printv(f_go_wrappers, "}", NULL); - } - - Printv(f_go_wrappers, "\n\n", NULL); - } - - // Start defining the Go function. - - if (!needs_wrapper && gccgo_flag) { - Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); - } - - Printv(f_go_wrappers, "func ", NULL); - - p = parms; - int pi = 0; - - // Add the receiver if this is a method. - String *first = NULL; - if (receiver) { - Printv(f_go_wrappers, "(", NULL); - if (base && receiver) { - Printv(f_go_wrappers, "_swig_base", NULL); - if (first == NULL) { - first = NewString("_swig_base"); - } - } else { - Printv(f_go_wrappers, Getattr(p, "lname"), NULL); - if (first == NULL) { - first = Copy(Getattr(p, "lname")); - } - p = nextParm(p); - ++pi; - } - Printv(f_go_wrappers, " ", receiver, ") ", NULL); - } - - Printv(f_go_wrappers, go_name, NULL); - if (overname) { - Printv(f_go_wrappers, overname, NULL); - } - Printv(f_go_wrappers, "(", NULL); - - // If we are doing methods, add this function to the interface. - if (add_to_interface) { - Printv(interfaces, "\t", go_name, "(", NULL); - } - - // Write out the parameters to both the function definition and - // the interface. - - String *parm_print = NewString(""); - - for (; pi < parm_count; ++pi) { - p = getParm(p); - if (pi == 0 && is_destructor) { - String *cl = exportedName(class_name); - Printv(parm_print, Getattr(p, "lname"), " ", cl, NULL); - if (first == NULL) { - first = Copy(Getattr(p, "lname")); - } - Delete(cl); - } else { - if (pi > (receiver && !base ? 1 : 0)) { - Printv(parm_print, ", ", NULL); - } - if (pi >= required_count) { - Printv(parm_print, "_swig_args ...interface{}", NULL); - if (first == NULL) { - first = NewString("_swig_args"); - } - break; - } - Printv(parm_print, Getattr(p, "lname"), " ", NULL); - if (first == NULL) { - first = Copy(Getattr(p, "lname")); - } - String *tm = goType(p, Getattr(p, "type")); - Printv(parm_print, tm, NULL); - Delete(tm); - } - p = nextParm(p); - } - - Printv(parm_print, ")", NULL); - - // Write out the result type. - if (is_constructor) { - String *cl = exportedName(class_name); - Printv(parm_print, " (_swig_ret ", cl, ")", NULL); - if (first == NULL) { - first = NewString("_swig_ret"); - } - Delete(cl); - } else { - if (SwigType_type(result) != T_VOID) { - String *tm = goType(n, result); - Printv(parm_print, " (_swig_ret ", tm, ")", NULL); - if (first == NULL) { - first = NewString("_swig_ret"); - } - Delete(tm); - } - } - - Printv(f_go_wrappers, parm_print, NULL); - if (add_to_interface) { - Printv(interfaces, parm_print, "\n", NULL); - } - - // If this is a wrapper, we need to actually call the C function. - if (needs_wrapper) { - Printv(f_go_wrappers, " {\n", NULL); - - if (parm_count > required_count) { - Parm *p = parms; - int i; - for (i = 0; i < required_count; ++i) { - p = getParm(p); - p = nextParm(p); - } - for (; i < parm_count; ++i) { - p = getParm(p); - String *tm = goType(p, Getattr(p, "type")); - Printv(f_go_wrappers, "\tvar ", Getattr(p, "lname"), " ", tm, "\n", NULL); - Printf(f_go_wrappers, "\tif len(_swig_args) > %d {\n", i - required_count); - Printf(f_go_wrappers, "\t\t%s = _swig_args[%d].(%s)\n", Getattr(p, "lname"), i - required_count, tm); - Printv(f_go_wrappers, "\t}\n", NULL); - Delete(tm); - p = nextParm(p); - } - } - - String *call = NewString(""); - - bool need_return_var = SwigType_type(result) != T_VOID && ((gccgo_flag && is_constructor) || has_goout); - if (need_return_var) { - Printv(f_go_wrappers, "\tvar swig_r ", NULL); - if (is_constructor) { - String *cl = exportedName(class_name); - Printv(f_go_wrappers, cl, NULL); - Delete(cl); - } else { - Printv(f_go_wrappers, goImType(n, result), NULL); - } - Printv(f_go_wrappers, "\n", NULL); - } - - if (gccgo_flag) { - if (has_goout || is_constructor) { - Printv(call, "\tfunc() {\n", NULL); - } - Printv(call, "\tdefer SwigCgocallDone()\n", NULL); - Printv(call, "\tSwigCgocall()\n", NULL); - } - - Printv(call, "\t", NULL); - if (SwigType_type(result) != T_VOID) { - if (need_return_var) { - Printv(call, "swig_r = ", NULL); - } else { - Printv(call, "return ", NULL); - } - } - - Printv(call, wrapper_name, "(", NULL); - - if (parm_count > required_count) { - Printv(call, "len(_swig_args)", NULL); - } - - if (base && receiver) { - if (parm_count > required_count) { - Printv(call, ", ", NULL); - } - Printv(call, "_swig_base", NULL); - } - - Parm *p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - if (i > 0 || (base && receiver) - || parm_count > required_count) { - Printv(call, ", ", NULL); - } - - SwigType *pt = Getattr(p, "type"); - String *ln = Getattr(p, "lname"); - - String *goin = goGetattr(p, "tmap:goin"); - if (goin == NULL) { - Printv(call, ln, NULL); - if ((i == 0 && is_destructor) || ((i > 0 || !receiver || base || is_constructor) && goTypeIsInterface(p, pt))) { - Printv(call, ".Swigcptr()", NULL); - } - Setattr(p, "emit:goinput", ln); - } else { - String *ivar = NewString(""); - Printf(ivar, "_swig_i_%d", i); - String *itm = goImType(p, pt); - Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); - goin = Copy(goin); - Replaceall(goin, "$input", ln); - Replaceall(goin, "$result", ivar); - Printv(f_go_wrappers, goin, "\n", NULL); - Delete(goin); - Printv(call, ivar, NULL); - Setattr(p, "emit:goinput", ivar); - } - - // If the parameter has an argout or freearg typemap, make - // sure that it escapes. - if (paramNeedsEscape(p)) { - Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); - Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); - Printv(f_go_wrappers, "\t}\n", NULL); - } - - p = nextParm(p); - } - Printv(call, ")\n", NULL); - - if (gccgo_flag && (has_goout || is_constructor)) { - Printv(call, "\t}()\n", NULL); - } - - Printv(f_go_wrappers, call, NULL); - Delete(call); - - goargout(parms); - - if (need_return_var) { - if (goout == NULL) { - Printv(f_go_wrappers, "\treturn swig_r\n", NULL); - } else { - String *tm = goType(n, result); - Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); - Replaceall(goout, "$input", "swig_r"); - Replaceall(goout, "$result", "swig_r_1"); - Printv(f_go_wrappers, goout, "\n", NULL); - Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); - } - } - - Printv(f_go_wrappers, "}\n", NULL); - } else if (!gccgo_flag) { - // We don't need a wrapper. If we're using gccgo, the function - // declaration is all we need--it has a //extern comment to - // GCC-compiled wrapper. If we're not using gccgo, we need to - // call the GCC-compiled wrapper here. - Printv(f_go_wrappers, " {\n", NULL); - if (first == NULL) { - Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); - } else { - Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&", first, "))\n", NULL); - } - Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); - Printv(f_go_wrappers, "\treturn\n", NULL); - Printv(f_go_wrappers, "}", NULL); - } - - Printv(f_go_wrappers, "\n", NULL); - - Delete(wrapper_name); - DelWrapper(dummy); - - return SWIG_OK; - } - /* ---------------------------------------------------------------------- * initGoTypemaps() * @@ -2055,362 +1574,6 @@ private: return dummy; } - /* ---------------------------------------------------------------------- - * argName() - * - * A helper for goFunctionWrapper to output the first argument name - * as "base" and all others as "_". - * ---------------------------------------------------------------------- */ - - const char *argName(bool *arg) { - if (*arg) { - return "_"; - } - *arg = true; - return "base"; - } - - /* ---------------------------------------------------------------------- - * paramNeedsEscape() - * - * A helper for goFunctionWrapper that returns whether a parameter - * needs to explicitly escape. This is true if the parameter has a - * non-empty argout or freearg typemap, because in those cases the - * Go argument might be or contain a pointer. We need to ensure - * that that pointer does not point into the stack, which means that - * it needs to escape. - * ---------------------------------------------------------------------- */ - bool paramNeedsEscape(Parm *p) { - String *argout = Getattr(p, "tmap:argout"); - String *freearg = Getattr(p, "tmap:freearg"); - if ((!argout || Len(argout) == 0) && (!freearg || Len(freearg) == 0)) { - return false; - } - // If a C++ type is represented as an interface type in Go, then - // we don't care whether it escapes, because we know that the - // pointer is a C++ pointer. - if (goTypeIsInterface(p, Getattr(p, "type"))) { - return false; - } - return true; - } - - /* ---------------------------------------------------------------------- - * gcFunctionWrapper() - * - * This is used for 6g/8g, not for gccgo. Write out the function - * redirector that will be compiled with 6c/8c. This used to write - * out a real function wrapper, but that has moved into Go code. - * ---------------------------------------------------------------------- */ - - int gcFunctionWrapper(String *wname) { - Wrapper *f = NewWrapper(); - - Printv(f->def, "#pragma dynimport ", wname, " ", wname, " \"\"\n", NULL); - Printv(f->def, "#pragma cgo_import_static ", wname, "\n", NULL); - Printv(f->def, "extern void ", wname, "(void*);\n", NULL); - // Declare this as a uintptr, since it is not a pointer into the - // Go heap. - // \xc2\xb7 is UTF-8 for U+00B7 which is Unicode 'Middle Dot' - Printv(f->def, "uintptr \xc2\xb7", wname, " = (uintptr)", wname, ";\n", NULL); - - Wrapper_print(f, f_gc_wrappers); - - DelWrapper(f); - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * gccFunctionWrapper() - * - * This is used for 6g/8g, not for gccgo. Write out the function - * wrapper which will be compiled with gcc. If the base parameter - * is not NULL, this is calls the base class method rather than - * executing the SWIG wrapper code. - * ---------------------------------------------------------------------- */ - - int gccFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { - Wrapper *f = NewWrapper(); - - Swig_save("gccFunctionWrapper", n, "parms", NULL); - - Parm *base_parm = NULL; - if (base && !isStatic(n)) { - SwigType *base_type = Copy(getClassType()); - SwigType_add_pointer(base_type); - base_parm = NewParm(base_type, NewString("arg1"), n); - set_nextSibling(base_parm, parms); - parms = base_parm; - } - - emit_parameter_variables(parms, f); - emit_attach_parmmaps(parms, f); - int parm_count = emit_num_arguments(parms); - int required_count = emit_num_required(parms); - bool needs_swigargs = false; - - emit_return_variable(n, result, f); - - // Start the function definition. - - Printv(f->def, "void\n", wname, "(void *swig_v)\n", "{\n", NULL); - - // The single function parameter is a pointer to the real argument - // values. Define the structure that it points to. - - String *swigargs = NewString("\tstruct swigargs {\n"); - - if (parm_count > required_count) { - needs_swigargs = true; - Printv(swigargs, "\t\tintgo _swig_optargc;\n", NULL); - } - - Parm *p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - - String *ln = Getattr(p, "lname"); - SwigType *pt = Getattr(p, "type"); - String *ct = gcCTypeForGoValue(p, pt, ln); - Printv(swigargs, "\t\t\t", ct, ";\n", NULL); - needs_swigargs = true; - Delete(ct); - - String *gn = NewStringf("_swig_go_%d", i); - ct = gcCTypeForGoValue(p, pt, gn); - Setattr(p, "emit:input", gn); - Wrapper_add_local(f, gn, ct); - Delete(ct); - - p = nextParm(p); - } - if (SwigType_type(result) != T_VOID) { - Printv(swigargs, "\t\tlong : 0;\n", NULL); - String *ln = NewString(Swig_cresult_name()); - String *ct = gcCTypeForGoValue(n, result, ln); - Delete(ln); - Printv(swigargs, "\t\t", ct, ";\n", NULL); - needs_swigargs = true; - Delete(ct); - - ln = NewString("_swig_go_result"); - ct = gcCTypeForGoValue(n, result, ln); - Wrapper_add_local(f, "_swig_go_result", ct); - Delete(ct); - Delete(ln); - } - Printv(swigargs, "\t} SWIGSTRUCTPACKED *swig_a = (struct swigargs *) swig_v;\n", NULL); - - // Copy the input arguments out of the structure into the Go local - // variables. - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - String *ln = Getattr(p, "lname"); - String *gn = Getattr(p, "emit:input"); - Printv(f->code, "\t", gn, " = swig_a->", ln, ";\n", NULL); - p = nextParm(p); - } - - // Apply the in typemaps. - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - String *tm = Getattr(p, "tmap:in"); - if (!tm) { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); - } else { - tm = Copy(tm); - String *gn = Getattr(p, "emit:input"); - Replaceall(tm, "$input", gn); - if (i < required_count) { - Printv(f->code, "\t", tm, "\n", NULL); - } else { - Printf(f->code, "\tif (swig_a->_swig_optargc > %d) {\n", i - required_count); - Printv(f->code, "\t\t", tm, "\n", NULL); - Printv(f->code, "\t}\n", NULL); - } - Delete(tm); - } - p = nextParm(p); - } - - Printv(f->code, "\n", NULL); - - // Do the real work of the function. - - checkConstraints(parms, f); - - emitGoAction(n, base, parms, result, f); - - argout(parms, f); - - cleanupFunction(n, f, parms); - - if (needs_swigargs) - { - Printv(f->locals, swigargs, NULL); - } - - Printv(f->code, "}\n", NULL); - - Wrapper_print(f, f_c_wrappers); - - Swig_restore(n); - - Delete(swigargs); - DelWrapper(f); - Delete(base_parm); - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * gccgoFunctionWrapper() - * - * This is used for gccgo, not 6g/8g. Write out the function - * wrapper which will be compiled with gcc. If the base parameter - * is not NULL, this is calls the base class method rather than - * executing the SWIG wrapper code. - * ---------------------------------------------------------------------- */ - - int gccgoFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { - Wrapper *f = NewWrapper(); - - Swig_save("gccgoFunctionWrapper", n, "parms", NULL); - - Parm *base_parm = NULL; - if (base && !isStatic(n)) { - SwigType *base_type = Copy(getClassType()); - SwigType_add_pointer(base_type); - base_parm = NewParm(base_type, NewString("arg1"), n); - set_nextSibling(base_parm, parms); - parms = base_parm; - } - - emit_parameter_variables(parms, f); - emit_attach_parmmaps(parms, f); - int parm_count = emit_num_arguments(parms); - int required_count = emit_num_required(parms); - - emit_return_variable(n, result, f); - - // Start the function definition. - - String *fnname = NewString(""); - Printv(fnname, "go_", wname, "(", NULL); - - if (parm_count > required_count) { - Printv(fnname, "intgo _swig_optargc", NULL); - } - - Parm *p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - SwigType *pt = Copy(Getattr(p, "type")); - if (SwigType_isarray(pt)) { - SwigType_del_array(pt); - SwigType_add_pointer(pt); - } - String *pn = NewString("g"); - Append(pn, Getattr(p, "lname")); - String *ct = gccgoCTypeForGoValue(p, pt, pn); - if (i > 0 || parm_count > required_count) { - Printv(fnname, ", ", NULL); - } - Printv(fnname, ct, NULL); - Delete(ct); - Delete(pn); - Delete(pt); - p = nextParm(p); - } - - Printv(fnname, ")", NULL); - - String *fndef = NewString(""); - if (SwigType_type(result) == T_VOID) { - Printv(fndef, "void ", fnname, NULL); - } else { - String *ct = gccgoCTypeForGoValue(n, result, fnname); - Printv(fndef, ct, NULL); - Delete(ct); - } - - Printv(f->def, fndef, " __asm__(\"", go_prefix, "_", wname, "\");\n", NULL); - - Printv(f->def, fndef, " {\n", NULL); - - Delete(fnname); - Delete(fndef); - - if (SwigType_type(result) != T_VOID) { - String *ln = NewString("_swig_go_result"); - String *ct = gccgoCTypeForGoValue(n, result, ln); - Wrapper_add_local(f, "_swig_go_result", ct); - Delete(ct); - Delete(ln); - } - - // Copy the parameters into the variables which hold their values, - // applying appropriate transformations. - - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - - String *tm = Getattr(p, "tmap:in"); - if (!tm) { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, - "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); - } else { - String *ln = Getattr(p, "lname"); - String *pn = NewString("g"); - Append(pn, ln); - tm = Copy(tm); - Replaceall(tm, "$input", pn); - Setattr(p, "emit:input", pn); - if (i < required_count) { - Printv(f->code, " ", tm, "\n", NULL); - } else { - Printf(f->code, " if (_swig_optargc > %d) {\n", i - required_count); - Printv(f->code, " ", tm, "\n", NULL); - Printv(f->code, " }\n", NULL); - } - Delete(tm); - } - - p = nextParm(p); - } - - Printv(f->code, "\n", NULL); - - // Do the real work of the function. - - checkConstraints(parms, f); - - emitGoAction(n, base, parms, result, f); - - argout(parms, f); - - cleanupFunction(n, f, parms); - - if (SwigType_type(result) != T_VOID) { - Printv(f->code, " return _swig_go_result;\n", NULL); - } - - Printv(f->code, "}\n", NULL); - - Wrapper_print(f, f_c_wrappers); - - Swig_restore(n); - - DelWrapper(f); - Delete(base_parm); - - return SWIG_OK; - } - /* ----------------------------------------------------------------------- * checkConstraints() * @@ -2442,10 +1605,6 @@ private: * ----------------------------------------------------------------------- */ void emitGoAction(Node *n, List *base, ParmList *parms, SwigType *result, Wrapper *f) { - if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { - Wrapper_add_local(f, "swig_stktop", "char *swig_stktop"); - Printv(f->code, "\tswig_stktop = _swig_topofstack();\n", NULL); - } String *actioncode; if (!base || isStatic(n)) { Swig_director_emit_dynamic_cast(n, f); @@ -2455,9 +1614,6 @@ private: actioncode = NewString(""); String *current = NewString(""); - if (!gccgo_flag && !cgo_flag) { - Printv(current, "swig_a->", NULL); - } Printv(current, Getattr(parms, "lname"), NULL); int vc = 0; @@ -2493,14 +1649,6 @@ private: Delete(tm); } - if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { - // If the function called back into the Go code, the stack might - // have been copied. We need to adjust swig_a accordingly here. - // This is what cgo does. - Printv(f->code, "\tswig_a = (struct swigargs*)((char*)swig_a + (_swig_topofstack() - swig_stktop));\n", NULL); - Printv(f->code, "\tswig_a->", Swig_cresult_name(), " = ", "_swig_go_result;\n", NULL); - } - Swig_restore(n); } @@ -2553,26 +1701,23 @@ private: } } - // When using cgo, if we need to memcpy a parameter to pass it to - // the C code, the compiler may think that the parameter is not - // live during the function call. If the garbage collector runs - // while the C/C++ function is running, the parameter may be - // freed. Force the compiler to see the parameter as live across - // the C/C++ function. - if (cgo_flag) { - int parm_count = emit_num_arguments(parms); - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - bool c_struct_type; - Delete(cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type)); - if (c_struct_type) { - Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); - Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); - Printv(f_go_wrappers, "\t}\n", NULL); - } - p = nextParm(p); + // If we need to memcpy a parameter to pass it to the C code, the + // compiler may think that the parameter is not live during the + // function call. If the garbage collector runs while the C/C++ + // function is running, the parameter may be freed. Force the + // compiler to see the parameter as live across the C/C++ function. + int parm_count = emit_num_arguments(parms); + p = parms; + for (int i = 0; i < parm_count; ++i) { + p = getParm(p); + bool c_struct_type; + Delete(cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type)); + if (c_struct_type) { + Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); + Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); + Printv(f_go_wrappers, "\t}\n", NULL); } + p = nextParm(p); } } @@ -2615,7 +1760,6 @@ private: if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } @@ -2627,7 +1771,6 @@ private: /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } @@ -2895,7 +2038,7 @@ private: Append(wname, unique_id); Setattr(n, "wrap:name", wname); - int r = makeWrappers(n, sname, go_name, NULL, wname, NULL, NULL, type, true); + int r = makeWrappers(n, go_name, NULL, wname, NULL, NULL, type, true); if (r != SWIG_OK) { return r; @@ -3208,7 +2351,7 @@ private: } } - int r = makeWrappers(method, name, go_name, overname, wname, bases, Getattr(method, "parms"), result, is_static); + int r = makeWrappers(method, go_name, overname, wname, bases, Getattr(method, "parms"), result, is_static); Swig_restore(method); @@ -3283,7 +2426,7 @@ private: Append(wname, unique_id); ParmList *parms = NewParm(vt, var_name, var); String *result = NewString("void"); - int r = makeWrappers(var, mname_set, go_name, NULL, wname, bases, parms, result, false); + int r = makeWrappers(var, go_name, NULL, wname, bases, parms, result, false); if (r != SWIG_OK) { return r; } @@ -3312,7 +2455,7 @@ private: String *wname = Swig_name_wrapper(mname_get); Append(wname, unique_id); - int r = makeWrappers(var, mname_get, go_name, NULL, wname, bases, NULL, vt, false); + int r = makeWrappers(var, go_name, NULL, wname, bases, NULL, vt, false); if (r != SWIG_OK) { return r; } @@ -3428,8 +2571,7 @@ private: SwigType *result = Copy(Getattr(b.item, "classtypeobj")); SwigType_add_pointer(result); - int r = makeWrappers(n, name, go_name, NULL, wname, NULL, parm, result, - false); + int r = makeWrappers(n, go_name, NULL, wname, NULL, parm, result, false); if (r != SWIG_OK) { return r; } @@ -3677,50 +2819,17 @@ private: } if (!is_ignored) { - if (cgo_flag) { - Printv(f_cgo_comment, "extern uintptr_t ", wname, "(int", NULL); + Printv(f_cgo_comment, "extern uintptr_t ", wname, "(int", NULL); - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - bool c_struct_type; - String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); - Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); - p = nextParm(p); - } - Printv(f_cgo_comment, ");\n", NULL); - } else { - // Declare the C++ wrapper. - - if (!gccgo_flag) { - Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); - } else { - Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); - } - - Printv(f_go_wrappers, "func ", fn_with_over_name, "(_swig_director int", NULL); - - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - String *tm = goWrapperType(p, Getattr(p, "type"), false); - Printv(f_go_wrappers, ", _ ", tm, NULL); - Delete(tm); - p = nextParm(p); - } - - Printv(f_go_wrappers, ") (_swig_ret ", go_type_name, ")", NULL); - - if (!gccgo_flag) { - Printv(f_go_wrappers, " {\n", NULL); - Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_director))\n", NULL); - Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); - Printv(f_go_wrappers, "\treturn\n", NULL); - Printv(f_go_wrappers, "}", NULL); - } - - Printv(f_go_wrappers, "\n\n", NULL); + p = parms; + for (int i = 0; i < parm_count; ++i) { + p = getParm(p); + bool c_struct_type; + String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); + Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); + p = nextParm(p); } + Printv(f_cgo_comment, ");\n", NULL); // Write out the Go function that calls the wrapper. @@ -3740,19 +2849,10 @@ private: Printv(f_go_wrappers, "\tp := &", director_struct_name, "{0, v}\n", NULL); - if (gccgo_flag && !cgo_flag) { - Printv(f_go_wrappers, "\tdefer SwigCgocallDone()\n", NULL); - Printv(f_go_wrappers, "\tSwigCgocall()\n", NULL); - } - String *call = NewString(""); Printv(call, "\tp.", class_receiver, " = ", NULL); - if (cgo_flag) { - Printv(call, go_type_name, "(C.", wname, "(C.int(swigDirectorAdd(p))", NULL); - } else { - Printv(call, fn_with_over_name, "(swigDirectorAdd(p)", NULL); - } + Printv(call, go_type_name, "(C.", wname, "(C.int(swigDirectorAdd(p))", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { @@ -3783,25 +2883,19 @@ private: Setattr(p, "emit:goinput", ivar); - if (cgo_flag) { - bool c_struct_type; - String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); - if (c_struct_type) { - Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); - } else { - Printv(call, "C.", ct, "(", ivar, ")", NULL); - } - Delete(ct); + bool c_struct_type; + String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); + if (c_struct_type) { + Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { - Printv(call, ivar, NULL); + Printv(call, "C.", ct, "(", ivar, ")", NULL); } + Delete(ct); + p = nextParm(p); } - Printv(call, ")", NULL); - if (cgo_flag) { - Printv(call, ")", NULL); - } + Printv(call, "))", NULL); Printv(f_go_wrappers, call, "\n", NULL); @@ -3839,39 +2933,23 @@ private: Printv(action, ");", NULL); Setattr(n, "wrap:action", action); - if (cgo_flag) { - cgoWrapperInfo info; + cgoWrapperInfo info; - info.n = n; - info.go_name = func_name; - info.overname = overname; - info.wname = wname; - info.base = NULL; - info.parms = first_parm; - info.result = result; - info.is_static = false; - info.receiver = NULL; - info.is_constructor = true; - info.is_destructor = false; + info.n = n; + info.go_name = func_name; + info.overname = overname; + info.wname = wname; + info.base = NULL; + info.parms = first_parm; + info.result = result; + info.is_static = false; + info.receiver = NULL; + info.is_constructor = true; + info.is_destructor = false; - int r = cgoGccWrapper(&info); - if (r != SWIG_OK) { - return r; - } - } else if (!gccgo_flag) { - int r = gcFunctionWrapper(wname); - if (r != SWIG_OK) { - return r; - } - r = gccFunctionWrapper(n, NULL, wname, first_parm, result); - if (r != SWIG_OK) { - return r; - } - } else { - int r = gccgoFunctionWrapper(n, NULL, wname, first_parm, result); - if (r != SWIG_OK) { - return r; - } + int r = cgoGccWrapper(&info); + if (r != SWIG_OK) { + return r; } Swig_restore(n); @@ -3960,7 +3038,7 @@ private: Setattr(n, "wrap:parms", parms); String *result = NewString("void"); - int r = makeWrappers(n, fnname, fnname, NULL, wname, NULL, parms, result, isStatic(n)); + int r = makeWrappers(n, fnname, NULL, wname, NULL, parms, result, isStatic(n)); if (r != SWIG_OK) { return r; } @@ -4025,65 +3103,9 @@ private: * makeDirectorDestructorWrapper * * Emit the function wrapper for the destructor of a director class. - * This writes director_sig to f_c_directors and leaves the function - * unfinished. * ------------------------------------------------------------ */ void makeDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { - if (cgo_flag) { - makeCgoDirectorDestructorWrapper(go_name, director_struct_name, director_sig); - return; - } - - Printv(f_go_wrappers, "func ", go_name, "(c int) {\n", NULL); - if (gccgo_flag) { - Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); - Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); - } - Printv(f_go_wrappers, "\tswigDirectorLookup(c).(*", director_struct_name, ").", class_receiver, " = 0\n", NULL); - Printv(f_go_wrappers, "\tswigDirectorDelete(c)\n", NULL); - Printv(f_go_wrappers, "}\n\n", NULL); - - String *wname = NewString("_swiggo_wrap_DeleteDirector_"); - Append(wname, class_name); - - if (!gccgo_flag) { - Printv(f_c_directors, "extern \"C\" void ", wname, "(void*, int);\n", NULL); - } else { - Printv(f_c_directors, "extern \"C\" void ", wname, "(intgo) __asm__(\"", go_prefix, ".", go_name, "\");\n", NULL); - } - - Printv(f_c_directors, director_sig, NULL); - - if (!gccgo_flag) { - Printv(f_c_directors, " struct { intgo p; } SWIGSTRUCTPACKED a;\n", NULL); - Printv(f_c_directors, " a.p = go_val;\n", NULL); - Printv(f_c_directors, " crosscall2(", wname, ", &a, (int) sizeof a);\n", NULL); - - Printv(f_gc_wrappers, "#pragma dynexport ", wname, " ", wname, "\n", NULL); - Printv(f_gc_wrappers, "#pragma cgo_export_static ", wname, " ", wname, "\n", NULL); - Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); - Printv(f_gc_wrappers, "extern void \xc2\xb7", go_name, "();\n", NULL); - Printv(f_gc_wrappers, "void\n", NULL); - Printv(f_gc_wrappers, wname, "(void *a, int32 n)\n", NULL); - Printv(f_gc_wrappers, "{\n", NULL); - Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", go_name, ", a, n);\n", NULL); - Printv(f_gc_wrappers, "}\n\n", NULL); - } else { - Printv(f_c_directors, " ", wname, "(go_val);\n", NULL); - } - - Delete(wname); - } - - /* ------------------------------------------------------------ - * makeCgoDirectorDestructorWrapper - * - * When using cgo, emit the function wrapper for the destructor of a - * director class. - * ------------------------------------------------------------ */ - - void makeCgoDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { String *wname = Copy(go_name); Append(wname, unique_id); @@ -4115,6 +3137,7 @@ private: String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); + (void)is_ignored; name = Getattr(n, "name"); } @@ -4252,9 +3275,7 @@ private: if (overname) { Append(callback_name, overname); } - if (cgo_flag) { - Append(callback_name, unique_id); - } + Append(callback_name, unique_id); String *upcall_name = Copy(director_struct_name); Append(upcall_name, "_upcall_"); @@ -4315,68 +3336,28 @@ private: Printv(f_go_wrappers, "}\n\n", NULL); if (!GetFlag(n, "abstract")) { - if (cgo_flag) { - Printv(f_cgo_comment, "extern ", NULL); + Printv(f_cgo_comment, "extern ", NULL); - if (SwigType_type(result) == T_VOID) { - Printv(f_cgo_comment, "void", NULL); - } else { - bool c_struct_type; - String *ret_type = cgoTypeForGoValue(n, result, &c_struct_type); - Printv(f_cgo_comment, ret_type, NULL); - Delete(ret_type); - } - - Printv(f_cgo_comment, " ", upcall_wname, "(uintptr_t", NULL); - - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - bool c_struct_type; - String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); - Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); - p = nextParm(p); - } - Printv(f_cgo_comment, ");\n", NULL); + if (SwigType_type(result) == T_VOID) { + Printv(f_cgo_comment, "void", NULL); } else { - // Declare the upcall function, which calls the method on - // the parent class. - - if (!gccgo_flag) { - Printv(f_go_wrappers, "var ", upcall_wname, " unsafe.Pointer\n\n", NULL); - } else { - Printv(f_go_wrappers, "//extern ", go_prefix, "_", upcall_wname, "\n", NULL); - } - - Printv(f_go_wrappers, "func ", upcall_gc_name, "(_swig_ptr ", go_type_name, NULL); - - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - String *tm = goWrapperType(p, Getattr(p, "type"), false); - Printv(f_go_wrappers, ", _ ", tm, NULL); - Delete(tm); - p = nextParm(p); - } - - Printv(f_go_wrappers, ")", NULL); - - if (SwigType_type(result) != T_VOID) { - String *tm = goWrapperType(n, result, true); - Printv(f_go_wrappers, " (_swig_ret ", tm, ")", NULL); - Delete(tm); - } - - if (!gccgo_flag) { - Printv(f_go_wrappers, " {\n", NULL); - Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_ptr))\n", NULL); - Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", upcall_wname, ", _swig_p)\n", NULL); - Printv(f_go_wrappers, "\treturn\n", NULL); - Printv(f_go_wrappers, "}", NULL); - } - - Printv(f_go_wrappers, "\n\n", NULL); + bool c_struct_type; + String *ret_type = cgoTypeForGoValue(n, result, &c_struct_type); + Printv(f_cgo_comment, ret_type, NULL); + Delete(ret_type); } + + Printv(f_cgo_comment, " ", upcall_wname, "(uintptr_t", NULL); + + p = parms; + for (int i = 0; i < parm_count; ++i) { + p = getParm(p); + bool c_struct_type; + String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); + Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); + p = nextParm(p); + } + Printv(f_cgo_comment, ");\n", NULL); } // Define the method on the director class in Go. @@ -4435,73 +3416,36 @@ private: String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; - bool has_goout = false; String *goout = NULL; if (SwigType_type(result) != T_VOID) { ret_type = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); - if (goout) { - has_goout = true; - } - if (cgo_flag) { - bool c_struct_type; - Delete(cgoTypeForGoValue(n, result, &c_struct_type)); - if (c_struct_type) { - memcpy_ret = true; - } + bool c_struct_type; + Delete(cgoTypeForGoValue(n, result, &c_struct_type)); + if (c_struct_type) { + memcpy_ret = true; } } - p = parms; - for (int i = 0; i < parm_count; ++i) { - p = getParm(p); - if (goGetattr(p, "tmap:goargout")) { - has_goout = true; - } - p = nextParm(p); - } - String *call = NewString(""); - if (gccgo_flag && !cgo_flag) { - if (has_goout) { - Printv(call, "\tfunc() {\n", NULL); - } - Printv(call, "\tdefer SwigCgocallDone()\n", NULL); - Printv(call, "\tSwigCgocall()\n", NULL); - } - Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { - Printv(call, "swig_r = ", NULL); - if (cgo_flag) { - Printv(call, "(", ret_type, ")(", NULL); - } + Printv(call, "swig_r = (", ret_type, ")(", NULL); } - if (cgo_flag && goTypeIsInterface(n, result)) { + if (goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } - if (cgo_flag) { - Printv(call, "C.", upcall_wname, NULL); - } else { - Printv(call, upcall_gc_name, NULL); - } - Printv(call, "(", NULL); - if (cgo_flag) { - Printv(call, "C.uintptr_t(", NULL); - } - Printv(call, "swig_p.", go_type_name, NULL); - if (cgo_flag) { - Printv(call, ")", NULL); - } + Printv(call, "C.", upcall_wname, "(C.uintptr_t(swig_p.", + go_type_name, ")", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { @@ -4534,16 +3478,12 @@ private: Setattr(p, "emit:goinput", ivar); - if (cgo_flag) { - bool c_struct_type; - String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); - if (c_struct_type) { - Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); - } else { - Printv(call, "C.", ct, "(", ivar, ")", NULL); - } + bool c_struct_type; + String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); + if (c_struct_type) { + Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { - Printv(call, ivar, NULL); + Printv(call, "C.", ct, "(", ivar, ")", NULL); } p = nextParm(p); @@ -4551,19 +3491,13 @@ private: Printv(call, ")", NULL); - if (gccgo_flag && !cgo_flag && has_goout) { - Printv(call, "\n\t}()", NULL); + if (wt) { + // Close the type conversion to the wrapper type. + Printv(call, ")", NULL); } - - if (cgo_flag) { - if (wt) { - // Close the type conversion to the wrapper type. - Printv(call, ")", NULL); - } - if (SwigType_type(result) != T_VOID && !memcpy_ret) { - // Close the type conversion of the return value. - Printv(call, ")", NULL); - } + if (SwigType_type(result) != T_VOID && !memcpy_ret) { + // Close the type conversion of the return value. + Printv(call, ")", NULL); } Printv(call, "\n", NULL); @@ -4677,41 +3611,23 @@ private: Printv(action, ");", NULL); Setattr(n, "wrap:action", action); - if (cgo_flag) { - cgoWrapperInfo info; + cgoWrapperInfo info; - info.n = n; - info.go_name = go_name; - info.overname = overname; - info.wname = upcall_wname; - info.base = NULL; - info.parms = first_parm; - info.result = result; - info.is_static = is_static; - info.receiver = NULL; - info.is_constructor = false; - info.is_destructor = false; + info.n = n; + info.go_name = go_name; + info.overname = overname; + info.wname = upcall_wname; + info.base = NULL; + info.parms = first_parm; + info.result = result; + info.is_static = is_static; + info.receiver = NULL; + info.is_constructor = false; + info.is_destructor = false; - int r = cgoGccWrapper(&info); - if (r != SWIG_OK) { - return r; - } - } else if (!gccgo_flag) { - // Write the upcall wrapper function. This is compiled by gc - // and calls the C++ function. - int r = gcFunctionWrapper(upcall_wname); - if (r != SWIG_OK) { - return r; - } - r = gccFunctionWrapper(n, NULL, upcall_wname, first_parm, result); - if (r != SWIG_OK) { - return r; - } - } else { - int r = gccgoFunctionWrapper(n, NULL, upcall_wname, first_parm, result); - if (r != SWIG_OK) { - return r; - } + int r = cgoGccWrapper(&info); + if (r != SWIG_OK) { + return r; } Delete(first_type); @@ -4756,54 +3672,30 @@ private: Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); - if (cgo_flag) { - bool c_struct_type; - Delete(cgoTypeForGoValue(n, result, &c_struct_type)); - if (c_struct_type) { - memcpy_ret = true; - } + bool c_struct_type; + Delete(cgoTypeForGoValue(n, result, &c_struct_type)); + if (c_struct_type) { + memcpy_ret = true; } } String *call = NewString(""); - if (gccgo_flag && !cgo_flag) { - if (goout != NULL) { - Printv(call, "\tfunc() {\n", NULL); - } - Printv(call, "\tdefer SwigCgocallDone()\n", NULL); - Printv(call, "\tSwigCgocall()\n", NULL); - } - Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { - Printv(call, "swig_r = ", NULL); - if (cgo_flag) { - Printv(call, "(", ret_type, ")(", NULL); - } + Printv(call, "swig_r = (", ret_type, ")(", NULL); } - if (cgo_flag && goTypeIsInterface(n, result)) { + if (goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } - if (cgo_flag) { - Printv(call, "C.", upcall_wname, NULL); - } else { - Printv(call, upcall_gc_name, NULL); - } - Printv(call, "(", NULL); - if (cgo_flag) { - Printv(call, "C.uintptr_t(", NULL); - } - Printv(call, "p.(*", director_struct_name, ").", go_type_name, NULL); - if (cgo_flag) { - Printv(call, ")", NULL); - } + Printv(call, "C.", upcall_wname, "(C.uintptr_t(p.(*", + director_struct_name, ").", go_type_name, ")", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { @@ -4834,16 +3726,12 @@ private: Setattr(p, "emit:goinput", ivar); - if (cgo_flag) { - bool c_struct_type; - String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); - if (c_struct_type) { - Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); - } else { - Printv(call, "C.", ct, "(", ivar, ")", NULL); - } + bool c_struct_type; + String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); + if (c_struct_type) { + Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { - Printv(call, ivar, NULL); + Printv(call, "C.", ct, "(", ivar, ")", NULL); } Delete(ln); @@ -4853,19 +3741,13 @@ private: Printv(call, ")", NULL); - if (gccgo_flag && !cgo_flag && goout != NULL) { - Printv(call, "\n\t}()", NULL); + if (wt) { + // Close the type conversion to the wrapper type. + Printv(call, ")", NULL); } - - if (cgo_flag) { - if (wt) { - // Close the type conversion to the wrapper type. - Printv(call, ")", NULL); - } - if (SwigType_type(result) != T_VOID && !memcpy_ret) { - // Close the type conversion of the return value. - Printv(call, ")", NULL); - } + if (SwigType_type(result) != T_VOID && !memcpy_ret) { + // Close the type conversion of the return value. + Printv(call, ")", NULL); } Printv(call, "\n", NULL); @@ -4905,11 +3787,8 @@ private: // The Go function which invokes the method. This is called by // the C++ method on the director class. - if (cgo_flag) { - Printv(f_go_wrappers, "//export ", callback_name, "\n", NULL); - } - - Printv(f_go_wrappers, "func ", callback_name, "(swig_c int", NULL); + Printv(f_go_wrappers, "//export ", callback_name, "\n", + "func ", callback_name, "(swig_c int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { @@ -5015,23 +3894,11 @@ private: } Printv(call, "\n", NULL); - if (gccgo_flag && !cgo_flag) { - if (goout != NULL) { - Printv(f_go_wrappers, "\tfunc() {\n", NULL); - } - Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); - Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); - } - Printv(f_go_wrappers, "\tswig_p := swigDirectorLookup(swig_c).(*", director_struct_name, ")\n", NULL); Printv(f_go_wrappers, goincode, NULL); Printv(f_go_wrappers, call, NULL); Delete(call); - if (gccgo_flag && !cgo_flag && goout != NULL) { - Printv(f_go_wrappers, "\t}()\n", NULL); - } - if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); @@ -5133,241 +4000,6 @@ private: * Emit the function wrapper for a director method. * ------------------------------------------------------------ */ void makeDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { - if (cgo_flag) { - makeCgoDirectorMethodWrapper(n, w, callback_name); - return; - } - - ParmList *parms = Getattr(n, "wrap:parms"); - SwigType *result = Getattr(n, "type"); - - String *callback_wname = Swig_name_wrapper(callback_name); - Append(callback_wname, unique_id); - - if (!gccgo_flag) { - Printv(f_c_directors, "extern \"C\" void ", callback_wname, "(void*, int);\n", NULL); - } else { - Printv(f_c_directors, "extern \"C\" ", NULL); - - String *fnname = NewString(""); - Printv(fnname, callback_wname, "(int", NULL); - - Parm *p = parms; - while (p) { - while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { - p = Getattr(p, "tmap:directorin:next"); - } - String *cg = gccgoCTypeForGoValue(p, Getattr(p, "type"), - Getattr(p, "lname")); - Printv(fnname, ", ", cg, NULL); - Delete(cg); - p = Getattr(p, "tmap:directorin:next"); - } - - Printv(fnname, ")", NULL); - - if (SwigType_type(result) == T_VOID) { - Printv(f_c_directors, "void ", fnname, NULL); - } else { - String *tm = gccgoCTypeForGoValue(n, result, fnname); - Printv(f_c_directors, tm, NULL); - Delete(tm); - } - - Delete(fnname); - - Printv(f_c_directors, " __asm__(\"", go_prefix, ".", callback_name, "\");\n", NULL); - } - - if (!gccgo_flag) { - Printv(w->code, " struct {\n", NULL); - Printv(w->code, " intgo go_val;\n", NULL); - - Parm *p = parms; - while (p) { - while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { - p = Getattr(p, "tmap:directorin:next"); - } - String *ln = Getattr(p, "lname"); - String *cg = gcCTypeForGoValue(p, Getattr(p, "type"), ln); - Printv(w->code, " ", cg, ";\n", NULL); - Delete(cg); - p = Getattr(p, "tmap:directorin:next"); - } - if (SwigType_type(result) != T_VOID) { - Printv(w->code, " long : 0;\n", NULL); - String *rname = NewString(Swig_cresult_name()); - String *cg = gcCTypeForGoValue(n, result, rname); - Printv(w->code, " ", cg, ";\n", NULL); - Delete(cg); - Delete(rname); - } - - Printv(w->code, " } SWIGSTRUCTPACKED swig_a;\n", NULL); - Printv(w->code, " swig_a.go_val = go_val;\n", NULL); - - p = parms; - while (p) { - while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { - p = Getattr(p, "tmap:directorin:next"); - } - String *tm = Getattr(p, "tmap:directorin"); - if (!tm) { - Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, - line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); - } else { - tm = Copy(tm); - String *ln = Getattr(p, "lname"); - String *input = NewString(""); - Printv(input, "swig_a.", ln, NULL); - Setattr(p, "emit:directorinput", input); - Replaceall(tm, "$input", input); - Replaceall(tm, "$owner", "0"); - Delete(input); - Printv(w->code, "\t", tm, "\n", NULL); - Delete(tm); - } - p = Getattr(p, "tmap:directorin:next"); - } - - Printv(w->code, " crosscall2(", callback_wname, ", &swig_a, (int) sizeof swig_a);\n", NULL); - - /* Marshal outputs */ - for (p = parms; p;) { - String *tm; - if ((tm = Getattr(p, "tmap:directorargout"))) { - tm = Copy(tm); - Replaceall(tm, "$result", "jresult"); - Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); - Printv(w->code, tm, "\n", NIL); - Delete(tm); - p = Getattr(p, "tmap:directorargout:next"); - } else { - p = nextSibling(p); - } - } - - if (SwigType_type(result) != T_VOID) { - String *result_str = NewString("c_result"); - String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); - if (!tm) { - Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, - "Unable to use type %s as director method result\n", SwigType_str(result, 0)); - } else { - static const String *swig_a_result = NewStringf("swig_a.%s", Swig_cresult_name()); - Replaceall(tm, "$input", swig_a_result); - Replaceall(tm, "$result", "c_result"); - Printv(w->code, " ", tm, "\n", NULL); - String *retstr = SwigType_rcaststr(result, "c_result"); - Printv(w->code, " return ", retstr, ";\n", NULL); - Delete(retstr); - Delete(tm); - } - Delete(result_str); - } - - // The C wrapper code which calls the Go function. - Printv(f_gc_wrappers, "#pragma dynexport ", callback_wname, " ", callback_wname, "\n", NULL); - Printv(f_gc_wrappers, "#pragma cgo_export_static ", callback_wname, " ", callback_wname, "\n", NULL); - Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); - Printv(f_gc_wrappers, "extern void \xc2\xb7", callback_name, "();\n", NULL); - Printv(f_gc_wrappers, "void\n", NULL); - Printv(f_gc_wrappers, callback_wname, "(void *a, int32 n)\n", NULL); - Printv(f_gc_wrappers, "{\n", NULL); - Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", callback_name, ", a, n);\n", NULL); - Printv(f_gc_wrappers, "}\n\n", NULL); - } else { - if (SwigType_type(result) != T_VOID) { - String *r = NewString(Swig_cresult_name()); - String *tm = gccgoCTypeForGoValue(n, result, r); - Wrapper_add_local(w, r, tm); - Delete(tm); - Delete(r); - } - - String *args = NewString(""); - - Parm *p = parms; - while (p) { - while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { - p = Getattr(p, "tmap:directorin:next"); - } - - String *pn = NewString("g"); - Append(pn, Getattr(p, "lname")); - Setattr(p, "emit:directorinput", pn); - - String *tm = gccgoCTypeForGoValue(n, Getattr(p, "type"), pn); - Wrapper_add_local(w, pn, tm); - Delete(tm); - - tm = Getattr(p, "tmap:directorin"); - if (!tm) { - Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, - line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); - } else { - tm = Copy(tm); - Replaceall(tm, "$input", pn); - Replaceall(tm, "$owner", 0); - Printv(w->code, " ", tm, "\n", NULL); - Delete(tm); - - Printv(args, ", ", pn, NULL); - } - - p = Getattr(p, "tmap:directorin:next"); - } - - Printv(w->code, " ", NULL); - if (SwigType_type(result) != T_VOID) { - Printv(w->code, Swig_cresult_name(), " = ", NULL); - } - Printv(w->code, callback_wname, "(go_val", args, ");\n", NULL); - - /* Marshal outputs */ - for (p = parms; p;) { - String *tm; - if ((tm = Getattr(p, "tmap:directorargout"))) { - tm = Copy(tm); - Replaceall(tm, "$result", "jresult"); - Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); - Printv(w->code, tm, "\n", NIL); - Delete(tm); - p = Getattr(p, "tmap:directorargout:next"); - } else { - p = nextSibling(p); - } - } - - if (SwigType_type(result) != T_VOID) { - String *result_str = NewString("c_result"); - String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); - if (!tm) { - Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, - "Unable to use type %s as director method result\n", SwigType_str(result, 0)); - } else { - Replaceall(tm, "$input", Swig_cresult_name()); - Replaceall(tm, "$result", "c_result"); - Printv(w->code, " ", tm, "\n", NULL); - String *retstr = SwigType_rcaststr(result, "c_result"); - Printv(w->code, " return ", retstr, ";\n", NULL); - Delete(retstr); - Delete(tm); - } - Delete(result_str); - } - } - - Delete(callback_wname); - } - - /* ------------------------------------------------------------ - * makeDirectorMethodWrapper - * - * Emit the function wrapper for a director method for cgo. - * ------------------------------------------------------------ */ - - void makeCgoDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { ParmList *parms = Getattr(n, "wrap:parms"); SwigType *result = Getattr(n, "type"); @@ -6085,6 +4717,7 @@ private: } bool r = addSymbol(name, n, scope) ? true : false; assert(r); + (void)r; return true; } diff --git a/Source/Modules/guile.cxx b/Source/Modules/guile.cxx index 7b42ff94f..d7d3da8fc 100644 --- a/Source/Modules/guile.cxx +++ b/Source/Modules/guile.cxx @@ -255,7 +255,7 @@ public: if (goops) { if (linkage != GUILE_LSTYLE_PASSIVE && linkage != GUILE_LSTYLE_MODULE) { Printf(stderr, "guile: GOOPS support requires passive or module linkage\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); } } @@ -719,7 +719,6 @@ public: sprintf(source, "argv[%d]", i); else sprintf(source, "s_%d", i); - String *target = Getattr(p, "lname"); if (!args_passed_as_array) { if (i != 0) @@ -730,8 +729,6 @@ public: Printf(f->code, " if (%s != SCM_UNDEFINED) {\n", source); } if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); @@ -794,7 +791,6 @@ public: /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -807,8 +803,6 @@ public: String *returns_argout = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); @@ -828,7 +822,6 @@ public: /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); @@ -859,8 +852,6 @@ public: // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$result", "gswig_result"); - Replaceall(tm, "$target", "gswig_result"); - Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else @@ -898,13 +889,11 @@ public: if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) @@ -1141,9 +1130,7 @@ public: /* Check for a setting of the variable value */ Printf(f->code, "if (s_0 != SCM_UNDEFINED) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { - Replaceall(tm, "$source", "s_0"); Replaceall(tm, "$input", "s_0"); - Replaceall(tm, "$target", name); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); } else { @@ -1155,8 +1142,6 @@ public: // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$source", name); - Replaceall(tm, "$target", "gswig_result"); Replaceall(tm, "$result", "gswig_result"); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); @@ -1334,9 +1319,7 @@ public: // See if there's a typemap if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { - Replaceall(tm, "$source", value); Replaceall(tm, "$value", value); - Replaceall(tm, "$target", name); Printv(f_header, tm, "\n", NIL); } else { // Create variable and assign it a value diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 259f23f8e..958da8ed1 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -1001,8 +1001,6 @@ public: // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { addThrows(n, "tmap:in", p); - Replaceall(tm, "$source", arg); /* deprecated */ - Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); @@ -1027,7 +1025,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { addThrows(n, "tmap:check", p); - Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); @@ -1041,7 +1038,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { addThrows(n, "tmap:freearg", p); - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); @@ -1055,8 +1051,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { addThrows(n, "tmap:argout", p); - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ - Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -1090,8 +1084,6 @@ public: /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { addThrows(n, "tmap:out", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ - Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) @@ -1118,7 +1110,6 @@ public: if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:newfree", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } @@ -1127,7 +1118,6 @@ public: if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:ret", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } @@ -1633,7 +1623,7 @@ public: if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) - Printf(constants_code, "%s.swigToEnum(%s.%s());\n", return_type, full_imclass_name, Swig_name_get(getNSpace(), symname)); + Printf(constants_code, "%s.swigToEnum(%s.%s());\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); @@ -1853,11 +1843,11 @@ public: * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ - void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { + void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, SwigType *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); - String *c_baseclass = SwigType_namestr(Getattr(base, "name")); + SwigType *c_baseclassname = Getattr(base, "name"); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); @@ -1877,11 +1867,11 @@ public: Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); + Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); - Delete(c_baseclass); } Delete(keys); } @@ -1892,19 +1882,23 @@ public: * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ - void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { + void upcastsCode(SwigType *smart, String *upcast_method_name, SwigType *c_classname, SwigType *c_baseclassname) { String *jniname = makeValidJniName(upcast_method_name); String *wname = Swig_name_wrapper(jniname); + Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method_name); + + String *classname = SwigType_namestr(c_classname); + String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { - SwigType *bsmart = Copy(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); - Replaceall(bsmart, rclassname, rbaseclass); - Delete(rclassname); - Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); - String *bsmartnamestr = SwigType_namestr(bsmart); + String *bsmartnamestr = SwigType_namestr(smart); + + // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates + SwigType *rclassname = SwigType_typedef_resolve_all(classname); + SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); + Replaceall(bsmartnamestr, rclassname, rbaseclassname); + Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" @@ -1915,19 +1909,24 @@ public: " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n" " return baseptr;\n" "}\n", "\n", NIL); + + Delete(rbaseclassname); + Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); - Delete(bsmart); } else { Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" " (void)jenv;\n" " (void)jcls;\n" - " *(", c_baseclass, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" + " *(", baseclassname, " **)&baseptr = *(", classname, " **)&jarg1;\n" " return baseptr;\n" "}\n", "\n", NIL); } + + Delete(baseclassname); + Delete(classname); Delete(wname); Delete(jniname); } @@ -1937,10 +1936,9 @@ public: * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { - String *c_classname = SwigType_namestr(Getattr(n, "name")); - String *c_baseclass = NULL; + SwigType *c_classname = Getattr(n, "name"); + SwigType *c_baseclassname = NULL; String *baseclass = NULL; - String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); @@ -1962,12 +1960,13 @@ public: Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { - String *baseclassname = Getattr(base.item, "name"); + SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { - c_baseclassname = baseclassname; - baseclass = Copy(getProxyName(baseclassname)); - if (baseclass) - c_baseclass = SwigType_namestr(baseclassname); + String *name = getProxyName(baseclassname); + if (name) { + c_baseclassname = baseclassname; + baseclass = name; + } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); @@ -1984,7 +1983,7 @@ public: if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); - bool derived = baseclass && getProxyName(c_baseclassname); + bool derived = baseclass != 0; if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; @@ -1992,7 +1991,6 @@ public: if (purebase_replace) { wanted_base = pure_baseclass; derived = false; - Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The javabase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); @@ -2115,12 +2113,11 @@ public: if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); } Delete(smart); - Delete(baseclass); } /* ---------------------------------------------------------------------- @@ -2138,7 +2135,8 @@ public: } Printv(f_interface, typemapLookup(n, "javaimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); - Printf(f_interface, "public interface %s", interface_name); + Printv(f_interface, typemapLookup(n, "javainterfacemodifiers", Getattr(n, "classtypeobj"), WARN_JAVA_TYPEMAP_INTERFACEMODIFIERS_UNDEF), NIL); + Printf(f_interface, " %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { @@ -4828,34 +4826,27 @@ public: // .'s to delimit namespaces, so we need to replace those with /'s Replace(internal_classname, NSPACE_SEPARATOR, "/", DOH_REPLACE_ANY); - Wrapper_add_localv(w, "baseclass", "static jclass baseclass", "= 0", NIL); Printf(w->def, "void %s::swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global) {", director_classname); + Printf(w->def, "static jclass baseclass = swig_new_global_ref(jenv, \"%s\");\n", internal_classname); + Printf(w->def, "if (!baseclass) return;\n"); + if (first_class_dmethod != curr_class_dmethod) { - Printf(w->def, "static struct {\n"); - Printf(w->def, "const char *mname;\n"); - Printf(w->def, "const char *mdesc;\n"); - Printf(w->def, "jmethodID base_methid;\n"); - Printf(w->def, "} methods[] = {\n"); + Printf(w->def, "static SwigDirectorMethod methods[] = {\n"); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); - Printf(w->def, "{ \"%s\", \"%s\", NULL }", Getattr(udata, "method"), Getattr(udata, "fdesc")); + Printf(w->def, "SwigDirectorMethod(jenv, baseclass, \"%s\", \"%s\")", Getattr(udata, "method"), Getattr(udata, "fdesc")); if (i != curr_class_dmethod - 1) Putc(',', w->def); Putc('\n', w->def); } - Printf(w->def, "};\n"); + Printf(w->def, "};"); } Printf(w->code, "if (swig_set_self(jenv, jself, swig_mem_own, weak_global)) {\n"); - Printf(w->code, "if (!baseclass) {\n"); - Printf(w->code, "baseclass = jenv->FindClass(\"%s\");\n", internal_classname); - Printf(w->code, "if (!baseclass) return;\n"); - Printf(w->code, "baseclass = (jclass) jenv->NewGlobalRef(baseclass);\n"); - Printf(w->code, "}\n"); int n_methods = curr_class_dmethod - first_class_dmethod; @@ -4870,12 +4861,8 @@ public: /* Emit the code to look up the class's methods, initialize the override array */ - Printf(w->code, "bool derived = (jenv->IsSameObject(baseclass, jcls) ? false : true);\n"); - Printf(w->code, "for (int i = 0; i < %d; ++i) {\n", n_methods); - Printf(w->code, " if (!methods[i].base_methid) {\n"); - Printf(w->code, " methods[i].base_methid = jenv->GetMethodID(baseclass, methods[i].mname, methods[i].mdesc);\n"); - Printf(w->code, " if (!methods[i].base_methid) return;\n"); - Printf(w->code, " }\n"); + Printf(w->code, " bool derived = (jenv->IsSameObject(baseclass, jcls) ? false : true);\n"); + Printf(w->code, " for (int i = 0; i < %d; ++i) {\n", n_methods); // Generally, derived classes have a mix of overridden and // non-overridden methods and it is worth making a GetMethodID // check during initialization to determine if each method is @@ -4895,8 +4882,8 @@ public: } else { Printf(w->code, " swig_override[i] = false;\n"); Printf(w->code, " if (derived) {\n"); - Printf(w->code, " jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc);\n"); - Printf(w->code, " swig_override[i] = (methid != methods[i].base_methid);\n"); + Printf(w->code, " jmethodID methid = jenv->GetMethodID(jcls, methods[i].name, methods[i].desc);\n"); + Printf(w->code, " swig_override[i] = methods[i].methid && (methid != methods[i].methid);\n"); Printf(w->code, " jenv->ExceptionClear();\n"); Printf(w->code, " }\n"); } diff --git a/Source/Modules/javascript.cxx b/Source/Modules/javascript.cxx index 8c87330b7..d3ae3ce64 100644 --- a/Source/Modules/javascript.cxx +++ b/Source/Modules/javascript.cxx @@ -197,6 +197,11 @@ public: */ virtual int emitWrapperFunction(Node *n); + /** + * Invoked by nativeWrapper callback + */ + virtual int emitNativeFunction(Node *n); + /** * Invoked from constantWrapper after call to Language::constantWrapper. **/ @@ -311,6 +316,7 @@ public: virtual int classHandler(Node *n); virtual int functionWrapper(Node *n); virtual int constantWrapper(Node *n); + virtual int nativeWrapper(Node *n); virtual void main(int argc, char *argv[]); virtual int top(Node *n); @@ -441,6 +447,18 @@ int JAVASCRIPT::constantWrapper(Node *n) { return SWIG_OK; } +/* --------------------------------------------------------------------- + * nativeWrapper() + * + * Function wrapper for generating placeholders for native functions + * --------------------------------------------------------------------- */ + +int JAVASCRIPT::nativeWrapper(Node *n) { + emitter->emitNativeFunction(n); + + return SWIG_OK; +} + /* --------------------------------------------------------------------- * classHandler() * @@ -709,7 +727,7 @@ Node *JSEmitter::getBaseClass(Node *n) { /* ----------------------------------------------------------------------------- * JSEmitter::emitWrapperFunction() : dispatches emitter functions. * - * This allows to have small sized, dedicated emitting functions. + * This allows having small sized, dedicated emitting functions. * All state dependent branching is done here. * ----------------------------------------------------------------------------- */ @@ -768,6 +786,14 @@ int JSEmitter::emitWrapperFunction(Node *n) { return ret; } +int JSEmitter::emitNativeFunction(Node *n) { + String *wrapname = Getattr(n, "wrap:name"); + enterFunction(n); + state.function(WRAPPER_NAME, wrapname); + exitFunction(n); + return SWIG_OK; +} + int JSEmitter::enterClass(Node *n) { state.clazz(RESET); state.clazz(NAME, Getattr(n, "sym:name")); @@ -1549,7 +1575,8 @@ void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, Ma Printf(arg, "argv[%d]", i); break; default: - throw "Illegal state."; + Printf(stderr, "Illegal MarshallingMode."); + SWIG_exit(EXIT_FAILURE); } tm = emitInputTypemap(n, p, wrapper, arg); Delete(arg); @@ -2186,7 +2213,8 @@ void V8Emitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, Mar Printf(arg, "args[%d]", i); break; default: - throw "Illegal state."; + Printf(stderr, "Illegal MarshallingMode."); + SWIG_exit(EXIT_FAILURE); } tm = emitInputTypemap(n, p, wrapper, arg); diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index f7979b611..66aebdea1 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -722,18 +722,18 @@ int Language::typemapDirective(Node *n) { String *code = Getattr(n, "code"); Parm *kwargs = Getattr(n, "kwargs"); Node *items = firstChild(n); - static int namewarn = 0; + static int nameerror = 0; if (code && (Strstr(code, "$source") || (Strstr(code, "$target")))) { - Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "Deprecated typemap feature ($source/$target).\n"); - if (!namewarn) { - Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "The use of $source and $target in a typemap declaration is deprecated.\n\ + Swig_error(Getfile(n), Getline(n), "Obsolete typemap feature ($source/$target).\n"); + if (!nameerror) { + Swig_error(Getfile(n), Getline(n), "The use of $source and $target in a typemap declaration is no longer supported.\n\ For typemaps related to argument input (in,ignore,default,arginit,check), replace\n\ $source by $input and $target by $1. For typemaps related to return values (out,\n\ argout,ret,except), replace $source by $1 and $target by $result. See the file\n\ Doc/Manual/Typemaps.html for complete details.\n"); - namewarn = 1; + nameerror = 1; } } @@ -1481,8 +1481,6 @@ int Language::membervariableHandler(Node *n) { } else { String *pname0 = Swig_cparm_name(0, 0); String *pname1 = Swig_cparm_name(0, 1); - Replace(tm, "$source", pname1, DOH_REPLACE_ANY); - Replace(tm, "$target", target, DOH_REPLACE_ANY); Replace(tm, "$input", pname1, DOH_REPLACE_ANY); Replace(tm, "$self", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); @@ -3049,8 +3047,6 @@ int Language::variableWrapper(Node *n) { } } else { String *pname0 = Swig_cparm_name(0, 0); - Replace(tm, "$source", pname0, DOH_REPLACE_ANY); - Replace(tm, "$target", name, DOH_REPLACE_ANY); Replace(tm, "$input", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); Delete(tm); diff --git a/Source/Modules/lua.cxx b/Source/Modules/lua.cxx index 188b11c2b..4ba9cb8c3 100644 --- a/Source/Modules/lua.cxx +++ b/Source/Modules/lua.cxx @@ -613,13 +613,9 @@ public: } SwigType *pt = Getattr(p, "type"); - String *ln = Getattr(p, "lname"); - /* Look for an input typemap */ sprintf(source, "%d", i + 1); if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { @@ -678,7 +674,6 @@ public: /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -690,7 +685,6 @@ public: String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { @@ -709,8 +703,6 @@ public: // returnval+=GetInt(p,"tmap:argout:numoutputs"); // } // else returnval++; - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", Swig_cresult_name()); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); @@ -740,7 +732,6 @@ public: // returnval+=GetInt(tm,"numoutputs"); // } // else returnval++; - Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { @@ -762,14 +753,12 @@ public: /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } @@ -1002,6 +991,7 @@ public: // REPORT("variableWrapper", n); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); + (void)lua_name; current[VARIABLE] = true; // let SWIG generate the wrappers int result = Language::variableWrapper(n); @@ -1073,14 +1063,10 @@ public: } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); registerConstant(luaCurrentSymbolNSpace(), tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); @@ -1109,8 +1095,6 @@ public: Setattr(n_v2, "sym:name", lua_name_v2); tm_v2 = Swig_typemap_lookup("consttab", n_v2, name, 0); if (tm_v2) { - Replaceall(tm_v2, "$source", value); - Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); registerConstant(getNSpace(), tm_v2); @@ -1122,8 +1106,6 @@ public: Swig_restore(n); return SWIG_ERROR; } - Replaceall(tm_v2, "$source", value); - Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); Printf(f_init, "%s\n", tm_v2); diff --git a/Source/Modules/main.cxx b/Source/Modules/main.cxx index c6bd148e2..d8f2ab6b4 100644 --- a/Source/Modules/main.cxx +++ b/Source/Modules/main.cxx @@ -23,6 +23,7 @@ #include "swigwarn.h" #include "cparse.h" #include +#include #include // for INT_MAX // Global variables @@ -1140,9 +1141,9 @@ int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm) { } else f_dependencies_file = stdout; if (dependencies_target) { - Printf(f_dependencies_file, "%s: ", dependencies_target); + Printf(f_dependencies_file, "%s: ", Swig_filename_escape_space(dependencies_target)); } else { - Printf(f_dependencies_file, "%s: ", outfile); + Printf(f_dependencies_file, "%s: ", Swig_filename_escape_space(outfile)); } List *files = Preprocessor_depend(); List *phony_targets = NewList(); @@ -1153,7 +1154,7 @@ int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm) { use_file = 0; } if (use_file) { - Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i)); + Printf(f_dependencies_file, "\\\n %s ", Swig_filename_escape_space(Getitem(files, i))); if (depend_phony) Append(phony_targets, Getitem(files, i)); } @@ -1161,7 +1162,7 @@ int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm) { Printf(f_dependencies_file, "\n"); if (depend_phony) { for (int i = 0; i < Len(phony_targets); i++) { - Printf(f_dependencies_file, "\n%s:\n", Getitem(phony_targets, i)); + Printf(f_dependencies_file, "\n%s:\n", Swig_filename_escape_space(Getitem(phony_targets, i))); } } @@ -1376,13 +1377,15 @@ int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm) { while (freeze) { } - if ((werror) && (Swig_warn_count())) { - return Swig_warn_count(); - } - delete lang; - return Swig_error_count(); + int error_count = werror ? Swig_warn_count() : 0; + error_count += Swig_error_count(); + + if (error_count != 0) + SWIG_exit(error_count); + + return 0; } /* ----------------------------------------------------------------------------- @@ -1394,5 +1397,20 @@ int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm) { void SWIG_exit(int exit_code) { while (freeze) { } + + if (exit_code > 0) { + CloseAllOpenFiles(); + + /* Remove all generated files */ + if (all_output_files) { + for (int i = 0; i < Len(all_output_files); i++) { + String *filename = Getitem(all_output_files, i); + int removed = remove(Char(filename)); + if (removed == -1) + fprintf(stderr, "On exit, could not delete file %s: %s\n", Char(filename), strerror(errno)); + } + } + } + exit(exit_code); } diff --git a/Source/Modules/modula3.cxx b/Source/Modules/modula3.cxx deleted file mode 100644 index c606845ea..000000000 --- a/Source/Modules/modula3.cxx +++ /dev/null @@ -1,3931 +0,0 @@ -/* ----------------------------------------------------------------------------- - * This file is part of SWIG, which is licensed as a whole under version 3 - * (or any later version) of the GNU General Public License. Some additional - * terms also apply to certain portions of SWIG. The full details of the SWIG - * license and copyrights can be found in the LICENSE and COPYRIGHT files - * included with the SWIG source code as distributed by the SWIG developers - * and at http://www.swig.org/legal.html. - * - * modula3.cxx - * - * Modula3 language module for SWIG. - * ----------------------------------------------------------------------------- */ - -/* - Text formatted with - indent -sob -br -ce -nut -npsl -*/ - -/* - Report: - - It's not a good concept to use member variables or global variables - for passing parameters to functions. - It's not a good concept to use functions of superclasses for specific services. - E.g. For SWIG this means: Generating accessor functions for member variables - is the most common but no general task to be processed in membervariableHandler. - Better provide a service function which generates accessor function code - and equip this service function with all parameters needed for input (parse node) - and output (generated code). - - How can I make globalvariableHandler not to generate - interface functions to two accessor functions - (that don't exist) ? - - How can I generate a typemap that turns every C reference argument into - its Modula 3 counterpart, that is - void test(Complex &z); - PROCEDURE test(VAR z:Complex); - - neither $*n_mangle nor $*n_type nor $*n_ltype return the type without - pointer converted to Modula3 equivalent, - $*n_mangle is the variant closest to what I expect - - using a typemap like - typemap(m3wrapintype) int * %{VAR $1_name: INTEGER%} - has the advantages: - - one C parameter can be turned into multiple M3 parameters - - the argument can be renamed - - using typemaps like - typemap(m3wrapinmode) int * "VAR" - typemap(m3wrapintype) int * "INTEGER" - has the advantages: - - multiple parameters with same type and default value can be bundled - - more conform to the other language modules - - Where takes the reduction of multi-typemaps place? - How can I preserve all parameters for functions of the intermediary class? - The answer is Getattrs(n,"tmap:m3rawintype:next") - - Char() can be used to transform a String to (char *) - which can be used for output with printf - - What is the while (checkAttribute()) loop in functionWrapper good for? - Appearently for skipping (numinputs=0) typemaps. - - SWIGTYPE const * - typemap is ignored, whereas - SWIGTYPE * - typemap is invoked, why? - Had it been (const SWIGTYPE *) instead? - - enumeration items should definitely be equipped - with its plain numerical value - One could add tag 'numvalue' in CParse/parser.y, - but it is still possible that someone declares an - enumeration using a symbolic constant. - I have quickly hacked - that the successive number is assigned - if "enumvalue" has suffix "+1". - The ultimate solution would be to generate a C program - which includes the header and outputs all constants. - This program might be compiled and run - by 'make' or by SWIG and the resulting output is fed back to SWIG. - - It's a bad idea to interpret feature value "" - 'disable feature' because the value "" - might be sensible in case of feature:modula3:oldprefix. - - What's the difference between "sym:name" and "name" ? - "name" is the original name and - "sym:name" is probably modified by the user using %rename - - Is it possible for 'configure' to find out if m3pp is installed - and to invoke it for generated Modula3 files? - - It would be better to separate an arguments purpose and its name, - because an output variable with name "OUTPUT" is not very descriptive. - In case of PLPlot this could be solved by typedefs - that assign special purposes to the array types. - - Can one interpret $n_basetype as the identifier matched with SWIGTYPE ? - - SWIG's odds: - - arguments of type (Node *) for SWIG functions - should be most often better (const Node *): - Swig_symbol_qualified, Getattr, nodeType, parentNode - - unique identifier style instead of - NewString, Getattr, firstChild - - 'class'.name is qualified, - 'enum'.name and 'enumitem'.name is not - - Swig_symbol_qualified() returns NIL for enumeration nodes - - - Is there a function that creates a C representation of a SWIG type string? - - ToDo: - - create WeakRefs only for resources returned by function marked with %newobject - -> part of output conversion - - clean typemap conception - - should a multi-typemap for m3wrapouttype skip the corresponding input parameters? - when yes - How to handle inout-arguments? In this case like in-argument. - - C++ classes - - C++ exceptions - - allow for moving RECORD and OBJECT definitions - to separate files, with the main type called T - - call-back functions - - special option: fast access to class members by pointer arithmetic, - member offsets can be determined by a C++ program that print them. - - emit enumeration definitions when its first item is declared, - currently enumerations are emitted at the beginning of the file - - Done: - - addThrow should convert the typemap by itself - - not possible because routine for attaching mapped types to parameter nodes - won't work for the function node - - turning error codes into exceptions - -> part of output value checking - - create WeakRefs for resources allocated by the library - -> part of output conversion - - TRY..FINALLY..END; can be omitted - - if there is no m3wrapfreearg - - no exception can be raised in the body (empty RAISES) list -*/ - -#include "swigmod.h" - -#include // for INT_MAX -#include - -#define USAGE_ARG_DIR "m3wrapargdir typemap expect values: in, out, inout\n" - -class MODULA3:public Language { -public: - enum block_type { no_block, constant, variable, blocktype, revelation }; - -private: - struct M3File { - String *f; - Hash *import; - block_type bt; - /* VC++ 6 doesn't allow the access to 'no_block' - if it is a private member of MODULA3 class */ - M3File():f(NewString("")), import(NewHash()), bt(no_block) { - } - ~M3File() { - Delete(f); - Delete(import); - } - - /* ----------------------------------------------------------------------------- - * enterBlock() - * - * Make sure that a given declaration is written to the right declaration block, - * that is constants are written after "CONST" and so on ... - * ----------------------------------------------------------------------------- */ - void enterBlock(block_type newbt) { - static const char *ident[] = { "", "\nCONST\n", "\nVAR\n", "\nTYPE\n", "\nREVEAL\n" }; -#ifdef DEBUG - if ((bt < 0) || (4 < bt)) { - printf("bt %d out of range\n", bt); - } -#endif - if (newbt != bt) { - Append(f, ident[newbt]); - bt = newbt; - } - } - - }; - - static const char *usage; - const String *empty_string; - - Hash *swig_types_hash; - File *f_begin; - File *f_runtime; - File *f_header; - File *f_wrappers; - File *f_init; - - bool proxy_flag; // Flag for generating proxy classes - bool have_default_constructor_flag; - bool native_function_flag; // Flag for when wrapping a native function - bool enum_constant_flag; // Flag for when wrapping an enum or constant - bool static_flag; // Flag for when wrapping a static functions or member variables - bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable - bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const - bool global_variable_flag; // Flag for when wrapping a global variable - bool old_variable_names; // Flag for old style variable names in the intermediary class - bool unsafe_module; - - String *m3raw_name; // raw interface name - M3File m3raw_intf; // raw interface - M3File m3raw_impl; // raw implementation (usually empty) - String *m3wrap_name; // wrapper module - M3File m3wrap_intf; - M3File m3wrap_impl; - String *m3makefile; - String *targetlibrary; - String *proxy_class_def; - String *proxy_class_code; - String *proxy_class_name; - String *variable_name; //Name of a variable being wrapped - String *variable_type; //Type of this variable - Hash *enumeration_coll; //Collection of all enumerations. - /* The items are nodes with members: - "items" - hash of with key 'itemname' and content 'itemvalue' - "max" - maximum value in item list - */ - String *constant_values; - String *constantfilename; - String *renamefilename; - String *typemapfilename; - String *m3raw_imports; //intermediary class imports from %pragma - String *module_imports; //module imports from %pragma - String *m3raw_baseclass; //inheritance for intermediary class class from %pragma - String *module_baseclass; //inheritance for module class from %pragma - String *m3raw_interfaces; //interfaces for intermediary class class from %pragma - String *module_interfaces; //interfaces for module class from %pragma - String *m3raw_class_modifiers; //class modifiers for intermediary class overridden by %pragma - String *m3wrap_modifiers; //class modifiers for module class overridden by %pragma - String *upcasts_code; //C++ casts for inheritance hierarchies C++ code - String *m3raw_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code - String *destructor_call; //C++ destructor call if any - String *outfile; - - enum type_additions { none, pointer, reference }; - -public: - - /* ----------------------------------------------------------------------------- - * MODULA3() - * ----------------------------------------------------------------------------- */ - -MODULA3(): - empty_string(NewString("")), - swig_types_hash(NULL), - f_begin(NULL), - f_runtime(NULL), - f_header(NULL), - f_wrappers(NULL), - f_init(NULL), - proxy_flag(true), - have_default_constructor_flag(false), - native_function_flag(false), - enum_constant_flag(false), - static_flag(false), - variable_wrapper_flag(false), - wrapping_member_flag(false), - global_variable_flag(false), - old_variable_names(false), - unsafe_module(false), - m3raw_name(NULL), - m3raw_intf(), - m3raw_impl(), - m3wrap_name(NULL), - m3wrap_intf(), - m3wrap_impl(), - m3makefile(NULL), - targetlibrary(NULL), - proxy_class_def(NULL), - proxy_class_code(NULL), - proxy_class_name(NULL), - variable_name(NULL), - variable_type(NULL), - enumeration_coll(NULL), - constant_values(NULL), - constantfilename(NULL), - renamefilename(NULL), - typemapfilename(NULL), - m3raw_imports(NULL), - module_imports(NULL), - m3raw_baseclass(NULL), - module_baseclass(NULL), - m3raw_interfaces(NULL), - module_interfaces(NULL), - m3raw_class_modifiers(NULL), - m3wrap_modifiers(NULL), - upcasts_code(NULL), - m3raw_cppcasts_code(NULL), - destructor_call(NULL), - outfile(NULL) { - } - - /************** some utility functions ***************/ - - /* ----------------------------------------------------------------------------- - * getMappedType() - * - * Return the type of 'p' mapped by 'map'. - * Print a standard warning if 'p' can't be mapped. - * ----------------------------------------------------------------------------- */ - - String *getMappedType(Node *p, const char *map) { - String *mapattr = NewString("tmap:"); - Append(mapattr, map); - - String *tm = Getattr(p, mapattr); - if (tm == NIL) { - Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, - "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(p, "type"), 0)); - } - Delete(mapattr); - return tm; - } - - /* ----------------------------------------------------------------------------- - * getMappedTypeNew() - * - * Similar to getMappedType but uses Swig_type_lookup_new. - * ----------------------------------------------------------------------------- */ - - String *getMappedTypeNew(Node *n, const char *map, const char *lname = "", bool warn = true) { - String *tm = Swig_typemap_lookup(map, n, lname, 0); - if ((tm == NIL) && warn) { - Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, - "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(n, "type"), 0)); - } - return tm; - } - - /* ----------------------------------------------------------------------------- - * attachMappedType() - * - * Obtain the type mapped by 'map' and attach it to the node - * ----------------------------------------------------------------------------- */ - - void attachMappedType(Node *n, const char *map, const char *lname = "") { - String *tm = Swig_typemap_lookup(map, n, lname, 0); - if (tm != NIL) { - String *attr = NewStringf("tmap:%s", map); - Setattr(n, attr, tm); - Delete(attr); - } - } - - /* ----------------------------------------------------------------------------- - * skipIgnored() - * - * Skip all parameters that have 'numinputs=0' - * with respect to a given typemap. - * ----------------------------------------------------------------------------- */ - - Node *skipIgnored(Node *p, const char *map) { - String *niattr = NewStringf("tmap:%s:numinputs", map); - String *nextattr = NewStringf("tmap:%s:next", map); - - while ((p != NIL) && checkAttribute(p, niattr, "0")) { - p = Getattr(p, nextattr); - } - - Delete(nextattr); - Delete(niattr); - return p; - } - - /* ----------------------------------------------------------------------------- - * isInParam() - * isOutParam() - * - * Check if the parameter is intended for input or for output. - * ----------------------------------------------------------------------------- */ - - bool isInParam(Node *p) { - String *dir = Getattr(p, "tmap:m3wrapargdir"); -//printf("dir for %s: %s\n", Char(Getattr(p,"name")), Char(dir)); - if ((dir == NIL) || (Strcmp(dir, "in") == 0) - || (Strcmp(dir, "inout") == 0)) { - return true; - } else if (Strcmp(dir, "out") == 0) { - return false; - } else { - printf("%s", USAGE_ARG_DIR); - return false; - } - } - - bool isOutParam(Node *p) { - String *dir = Getattr(p, "tmap:m3wrapargdir"); - if ((dir == NIL) || (Strcmp(dir, "in") == 0)) { - return false; - } else if ((Strcmp(dir, "out") == 0) || (Strcmp(dir, "inout") == 0)) { - return true; - } else { - printf("%s", USAGE_ARG_DIR); - return false; - } - } - - /* ----------------------------------------------------------------------------- - * printAttrs() - * - * For debugging: Show all attributes of a node and their values. - * ----------------------------------------------------------------------------- */ - void printAttrs(Node *n) { - Iterator it; - for (it = First(n); it.key != NIL; it = Next(it)) { - printf("%s = %s\n", Char(it.key), Char(Getattr(n, it.key))); - } - } - - /* ----------------------------------------------------------------------------- - * hasPrefix() - * - * Check if a string have a given prefix. - * ----------------------------------------------------------------------------- */ - bool hasPrefix(const String *str, const String *prefix) { - int len_prefix = Len(prefix); - return (Len(str) > len_prefix) - && (Strncmp(str, prefix, len_prefix) == 0); - } - - /* ----------------------------------------------------------------------------- - * getQualifiedName() - * - * Return fully qualified identifier of n. - * ----------------------------------------------------------------------------- */ -#if 0 - // Swig_symbol_qualified returns NIL for enumeration nodes - String *getQualifiedName(Node *n) { - String *qual = Swig_symbol_qualified(n); - String *name = Getattr(n, "name"); - if (hasContent(qual)) { - return NewStringf("%s::%s", qual, name); - } else { - return name; - } - } -#else - String *getQualifiedName(Node *n) { - String *name = Copy(Getattr(n, "name")); - n = parentNode(n); - while (n != NIL) { - const String *type = nodeType(n); - if ((Strcmp(type, "class") == 0) || (Strcmp(type, "struct") == 0) || (Strcmp(type, "namespace") == 0)) { - String *newname = NewStringf("%s::%s", Getattr(n, "name"), name); - Delete(name); - //name = newname; - // Hmpf, the class name is already qualified. - return newname; - } - n = parentNode(n); - } - //printf("qualified name: %s\n", Char(name)); - return name; - } -#endif - - /* ----------------------------------------------------------------------------- - * nameToModula3() - * - * Turn usual C identifiers like "this_is_an_identifier" - * into usual Modula 3 identifier like "thisIsAnIdentifier" - * ----------------------------------------------------------------------------- */ - String *nameToModula3(const String *sym, bool leadingCap) { - int len_sym = Len(sym); - char *csym = Char(sym); - char *m3sym = new char[len_sym + 1]; - int i, j; - bool cap = leadingCap; - for (i = 0, j = 0; j < len_sym; j++) { - char c = csym[j]; - if ((c == '_') || (c == ':')) { - cap = true; - } else { - if (isdigit(c)) { - m3sym[i] = c; - cap = true; - } else { - if (cap) { - m3sym[i] = (char)toupper(c); - } else { - m3sym[i] = (char)tolower(c); - } - cap = false; - } - i++; - } - } - m3sym[i] = 0; - String *result = NewString(m3sym); - delete[]m3sym; - return result; - } - - /* ----------------------------------------------------------------------------- - * capitalizeFirst() - * - * Make the first character upper case. - * ----------------------------------------------------------------------------- */ - String *capitalizeFirst(const String *str) { - return NewStringf("%c%s", toupper(*Char(str)), Char(str) + 1); - } - - /* ----------------------------------------------------------------------------- - * prefixedNameToModula3() - * - * If feature modula3:oldprefix and modula3:newprefix is present - * and the C identifier has leading 'oldprefix' - * then it is replaced by the 'newprefix'. - * The rest is converted to Modula style. - * ----------------------------------------------------------------------------- */ - String *prefixedNameToModula3(Node *n, const String *sym, bool leadingCap) { - String *oldPrefix = Getattr(n, "feature:modula3:oldprefix"); - String *newPrefix = Getattr(n, "feature:modula3:newprefix"); - String *result = NewString(""); - char *short_sym = Char(sym); - // if at least one prefix feature is present - // the replacement takes place - if ((oldPrefix != NIL) || (newPrefix != NIL)) { - if ((oldPrefix == NIL) || hasPrefix(sym, oldPrefix)) { - short_sym += Len(oldPrefix); - if (newPrefix != NIL) { - Append(result, newPrefix); - } - } - } - String *suffix = nameToModula3(short_sym, leadingCap || hasContent(newPrefix)); - Append(result, suffix); - Delete(suffix); - return result; - } - - /* ----------------------------------------------------------------------------- - * hasContent() - * - * Check if the string exists and contains something. - * ----------------------------------------------------------------------------- */ - bool hasContent(const String *str) { - return (str != NIL) && (Strcmp(str, "") != 0); - } - - /* ----------------------------------------------------------------------------- - * openWriteFile() - * - * Caution: The file must be freshly allocated and will be destroyed - * by this routine. - * ----------------------------------------------------------------------------- */ - - File *openWriteFile(String *name) { - File *file = NewFile(name, "w", SWIG_output_files()); - if (!file) { - FileErrorDisplay(name); - SWIG_exit(EXIT_FAILURE); - } - Delete(name); - return file; - } - - /* ----------------------------------------------------------------------------- - * aToL() - * - * like atol but with additional user warning - * ----------------------------------------------------------------------------- */ - - long aToL(const String *value) { - char *endptr; - long numvalue = strtol(Char(value), &endptr, 0); - if (*endptr != 0) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The string <%s> does not denote a numeric value.\n", value); - } - return numvalue; - } - - /* ----------------------------------------------------------------------------- - * strToL() - * - * like strtol but returns if the conversion was successful - * ----------------------------------------------------------------------------- */ - - bool strToL(const String *value, long &numvalue) { - char *endptr; - numvalue = strtol(Char(value), &endptr, 0); - return (*endptr == 0); - } - - /* ----------------------------------------------------------------------------- - * evalExpr() - * - * Evaluate simple expression as they may occur in "enumvalue" attributes. - * ----------------------------------------------------------------------------- */ - - bool evalExpr(String *value, long &numvalue) { - // Split changes file status of String and thus cannot receive 'const' strings -//printf("evaluate <%s>\n", Char(value)); - List *summands = Split(value, '+', INT_MAX); - Iterator sm = First(summands); - numvalue = 0; - for (; sm.item != NIL; sm = Next(sm)) { - String *smvalue = Getattr(constant_values, sm.item); - long smnumvalue; - if (smvalue != NIL) { - if (!strToL(smvalue, smnumvalue)) { -//printf("evaluation: abort 0 <%s>\n", Char(smvalue)); - return false; - } - } else { - if (!strToL(sm.item, smnumvalue)) { -//printf("evaluation: abort 1 <%s>\n", Char(sm)); - return false; - } - } - numvalue += smnumvalue; - } -//printf("evaluation: return %ld\n", numvalue); - return true; - } - - /* ----------------------------------------------------------------------------- - * log2() - * - * Determine the position of the single bit of a power of two. - * Returns true if the given number is a power of two. - * ----------------------------------------------------------------------------- */ - - bool log2(long n, long &exp) { - exp = 0; - while (n > 0) { - if ((n & 1) != 0) { - return n == 1; - } - exp++; - n >>= 1; - } - return false; - } - - /* ----------------------------------------------------------------------------- - * writeArg - * - * Write a function argument or RECORD entry definition. - * Bundles arguments of same type and default value. - * 'name.next==NIL' denotes the end of the entry or argument list. - * ----------------------------------------------------------------------------- */ - - bool equalNilStr(const String *str0, const String *str1) { - if (str0 == NIL) { - return (str1 == NIL); - //return (str0==NIL) == (str1==NIL); - } else { - return (str1 != NIL) && (Cmp(str0, str1) == 0); - //return Cmp(str0,str1)==0; - } - } - - struct writeArgState { - String *mode, *name, *type, *value; - bool hold; - writeArgState():mode(NIL), name(NIL), type(NIL), value(NIL), hold(false) { - } - }; - - void writeArg(File *f, writeArgState & state, String *mode, String *name, String *type, String *value) { - /* skip the first argument, - only store the information for the next call in this case */ - if (state.name != NIL) { - if ((!state.hold) && (state.mode != NIL)) { - Printf(f, "%s ", state.mode); - } - if ((name != NIL) && equalNilStr(state.mode, mode) && equalNilStr(state.type, type) && (state.value == NIL) && (value == NIL) - /* the same expression may have different values - due to side effects of the called function */ - /*equalNilStr(state.value,value) */ - ) { - Printf(f, "%s, ", state.name); - state.hold = true; - } else { - Append(f, state.name); - if (state.type != NIL) { - Printf(f, ": %s", state.type); - } - if (state.value != NIL) { - Printf(f, ":= %s", state.value); - } - Append(f, ";\n"); - state.hold = false; - } - } - /* at the next call the current argument will be the previous one */ - state.mode = mode; - state.name = name; - state.type = type; - state.value = value; - } - - /* ----------------------------------------------------------------------------- - * getProxyName() - * - * Test to see if a type corresponds to something wrapped with a proxy class - * Return NULL if not otherwise the proxy class name - * ----------------------------------------------------------------------------- */ - - String *getProxyName(SwigType *t) { - if (proxy_flag) { - Node *n = classLookup(t); - if (n) { - return Getattr(n, "sym:name"); - } - } - return NULL; - } - - /*************** language processing ********************/ - - /* ------------------------------------------------------------ - * main() - * ------------------------------------------------------------ */ - - virtual void main(int argc, char *argv[]) { - - SWIG_library_directory("modula3"); - - // Look for certain command line options - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp(argv[i], "-generateconst") == 0) { - if (argv[i + 1]) { - constantfilename = NewString(argv[i + 1]); - Swig_mark_arg(i); - Swig_mark_arg(i + 1); - i++; - } else { - Swig_arg_error(); - } - } else if (strcmp(argv[i], "-generaterename") == 0) { - if (argv[i + 1]) { - renamefilename = NewString(argv[i + 1]); - Swig_mark_arg(i); - Swig_mark_arg(i + 1); - i++; - } else { - Swig_arg_error(); - } - } else if (strcmp(argv[i], "-generatetypemap") == 0) { - if (argv[i + 1]) { - typemapfilename = NewString(argv[i + 1]); - Swig_mark_arg(i); - Swig_mark_arg(i + 1); - i++; - } else { - Swig_arg_error(); - } - } else if (strcmp(argv[i], "-noproxy") == 0) { - Swig_mark_arg(i); - proxy_flag = false; - } else if (strcmp(argv[i], "-oldvarnames") == 0) { - Swig_mark_arg(i); - old_variable_names = true; - } else if (strcmp(argv[i], "-help") == 0) { - Printf(stdout, "%s\n", usage); - } - } - } - - // Add a symbol to the parser for conditional compilation - Preprocessor_define("SWIGMODULA3 1", 0); - - // Add typemap definitions - SWIG_typemap_lang("modula3"); - SWIG_config_file("modula3.swg"); - - allow_overloading(); - } - - /* --------------------------------------------------------------------- - * top() - * --------------------------------------------------------------------- */ - - virtual int top(Node *n) { - if (hasContent(constantfilename) || hasContent(renamefilename) || hasContent(typemapfilename)) { - int result = SWIG_OK; - if (hasContent(constantfilename)) { - result = generateConstantTop(n) && result; - } - if (hasContent(renamefilename)) { - result = generateRenameTop(n) && result; - } - if (hasContent(typemapfilename)) { - result = generateTypemapTop(n) && result; - } - return result; - } else { - return generateM3Top(n); - } - } - - void scanConstant(File *file, Node *n) { - Node *child = firstChild(n); - while (child != NIL) { - String *constname = NIL; - String *type = nodeType(child); - if ((Strcmp(type, "enumitem") == 0) - || (Strcmp(type, "constant") == 0)) { -#if 1 - constname = getQualifiedName(child); -#else - constname = Getattr(child, "value"); - if ((!hasContent(constname)) - || (('0' <= *Char(constname)) && (*Char(constname) <= '9'))) { - constname = Getattr(child, "name"); - } -#endif - } - if (constname != NIL) { - Printf(file, " printf(\"%%%%constnumeric(%%Lg) %s;\\n\", (long double)%s);\n", constname, constname); - } - scanConstant(file, child); - child = nextSibling(child); - } - } - - int generateConstantTop(Node *n) { - File *file = openWriteFile(NewStringf("%s.c", constantfilename)); - if (CPlusPlus) { - Printf(file, "#include \n"); - } else { - Printf(file, "#include \n"); - } - Printf(file, "#include \"%s\"\n", input_file); - Printf(file, "\n"); - Printf(file, "int main (int argc, char *argv[]) {\n"); - Printf(file, "\ -/*This program must work for floating point numbers and integers.\n\ - Thus all numbers are converted to double precision floating point format.*/\n"); - scanConstant(file, n); - Printf(file, " return 0;\n"); - Printf(file, "}\n"); - Delete(file); - return SWIG_OK; - } - - void scanRename(File *file, Node *n) { - Node *child = firstChild(n); - while (child != NIL) { - String *type = nodeType(child); - if (Strcmp(type, "cdecl") == 0) { - ParmList *p = Getattr(child, "parms"); - if (p != NIL) { - String *name = getQualifiedName(child); - String *m3name = nameToModula3(name, true); - /*don't know how to get the original C type identifiers */ - //String *arguments = createCSignature (child); - Printf(file, "%%rename(\"%s\") %s;\n", m3name, name); - /*Printf(file, "%%rename(\"%s\") %s %s(%s);\n", - m3name, Getattr(n,"type"), name, arguments); */ - Delete(name); - Delete(m3name); - //Delete (arguments); - } - } - scanRename(file, child); - child = nextSibling(child); - } - } - - int generateRenameTop(Node *n) { - File *file = openWriteFile(NewStringf("%s.i", renamefilename)); - Printf(file, "\ -/* This file was generated from %s\n\ - by SWIG with option -generaterename. */\n\ -\n", input_file); - scanRename(file, n); - Delete(file); - return SWIG_OK; - } - - void scanTypemap(File *file, Node *n) { - Node *child = firstChild(n); - while (child != NIL) { - String *type = nodeType(child); - //printf("nodetype %s\n", Char(type)); - String *storage = Getattr(child, "storage"); - if ((Strcmp(type, "class") == 0) || ((Strcmp(type, "cdecl") == 0) && (storage != NIL) - && (Strcmp(storage, "typedef") == 0))) { - String *name = getQualifiedName(child); - String *m3name = nameToModula3(name, true); - Printf(file, "%%typemap(\"m3wrapintype\") %s %%{%s%%}\n", name, m3name); - Printf(file, "%%typemap(\"m3rawintype\") %s %%{%s%%}\n", name, m3name); - Printf(file, "\n"); - } - scanTypemap(file, child); - child = nextSibling(child); - } - } - - int generateTypemapTop(Node *n) { - File *file = openWriteFile(NewStringf("%s.i", typemapfilename)); - Printf(file, "\ -/* This file was generated from %s\n\ - by SWIG with option -generatetypemap. */\n\ -\n", input_file); - scanTypemap(file, n); - Delete(file); - return SWIG_OK; - } - - int generateM3Top(Node *n) { - /* Initialize all of the output files */ - outfile = Getattr(n, "outfile"); - - f_begin = NewFile(outfile, "w", SWIG_output_files()); - if (!f_begin) { - FileErrorDisplay(outfile); - SWIG_exit(EXIT_FAILURE); - } - f_runtime = NewString(""); - f_init = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - m3makefile = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header", f_header); - Swig_register_filebyname("wrapper", f_wrappers); - Swig_register_filebyname("begin", f_begin); - Swig_register_filebyname("runtime", f_runtime); - Swig_register_filebyname("init", f_init); - - Swig_register_filebyname("m3rawintf", m3raw_intf.f); - Swig_register_filebyname("m3rawimpl", m3raw_impl.f); - Swig_register_filebyname("m3wrapintf", m3wrap_intf.f); - Swig_register_filebyname("m3wrapimpl", m3wrap_impl.f); - Swig_register_filebyname("m3makefile", m3makefile); - - swig_types_hash = NewHash(); - - String *name = Getattr(n, "name"); - // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. - Node *optionsnode = Getattr(Getattr(n, "module"), "options"); - if (optionsnode != NIL) { - String *m3raw_name_tmp = Getattr(optionsnode, "m3rawname"); - if (m3raw_name_tmp != NIL) { - m3raw_name = Copy(m3raw_name_tmp); - } - } - if (m3raw_name == NIL) { - m3raw_name = NewStringf("%sRaw", name); - } - Setattr(m3wrap_impl.import, m3raw_name, ""); - - m3wrap_name = Copy(name); - - proxy_class_def = NewString(""); - proxy_class_code = NewString(""); - m3raw_baseclass = NewString(""); - m3raw_interfaces = NewString(""); - m3raw_class_modifiers = NewString(""); // package access only to the intermediary class by default - m3raw_imports = NewString(""); - m3raw_cppcasts_code = NewString(""); - m3wrap_modifiers = NewString("public"); - module_baseclass = NewString(""); - module_interfaces = NewString(""); - module_imports = NewString(""); - upcasts_code = NewString(""); - - Swig_banner(f_begin); - - Printf(f_runtime, "\n\n#ifndef SWIGMODULA3\n#define SWIGMODULA3\n#endif\n\n"); - - Swig_name_register("wrapper", "Modula3_%f"); - if (old_variable_names) { - Swig_name_register("set", "set_%n%v"); - Swig_name_register("get", "get_%n%v"); - } - - Printf(f_wrappers, "\n#ifdef __cplusplus\n"); - Printf(f_wrappers, "extern \"C\" {\n"); - Printf(f_wrappers, "#endif\n\n"); - - constant_values = NewHash(); - scanForConstPragmas(n); - enumeration_coll = NewHash(); - collectEnumerations(enumeration_coll, n); - - /* Emit code */ - Language::top(n); - - // Generate m3makefile - // This will be unnecessary if SWIG is invoked from Quake. - { - File *file = openWriteFile(NewStringf("%sm3makefile", SWIG_output_directory())); - - Printf(file, "%% automatically generated quake file for %s\n\n", name); - - /* Write the fragments written by '%insert' - collected while 'top' processed the parse tree */ - Printv(file, m3makefile, NIL); - - Printf(file, "import(\"libm3\")\n"); - //Printf(file, "import_lib(\"%s\",\"/usr/lib\")\n", name); - Printf(file, "module(\"%s\")\n", m3raw_name); - Printf(file, "module(\"%s\")\n\n", m3wrap_name); - - if (targetlibrary != NIL) { - Printf(file, "library(\"%s\")\n", targetlibrary); - } else { - Printf(file, "library(\"m3%s\")\n", name); - } - Delete(file); - } - - // Generate the raw interface - { - File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3raw_name)); - - emitBanner(file); - - Printf(file, "INTERFACE %s;\n\n", m3raw_name); - - emitImportStatements(m3raw_intf.import, file); - Printf(file, "\n"); - - // Write the interface generated within 'top' - Printv(file, m3raw_intf.f, NIL); - - Printf(file, "\nEND %s.\n", m3raw_name); - Delete(file); - } - - // Generate the raw module - { - File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3raw_name)); - - emitBanner(file); - - Printf(file, "MODULE %s;\n\n", m3raw_name); - - emitImportStatements(m3raw_impl.import, file); - Printf(file, "\n"); - - // will be empty usually - Printv(file, m3raw_impl.f, NIL); - - Printf(file, "BEGIN\nEND %s.\n", m3raw_name); - Delete(file); - } - - // Generate the interface for the comfort wrappers - { - File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3wrap_name)); - - emitBanner(file); - - Printf(file, "INTERFACE %s;\n", m3wrap_name); - - emitImportStatements(m3wrap_intf.import, file); - Printf(file, "\n"); - - { - Iterator it = First(enumeration_coll); - if (it.key != NIL) { - Printf(file, "TYPE\n"); - } - for (; it.key != NIL; it = Next(it)) { - Printf(file, "\n"); - emitEnumeration(file, it.key, it.item); - } - } - - // Add the wrapper methods - Printv(file, m3wrap_intf.f, NIL); - - // Finish off the class - Printf(file, "\nEND %s.\n", m3wrap_name); - Delete(file); - } - - // Generate the wrapper routines implemented in Modula 3 - { - File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3wrap_name)); - - emitBanner(file); - - if (unsafe_module) { - Printf(file, "UNSAFE "); - } - Printf(file, "MODULE %s;\n\n", m3wrap_name); - - emitImportStatements(m3wrap_impl.import, file); - Printf(file, "\n"); - - // Add the wrapper methods - Printv(file, m3wrap_impl.f, NIL); - - Printf(file, "\nBEGIN\nEND %s.\n", m3wrap_name); - Delete(file); - } - - if (upcasts_code) - Printv(f_wrappers, upcasts_code, NIL); - - Printf(f_wrappers, "#ifdef __cplusplus\n"); - Printf(f_wrappers, "}\n"); - Printf(f_wrappers, "#endif\n"); - - // Output a Modula 3 type wrapper class for each SWIG type - for (Iterator swig_type = First(swig_types_hash); swig_type.item != NIL; swig_type = Next(swig_type)) { - emitTypeWrapperClass(swig_type.key, swig_type.item); - } - - Delete(swig_types_hash); - swig_types_hash = NULL; - Delete(constant_values); - constant_values = NULL; - Delete(enumeration_coll); - enumeration_coll = NULL; - Delete(m3raw_name); - m3raw_name = NULL; - Delete(m3raw_baseclass); - m3raw_baseclass = NULL; - Delete(m3raw_interfaces); - m3raw_interfaces = NULL; - Delete(m3raw_class_modifiers); - m3raw_class_modifiers = NULL; - Delete(m3raw_imports); - m3raw_imports = NULL; - Delete(m3raw_cppcasts_code); - m3raw_cppcasts_code = NULL; - Delete(proxy_class_def); - proxy_class_def = NULL; - Delete(proxy_class_code); - proxy_class_code = NULL; - Delete(m3wrap_name); - m3wrap_name = NULL; - Delete(m3wrap_modifiers); - m3wrap_modifiers = NULL; - Delete(targetlibrary); - targetlibrary = NULL; - Delete(module_baseclass); - module_baseclass = NULL; - Delete(module_interfaces); - module_interfaces = NULL; - Delete(module_imports); - module_imports = NULL; - Delete(upcasts_code); - upcasts_code = NULL; - Delete(constantfilename); - constantfilename = NULL; - Delete(renamefilename); - renamefilename = NULL; - Delete(typemapfilename); - typemapfilename = NULL; - - /* Close all of the files */ - Dump(f_runtime, f_begin); - Dump(f_header, f_begin); - Dump(f_wrappers, f_begin); - Wrapper_pretty_print(f_init, f_begin); - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Delete(f_runtime); - Delete(f_begin); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * emitBanner() - * ----------------------------------------------------------------------------- */ - - void emitBanner(File *f) { - Printf(f, "(*******************************************************************************\n"); - Swig_banner_target_lang(f, " *"); - Printf(f, "*******************************************************************************)\n\n"); - } - - /* ---------------------------------------------------------------------- - * nativeWrapper() - * ---------------------------------------------------------------------- */ - - virtual int nativeWrapper(Node *n) { - String *wrapname = Getattr(n, "wrap:name"); - - if (!addSymbol(wrapname, n)) - return SWIG_ERROR; - - if (Getattr(n, "type")) { - Swig_save("nativeWrapper", n, "name", NIL); - Setattr(n, "name", wrapname); - native_function_flag = true; - functionWrapper(n); - Swig_restore(n); - native_function_flag = false; - } else { - Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); - } - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * functionWrapper() - * ---------------------------------------------------------------------- */ - - virtual int functionWrapper(Node *n) { - String *type = nodeType(n); - String *funcType = Getattr(n, "modula3:functype"); - String *rawname = Getattr(n, "name"); - String *symname = Getattr(n, "sym:name"); - String *capname = capitalizeFirst(symname); - //String *wname = Swig_name_wrapper(symname); - - //printf("function: %s\n", Char(symname)); - //printf(" purpose: %s\n", Char(funcType)); - - if (Strcmp(type, "cdecl") == 0) { - if (funcType == NIL) { - // no wrapper needed for plain functions - emitM3RawPrototype(n, rawname, symname); - emitM3Wrapper(n, symname); - } else if (Strcmp(funcType, "method") == 0) { - Setattr(n, "modula3:funcname", capname); - emitCWrapper(n, capname); - emitM3RawPrototype(n, capname, capname); - emitM3Wrapper(n, capname); - } else if (Strcmp(funcType, "accessor") == 0) { - /* - * Generate the proxy class properties for public member variables. - * Not for enums and constants. - */ - if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { - // Capitalize the first letter in the function name - Setattr(n, "proxyfuncname", capname); - Setattr(n, "imfuncname", symname); - if (hasPrefix(capname, "Set")) { - Setattr(n, "modula3:setname", capname); - } else { - Setattr(n, "modula3:getname", capname); - } - - emitCWrapper(n, capname); - emitM3RawPrototype(n, capname, capname); - emitM3Wrapper(n, capname); - //proxyClassFunctionHandler(n); - } -#ifdef DEBUG - } else { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Function type <%s> unknown.\n", Char(funcType)); -#endif - } - } else if ((Strcmp(type, "constructor") == 0) || (Strcmp(type, "destructor") == 0)) { - emitCWrapper(n, capname); - emitM3RawPrototype(n, capname, capname); - emitM3Wrapper(n, capname); - } -// a Java relict -#if 0 - if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { - emitM3Wrapper(n, capname); - } -#endif - - Delete(capname); - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * emitCWrapper() - * - * Generate the wrapper in C which calls C++ methods. - * ---------------------------------------------------------------------- */ - - virtual int emitCWrapper(Node *n, const String *wname) { - String *rawname = Getattr(n, "name"); - String *c_return_type = NewString(""); - String *cleanup = NewString(""); - String *outarg = NewString(""); - String *body = NewString(""); - Hash *throws_hash = NewHash(); - ParmList *l = Getattr(n, "parms"); - SwigType *t = Getattr(n, "type"); - String *symname = Getattr(n, "sym:name"); - - if (!Getattr(n, "sym:overloaded")) { - if (!addSymbol(wname, n)) { - return SWIG_ERROR; - } - } - // A new wrapper function object - Wrapper *f = NewWrapper(); - - /* Attach the non-standard typemaps to the parameter list. */ - Swig_typemap_attach_parms("ctype", l, f); - - /* Get return types */ - { - String *tm = getMappedTypeNew(n, "ctype", ""); - if (tm != NIL) { - Printf(c_return_type, "%s", tm); - } - } - - bool is_void_return = (Cmp(c_return_type, "void") == 0); - if (!is_void_return) { - Wrapper_add_localv(f, "cresult", c_return_type, "cresult = 0", NIL); - } - - Printv(f->def, " SWIGEXPORT ", c_return_type, " ", wname, "(", NIL); - - // Emit all of the local variables for holding arguments. - emit_parameter_variables(l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l, f); - Setattr(n, "wrap:parms", l); - - // Generate signature and argument conversion for C wrapper - { - Parm *p; - attachParameterNames(n, "tmap:name", "c:wrapname", "m3arg%d"); - bool gencomma = false; - for (p = skipIgnored(l, "in"); p; p = skipIgnored(p, "in")) { - - String *arg = Getattr(p, "c:wrapname"); - { - /* Get the ctype types of the parameter */ - String *c_param_type = getMappedType(p, "ctype"); - // Add parameter to C function - Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); - Delete(c_param_type); - gencomma = true; - } - - // Get typemap for this argument - String *tm = getMappedType(p, "in"); - if (tm != NIL) { - addThrows(throws_hash, "in", p); - Replaceall(tm, "$input", arg); - Setattr(p, "emit:input", arg); /*??? */ - Printf(f->code, "%s\n", tm); - p = Getattr(p, "tmap:in:next"); - } else { - p = nextSibling(p); - } - } - } - - /* Insert constraint checking code */ - { - Parm *p; - for (p = l; p;) { - String *tm = Getattr(p, "tmap:check"); - if (tm != NIL) { - addThrows(throws_hash, "check", p); - Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ - Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ - Replaceall(tm, "$input", Getattr(p, "emit:input")); - Printv(f->code, tm, "\n", NIL); - p = Getattr(p, "tmap:check:next"); - } else { - p = nextSibling(p); - } - } - } - - /* Insert cleanup code */ - { - Parm *p; - for (p = l; p;) { - String *tm = Getattr(p, "tmap:freearg"); - if (tm != NIL) { - addThrows(throws_hash, "freearg", p); - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ - Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ - Replaceall(tm, "$input", Getattr(p, "emit:input")); - Printv(cleanup, tm, "\n", NIL); - p = Getattr(p, "tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - } - - /* Insert argument output code */ - { - Parm *p; - for (p = l; p;) { - String *tm = Getattr(p, "tmap:argout"); - if (tm != NIL) { - addThrows(throws_hash, "argout", p); - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ - Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ - Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ - Replaceall(tm, "$result", "cresult"); - Replaceall(tm, "$input", Getattr(p, "emit:input")); - Printv(outarg, tm, "\n", NIL); - p = Getattr(p, "tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - } - - // Get any Modula 3 exception classes in the throws typemap - ParmList *throw_parm_list = NULL; - if ((throw_parm_list = Getattr(n, "catchlist"))) { - Swig_typemap_attach_parms("throws", throw_parm_list, f); - Parm *p; - for (p = throw_parm_list; p; p = nextSibling(p)) { - addThrows(throws_hash, "throws", p); - } - } - - Setattr(n, "wrap:name", wname); - - // Now write code to make the function call - if (!native_function_flag) { - String *actioncode = emit_action(n); - - /* Return value if necessary */ - String *tm; - if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { - addThrows(throws_hash, "out", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ - Replaceall(tm, "$target", "cresult"); /* deprecated */ - Replaceall(tm, "$result", "cresult"); - Printf(f->code, "%s", tm); - if (hasContent(tm)) - Printf(f->code, "\n"); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), rawname); - } - emit_return_variable(n, t, f); - } - - /* Output argument output code */ - Printv(f->code, outarg, NIL); - - /* Output cleanup code */ - Printv(f->code, cleanup, NIL); - - /* Look to see if there is any newfree cleanup code */ - if (GetFlag(n, "feature:new")) { - String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); - if (tm != NIL) { - addThrows(throws_hash, "newfree", n); - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ - Printf(f->code, "%s\n", tm); - } - } - - /* See if there is any return cleanup code */ - if (!native_function_flag) { - String *tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); - if (tm != NIL) { - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ - Printf(f->code, "%s\n", tm); - } - } - - /* Finish C wrapper */ - Printf(f->def, ") {"); - - if (!is_void_return) - Printv(f->code, " return cresult;\n", NIL); - Printf(f->code, "}\n"); - - /* Substitute the cleanup code */ - Replaceall(f->code, "$cleanup", cleanup); - - /* Substitute the function name */ - Replaceall(f->code, "$symname", symname); - - if (!is_void_return) { - Replaceall(f->code, "$null", "0"); - } else { - Replaceall(f->code, "$null", ""); - } - - /* Dump the function out */ - if (!native_function_flag) { - Wrapper_print(f, f_wrappers); - } - - Delete(c_return_type); - Delete(cleanup); - Delete(outarg); - Delete(body); - Delete(throws_hash); - DelWrapper(f); - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * emitM3RawPrototype() - * - * Generate an EXTERNAL procedure declaration in Modula 3 - * which is the interface to an existing C routine or a C wrapper. - * ---------------------------------------------------------------------- */ - - virtual int emitM3RawPrototype(Node *n, const String *cname, const String *m3name) { - String *im_return_type = NewString(""); - //String *symname = Getattr(n,"sym:name"); - ParmList *l = Getattr(n, "parms"); - - /* Attach the non-standard typemaps to the parameter list. */ - Swig_typemap_attach_parms("m3rawinmode", l, NULL); - Swig_typemap_attach_parms("m3rawintype", l, NULL); - - /* Get return types */ - bool has_return; - { - String *tm = getMappedTypeNew(n, "m3rawrettype", ""); - if (tm != NIL) { - Printf(im_return_type, "%s", tm); - } - has_return = hasContent(tm); - } - - /* cname is the original name if 'n' denotes a C function - and it is the relabeled name (sym:name) if 'n' denotes a C++ method or similar */ - m3raw_intf.enterBlock(no_block); - Printf(m3raw_intf.f, "\n<* EXTERNAL %s *>\nPROCEDURE %s (", cname, m3name); - - // Generate signature for raw interface - { - Parm *p; - writeArgState state; - attachParameterNames(n, "tmap:rawinname", "modula3:rawname", "arg%d"); - for (p = skipIgnored(l, "m3rawintype"); p; p = skipIgnored(p, "m3rawintype")) { - - /* Get argument passing mode, should be one of VALUE, VAR, READONLY */ - String *mode = Getattr(p, "tmap:m3rawinmode"); - String *argname = Getattr(p, "modula3:rawname"); - String *im_param_type = getMappedType(p, "m3rawintype"); - addImports(m3raw_intf.import, "m3rawintype", p); - - writeArg(m3raw_intf.f, state, mode, argname, im_param_type, NIL); - if (im_param_type != NIL) { - p = Getattr(p, "tmap:m3rawintype:next"); - } else { - p = nextSibling(p); - } - } - writeArg(m3raw_intf.f, state, NIL, NIL, NIL, NIL); - } - - /* Finish M3 raw prototype */ - Printf(m3raw_intf.f, ")"); - // neither a C wrapper nor a plain C function may throw an exception - //generateThrowsClause(throws_hash, m3raw_intf.f); - if (has_return) { - Printf(m3raw_intf.f, ": %s", im_return_type); - } - Printf(m3raw_intf.f, ";\n"); - - Delete(im_return_type); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------- - * variableWrapper() - * ----------------------------------------------------------------------- */ - - virtual int variableWrapper(Node *n) { - Language::variableWrapper(n); - return SWIG_OK; - } - - /* ----------------------------------------------------------------------- - * globalvariableHandler() - * ----------------------------------------------------------------------- */ - - virtual int globalvariableHandler(Node *n) { - SwigType *t = Getattr(n, "type"); - String *tm; - - // Get the variable type - if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { - substituteClassname(t, tm); - } - - variable_name = Getattr(n, "sym:name"); - variable_type = Copy(tm); - - // Get the variable type expressed in terms of Modula 3 equivalents of C types - if ((tm = getMappedTypeNew(n, "m3rawtype", ""))) { - m3raw_intf.enterBlock(no_block); - Printf(m3raw_intf.f, "\n<* EXTERNAL *> VAR %s: %s;\n", variable_name, tm); - } - // Output the property's accessor methods - /* - global_variable_flag = true; - int ret = Language::globalvariableHandler(n); - global_variable_flag = false; - */ - - Printf(m3wrap_impl.f, "\n\n"); - - //return ret; - return 1; - } - - long getConstNumeric(Node *n) { - String *constnumeric = Getfeature(n, "constnumeric"); - String *name = Getattr(n, "name"); - long numvalue; - if (constnumeric == NIL) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature 'constnumeric' is necessary to obtain value of %s.\n", name); - return 0; - } else if (!strToL(constnumeric, numvalue)) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, - "The feature 'constnumeric' of %s specifies value <%s> which is not an integer constant.\n", name, constnumeric); - return 0; - } else { - return numvalue; - } - } - - /* ------------------------------------------------------------------------ - * generateIntConstant() - * - * Considers node as an integer constant definition - * and generate a Modula 3 constant definition. - * ------------------------------------------------------------------------ */ - void generateIntConstant(Node *n, String *name) { - String *value = Getattr(n, "value"); - String *type = Getfeature(n, "modula3:constint:type"); - String *conv = Getfeature(n, "modula3:constint:conv"); - - if (name == NIL) { - name = Getattr(n, "sym:name"); - } - - long numvalue; - bool isSimpleNum = strToL(value, numvalue); - if (!isSimpleNum) { - numvalue = getConstNumeric(n); - } - - String *m3value; - if ((conv == NIL) || ((Strcmp(conv, "set:int") != 0) && (Strcmp(conv, "int:set") != 0))) { - /* The original value of the constant has precedence over - 'constnumeric' feature since we like to keep - the style (that is the base) of simple numeric constants */ - if (isSimpleNum) { - if (hasPrefix(value, "0x")) { - m3value = NewStringf("16_%s", Char(value) + 2); - } else if ((Len(value) > 1) && (*Char(value) == '0')) { - m3value = NewStringf("8_%s", Char(value) + 1); - } else { - m3value = Copy(value); - } - /* If we cannot easily obtain the value of a numeric constant, - we use the results given by a C compiler. */ - } else { - m3value = Copy(Getfeature(n, "constnumeric")); - } - } else { - // if the value can't be converted, it is ignored - if (convertInt(numvalue, numvalue, conv)) { - m3value = NewStringf("%d", numvalue); - } else { - m3value = NIL; - } - } - - if (m3value != NIL) { - m3wrap_intf.enterBlock(constant); - Printf(m3wrap_intf.f, "%s", name); - if (hasContent(type)) { - Printf(m3wrap_intf.f, ": %s", type); - } - Printf(m3wrap_intf.f, " = %s;\n", m3value); - Delete(m3value); - } - } - - /* ----------------------------------------------------------------------- - * generateSetConstant() - * - * Considers node as a set constant definition - * and generate a Modula 3 constant definition. - * ------------------------------------------------------------------------ */ - void generateSetConstant(Node *n, String *name) { - String *value = Getattr(n, "value"); - String *type = Getfeature(n, "modula3:constset:type"); - String *setname = Getfeature(n, "modula3:constset:set"); - String *basename = Getfeature(n, "modula3:constset:base"); - String *conv = Getfeature(n, "modula3:constset:conv"); - - m3wrap_intf.enterBlock(constant); - - Printf(m3wrap_intf.f, "%s", name); - if (type != NIL) { - Printf(m3wrap_intf.f, ":%s ", type); - } - Printf(m3wrap_intf.f, " = %s{", setname); - - long numvalue = 0; - if (!strToL(value, numvalue)) { - numvalue = getConstNumeric(n); - } - convertInt(numvalue, numvalue, conv); - - bool isIntType = Strcmp(basename, "CARDINAL") == 0; - Hash *items = NIL; - if (!isIntType) { - Hash *enumeration = Getattr(enumeration_coll, basename); - if (enumeration == NIL) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "There is no enumeration <%s> as needed for the set.\n", setname); - isIntType = true; - } else { - items = Getattr(enumeration, "items"); - } - } - - bool gencomma = false; - int bitpos = 0; - while (numvalue > 0) { - if ((numvalue & 1) != 0) { - if (isIntType) { - if (gencomma) { - Printv(m3wrap_intf.f, ",", NIL); - } - gencomma = true; - Printf(m3wrap_intf.f, "%d", bitpos); - } else { - char bitval[15]; - sprintf(bitval, "%d", bitpos); - String *bitname = Getattr(items, bitval); - if (bitname == NIL) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Enumeration <%s> has no value <%s>.\n", setname, bitval); - } else { - if (gencomma) { - Printv(m3wrap_intf.f, ",", NIL); - } - gencomma = true; - Printf(m3wrap_intf.f, "%s.%s", basename, bitname); - } - } - } - numvalue >>= 1; - bitpos++; - } - Printf(m3wrap_intf.f, "};\n"); - } - - void generateConstant(Node *n) { - // any of the special interpretation disables the default behaviour - String *enumitem = Getfeature(n, "modula3:enumitem:name"); - String *constset = Getfeature(n, "modula3:constset:name"); - String *constint = Getfeature(n, "modula3:constint:name"); - if (hasContent(enumitem) || hasContent(constset) || hasContent(constint)) { - if (hasContent(constset)) { - generateSetConstant(n, constset); - } - if (hasContent(constint)) { - generateIntConstant(n, constint); - } - } else { - String *value = Getattr(n, "value"); - String *name = Getattr(n, "sym:name"); - if (name == NIL) { - name = Getattr(n, "name"); - } - m3wrap_intf.enterBlock(constant); - Printf(m3wrap_intf.f, "%s = %s;\n", name, value); - } - } - - void emitEnumeration(File *file, String *name, Node *n) { - Printf(file, "%s = {", name); - int i; - bool gencomma = false; - int max = aToL(Getattr(n, "max")); - Hash *items = Getattr(n, "items"); - for (i = 0; i <= max; i++) { - if (gencomma) { - Printf(file, ","); - } - Printf(file, "\n"); - gencomma = true; - char numstr[15]; - sprintf(numstr, "%d", i); - String *name = Getattr(items, numstr); - if (name != NIL) { - Printv(file, name, NIL); - } else { - Printf(file, "Dummy%d", i); - } - } - Printf(file, "\n};\n"); - } - - /* ----------------------------------------------------------------------- - * constantWrapper() - * - * Handles constants and enumeration items. - * ------------------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - generateConstant(n); - return SWIG_OK; - } - -#if 0 -// enumerations are handled like constant definitions - /* ----------------------------------------------------------------------------- - * enumDeclaration() - * ----------------------------------------------------------------------------- */ - - virtual int enumDeclaration(Node *n) { - String *symname = nameToModula3(Getattr(n, "sym:name"), true); - enumerationStart(symname); - int result = Language::enumDeclaration(n); - enumerationStop(); - Delete(symname); - return result; - } -#endif - - /* ----------------------------------------------------------------------------- - * enumvalueDeclaration() - * ----------------------------------------------------------------------------- */ - - virtual int enumvalueDeclaration(Node *n) { - generateConstant(n); - /* - This call would continue processing in the constantWrapper - which cannot handle values like "RED+1". - return Language::enumvalueDeclaration(n); - */ - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * pragmaDirective() - * - * Valid Pragmas: - * imclassbase - base (extends) for the intermediary class - * imclassclassmodifiers - class modifiers for the intermediary class - * imclasscode - text (Modula 3 code) is copied verbatim to the intermediary class - * imclassimports - import statements for the intermediary class - * imclassinterfaces - interface (implements) for the intermediary class - * - * modulebase - base (extends) for the module class - * moduleclassmodifiers - class modifiers for the module class - * modulecode - text (Modula 3 code) is copied verbatim to the module class - * moduleimports - import statements for the module class - * moduleinterfaces - interface (implements) for the module class - * - * ----------------------------------------------------------------------------- */ - - virtual int pragmaDirective(Node *n) { - if (!ImportMode) { - String *lang = Getattr(n, "lang"); - String *code = Getattr(n, "name"); - String *value = Getattr(n, "value"); - - if (Strcmp(lang, "modula3") == 0) { - - String *strvalue = NewString(value); - Replaceall(strvalue, "\\\"", "\""); -/* - bool isEnumItem = Strcmp(code, "enumitem") == 0; - bool isSetItem = Strcmp(code, "setitem") == 0; -*/ - if (Strcmp(code, "imclassbase") == 0) { - Delete(m3raw_baseclass); - m3raw_baseclass = Copy(strvalue); - } else if (Strcmp(code, "imclassclassmodifiers") == 0) { - Delete(m3raw_class_modifiers); - m3raw_class_modifiers = Copy(strvalue); - } else if (Strcmp(code, "imclasscode") == 0) { - Printf(m3raw_intf.f, "%s\n", strvalue); - } else if (Strcmp(code, "imclassimports") == 0) { - Delete(m3raw_imports); - m3raw_imports = Copy(strvalue); - } else if (Strcmp(code, "imclassinterfaces") == 0) { - Delete(m3raw_interfaces); - m3raw_interfaces = Copy(strvalue); - } else if (Strcmp(code, "modulebase") == 0) { - Delete(module_baseclass); - module_baseclass = Copy(strvalue); - } else if (Strcmp(code, "moduleclassmodifiers") == 0) { - Delete(m3wrap_modifiers); - m3wrap_modifiers = Copy(strvalue); - } else if (Strcmp(code, "modulecode") == 0) { - Printf(m3wrap_impl.f, "%s\n", strvalue); - } else if (Strcmp(code, "moduleimports") == 0) { - Delete(module_imports); - module_imports = Copy(strvalue); - } else if (Strcmp(code, "moduleinterfaces") == 0) { - Delete(module_interfaces); - module_interfaces = Copy(strvalue); - } else if (Strcmp(code, "unsafe") == 0) { - unsafe_module = true; - } else if (Strcmp(code, "library") == 0) { - if (targetlibrary) { - Delete(targetlibrary); - } - targetlibrary = Copy(strvalue); - } else if (Strcmp(code, "enumitem") == 0) { - } else if (Strcmp(code, "constset") == 0) { - } else if (Strcmp(code, "constint") == 0) { - } else if (Strcmp(code, "makesetofenum") == 0) { - m3wrap_intf.enterBlock(blocktype); - Printf(m3wrap_intf.f, "%sSet = SET OF %s;\n", value, value); - } else { - Swig_warning(WARN_MODULA3_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", code); - } - Delete(strvalue); - } - } - return Language::pragmaDirective(n); - } - - void Setfeature(Node *n, const char *feature, const String *value, bool warn = false) { - //printf("tag feature <%s> with value <%s>\n", feature, Char(value)); - String *attr = NewStringf("feature:%s", feature); - if ((Setattr(n, attr, value) != 0) && warn) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature <%s> of %s did already exist.\n", feature, Getattr(n, "name")); - } - Delete(attr); - } - - String *Getfeature(Node *n, const char *feature) { - //printf("retrieve feature <%s> with value <%s>\n", feature, Char(value)); - String *attr = NewStringf("feature:%s", feature); - String *result = Getattr(n, attr); - Delete(attr); - return result; - } - - bool convertInt(long in, long &out, const String *mode) { - if ((mode == NIL) || (Strcmp(mode, "int:int") == 0) || (Strcmp(mode, "set:set") == 0)) { - out = in; - return true; - } else if (Strcmp(mode, "set:int") == 0) { - return log2(in, out); - } else if (Strcmp(mode, "int:set") == 0) { - out = 1L << in; - return unsigned (in) < (sizeof(out) * 8); - } else { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown integer conversion method <%s>.\n", mode); - return false; - } - } - - void collectEnumerations(Hash *enums, Node *n) { - Node *child = firstChild(n); - while (child != NIL) { - String *name = Getattr(child, "name"); - const bool isConstant = Strcmp(nodeType(child), "constant") == 0; - const bool isEnumItem = Strcmp(nodeType(child), "enumitem") == 0; - if (isConstant || isEnumItem) { -//printf("%s%s name %s\n", isConstant?"constant":"", isEnumItem?"enumitem":"", Char(name)); - { - String *m3name = Getfeature(child, "modula3:enumitem:name"); - String *m3enum = Getfeature(child, "modula3:enumitem:enum"); - String *conv = Getfeature(child, "modula3:enumitem:conv"); - - if (m3enum != NIL) { -//printf("m3enum %s\n", Char(m3enum)); - if (m3name == NIL) { - m3name = name; - } - - long max = -1; - Hash *items; - Hash *enumnode = Getattr(enums, m3enum); - if (enumnode == NIL) { - enumnode = NewHash(); - items = NewHash(); - Setattr(enumnode, "items", items); - Setattr(enums, m3enum, enumnode); - } else { - String *maxstr = Getattr(enumnode, "max"); - if (maxstr != NIL) { - max = aToL(maxstr); - } - items = Getattr(enumnode, "items"); - } - long numvalue; - String *value = Getattr(child, "value"); -//printf("value: %s\n", Char(value)); - if ((value == NIL) || (!strToL(value, numvalue))) { - value = Getattr(child, "enumvalue"); - if ((value == NIL) || (!evalExpr(value, numvalue))) { - numvalue = getConstNumeric(child); - } -//printf("constnumeric: %s\n", Char(value)); - } - Setattr(constant_values, name, NewStringf("%d", numvalue)); - if (convertInt(numvalue, numvalue, conv)) { - String *newvalue = NewStringf("%d", numvalue); - String *oldname = Getattr(items, newvalue); - if (oldname != NIL) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The value <%s> is already assigned to <%s>.\n", value, oldname); - } -//printf("items %p, set %s = %s\n", items, Char(newvalue), Char(m3name)); - Setattr(items, newvalue, m3name); - if (max < numvalue) { - max = numvalue; - } - Setattr(enumnode, "max", NewStringf("%d", max)); - } - } - } - } - - collectEnumerations(enums, child); - child = nextSibling(child); - } - } - - enum const_pragma_type { cpt_none, cpt_constint, cpt_constset, cpt_enumitem }; - - struct const_id_pattern { - String *prefix, *parentEnum; - }; - - void tagConstants(Node *first, String *parentEnum, const const_id_pattern & pat, const String *pragma, List *convdesc) { - Node *n = first; - while (n != NIL) { - String *name = getQualifiedName(n); - bool isConstant = Strcmp(nodeType(n), "constant") == 0; - bool isEnumItem = Strcmp(nodeType(n), "enumitem") == 0; - if ((isConstant || isEnumItem) && ((pat.prefix == NIL) || (hasPrefix(name, pat.prefix))) && ((pat.parentEnum == NIL) || ((parentEnum != NIL) - && - (Strcmp - (pat.parentEnum, parentEnum) - == 0)))) { - //printf("tag %s\n", Char(name)); - String *srctype = Getitem(convdesc, 1); - String *relationstr = Getitem(convdesc, 3); - List *relationdesc = Split(relationstr, ',', 2); - - // transform name from C to Modula3 style - String *srcstyle = NIL; - String *newprefix = NIL; - { - //printf("name conversion <%s>\n", Char(Getitem(convdesc,2))); - List *namedesc = Split(Getitem(convdesc, 2), ',', INT_MAX); - Iterator nameit = First(namedesc); - for (; nameit.item != NIL; nameit = Next(nameit)) { - List *nameassign = Split(nameit.item, '=', 2); - String *tag = Getitem(nameassign, 0); - String *data = Getitem(nameassign, 1); - //printf("name conv <%s> = <%s>\n", Char(tag), Char(data)); - if (Strcmp(tag, "srcstyle") == 0) { - srcstyle = Copy(data); - } else if (Strcmp(tag, "prefix") == 0) { - newprefix = Copy(data); - } else { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown name conversion tag <%s> with value <%s>.\n", tag, data); - } - Delete(nameassign); - } - Delete(namedesc); - } - const char *stem = Char(name); - if (pat.prefix != NIL) { - //printf("pat.prefix %s for %s\n", Char(pat.prefix), Char(name)); - stem += Len(pat.prefix); - } - String *newname; - if (srcstyle && Strcmp(srcstyle, "underscore") == 0) { - if (newprefix != NIL) { - String *newstem = nameToModula3(stem, true); - newname = NewStringf("%s%s", newprefix, newstem); - Delete(newstem); - } else { - newname = nameToModula3(stem, true); - } - } else { - if (srcstyle != NIL) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown C identifier style <%s>.\n", srcstyle); - } - newname = Copy(name); - } - - if (Strcmp(pragma, "enumitem") == 0) { - if (Len(relationdesc) != 1) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); - } - Setfeature(n, "modula3:enumitem:name", newname, true); - Setfeature(n, "modula3:enumitem:enum", relationstr, true); - Setfeature(n, "modula3:enumitem:conv", NewStringf("%s:int", srctype), true); - } else if (Strcmp(pragma, "constint") == 0) { - if (Len(relationdesc) != 1) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); - } - Setfeature(n, "modula3:constint:name", newname, true); - Setfeature(n, "modula3:constint:type", Getitem(relationdesc, 0), true); - Setfeature(n, "modula3:constint:conv", NewStringf("%s:int", srctype), true); - } else if (Strcmp(pragma, "constset") == 0) { - if (Len(relationdesc) != 2) { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); - } - String *settype = Getitem(relationdesc, 0); - Setfeature(n, "modula3:constset:name", newname, true); - //Setfeature(n,"modula3:constset:type",settype,true); - Setfeature(n, "modula3:constset:set", settype, true); - Setfeature(n, "modula3:constset:base", Getitem(relationdesc, 1), true); - Setfeature(n, "modula3:constset:conv", NewStringf("%s:set", srctype), true); - } - - Delete(newname); - Delete(relationdesc); - } - - if (Strcmp(nodeType(n), "enum") == 0) { - //printf("explore enum %s, qualification %s\n", Char(name), Char(Swig_symbol_qualified(n))); - tagConstants(firstChild(n), name, pat, pragma, convdesc); - } else { - tagConstants(firstChild(n), NIL, pat, pragma, convdesc); - } - n = nextSibling(n); - } - } - - void scanForConstPragmas(Node *n) { - Node *child = firstChild(n); - while (child != NIL) { - const String *type = nodeType(child); - if (Strcmp(type, "pragma") == 0) { - const String *lang = Getattr(child, "lang"); - const String *code = Getattr(child, "name"); - String *value = Getattr(child, "value"); - - if (Strcmp(lang, "modula3") == 0) { - const_pragma_type cpt = cpt_none; - if (Strcmp(code, "constint") == 0) { - cpt = cpt_constint; - } else if (Strcmp(code, "constset") == 0) { - cpt = cpt_constset; - } else if (Strcmp(code, "enumitem") == 0) { - cpt = cpt_enumitem; - } - if (cpt != cpt_none) { - const_id_pattern pat = { NIL, NIL }; - - List *convdesc = Split(value, ';', 4); - List *patterndesc = Split(Getitem(convdesc, 0), ',', INT_MAX); - Iterator patternit; - for (patternit = First(patterndesc); patternit.item != NIL; patternit = Next(patternit)) { - List *patternassign = Split(patternit.item, '=', 2); - String *tag = Getitem(patternassign, 0); - String *data = Getitem(patternassign, 1); - if (Strcmp(tag, "prefix") == 0) { - pat.prefix = Copy(data); - } else if (Strcmp(tag, "enum") == 0) { - pat.parentEnum = Copy(data); - } else { - Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown identification tag <%s> with value <%s>.\n", tag, data); - } - Delete(patternassign); - } - tagConstants(child, NIL, pat, code, convdesc); - - Delete(patterndesc); - } - } - } - scanForConstPragmas(child); - child = nextSibling(child); - } - } - - /* ----------------------------------------------------------------------------- - * emitProxyClassDefAndCPPCasts() - * ----------------------------------------------------------------------------- */ - - void emitProxyClassDefAndCPPCasts(Node *n) { - String *c_classname = SwigType_namestr(Getattr(n, "name")); - String *c_baseclass = NULL; - String *baseclass = NULL; - String *c_baseclassname = NULL; - String *name = Getattr(n, "name"); - - /* Deal with inheritance */ - List *baselist = Getattr(n, "bases"); - if (baselist) { - Iterator base = First(baselist); - while (base.item) { - if (!GetFlag(base.item, "feature:ignore")) { - String *baseclassname = Getattr(base.item, "name"); - if (!c_baseclassname) { - c_baseclassname = baseclassname; - baseclass = Copy(getProxyName(baseclassname)); - if (baseclass) - c_baseclass = SwigType_namestr(baseclassname); - } else { - /* Warn about multiple inheritance for additional base class(es) */ - String *proxyclassname = Getattr(n, "classtypeobj"); - Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), - "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); - } - } - base = Next(base); - } - } - - bool derived = baseclass && getProxyName(c_baseclassname); - if (!baseclass) - baseclass = NewString(""); - - // Inheritance from pure Modula 3 classes - const String *pure_baseclass = typemapLookup(n, "m3base", name, WARN_NONE); - if (hasContent(pure_baseclass) && hasContent(baseclass)) { - Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), - "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", name, pure_baseclass); - } - // Pure Modula 3 interfaces - const String *pure_interfaces = typemapLookup(n, derived ? "m3interfaces_derived" : "m3interfaces", - name, WARN_NONE); - - // Start writing the proxy class - Printv(proxy_class_def, typemapLookup(n, "m3imports", name, WARN_NONE), // Import statements - "\n", typemapLookup(n, "m3classmodifiers", name, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers - " class $m3classname", // Class name and bases - (derived || *Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", baseclass, pure_baseclass, ((derived || *Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces - ", " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", // Member variables for memory handling - derived ? "" : " protected bool swigCMemOwn;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", name, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers - " $m3classname(IntPtr cPtr, bool cMemoryOwn) ", // Constructor used for wrapping pointers - derived ? - ": base($imclassname.$m3classnameTo$baseclass(cPtr), cMemoryOwn) {\n" - : "{\n swigCMemOwn = cMemoryOwn;\n", " swigCPtr = cPtr;\n", " }\n", NIL); - - if (!have_default_constructor_flag) { // All proxy classes need a constructor - Printv(proxy_class_def, "\n", " protected $m3classname() : this(IntPtr.Zero, false) {\n", " }\n", NIL); - } - // C++ destructor is wrapped by the Dispose method - // Note that the method name is specified in a typemap attribute called methodname - String *destruct = NewString(""); - const String *tm = NULL; - Node *attributes = NewHash(); - String *destruct_methodname = NULL; - if (derived) { - tm = typemapLookup(n, "m3destruct_derived", name, WARN_NONE, attributes); - destruct_methodname = Getattr(attributes, "tmap:m3destruct_derived:methodname"); - } else { - tm = typemapLookup(n, "m3destruct", name, WARN_NONE, attributes); - destruct_methodname = Getattr(attributes, "tmap:m3destruct:methodname"); - } - if (!destruct_methodname) { - Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in m3destruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); - } - // Emit the Finalize and Dispose methods - if (tm) { - // Finalize method - if (*Char(destructor_call)) { - Printv(proxy_class_def, typemapLookup(n, "m3finalize", name, WARN_NONE), NIL); - } - // Dispose method - Printv(destruct, tm, NIL); - if (*Char(destructor_call)) - Replaceall(destruct, "$imcall", destructor_call); - else - Replaceall(destruct, "$imcall", "throw new MethodAccessException(\"C++ destructor does not have public access\")"); - if (*Char(destruct)) - Printv(proxy_class_def, "\n public ", derived ? "override" : "virtual", " void ", destruct_methodname, "() ", destruct, "\n", NIL); - } - Delete(attributes); - Delete(destruct); - - // Emit various other methods - Printv(proxy_class_def, typemapLookup(n, "m3getcptr", name, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method - typemapLookup(n, "m3code", name, WARN_NONE), // extra Modula 3 code - "\n", NIL); - - // Substitute various strings into the above template - Replaceall(proxy_class_def, "$m3classname", proxy_class_name); - Replaceall(proxy_class_code, "$m3classname", proxy_class_name); - - Replaceall(proxy_class_def, "$baseclass", baseclass); - Replaceall(proxy_class_code, "$baseclass", baseclass); - - Replaceall(proxy_class_def, "$imclassname", m3raw_name); - Replaceall(proxy_class_code, "$imclassname", m3raw_name); - - // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) - if (derived) { - Printv(m3raw_cppcasts_code, "\n [DllImport(\"", m3wrap_name, "\", EntryPoint=\"Modula3_", proxy_class_name, "To", baseclass, "\")]\n", NIL); - Printv(m3raw_cppcasts_code, " public static extern IntPtr ", "$m3classnameTo$baseclass(IntPtr objectRef);\n", NIL); - - Replaceall(m3raw_cppcasts_code, "$m3classname", proxy_class_name); - Replaceall(m3raw_cppcasts_code, "$baseclass", baseclass); - - Printv(upcasts_code, - "SWIGEXPORT long Modula3_$imclazznameTo$imbaseclass", - "(long objectRef) {\n", - " long baseptr = 0;\n" " *($cbaseclass **)&baseptr = *($cclass **)&objectRef;\n" " return baseptr;\n" "}\n", "\n", NIL); - - Replaceall(upcasts_code, "$imbaseclass", baseclass); - Replaceall(upcasts_code, "$cbaseclass", c_baseclass); - Replaceall(upcasts_code, "$imclazzname", proxy_class_name); - Replaceall(upcasts_code, "$cclass", c_classname); - } - Delete(baseclass); - } - - /* ---------------------------------------------------------------------- - * getAttrString() - * - * If necessary create and return the string - * associated with a certain attribute of 'n'. - * ---------------------------------------------------------------------- */ - - String *getAttrString(Node *n, const char *attr) { - String *str = Getattr(n, attr); - if (str == NIL) { - str = NewString(""); - Setattr(n, attr, str); - } - return str; - } - - /* ---------------------------------------------------------------------- - * getMethodDeclarations() - * - * If necessary create and return the handle - * where the methods of the current access can be written to. - * 'n' must be a member of a struct or a class. - * ---------------------------------------------------------------------- */ - - String *getMethodDeclarations(Node *n) { - String *acc_str = Getattr(n, "access"); - String *methodattr; - if (acc_str == NIL) { - methodattr = NewString("modula3:method:public"); - } else { - methodattr = NewStringf("modula3:method:%s", acc_str); - } - String *methods = getAttrString(parentNode(n), Char(methodattr)); - Delete(methodattr); - return methods; - } - - /* ---------------------------------------------------------------------- - * classHandler() - * ---------------------------------------------------------------------- */ - - virtual int classHandler(Node *n) { - - File *f_proxy = NULL; - proxy_class_name = Copy(Getattr(n, "sym:name")); - //String *rawname = Getattr(n,"name"); - - if (proxy_flag) { - if (!addSymbol(proxy_class_name, n)) - return SWIG_ERROR; - - if (Cmp(proxy_class_name, m3raw_name) == 0) { - Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); - SWIG_exit(EXIT_FAILURE); - } - - if (Cmp(proxy_class_name, m3wrap_name) == 0) { - Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); - SWIG_exit(EXIT_FAILURE); - } - - String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), proxy_class_name); - f_proxy = NewFile(filen, "w", SWIG_output_files()); - if (!f_proxy) { - FileErrorDisplay(filen); - SWIG_exit(EXIT_FAILURE); - } - Delete(filen); - filen = NULL; - - emitBanner(f_proxy); - - Clear(proxy_class_def); - Clear(proxy_class_code); - - have_default_constructor_flag = false; - destructor_call = NewString(""); - } - - /* This will invoke memberfunctionHandler, membervariableHandler ... - and finally it may invoke functionWrapper - for wrappers and member variable accessors. - It will invoke Language:constructorDeclaration - which decides whether to call MODULA3::constructorHandler */ - Language::classHandler(n); - - { - String *kind = Getattr(n, "kind"); - if (Cmp(kind, "struct") == 0) { - String *entries = NewString(""); - Node *child; - writeArgState state; - for (child = firstChild(n); child != NIL; child = nextSibling(child)) { - String *childType = nodeType(child); - if (Strcmp(childType, "cdecl") == 0) { - String *member = Getattr(child, "sym:name"); - ParmList *pl = Getattr(child, "parms"); - if (pl == NIL) { - // Get the variable type in Modula 3 type equivalents - String *m3ct = getMappedTypeNew(child, "m3rawtype", ""); - - writeArg(entries, state, NIL, member, m3ct, NIL); - } - } - } - writeArg(entries, state, NIL, NIL, NIL, NIL); - - m3raw_intf.enterBlock(blocktype); - Printf(m3raw_intf.f, "%s =\nRECORD\n%sEND;\n", proxy_class_name, entries); - - Delete(entries); - - } else if (Cmp(kind, "class") == 0) { - enum access_privilege { acc_public, acc_protected, acc_private }; - int max_acc = acc_public; - - const char *acc_name[3] = { "public", "protected", "private" }; - String *methods[3]; - int acc; - for (acc = acc_public; acc <= acc_private; acc++) { - String *methodattr = NewStringf("modula3:method:%s", acc_name[acc]); - methods[acc] = Getattr(n, methodattr); - Delete(methodattr); - max_acc = max_acc > acc ? max_acc : acc; - } - - /* Determine the name of the base class */ - String *baseclassname = NewString(""); - { - List *baselist = Getattr(n, "bases"); - if (baselist) { - /* Look for the first (principal?) base class - - Modula 3 does not support multiple inheritance */ - Iterator base = First(baselist); - if (base.item) { - Append(baseclassname, Getattr(base.item, "sym:name")); - base = Next(base); - if (base.item) { - Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), - "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", - proxy_class_name, Getattr(base.item, "name")); - } - } - } - } - - /* the private class of the base class and only this - need a pointer to the C++ object */ - bool need_private = !hasContent(baseclassname); - max_acc = need_private ? acc_private : max_acc; - - /* Declare C++ object as abstract pointer in Modula 3 */ - /* The revelation system does not allow us - to imitate the whole class hierarchy of the C++ library, - but at least we can distinguish between classes of different roots. */ - if (hasContent(baseclassname)) { - m3raw_intf.enterBlock(blocktype); - Printf(m3raw_intf.f, "%s = %s;\n", proxy_class_name, baseclassname); - } else { - m3raw_intf.enterBlock(blocktype); - Printf(m3raw_intf.f, "%s <: ADDRESS;\n", proxy_class_name); - m3raw_impl.enterBlock(revelation); - Printf(m3raw_impl.f, "%s = UNTRACED BRANDED REF RECORD (*Dummy*) END;\n", proxy_class_name); - } - - String *superclass; - m3wrap_intf.enterBlock(blocktype); - if (hasContent(methods[acc_public])) { - superclass = NewStringf("%sPublic", proxy_class_name); - } else if (hasContent(baseclassname)) { - superclass = Copy(baseclassname); - } else { - superclass = NewString("ROOT"); - } - Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, superclass); - Delete(superclass); - - { - static const char *acc_m3suffix[] = { "Public", "Protected", "Private" }; - int acc; - for (acc = acc_public; acc <= acc_private; acc++) { - bool process_private = (acc == acc_private) && need_private; - if (hasContent(methods[acc]) || process_private) { - String *subclass = NewStringf("%s%s", proxy_class_name, acc_m3suffix[acc]); - /* - m3wrap_intf.enterBlock(revelation); - Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, subclass); - */ - if (acc == max_acc) { - m3wrap_intf.enterBlock(revelation); - Printf(m3wrap_intf.f, "%s =\n", proxy_class_name); - } else { - m3wrap_intf.enterBlock(blocktype); - Printf(m3wrap_intf.f, "%s =\n", subclass); - } - Printf(m3wrap_intf.f, "%s BRANDED OBJECT\n", baseclassname); - if (process_private) { - Setattr(m3wrap_intf.import, m3raw_name, ""); - Printf(m3wrap_intf.f, "cxxObj:%s.%s;\n", m3raw_name, proxy_class_name); - } - if (hasContent(methods[acc])) { - Printf(m3wrap_intf.f, "METHODS\n%s", methods[acc]); - } - if (acc == max_acc) { - String *overrides = Getattr(n, "modula3:override"); - Printf(m3wrap_intf.f, "OVERRIDES\n%s", overrides); - } - Printf(m3wrap_intf.f, "END;\n"); - Delete(baseclassname); - baseclassname = subclass; - } - } - } - - Delete(methods[acc_public]); - Delete(methods[acc_protected]); - Delete(methods[acc_private]); - - } else { - Swig_warning(WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN, input_file, line_number, "Unknown type constructor %s\n", kind); - } - } - - if (proxy_flag) { - - emitProxyClassDefAndCPPCasts(n); - - Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); - - Printf(f_proxy, "}\n"); - Delete(f_proxy); - f_proxy = NULL; - - Delete(proxy_class_name); - proxy_class_name = NULL; - Delete(destructor_call); - destructor_call = NULL; - } - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * memberfunctionHandler() - * ---------------------------------------------------------------------- */ - - virtual int memberfunctionHandler(Node *n) { - //printf("begin memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); - Setattr(n, "modula3:functype", "method"); - Language::memberfunctionHandler(n); - - { - /* Language::memberfunctionHandler will remove the mapped types - that emitM3Wrapper may attach */ - ParmList *pl = Getattr(n, "parms"); - Swig_typemap_attach_parms("m3wrapinmode", pl, NULL); - Swig_typemap_attach_parms("m3wrapinname", pl, NULL); - Swig_typemap_attach_parms("m3wrapintype", pl, NULL); - Swig_typemap_attach_parms("m3wrapindefault", pl, NULL); - attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); - String *rettype = getMappedTypeNew(n, "m3wrapouttype", ""); - - String *methodname = Getattr(n, "sym:name"); -/* - if (methodname==NIL) { - methodname = Getattr(n,"name"); - } -*/ - String *arguments = createM3Signature(n); - String *storage = Getattr(n, "storage"); - String *overridden = Getattr(n, "override"); - bool isVirtual = (storage != NIL) && (Strcmp(storage, "virtual") == 0); - bool isOverridden = (overridden != NIL) - && (Strcmp(overridden, "1") == 0); - if ((!isVirtual) || (!isOverridden)) { - { - String *methods = getMethodDeclarations(n); - Printf(methods, "%s(%s)%s%s;%s\n", - methodname, arguments, - hasContent(rettype) ? ": " : "", hasContent(rettype) ? (const String *) rettype : "", isVirtual ? " (* base method *)" : ""); - } - { - /* this was attached by functionWrapper - invoked by Language::memberfunctionHandler */ - String *fname = Getattr(n, "modula3:funcname"); - String *overrides = getAttrString(parentNode(n), "modula3:override"); - Printf(overrides, "%s := %s;\n", methodname, fname); - } - } - } - - if (proxy_flag) { - String *overloaded_name = getOverloadedName(n); - String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); - Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); - Setattr(n, "imfuncname", intermediary_function_name); - proxyClassFunctionHandler(n); - Delete(overloaded_name); - } - //printf("end memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * staticmemberfunctionHandler() - * ---------------------------------------------------------------------- */ - - virtual int staticmemberfunctionHandler(Node *n) { - - static_flag = true; - Language::staticmemberfunctionHandler(n); - - if (proxy_flag) { - String *overloaded_name = getOverloadedName(n); - String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); - Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); - Setattr(n, "imfuncname", intermediary_function_name); - proxyClassFunctionHandler(n); - Delete(overloaded_name); - } - static_flag = false; - - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * proxyClassFunctionHandler() - * - * Function called for creating a Modula 3 wrapper function around a c++ function in the - * proxy class. Used for both static and non-static C++ class functions. - * C++ class static functions map to Modula 3 static functions. - * Two extra attributes in the Node must be available. These are "proxyfuncname" - - * the name of the Modula 3 class proxy function, which in turn will call "imfuncname" - - * the intermediary (PInvoke) function name in the intermediary class. - * ----------------------------------------------------------------------------- */ - - void proxyClassFunctionHandler(Node *n) { - SwigType *t = Getattr(n, "type"); - ParmList *l = Getattr(n, "parms"); - Hash *throws_hash = NewHash(); - String *intermediary_function_name = Getattr(n, "imfuncname"); - String *proxy_function_name = Getattr(n, "proxyfuncname"); - String *tm; - Parm *p; - int i; - String *imcall = NewString(""); - String *return_type = NewString(""); - String *function_code = NewString(""); - bool setter_flag = false; - - if (!proxy_flag) - return; - - if (l) { - if (SwigType_type(Getattr(l, "type")) == T_VOID) { - l = nextSibling(l); - } - } - - /* Attach the non-standard typemaps to the parameter list */ - Swig_typemap_attach_parms("in", l, NULL); - Swig_typemap_attach_parms("m3wraptype", l, NULL); - Swig_typemap_attach_parms("m3in", l, NULL); - - /* Get return types */ - if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { - substituteClassname(t, tm); - Printf(return_type, "%s", tm); - } - - if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { - // Properties - setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, proxy_class_name, variable_name))) - == 0); - } - - /* Start generating the proxy function */ - Printf(function_code, " %s ", Getattr(n, "feature:modula3:methodmodifiers")); - if (static_flag) - Printf(function_code, "static "); - if (Getattr(n, "override")) - Printf(function_code, "override "); - else if (checkAttribute(n, "storage", "virtual")) - Printf(function_code, "virtual "); - - Printf(function_code, "%s %s(", return_type, proxy_function_name); - - Printv(imcall, m3raw_name, ".", intermediary_function_name, "(", NIL); - if (!static_flag) - Printv(imcall, "swigCPtr", NIL); - - emit_mark_varargs(l); - - int gencomma = !static_flag; - - /* Output each parameter */ - for (i = 0, p = l; p; i++) { - - /* Ignored varargs */ - if (checkAttribute(p, "varargs:ignore", "1")) { - p = nextSibling(p); - continue; - } - - /* Ignored parameters */ - if (checkAttribute(p, "tmap:in:numinputs", "0")) { - p = Getattr(p, "tmap:in:next"); - continue; - } - - /* Ignore the 'this' argument for variable wrappers */ - if (!(variable_wrapper_flag && i == 0)) { - SwigType *pt = Getattr(p, "type"); - String *param_type = NewString(""); - - /* Get the Modula 3 parameter type */ - if ((tm = getMappedType(p, "m3wraptype"))) { - substituteClassname(pt, tm); - Printf(param_type, "%s", tm); - } - - if (gencomma) - Printf(imcall, ", "); - - String *arg = variable_wrapper_flag ? NewString("value") : makeParameterName(n, - p, - i); - - // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) - if ((tm = getMappedType(p, "in"))) { - addThrows(throws_hash, "in", p); - substituteClassname(pt, tm); - Replaceall(tm, "$input", arg); - Printv(imcall, tm, NIL); - } - - /* Add parameter to proxy function */ - if (gencomma >= 2) - Printf(function_code, ", "); - gencomma = 2; - Printf(function_code, "%s %s", param_type, arg); - - Delete(arg); - Delete(param_type); - } - p = Getattr(p, "tmap:in:next"); - } - - Printf(imcall, ")"); - Printf(function_code, ")"); - - // Transform return type used in PInvoke function (in intermediary class) to type used in Modula 3 wrapper function (in proxy class) - if ((tm = getMappedTypeNew(n, "m3out", ""))) { - addThrows(throws_hash, "m3out", n); - if (GetFlag(n, "feature:new")) - Replaceall(tm, "$owner", "true"); - else - Replaceall(tm, "$owner", "false"); - substituteClassname(t, tm); - Replaceall(tm, "$imcall", imcall); - } - - generateThrowsClause(throws_hash, function_code); - Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); - - if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { - // Properties - if (setter_flag) { - // Setter method - if ((tm = getMappedTypeNew(n, "m3varin", ""))) { - if (GetFlag(n, "feature:new")) - Replaceall(tm, "$owner", "true"); - else - Replaceall(tm, "$owner", "false"); - substituteClassname(t, tm); - Replaceall(tm, "$imcall", imcall); - Printf(proxy_class_code, "%s", tm); - } - } else { - // Getter method - if ((tm = getMappedTypeNew(n, "m3varout", ""))) { - if (GetFlag(n, "feature:new")) - Replaceall(tm, "$owner", "true"); - else - Replaceall(tm, "$owner", "false"); - substituteClassname(t, tm); - Replaceall(tm, "$imcall", imcall); - Printf(proxy_class_code, "%s", tm); - } - } - } else { - // Normal function call - Printv(proxy_class_code, function_code, NIL); - } - - Delete(function_code); - Delete(return_type); - Delete(imcall); - Delete(throws_hash); - } - - /* ---------------------------------------------------------------------- - * constructorHandler() - * ---------------------------------------------------------------------- */ - - virtual int constructorHandler(Node *n) { - // this invokes functionWrapper - Language::constructorHandler(n); - - if (proxy_flag) { - ParmList *l = Getattr(n, "parms"); - - Hash *throws_hash = NewHash(); - String *overloaded_name = getOverloadedName(n); - String *imcall = NewString(""); - - Printf(proxy_class_code, " %s %s(", Getattr(n, "feature:modula3:methodmodifiers"), proxy_class_name); - Printv(imcall, " : this(", m3raw_name, ".", Swig_name_construct(NSPACE_TODO, overloaded_name), "(", NIL); - - /* Attach the non-standard typemaps to the parameter list */ - Swig_typemap_attach_parms("in", l, NULL); - Swig_typemap_attach_parms("m3wraptype", l, NULL); - Swig_typemap_attach_parms("m3in", l, NULL); - - emit_mark_varargs(l); - - int gencomma = 0; - - String *tm; - Parm *p = l; - int i; - - /* Output each parameter */ - for (i = 0; p; i++) { - - /* Ignored varargs */ - if (checkAttribute(p, "varargs:ignore", "1")) { - p = nextSibling(p); - continue; - } - - /* Ignored parameters */ - if (checkAttribute(p, "tmap:in:numinputs", "0")) { - p = Getattr(p, "tmap:in:next"); - continue; - } - - SwigType *pt = Getattr(p, "type"); - String *param_type = NewString(""); - - /* Get the Modula 3 parameter type */ - if ((tm = getMappedType(p, "m3wraptype"))) { - substituteClassname(pt, tm); - Printf(param_type, "%s", tm); - } - - if (gencomma) - Printf(imcall, ", "); - - String *arg = makeParameterName(n, p, i); - - // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) - if ((tm = getMappedType(p, "in"))) { - addThrows(throws_hash, "in", p); - substituteClassname(pt, tm); - Replaceall(tm, "$input", arg); - Printv(imcall, tm, NIL); - } - - /* Add parameter to proxy function */ - if (gencomma) - Printf(proxy_class_code, ", "); - Printf(proxy_class_code, "%s %s", param_type, arg); - gencomma = 1; - - Delete(arg); - Delete(param_type); - p = Getattr(p, "tmap:in:next"); - } - - Printf(imcall, "), true)"); - - Printf(proxy_class_code, ")"); - Printf(proxy_class_code, "%s", imcall); - generateThrowsClause(throws_hash, proxy_class_code); - Printf(proxy_class_code, " {\n"); - Printf(proxy_class_code, " }\n\n"); - - if (!gencomma) // We must have a default constructor - have_default_constructor_flag = true; - - Delete(overloaded_name); - Delete(imcall); - Delete(throws_hash); - } - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * destructorHandler() - * ---------------------------------------------------------------------- */ - - virtual int destructorHandler(Node *n) { - Language::destructorHandler(n); - String *symname = Getattr(n, "sym:name"); - - if (proxy_flag) { - Printv(destructor_call, m3raw_name, ".", Swig_name_destroy(NSPACE_TODO, symname), "(swigCPtr)", NIL); - } - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * membervariableHandler() - * ---------------------------------------------------------------------- */ - - virtual int membervariableHandler(Node *n) { - //printf("begin membervariableHandler(%s)\n", Char(Getattr(n,"name"))); - SwigType *t = Getattr(n, "type"); - String *tm; - - // Get the variable type - if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { - substituteClassname(t, tm); - } - - variable_name = Getattr(n, "sym:name"); - //printf("member variable: %s\n", Char(variable_name)); - - // Output the property's field declaration and accessor methods - Printf(proxy_class_code, " public %s %s {", tm, variable_name); - - Setattr(n, "modula3:functype", "accessor"); - wrapping_member_flag = true; - variable_wrapper_flag = true; - Language::membervariableHandler(n); - wrapping_member_flag = false; - variable_wrapper_flag = false; - - Printf(proxy_class_code, "\n }\n\n"); - - { - String *methods = getMethodDeclarations(n); - String *overrides = getAttrString(parentNode(n), "modula3:override"); - SwigType *type = Getattr(n, "type"); - String *m3name = capitalizeFirst(variable_name); - //String *m3name = nameToModula3(variable_name,true); - if (!SwigType_isconst(type)) { - { - String *inmode = getMappedTypeNew(n, "m3wrapinmode", "", false); - String *intype = getMappedTypeNew(n, "m3wrapintype", ""); - Printf(methods, "set%s(%s val:%s);\n", m3name, (inmode != NIL) ? (const String *) inmode : "", intype); - } - { - /* this was attached by functionWrapper - invoked by Language::memberfunctionHandler */ - String *fname = Getattr(n, "modula3:setname"); - Printf(overrides, "set%s := %s;\n", m3name, fname); - } - } - { - { - String *outtype = getMappedTypeNew(n, "m3wrapouttype", ""); - Printf(methods, "get%s():%s;\n", m3name, outtype); - } - { - /* this was attached by functionWrapper - invoked by Language::memberfunctionHandler */ - String *fname = Getattr(n, "modula3:getname"); - Printf(overrides, "get%s := %s;\n", m3name, fname); - } - } - Delete(m3name); - } - //printf("end membervariableHandler(%s)\n", Char(Getattr(n,"name"))); - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * staticmembervariableHandler() - * ---------------------------------------------------------------------- */ - - virtual int staticmembervariableHandler(Node *n) { - - bool static_const_member_flag = (Getattr(n, "value") == 0); - if (static_const_member_flag) { - SwigType *t = Getattr(n, "type"); - String *tm; - - // Get the variable type - if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { - substituteClassname(t, tm); - } - // Output the property's field declaration and accessor methods - Printf(proxy_class_code, " public static %s %s {", tm, Getattr(n, "sym:name")); - } - - variable_name = Getattr(n, "sym:name"); - wrapping_member_flag = true; - static_flag = true; - Language::staticmembervariableHandler(n); - wrapping_member_flag = false; - static_flag = false; - - if (static_const_member_flag) - Printf(proxy_class_code, "\n }\n\n"); - - return SWIG_OK; - } - - /* ---------------------------------------------------------------------- - * memberconstantHandler() - * ---------------------------------------------------------------------- */ - - virtual int memberconstantHandler(Node *n) { - variable_name = Getattr(n, "sym:name"); - wrapping_member_flag = true; - Language::memberconstantHandler(n); - wrapping_member_flag = false; - return SWIG_OK; - } - - /* ----------------------------------------------------------------------------- - * getOverloadedName() - * ----------------------------------------------------------------------------- */ - - String *getOverloadedName(Node *n) { - String *overloaded_name = Copy(Getattr(n, "sym:name")); - - if (Getattr(n, "sym:overloaded")) { - Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); - } - - return overloaded_name; - } - - /* ----------------------------------------------------------------------------- - * emitM3Wrapper() - * It is also used for set and get methods of global variables. - * ----------------------------------------------------------------------------- */ - - void emitM3Wrapper(Node *n, const String *func_name) { - SwigType *t = Getattr(n, "type"); - ParmList *l = Getattr(n, "parms"); - Hash *throws_hash = NewHash(); - int num_exceptions = 0; - int num_returns = 0; - String *rawcall = NewString(""); - String *reccall = NewString(""); - String *local_variables = NewString(""); - String *local_constants = NewString(""); - String *incheck = NewString(""); - String *outcheck = NewString(""); - String *setup = NewString(""); - String *cleanup = NewString(""); - String *outarg = NewString(""); /* don't mix up with 'autark' :-] */ - String *storeout = NewString(""); - String *result_name = NewString(""); - String *return_variables = NewString(""); - const char *result_return = "ret"; - String *function_code = NewString(""); - /*several names for the same function */ - String *raw_name = Getattr(n, "name"); /*original C function name */ - //String *func_name = Getattr(n,"sym:name"); /*final Modula3 name chosen by the user*/ - bool setter_flag = false; - int multiretval = GetFlag(n, "feature:modula3:multiretval"); - - if (l) { - if (SwigType_type(Getattr(l, "type")) == T_VOID) { - l = nextSibling(l); - } - } - - /* Attach the non-standard typemaps to the parameter list */ - Swig_typemap_attach_parms("m3wrapargvar", l, NULL); - Swig_typemap_attach_parms("m3wrapargconst", l, NULL); - Swig_typemap_attach_parms("m3wrapargraw", l, NULL); - Swig_typemap_attach_parms("m3wrapargdir", l, NULL); - Swig_typemap_attach_parms("m3wrapinmode", l, NULL); - Swig_typemap_attach_parms("m3wrapinname", l, NULL); - Swig_typemap_attach_parms("m3wrapintype", l, NULL); - Swig_typemap_attach_parms("m3wrapindefault", l, NULL); - Swig_typemap_attach_parms("m3wrapinconv", l, NULL); - Swig_typemap_attach_parms("m3wrapincheck", l, NULL); - Swig_typemap_attach_parms("m3wrapoutname", l, NULL); - Swig_typemap_attach_parms("m3wrapouttype", l, NULL); - Swig_typemap_attach_parms("m3wrapoutconv", l, NULL); - Swig_typemap_attach_parms("m3wrapoutcheck", l, NULL); - - attachMappedType(n, "m3wrapretraw"); - attachMappedType(n, "m3wrapretname"); - attachMappedType(n, "m3wraprettype"); - attachMappedType(n, "m3wrapretvar"); - attachMappedType(n, "m3wrapretconv"); - attachMappedType(n, "m3wrapretcheck"); - - Swig_typemap_attach_parms("m3wrapfreearg", l, NULL); - -/* - Swig_typemap_attach_parms("m3wrapargvar:throws", l, NULL); - Swig_typemap_attach_parms("m3wrapargraw:throws", l, NULL); - Swig_typemap_attach_parms("m3wrapinconv:throws", l, NULL); - Swig_typemap_attach_parms("m3wrapincheck:throws", l, NULL); - Swig_typemap_attach_parms("m3wrapoutconv:throws", l, NULL); - Swig_typemap_attach_parms("m3wrapoutcheck:throws", l, NULL); - - attachMappedType(n, "m3wrapretvar:throws"); - attachMappedType(n, "m3wrapretconv:throws"); - attachMappedType(n, "m3wrapretcheck:throws"); - - Swig_typemap_attach_parms("m3wrapfreearg:throws", l, NULL); -*/ - - /* Attach argument names to the parameter list */ - /* should be a separate procedure making use of hashes */ - attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); - - /* Get return types */ - String *result_m3rawtype = Copy(getMappedTypeNew(n, "m3rawrettype", "")); - String *result_m3wraptype = Copy(getMappedTypeNew(n, "m3wraprettype", "")); - bool has_return_raw = hasContent(result_m3rawtype); - bool has_return_m3 = hasContent(result_m3wraptype); - if (has_return_m3) { - num_returns++; - //printf("%s: %s\n", Char(func_name),Char(result_m3wraptype)); - } - - String *arguments = createM3Signature(n); - - /* Create local variables or RECORD fields for return values - and determine return type that might result from a converted VAR argument. */ - { - writeArgState state; - if (multiretval && has_return_m3) { - writeArg(return_variables, state, NIL, NewString(result_return), result_m3wraptype, NIL); - } - - Parm *p = skipIgnored(l, "m3wrapouttype"); - while (p != NIL) { - - String *arg = Getattr(p, "tmap:m3wrapoutname"); - if (arg == NIL) { - arg = Getattr(p, "name"); - } - - String *tm = Getattr(p, "tmap:m3wrapouttype"); - if (tm != NIL) { - if (isOutParam(p)) { - if (!multiretval) { - if (num_returns == 0) { - Printv(result_name, arg, NIL); - Clear(result_m3wraptype); - Printv(result_m3wraptype, tm, NIL); - } else { - Swig_warning(WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN, input_file, line_number, - "Typemap m3wrapargdir set to 'out' for %s implies a RETURN value, but the routine %s has already one.\nUse %%multiretval feature.\n", - SwigType_str(Getattr(p, "type"), 0), raw_name); - } - } - num_returns++; - addImports(m3wrap_intf.import, "m3wrapouttype", p); - writeArg(return_variables, state, NIL, arg, tm, NIL); - } - p = skipIgnored(Getattr(p, "tmap:m3wrapouttype:next"), "m3wrapouttype"); - } else { - p = nextSibling(p); - } - } - writeArg(return_variables, state, NIL, NIL, NIL, NIL); - - if (multiretval) { - Printv(result_name, Swig_cresult_name(), NIL); - Printf(result_m3wraptype, "%sResult", func_name); - m3wrap_intf.enterBlock(blocktype); - Printf(m3wrap_intf.f, "%s =\nRECORD\n%sEND;\n", result_m3wraptype, return_variables); - Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); - } else { - Append(local_variables, return_variables); - } - } - - /* Declare local constants e.g. for storing argument names. */ - { - Parm *p = l; - while (p != NIL) { - - String *arg = Getattr(p, "autoname"); - - String *tm = Getattr(p, "tmap:m3wrapargconst"); - if (tm != NIL) { - addImports(m3wrap_impl.import, "m3wrapargconst", p); - Replaceall(tm, "$input", arg); - Printv(local_constants, tm, "\n", NIL); - p = Getattr(p, "tmap:m3wrapargconst:next"); - } else { - p = nextSibling(p); - } - - } - } - - /* Declare local variables e.g. for converted input values. */ - { - String *tm = getMappedTypeNew(n, "m3wrapretvar", "", false); - if (tm != NIL) { - addImports(m3wrap_impl.import, "m3wrapretvar", n); - addThrows(throws_hash, "m3wrapretvar", n); - Printv(local_variables, tm, "\n", NIL); - } - - Parm *p = l; - while (p != NIL) { - - String *arg = Getattr(p, "autoname"); - - tm = Getattr(p, "tmap:m3wrapargvar"); - if (tm != NIL) { - /* exceptions that may be raised but can't be caught, - thus we won't count them in num_exceptions */ - addImports(m3wrap_impl.import, "m3wrapargvar", p); - addThrows(throws_hash, "m3wrapargvar", p); - Replaceall(tm, "$input", arg); - Printv(local_variables, tm, "\n", NIL); - p = Getattr(p, "tmap:m3wrapargvar:next"); - } else { - p = nextSibling(p); - } - - } - } - - /* Convert input values from Modula 3 to C. */ - { - Parm *p = l; - while (p != NIL) { - - String *arg = Getattr(p, "autoname"); - - String *tm = Getattr(p, "tmap:m3wrapinconv"); - if (tm != NIL) { - addImports(m3wrap_impl.import, "m3wrapinconv", p); - num_exceptions += addThrows(throws_hash, "m3wrapinconv", p); - Replaceall(tm, "$input", arg); - Printv(setup, tm, "\n", NIL); - p = Getattr(p, "tmap:m3wrapinconv:next"); - } else { - p = nextSibling(p); - } - - } - } - - /* Generate checks for input value integrity. */ - { - Parm *p = l; - while (p != NIL) { - - String *arg = Getattr(p, "autoname"); - - String *tm = Getattr(p, "tmap:m3wrapincheck"); - if (tm != NIL) { - addImports(m3wrap_impl.import, "m3wrapincheck", p); - num_exceptions += addThrows(throws_hash, "m3wrapincheck", p); - Replaceall(tm, "$input", arg); - Printv(incheck, tm, "\n", NIL); - p = Getattr(p, "tmap:m3wrapincheck:next"); - } else { - p = nextSibling(p); - } - - } - } - - Printv(rawcall, m3raw_name, ".", func_name, "(", NIL); - /* Arguments to the raw C function */ - { - bool gencomma = false; - Parm *p = l; - while (p != NIL) { - if (gencomma) { - Printf(rawcall, ", "); - } - gencomma = true; - addImports(m3wrap_impl.import, "m3wrapargraw", p); - num_exceptions += addThrows(throws_hash, "m3wrapargraw", p); - - String *arg = Getattr(p, "autoname"); - String *qualarg = NewString(""); - if (!isInParam(p)) { - String *tmparg = Getattr(p, "tmap:m3wrapoutname"); - if (tmparg != NIL) { - arg = tmparg; - } - if (multiretval /*&& isOutParam(p) - automatically fulfilled */ ) { - Printf(qualarg, "%s.", result_name); - } - } - Append(qualarg, arg); - Setattr(p, "m3outarg", qualarg); - - String *tm = Getattr(p, "tmap:m3wrapargraw"); - if (tm != NIL) { - Replaceall(tm, "$input", arg); - Replaceall(tm, "$output", qualarg); - Printv(rawcall, tm, NIL); - p = Getattr(p, "tmap:m3wrapargraw:next"); - } else { - //Printv(rawcall, Getattr(p,"lname"), NIL); - Printv(rawcall, qualarg, NIL); - p = nextSibling(p); - } - Delete(qualarg); - } - } - Printf(rawcall, ")"); - - /* Check for error codes and integrity of results */ - { - String *tm = getMappedTypeNew(n, "m3wrapretcheck", "", false); - if (tm != NIL) { - addImports(m3wrap_impl.import, "m3wrapretcheck", n); - num_exceptions += addThrows(throws_hash, "m3wrapretcheck", n); - Printv(outcheck, tm, "\n", NIL); - } - - Parm *p = l; - while (p != NIL) { - tm = Getattr(p, "tmap:m3wrapoutcheck"); - if (tm != NIL) { - String *arg = Getattr(p, "autoname"); - String *outarg = Getattr(p, "m3outarg"); - addImports(m3wrap_impl.import, "m3wrapoutcheck", p); - num_exceptions += addThrows(throws_hash, "m3wrapoutcheck", p); - //substituteClassname(Getattr(p,"type"), tm); - Replaceall(tm, "$input", arg); - Replaceall(tm, "$output", outarg); - Printv(outcheck, tm, "\n", NIL); - p = Getattr(p, "tmap:m3wrapoutcheck:next"); - } else { - p = nextSibling(p); - } - } - } - - /* Convert the results to Modula 3 data structures and - put them in the record prepared for returning */ - { - /* m3wrapretconv is processed - when it is clear if there is some output conversion and checking code */ - Parm *p = l; - while (p != NIL) { - String *tm = Getattr(p, "tmap:m3wrapoutconv"); - if (tm != NIL) { - String *arg = Getattr(p, "autoname"); - String *outarg = Getattr(p, "m3outarg"); - addImports(m3wrap_impl.import, "m3wrapoutconv", n); - num_exceptions += addThrows(throws_hash, "m3wrapoutconv", p); - //substituteClassname(Getattr(p,"type"), tm); - Replaceall(tm, "$input", arg); - Replaceall(tm, "$output", outarg); - Printf(storeout, "%s := %s;\n", outarg, tm); - p = Getattr(p, "tmap:m3wrapoutconv:next"); - } else { - p = nextSibling(p); - } - } - } - - /* Generate cleanup code */ - { - Parm *p = l; - while (p != NIL) { - String *tm = Getattr(p, "tmap:m3wrapfreearg"); - if (tm != NIL) { - String *arg = Getattr(p, "autoname"); - String *outarg = Getattr(p, "m3outarg"); - addImports(m3wrap_impl.import, "m3wrapfreearg", p); - num_exceptions += addThrows(throws_hash, "m3wrapfreearg", p); - //substituteClassname(Getattr(p,"type"), tm); - Replaceall(tm, "$input", arg); - Replaceall(tm, "$output", outarg); - Printv(cleanup, tm, "\n", NIL); - p = Getattr(p, "tmap:m3wrapfreearg:next"); - } else { - p = nextSibling(p); - } - } - } - - { - /* Currently I don't know how a typemap similar to the original 'out' typemap - could help returning the return value. */ - /* Receive result from call to raw library function */ - if (!has_return_raw) { - /* - rawcall(arg1); - result.val := arg1; - RETURN result; - */ - /* - rawcall(arg1); - RETURN arg1; - */ - Printf(reccall, "%s;\n", rawcall); - - if (hasContent(result_name)) { - Printf(outarg, "RETURN %s;\n", result_name); - } - } else { - /* - arg0 := rawcall(arg1); - result.ret := Convert(arg0); - result.val := arg1; - RETURN result; - */ - /* - arg0 := rawcall(); - RETURN Convert(arg0); - */ - /* - RETURN rawcall(); - */ - String *return_raw = getMappedTypeNew(n, "m3wrapretraw", "", false); - String *return_conv = getMappedTypeNew(n, "m3wrapretconv", "", false); - - /* immediate RETURN would skip result checking */ - if ((hasContent(outcheck) || hasContent(storeout) - || hasContent(cleanup)) && (!hasContent(result_name)) - && (return_raw == NIL)) { - Printv(result_name, Swig_cresult_name(), NIL); - Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); - } - - String *result_lvalue = Copy(result_name); - if (multiretval) { - Printf(result_lvalue, ".%s", result_return); - } - if (return_raw != NIL) { - Printf(reccall, "%s := %s;\n", return_raw, rawcall); - } else if (hasContent(result_name)) { - Printf(reccall, "%s := %s;\n", result_lvalue, rawcall); - } else { - Printf(outarg, "RETURN %s;\n", rawcall); - } - if (return_conv != NIL) { - addImports(m3wrap_impl.import, "m3wrapretconv", n); - num_exceptions += addThrows(throws_hash, "m3wrapretconv", n); - if (hasContent(result_name)) { - Printf(reccall, "%s := %s;\n", result_lvalue, return_conv); - Printf(outarg, "RETURN %s;\n", result_name); - } else { - Printf(outarg, "RETURN %s;\n", return_conv); - } - } else { - if (hasContent(result_name)) { - Printf(outarg, "RETURN %s;\n", result_name); - } - } - } - } - - /* Create procedure header */ - { - String *header = NewStringf("PROCEDURE %s (%s)", - func_name, arguments); - - if ((num_returns > 0) || multiretval) { - Printf(header, ": %s", result_m3wraptype); - } - generateThrowsClause(throws_hash, header); - - Append(function_code, header); - - m3wrap_intf.enterBlock(no_block); - Printf(m3wrap_intf.f, "%s;\n\n", header); - } - - { - String *body = NewStringf("%s%s%s%s%s", - incheck, - setup, - reccall, - outcheck, - storeout); - - String *exc_handler; - if (hasContent(cleanup) && (num_exceptions > 0)) { - exc_handler = NewStringf("TRY\n%sFINALLY\n%sEND;\n", body, cleanup); - } else { - exc_handler = NewStringf("%s%s", body, cleanup); - } - - Printf(function_code, " =\n%s%s%s%sBEGIN\n%s%sEND %s;\n\n", - hasContent(local_constants) ? "CONST\n" : "", local_constants, - hasContent(local_variables) ? "VAR\n" : "", local_variables, exc_handler, outarg, func_name); - - Delete(exc_handler); - Delete(body); - } - - m3wrap_impl.enterBlock(no_block); - if (proxy_flag && global_variable_flag) { - setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, variable_name)) == 0); - // Properties - if (setter_flag) { - // Setter method - String *tm = getMappedTypeNew(n, "m3varin", ""); - if (tm != NIL) { - if (GetFlag(n, "feature:new")) { - Replaceall(tm, "$owner", "true"); - } else { - Replaceall(tm, "$owner", "false"); - } - substituteClassname(t, tm); - Replaceall(tm, "$rawcall", rawcall); - Replaceall(tm, "$vartype", variable_type); /* $type is already replaced by some super class */ - Replaceall(tm, "$var", variable_name); - Printf(m3wrap_impl.f, "%s", tm); - } - } else { - // Getter method - String *tm = getMappedTypeNew(n, "m3varout", ""); - if (tm != NIL) { - if (GetFlag(n, "feature:new")) - Replaceall(tm, "$owner", "true"); - else - Replaceall(tm, "$owner", "false"); - substituteClassname(t, tm); - Replaceall(tm, "$rawcall", rawcall); - Replaceall(tm, "$vartype", variable_type); - Replaceall(tm, "$var", variable_name); - Printf(m3wrap_impl.f, "%s", tm); - } - } - } else { - // Normal function call - Printv(m3wrap_impl.f, function_code, NIL); - } - - Delete(arguments); - Delete(return_variables); - Delete(local_variables); - Delete(local_constants); - Delete(outarg); - Delete(incheck); - Delete(outcheck); - Delete(setup); - Delete(cleanup); - Delete(storeout); - Delete(function_code); - Delete(result_name); - Delete(result_m3wraptype); - Delete(reccall); - Delete(rawcall); - Delete(throws_hash); - } - - /*---------------------------------------------------------------------- - * replaceSpecialVariables() - *--------------------------------------------------------------------*/ - - virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { - (void)method; - SwigType *type = Getattr(parm, "type"); - substituteClassname(type, tm); - } - - /* ----------------------------------------------------------------------------- - * substituteClassname() - * - * Substitute the special variable $m3classname with the proxy class name for classes/structs/unions - * that SWIG knows about. - * Otherwise use the $descriptor name for the Modula 3 class name. Note that the $&m3classname substitution - * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. - * Inputs: - * pt - parameter type - * tm - typemap contents that might contain the special variable to be replaced - * Outputs: - * tm - typemap contents complete with the special variable substitution - * Return: - * substitution_performed - flag indicating if a substitution was performed - * ----------------------------------------------------------------------------- */ - - bool substituteClassname(SwigType *pt, String *tm) { - bool substitution_performed = false; - if (Strstr(tm, "$m3classname") || Strstr(tm, "$&m3classname")) { - String *classname = getProxyName(pt); - if (classname) { - Replaceall(tm, "$&m3classname", classname); // getProxyName() works for pointers to classes too - Replaceall(tm, "$m3classname", classname); - } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. - String *descriptor = NULL; - SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); - - if (Strstr(tm, "$&m3classname")) { - SwigType_add_pointer(type); - descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); - Replaceall(tm, "$&m3classname", descriptor); - } else { // $m3classname - descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); - Replaceall(tm, "$m3classname", descriptor); - } - - // Add to hash table so that the type wrapper classes can be created later - Setattr(swig_types_hash, descriptor, type); - Delete(descriptor); - Delete(type); - } - substitution_performed = true; - } - return substitution_performed; - } - - /* ----------------------------------------------------------------------------- - * attachParameterNames() - * - * Inputs: - * n - Node of a function declaration - * tmid - attribute name for overriding C argument names, - * e.g. "tmap:m3wrapinname", - * don't forget to attach the mapped types before - * nameid - attribute for attaching the names, - * e.g. "modula3:inname" - * fmt - format for the argument name containing %d - * e.g. "arg%d" - * ----------------------------------------------------------------------------- */ - - void attachParameterNames(Node *n, const char *tmid, const char *nameid, const char *fmt) { - /* Use C parameter name if present and unique, - otherwise create an 'arg%d' name */ - Hash *hash = NewHash(); - Parm *p = Getattr(n, "parms"); - int count = 0; - while (p != NIL) { - String *name = Getattr(p, tmid); - if (name == NIL) { - name = Getattr(p, "name"); - } - String *newname; - if ((!hasContent(name)) || (Getattr(hash, name) != NIL)) { - newname = NewStringf(fmt, count); - } else { - newname = Copy(name); - } - if (1 == Setattr(hash, newname, "1")) { - Swig_warning(WARN_MODULA3_DOUBLE_ID, input_file, line_number, "Argument '%s' twice.\n", newname); - } - Setattr(p, nameid, newname); -// Delete(newname); - p = nextSibling(p); - count++; - } - Delete(hash); - } - - /* ----------------------------------------------------------------------------- - * createM3Signature() - * - * Create signature of M3 wrapper procedure - * Call attachParameterNames and attach mapped types before! - * m3wrapintype, m3wrapinmode, m3wrapindefault - * ----------------------------------------------------------------------------- */ - - String *createM3Signature(Node *n) { - String *arguments = NewString(""); - Parm *p = skipIgnored(Getattr(n, "parms"), "m3wrapintype"); - writeArgState state; - while (p != NIL) { - - /* Get the M3 parameter type */ - String *tm = getMappedType(p, "m3wrapintype"); - if (tm != NIL) { - if (isInParam(p)) { - addImports(m3wrap_intf.import, "m3wrapintype", p); - addImports(m3wrap_impl.import, "m3wrapintype", p); - String *mode = Getattr(p, "tmap:m3wrapinmode"); - String *deflt = Getattr(p, "tmap:m3wrapindefault"); - String *arg = Getattr(p, "autoname"); - SwigType *pt = Getattr(p, "type"); - substituteClassname(pt, tm); /* do we need this ? */ - - writeArg(arguments, state, mode, arg, tm, deflt); - } - p = skipIgnored(Getattr(p, "tmap:m3wrapintype:next"), "m3wrapintype"); - } else { - p = nextSibling(p); - } - } - writeArg(arguments, state, NIL, NIL, NIL, NIL); - return (arguments); - } - -/* not used any longer - - try SwigType_str if required again */ -#if 0 - /* ----------------------------------------------------------------------------- - * createCSignature() - * - * Create signature of C function - * ----------------------------------------------------------------------------- */ - - String *createCSignature(Node *n) { - String *arguments = NewString(""); - bool gencomma = false; - Node *p; - for (p = Getattr(n, "parms"); p != NIL; p = nextSibling(p)) { - if (gencomma) { - Append(arguments, ","); - } - gencomma = true; - String *type = Getattr(p, "type"); - String *ctype = getMappedTypeNew(type, "ctype"); - Append(arguments, ctype); - } - return arguments; - } -#endif - - /* ----------------------------------------------------------------------------- - * emitTypeWrapperClass() - * ----------------------------------------------------------------------------- */ - - void emitTypeWrapperClass(String *classname, SwigType *type) { - Node *n = NewHash(); - Setfile(n, input_file); - Setline(n, line_number); - - String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), classname); - File *f_swigtype = NewFile(filen, "w", SWIG_output_files()); - if (!f_swigtype) { - FileErrorDisplay(filen); - SWIG_exit(EXIT_FAILURE); - } - String *swigtype = NewString(""); - - // Emit banner name - emitBanner(f_swigtype); - - // Pure Modula 3 baseclass and interfaces - const String *pure_baseclass = typemapLookup(n, "m3base", type, WARN_NONE); - const String *pure_interfaces = typemapLookup(n, "m3interfaces", type, WARN_NONE); - - // Emit the class - Printv(swigtype, typemapLookup(n, "m3imports", type, WARN_NONE), // Import statements - "\n", typemapLookup(n, "m3classmodifiers", type, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers - " class $m3classname", // Class name and bases - *Char(pure_baseclass) ? " : " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces - " : " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", type, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers - " $m3classname(IntPtr cPtr, bool bFutureUse) {\n", // Constructor used for wrapping pointers - " swigCPtr = cPtr;\n", " }\n", "\n", " protected $m3classname() {\n", // Default constructor - " swigCPtr = IntPtr.Zero;\n", " }\n", typemapLookup(n, "m3getcptr", type, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method - typemapLookup(n, "m3code", type, WARN_NONE), // extra Modula 3 code - "}\n", "\n", NIL); - - Replaceall(swigtype, "$m3classname", classname); - Printv(f_swigtype, swigtype, NIL); - - Delete(f_swigtype); - Delete(filen); - Delete(swigtype); - } - - /* ----------------------------------------------------------------------------- - * typemapLookup() - * n - for input only and must contain info for Getfile(n) and Getline(n) to work - * tmap_method - typemap method name - * type - typemap type to lookup - * warning - warning number to issue if no typemaps found - * typemap_attributes - the typemap attributes are attached to this node and will - * also be used for temporary storage if non null - * return is never NULL, unlike Swig_typemap_lookup() - * ----------------------------------------------------------------------------- */ - - const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { - Node *node = !typemap_attributes ? NewHash() : typemap_attributes; - Setattr(node, "type", type); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); - if (!tm) { - tm = empty_string; - if (warning != WARN_NONE) - Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); - } - if (!typemap_attributes) - Delete(node); - return tm; - } - - /* ----------------------------------------------------------------------------- - * addThrows() - * - * Add all exceptions to a hash that are associated with the 'typemap'. - * Return number the number of these exceptions. - * ----------------------------------------------------------------------------- */ - - int addThrows(Hash *throws_hash, const String *typemap, Node *parameter) { - // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in - int len = 0; - String *throws_attribute = NewStringf("%s:throws", typemap); - - addImports(m3wrap_intf.import, throws_attribute, parameter); - addImports(m3wrap_impl.import, throws_attribute, parameter); - - String *throws = getMappedTypeNew(parameter, Char(throws_attribute), "", false); - //printf("got exceptions %s for %s\n", Char(throws), Char(throws_attribute)); - - if (throws) { - // Put the exception classes in the throws clause into a temporary List - List *temp_classes_list = Split(throws, ',', INT_MAX); - len = Len(temp_classes_list); - - // Add the exception classes to the node throws list, but don't duplicate if already in list - if (temp_classes_list /*&& hasContent(temp_classes_list) */ ) { - for (Iterator cls = First(temp_classes_list); cls.item != NIL; cls = Next(cls)) { - String *exception_class = NewString(cls.item); - Replaceall(exception_class, " ", ""); // remove spaces - Replaceall(exception_class, "\t", ""); // remove tabs - if (hasContent(exception_class)) { - // $m3classname substitution - SwigType *pt = Getattr(parameter, "type"); - substituteClassname(pt, exception_class); - // Don't duplicate the exception class in the throws clause - //printf("add exception %s\n", Char(exception_class)); - Setattr(throws_hash, exception_class, "1"); - } - Delete(exception_class); - } - } - Delete(temp_classes_list); - } - Delete(throws_attribute); - return len; - } - - /* ----------------------------------------------------------------------------- - * generateThrowsClause() - * ----------------------------------------------------------------------------- */ - - void generateThrowsClause(Hash *throws_hash, String *code) { - // Add the throws clause into code - if (Len(throws_hash) > 0) { - Iterator cls = First(throws_hash); - Printf(code, " RAISES {%s", cls.key); - for (cls = Next(cls); cls.key != NIL; cls = Next(cls)) { - Printf(code, ", %s", cls.key); - } - Printf(code, "}"); - } - } - - /* ----------------------------------------------------------------------------- - * addImports() - * - * Add all imports that are needed for contents of 'typemap'. - * ----------------------------------------------------------------------------- */ - - void addImports(Hash *imports_hash, const String *typemap, Node *node) { - // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in - String *imports_attribute = NewStringf("%s:import", typemap); - String *imports = getMappedTypeNew(node, Char(imports_attribute), "", false); - //printf("got imports %s for %s\n", Char(imports), Char(imports_attribute)); - - if (imports != NIL) { - List *import_list = Split(imports, ',', INT_MAX); - - // Add the exception classes to the node imports list, but don't duplicate if already in list - if (import_list != NIL) { - for (Iterator imp = First(import_list); imp.item != NIL; imp = Next(imp)) { - List *import_pair = Split(imp.item, ' ', 3); - if (Len(import_pair) == 1) { - Setattr(imports_hash, Getitem(import_pair, 0), ""); - } else if ((Len(import_pair) == 3) - && Strcmp(Getitem(import_pair, 1), "AS") == 0) { - Setattr(imports_hash, Getitem(import_pair, 0), Getitem(import_pair, 2)); - } else { - Swig_warning(WARN_MODULA3_BAD_IMPORT, input_file, line_number, - "Malformed import '%s' for typemap '%s' defined for type '%s'\n", imp, typemap, SwigType_str(Getattr(node, "type"), 0)); - } - Delete(import_pair); - } - } - Delete(import_list); - } - Delete(imports_attribute); - } - - /* ----------------------------------------------------------------------------- - * emitImportStatements() - * ----------------------------------------------------------------------------- */ - - void emitImportStatements(Hash *imports_hash, String *code) { - // Add the imports statements into code - Iterator imp = First(imports_hash); - while (imp.key != NIL) { - Printf(code, "IMPORT %s", imp.key); - String *imp_as = imp.item; - if (hasContent(imp_as)) { - Printf(code, " AS %s", imp_as); - } - Printf(code, ";\n"); - imp = Next(imp); - } - } - -}; /* class MODULA3 */ - -/* ----------------------------------------------------------------------------- - * swig_modula3() - Instantiate module - * ----------------------------------------------------------------------------- */ - -extern "C" Language *swig_modula3(void) { - return new MODULA3(); -} - -/* ----------------------------------------------------------------------------- - * Static member variables - * ----------------------------------------------------------------------------- */ - -const char *MODULA3::usage = "\ -Modula 3 Options (available with -modula3)\n\ - -generateconst - Generate code for computing numeric values of constants\n\ - -generaterename - Generate suggestions for %rename\n\ - -generatetypemap - Generate templates for some basic typemaps\n\ - -oldvarnames - Old intermediary method names for variable wrappers\n\ -\n"; - -/* - -generateconst - stem of the .c source file for computing the numeric values of constants\n\ - -generaterename - stem of the .i source file containing %rename suggestions\n\ - -generatetypemap - stem of the .i source file containing typemap patterns\n\ -*/ diff --git a/Source/Modules/mzscheme.cxx b/Source/Modules/mzscheme.cxx index 788681330..3ff691662 100644 --- a/Source/Modules/mzscheme.cxx +++ b/Source/Modules/mzscheme.cxx @@ -322,8 +322,6 @@ public: } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); @@ -343,7 +341,6 @@ public: /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -355,8 +352,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ - Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); @@ -371,7 +366,6 @@ public: /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { @@ -385,8 +379,6 @@ public: // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "values[0]"); Replaceall(tm, "$result", "values[0]"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); @@ -408,14 +400,12 @@ public: if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) @@ -453,7 +443,7 @@ public: Printv(df->def, "static Scheme_Object *\n", dname, "(int argc, Scheme_Object **argv) {", NIL); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "scheme_signal_error(\"No matching function for overloaded '%s'\");\n", iname); - Printf(df->code, "return NULL;\n", iname); + Printf(df->code, "return NULL;\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", proc_name, dname, proc_name, 0, maxargs); @@ -521,8 +511,6 @@ public: /* Check for a setting of the variable value */ Printf(f->code, "if (argc) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { - Replaceall(tm, "$source", "argv[0]"); - Replaceall(tm, "$target", name); Replaceall(tm, "$input", "argv[0]"); Replaceall(tm, "$argnum", "1"); emit_action_code(n, f->code, tm); @@ -535,8 +523,6 @@ public: // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$source", name); - Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); /* Printf (f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); @@ -609,9 +595,7 @@ public: Printv(rvalue, "'", temp, "'", NIL); } if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { - Replaceall(tm, "$source", rvalue); Replaceall(tm, "$value", rvalue); - Replaceall(tm, "$target", name); Printf(f_init, "%s\n", tm); } else { // Create variable and assign it a value diff --git a/Source/Modules/ocaml.cxx b/Source/Modules/ocaml.cxx index 6f2a34962..caa9725c0 100644 --- a/Source/Modules/ocaml.cxx +++ b/Source/Modules/ocaml.cxx @@ -590,8 +590,6 @@ public: } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); @@ -611,7 +609,6 @@ public: /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -623,8 +620,6 @@ public: for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ - Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Replaceall(tm, "$ntype", normalizeTemplatedClassName(Getattr(p, "type"))); @@ -640,7 +635,6 @@ public: /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { @@ -681,8 +675,6 @@ public: String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { - Replaceall(tm, "$source", "swig_result"); - Replaceall(tm, "$target", "rv"); Replaceall(tm, "$result", "rv"); Replaceall(tm, "$ntype", return_type_normalized); Printv(f->code, tm, "\n", NIL); @@ -701,14 +693,12 @@ public: if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", "swig_result"); Printv(f->code, tm, "\n", NIL); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } @@ -716,7 +706,6 @@ public: // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("swig_result", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) @@ -853,13 +842,9 @@ public: /* Check for a setting of the variable value */ Printf(f->code, "if (args != Val_int(0)) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { - Replaceall(tm, "$source", "args"); - Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("in", n, name, 0))) { - Replaceall(tm, "$source", "args"); - Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); emit_action_code(n, f->code, tm); } else { @@ -871,13 +856,9 @@ public: // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$source", name); - Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("out", n, name, 0))) { - Replaceall(tm, "$source", name); - Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); emit_action_code(n, f->code, tm); } else { @@ -1619,7 +1600,7 @@ public: /* pass the method call on to the OCaml object */ Printv(w->code, "swig_result = caml_swig_alloc(1,C_list);\n" "SWIG_Store_field(swig_result,0,args);\n" "args = swig_result;\n" "swig_result = Val_unit;\n", 0); - Printf(w->code, "static CAML_VALUE *swig_ocaml_func_val = NULL;\n" "if (!swig_ocaml_func_val) {\n"); + Printf(w->code, "static const CAML_VALUE *swig_ocaml_func_val = NULL;\n" "if (!swig_ocaml_func_val) {\n"); Printf(w->code, " swig_ocaml_func_val = caml_named_value(\"swig_runmethod\");\n }\n"); Printf(w->code, "swig_result = caml_callback3(*swig_ocaml_func_val,swig_get_self(),caml_copy_string(\"%s\"),args);\n", Getattr(n, "name")); /* exception handling */ diff --git a/Source/Modules/octave.cxx b/Source/Modules/octave.cxx index 1297d2445..04b315eaf 100644 --- a/Source/Modules/octave.cxx +++ b/Source/Modules/octave.cxx @@ -567,6 +567,10 @@ public: Wrapper *f = NewWrapper(); Octave_begin_function(n, f->def, iname, overname, !overloaded); + // Start default try block to execute + // cleanup code if exception is thrown + Printf(f->code, "try {\n"); + emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); @@ -607,9 +611,7 @@ public: sprintf(source, "args(%d)", j); Setattr(p, "emit:input", source); - Replaceall(tm, "$source", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); - Replaceall(tm, "$target", Getattr(p, "lname")); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); @@ -654,7 +656,6 @@ public: // Insert constraint checking code for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -677,7 +678,6 @@ public: } } if (tm && (Len(tm) != 0)) { - Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); @@ -690,8 +690,6 @@ public: String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", "_outp"); Replaceall(tm, "$result", "_outp"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -719,8 +717,6 @@ public: // Return the function value if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "_outv"); Replaceall(tm, "$result", "_outv"); if (GetFlag(n, "feature:new")) @@ -741,22 +737,31 @@ public: if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$result", "_outv"); Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "return _out;\n"); - Printf(f->code, "fail:\n"); // we should free locals etc if this happens + + // Execute cleanup code if branched to fail: label + Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Printf(f->code, "return octave_value_list();\n"); + + // Execute cleanup code if exception was thrown + Printf(f->code, "}\n"); + Printf(f->code, "catch(...) {\n"); + Printv(f->code, cleanup, NIL); + Printf(f->code, "throw;\n"); + Printf(f->code, "}\n"); + + // End wrapper function Printf(f->code, "}\n"); /* Substitute the cleanup code */ @@ -800,7 +805,7 @@ public: Printf(tmp, "}"); Wrapper_add_local(f, "argv", tmp); Printv(f->code, dispatch, "\n", NIL); - Printf(f->code, "error(\"No matching function for overload\");\n", iname); + Printf(f->code, "error(\"No matching function for overload\");\n"); Printf(f->code, "return octave_value_list();\n"); Printv(f->code, "}\n", NIL); @@ -830,12 +835,10 @@ public: String *setwname = Swig_name_wrapper(setname); Octave_begin_function(n, setf->def, setname, setwname, true); - Printf(setf->def, "if (!SWIG_check_num_args(\"%s_set\",args.length(),1,1,0)) return octave_value_list();", iname); + Printf(setf->code, "if (!SWIG_check_num_args(\"%s_set\",args.length(),1,1,0)) return octave_value_list();", iname); if (is_assignable(n)) { Setattr(n, "wrap:name", setname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { - Replaceall(tm, "$source", "args(0)"); - Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args(0)"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); @@ -845,8 +848,9 @@ public: } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } + Append(setf->code, "return octave_value_list();\n"); Append(setf->code, "fail:\n"); - Printf(setf->code, "return octave_value_list();\n"); + Append(setf->code, "return octave_value_list();\n"); } else { Printf(setf->code, "return octave_set_immutable(args,nargout);"); } @@ -858,18 +862,16 @@ public: Octave_begin_function(n, getf->def, getname, getwname, true); Wrapper_add_local(getf, "obj", "octave_value obj"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$source", name); - Replaceall(tm, "$target", "obj"); Replaceall(tm, "$result", "obj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } - Append(getf->code, " return obj;\n"); + Append(getf->code, "return obj;\n"); if (addfail) { Append(getf->code, "fail:\n"); - Append(getf->code, " return octave_value_list();\n"); + Append(getf->code, "return octave_value_list();\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); @@ -904,8 +906,6 @@ public: value = wname; } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); Replaceall(tm, "$value", cppvalue ? cppvalue : value); Replaceall(tm, "$nsname", iname); Printf(f_init, "%s\n", tm); diff --git a/Source/Modules/overload.cxx b/Source/Modules/overload.cxx index 5d278107c..8a4ce48f7 100644 --- a/Source/Modules/overload.cxx +++ b/Source/Modules/overload.cxx @@ -21,6 +21,7 @@ String *argv_template_string; String *argc_template_string; +namespace { struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ @@ -28,6 +29,7 @@ struct Overloaded { int error; /* Ambiguity error */ bool implicitconv_function; /* For ordering implicitconv functions*/ }; +} static int fast_dispatch_mode = 0; static int cast_dispatch_mode = 0; @@ -809,7 +811,7 @@ String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *maxar } if (num_arguments) { - Printf(f, "int _v;\n"); + Printf(f, "int _v = 0;\n"); } int num_braces = 0; diff --git a/Source/Modules/perl5.cxx b/Source/Modules/perl5.cxx index dfa85f3c8..e87f9f310 100644 --- a/Source/Modules/perl5.cxx +++ b/Source/Modules/perl5.cxx @@ -725,14 +725,11 @@ public: /* Produce string representation of source and target arguments */ sprintf(source, "ST(%d)", i); - String *target = Getattr(p, "lname"); if (i >= num_required) { Printf(f->code, " if (items > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$target", target); - Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save input location */ @@ -767,7 +764,6 @@ public: /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -778,7 +774,6 @@ public: /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); @@ -793,8 +788,6 @@ public: for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { SwigType *t = Getattr(p, "type"); - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); @@ -855,8 +848,6 @@ public: if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { SwigType *t = Getattr(n, "type"); - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); @@ -884,13 +875,11 @@ public: if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } @@ -995,8 +984,6 @@ public: /* Check for a few typemaps */ tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { - Replaceall(tm, "$source", "sv"); - Replaceall(tm, "$target", name); Replaceall(tm, "$input", "sv"); /* Printf(setf->code,"%s\n", tm); */ emit_action_code(n, setf->code, tm); @@ -1019,9 +1006,7 @@ public: Printv(getf->code, tab4, "MAGIC_PPERL\n", NIL); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$target", "sv"); Replaceall(tm, "$result", "sv"); - Replaceall(tm, "$source", name); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { @@ -1111,8 +1096,6 @@ public: } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); @@ -1121,8 +1104,6 @@ public: } Printf(constant_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); @@ -2341,7 +2322,7 @@ public: Replaceall(tm, "$error", "ERRSV"); Printv(w->code, Str(tm), "\n", NIL); } else { - Printf(w->code, " Swig::DirectorMethodException::raise(ERRSV);\n", classname, pyname); + Printf(w->code, " Swig::DirectorMethodException::raise(ERRSV);\n"); } Append(w->code, "}\n"); Delete(tm); diff --git a/Source/Modules/php.cxx b/Source/Modules/php.cxx index b192d6f6e..d1ef52b48 100644 --- a/Source/Modules/php.cxx +++ b/Source/Modules/php.cxx @@ -12,72 +12,36 @@ * ----------------------------------------------------------------------------- */ -/* FIXME: PHP OO wrapping TODO list: - * - * Medium term: - * - * Handle default parameters on overloaded methods in PHP where possible. - * (Mostly done - just need to handle cases of overloaded methods with - * default parameters...) - * This is an optimisation - we could handle this case using a PHP - * default value, but currently we treat it as we would for a default - * value which is a compound C++ expression (i.e. as if we had a - * method with two overloaded forms instead of a single method with - * a default parameter value). - * - * Long term: - * - * Sort out locale-dependent behaviour of strtod() - it's harmless unless - * SWIG ever sets the locale and DOH/base.c calls atof, so we're probably - * OK currently at least. - */ - -/* - * TODO: Replace remaining stderr messages with Swig_error or Swig_warning - * (may need to add more WARN_PHP_xxx codes...) - */ - #include "swigmod.h" #include #include static const char *usage = "\ -PHP 7 Options (available with -php7)\n\ - -noproxy - Don't generate proxy classes.\n\ +PHP Options (available with -php7)\n\ -prefix - Prepend to all class names in PHP wrappers\n\ \n"; -/* The original class wrappers for PHP stored the pointer to the C++ class in - * the object property _cPtr. If we use the same name for the member variable - * which we put the pointer to the C++ class in, then the flat function - * wrappers will automatically pull it out without any changes being required. - * FIXME: Isn't using a leading underscore a bit suspect here? - */ -#define SWIG_PTR "_cPtr" +// How to wrap non-class functions, variables and constants: +// FIXME: Make this specifiable and also allow a real namespace. -/* This is the name of the hash where the variables existing only in PHP - * classes are stored. - */ -#define SWIG_DATA "_pData" +// Wrap as global PHP names. +static bool wrap_nonclass_global = true; + +// Wrap in a class to fake a namespace (for compatibility with SWIG's behaviour +// before PHP added namespaces. +static bool wrap_nonclass_fake_class = true; -static int constructors = 0; -static String *NOTCLASS = NewString("Not a class"); -static Node *classnode = 0; static String *module = 0; static String *cap_module = 0; static String *prefix = 0; -static String *shadow_classname = 0; - static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_h = 0; -static File *f_phpcode = 0; static File *f_directors = 0; static File *f_directors_h = 0; -static String *phpfilename = 0; static String *s_header; static String *s_wrappers; @@ -85,7 +49,6 @@ static String *s_init; static String *r_init; // RINIT user code static String *s_shutdown; // MSHUTDOWN user code static String *r_shutdown; // RSHUTDOWN user code -static String *s_vinit; // varinit initialization code. static String *s_vdecl; static String *s_cinit; // consttab initialization code. static String *s_oinit; @@ -93,29 +56,48 @@ static String *s_arginfo; static String *s_entry; static String *cs_entry; static String *all_cs_entry; +static String *fake_cs_entry; +static String *s_creation; static String *pragma_incl; static String *pragma_code; static String *pragma_phpinfo; static String *pragma_version; -static String *s_oowrappers; -static String *s_fakeoowrappers; -static String *s_phpclasses; + +static String *class_name = NULL; +static String *magic_set = NULL; +static String *magic_get = NULL; +static String *magic_isset = NULL; + +// Class used as pseudo-namespace for compatibility. +static String *fake_class_name() { + static String *result = NULL; + if (!result) { + result = Len(prefix) ? prefix : module; + if (!s_creation) { + s_creation = NewStringEmpty(); + } + if (!fake_cs_entry) { + fake_cs_entry = NewStringf("static zend_function_entry class_%s_functions[] = {\n", result); + } + Printf(s_creation, "/* class entry for %s */\n",result); + Printf(s_creation, "zend_class_entry *SWIGTYPE_%s_ce;\n\n",result); + Printf(s_oinit, " INIT_CLASS_ENTRY(internal_ce, \"%s\", class_%s_functions);\n", result, result); + Printf(s_oinit, " SWIGTYPE_%s_ce = zend_register_internal_class(&internal_ce);\n", result); + Printf(s_oinit, "\n"); + } + return result; +} /* To reduce code size (generated and compiled) we only want to emit each * different arginfo once, so we need to track which have been used. */ static Hash *arginfo_used; -/* Variables for using PHP classes */ -static Node *current_class = 0; - -static Hash *shadow_get_vars; -static Hash *shadow_set_vars; +/* Track non-class pointer types we need to to wrap */ static Hash *zend_types = 0; static int shadow = 1; -static bool class_has_ctor = false; static String *wrapping_member_constant = NULL; // These static variables are used to pass some state from Handlers into functionWrapper @@ -126,67 +108,115 @@ static enum { membervar, staticmembervar, constructor, - directorconstructor + directorconstructor, + directordisown } wrapperType = standard; extern "C" { static void (*r_prevtracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; } -static void SwigPHP_emit_resource_registrations() { - Iterator ki; - bool emitted_default_dtor = false; +static void print_creation_free_wrapper(Node *n) { + if (!s_creation) { + s_creation = NewStringEmpty(); + } + String *s = s_creation; + + Printf(s, "/* class entry for %s */\n",class_name); + Printf(s, "zend_class_entry *SWIGTYPE_%s_ce;\n\n",class_name); + Printf(s, "/* class object handlers for %s */\n",class_name); + Printf(s, "zend_object_handlers %s_object_handlers;\n\n",class_name); + + if (Getattr(n, "has_destructor")) { + Printf(s, "/* Garbage Collection Method for class %s */\n",class_name); + Printf(s, "void %s_free_storage(zend_object *object) {\n",class_name); + Printf(s, " swig_object_wrapper *obj = 0;\n"); + Printf(s, " if (!object)\n"); + Printf(s, " return;\n"); + Printf(s, " obj = php_fetch_object(object);\n"); + + Printf(s, " zend_object_std_dtor(&obj->std);\n"); + + // expand %delete typemap instead of SWIG_remove? + Printf(s, " if (obj->newobject)\n"); + Printf(s, " SWIG_remove((%s *)obj->ptr);\n", Getattr(n, "classtype")); + Printf(s, "}\n\n"); + } + + Printf(s, "/* Object Creation Method for class %s */\n",class_name); + Printf(s, "zend_object * %s_object_new(zend_class_entry *ce) {\n",class_name); + Printf(s, " swig_object_wrapper *obj = (swig_object_wrapper*)zend_object_alloc(sizeof(swig_object_wrapper), ce);\n"); + Printf(s, " zend_object_std_init(&obj->std, ce);\n"); + Printf(s, " object_properties_init(&obj->std, ce);\n"); + Printf(s, " %s_object_handlers.offset = XtOffsetOf(swig_object_wrapper, std);\n", class_name); + if (Getattr(n, "has_destructor")) { + Printf(s, " %s_object_handlers.free_obj = %s_free_storage;\n", class_name, class_name); + } + Printf(s, " obj->std.handlers = &%s_object_handlers;\n obj->newobject = 1;\n return &obj->std;\n}\n\n\n",class_name); +} + +static void SwigPHP_emit_pointer_type_registrations() { if (!zend_types) return; - ki = First(zend_types); - if (ki.key) - Printf(s_oinit, "\n /* Register resource destructors for pointer types */\n"); + Iterator ki = First(zend_types); + if (!ki.key) + return; + + Printf(s_wrappers, "/* class object handlers for pointer wrappers */\n"); + Printf(s_wrappers, "static zend_object_handlers swig_ptr_object_handlers;\n\n"); + + Printf(s_wrappers, "/* Object Creation Method for pointer wrapping class */\n"); + Printf(s_wrappers, "static zend_object * swig_ptr_object_new(zend_class_entry *ce) {\n"); + Printf(s_wrappers, " swig_object_wrapper *obj = (swig_object_wrapper*)zend_object_alloc(sizeof(swig_object_wrapper), ce);\n"); + Printf(s_wrappers, " zend_object_std_init(&obj->std, ce);\n"); + Printf(s_wrappers, " object_properties_init(&obj->std, ce);\n"); + Printf(s_wrappers, " obj->std.handlers = &swig_ptr_object_handlers;\n"); + Printf(s_wrappers, " obj->newobject = 0;\n"); + Printf(s_wrappers, " return &obj->std;\n"); + Printf(s_wrappers, "}\n\n"); + + Printf(s_wrappers, "/* Implement __toString equivalent, since that worked for the old-style resource wrapped pointers. */\n"); + Append(s_wrappers, "#if PHP_MAJOR_VERSION < 8\n"); + Printf(s_wrappers, "static int swig_ptr_cast_object(zval *z, zval *retval, int type) {\n"); + Append(s_wrappers, "#else\n"); + Printf(s_wrappers, "static int swig_ptr_cast_object(zend_object *zobj, zval *retval, int type) {\n"); + Append(s_wrappers, "#endif\n"); + Printf(s_wrappers, " if (type == IS_STRING) {\n"); + Printf(s_wrappers, " char buf[80];\n"); + Append(s_wrappers, "#if PHP_MAJOR_VERSION < 8\n"); + Printf(s_wrappers, " swig_object_wrapper *obj = SWIG_Z_FETCH_OBJ_P(z);\n"); + Append(s_wrappers, "#else\n"); + Printf(s_wrappers, " swig_object_wrapper *obj = php_fetch_object(zobj);\n"); + Append(s_wrappers, "#endif\n"); + Printv(s_wrappers, " sprintf(buf, \"SWIGPointer(%p,owned=%d)\", obj->ptr, obj->newobject);\n", NIL); + Printf(s_wrappers, " ZVAL_STRING(retval, buf);\n"); + Printf(s_wrappers, " return SUCCESS;\n"); + Printf(s_wrappers, " }\n"); + Printf(s_wrappers, " return FAILURE;\n"); + Printf(s_wrappers, "}\n\n"); + + Printf(s_oinit, "\n /* Register classes to represent non-class pointer types */\n"); + Printf(s_oinit, " memcpy(&swig_ptr_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));\n"); + Printf(s_oinit, " swig_ptr_object_handlers.offset = XtOffsetOf(swig_object_wrapper, std);\n"); + Printf(s_oinit, " swig_ptr_object_handlers.cast_object = swig_ptr_cast_object;\n"); + while (ki.key) { - DOH *key = ki.key; - Node *class_node = ki.item; - String *human_name = key; - String *rsrc_dtor_name = NULL; + String *type = ki.key; - // write out body - if (class_node != NOTCLASS) { - String *destructor = Getattr(class_node, "destructor"); - human_name = Getattr(class_node, "sym:name"); - if (!human_name) - human_name = Getattr(class_node, "name"); - // Do we have a known destructor for this type? - if (destructor) { - rsrc_dtor_name = NewStringf("_wrap_destroy%s", key); - // Write out custom destructor function - Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); - Printf(s_wrappers, " %s(res, SWIGTYPE%s->name);\n", destructor, key); - Printf(s_wrappers, "}\n"); - } + if (!s_creation) { + s_creation = NewStringEmpty(); } - if (!rsrc_dtor_name) { - rsrc_dtor_name = NewString("_swig_default_rsrc_destroy"); - if (!emitted_default_dtor) { - // Write out custom destructor function - Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); - Printf(s_wrappers, " efree(res->ptr);\n"); - Printf(s_wrappers, "}\n"); - emitted_default_dtor = true; - } - } + Printf(s_creation, "/* class entry for pointer to %s */\n", type); + Printf(s_creation, "zend_class_entry *SWIGTYPE_%s_ce;\n\n", type); - // declare le_swig_ to store php registration - Printf(s_vdecl, "static int le_swig_%s=0; /* handle for %s */\n", key, human_name); - - // register with php - Printf(s_oinit, " le_swig_%s=zend_register_list_destructors_ex" - "(%s, NULL, SWIGTYPE%s->name, module_number);\n", key, rsrc_dtor_name, key); - - // store php type in class struct - Printf(s_oinit, " SWIG_TypeClientData(SWIGTYPE%s,&le_swig_%s);\n", key, key); - - Delete(rsrc_dtor_name); + Printf(s_oinit, " INIT_CLASS_ENTRY(internal_ce, \"%s\\\\%s\", NULL);\n", "SWIG", type); + Printf(s_oinit, " SWIGTYPE_%s_ce = zend_register_internal_class(&internal_ce);\n", type); + Printf(s_oinit, " SWIGTYPE_%s_ce->create_object = swig_ptr_object_new;\n", type); + Printf(s_oinit, " SWIG_TypeClientData(SWIGTYPE%s,SWIGTYPE_%s_ce);\n", type, type); + Printf(s_oinit, "\n"); ki = Next(ki); } @@ -215,7 +245,7 @@ public: } else { Swig_arg_error(); } - } else if ((strcmp(argv[i], "-noshadow") == 0) || (strcmp(argv[i], "-noproxy") == 0)) { + } else if ((strcmp(argv[i], "-noshadow") == 0)) { shadow = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { @@ -270,12 +300,10 @@ public: s_header = NewString("/* header section */\n"); s_wrappers = NewString("/* wrapper section */\n"); /* subsections of the init section */ - s_vinit = NewStringEmpty(); s_vdecl = NewString("/* vdecl subsection */\n"); s_cinit = NewString(" /* cinit subsection */\n"); s_oinit = NewString(" /* oinit subsection */\n"); pragma_phpinfo = NewStringEmpty(); - s_phpclasses = NewString("/* PHP Proxy Classes */\n"); f_directors_h = NewStringEmpty(); f_directors = NewStringEmpty(); @@ -313,9 +341,6 @@ public: if (!prefix) prefix = NewStringEmpty(); - Printf(f_runtime, "#define SWIG_PREFIX \"%s\"\n", prefix); - Printf(f_runtime, "#define SWIG_PREFIX_LEN %lu\n", (unsigned long)Len(prefix)); - if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); @@ -327,36 +352,6 @@ public: Delete(filename); } - /* PHP module file */ - filen = NewStringEmpty(); - Printv(filen, SWIG_output_directory(), module, ".php", NIL); - phpfilename = NewString(filen); - - f_phpcode = NewFile(filen, "w", SWIG_output_files()); - if (!f_phpcode) { - FileErrorDisplay(filen); - SWIG_exit(EXIT_FAILURE); - } - - Printf(f_phpcode, "error_msg = default_error_msg;\n"); - Printf(s_header, " globals->error_code = default_error_code;\n"); - Printf(s_header, "}\n"); - - Printf(s_header, "static void SWIG_ResetError(void) {\n"); - Printf(s_header, " SWIG_ErrorMsg() = default_error_msg;\n"); - Printf(s_header, " SWIG_ErrorCode() = default_error_code;\n"); - Printf(s_header, "}\n"); - - Append(s_header, "\n"); - Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_alter_newobject) {\n", module); - Append(s_header, " zval args[2];\n"); - Append(s_header, " swig_object_wrapper *value;\n"); - Append(s_header, "\n"); - Append(s_header, " SWIG_ResetError();\n"); - Append(s_header, " if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) {\n"); - Append(s_header, " WRONG_PARAM_COUNT;\n"); - Append(s_header, " }\n"); - Append(s_header, "\n"); - Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); - Append(s_header, " value->newobject = zval_is_true(&args[1]);\n"); - Append(s_header, "\n"); - Append(s_header, " return;\n"); - Append(s_header, "}\n"); - Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_get_newobject) {\n", module); - Append(s_header, " zval args[1];\n"); - Append(s_header, " swig_object_wrapper *value;\n"); - Append(s_header, "\n"); - Append(s_header, " SWIG_ResetError();\n"); - Append(s_header, " if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {\n"); - Append(s_header, " WRONG_PARAM_COUNT;\n"); - Append(s_header, " }\n"); - Append(s_header, "\n"); - Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); - Append(s_header, " RETVAL_LONG(value->newobject);\n"); - Append(s_header, "\n"); - Append(s_header, " return;\n"); - Append(s_header, "}\n"); - Printf(s_header, "#define SWIG_name \"%s\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "extern \"C\" {\n"); Printf(s_header, "#endif\n"); - Printf(s_header, "#include \"php.h\"\n"); Printf(s_header, "#include \"php_ini.h\"\n"); Printf(s_header, "#include \"ext/standard/info.h\"\n"); Printf(s_header, "#include \"php_%s.h\"\n", module); @@ -441,6 +371,9 @@ public: Printf(s_header, "}\n"); Printf(s_header, "#endif\n\n"); + Printf(s_header, "#ifdef __cplusplus\n#define SWIG_remove(PTR) delete PTR\n"); + Printf(s_header, "#else\n#define SWIG_remove(PTR) free(PTR)\n#endif\n\n"); + if (directorsEnabled()) { // Insert director runtime Swig_insert_file("director_common.swg", s_header); @@ -479,14 +412,20 @@ public: /* holds all the per-class function entry sections */ all_cs_entry = NewString("/* class entry subsection */\n"); cs_entry = NULL; + fake_cs_entry = NULL; Printf(s_entry, "/* Every non-class user visible function must have an entry here */\n"); - Printf(s_entry, "static zend_function_entry %s_functions[] = {\n", module); + Printf(s_entry, "static zend_function_entry module_%s_functions[] = {\n", module); /* Emit all of the code */ Language::top(n); - SwigPHP_emit_resource_registrations(); + SwigPHP_emit_pointer_type_registrations(); + if (s_creation) { + Dump(s_creation, s_header); + Delete(s_creation); + s_creation = NULL; + } /* start the init section */ { @@ -495,14 +434,14 @@ public: Printv(s_init, "zend_module_entry ", module, "_module_entry = {\n", NIL); Printf(s_init, " STANDARD_MODULE_HEADER,\n"); Printf(s_init, " \"%s\",\n", module); - Printf(s_init, " %s_functions,\n", module); + Printf(s_init, " module_%s_functions,\n", module); Printf(s_init, " PHP_MINIT(%s),\n", module); if (Len(s_shutdown) > 0) { Printf(s_init, " PHP_MSHUTDOWN(%s),\n", module); } else { Printf(s_init, " NULL, /* No MSHUTDOWN code */\n"); } - if (Len(r_init) > 0 || Len(s_vinit) > 0) { + if (Len(r_init) > 0) { Printf(s_init, " PHP_RINIT(%s),\n", module); } else { Printf(s_init, " NULL, /* No RINIT code */\n"); @@ -548,8 +487,6 @@ public: */ // Printv(s_init,s_resourcetypes,NIL); - /* We need this after all classes written out by ::top */ - Printf(s_oinit, " CG(active_class_entry) = NULL;\n"); Printf(s_oinit, " /* end oinit subsection */\n"); Printf(s_init, "%s\n", s_oinit); @@ -563,27 +500,14 @@ public: Printf(s_init, "}\n\n"); // Now do REQUEST init which holds any user specified %rinit, and also vinit - if (Len(r_init) > 0 || Len(s_vinit) > 0) { + if (Len(r_init) > 0) { Printf(f_h, "PHP_RINIT_FUNCTION(%s);\n", module); Printf(s_init, "PHP_RINIT_FUNCTION(%s)\n{\n", module); - if (Len(r_init) > 0) { - Printv(s_init, - "/* rinit section */\n", - r_init, "\n", - NIL); - } - - if (Len(s_vinit) > 0) { - /* finish our init section which will have been used by class wrappers */ - Printv(s_init, - " /* vinit subsection */\n", - s_vinit, "\n" - " /* end vinit subsection */\n", - NIL); - Clear(s_vinit); - } - Delete(s_vinit); + Printv(s_init, + "/* rinit section */\n", + r_init, "\n", + NIL); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); @@ -652,10 +576,13 @@ public: Dump(f_directors, f_begin); } Printv(f_begin, s_vdecl, s_wrappers, NIL); - Printv(f_begin, all_cs_entry, "\n\n", s_arginfo, "\n\n", s_entry, - " SWIG_ZEND_NAMED_FE(swig_", module, "_alter_newobject,_wrap_swig_", module, "_alter_newobject,NULL)\n" - " SWIG_ZEND_NAMED_FE(swig_", module, "_get_newobject,_wrap_swig_", module, "_get_newobject,NULL)\n" + Printv(f_begin, s_arginfo, "\n\n", all_cs_entry, "\n\n", s_entry, " ZEND_FE_END\n};\n\n", NIL); + if (fake_cs_entry) { + Printv(f_begin, fake_cs_entry, " ZEND_FE_END\n};\n\n", NIL); + Delete(fake_cs_entry); + fake_cs_entry = NULL; + } Printv(f_begin, s_init, NIL); Delete(s_header); Delete(s_wrappers); @@ -668,78 +595,205 @@ public: Delete(f_begin); Delete(arginfo_used); - Printf(f_phpcode, "%s\n%s\n", pragma_incl, pragma_code); - if (s_fakeoowrappers) { - Printf(f_phpcode, "abstract class %s {", Len(prefix) ? prefix : module); - Printf(f_phpcode, "%s", s_fakeoowrappers); - Printf(f_phpcode, "}\n\n"); - Delete(s_fakeoowrappers); - s_fakeoowrappers = NULL; + if (Len(pragma_incl) > 0 || Len(pragma_code) > 0) { + /* PHP module file */ + String *php_filename = NewStringEmpty(); + Printv(php_filename, SWIG_output_directory(), module, ".php", NIL); + + File *f_phpcode = NewFile(php_filename, "w", SWIG_output_files()); + if (!f_phpcode) { + FileErrorDisplay(php_filename); + SWIG_exit(EXIT_FAILURE); + } + + Printf(f_phpcode, " 0) { + Printv(f_phpcode, pragma_incl, "\n", NIL); + } + + if (Len(pragma_code) > 0) { + Printv(f_phpcode, pragma_code, "\n", NIL); + } + + Delete(f_phpcode); + Delete(php_filename); } - Printf(f_phpcode, "%s\n", s_phpclasses); - Delete(f_phpcode); return SWIG_OK; } /* Just need to append function names to function table to register with PHP. */ - void create_command(String *cname, String *iname, Node *n) { + void create_command(String *cname, String *fname, Node *n, bool overload, String *modes = NULL) { // This is for the single main zend_function_entry record - Printf(f_h, "ZEND_NAMED_FUNCTION(%s);\n", iname); - + bool has_this = false; + if (cname && Cmp(Getattr(n, "storage"), "friend") != 0) { + Printf(f_h, "PHP_METHOD(%s%s,%s);\n", prefix, cname, fname); + has_this = (wrapperType != staticmemberfn) && + (wrapperType != staticmembervar) && + (Cmp(fname, "__construct") != 0); + } else { + if (overload) { + Printf(f_h, "ZEND_NAMED_FUNCTION(%s);\n", fname); + } else { + Printf(f_h, "PHP_FUNCTION(%s);\n", fname); + } + } // We want to only emit each different arginfo once, as that reduces the // size of both the generated source code and the compiled extension - // module. To do this, we name the arginfo to encode the number of - // parameters and which (if any) are passed by reference by using a - // sequence of 0s (for non-reference) and 1s (for by references). + // module. The parameters at this level are just named arg1, arg2, etc + // so we generate an arginfo name with the number of parameters and a + // bitmap value saying which (if any) are passed by reference. ParmList *l = Getattr(n, "parms"); - String * arginfo_code = NewStringEmpty(); + unsigned long bitmap = 0, bit = 1; + bool overflowed = false; + bool skip_this = has_this; for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) { - /* Ignored parameters */ - if (checkAttribute(p, "tmap:in:numinputs", "0")) { + if (skip_this) { + skip_this = false; + continue; + } + String* tmap_in_numinputs = Getattr(p, "tmap:in:numinputs"); + // tmap:in:numinputs is unset for varargs, which we don't count here. + if (!tmap_in_numinputs || Equal(tmap_in_numinputs, "0")) { + /* Ignored parameter */ continue; } - Append(arginfo_code, GetFlag(p, "tmap:in:byref") ? "1" : "0"); + if (GetFlag(p, "tmap:in:byref")) { + bitmap |= bit; + if (bit == 0) overflowed = true; + } + bit <<= 1; + } + int num_arguments = emit_num_arguments(l); + int num_required = emit_num_required(l); + if (has_this) { + --num_arguments; + --num_required; + } + String * arginfo_code; + if (overflowed) { + // We overflowed the bitmap so just generate a unique name - this only + // happens for a function with more parameters than bits in a long + // where a high numbered parameter is passed by reference, so should be + // rare in practice. + static int overflowed_counter = 0; + arginfo_code = NewStringf("z%d", ++overflowed_counter); + } else if (bitmap == 0) { + // No parameters passed by reference. + if (num_required == num_arguments) { + arginfo_code = NewStringf("%d", num_arguments); + } else { + arginfo_code = NewStringf("%d_%d", num_required, num_arguments); + } + } else { + if (num_required == num_arguments) { + arginfo_code = NewStringf("%d_r%lx", num_arguments, bitmap); + } else { + arginfo_code = NewStringf("%d_%d_r%lx", num_required, num_arguments, bitmap); + } } if (!GetFlag(arginfo_used, arginfo_code)) { - // Not had this one before, so emit it. + // Not had this one before so emit it. SetFlag(arginfo_used, arginfo_code); - Printf(s_arginfo, "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_%s, 0, 0, 0)\n", arginfo_code); - for (const char * p = Char(arginfo_code); *p; ++p) { - Printf(s_arginfo, " ZEND_ARG_PASS_INFO(%c)\n", *p); + Printf(s_arginfo, "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_%s, 0, 0, %d)\n", arginfo_code, num_required); + bool skip_this = has_this; + int param_count = 0; + for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) { + if (skip_this) { + skip_this = false; + continue; + } + String* tmap_in_numinputs = Getattr(p, "tmap:in:numinputs"); + // tmap:in:numinputs is unset for varargs, which we don't count here. + if (!tmap_in_numinputs || Equal(tmap_in_numinputs, "0")) { + /* Ignored parameter */ + continue; + } + Printf(s_arginfo, " ZEND_ARG_INFO(%d,arg%d)\n", GetFlag(p, "tmap:in:byref"), ++param_count); } Printf(s_arginfo, "ZEND_END_ARG_INFO()\n"); } String * s = cs_entry; if (!s) s = s_entry; - Printf(s, " SWIG_ZEND_NAMED_FE(%(lower)s,%s,swig_arginfo_%s)\n", cname, iname, arginfo_code); + if (cname && Cmp(Getattr(n, "storage"), "friend") != 0) { + Printf(all_cs_entry, " PHP_ME(%s%s,%s,swig_arginfo_%s,%s)\n", prefix, cname, fname, arginfo_code, modes); + } else { + if (overload) { + if (wrap_nonclass_global) { + Printf(s, " ZEND_NAMED_FE(%(lower)s,%s,swig_arginfo_%s)\n", Getattr(n, "sym:name"), fname, arginfo_code); + } + + if (wrap_nonclass_fake_class) { + (void)fake_class_name(); + Printf(fake_cs_entry, " ZEND_NAMED_ME(%(lower)s,%s,swig_arginfo_%s,ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)\n", Getattr(n, "sym:name"), fname, arginfo_code); + } + } else { + if (wrap_nonclass_global) { + Printf(s, " PHP_FE(%s,swig_arginfo_%s)\n", fname, arginfo_code); + } + + if (wrap_nonclass_fake_class) { + String *fake_class = fake_class_name(); + Printf(fake_cs_entry, " PHP_ME(%s,%s,swig_arginfo_%s,ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)\n", fake_class, fname, arginfo_code); + } + } + } Delete(arginfo_code); } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ - void dispatchFunction(Node *n) { + void dispatchFunction(Node *n, int constructor) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewStringEmpty(); - if (Swig_directorclass(n) && wrapperType == directorconstructor) { - /* We have an extra 'this' parameter. */ - SetFlag(n, "wrap:this"); - } String *dispatch = Swig_overload_dispatch(n, "%s(INTERNAL_FUNCTION_PARAM_PASSTHRU); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); - String *wname = Swig_name_wrapper(symname); + String *wname = NULL; + String *modes = NULL; + bool constructorRenameOverload = false; - create_command(symname, wname, n); - Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); + if (constructor) { + // Renamed constructor - turn into static factory method + if (Cmp(class_name, Getattr(n, "constructorHandler:sym:name")) != 0) { + constructorRenameOverload = true; + wname = Copy(Getattr(n, "constructorHandler:sym:name")); + } else { + wname = NewString("__construct"); + } + } else if (class_name) { + wname = Getattr(n, "wrapper:method:name"); + } else { + wname = Swig_name_wrapper(symname); + } + + if (constructor) { + modes = NewString("ZEND_ACC_PUBLIC | ZEND_ACC_CTOR"); + if (constructorRenameOverload) { + Append(modes, " | ZEND_ACC_STATIC"); + } + } else if (wrapperType == staticmemberfn || Cmp(Getattr(n, "storage"), "static") == 0) { + modes = NewString("ZEND_ACC_PUBLIC | ZEND_ACC_STATIC"); + } else { + modes = NewString("ZEND_ACC_PUBLIC"); + } + + create_command(class_name, wname, n, true, modes); + + if (class_name && Cmp(Getattr(n, "storage"), "friend") != 0) { + Printv(f->def, "PHP_METHOD(", prefix, class_name, ",", wname, ") {\n", NIL); + } else { + Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); + } Wrapper_add_local(f, "argc", "int argc"); @@ -754,17 +808,15 @@ public: Printv(f->code, dispatch, "\n", NIL); - Printf(f->code, "SWIG_ErrorCode() = E_ERROR;\n"); - Printf(f->code, "SWIG_ErrorMsg() = \"No matching function for overloaded '%s'\";\n", symname); - Printv(f->code, "SWIG_FAIL();\n", NIL); - + Printf(f->code, "zend_throw_exception(zend_ce_type_error, \"No matching function for overloaded '%s'\", 0);\n", symname); + Printv(f->code, "fail:\n", NIL); + Printv(f->code, "return;\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, s_wrappers); DelWrapper(f); Delete(dispatch); Delete(tmp); - Delete(wname); } /* ------------------------------------------------------------ @@ -784,7 +836,214 @@ public: return false; } + /* Helper method for PHP::functionWrapper to get class name for parameter*/ + String *get_class_name(SwigType *t) { + Node *n = classLookup(t); + String *r = NULL; + if (n) { + r = Getattr(n, "php:proxy"); // Set by classDeclaration() + if (!r) + r = Getattr(n, "sym:name"); // Not seen by classDeclaration yet, but this is the name + } + return r; + } + + /* Helper function to check if class is wrapped */ + bool is_class_wrapped(String *className) { + if (!className) + return false; + Node * n = symbolLookup(className); + return n && Getattr(n, "classtype") != NULL; + } + + /* Is special return type */ + bool is_param_type_pointer(SwigType *t) { + + if (SwigType_ispointer(t) || + SwigType_ismemberpointer(t) || + SwigType_isreference(t) || + SwigType_isarray(t)) + return true; + + return false; + } + + void generate_magic_property_methods(Node *class_node, String *base_class) { + if (Equal(base_class, "Exception") || !is_class_wrapped(base_class)) { + base_class = NULL; + } + + // Ensure arginfo_1 and arginfo_2 exist. + if (!GetFlag(arginfo_used, "1")) { + SetFlag(arginfo_used, "1"); + Append(s_arginfo, + "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_1, 0, 0, 1)\n" + " ZEND_ARG_INFO(0,arg1)\n" + "ZEND_END_ARG_INFO()\n"); + } + if (!GetFlag(arginfo_used, "2")) { + SetFlag(arginfo_used, "2"); + Append(s_arginfo, + "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_2, 0, 0, 2)\n" + " ZEND_ARG_INFO(0,arg1)\n" + " ZEND_ARG_INFO(0,arg2)\n" + "ZEND_END_ARG_INFO()\n"); + } + + Wrapper *f = NewWrapper(); + + Printf(f_h, "PHP_METHOD(%s%s,__set);\n", prefix, class_name); + Printf(all_cs_entry, " PHP_ME(%s%s,__set,swig_arginfo_2,ZEND_ACC_PUBLIC)\n", prefix, class_name); + Printf(f->code, "PHP_METHOD(%s%s,__set) {\n", prefix, class_name); + + Printf(f->code, " swig_object_wrapper *arg = SWIG_Z_FETCH_OBJ_P(ZEND_THIS);\n"); + Printf(f->code, " zval args[2];\n zval tempZval;\n zend_string *arg2 = 0;\n\n"); + Printf(f->code, " if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) {\n"); + Printf(f->code, "\tWRONG_PARAM_COUNT;\n}\n\n"); + Printf(f->code, " if (!arg) {\n"); + Printf(f->code, " zend_throw_exception(zend_ce_type_error, \"this pointer is NULL\", 0);\n"); + Printf(f->code, " return;\n"); + Printf(f->code, " }\n"); + Printf(f->code, " arg2 = Z_STR(args[0]);\n\n"); + + Printf(f->code, "if (!arg2) {\n RETVAL_NULL();\n}\n"); + if (magic_set) { + Append(f->code, magic_set); + } + Printf(f->code, "\nelse if (strcmp(ZSTR_VAL(arg2),\"thisown\") == 0) {\n"); + Printf(f->code, "arg->newobject = zval_get_long(&args[1]);\n"); + if (Swig_directorclass(class_node)) { + Printv(f->code, "if (arg->newobject == 0) {\n", + " Swig::Director *director = SWIG_DIRECTOR_CAST((", Getattr(class_node, "classtype"), "*)(arg->ptr));\n", + " if (director) director->swig_disown();\n", + "}\n", NIL); + } + Printf(f->code, "} else {\n"); + if (base_class) { + Printf(f->code, "PHP_MN(%s%s___set)(INTERNAL_FUNCTION_PARAM_PASSTHRU);\n}\n", prefix, base_class); + } else { + Printf(f->code, "add_property_zval_ex(ZEND_THIS, ZSTR_VAL(arg2), ZSTR_LEN(arg2), &args[1]);\n}\n"); + } + + Printf(f->code, "fail:\n"); + Printf(f->code, "return;\n"); + Printf(f->code, "}\n\n\n"); + + + Printf(f_h, "PHP_METHOD(%s%s,__get);\n", prefix, class_name); + Printf(all_cs_entry, " PHP_ME(%s%s,__get,swig_arginfo_1,ZEND_ACC_PUBLIC)\n", prefix, class_name); + Printf(f->code, "PHP_METHOD(%s%s,__get) {\n",prefix, class_name); + + Printf(f->code, " swig_object_wrapper *arg = SWIG_Z_FETCH_OBJ_P(ZEND_THIS);\n", class_name); + Printf(f->code, " zval args[1];\n zval tempZval;\n zend_string *arg2 = 0;\n\n"); + Printf(f->code, " if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {\n"); + Printf(f->code, "\tWRONG_PARAM_COUNT;\n}\n\n"); + Printf(f->code, " if (!arg) {\n"); + Printf(f->code, " zend_throw_exception(zend_ce_type_error, \"this pointer is NULL\", 0);\n"); + Printf(f->code, " return;\n"); + Printf(f->code, " }\n"); + Printf(f->code, " arg2 = Z_STR(args[0]);\n\n"); + + Printf(f->code, "if (!arg2) {\n RETVAL_NULL();\n}\n"); + if (magic_get) { + Append(f->code, magic_get); + } + Printf(f->code, "\nelse if (strcmp(ZSTR_VAL(arg2),\"thisown\") == 0) {\n"); + Printf(f->code, "if(arg->newobject) {\nRETVAL_LONG(1);\n}\nelse {\nRETVAL_LONG(0);\n}\n}\n\n"); + Printf(f->code, "else {\n"); + if (base_class) { + Printf(f->code, "PHP_MN(%s%s___get)(INTERNAL_FUNCTION_PARAM_PASSTHRU);\n}\n", prefix, base_class); + } else { + // __get is only called if the property isn't set on the zend_object. + Printf(f->code, "RETVAL_NULL();\n}\n"); + } + + Printf(f->code, "fail:\n"); + Printf(f->code, "return;\n"); + Printf(f->code, "}\n\n\n"); + + + Printf(f_h, "PHP_METHOD(%s%s,__isset);\n", prefix, class_name); + Printf(all_cs_entry, " PHP_ME(%s%s,__isset,swig_arginfo_1,ZEND_ACC_PUBLIC)\n", prefix, class_name); + Printf(f->code, "PHP_METHOD(%s%s,__isset) {\n",prefix, class_name); + + Printf(f->code, " swig_object_wrapper *arg = SWIG_Z_FETCH_OBJ_P(ZEND_THIS);\n", class_name); + Printf(f->code, " zval args[1];\n zend_string *arg2 = 0;\n\n"); + Printf(f->code, " if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {\n"); + Printf(f->code, "\tWRONG_PARAM_COUNT;\n}\n\n"); + Printf(f->code, " if(!arg) {\n"); + Printf(f->code, " zend_throw_exception(zend_ce_type_error, \"this pointer is NULL\", 0);\n"); + Printf(f->code, " }\n"); + Printf(f->code, " arg2 = Z_STR(args[0]);\n\n"); + + Printf(f->code, "if (!arg2) {\n RETVAL_FALSE;\n}\n"); + Printf(f->code, "\nelse if (strcmp(ZSTR_VAL(arg2),\"thisown\") == 0) {\n"); + Printf(f->code, "RETVAL_TRUE;\n}\n\n"); + if (magic_isset) { + Append(f->code, magic_isset); + } + Printf(f->code, "else {\n"); + if (base_class) { + Printf(f->code, "PHP_MN(%s%s___isset)(INTERNAL_FUNCTION_PARAM_PASSTHRU);\n}\n", prefix, base_class); + } else { + // __isset is only called if the property isn't set on the zend_object. + Printf(f->code, "RETVAL_FALSE;\n}\n"); + } + + Printf(f->code, "fail:\n"); + Printf(f->code, "return;\n"); + Printf(f->code, "}\n\n\n"); + + Wrapper_print(f, s_wrappers); + DelWrapper(f); + f = NULL; + + Delete(magic_set); + Delete(magic_get); + Delete(magic_isset); + magic_set = NULL; + magic_get = NULL; + magic_isset = NULL; + } + + String *getAccessMode(String *access) { + if (Cmp(access, "protected") == 0) { + return NewString("ZEND_ACC_PROTECTED"); + } else if (Cmp(access, "private") == 0) { + return NewString("ZEND_ACC_PRIVATE"); + } + return NewString("ZEND_ACC_PUBLIC"); + } + + bool is_setter_method(Node *n) { + + const char *p = GetChar(n, "sym:name"); + if (strlen(p) > 4) { + p += strlen(p) - 4; + if (strcmp(p, "_set") == 0) { + return true; + } + } + return false; + } + + bool is_getter_method(Node *n) { + + const char *p = GetChar(n, "sym:name"); + if (strlen(p) > 4) { + p += strlen(p) - 4; + if (strcmp(p, "_get") == 0) { + return true; + } + } + return false; + } + virtual int functionWrapper(Node *n) { + if (wrapperType == directordisown) { + // Handled via __set magic method - no explicit wrapper method wanted. + return SWIG_OK; + } String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); @@ -799,17 +1058,25 @@ public: String *tm; Wrapper *f; - String *wname; + String *wname = NewStringEmpty(); + String *overloadwname = NULL; int overloaded = 0; String *overname = 0; + String *modes = NULL; + bool static_setter = false; + bool static_getter = false; - if (Cmp(nodeType, "destructor") == 0) { - // We just generate the Zend List Destructor and let Zend manage the - // reference counting. There's no explicit destructor, but the user can - // just do `$obj = null;' to remove a reference to an object. - return CreateZendListDestructor(n); + modes = getAccessMode(Getattr(n, "access")); + + if (constructor) { + Append(modes, " | ZEND_ACC_CTOR"); + } + if (wrapperType == staticmemberfn || Cmp(Getattr(n, "storage"), "static") == 0) { + Append(modes, " | ZEND_ACC_STATIC"); } - // Test for overloading; + if (GetFlag(n, "abstract") && Swig_directorclass(Swig_methodclass(n)) && !is_member_director(n)) + Append(modes, " | ZEND_ACC_ABSTRACT"); + if (Getattr(n, "sym:overloaded")) { overloaded = 1; overname = Getattr(n, "sym:overname"); @@ -818,25 +1085,102 @@ public: return SWIG_ERROR; } - wname = Swig_name_wrapper(iname); if (overname) { - Printf(wname, "%s", overname); + // Test for overloading + overloadwname = NewString(Swig_name_wrapper(iname)); + Printf(overloadwname, "%s", overname); + } + + if (constructor) { + wname = NewString("__construct"); + } else if (wrapperType == membervar) { + wname = Copy(Getattr(n, "membervariableHandler:sym:name")); + if (is_setter_method(n)) { + Append(wname, "_set"); + } else if (is_getter_method(n)) { + Append(wname, "_get"); + } + } else if (wrapperType == memberfn) { + wname = Getattr(n, "memberfunctionHandler:sym:name"); + } else if (wrapperType == staticmembervar) { + // Shape::nshapes -> nshapes + wname = Getattr(n, "staticmembervariableHandler:sym:name"); + + /* We get called twice for getter and setter methods. But to maintain + compatibility, Shape::nshapes() is being used for both setter and + getter methods. So using static_setter and static_getter variables + to generate half of the code each time. + */ + static_setter = is_setter_method(n); + + if (is_getter_method(n)) { + // This is to overcome types that can't be set and hence no setter. + if (Cmp(Getattr(n, "feature:immutable"), "1") != 0) + static_getter = true; + } + } else if (wrapperType == staticmemberfn) { + wname = Getattr(n, "staticmemberfunctionHandler:sym:name"); + } else { + if (class_name) { + if (Cmp(Getattr(n, "storage"), "friend") == 0 && Cmp(Getattr(n, "view"), "globalfunctionHandler") == 0) { + wname = iname; + } else { + wname = Getattr(n, "destructorHandler:sym:name"); + } + } else { + wname = iname; + } + } + + if (Cmp(nodeType, "destructor") == 0) { + // We don't explicitly wrap the destructor for PHP - Zend manages the + // reference counting, and the user can just do `$obj = null;' or similar + // to remove a reference to an object. + return SWIG_OK; } f = NewWrapper(); + if (static_getter) { + Printf(f->def, "{\n"); + } + String *outarg = NewStringEmpty(); String *cleanup = NewStringEmpty(); - Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); + if (!overloaded) { + if (!static_getter) { + if (class_name && Cmp(Getattr(n, "storage"), "friend") != 0) { + Printv(f->def, "PHP_METHOD(", prefix, class_name, ",", wname, ") {\n", NIL); + } else { + if (wrap_nonclass_global) { + Printv(f->def, "PHP_METHOD(", fake_class_name(), ",", wname, ") {\n", + " PHP_FN(", wname, ")(INTERNAL_FUNCTION_PARAM_PASSTHRU);\n", + "}\n\n", NIL); + } + + if (wrap_nonclass_fake_class) { + Printv(f->def, "PHP_FUNCTION(", wname, ") {\n", NIL); + } + } + } + } else { + Printv(f->def, "ZEND_NAMED_FUNCTION(", overloadwname, ") {\n", NIL); + } emit_parameter_variables(l, f); /* Attach standard typemaps */ emit_attach_parmmaps(l, f); // Not issued for overloaded functions. - if (!overloaded) { - create_command(iname, wname, n); + if (!overloaded && !static_getter) { + create_command(class_name, wname, n, false, modes); + } + + if (wrapperType == memberfn || wrapperType == membervar) { + // Assign "this" to arg1 and remove first entry from ParmList l. + Printf(f->code, "arg1 = (%s)SWIG_Z_FETCH_OBJ_P(ZEND_THIS)->ptr;\n", SwigType_lstr(Getattr(l, "type"), "")); + l = nextSibling(l); } // wrap:parms is used by overload resolution. @@ -846,18 +1190,16 @@ public: int num_required = emit_num_required(l); numopt = num_arguments - num_required; - if (wrapperType == directorconstructor) - num_arguments++; - if (num_arguments > 0) { String *args = NewStringEmpty(); - if (wrapperType == directorconstructor) - Wrapper_add_local(f, "arg0", "zval * arg0"); Printf(args, "zval args[%d]", num_arguments); Wrapper_add_local(f, "args", args); Delete(args); args = NULL; } + if (wrapperType == directorconstructor) { + Wrapper_add_local(f, "arg0", "zval *arg0 = ZEND_THIS"); + } // This generated code may be called: // 1) as an object method, or @@ -867,14 +1209,18 @@ public: // NOTE: possible we ignore this_ptr as a param for native constructor - Printf(f->code, "SWIG_ResetError();\n"); - if (numopt > 0) { // membervariable wrappers do not have optional args Wrapper_add_local(f, "arg_count", "int arg_count"); Printf(f->code, "arg_count = ZEND_NUM_ARGS();\n"); Printf(f->code, "if(arg_count<%d || arg_count>%d ||\n", num_required, num_arguments); Printf(f->code, " zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)\n"); Printf(f->code, "\tWRONG_PARAM_COUNT;\n\n"); + } else if (static_setter || static_getter) { + if (num_arguments == 0) { + Printf(f->code, "if(ZEND_NUM_ARGS() == 0) {\n"); + } else { + Printf(f->code, "if(ZEND_NUM_ARGS() == %d && zend_get_parameters_array_ex(%d, args) == SUCCESS) {\n", num_arguments, num_arguments); + } } else { if (num_arguments == 0) { Printf(f->code, "if(ZEND_NUM_ARGS() != 0) {\n"); @@ -883,8 +1229,6 @@ public: } Printf(f->code, "WRONG_PARAM_COUNT;\n}\n\n"); } - if (wrapperType == directorconstructor) - Printf(f->code, "arg0 = &args[0];\n \n"); /* Now convert from PHP to C variables */ // At this point, argcount if used is the number of deliberately passed args @@ -896,10 +1240,7 @@ public: // _this and not the first argument. // This may mean looking at Language::memberfunctionHandler - int limit = num_arguments; - if (wrapperType == directorconstructor) - limit--; - for (i = 0, p = l; i < limit; i++) { + for (i = 0, p = l; i < num_arguments; i++) { String *source; /* Skip ignored arguments */ @@ -910,27 +1251,30 @@ public: SwigType *pt = Getattr(p, "type"); - if (wrapperType == directorconstructor) { - source = NewStringf("args[%d]", i+1); - } else { - source = NewStringf("args[%d]", i); - } - - String *ln = Getattr(p, "lname"); + source = NewStringf("args[%d]", i); /* Check if optional */ if (i >= num_required) { Printf(f->code, "\tif(arg_count > %d) {\n", i); } + String *paramType_class = NULL; + bool paramType_valid = is_class(pt); + + if (paramType_valid) { + paramType_class = get_class_name(pt); + Chop(paramType_class); + } + if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$source", &source); - Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); if (i == 0 && Getattr(p, "self")) { - Printf(f->code, "\tif(!arg1) SWIG_PHP_Error(E_ERROR, \"this pointer is NULL\");\n"); + Printf(f->code, "\tif(!arg1) {\n"); + Printf(f->code, "\t zend_throw_exception(zend_ce_type_error, \"this pointer is NULL\", 0);\n"); + Printf(f->code, "\t return;\n"); + Printf(f->code, "\t}\n"); } p = Getattr(p, "tmap:in:next"); if (i >= num_required) { @@ -948,8 +1292,8 @@ public: if (is_member_director(n)) { Wrapper_add_local(f, "upcall", "bool upcall = false"); - Printf(f->code, "upcall = !Swig::Director::swig_is_overridden_method(\"%s%s\", \"%s\");\n", - prefix, Swig_class_name(Swig_methodclass(n)), name); + Printf(f->code, "upcall = !Swig::Director::swig_is_overridden_method(\"%s%s\", ZEND_THIS);\n", + prefix, Swig_class_name(Swig_methodclass(n))); } Swig_director_emit_dynamic_cast(n, f); @@ -957,7 +1301,6 @@ public: /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -968,7 +1311,6 @@ public: /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { @@ -977,13 +1319,8 @@ public: } /* Insert argument output code */ - bool hasargout = false; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout")) && Len(tm)) { - hasargout = true; - Replaceall(tm, "$source", Getattr(p, "lname")); - // Replaceall(tm,"$input",Getattr(p,"lname")); - Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -994,16 +1331,21 @@ public: } } - Setattr(n, "wrap:name", wname); + if (!overloaded) { + Setattr(n, "wrap:name", wname); + } else { + Setattr(n, "wrap:name", overloadwname); + } + Setattr(n, "wrapper:method:name", wname); + + bool php_constructor = (constructor && Cmp(class_name, Getattr(n, "constructorHandler:sym:name")) == 0); /* emit function call */ String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$input", Swig_cresult_name()); - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "return_value"); - Replaceall(tm, "$result", "return_value"); + Replaceall(tm, "$result", php_constructor ? "ZEND_THIS" : "return_value"); Replaceall(tm, "$owner", newobject ? "1" : "0"); Printf(f->code, "%s\n", tm); } else { @@ -1033,15 +1375,20 @@ public: Delete(tm); } - Printf(f->code, "thrown:\n"); - Printf(f->code, "return;\n"); + if (static_getter) { + Printf(f->code, "}\n"); + } - /* Error handling code */ - Printf(f->code, "fail:\n"); - Printv(f->code, cleanup, NIL); - Append(f->code, "SWIG_FAIL();\n"); + if (static_setter || static_getter) { + Printf(f->code, "}\n"); + } - Printf(f->code, "}\n"); + if (!static_setter) { + Printf(f->code, "fail:\n"); + Printv(f->code, cleanup, NIL); + Printf(f->code, "return;\n"); + Printf(f->code, "}\n"); + } Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); @@ -1049,828 +1396,10 @@ public: Wrapper_print(f, s_wrappers); DelWrapper(f); f = NULL; - - if (overloaded && !Getattr(n, "sym:nextSibling")) { - dispatchFunction(n); - } - - Delete(wname); wname = NULL; - if (!shadow) { - return SWIG_OK; - } - - // Handle getters and setters. - if (wrapperType == membervar) { - const char *p = Char(iname); - if (strlen(p) > 4) { - p += strlen(p) - 4; - String *varname = Getattr(n, "membervariableHandler:sym:name"); - if (strcmp(p, "_get") == 0) { - Setattr(shadow_get_vars, varname, Getattr(n, "type")); - } else if (strcmp(p, "_set") == 0) { - Setattr(shadow_set_vars, varname, iname); - } - } - return SWIG_OK; - } - - // Only look at non-overloaded methods and the last entry in each overload - // chain (we check the last so that wrap:parms and wrap:name have been set - // for them all). - if (overloaded && Getattr(n, "sym:nextSibling") != 0) - return SWIG_OK; - - if (!s_oowrappers) - s_oowrappers = NewStringEmpty(); - - if (newobject || wrapperType == memberfn || wrapperType == staticmemberfn || wrapperType == standard || wrapperType == staticmembervar) { - bool handle_as_overload = false; - String **arg_names; - String **arg_values; - unsigned char * byref; - // Method or static method or plain function. - const char *methodname = 0; - String *output = s_oowrappers; - if (constructor) { - class_has_ctor = true; - // Skip the Foo:: prefix. - char *ptr = strrchr(GetChar(current_class, "sym:name"), ':'); - if (ptr) { - ptr++; - } else { - ptr = GetChar(current_class, "sym:name"); - } - if (strcmp(ptr, GetChar(n, "constructorHandler:sym:name")) == 0) { - methodname = "__construct"; - } else { - // The class has multiple constructors and this one is - // renamed, so this will be a static factory function - methodname = GetChar(n, "constructorHandler:sym:name"); - } - } else if (wrapperType == memberfn) { - methodname = Char(Getattr(n, "memberfunctionHandler:sym:name")); - } else if (wrapperType == staticmemberfn) { - methodname = Char(Getattr(n, "staticmemberfunctionHandler:sym:name")); - } else if (wrapperType == staticmembervar) { - // Static member variable, wrapped as a function due to PHP limitations. - methodname = Char(Getattr(n, "staticmembervariableHandler:sym:name")); - } else { // wrapperType == standard - methodname = Char(iname); - if (!s_fakeoowrappers) - s_fakeoowrappers = NewStringEmpty(); - output = s_fakeoowrappers; - } - - bool really_overloaded = overloaded ? true : false; - int min_num_of_arguments = emit_num_required(l); - int max_num_of_arguments = emit_num_arguments(l); - - Hash *ret_types = NewHash(); - Setattr(ret_types, d, d); - - bool non_void_return = (Cmp(d, "void") != 0); - - if (overloaded) { - // Look at all the overloaded versions of this method in turn to - // decide if it's really an overloaded method, or just one where some - // parameters have default values. - Node *o = Getattr(n, "sym:overloaded"); - while (o) { - if (o == n) { - o = Getattr(o, "sym:nextSibling"); - continue; - } - - SwigType *d2 = Getattr(o, "type"); - if (!d2) { - assert(constructor); - } else if (!Getattr(ret_types, d2)) { - Setattr(ret_types, d2, d2); - non_void_return = non_void_return || (Cmp(d2, "void") != 0); - } - - ParmList *l2 = Getattr(o, "wrap:parms"); - int num_arguments = emit_num_arguments(l2); - int num_required = emit_num_required(l2); - if (num_required < min_num_of_arguments) - min_num_of_arguments = num_required; - - if (num_arguments > max_num_of_arguments) { - max_num_of_arguments = num_arguments; - } - o = Getattr(o, "sym:nextSibling"); - } - - o = Getattr(n, "sym:overloaded"); - while (o) { - if (o == n) { - o = Getattr(o, "sym:nextSibling"); - continue; - } - - ParmList *l2 = Getattr(o, "wrap:parms"); - Parm *p = l, *p2 = l2; - if (wrapperType == memberfn) { - p = nextSibling(p); - p2 = nextSibling(p2); - } - while (p && p2) { - if (Cmp(Getattr(p, "type"), Getattr(p2, "type")) != 0) - break; - if (Cmp(Getattr(p, "name"), Getattr(p2, "name")) != 0) - break; - String *value = Getattr(p, "value"); - String *value2 = Getattr(p2, "value"); - if (value && !value2) - break; - if (!value && value2) - break; - if (value) { - if (Cmp(value, value2) != 0) - break; - } - p = nextSibling(p); - p2 = nextSibling(p2); - } - if (p && p2) - break; - // One parameter list is a prefix of the other, so check that all - // remaining parameters of the longer list are optional. - if (p2) - p = p2; - while (p && Getattr(p, "value")) - p = nextSibling(p); - if (p) - break; - o = Getattr(o, "sym:nextSibling"); - } - if (!o) { - // This "overloaded method" is really just one with default args. - really_overloaded = false; - } - } - - if (wrapperType == memberfn) { - // Allow for the "this" pointer. - --min_num_of_arguments; - --max_num_of_arguments; - } - - arg_names = (String **) malloc(max_num_of_arguments * sizeof(String *)); - if (!arg_names) { - /* FIXME: How should this be handled? The rest of SWIG just seems - * to not bother checking for malloc failing! */ - fprintf(stderr, "Malloc failed!\n"); - exit(1); - } - for (i = 0; i < max_num_of_arguments; ++i) { - arg_names[i] = NULL; - } - - arg_values = (String **) malloc(max_num_of_arguments * sizeof(String *)); - byref = (unsigned char *) malloc(max_num_of_arguments); - if (!arg_values || !byref) { - /* FIXME: How should this be handled? The rest of SWIG just seems - * to not bother checking for malloc failing! */ - fprintf(stderr, "Malloc failed!\n"); - exit(1); - } - for (i = 0; i < max_num_of_arguments; ++i) { - arg_values[i] = NULL; - byref[i] = false; - } - - Node *o; - if (overloaded) { - o = Getattr(n, "sym:overloaded"); - } else { - o = n; - } - while (o) { - int argno = 0; - Parm *p = Getattr(o, "wrap:parms"); - if (wrapperType == memberfn) - p = nextSibling(p); - while (p) { - if (GetInt(p, "tmap:in:numinputs") == 0) { - p = nextSibling(p); - continue; - } - assert(0 <= argno && argno < max_num_of_arguments); - byref[argno] = GetFlag(p, "tmap:in:byref"); - String *&pname = arg_names[argno]; - const char *pname_cstr = GetChar(p, "name"); - // Just get rid of the C++ namespace part for now. - const char *ptr = NULL; - if (pname_cstr && (ptr = strrchr(pname_cstr, ':'))) { - pname_cstr = ptr + 1; - } - if (!pname_cstr) { - // Unnamed parameter, e.g. int foo(int); - } else if (!pname) { - pname = NewString(pname_cstr); - } else { - size_t len = strlen(pname_cstr); - size_t spc = 0; - size_t len_pname = strlen(Char(pname)); - while (spc + len <= len_pname) { - if (strncmp(pname_cstr, Char(pname) + spc, len) == 0) { - char ch = ((char *) Char(pname))[spc + len]; - if (ch == '\0' || ch == ' ') { - // Already have this pname_cstr. - pname_cstr = NULL; - break; - } - } - char *p = strchr(Char(pname) + spc, ' '); - if (!p) - break; - spc = (p + 4) - Char(pname); - } - if (pname_cstr) { - Printf(pname, " or_%s", pname_cstr); - } - } - String *value = NewString(Getattr(p, "value")); - if (Len(value)) { - /* Check that value is a valid constant in PHP (and adjust it if - * necessary, or replace it with "?" if it's just not valid). */ - SwigType *type = Getattr(p, "type"); - switch (SwigType_type(type)) { - case T_BOOL: { - if (Strcmp(value, "true") == 0 || Strcmp(value, "false") == 0) - break; - char *p; - errno = 0; - long n = strtol(Char(value), &p, 0); - Clear(value); - if (errno || *p) { - Append(value, "?"); - } else if (n) { - Append(value, "true"); - } else { - Append(value, "false"); - } - break; - } - case T_CHAR: - case T_SCHAR: - case T_SHORT: - case T_INT: - case T_LONG: - case T_LONGLONG: { - char *p; - errno = 0; - long n = strtol(Char(value), &p, 0); - (void) n; - if (errno || *p) { - Clear(value); - Append(value, "?"); - } - break; - } - case T_UCHAR: - case T_USHORT: - case T_UINT: - case T_ULONG: - case T_ULONGLONG: { - char *p; - errno = 0; - unsigned int n = strtoul(Char(value), &p, 0); - (void) n; - if (errno || *p) { - Clear(value); - Append(value, "?"); - } - break; - } - case T_FLOAT: - case T_DOUBLE: - case T_LONGDOUBLE: { - char *p; - errno = 0; - /* FIXME: strtod is locale dependent... */ - double val = strtod(Char(value), &p); - if (errno || *p) { - Clear(value); - Append(value, "?"); - } else if (strchr(Char(value), '.') == 0) { - // Ensure value is a double constant, not an integer one. - Append(value, ".0"); - double val2 = strtod(Char(value), &p); - if (errno || *p || val != val2) { - Clear(value); - Append(value, "?"); - } - } - break; - } - case T_STRING: - if (Len(value) < 2) { - // How can a string (including "" be less than 2 characters?) - Clear(value); - Append(value, "?"); - } else { - const char *v = Char(value); - if (v[0] != '"' || v[Len(value) - 1] != '"') { - Clear(value); - Append(value, "?"); - } - // Strings containing "$" require special handling, but we do - // that later. - } - break; - case T_VOID: - assert(false); - break; - case T_POINTER: { - const char *v = Char(value); - if (v[0] == '(') { - // Handle "(void*)0", "(TYPE*)0", "(char*)NULL", etc. - v += strcspn(v + 1, "*()") + 1; - if (*v == '*') { - do { - v++; - v += strspn(v, " \t"); - } while (*v == '*'); - if (*v++ == ')') { - v += strspn(v, " \t"); - String * old = value; - value = NewString(v); - Delete(old); - } - } - } - if (Strcmp(value, "NULL") == 0 || - Strcmp(value, "nullptr") == 0 || - Strcmp(value, "0") == 0 || - Strcmp(value, "0L") == 0) { - Clear(value); - Append(value, "null"); - } else { - Clear(value); - Append(value, "?"); - } - break; - } - default: - /* Safe default */ - Clear(value); - Append(value, "?"); - break; - } - - if (!arg_values[argno]) { - arg_values[argno] = value; - value = NULL; - } else if (Cmp(arg_values[argno], value) != 0) { - // If a parameter has two different default values in - // different overloaded forms of the function, we can't - // set its default in PHP. Flag this by setting its - // default to `?'. - Delete(arg_values[argno]); - arg_values[argno] = NewString("?"); - } - } else if (arg_values[argno]) { - // This argument already has a default value in another overloaded - // form, but doesn't in this form. So don't try to do anything - // clever, just let the C wrappers resolve the overload and set the - // default values. - // - // This handling is safe, but I'm wondering if it may be overly - // conservative (FIXME) in some cases. It seems it's only bad when - // there's an overloaded form with the appropriate number of - // parameters which doesn't want the default value, but I need to - // think about this more. - Delete(arg_values[argno]); - arg_values[argno] = NewString("?"); - } - Delete(value); - p = nextSibling(p); - ++argno; - } - if (!really_overloaded) - break; - o = Getattr(o, "sym:nextSibling"); - } - - /* Clean up any parameters which haven't yet got names, or whose - * names clash. */ - Hash *seen = NewHash(); - /* We need $this to refer to the current class, so can't allow it - * to be used as a parameter. */ - Setattr(seen, "this", seen); - - for (int argno = 0; argno < max_num_of_arguments; ++argno) { - String *&pname = arg_names[argno]; - if (pname) { - Replaceall(pname, " ", "_"); - } else { - /* We get here if the SWIG .i file has "int foo(int);" */ - pname = NewStringEmpty(); - Printf(pname, "arg%d", argno + 1); - } - // Check if we've already used this parameter name. - while (Getattr(seen, pname)) { - // Append "_" to clashing names until they stop clashing... - Printf(pname, "_"); - } - Setattr(seen, Char(pname), seen); - - if (arg_values[argno] && Cmp(arg_values[argno], "?") == 0) { - handle_as_overload = true; - } - } - Delete(seen); - seen = NULL; - - String *invoke = NewStringEmpty(); - String *prepare = NewStringEmpty(); - String *args = NewStringEmpty(); - - if (!handle_as_overload && !(really_overloaded && max_num_of_arguments > min_num_of_arguments)) { - Printf(invoke, "%s(", iname); - if (wrapperType == memberfn) { - Printf(invoke, "$this->%s", SWIG_PTR); - } - for (int i = 0; i < max_num_of_arguments; ++i) { - if (i) - Printf(args, ","); - if (i || wrapperType == memberfn) - Printf(invoke, ","); - if (byref[i]) Printf(args, "&"); - String *value = arg_values[i]; - if (value) { - const char *v = Char(value); - if (v[0] == '"') { - /* In a PHP double quoted string, $ needs to be escaped as \$. */ - Replaceall(value, "$", "\\$"); - } - Printf(args, "$%s=%s", arg_names[i], value); - } else if (constructor && strcmp(methodname, "__construct") == 0 && i >= 1 && i < min_num_of_arguments) { - // We need to be able to call __construct($resource). - Printf(args, "$%s=null", arg_names[i]); - } else { - Printf(args, "$%s", arg_names[i]); - } - Printf(invoke, "$%s", arg_names[i]); - } - Printf(invoke, ")"); - } else { - int i; - for (i = 0; i < min_num_of_arguments; ++i) { - if (i) - Printf(args, ","); - Printf(args, "$%s", arg_names[i]); - } - String *invoke_args = NewStringEmpty(); - if (wrapperType == memberfn) { - Printf(invoke_args, "$this->%s", SWIG_PTR); - if (min_num_of_arguments > 0) - Printf(invoke_args, ","); - } - Printf(invoke_args, "%s", args); - if (constructor && min_num_of_arguments > 1) { - // We need to be able to call __construct($resource). - Clear(args); - Printf(args, "$%s", arg_names[0]); - for (i = 1; i < min_num_of_arguments; ++i) { - Printf(args, ","); - Printf(args, "$%s=null", arg_names[i]); - } - } - bool had_a_case = false; - int last_handled_i = i - 1; - for (; i < max_num_of_arguments; ++i) { - if (i) - Printf(args, ","); - const char *value = Char(arg_values[i]); - // FIXME: (really_overloaded && handle_as_overload) is perhaps a - // little conservative, but it doesn't hit any cases that it - // shouldn't for Xapian at least (and we need it to handle - // "Enquire::get_mset()" correctly). - bool non_php_default = ((really_overloaded && handle_as_overload) || - !value || strcmp(value, "?") == 0); - if (non_php_default) - value = "null"; - Printf(args, "$%s=%s", arg_names[i], value); - if (non_php_default) { - if (!had_a_case) { - Printf(prepare, "\t\tswitch (func_num_args()) {\n"); - had_a_case = true; - } - Printf(prepare, "\t\t"); - while (last_handled_i < i) { - Printf(prepare, "case %d: ", ++last_handled_i); - } - if (non_void_return) { - if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) { - Append(prepare, "$r="); - } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) { - Append(prepare, "$r="); - } else { - Printf(prepare, "$this->%s=", SWIG_PTR); - } - } - if (!directorsEnabled() || !Swig_directorclass(n) || !constructor) { - Printf(prepare, "%s(%s); break;\n", iname, invoke_args); - } else if (!i) { - Printf(prepare, "%s($_this%s); break;\n", iname, invoke_args); - } else { - Printf(prepare, "%s($_this, %s); break;\n", iname, invoke_args); - } - } - if (i || wrapperType == memberfn) - Printf(invoke_args, ","); - Printf(invoke_args, "$%s", arg_names[i]); - } - Printf(prepare, "\t\t"); - if (had_a_case) - Printf(prepare, "default: "); - if (non_void_return) { - if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) { - Append(prepare, "$r="); - } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) { - Append(prepare, "$r="); - } else { - Printf(prepare, "$this->%s=", SWIG_PTR); - } - } - - if (!directorsEnabled() || !Swig_directorclass(n) || !constructor) { - Printf(prepare, "%s(%s);\n", iname, invoke_args); - } else { - Printf(prepare, "%s($_this, %s);\n", iname, invoke_args); - } - if (had_a_case) - Printf(prepare, "\t\t}\n"); - Delete(invoke_args); - Printf(invoke, "$r"); - } - - Printf(output, "\n"); - // If it's a member function or a class constructor... - if (wrapperType == memberfn || (constructor && current_class)) { - String *acc = NewString(Getattr(n, "access")); - // If a base has the same method with public access, then PHP - // requires to have it here as public as well - Node *bases = Getattr(Swig_methodclass(n), "bases"); - if (bases && Strcmp(acc, "public") != 0) { - String *warnmsg = 0; - int haspublicbase = 0; - Iterator i = First(bases); - while (i.item) { - Node *j = firstChild(i.item); - while (j) { - String *jname = Getattr(j, "name"); - if (!jname || Strcmp(jname, Getattr(n, "name")) != 0) { - j = nextSibling(j); - continue; - } - if (Strcmp(nodeType(j), "cdecl") == 0) { - if (!Getattr(j, "access") || checkAttribute(j, "access", "public")) { - haspublicbase = 1; - } - } else if (Strcmp(nodeType(j), "using") == 0 && firstChild(j) && Strcmp(nodeType(firstChild(j)), "cdecl") == 0) { - if (!Getattr(firstChild(j), "access") || checkAttribute(firstChild(j), "access", "public")) { - haspublicbase = 1; - } - } - if (haspublicbase) { - warnmsg = NewStringf("Modifying the access of '%s::%s' to public, as the base '%s' has it as public as well.\n", Getattr(current_class, "classtype"), Getattr(n, "name"), Getattr(i.item, "classtype")); - break; - } - j = nextSibling(j); - } - i = Next(i); - if (haspublicbase) { - break; - } - } - if (Getattr(n, "access") && haspublicbase) { - Delete(acc); - acc = NewStringEmpty(); // implicitly public - Swig_warning(WARN_PHP_PUBLIC_BASE, input_file, line_number, Char(warnmsg)); - Delete(warnmsg); - } - } - - if (Cmp(acc, "public") == 0) { - // The default visibility for methods is public, so don't specify - // that explicitly to keep the wrapper size down. - Delete(acc); - acc = NewStringEmpty(); - } else if (Cmp(acc, "") != 0) { - Append(acc, " "); - } - - if (constructor) { - // Discriminate between the PHP constructor and a C++ constructor - // renamed to become a factory function in PHP. - bool php_constructor = (strcmp(methodname, "__construct") == 0); - const char * arg0 = NULL; - if (max_num_of_arguments > 0) { - arg0 = Char(arg_names[0]); - } else if (php_constructor) { - // The PHP constructor needs to be able to wrap a resource, but a - // renamed constructor doesn't. - arg0 = "res"; - Delete(args); - args = NewString("$res=null"); - } - String *mangled_type = SwigType_manglestr(Getattr(n, "type")); - if (!php_constructor) { - // A renamed constructor should be a static method. - Append(acc, "static "); - } - Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); - if (php_constructor) { - // The PHP constructor needs to be able to wrap a resource, but a - // renamed constructor doesn't. - Printf(output, "\t\tif (is_resource($%s) && get_resource_type($%s) === '%s') {\n", arg0, arg0, mangled_type); - Printf(output, "\t\t\t$this->%s=$%s;\n", SWIG_PTR, arg0); - Printf(output, "\t\t\treturn;\n"); - Printf(output, "\t\t}\n"); - } - } else { - Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); - } - Delete(acc); - } else if (wrapperType == staticmembervar) { - // We're called twice for a writable static member variable - first - // with "foo_set" and then with "foo_get" - so generate half the - // wrapper function each time. - // - // For a const static member, we only get called once. - static bool started = false; - if (!started) { - Printf(output, "\tstatic function %s() {\n", methodname); - if (max_num_of_arguments) { - // Setter. - Printf(output, "\t\tif (func_num_args()) {\n"); - Printf(output, "\t\t\t%s(func_get_arg(0));\n", iname); - Printf(output, "\t\t\treturn;\n"); - Printf(output, "\t\t}\n"); - started = true; - goto done; - } - } - started = false; - } else { - Printf(output, "\tstatic function %s(%s) {\n", methodname, args); - } - - if (!constructor) - Printf(output, "%s", prepare); - if (constructor) { - if (!directorsEnabled() || !Swig_directorclass(n)) { - if (!Len(prepare)) { - if (strcmp(methodname, "__construct") == 0) { - Printf(output, "\t\t$this->%s=%s;\n", SWIG_PTR, invoke); - } else { - String *classname = Swig_class_name(current_class); - Printf(output, "\t\treturn new %s%s(%s);\n", prefix, classname, invoke); - } - } - } else { - Node *parent = Swig_methodclass(n); - String *classname = Swig_class_name(parent); - Printf(output, "\t\tif (get_class($this) === '%s%s') {\n", prefix, classname); - Printf(output, "\t\t\t$_this = null;\n"); - Printf(output, "\t\t} else {\n"); - Printf(output, "\t\t\t$_this = $this;\n"); - Printf(output, "\t\t}\n"); - if (!Len(prepare)) { - if (num_arguments > 1) { - Printf(output, "\t\t$this->%s=%s($_this, %s);\n", SWIG_PTR, iname, args); - } else { - Printf(output, "\t\t$this->%s=%s($_this);\n", SWIG_PTR, iname); - } - } - } - Printf(output, "%s", prepare); - } else if (!non_void_return && !hasargout) { - if (Cmp(invoke, "$r") != 0) - Printf(output, "\t\t%s;\n", invoke); - } else if (is_class(d)) { - if (Cmp(invoke, "$r") != 0) - Printf(output, "\t\t$r=%s;\n", invoke); - if (Len(ret_types) == 1) { - /* If d is abstract we can't create a new wrapper type d. */ - Node *d_class = classLookup(d); - int is_abstract = 0; - if (Getattr(d_class, "abstracts")) { - is_abstract = 1; - } - if (newobject || !is_abstract) { - Printf(output, "\t\tif (is_resource($r)) {\n"); - if (Getattr(classLookup(Getattr(n, "type")), "module")) { - /* - * _p_Foo -> Foo, _p_ns__Bar -> Bar - * TODO: do this in a more elegant way - */ - if (Len(prefix) == 0) { - Printf(output, "\t\t\t$c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n"); - } else { - Printf(output, "\t\t\t$c='%s'.substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n", prefix); - } - Printf(output, "\t\t\tif (class_exists($c)) return new $c($r);\n"); - Printf(output, "\t\t\treturn new %s%s($r);\n", prefix, Getattr(classLookup(d), "sym:name")); - } else { - Printf(output, "\t\t\t$c = new stdClass();\n"); - Printf(output, "\t\t\t$c->" SWIG_PTR " = $r;\n"); - Printf(output, "\t\t\treturn $c;\n"); - } - Printf(output, "\t\t}\n\t\treturn $r;\n"); - } else { - Printf(output, "\t\t$this->%s = $r;\n", SWIG_PTR); - Printf(output, "\t\treturn $this;\n"); - } - } else { - Printf(output, "\t\tif (!is_resource($r)) return $r;\n"); - String *wrapobj = NULL; - String *common = NULL; - Iterator i = First(ret_types); - while (i.item) { - SwigType *ret_type = i.item; - i = Next(i); - String *mangled = NewString("_p"); - Printf(mangled, "%s", SwigType_manglestr(ret_type)); - Node *class_node = Getattr(zend_types, mangled); - if (!class_node) { - /* This is needed when we're returning a pointer to a type - * rather than returning the type by value or reference. */ - Delete(mangled); - mangled = NewString(SwigType_manglestr(ret_type)); - class_node = Getattr(zend_types, mangled); - if (!class_node) { - // Return type isn't an object, so will be handled by the - // !is_resource() check before the switch. - continue; - } - } - const char *classname = GetChar(class_node, "sym:name"); - if (!classname) - classname = GetChar(class_node, "name"); - String * action = NewStringEmpty(); - if (classname) - Printf(action, "return new %s%s($r);\n", prefix, classname); - else - Printf(action, "return $r;\n"); - if (!wrapobj) { - wrapobj = NewString("\t\tswitch (get_resource_type($r)) {\n"); - common = action; - } else { - if (common && Cmp(common, action) != 0) { - Delete(common); - common = NULL; - } - } - Printf(wrapobj, "\t\t"); - if (i.item) { - Printf(wrapobj, "case '%s': ", mangled); - } else { - Printf(wrapobj, "default: "); - } - Printv(wrapobj, action, NIL); - if (action != common) Delete(action); - Delete(mangled); - } - Printf(wrapobj, "\t\t}\n"); - if (common) { - // All cases have the same action, so eliminate the switch - // wrapper. - Printf(output, "\t\t%s", common); - Delete(common); - } else { - Printv(output, wrapobj, NIL); - } - Delete(wrapobj); - } - } else { - if (non_void_return || hasargout) { - Printf(output, "\t\treturn %s;\n", invoke); - } else if (Cmp(invoke, "$r") != 0) { - Printf(output, "\t\t%s;\n", invoke); - } - } - Printf(output, "\t}\n"); - -done: - Delete(prepare); - Delete(invoke); - free(arg_values); - - Delete(args); - args = NULL; - - for (int i = 0; i < max_num_of_arguments; ++i) { - Delete(arg_names[i]); - } - free(arg_names); - arg_names = NULL; + if (overloaded && !Getattr(n, "sym:nextSibling")) { + dispatchFunction(n, constructor); } return SWIG_OK; @@ -1880,57 +1409,13 @@ done: * globalvariableHandler() * ------------------------------------------------------------ */ - virtual int globalvariableHandler(Node *n) { - char *name = GetChar(n, "name"); - char *iname = GetChar(n, "sym:name"); - SwigType *t = Getattr(n, "type"); - String *tm; - - /* First do the wrappers such as name_set(), name_get() - * as provided by the baseclass's implementation of variableWrapper - */ - if (Language::globalvariableHandler(n) == SWIG_NOWRAP) { - return SWIG_NOWRAP; - } - - if (!addSymbol(iname, n)) - return SWIG_ERROR; - - /* First link C variables to PHP */ - - tm = Swig_typemap_lookup("varinit", n, name, 0); - if (tm) { - Replaceall(tm, "$target", name); - Printf(s_vinit, "%s\n", tm); - } else { - Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); - } - - /* Now generate PHP -> C sync blocks */ - /* - tm = Swig_typemap_lookup("varin", n, name, 0); - if(tm) { - Replaceall(tm, "$symname", iname); - Printf(f_c->code, "%s\n", tm); - } else { - Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); - } - */ - /* Now generate C -> PHP sync blocks */ - /* - if(!GetFlag(n,"feature:immutable")) { - - tm = Swig_typemap_lookup("varout", n, name, 0); - if(tm) { - Replaceall(tm, "$symname", iname); - Printf(f_php->code, "%s\n", tm); - } else { - Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); - } - } - */ - return SWIG_OK; - } + /* PHP doesn't support intercepting reads and writes to global variables + * (nor static property reads and writes so we can't wrap them as static + * properties on a dummy class) so just let SWIG do its default thing and + * wrap them as name_get() and name_set(). + */ + //virtual int globalvariableHandler(Node *n) { + //} /* ------------------------------------------------------------ * constantWrapper() @@ -1949,48 +1434,42 @@ done: SwigType_remember(type); - if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); + if (!wrapping_member_constant) { + { + tm = Swig_typemap_lookup("consttab", n, name, 0); + Replaceall(tm, "$value", value); + if (Getattr(n, "tmap:consttab:rinit")) { + Printf(r_init, "%s\n", tm); + } else { + Printf(s_cinit, "%s\n", tm); + } + } + + { + tm = Swig_typemap_lookup("classconsttab", n, name, 0); + + Replaceall(tm, "$class", fake_class_name()); + Replaceall(tm, "$const_name", iname); + Replaceall(tm, "$value", value); + if (Getattr(n, "tmap:classconsttab:rinit")) { + Printf(r_init, "%s\n", tm); + } else { + Printf(s_cinit, "%s\n", tm); + } + } + } else { + tm = Swig_typemap_lookup("classconsttab", n, name, 0); + Replaceall(tm, "$class", class_name); + Replaceall(tm, "$const_name", wrapping_member_constant); Replaceall(tm, "$value", value); - Printf(s_cinit, "%s\n", tm); - } - - if (shadow) { - String *enumvalue = GetChar(n, "enumvalue"); - String *set_to = iname; - - if (!enumvalue) { - enumvalue = GetChar(n, "enumvalueex"); - } - - if (enumvalue && *Char(enumvalue)) { - // Check for a simple constant expression which is valid in PHP. - // If we find one, initialise the const member with it; otherwise - // we initialise it using the C/C++ wrapped constant. - const char *p; - for (p = Char(enumvalue); *p; ++p) { - if (!isdigit((unsigned char)*p) && !strchr(" +-", *p)) { - // FIXME: enhance to handle ` + 1' which is what - // we get for enums that don't have an explicit value set. - break; - } - } - if (!*p) - set_to = enumvalue; - } - - if (wrapping_member_constant) { - if (!s_oowrappers) - s_oowrappers = NewStringEmpty(); - Printf(s_oowrappers, "\n\tconst %s = %s;\n", wrapping_member_constant, set_to); + if (Getattr(n, "tmap:classconsttab:rinit")) { + Printf(r_init, "%s\n", tm); } else { - if (!s_fakeoowrappers) - s_fakeoowrappers = NewStringEmpty(); - Printf(s_fakeoowrappers, "\n\tconst %s = %s;\n", iname, set_to); + Printf(s_cinit, "%s\n", tm); } } + wrapperType = standard; return SWIG_OK; } @@ -2052,219 +1531,156 @@ done: * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { - constructors = 0; - current_class = n; + String *symname = Getattr(n, "sym:name"); + String *base_class = NULL; + + class_name = symname; + + Printf(all_cs_entry, "static zend_function_entry class_%s_functions[] = {\n", class_name); + + // namespace code to introduce namespaces into wrapper classes. + //if (nameSpace != NULL) + //Printf(s_oinit, "INIT_CLASS_ENTRY(internal_ce, \"%s\\\\%s\", class_%s_functions);\n", nameSpace, class_name, class_name); + //else + Printf(s_oinit, " INIT_CLASS_ENTRY(internal_ce, \"%s%s\", class_%s_functions);\n", prefix, class_name, class_name); if (shadow) { char *rename = GetChar(n, "sym:name"); if (!addSymbol(rename, n)) return SWIG_ERROR; - shadow_classname = NewString(rename); - - shadow_get_vars = NewHash(); - shadow_set_vars = NewHash(); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); - while (base.item && GetFlag(base.item, "feature:ignore")) { - base = Next(base); - } - base = Next(base); - if (base.item) { - /* Warn about multiple inheritance for additional base class(es) */ - while (base.item) { - if (GetFlag(base.item, "feature:ignore")) { - base = Next(base); - continue; + while (base.item) { + if (!GetFlag(base.item, "feature:ignore")) { + if (!base_class) { + base_class = Getattr(base.item, "sym:name"); + } else { + /* Warn about multiple inheritance for additional base class(es) */ + String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); + String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); + Swig_warning(WARN_PHP_MULTIPLE_INHERITANCE, input_file, line_number, + "Warning for %s, base %s ignored. Multiple inheritance is not supported in PHP.\n", proxyclassname, baseclassname); } - String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); - String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); - Swig_warning(WARN_PHP_MULTIPLE_INHERITANCE, input_file, line_number, - "Warning for %s, base %s ignored. Multiple inheritance is not supported in PHP.\n", proxyclassname, baseclassname); - base = Next(base); } - } - } - } - - classnode = n; - Language::classHandler(n); - classnode = 0; - - if (shadow) { - List *baselist = Getattr(n, "bases"); - Iterator ki, base; - - if (baselist) { - base = First(baselist); - while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } - } else { - base.item = NULL; } - - if (Getattr(n, "abstracts") && !GetFlag(n, "feature:notabstract")) { - Printf(s_phpclasses, "abstract "); - } - - Printf(s_phpclasses, "class %s%s ", prefix, shadow_classname); - String *baseclass = NULL; - if (base.item && Getattr(base.item, "module")) { - baseclass = Getattr(base.item, "sym:name"); - if (!baseclass) - baseclass = Getattr(base.item, "name"); - Printf(s_phpclasses, "extends %s%s ", prefix, baseclass); - } else if (GetFlag(n, "feature:exceptionclass")) { - Append(s_phpclasses, "extends Exception "); - } - { - Node *node = NewHash(); - Setattr(node, "type", Getattr(n, "name")); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - String * interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0); - if (interfaces) { - Printf(s_phpclasses, "implements %s ", interfaces); - } - Delete(node); - } - Printf(s_phpclasses, "{\n\tpublic $%s=null;\n", SWIG_PTR); - if (!baseclass) { - // Only store this in the base class (NB !baseclass means we *are* - // a base class...) - Printf(s_phpclasses, "\tprotected $%s=array();\n", SWIG_DATA); - } - - // Write property SET handlers - ki = First(shadow_set_vars); - if (ki.key) { - // This class has setters. - Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); - // FIXME: tune this threshold... - if (Len(shadow_set_vars) <= 2) { - // Not many setters, so avoid call_user_func. - for (; ki.key; ki = Next(ki)) { - DOH *key = ki.key; - String *iname = ki.item; - Printf(s_phpclasses, "\t\tif ($var === '%s') return %s($this->%s,$value);\n", key, iname, SWIG_PTR); - } - } else { - Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_set';\n", shadow_classname); - Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s,$value);\n", SWIG_PTR); - } - Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); - if (baseclass) { - Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); - } else { - Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); - } - Printf(s_phpclasses, "\t}\n"); - } else { - Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); - Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); - if (baseclass) { - Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); - } else { - Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); - } - Printf(s_phpclasses, "\t}\n"); - } - - // Write property GET handlers - ki = First(shadow_get_vars); - if (ki.key) { - // This class has getters. - Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); - int non_class_getters = 0; - for (; ki.key; ki = Next(ki)) { - DOH *key = ki.key; - SwigType *d = ki.item; - if (!is_class(d)) { - ++non_class_getters; - continue; - } - Printv(s_phpclasses, "\t\tif ($var === '", key, "') return new ", prefix, Getattr(classLookup(d), "sym:name"), "(", shadow_classname, "_", key, "_get($this->", SWIG_PTR, "));\n", NIL); - } - // FIXME: tune this threshold... - if (non_class_getters <= 2) { - // Not many non-class getters, so avoid call_user_func. - for (ki = First(shadow_get_vars); non_class_getters && ki.key; ki = Next(ki)) { - DOH *key = ki.key; - SwigType *d = ki.item; - if (is_class(d)) continue; - Printv(s_phpclasses, "\t\tif ($var === '", key, "') return ", shadow_classname, "_", key, "_get($this->", SWIG_PTR, ");\n", NIL); - --non_class_getters; - } - } else { - Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_get';\n", shadow_classname); - Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s);\n", SWIG_PTR); - } - Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); - if (baseclass) { - Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); - } else { - // Reading an unknown property name gives null in PHP. - Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); - } - Printf(s_phpclasses, "\t}\n"); - - /* __isset() should return true for read-only properties, so check for - * *_get() not *_set(). */ - Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); - Printf(s_phpclasses, "\t\tif (function_exists('%s_'.$var.'_get')) return true;\n", shadow_classname); - Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); - if (baseclass) { - Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); - } else { - Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); - } - Printf(s_phpclasses, "\t}\n"); - } else { - Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); - Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); - if (baseclass) { - Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); - } else { - Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); - } - Printf(s_phpclasses, "\t}\n"); - Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); - Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); - if (baseclass) { - Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); - } else { - Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); - } - Printf(s_phpclasses, "\t}\n"); - } - - if (!class_has_ctor) { - Printf(s_phpclasses, "\tfunction __construct($h) {\n"); - Printf(s_phpclasses, "\t\t$this->%s=$h;\n", SWIG_PTR); - Printf(s_phpclasses, "\t}\n"); - } - - if (s_oowrappers) { - Printf(s_phpclasses, "%s", s_oowrappers); - Delete(s_oowrappers); - s_oowrappers = NULL; - } - class_has_ctor = false; - - Printf(s_phpclasses, "}\n\n"); - - Delete(shadow_classname); - shadow_classname = NULL; - - Delete(shadow_set_vars); - shadow_set_vars = NULL; - Delete(shadow_get_vars); - shadow_get_vars = NULL; } + + if (GetFlag(n, "feature:exceptionclass") && Getattr(n, "feature:except")) { + /* PHP requires thrown objects to be instances of or derived from + * Exception, so that really needs to take priority over any + * explicit base class. + */ + if (base_class) { + String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); + Swig_warning(WARN_PHP_MULTIPLE_INHERITANCE, input_file, line_number, + "Warning for %s, base %s ignored. Multiple inheritance is not supported in PHP.\n", proxyclassname, base_class); + } + base_class = NewString("Exception"); + } + + if (Equal(base_class, "Exception")) { + Printf(s_oinit, " SWIGTYPE_%s_ce = zend_register_internal_class_ex(&internal_ce, zend_ce_exception);\n", class_name); + } else if (is_class_wrapped(base_class)) { + Printf(s_oinit, " SWIGTYPE_%s_ce = zend_register_internal_class_ex(&internal_ce, SWIGTYPE_%s_ce);\n", class_name, base_class); + } else { + Printf(s_oinit, " SWIGTYPE_%s_ce = zend_register_internal_class(&internal_ce);\n", class_name); + } + + if (Getattr(n, "abstracts") && !GetFlag(n, "feature:notabstract")) { + Printf(s_oinit, " SWIGTYPE_%s_ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;\n", class_name); + } + + { + Node *node = NewHash(); + Setattr(node, "type", Getattr(n, "name")); + Setfile(node, Getfile(n)); + Setline(node, Getline(n)); + String *interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0); + Replaceall(interfaces, " ", ""); + if (interfaces && Len(interfaces) > 0) { + // It seems we need to wait until RINIT time to look up class entries + // for interfaces by name. The downside is that this then happens for + // every request. + // + // Most pre-defined interfaces are accessible via zend_class_entry* + // variables declared in the PHP C API - these we can use at MINIT + // time, so we special case them. This will also be a little faster + // than looking up by name. + Printv(s_header, + "#ifdef __cplusplus\n", + "extern \"C\" {\n", + "#endif\n", + NIL); + + String *r_init_prefix = NewStringEmpty(); + + List *interface_list = Split(interfaces, ',', -1); + int num_interfaces = Len(interface_list); + for (int i = 0; i < num_interfaces; ++i) { + String *interface = Getitem(interface_list, i); + // We generate conditional code in both minit and rinit - then we or the user + // just need to define SWIG_PHP_INTERFACE_xxx_CE (and optionally + // SWIG_PHP_INTERFACE_xxx_CE) to handle interface `xxx` at minit-time. + Printv(s_header, + "#ifdef SWIG_PHP_INTERFACE_", interface, "_HEADER\n", + "# include SWIG_PHP_INTERFACE_", interface, "_HEADER\n", + "#endif\n", + NIL); + Printv(s_oinit, + "#ifdef SWIG_PHP_INTERFACE_", interface, "_CE\n", + " zend_do_implement_interface(SWIGTYPE_", class_name, "_ce, SWIG_PHP_INTERFACE_", interface, "_CE);\n", + "#endif\n", + NIL); + Printv(r_init_prefix, + "#ifndef SWIG_PHP_INTERFACE_", interface, "_CE\n", + " {\n", + " zend_class_entry *swig_interface_ce = zend_lookup_class(zend_string_init(\"", interface, "\", sizeof(\"", interface, "\") - 1, 0));\n", + " if (!swig_interface_ce) zend_throw_exception(zend_ce_error, \"Interface \\\"", interface, "\\\" not found\", 0);\n", + " zend_do_implement_interface(SWIGTYPE_", class_name, "_ce, swig_interface_ce);\n", + " }\n", + "#endif\n", + NIL); + } + + // Handle interfaces at the start of rinit so that they're added + // before any potential constant objects, etc which might be created + // later in rinit. + Insert(r_init, 0, r_init_prefix); + Delete(r_init_prefix); + + Printv(s_header, + "#ifdef __cplusplus\n", + "}\n", + "#endif\n", + NIL); + } + Delete(interfaces); + } + + Printf(s_oinit, " SWIGTYPE_%s_ce->create_object = %s_object_new;\n", class_name, class_name); + Printf(s_oinit, " memcpy(&%s_object_handlers,zend_get_std_object_handlers(), sizeof(zend_object_handlers));\n", class_name); + Printf(s_oinit, " %s_object_handlers.clone_obj = NULL;\n", class_name); + // If not defined we aren't wrapping any functions which use this type as a + // parameter or return value, in which case we don't need the clientdata + // set. + Printf(s_oinit, "#ifdef SWIGTYPE_p%s\n", SwigType_manglestr(Getattr(n, "classtypeobj"))); + Printf(s_oinit, " SWIG_TypeClientData(SWIGTYPE_p%s,SWIGTYPE_%s_ce);\n", SwigType_manglestr(Getattr(n, "classtypeobj")), class_name); + Printf(s_oinit, "#endif\n"); + Printf(s_oinit, "\n"); + + Language::classHandler(n); + + print_creation_free_wrapper(n); + generate_magic_property_methods(n, base_class); + Printf(all_cs_entry, " ZEND_FE_END\n};\n\n"); + + class_name = NULL; return SWIG_OK; } @@ -2285,6 +1701,25 @@ done: * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { + if (magic_set == NULL) { + magic_set = NewStringEmpty(); + magic_get = NewStringEmpty(); + magic_isset = NewStringEmpty(); + } + + String *v_name = GetChar(n, "name"); + + Printf(magic_set, "\nelse if (strcmp(ZSTR_VAL(arg2),\"%s\") == 0) {\n", v_name); + Printf(magic_set, "ZVAL_STRING(&tempZval, \"%s_set\");\n", v_name); + Printf(magic_set, "call_user_function(EG(function_table),ZEND_THIS,&tempZval,return_value,1,&args[1]);\n}\n"); + + Printf(magic_get, "\nelse if (strcmp(ZSTR_VAL(arg2),\"%s\") == 0) {\n", v_name); + Printf(magic_get, "ZVAL_STRING(&tempZval, \"%s_get\");\n", v_name); + Printf(magic_get, "call_user_function(EG(function_table),ZEND_THIS,&tempZval,return_value,0,NULL);\n}\n"); + + Printf(magic_isset, "\nelse if (strcmp(ZSTR_VAL(arg2),\"%s\") == 0) {\n", v_name); + Printf(magic_isset, "RETVAL_TRUE;\n}\n"); + wrapperType = membervar; Language::membervariableHandler(n); wrapperType = standard; @@ -2325,9 +1760,7 @@ done: * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { - constructors++; if (Swig_directorclass(n)) { - String *name = GetChar(Swig_methodclass(n), "name"); String *ctype = GetChar(Swig_methodclass(n), "classtype"); String *sname = GetChar(Swig_methodclass(n), "sym:name"); String *args = NewStringEmpty(); @@ -2352,10 +1785,12 @@ done: Delete(director_ctor_code); director_ctor_code = NewStringEmpty(); director_prot_ctor_code = NewStringEmpty(); - Printf(director_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); - Printf(director_prot_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); - Printf(director_ctor_code, " %s = (%s *)new %s(%s);\n", Swig_cresult_name(), ctype, ctype, args); - Printf(director_prot_ctor_code, " SWIG_PHP_Error(E_ERROR, \"accessing abstract class or protected constructor\");\n", name, name, args); + Printf(director_ctor_code, "if (Swig::Director::swig_is_overridden_method(\"%s\", arg0)) { /* not subclassed */\n", class_name); + Printf(director_prot_ctor_code, "if (Swig::Director::swig_is_overridden_method(\"%s\", arg0)) { /* not subclassed */\n", class_name); + Printf(director_ctor_code, " %s = new %s(%s);\n", Swig_cresult_name(), ctype, args); + Printf(director_prot_ctor_code, + " zend_throw_exception(zend_ce_type_error, \"accessing abstract class or protected constructor\", 0);\n" + " return;\n"); if (i) { Insert(args, 0, ", "); } @@ -2374,62 +1809,10 @@ done: } /* ------------------------------------------------------------ - * CreateZendListDestructor() + * destructorHandler() * ------------------------------------------------------------ */ //virtual int destructorHandler(Node *n) { //} - int CreateZendListDestructor(Node *n) { - String *name = GetChar(Swig_methodclass(n), "name"); - String *iname = GetChar(n, "sym:name"); - ParmList *l = Getattr(n, "parms"); - - String *destructorname = NewStringEmpty(); - Printf(destructorname, "_%s", Swig_name_wrapper(iname)); - Setattr(classnode, "destructor", destructorname); - - Wrapper *f = NewWrapper(); - Printf(f->def, "/* This function is designed to be called by the zend list destructors */\n"); - Printf(f->def, "/* to typecast and do the actual destruction */\n"); - Printf(f->def, "static void %s(zend_resource *res, const char *type_name) {\n", destructorname); - - Wrapper_add_localv(f, "value", "swig_object_wrapper *value=(swig_object_wrapper *) res->ptr", NIL); - Wrapper_add_localv(f, "ptr", "void *ptr=value->ptr", NIL); - Wrapper_add_localv(f, "newobject", "int newobject=value->newobject", NIL); - - emit_parameter_variables(l, f); - emit_attach_parmmaps(l, f); - - // Get type of first arg, thing to be destructed - // Skip ignored arguments - Parm *p = l; - //while (Getattr(p,"tmap:ignore")) {p = Getattr(p,"tmap:ignore:next");} - while (checkAttribute(p, "tmap:in:numinputs", "0")) { - p = Getattr(p, "tmap:in:next"); - } - SwigType *pt = Getattr(p, "type"); - - Printf(f->code, " efree(value);\n"); - Printf(f->code, " if (! newobject) return; /* can't delete it! */\n"); - Printf(f->code, " arg1 = (%s)SWIG_ConvertResourceData(ptr, type_name, SWIGTYPE%s);\n", SwigType_lstr(pt, 0), SwigType_manglestr(pt)); - Printf(f->code, " if (! arg1) zend_error(E_ERROR, \"%s resource already free'd\");\n", Char(name)); - - Setattr(n, "wrap:name", destructorname); - - String *actioncode = emit_action(n); - Append(f->code, actioncode); - Delete(actioncode); - - Printf(f->code, "thrown:\n"); - Append(f->code, "return;\n"); - Append(f->code, "fail:\n"); - Append(f->code, "SWIG_FAIL();\n"); - Printf(f->code, "}\n"); - - Wrapper_print(f, s_wrappers); - DelWrapper(f); - - return SWIG_OK; - } /* ------------------------------------------------------------ * memberconstantHandler() @@ -2612,12 +1995,10 @@ done: Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), - SwigType_namestr(name)); + SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> PHP) */ - String *parse_args = NewStringEmpty(); - Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ @@ -2655,9 +2036,7 @@ done: Delete(input); Replaceall(tm, "$owner", "0"); Printv(wrap_args, tm, "\n", NIL); - Putc('O', parse_args); } else { - Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); @@ -2676,25 +2055,6 @@ done: p = nextSibling(p); } - /* exception handling */ - bool error_used_in_typemap = false; - tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); - if (!tm) { - tm = Getattr(n, "feature:director:except"); - if (tm) - tm = Copy(tm); - } - if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { - if (Replaceall(tm, "$error", "error")) { - /* Only declare error if it is used by the typemap. */ - error_used_in_typemap = true; - Append(w->code, "int error;\n"); - } - } else { - Delete(tm); - tm = NULL; - } - if (!idx) { Printf(w->code, "zval *args = NULL;\n"); } else { @@ -2703,24 +2063,38 @@ done: // typemap_directorout testcase requires that 0 can be assigned to the // variable named after the result of Swig_cresult_name(), so that can't // be a zval - make it a pointer to one instead. - Printf(w->code, "zval swig_zval_result, swig_funcname;\n", Swig_cresult_name()); + Printf(w->code, "zval swig_zval_result;\n"); Printf(w->code, "zval * SWIGUNUSED %s = &swig_zval_result;\n", Swig_cresult_name()); - const char * funcname = GetChar(n, "sym:name"); - Printf(w->code, "ZVAL_STRINGL(&swig_funcname, \"%s\", %d);\n", funcname, strlen(funcname)); /* wrap complex arguments to zvals */ - Printv(w->code, wrap_args, NIL); + Append(w->code, wrap_args); - if (error_used_in_typemap) { - Append(w->code, "error = "); + const char * funcname = GetChar(n, "sym:name"); + Append(w->code, "{\n"); + Append(w->code, "#if PHP_MAJOR_VERSION < 8\n"); + Printf(w->code, "zval swig_funcname;\n"); + Printf(w->code, "ZVAL_STRINGL(&swig_funcname, \"%s\", %d);\n", funcname, strlen(funcname)); + Printf(w->code, "call_user_function(EG(function_table), &swig_self, &swig_funcname, &swig_zval_result, %d, args);\n", idx); + Append(w->code, "#else\n"); + Printf(w->code, "zend_string *swig_funcname = zend_string_init(\"%s\", %d, 0);\n", funcname, strlen(funcname)); + Append(w->code, "zend_function *swig_zend_func = zend_std_get_method(&Z_OBJ(swig_self), swig_funcname, NULL);\n"); + Append(w->code, "zend_string_release(swig_funcname);\n"); + Printf(w->code, "if (swig_zend_func) zend_call_known_instance_method(swig_zend_func, Z_OBJ(swig_self), &swig_zval_result, %d, args);\n", idx); + Append(w->code, "#endif\n"); + + /* exception handling */ + tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); + if (!tm) { + tm = Getattr(n, "feature:director:except"); + if (tm) + tm = Copy(tm); } - Append(w->code, "call_user_function(EG(function_table), &swig_self, &swig_funcname,"); - Printf(w->code, " &swig_zval_result, %d, args);\n", idx); - - if (tm) { + if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { + Replaceall(tm, "$error", "EG(exception)"); Printv(w->code, Str(tm), "\n", NIL); - Delete(tm); } + Append(w->code, "}\n"); + Delete(tm); /* marshal return value from PHP to C/C++ type */ @@ -2749,8 +2123,8 @@ done: Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, - "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), - SwigType_namestr(name)); + "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), + SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } @@ -2767,12 +2141,11 @@ done: } } - Delete(parse_args); Delete(cleanup); Delete(outarg); } - Append(w->code, "thrown:\n"); + Append(w->code, "fail: ;\n"); if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); @@ -2783,12 +2156,7 @@ done: } Delete(rettype); } - } else { - Append(w->code, "return;\n"); } - - Append(w->code, "fail:\n"); - Append(w->code, "SWIG_FAIL();\n"); Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method @@ -2823,36 +2191,31 @@ done: return status; } - int classDirectorDisown(Node *) { - return SWIG_OK; + int classDirectorDisown(Node *n) { + wrapperType = directordisown; + int result = Language::classDirectorDisown(n); + wrapperType = standard; + return result; } }; /* class PHP */ static PHP *maininstance = 0; -// We use this function to be able to write out zend_register_list_destructor_ex -// lines for most things in the type table +// Collect non-class pointer types from the type table so we can set up PHP +// resource types for them later. +// // NOTE: it's a function NOT A PHP::METHOD extern "C" { static void typetrace(const SwigType *ty, String *mangled, String *clientdata) { - Node *class_node; - if (!zend_types) { - zend_types = NewHash(); - } - // we want to know if the type which reduced to this has a constructor - if ((class_node = maininstance->classLookup(ty))) { - if (!Getattr(zend_types, mangled)) { - // OK it may have been set before by a different SwigType but it would - // have had the same underlying class node I think - // - it is certainly required not to have different originating class - // nodes for the same SwigType - Setattr(zend_types, mangled, class_node); + if (maininstance->classLookup(ty) == NULL) { + // a non-class pointer + if (!zend_types) { + zend_types = NewHash(); } - } else { // a non-class pointer - Setattr(zend_types, mangled, NOTCLASS); + Setattr(zend_types, mangled, mangled); } if (r_prevtracefunc) - (*r_prevtracefunc) (ty, mangled, (String *) clientdata); + (*r_prevtracefunc) (ty, mangled, clientdata); } } diff --git a/Source/Modules/pike.cxx b/Source/Modules/pike.cxx deleted file mode 100644 index b8ed4037a..000000000 --- a/Source/Modules/pike.cxx +++ /dev/null @@ -1,904 +0,0 @@ -/* ----------------------------------------------------------------------------- - * This file is part of SWIG, which is licensed as a whole under version 3 - * (or any later version) of the GNU General Public License. Some additional - * terms also apply to certain portions of SWIG. The full details of the SWIG - * license and copyrights can be found in the LICENSE and COPYRIGHT files - * included with the SWIG source code as distributed by the SWIG developers - * and at http://www.swig.org/legal.html. - * - * pike.cxx - * - * Pike language module for SWIG. - * ----------------------------------------------------------------------------- */ - -/* - * Notes: - * - * - The current approach used for "out" typemaps is inconsistent with - * how "out" typemaps are handled by other language modules. Instead - * of converting the C/C++ type ($1) to a Pike object type (e.g. a - * struct svalue), we're just calling the appropriate push_XXX - * (e.g. push_int) to push the return value onto the stack. - * - * - Pike classes can't have static member functions or data, so we need - * to find some other appropriate mapping for C++ static member functions - * and data. - * - * - Pike doesn't seem to provide any default way to print the memory - * address, etc. for extension objects. Should we do something here? - * - */ - -#include "swigmod.h" - -#include // for isalnum() - -static const char *usage = "\ -Pike Options (available with -pike)\n\ - [no additional options]\n\ -\n"; - -class PIKE:public Language { -private: - - File *f_begin; - File *f_runtime; - File *f_header; - File *f_wrappers; - File *f_init; - File *f_classInit; - - String *PrefixPlusUnderscore; - int current; - - // Wrap modes - enum { - NO_CPP, - MEMBER_FUNC, - CONSTRUCTOR, - DESTRUCTOR, - MEMBER_VAR, - CLASS_CONST, - STATIC_FUNC, - STATIC_VAR - }; - -public: - - /* --------------------------------------------------------------------- - * PIKE() - * - * Initialize member data - * --------------------------------------------------------------------- */ - - PIKE() { - f_begin = 0; - f_runtime = 0; - f_header = 0; - f_wrappers = 0; - f_init = 0; - f_classInit = 0; - PrefixPlusUnderscore = 0; - current = NO_CPP; - } - - /* --------------------------------------------------------------------- - * main() - * - * Parse command line options and initializes variables. - * --------------------------------------------------------------------- */ - - virtual void main(int argc, char *argv[]) { - - /* Set location of SWIG library */ - SWIG_library_directory("pike"); - - /* Look for certain command line options */ - for (int i = 1; i < argc; i++) { - if (argv[i]) { - if (strcmp(argv[i], "-help") == 0) { - fputs(usage, stdout); - } - } - } - - /* Add a symbol to the parser for conditional compilation */ - Preprocessor_define("SWIGPIKE 1", 0); - - /* Set language-specific configuration file */ - SWIG_config_file("pike.swg"); - - /* Set typemap language */ - SWIG_typemap_lang("pike"); - - /* Enable overloaded methods support */ - allow_overloading(); - } - - /* --------------------------------------------------------------------- - * top() - * --------------------------------------------------------------------- */ - - virtual int top(Node *n) { - /* Get the module name */ - String *module = Getattr(n, "name"); - - /* Get the output file name */ - String *outfile = Getattr(n, "outfile"); - - /* Open the output file */ - f_begin = NewFile(outfile, "w", SWIG_output_files()); - if (!f_begin) { - FileErrorDisplay(outfile); - SWIG_exit(EXIT_FAILURE); - } - f_runtime = NewString(""); - f_init = NewString(""); - f_classInit = NewString(""); - f_header = NewString(""); - f_wrappers = NewString(""); - - /* Register file targets with the SWIG file handler */ - Swig_register_filebyname("header", f_header); - Swig_register_filebyname("wrapper", f_wrappers); - Swig_register_filebyname("begin", f_begin); - Swig_register_filebyname("runtime", f_runtime); - Swig_register_filebyname("init", f_init); - Swig_register_filebyname("classInit", f_classInit); - - /* Standard stuff for the SWIG runtime section */ - Swig_banner(f_begin); - - Printf(f_runtime, "\n\n#ifndef SWIGPIKE\n#define SWIGPIKE\n#endif\n\n"); - - Printf(f_header, "#define SWIG_init pike_module_init\n"); - Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); - - /* Change naming scheme for constructors and destructors */ - Swig_name_register("construct", "%n%c_create"); - Swig_name_register("destroy", "%n%c_destroy"); - - /* Current wrap type */ - current = NO_CPP; - - /* Emit code for children */ - Language::top(n); - - /* Close the initialization function */ - Printf(f_init, "}\n"); - SwigType_emit_type_table(f_runtime, f_wrappers); - - /* Close all of the files */ - Dump(f_runtime, f_begin); - Dump(f_header, f_begin); - Dump(f_wrappers, f_begin); - Wrapper_pretty_print(f_init, f_begin); - - Delete(f_header); - Delete(f_wrappers); - Delete(f_init); - Delete(f_classInit); - Delete(f_runtime); - Delete(f_begin); - - /* Done */ - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * validIdentifier() - * ------------------------------------------------------------ */ - - virtual int validIdentifier(String *s) { - char *c = Char(s); - const char *c0 = c; - const char *c1 = c0 + 1; - while (*c) { - if (*c == '`' && c == c0) { - c++; - continue; - } - if ((*c == '+' || *c == '-' || *c == '*' || *c == '/') && c == c1) { - c++; - continue; - } - if (!(isalnum(*c) || (*c == '_'))) - return 0; - c++; - } - return 1; - } - - /* ------------------------------------------------------------ - * importDirective() - * ------------------------------------------------------------ */ - - virtual int importDirective(Node *n) { - String *modname = Getattr(n, "module"); - if (modname) { - Printf(f_init, "pike_require(\"%s\");\n", modname); - } - return Language::importDirective(n); - } - - /* ------------------------------------------------------------ - * strip() - * - * For names that begin with the current class prefix plus an - * underscore (e.g. "Foo_enum_test"), return the base function - * name (i.e. "enum_test"). - * ------------------------------------------------------------ */ - - String *strip(const DOHconst_String_or_char_ptr name) { - String *s = Copy(name); - if (Strncmp(name, PrefixPlusUnderscore, Len(PrefixPlusUnderscore)) != 0) { - return s; - } - Replaceall(s, PrefixPlusUnderscore, ""); - return s; - } - - /* ------------------------------------------------------------ - * add_method() - * ------------------------------------------------------------ */ - - void add_method(const DOHconst_String_or_char_ptr name, const DOHconst_String_or_char_ptr function, const DOHconst_String_or_char_ptr description) { - String *rename = NULL; - switch (current) { - case NO_CPP: - rename = NewString(name); - Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); - break; - case STATIC_FUNC: - case STATIC_VAR: - rename = NewString(name); - Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); - break; - case CONSTRUCTOR: - case DESTRUCTOR: - case MEMBER_FUNC: - case MEMBER_VAR: - rename = strip(name); - Printf(f_classInit, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); - break; - case CLASS_CONST: // shouldn't have gotten here for CLASS_CONST nodes - default: // what is this? - assert(false); - } - Delete(rename); - } - - /* --------------------------------------------------------------------- - * functionWrapper() - * - * Create a function declaration and register it with the interpreter. - * --------------------------------------------------------------------- */ - - virtual int functionWrapper(Node *n) { - - String *name = Getattr(n, "name"); - String *iname = Getattr(n, "sym:name"); - SwigType *d = Getattr(n, "type"); - ParmList *l = Getattr(n, "parms"); - - Parm *p; - String *tm; - int i; - - String *overname = 0; - if (Getattr(n, "sym:overloaded")) { - overname = Getattr(n, "sym:overname"); - } else { - if (!addSymbol(iname, n)) - return SWIG_ERROR; - } - - Wrapper *f = NewWrapper(); - - // Emit all of the local variables for holding arguments. - emit_parameter_variables(l, f); - - /* Attach the standard typemaps */ - emit_attach_parmmaps(l, f); - Setattr(n, "wrap:parms", l); - - /* Get number of required and total arguments */ - int num_arguments = emit_num_arguments(l); - int varargs = emit_isvarargs(l); - - /* Which input argument to start with? */ - int start = (current == MEMBER_FUNC || current == MEMBER_VAR || current == DESTRUCTOR) ? 1 : 0; - - /* Offset to skip over the attribute name */ - // int offset = (current == MEMBER_VAR) ? 1 : 0; - int offset = 0; - - String *wname = Swig_name_wrapper(iname); - if (overname) { - Append(wname, overname); - } - Setattr(n, "wrap:name", wname); - - Printv(f->def, "static void ", wname, "(INT32 args) {", NIL); - - /* Generate code for argument marshalling */ - String *description = NewString(""); - char source[64]; - for (i = 0, p = l; i < num_arguments; i++) { - - while (checkAttribute(p, "tmap:in:numinputs", "0")) { - p = Getattr(p, "tmap:in:next"); - } - - SwigType *pt = Getattr(p, "type"); - String *ln = Getattr(p, "lname"); - - if (i < start) { - String *lstr = SwigType_lstr(pt, 0); - Printf(f->code, "%s = (%s) THIS;\n", ln, lstr); - Delete(lstr); - } else { - /* Look for an input typemap */ - sprintf(source, "Pike_sp[%d-args]", i - start + offset); - if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", ln); - Replaceall(tm, "$input", source); - Setattr(p, "emit:input", source); - Printf(f->code, "%s\n", tm); - String *pikedesc = Getattr(p, "tmap:in:pikedesc"); - if (pikedesc) { - Printv(description, pikedesc, " ", NIL); - } - p = Getattr(p, "tmap:in:next"); - continue; - } else { - Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); - break; - } - } - p = nextSibling(p); - } - - /* Check for trailing varargs */ - if (varargs) { - if (p && (tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$input", "varargs"); - Printv(f->code, tm, "\n", NIL); - } - } - - /* Insert constraint checking code */ - for (p = l; p;) { - if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); - Printv(f->code, tm, "\n", NIL); - p = Getattr(p, "tmap:check:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert cleanup code */ - String *cleanup = NewString(""); - for (p = l; p;) { - if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Printv(cleanup, tm, "\n", NIL); - p = Getattr(p, "tmap:freearg:next"); - } else { - p = nextSibling(p); - } - } - - /* Insert argument output code */ - String *outarg = NewString(""); - for (p = l; p;) { - if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", "resultobj"); - Replaceall(tm, "$arg", Getattr(p, "emit:input")); - Replaceall(tm, "$input", Getattr(p, "emit:input")); - Printv(outarg, tm, "\n", NIL); - p = Getattr(p, "tmap:argout:next"); - } else { - p = nextSibling(p); - } - } - - /* Emit the function call */ - String *actioncode = emit_action(n); - - /* Clear the return stack */ - Printf(actioncode, "pop_n_elems(args);\n"); - - /* Return the function value */ - if (current == CONSTRUCTOR) { - Printv(actioncode, "THIS = (void *) ", Swig_cresult_name(), ";\n", NIL); - Printv(description, ", tVoid", NIL); - } else if (current == DESTRUCTOR) { - Printv(description, ", tVoid", NIL); - } else { - Printv(description, ", ", NIL); - if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { - actioncode = 0; - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "resultobj"); - Replaceall(tm, "$result", "resultobj"); - if (GetFlag(n, "feature:new")) { - Replaceall(tm, "$owner", "1"); - } else { - Replaceall(tm, "$owner", "0"); - } - String *pikedesc = Getattr(n, "tmap:out:pikedesc"); - if (pikedesc) { - Printv(description, pikedesc, NIL); - } - Printf(f->code, "%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); - } - } - if (actioncode) { - Append(f->code, actioncode); - Delete(actioncode); - } - emit_return_variable(n, d, f); - - /* Output argument output code */ - Printv(f->code, outarg, NIL); - - /* Output cleanup code */ - Printv(f->code, cleanup, NIL); - - /* Look to see if there is any newfree cleanup code */ - if (GetFlag(n, "feature:new")) { - if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Printf(f->code, "%s\n", tm); - } - } - - /* See if there is any return cleanup code */ - if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); - Printf(f->code, "%s\n", tm); - } - - /* Close the function */ - Printf(f->code, "}\n"); - - /* Substitute the cleanup code */ - Replaceall(f->code, "$cleanup", cleanup); - - /* Substitute the function name */ - Replaceall(f->code, "$symname", iname); - Replaceall(f->code, "$result", "resultobj"); - - /* Dump the function out */ - Wrapper_print(f, f_wrappers); - - /* Now register the function with the interpreter. */ - if (!Getattr(n, "sym:overloaded")) { - add_method(iname, wname, description); - } else { - if (!Getattr(n, "sym:nextSibling")) { - dispatchFunction(n); - } - } - - Delete(cleanup); - Delete(outarg); - Delete(description); - Delete(wname); - DelWrapper(f); - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * dispatchFunction() - * - * Emit overloading dispatch function - * ------------------------------------------------------------ */ - - void dispatchFunction(Node *n) { - /* Last node in overloaded chain */ - - int maxargs; - String *tmp = NewString(""); - String *dispatch = Swig_overload_dispatch(n, "%s(args); return;", &maxargs); - - /* Generate a dispatch wrapper for all overloaded functions */ - - Wrapper *f = NewWrapper(); - String *symname = Getattr(n, "sym:name"); - String *wname = Swig_name_wrapper(symname); - - Printf(f->def, "static void %s(INT32 args) {", wname); - - Wrapper_add_local(f, "argc", "INT32 argc"); - Printf(tmp, "struct svalue argv[%d]", maxargs); - Wrapper_add_local(f, "argv", tmp); - Wrapper_add_local(f, "ii", "INT32 ii"); - - Printf(f->code, "argc = args;\n"); - Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n", maxargs); - Printf(f->code, "argv[ii] = Pike_sp[ii-args];\n"); - Printf(f->code, "}\n"); - - Replaceall(dispatch, "$args", "self, args"); - Printv(f->code, dispatch, "\n", NIL); - Printf(f->code, "Pike_error(\"No matching function for overloaded '%s'.\");\n", symname); - Printv(f->code, "}\n", NIL); - - Wrapper_print(f, f_wrappers); - - String *description = NewString(""); - Printf(description, "tAny,"); - if (current == CONSTRUCTOR || current == DESTRUCTOR) { - Printf(description, " tVoid"); - } else { - String *pd = Getattr(n, "tmap:out:pikedesc"); - if (pd) - Printf(description, " %s", pd); - } - add_method(symname, wname, description); - Delete(description); - - DelWrapper(f); - Delete(dispatch); - Delete(tmp); - Delete(wname); - } - - /* ------------------------------------------------------------ - * variableWrapper() - * ------------------------------------------------------------ */ - - virtual int variableWrapper(Node *n) { - return Language::variableWrapper(n); - } - - /* ------------------------------------------------------------ - * constantWrapper() - * ------------------------------------------------------------ */ - - virtual int constantWrapper(Node *n) { - - Swig_require("constantWrapper", n, "*sym:name", "type", "value", NIL); - - String *symname = Getattr(n, "sym:name"); - SwigType *type = Getattr(n, "type"); - String *value = Getattr(n, "value"); - bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); - - if (SwigType_type(type) == T_MPOINTER) { - /* Special hook for member pointer */ - String *wname = Swig_name_wrapper(symname); - Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); - value = wname; - } else if (SwigType_type(type) == T_CHAR && is_enum_item) { - type = NewSwigType(T_INT); - Setattr(n, "type", type); - } - - /* Perform constant typemap substitution */ - String *tm = Swig_typemap_lookup("constant", n, value, 0); - if (tm) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", symname); - Replaceall(tm, "$symname", symname); - Replaceall(tm, "$value", value); - Printf(f_init, "%s\n", tm); - } else { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); - } - - Swig_restore(n); - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * nativeWrapper() - * ------------------------------------------------------------ */ - - virtual int nativeWrapper(Node *n) { - // return Language::nativeWrapper(n); - String *name = Getattr(n, "sym:name"); - String *wrapname = Getattr(n, "wrap:name"); - - if (!addSymbol(wrapname, n)) - return SWIG_ERROR; - - add_method(name, wrapname, 0); - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * enumDeclaration() - * ------------------------------------------------------------ */ - - virtual int enumDeclaration(Node *n) { - return Language::enumDeclaration(n); - } - - /* ------------------------------------------------------------ - * enumvalueDeclaration() - * ------------------------------------------------------------ */ - - virtual int enumvalueDeclaration(Node *n) { - return Language::enumvalueDeclaration(n); - } - - /* ------------------------------------------------------------ - * classDeclaration() - * ------------------------------------------------------------ */ - - virtual int classDeclaration(Node *n) { - return Language::classDeclaration(n); - } - - /* ------------------------------------------------------------ - * classHandler() - * ------------------------------------------------------------ */ - - virtual int classHandler(Node *n) { - - String *symname = Getattr(n, "sym:name"); - if (!addSymbol(symname, n)) - return SWIG_ERROR; - - PrefixPlusUnderscore = NewStringf("%s_", getClassPrefix()); - - Printf(f_classInit, "start_new_program();\n"); - - /* Handle inheritance */ - List *baselist = Getattr(n, "bases"); - if (baselist && Len(baselist) > 0) { - Iterator base = First(baselist); - while (base.item) { - String *basename = Getattr(base.item, "name"); - SwigType *basetype = NewString(basename); - SwigType_add_pointer(basetype); - SwigType_remember(basetype); - String *basemangle = SwigType_manglestr(basetype); - Printf(f_classInit, "low_inherit((struct program *) SWIGTYPE%s->clientdata, 0, 0, 0, 0, 0);\n", basemangle); - Delete(basemangle); - Delete(basetype); - base = Next(base); - } - } else { - Printf(f_classInit, "ADD_STORAGE(swig_object_wrapper);\n"); - } - - Language::classHandler(n); - - /* Accessors for member variables */ - /* - List *membervariables = Getattr(n,"membervariables"); - if (membervariables && Len(membervariables) > 0) { - membervariableAccessors(membervariables); - } - */ - - /* Done, close the class and dump its definition to the init function */ - Printf(f_classInit, "add_program_constant(\"%s\", pr = end_program(), 0);\n", symname); - Dump(f_classInit, f_init); - Clear(f_classInit); - - SwigType *tt = NewString(symname); - SwigType_add_pointer(tt); - SwigType_remember(tt); - String *tm = SwigType_manglestr(tt); - Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) pr);\n", tm); - Delete(tm); - Delete(tt); - - Delete(PrefixPlusUnderscore); - PrefixPlusUnderscore = 0; - - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberfunctionHandler() - * - * Method for adding C++ member function - * ------------------------------------------------------------ */ - - virtual int memberfunctionHandler(Node *n) { - current = MEMBER_FUNC; - Language::memberfunctionHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * constructorHandler() - * - * Method for adding C++ member constructor - * ------------------------------------------------------------ */ - - virtual int constructorHandler(Node *n) { - current = CONSTRUCTOR; - Language::constructorHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * destructorHandler() - * ------------------------------------------------------------ */ - - virtual int destructorHandler(Node *n) { - current = DESTRUCTOR; - Language::destructorHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * membervariableAccessors() - * ------------------------------------------------------------ */ - - void membervariableAccessors(List *membervariables) { - String *name; - Iterator i; - bool need_setter; - String *funcname; - - /* If at least one of them is mutable, we need a setter */ - need_setter = false; - i = First(membervariables); - while (i.item) { - if (!GetFlag(i.item, "feature:immutable")) { - need_setter = true; - break; - } - i = Next(i); - } - - /* Create a function to set the values of the (mutable) variables */ - if (need_setter) { - Wrapper *wrapper = NewWrapper(); - String *setter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->="); - String *wname = Swig_name_wrapper(setter); - Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); - Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); - - i = First(membervariables); - while (i.item) { - if (!GetFlag(i.item, "feature:immutable")) { - name = Getattr(i.item, "name"); - funcname = Swig_name_wrapper(Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); - Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); - Printf(wrapper->code, "%s(args);\n", funcname); - Printf(wrapper->code, "return;\n"); - Printf(wrapper->code, "}\n"); - Delete(funcname); - } - i = Next(i); - } - - /* Close the function */ - Printf(wrapper->code, "pop_n_elems(args);\n"); - Printf(wrapper->code, "}\n"); - - /* Dump wrapper code to the output file */ - Wrapper_print(wrapper, f_wrappers); - - /* Register it with Pike */ - String *description = NewString("tStr tFloat, tVoid"); - add_method("`->=", wname, description); - Delete(description); - - /* Clean up */ - Delete(wname); - Delete(setter); - DelWrapper(wrapper); - } - - /* Create a function to get the values of the (mutable) variables */ - Wrapper *wrapper = NewWrapper(); - String *getter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->"); - String *wname = Swig_name_wrapper(getter); - Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); - Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); - - i = First(membervariables); - while (i.item) { - name = Getattr(i.item, "name"); - funcname = Swig_name_wrapper(Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); - Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); - Printf(wrapper->code, "%s(args);\n", funcname); - Printf(wrapper->code, "return;\n"); - Printf(wrapper->code, "}\n"); - Delete(funcname); - i = Next(i); - } - - /* Close the function */ - Printf(wrapper->code, "pop_n_elems(args);\n"); - Printf(wrapper->code, "}\n"); - - /* Dump wrapper code to the output file */ - Wrapper_print(wrapper, f_wrappers); - - /* Register it with Pike */ - String *description = NewString("tStr, tMix"); - add_method("`->", wname, description); - Delete(description); - - /* Clean up */ - Delete(wname); - Delete(getter); - DelWrapper(wrapper); - } - - /* ------------------------------------------------------------ - * membervariableHandler() - * ------------------------------------------------------------ */ - - virtual int membervariableHandler(Node *n) { - List *membervariables = Getattr(getCurrentClass(), "membervariables"); - if (!membervariables) { - membervariables = NewList(); - Setattr(getCurrentClass(), "membervariables", membervariables); - } - Append(membervariables, n); - current = MEMBER_VAR; - Language::membervariableHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ----------------------------------------------------------------------- - * staticmemberfunctionHandler() - * - * Wrap a static C++ function - * ---------------------------------------------------------------------- */ - - virtual int staticmemberfunctionHandler(Node *n) { - current = STATIC_FUNC; - Language::staticmemberfunctionHandler(n); - current = NO_CPP; - return SWIG_OK; - } - - /* ------------------------------------------------------------ - * memberconstantHandler() - * - * Create a C++ constant - * ------------------------------------------------------------ */ - - virtual int memberconstantHandler(Node *n) { - current = CLASS_CONST; - constantWrapper(n); - current = NO_CPP; - return SWIG_OK; - } - - /* --------------------------------------------------------------------- - * staticmembervariableHandler() - * --------------------------------------------------------------------- */ - - virtual int staticmembervariableHandler(Node *n) { - current = STATIC_VAR; - Language::staticmembervariableHandler(n); - current = NO_CPP; - return SWIG_OK; - } -}; - -/* ----------------------------------------------------------------------------- - * swig_pike() - Instantiate module - * ----------------------------------------------------------------------------- */ - -static Language *new_swig_pike() { - return new PIKE(); -} -extern "C" Language *swig_pike(void) { - return new_swig_pike(); -} diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index 39308d4b8..7d618635e 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -16,7 +16,6 @@ #include "cparse.h" #include #include -#include #include "pydoc.h" #include @@ -94,6 +93,7 @@ static int nortti = 0; static int relativeimport = 0; /* flags for the make_autodoc function */ +namespace { enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, @@ -104,7 +104,7 @@ enum autodoc_t { AUTODOC_CONST, AUTODOC_VAR }; - +} static const char *usage1 = "\ Python Options (available with -python)\n\ @@ -847,8 +847,13 @@ public: Printv(f_shadow_py, "\n", f_shadow_begin, "\n", NIL); Printv(f_shadow_py, "\nfrom sys import version_info as _swig_python_version_info\n", NULL); - Printv(f_shadow_py, "if _swig_python_version_info < (2, 7, 0):\n", NULL); - Printv(f_shadow_py, tab4, "raise RuntimeError(\"Python 2.7 or later required\")\n\n", NULL); + if (py3) { + Printv(f_shadow_py, "if _swig_python_version_info < (3, 0):\n", NULL); + Printv(f_shadow_py, tab4, "raise RuntimeError(\"Python 3.x or later required\")\n\n", NULL); + } else { + Printv(f_shadow_py, "if _swig_python_version_info < (2, 7, 0):\n", NULL); + Printv(f_shadow_py, tab4, "raise RuntimeError(\"Python 2.7 or later required\")\n\n", NULL); + } if (Len(f_shadow_after_begin) > 0) Printv(f_shadow_py, f_shadow_after_begin, "\n", NIL); @@ -1485,8 +1490,15 @@ public: String *build_combined_docstring(Node *n, autodoc_t ad_type, const String *indent = "", bool low_level = false) { String *docstr = Getattr(n, "feature:docstring"); - if (docstr && Len(docstr)) { - docstr = Copy(docstr); + if (docstr) { + // Simplify the code below by just ignoring empty docstrings. + if (!Len(docstr)) + docstr = NULL; + else + docstr = Copy(docstr); + } + + if (docstr) { char *t = Char(docstr); if (*t == '{') { Delitem(docstr, 0); @@ -1497,7 +1509,7 @@ public: if (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")) { String *autodoc = make_autodoc(n, ad_type, low_level); if (autodoc && Len(autodoc) > 0) { - if (docstr && Len(docstr)) { + if (docstr) { Append(autodoc, "\n"); Append(autodoc, docstr); } @@ -1510,7 +1522,7 @@ public: Delete(autodoc); } - if (!docstr || !Len(docstr)) { + if (!docstr) { if (doxygen) { docstr = Getattr(n, "python:docstring"); if (!docstr && doxygenTranslator->hasDocumentation(n)) { @@ -1565,7 +1577,8 @@ public: String *docstring(Node *n, autodoc_t ad_type, const String *indent, bool low_level = false) { String *docstr = build_combined_docstring(n, ad_type, indent, low_level); - if (!Len(docstr)) + const int len = Len(docstr); + if (!len) return docstr; // Notice that all comments are created as raw strings (prefix "r"), @@ -1578,9 +1591,32 @@ public: // escape '\x'. '\' may additionally appear in verbatim or htmlonly sections // of doxygen doc, Latex expressions, ... String *doc = NewString(""); - Append(doc, "r\"\"\""); + + // Determine which kind of quotes to use as delimiters: for single line + // strings we can avoid problems with having a quote as the last character + // of the docstring by using different kind of quotes as delimiters. For + // multi-line strings this problem doesn't arise, as we always have a new + // line or spaces at the end of it, but it still does no harm to do it for + // them too. + // + // Note: we use double quotes by default, i.e. if there is no reason to + // prefer using single ones, for consistency with the older SWIG versions. + const bool useSingleQuotes = (Char(docstr))[len - 1] == '"'; + + Append(doc, useSingleQuotes ? "r'''" : "r\"\"\""); + + // We also need to avoid having triple quotes of whichever type we use, as + // this would break Python doc string syntax too. Unfortunately there is no + // way to have triple quotes inside of raw-triple-quoted string, so we have + // to break the string in parts and rely on concatenation of the adjacent + // string literals. + if (useSingleQuotes) + Replaceall(docstr, "'''", "''' \"'''\" '''"); + else + Replaceall(docstr, "\"\"\"", "\"\"\" '\"\"\"' \"\"\""); + Append(doc, docstr); - Append(doc, "\"\"\""); + Append(doc, useSingleQuotes ? "'''" : "\"\"\""); Delete(docstr); return doc; @@ -2494,7 +2530,7 @@ public: String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); - const char *builtin_kwargs = builtin_ctor ? ", PyObject *SWIGUNUSEDPARM(kwargs)" : ""; + const char *builtin_kwargs = builtin_ctor ? ", PyObject *kwargs" : ""; Printv(f->def, linkage, builtin_ctor ? "int " : "PyObject *", wname, "(PyObject *self, PyObject *args", builtin_kwargs, ") {", NIL); Wrapper_add_local(f, "argc", "Py_ssize_t argc"); @@ -2504,6 +2540,9 @@ public: if (!fastunpack) { Wrapper_add_local(f, "ii", "Py_ssize_t ii"); + if (builtin_ctor) + Printf(f->code, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", symname); + if (maxargs - (add_self ? 1 : 0) > 0) { Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); Append(f->code, "argc = PyObject_Length(args);\n"); @@ -2519,8 +2558,9 @@ public: if (add_self) Append(f->code, "argc++;\n"); } else { - String *iname = Getattr(n, "sym:name"); - Printf(f->code, "if (!(argc = SWIG_Python_UnpackTuple(args, \"%s\", 0, %d, argv%s))) SWIG_fail;\n", iname, maxargs, add_self ? "+1" : ""); + if (builtin_ctor) + Printf(f->code, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", symname); + Printf(f->code, "if (!(argc = SWIG_Python_UnpackTuple(args, \"%s\", 0, %d, argv%s))) SWIG_fail;\n", symname, maxargs, add_self ? "+1" : ""); if (add_self) Append(f->code, "argv[0] = self;\n"); else @@ -2701,8 +2741,12 @@ public: --tuple_required; } num_fixed_arguments = tuple_required; + + // builtin handles/checks kwargs by default except in constructor wrappers so we need to explicitly handle them in the C constructor wrapper + // The check below is for zero arguments. Sometimes (eg directors) self is the first argument for a method with zero arguments. if (((num_arguments == 0) && (num_required == 0)) || ((num_arguments == 1) && (num_required == 1) && Getattr(l, "self"))) - allow_kwargs = 0; + if (!builtin_ctor) + allow_kwargs = 0; varargs = emit_isvarargs(l); String *wname = Copy(wrapper_name); @@ -2710,12 +2754,12 @@ public: Append(wname, overname); } - const char *builtin_kwargs = builtin_ctor ? ", PyObject *SWIGUNUSEDPARM(kwargs)" : ""; + const char *builtin_kwargs = builtin_ctor ? ", PyObject *kwargs" : ""; if (!allow_kwargs || overname) { if (!varargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); } else { - Printv(f->def, linkage, wrap_return, wname, "__varargs__", "(PyObject *", self_param, ", PyObject *args, PyObject *varargs) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "__varargs__", "(PyObject *", self_param, ", PyObject *args, PyObject *varargs", builtin_kwargs, ") {", NIL); } if (allow_kwargs) { Swig_warning(WARN_LANG_OVERLOAD_KEYWORD, input_file, line_number, "Can't use keyword arguments with overloaded functions (%s).\n", Swig_name_decl(n)); @@ -2728,7 +2772,7 @@ public: } Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args, PyObject *kwargs) {", NIL); } - if (!builtin || !in_class || tuple_arguments > 0) { + if (!builtin || !in_class || tuple_arguments > 0 || builtin_ctor) { if (!allow_kwargs) { Append(parse_args, " if (!PyArg_ParseTuple(args, \""); } else { @@ -2824,8 +2868,6 @@ public: } else { Replaceall(tm, "$self", "obj0"); } - Replaceall(tm, "$source", source); - Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save the location of the object */ @@ -2877,14 +2919,13 @@ public: Printv(f->locals, " char * kwnames[] = ", kwargs, ";\n", NIL); } - if (builtin && !funpack && in_class && tuple_arguments == 0) { - Printf(parse_args, " if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_exception_fail(SWIG_TypeError, \"%s takes no arguments\");\n", iname); - } else if (use_parse || allow_kwargs) { + if (use_parse || allow_kwargs) { Printf(parse_args, ":%s\"", iname); Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); funpack = 0; } else { Clear(parse_args); + if (funpack) { Clear(f->def); if (overname) { @@ -2897,6 +2938,8 @@ public: } else { int is_tp_call = Equal(Getattr(n, "feature:python:slot"), "tp_call"); Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); + if (builtin_ctor) + Printf(parse_args, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", iname); if (onearg && !builtin_ctor && !is_tp_call) { Printf(parse_args, "if (!args) SWIG_fail;\n"); Append(parse_args, "swig_obj[0] = args;\n"); @@ -2907,8 +2950,14 @@ public: } } } else { - Printf(parse_args, "if (!PyArg_UnpackTuple(args, \"%s\", %d, %d", iname, num_fixed_arguments, tuple_arguments); - Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); + if (builtin_ctor) + Printf(parse_args, "if (!SWIG_Python_CheckNoKeywords(kwargs, \"%s\")) SWIG_fail;\n", iname); + if (builtin && in_class && tuple_arguments == 0) { + Printf(parse_args, " if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_exception_fail(SWIG_TypeError, \"%s takes no arguments\");\n", iname); + } else { + Printf(parse_args, "if (!PyArg_UnpackTuple(args, \"%s\", %d, %d", iname, num_fixed_arguments, tuple_arguments); + Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); + } } } @@ -2926,7 +2975,6 @@ public: /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -2948,7 +2996,6 @@ public: } } if (tm && (Len(tm) != 0)) { - Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); @@ -2960,8 +3007,6 @@ public: /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); @@ -3050,8 +3095,6 @@ public: } else { Replaceall(tm, "$self", "obj0"); } - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (builtin_ctor) { Replaceall(tm, "$owner", "SWIG_BUILTIN_INIT"); @@ -3117,7 +3160,6 @@ public: /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } @@ -3125,7 +3167,6 @@ public: /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } @@ -3208,10 +3249,10 @@ public: Printf(f->code, " Py_XINCREF(swig_obj[i + %d]);\n", num_fixed_arguments); Printf(f->code, "}\n"); } else { - Printf(f->code, "newargs = PyTuple_GetSlice(args,0,%d);\n", num_fixed_arguments); - Printf(f->code, "varargs = PyTuple_GetSlice(args,%d,PyTuple_Size(args));\n", num_fixed_arguments); + Printf(f->code, "newargs = PyTuple_GetSlice(args, 0, %d);\n", num_fixed_arguments); + Printf(f->code, "varargs = PyTuple_GetSlice(args, %d, PyTuple_Size(args));\n", num_fixed_arguments); } - Printf(f->code, "resultobj = %s__varargs__(%s,newargs,varargs);\n", wname, builtin ? "self" : "NULL"); + Printf(f->code, "resultobj = %s__varargs__(%s, newargs, varargs%s);\n", wname, builtin ? "self" : "NULL", strlen(builtin_kwargs) == 0 ? "" : ", kwargs"); Append(f->code, "Py_XDECREF(newargs);\n"); Append(f->code, "Py_XDECREF(varargs);\n"); Append(f->code, "return resultobj;\n"); @@ -3411,8 +3452,6 @@ public: } Printf(setf->def, "SWIGINTERN int %s(PyObject *_val) {", varsetname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { - Replaceall(tm, "$source", "_val"); - Replaceall(tm, "$target", name); Replaceall(tm, "$input", "_val"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); @@ -3453,8 +3492,6 @@ public: Append(getf->code, " (void)self;\n"); } if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$source", name); - Replaceall(tm, "$target", "pyobj"); Replaceall(tm, "$result", "pyobj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); @@ -3534,8 +3571,6 @@ public: } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(const_code, "%s,\n", tm); Delete(tm); @@ -3550,8 +3585,6 @@ public: } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (needs_swigconstant(n) && !builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER)) && (!in_class || !Getattr(n, "feature:python:callback"))) { // Generate `*_swigconstant()` method which registers the new constant. @@ -3563,7 +3596,7 @@ public: // class type (the SWIG_init() is called before shadow classes are // defined and registered). Printf(f_wrappers, "SWIGINTERN PyObject *%s_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", iname); - Printf(f_wrappers, tab2 "PyObject *module;\n", tm); + Printf(f_wrappers, tab2 "PyObject *module;\n"); Printf(f_wrappers, tab2 "PyObject *d;\n"); Printf(f_wrappers, tab2 "if (!SWIG_Python_UnpackTuple(args, \"swigconstant\", 1, 1, &module)) return NULL;\n"); Printf(f_wrappers, tab2 "d = PyModule_GetDict(module);\n"); @@ -3973,7 +4006,7 @@ public: if (GetFlag(mgetset, "static")) { Printf(f, "static PyGetSetDef %s_def = %s;\n", gspair, entry); Printf(f_init, "static_getset = SwigPyStaticVar_new_getset(metatype, &%s_def);\n", gspair); - Printf(f_init, "PyDict_SetItemString(d, static_getset->d_getset->name, (PyObject *) static_getset);\n", memname); + Printf(f_init, "PyDict_SetItemString(d, static_getset->d_getset->name, (PyObject *) static_getset);\n"); Printf(f_init, "Py_DECREF(static_getset);\n"); } else { Printf(getset_def, " %s,\n", entry); @@ -4129,6 +4162,13 @@ public: Printv(f, "#if PY_VERSION_HEX >= 0x03040000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_finalize"), "tp_finalize", "destructor"); Printv(f, "#endif\n", NIL); + Printv(f, "#if PY_VERSION_HEX >= 0x03080000\n", NIL); + printSlot(f, getSlot(n, "feature:python:tp_vectorcall"), "tp_vectorcall", "vectorcallfunc"); + Printv(f, "#endif\n", NIL); + Printv(f, "#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)\n", NIL); + printSlot(f, getSlot(), "tp_print"); + Printv(f, "#endif\n", NIL); + Printv(f, "#ifdef COUNT_ALLOCS\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_allocs"), "tp_allocs", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_frees"), "tp_frees", "Py_ssize_t"); @@ -4256,6 +4296,10 @@ public: // struct _dictkeysobject *ht_cached_keys; printSlot(f, getSlot(n, "feature:python:ht_cached_keys"), "ht_cached_keys"); Printv(f, "#endif\n", NIL); + + Printv(f, "#if PY_VERSION_HEX >= 0x03090000\n", NIL); + printSlot(f, getSlot(n, "feature:python:ht_module"), "ht_module", "PyObject *"); + Printv(f, "#endif\n", NIL); Printf(f, "};\n\n"); String *clientdata = NewString(""); @@ -4411,7 +4455,9 @@ public: Printf(f_shadow, "(Exception)"); } else { Printf(f_shadow, "(object"); - Printf(f_shadow, py3 && GetFlag(n, "feature:python:nondynamic") ? ", metaclass=_SwigNonDynamicMeta" : "", ")"); + if (py3 && GetFlag(n, "feature:python:nondynamic")) { + Printf(f_shadow, ", metaclass=_SwigNonDynamicMeta"); + } Printf(f_shadow, ")"); } } @@ -4819,6 +4865,7 @@ public: String *classname = Swig_class_name(parent); String *rclassname = Swig_class_name(getCurrentClass()); assert(rclassname); + (void)rclassname; String *parms = make_pyParmList(n, true, false, allow_kwargs); /* Pass 'self' only if using director */ diff --git a/Source/Modules/r.cxx b/Source/Modules/r.cxx index bb43dad48..99db2275f 100644 --- a/Source/Modules/r.cxx +++ b/Source/Modules/r.cxx @@ -36,11 +36,6 @@ static String * getRTypeName(SwigType *t, int *outCount = NULL) { if(Strncmp(b, "struct ", 7) == 0) Replace(b, "struct ", "", DOH_REPLACE_FIRST); - /* Printf(stdout, " %s,base = %s\n", t, b); - for(i = 0; i < Len(els); i++) - Printf(stdout, "%d) %s, ", i, Getitem(els,i)); - Printf(stdout, "\n"); */ - for(i = 0; i < Len(els); i++) { String *el = Getitem(els, i); if(Strcmp(el, "p.") == 0 || Strncmp(el, "a(", 2) == 0) { @@ -56,13 +51,6 @@ static String * getRTypeName(SwigType *t, int *outCount = NULL) { Insert(tmp, 0, retName); return tmp; - /* - if(count) - return(b); - - Delete(b); - return(NewString("")); - */ } /* -------------------------------------------------------------- @@ -101,7 +89,6 @@ static String *getRClassName(String *retType, int deRef=0, int upRef=0) { static String * getRClassNameCopyStruct(String *retType, int addRef) { String *tmp = NewString(""); -#if 1 List *l = SwigType_split(retType); int n = Len(l); if(!l || n == 0) { @@ -127,24 +114,6 @@ static String * getRClassNameCopyStruct(String *retType, int addRef) { } } -#else - char *retName = Char(SwigType_manglestr(retType)); - if(!retName) - return(tmp); - - if(addRef) { - while(retName && strlen(retName) > 1 && - strncmp(retName, "_p", 2) == 0) { - retName += 2; - Printf(tmp, "Ref"); - } - } - - if(retName[0] == '_') - retName ++; - Insert(tmp, 0, retName); -#endif - return tmp; } @@ -285,12 +254,7 @@ protected: int generateCopyRoutines(Node *n); int DumpCode(Node *n); - int OutputMemberReferenceMethod(String *className, int isSet, List *el, File *out); - int OutputArrayMethod(String *className, List *el, File *out); - int OutputClassMemberTable(Hash *tb, File *out); - int OutputClassMethodsTable(File *out); - int OutputClassAccessInfo(Hash *tb, File *out); - + int OutputMemberReferenceMethod(String *className, int isSet, List *memberList, List *nameList, List *typeList, File *out); int defineArrayAccessors(SwigType *type); void addNamespaceFunction(String *name) { @@ -334,10 +298,14 @@ protected: void addAccessor(String *memberName, Wrapper *f, - String *name, int isSet = -1); + String *name, String *methodSetGet); static int getFunctionPointerNumArgs(Node *n, SwigType *tt); + // filtering of class member lists by function type. Used in constructing accessors + // are we allowed to use stl style functors to customise this? + List* filterMemberList(List *class_member_function_types, List *class_member_other, String *R_MEMBER, bool equal); + protected: bool copyStruct; bool memoryProfile; @@ -367,11 +335,18 @@ protected: String *member_name; String *class_name; + String *R_MEMBER_NORMAL; + String *R_MEMBER_SET; + String *R_MEMBER_GET; int processing_class_member_function; - List *class_member_functions; - List *class_member_set_functions; - + // Spread out the lists so that they are simpler to process + // by storing the type of the method (i.e. set, get or nothing) + // and having separate lists for name, membername and wrapper + List *class_member_function_types; + List *class_member_function_names; + List *class_member_function_membernames; + List *class_member_function_wrappernames; /* */ Hash *ClassMemberTable; Hash *ClassMethodsTable; @@ -429,9 +404,14 @@ R::R() : processing_member_access_function(0), member_name(0), class_name(0), + R_MEMBER_NORMAL(NewString("normal")), + R_MEMBER_SET(NewString("set")), + R_MEMBER_GET(NewString("get")), processing_class_member_function(0), - class_member_functions(0), - class_member_set_functions(0), + class_member_function_types(0), + class_member_function_names(0), + class_member_function_membernames(0), + class_member_function_wrappernames(0), ClassMemberTable(0), ClassMethodsTable(0), SClassDefs(0), @@ -510,7 +490,7 @@ String * R::createFunctionPointerHandler(SwigType *t, Node *n, int *numArgs) { SwigType *funcparams = SwigType_functionpointer_decompose(rettype); String *rtype = SwigType_str(rettype, 0); - // ParmList *parms = Getattr(n, "parms"); + // ParmList *parms = Getattr(n, "parms"); // memory leak ParmList *parms = SwigType_function_parms(SwigType_del_pointer(Copy(t)), n); @@ -654,7 +634,6 @@ String * R::createFunctionPointerHandler(SwigType *t, Node *n, int *numArgs) { if(returnTM) { String *tm = returnTM; Replaceall(tm,"$input", "r_swig_cb_data->retValue"); - Replaceall(tm,"$target", Swig_cresult_name()); replaceRClass(tm, rettype); Replaceall(tm,"$owner", "0"); Replaceall(tm,"$disown","0"); @@ -720,18 +699,6 @@ void R::init() { } - -#if 0 -int R::cDeclaration(Node *n) { - SwigType *t = Getattr(n, "type"); - SwigType *name = Getattr(n, "name"); - if (debugMode) - Printf(stdout, "cDeclaration (%s): %s\n", name, SwigType_lstr(t, 0)); - return Language::cDeclaration(n); -} -#endif - - /* ------------------------------------------------------------- * Method from Language that is called to start the entire * processing off, i.e. the generation of the code. @@ -755,6 +722,8 @@ int R::top(Node *n) { Swig_register_filebyname("snamespace", s_namespace); Printf(s_namespace, "useDynLib(%s)\n", DllName); } + // Register the naming functions + Swig_name_register("wrapper", "R_swig_%f"); /* Associate the different streams with names so that they can be used in %insert directives by the typemap code. */ @@ -888,7 +857,33 @@ int R::DumpCode(Node *n) { } +List *R::filterMemberList(List *class_member_types, + List *class_member_other, + String *R_MEMBER, bool equal) { + // filters class_member_other based on whether corresponding elements of + // class_member_function_types are equal or notequal to R_MEMBER + List *CM = NewList(); + Iterator ftype, other; + for (ftype = First(class_member_types), other = First(class_member_other); + ftype.item; + ftype=Next(ftype), other=Next(other)) { + // verbose, clean up later if the overall structure works + if (equal) { + if (ftype.item == R_MEMBER) { + Append(CM, other.item); + } + } else { + if (ftype.item != R_MEMBER) { + Append(CM, other.item); + } + } + } + return(CM); +} + +# if 0 +// not called /* ------------------------------------------------------------- * We may need to do more.... so this is left as a * stub for the moment. @@ -975,9 +970,6 @@ int R::OutputClassMemberTable(Hash *tb, File *out) { isSet = strcmp(ptr, "_set") == 0; } - // OutputArrayMethod(className, el, out); - OutputMemberReferenceMethod(className, isSet, el, out); - if(outputNamespaceInfo) Printf(s_namespace, "\"%s\"%s", className, i < n-1 ? "," : ""); } @@ -988,6 +980,8 @@ int R::OutputClassMemberTable(Hash *tb, File *out) { return n; } +// end not used +#endif /* -------------------------------------------------------------- * Write the methods for $ or $<- for accessing a member field in an * struct or union (or class). @@ -1000,9 +994,10 @@ int R::OutputClassMemberTable(Hash *tb, File *out) { * out - the stream where we write the code. * --------------------------------------------------------------*/ -int R::OutputMemberReferenceMethod(String *className, int isSet, - List *el, File *out) { - int numMems = Len(el), j; +int R::OutputMemberReferenceMethod(String *className, int isSet, + List *memberList, List *nameList, + List *typeList, File *out) { + int numMems = Len(memberList), j; int varaccessor = 0; if (numMems == 0) return SWIG_OK; @@ -1017,13 +1012,12 @@ int R::OutputMemberReferenceMethod(String *className, int isSet, Node *itemList = NewHash(); bool has_prev = false; - for(j = 0; j < numMems; j+=3) { - String *item = Getitem(el, j); - String *dup = Getitem(el, j + 1); - char *ptr = Char(dup); - ptr = &ptr[Len(dup) - 3]; + for(j = 0; j < numMems; j++) { + String *item = Getitem(memberList, j); + String *dup = Getitem(nameList, j); + String *setgetmethod = Getitem(typeList, j); - if (!strcmp(ptr, "get")) + if (setgetmethod == R_MEMBER_GET) varaccessor++; if (Getattr(itemList, item)) @@ -1053,30 +1047,20 @@ int R::OutputMemberReferenceMethod(String *className, int isSet, if (!isSet && varaccessor > 0) { Printf(f->code, "%svaccessors = c(", tab8); - int first = 1; - for(j = 0; j < numMems; j+=3) { - String *item = Getitem(el, j); - String *dup = Getitem(el, j + 1); - char *ptr = Char(dup); - ptr = &ptr[Len(dup) - 3]; + bool first = true; + for(j = 0; j < numMems; j++) { + String *item = Getitem(memberList, j); + String *setgetmethod = Getitem(typeList, j); - if (!strcmp(ptr, "get")) { + // Check the type here instead of the name + if (setgetmethod == R_MEMBER_GET) { Printf(f->code, "%s'%s'", first ? "" : ", ", item); - first = 0; + first = false; } } Printf(f->code, ");\n"); } - - /* Printv(f->code, tab8, - "idx = pmatch(name, names(accessorFuns))\n", - tab8, - "if(is.na(idx)) {\n", - tab8, tab4, - "stop(\"No ", (isSet ? "modifiable" : "accessible"), " field named \", name, \" in ", className, - ": fields are \", paste(names(accessorFuns), sep = \", \")", - ")", "\n}\n", NIL); */ Printv(f->code, ";", tab8, "idx = pmatch(name, names(accessorFuns));\n", tab8, @@ -1098,8 +1082,8 @@ int R::OutputMemberReferenceMethod(String *className, int isSet, } Printf(f->code, "}\n"); - - Printf(out, "# Start of accessor method for %s\n", className); + String *classname_str = SwigType_namestr(className); + Printf(out, "# Start of accessor method for %s\n", classname_str); Printf(out, "setMethod('$%s', '_p%s', ", isSet ? "<-" : "", getRClassName(className)); @@ -1115,54 +1099,15 @@ int R::OutputMemberReferenceMethod(String *className, int isSet, Printf(out, ");\n"); } + Printf(out, "# end of accessor method for %s\n", classname_str); + + Delete(classname_str); DelWrapper(attr); DelWrapper(f); - Printf(out, "# end of accessor method for %s\n", className); - return SWIG_OK; } -/* ------------------------------------------------------------- - * Write the methods for [ or [<- for accessing a member field in an - * struct or union (or class). - * className - the name of the struct or union (e.g. Bar for struct Bar) - * el - a list of length 2 * # accessible member elements + 1. - * The first element is the name of the class. - * The other pairs are member name and the name of the R function to access it. - * out - the stream where we write the code. - * --------------------------------------------------------------*/ - -int R::OutputArrayMethod(String *className, List *el, File *out) { - int numMems = Len(el), j; - - if(!el || numMems == 0) - return(0); - - Printf(out, "# start of array methods for %s\n", className); - for(j = 0; j < numMems; j+=3) { - String *item = Getitem(el, j); - String *dup = Getitem(el, j + 1); - if (!Strcmp(item, "__getitem__")) { - Printf(out, - "setMethod('[', '_p%s', function(x, i, j, ..., drop =TRUE) ", - getRClassName(className)); - Printf(out, " sapply(i, function (n) %s(x, as.integer(n-1))))\n\n", dup); - } - if (!Strcmp(item, "__setitem__")) { - Printf(out, "setMethod('[<-', '_p%s', function(x, i, j, ..., value)", - getRClassName(className)); - Printf(out, " sapply(1:length(i), function(n) %s(x, as.integer(i[n]-1), value[n])))\n\n", dup); - } - - } - - Printf(out, "# end of array methods for %s\n", className); - - return SWIG_OK; -} - - /* ------------------------------------------------------------- * Called when a enumeration is to be processed. * We want to call the R function defineEnumeration(). @@ -1207,7 +1152,6 @@ int R::enumDeclaration(Node *n) { Printf(enum_def_calls, "defineEnumeration(\"%s\",\n .values=c(%s))\n\n", ename, enum_values); Delete(enum_values); Delete(ename); - //Delete(symname); } return SWIG_OK; } @@ -1335,31 +1279,21 @@ int R::variableWrapper(Node *n) { * --------------------------------------------------------------*/ void R::addAccessor(String *memberName, Wrapper *wrapper, String *name, - int isSet) { - if(isSet < 0) { - int n = Len(name); - char *ptr = Char(name); - if (n>4) { - isSet = Strcmp(NewString(&ptr[n-4]), "_set") == 0; - } + String *methodSetGet) { + + if (!class_member_function_names) { + class_member_function_names = NewList(); + class_member_function_membernames = NewList(); + class_member_function_wrappernames = NewList(); + class_member_function_types = NewList(); } - - List *l = isSet ? class_member_set_functions : class_member_functions; - - if(!l) { - l = NewList(); - if(isSet) - class_member_set_functions = l; - else - class_member_functions = l; - } - - Append(l, memberName); - Append(l, name); - + Append(class_member_function_types, methodSetGet); + Append(class_member_function_names, name); + Append(class_member_function_membernames, memberName); + String *tmp = NewString(""); Wrapper_print(wrapper, tmp); - Append(l, tmp); + Append(class_member_function_wrappernames, tmp); // if we could put the wrapper in directly: Append(l, Copy(sfun)); if (debugMode) Printf(stdout, "Adding accessor: %s (%s) => %s\n", memberName, name, tmp); @@ -1367,13 +1301,14 @@ void R::addAccessor(String *memberName, Wrapper *wrapper, String *name, #define MAX_OVERLOAD 256 +namespace { struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ }; - +} List * R::Swig_overload_rank(Node *n, bool script_lang_wrapping) { @@ -1390,11 +1325,6 @@ List * R::Swig_overload_rank(Node *n, c = Getattr(c,"sym:nextSibling"); continue; } - /* if (SmartPointer && Getattr(c,"cplus:staticbase")) { - c = Getattr(c,"sym:nextSibling"); - continue; - } */ - /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ @@ -1815,14 +1745,9 @@ int R::functionWrapper(Node *n) { /* Add the name of this member to a list for this class_name. We will dump all these at the end. */ - int n = Len(iname); - char *ptr = Char(iname); - bool isSet(0); - if (n > 4) isSet = Strcmp(NewString(&ptr[n-4]), "_set") == 0; + bool isSet = GetFlag(n, "memberset") ? true : false; - - String *tmp = NewString(""); - Printf(tmp, "%s_%s", class_name, isSet ? "set" : "get"); + String *tmp = NewString(isSet ? Swig_name_set(NSPACE_TODO, class_name) : Swig_name_get(NSPACE_TODO, class_name)); List *memList = Getattr(ClassMemberTable, tmp); if(!memList) { @@ -1839,7 +1764,7 @@ int R::functionWrapper(Node *n) { int nargs; String *wname = Swig_name_wrapper(iname); - Replace(wname, "_wrap", "R_swig", DOH_REPLACE_FIRST); + if(overname) Append(wname, overname); Setattr(n,"wrap:name", wname); @@ -1859,11 +1784,6 @@ int R::functionWrapper(Node *n) { if(!isVoidReturnType) addCopyParam = addCopyParameter(rtype); - - // Can we get the nodeType() of the type node! and see if it is a struct. - // int addCopyParam = SwigType_isclass(rtype); - - // if(addCopyParam) if (debugMode) Printf(stdout, "Adding a .copy argument to %s for %s = %s\n", iname, type, addCopyParam ? "yes" : "no"); @@ -1978,7 +1898,7 @@ int R::functionWrapper(Node *n) { name, " = getNativeSymbolInfo(", name, ");", "\n};\n", "if(is(", name, ", \"NativeSymbolInfo\")) {\n", - name, " = ", name, "$address", ";\n}\n", + name, " = ", name, "$address", ";\n};\n", "if(is(", name, ", \"ExternalReference\")) {\n", name, " = ", name, "@ref;\n}\n", "}; \n", @@ -1992,8 +1912,6 @@ int R::functionWrapper(Node *n) { if ((tm = Getattr(p,"tmap:scheck"))) { - Replaceall(tm,"$target", lname); - Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); replaceRClass(tm, Getattr(p, "type")); Printf(sfun->code,"%s\n",tm); @@ -2004,8 +1922,6 @@ int R::functionWrapper(Node *n) { curP = p; if ((tm = Getattr(p,"tmap:in"))) { - Replaceall(tm,"$target", lname); - Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); if (Getattr(p,"wrap:disown") || (Getattr(p,"tmap:in:disown"))) { @@ -2064,8 +1980,9 @@ int R::functionWrapper(Node *n) { String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Printv(cleanup, tm, "\n", NIL); + if (tm && (Len(tm) != 0)) { + Printv(cleanup, tm, "\n", NIL); + } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); @@ -2079,7 +1996,6 @@ int R::functionWrapper(Node *n) { // String *lname = Getattr(p, "lname"); numOutArgs++; String *pos = NewStringf("%d", numOutArgs); - Replaceall(tm,"$source", Getattr(p, "lname")); Replaceall(tm,"$result", "r_ans"); Replaceall(tm,"$n", pos); // The position into which to store the answer. Replaceall(tm,"$arg", Getattr(p, "emit:input")); @@ -2112,18 +2028,7 @@ int R::functionWrapper(Node *n) { Replaceall(tm,"$owner", "0"); } -#if 0 - if(addCopyParam) { - Printf(f->code, "if(LOGICAL(s_swig_copy)[0]) {\n"); - Printf(f->code, "/* Deal with returning a reference. */\nr_ans = R_NilValue;\n"); - Printf(f->code, "}\n else {\n"); - } -#endif Printf(f->code, "%s\n", tm); -#if 0 - if(addCopyParam) - Printf(f->code, "}\n"); /* end of if(s_swig_copy) ... else { ... } */ -#endif } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, @@ -2157,20 +2062,20 @@ int R::functionWrapper(Node *n) { } /* Output cleanup code */ - Printv(f->code, cleanup, NIL); - Delete(cleanup); + int need_cleanup = Len(cleanup) != 0; + if (need_cleanup) { + Printv(f->code, cleanup, NIL); + } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } @@ -2179,7 +2084,6 @@ int R::functionWrapper(Node *n) { /*If the user gave us something to convert the result in */ if ((tm = Swig_typemap_lookup("scoerceout", n, Swig_cresult_name(), sfun))) { - Replaceall(tm,"$source","ans"); Replaceall(tm,"$result","ans"); if (constructor) { Node * parent = Getattr(n, "parentNode"); @@ -2207,7 +2111,7 @@ int R::functionWrapper(Node *n) { { String *finalizer = NewString(iname); Replace(finalizer, "new_", "", DOH_REPLACE_FIRST); - Printf(sfun->code, "reg.finalizer(ans@ref, delete_%s)\n", finalizer); + Printf(sfun->code, "reg.finalizer(ans@ref, delete_%s);\n", finalizer); } Printf(sfun->code, "ans\n"); } @@ -2215,7 +2119,18 @@ int R::functionWrapper(Node *n) { if (destructor) Printv(f->code, "R_ClearExternalPtr(self);\n", NIL); - Printv(f->code, "return r_ans;\n}\n", NIL); + Printv(f->code, "return r_ans;\n", NIL); + + /* Error handling code */ + Printv(f->code, "fail: SWIGUNUSED;\n", NIL); + if (need_cleanup) { + Printv(f->code, cleanup, NIL); + } + Printv(f->code, " Rf_error(\"%s %s\", SWIG_ErrorType(SWIG_lasterror_code), SWIG_lasterror_msg);\n", NIL); + Printv(f->code, " return R_NilValue;\n", NIL); + Delete(cleanup); + + Printv(f->code, "}\n", NIL); Printv(sfun->code, "\n}", NIL); /* Substitute the function name */ @@ -2261,7 +2176,13 @@ int R::functionWrapper(Node *n) { Would like to be able to do this so that we can potentially insert */ if(processing_member_access_function || processing_class_member_function) { - addAccessor(member_name, sfun, iname); + String *method_type = R_MEMBER_NORMAL; + if (GetFlag(n, "memberset")) { + method_type = R_MEMBER_SET; + } else if (GetFlag(n, "memberget")) { + method_type = R_MEMBER_GET; + } + addAccessor(member_name, sfun, iname, method_type); } if (Getattr(n, "sym:overloaded") && @@ -2455,20 +2376,49 @@ int R::classDeclaration(Node *n) { opaqueClassDeclaration = NULL; - // OutputArrayMethod(name, class_member_functions, sfile); - if (class_member_functions) - OutputMemberReferenceMethod(name, 0, class_member_functions, sfile); - if (class_member_set_functions) - OutputMemberReferenceMethod(name, 1, class_member_set_functions, sfile); + if (class_member_function_types) { - if(class_member_functions) { - Delete(class_member_functions); - class_member_functions = NULL; - } - if(class_member_set_functions) { - Delete(class_member_set_functions); - class_member_set_functions = NULL; - } + // collect the "set" methods + List *class_set_membernames = filterMemberList(class_member_function_types, + class_member_function_membernames, R_MEMBER_SET, true); + List *class_set_functionnames = filterMemberList(class_member_function_types, + class_member_function_names, R_MEMBER_SET, true); + // this one isn't used - collecting to keep code simpler + List *class_set_functiontypes = filterMemberList(class_member_function_types, + class_member_function_types, R_MEMBER_SET, true); + + // collect the others + List *class_other_membernames = filterMemberList(class_member_function_types, + class_member_function_membernames, R_MEMBER_SET, false); + List *class_other_functionnames = filterMemberList(class_member_function_types, + class_member_function_names, R_MEMBER_SET, false); + List *class_other_functiontypes = filterMemberList(class_member_function_types, + class_member_function_types, R_MEMBER_SET, false); + + if (Len(class_other_membernames) > 0) { + OutputMemberReferenceMethod(name, 0, class_other_membernames, class_other_functionnames, class_other_functiontypes, sfile); + } + if (Len(class_set_membernames) > 0) { + OutputMemberReferenceMethod(name, 1, class_set_membernames, class_set_functionnames, class_set_functiontypes, sfile); + } + Delete(class_set_membernames); + Delete(class_set_functionnames); + Delete(class_set_functiontypes); + Delete(class_other_membernames); + Delete(class_other_functionnames); + Delete(class_other_functiontypes); + } + + if (class_member_function_types) { + Delete(class_member_function_types); + class_member_function_types = NULL; + Delete(class_member_function_names); + class_member_function_names = NULL; + Delete(class_member_function_membernames); + class_member_function_membernames = NULL; + Delete(class_member_function_wrappernames); + class_member_function_wrappernames = NULL; + } if (Getattr(n, "has_destructor")) { Printf(sfile, "setMethod('delete', '_p%s', function(obj) {delete%s(obj)})\n", getRClassName(name), getRClassName(name)); @@ -2494,9 +2444,6 @@ int R::classDeclaration(Node *n) { c = nextSibling(c); continue; } -#if 0 - tp = getRType(c); -#else tp = Swig_typemap_lookup("rtype", c, "", 0); if(!tp) { c = nextSibling(c); @@ -2523,7 +2470,7 @@ int R::classDeclaration(Node *n) { // returns "" tp = processType(elType, c, NULL); // Printf(stdout, " elType %p\n", elType); // tp = getRClassNameCopyStruct(Getattr(c, "type"), 1); -#endif + String *elNameT = replaceInitialDash(elName); Printf(def, "%s%s = \"%s\"", tab8, elNameT, tp); firstItem = false; @@ -2884,10 +2831,6 @@ String * R::processType(SwigType *t, Node *n, int *nargs) { return tmp; } -#if 0 - SwigType_isfunction(t) && SwigType_ispointer(t) -#endif - return NULL; } diff --git a/Source/Modules/ruby.cxx b/Source/Modules/ruby.cxx index 6a1e16d5d..ec4a75dbd 100644 --- a/Source/Modules/ruby.cxx +++ b/Source/Modules/ruby.cxx @@ -116,6 +116,7 @@ public: /* flags for the make_autodoc function */ +namespace { enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, @@ -127,6 +128,7 @@ enum autodoc_t { AUTODOC_SETTER, AUTODOC_NONE }; +} static const char *usage = "\ Ruby Options (available with -ruby)\n\ @@ -1425,16 +1427,14 @@ public: * applyInputTypemap() * * Look up the appropriate "in" typemap for this parameter (p), - * substitute the correct strings for the $target and $input typemap - * parameters, and dump the resulting code to the wrapper file. + * substitute the correct strings for the typemap parameters, and dump the + * resulting code to the wrapper file. * --------------------------------------------------------------------- */ - Parm *applyInputTypemap(Parm *p, String *ln, String *source, Wrapper *f, String *symname) { + Parm *applyInputTypemap(Parm *p, String *source, Wrapper *f, String *symname) { String *tm; SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:in"))) { - Replaceall(tm, "$target", ln); - Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Replaceall(tm, "$symname", symname); @@ -1474,10 +1474,8 @@ public: Parm *p; String *tm; String *source; - String *target; source = NewString(""); - target = NewString(""); bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); @@ -1498,7 +1496,6 @@ public: p = skipIgnoredArgs(p); String *pn = Getattr(p, "name"); - String *ln = Getattr(p, "lname"); /* Produce string representation of source argument */ Clear(source); @@ -1510,10 +1507,6 @@ public: Printf(source, "argv[%d]", i - start); } - /* Produce string representation of target argument */ - Clear(target); - Printf(target, "%s", Char(ln)); - if (i >= (numreq)) { /* Check if parsing an optional argument */ Printf(f->code, " if (argc > %d) {\n", i - start); } @@ -1526,7 +1519,7 @@ public: } /* Look for an input typemap */ - p = applyInputTypemap(p, ln, source, f, Getattr(n, "name")); + p = applyInputTypemap(p, source, f, Getattr(n, "name")); if (i >= numreq) { Printf(f->code, "}\n"); } @@ -1553,7 +1546,6 @@ public: } Delete(source); - Delete(target); } /* --------------------------------------------------------------------- @@ -1569,7 +1561,6 @@ public: String *tm; for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -1591,7 +1582,6 @@ public: for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { - Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); @@ -1613,8 +1603,6 @@ public: String *tm; for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); - Replaceall(tm, "$target", "vresult"); Replaceall(tm, "$result", "vresult"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -1876,8 +1864,6 @@ public: actioncode = 0; if (tm) { Replaceall(tm, "$result", "vresult"); - Replaceall(tm, "$source", Swig_cresult_name()); - Replaceall(tm, "$target", "vresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); @@ -1975,7 +1961,6 @@ public: if (current != CONSTRUCTOR_ALLOCATE && GetFlag(n, "feature:new")) { tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); Delete(tm); } @@ -1984,7 +1969,6 @@ public: /* Special processing on return value. */ tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); if (tm) { - Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, NIL); Delete(tm); } @@ -2191,6 +2175,12 @@ public: String *tm; String *getfname, *setfname; Wrapper *getf, *setf; + const int assignable = is_assignable(n); + + // Determine whether virtual global variables shall be used + // which have different getter and setter signatures, + // see https://docs.ruby-lang.org/en/2.6.0/extension_rdoc.html#label-Global+Variables+Shared+Between+C+and+Ruby + const bool use_virtual_var = (current == NO_CPP && useGlobalModule); getf = NewWrapper(); setf = NewWrapper(); @@ -2201,15 +2191,13 @@ public: getfname = Swig_name_wrapper(getname); Setattr(n, "wrap:name", getfname); Printv(getf->def, "SWIGINTERN VALUE\n", getfname, "(", NIL); - Printf(getf->def, "VALUE self"); + Printf(getf->def, (use_virtual_var) ? "ID id, VALUE *data" : "VALUE self"); Printf(getf->def, ") {"); Wrapper_add_local(getf, "_val", "VALUE _val"); tm = Swig_typemap_lookup("varout", n, name, 0); if (tm) { Replaceall(tm, "$result", "_val"); - Replaceall(tm, "$target", "_val"); - Replaceall(tm, "$source", name); /* Printv(getf->code,tm, NIL); */ addfail = emit_action_code(n, getf->code, tm); } else { @@ -2224,8 +2212,8 @@ public: Wrapper_print(getf, f_wrappers); - if (!is_assignable(n)) { - setfname = NewString("NULL"); + if (!assignable) { + setfname = NewString("(rb_gvar_setter_t *)NULL"); } else { /* create setter */ String* docs = docstring(n, AUTODOC_SETTER); @@ -2235,40 +2223,45 @@ public: String *setname = Swig_name_set(NSPACE_TODO, iname); setfname = Swig_name_wrapper(setname); Setattr(n, "wrap:name", setfname); - Printv(setf->def, "SWIGINTERN VALUE\n", setfname, "(VALUE self, ", NIL); - Printf(setf->def, "VALUE _val) {"); + Printf(setf->def, "SWIGINTERN "); + if (use_virtual_var) { + Printv(setf->def, "void\n", setfname, "(VALUE _val, ID id, VALUE *data) {", NIL); + } else { + Printv(setf->def, "VALUE\n", setfname, "(VALUE self, VALUE _val) {", NIL); + } tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { Replaceall(tm, "$input", "_val"); - Replaceall(tm, "$source", "_val"); - Replaceall(tm, "$target", name); /* Printv(setf->code,tm,"\n",NIL); */ emit_action_code(n, setf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s\n", SwigType_str(t, 0)); } - Printv(setf->code, tab4, "return _val;\n", NIL); - Printf(setf->code, "fail:\n"); - Printv(setf->code, tab4, "return Qnil;\n", NIL); + if (use_virtual_var) { + Printf(setf->code, "fail:\n"); + Printv(setf->code, tab4, "return;\n", NIL); + } else { + Printv(setf->code, tab4, "return _val;\n", NIL); + Printf(setf->code, "fail:\n"); + Printv(setf->code, tab4, "return Qnil;\n", NIL); + } Printf(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); Delete(setname); } - /* define accessor method */ - if (CPlusPlus) { - Insert(getfname, 0, "VALUEFUNC("); - Append(getfname, ")"); - Insert(setfname, 0, "VALUEFUNC("); - Append(setfname, ")"); - } + /* define accessor methods */ + Insert(getfname, 0, "VALUEFUNC("); + Append(getfname, ")"); + Insert(setfname, 0, (use_virtual_var) ? "SWIG_RUBY_VOID_ANYARGS_FUNC(" : "VALUEFUNC("); + Append(setfname, ")"); String *s = NewString(""); switch (current) { case STATIC_VAR: /* C++ class variable */ Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "\", ", getfname, ", 0);\n", NIL); - if (!GetFlag(n, "feature:immutable")) { + if (assignable) { Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "=\", ", setfname, ", 1);\n", NIL); } Printv(klass->init, s, NIL); @@ -2279,14 +2272,11 @@ public: assert(current == NO_CPP); if (!useGlobalModule) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "\", ", getfname, ", 0);\n", NIL); - if (!GetFlag(n, "feature:immutable")) { + if (assignable) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "=\", ", setfname, ", 1);\n", NIL); } } else { - Printv(s, tab4, "rb_define_global_method(\"", iname, "\", ", getfname, ", 0);\n", NIL); - if (!GetFlag(n, "feature:immutable")) { - Printv(s, tab4, "rb_define_global_method(\"", iname, "=\", ", setfname, ", 1);\n", NIL); - } + Printv(s, tab4, "rb_define_virtual_variable(\"$", iname, "\", ", getfname, ", ", setfname, ");\n", NIL); } Printv(f_init, s, NIL); Delete(s); @@ -2353,8 +2343,6 @@ public: if (!tm) tm = Swig_typemap_lookup("constcode", n, value, 0); if (tm) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", iname); Replaceall(tm, "$symname", iname); Replaceall(tm, "$value", value); if (current == CLASS_CONST) { diff --git a/Source/Modules/s-exp.cxx b/Source/Modules/s-exp.cxx deleted file mode 100644 index fe3b1facc..000000000 --- a/Source/Modules/s-exp.cxx +++ /dev/null @@ -1,402 +0,0 @@ -/* ----------------------------------------------------------------------------- - * This file is part of SWIG, which is licensed as a whole under version 3 - * (or any later version) of the GNU General Public License. Some additional - * terms also apply to certain portions of SWIG. The full details of the SWIG - * license and copyrights can be found in the LICENSE and COPYRIGHT files - * included with the SWIG source code as distributed by the SWIG developers - * and at http://www.swig.org/legal.html. - * - * s-exp.cxx - * - * A parse tree represented as Lisp s-expressions. - * ----------------------------------------------------------------------------- */ - -#include "swigmod.h" -#include "dohint.h" - -static const char *usage = "\ -S-Exp Options (available with -sexp)\n\ - -typemaplang - Typemap language\n\n"; - -//static Node *view_top = 0; -static File *out = 0; - -class Sexp:public Language { - int indent_level; - DOHHash *print_circle_hash; - int print_circle_count; - int hanging_parens; - bool need_whitespace; - bool need_newline; - -public: - Sexp(): - indent_level(0), - print_circle_hash(0), - print_circle_count(0), - hanging_parens(0), - need_whitespace(0), - need_newline(0) { - } - - virtual ~ Sexp() { - } - - virtual void main(int argc, char *argv[]) { - // Add a symbol to the parser for conditional compilation - Preprocessor_define("SWIGSEXP 1", 0); - - SWIG_typemap_lang("sexp"); - for (int iX = 0; iX < argc; iX++) { - if (strcmp(argv[iX], "-typemaplang") == 0) { - Swig_mark_arg(iX); - iX++; - SWIG_typemap_lang(argv[iX]); - Swig_mark_arg(iX); - continue; - } - if (strcmp(argv[iX], "-help") == 0) { - fputs(usage, stdout); - } - } - } - - /* Top of the parse tree */ - virtual int top(Node *n) { - if (out == 0) { - String *outfile = Getattr(n, "outfile"); - Replaceall(outfile, "_wrap.cxx", ".lisp"); - Replaceall(outfile, "_wrap.c", ".lisp"); - out = NewFile(outfile, "w", SWIG_output_files()); - if (!out) { - FileErrorDisplay(outfile); - SWIG_exit(EXIT_FAILURE); - } - } - String *f_sink = NewString(""); - Swig_register_filebyname("header", f_sink); - Swig_register_filebyname("wrapper", f_sink); - Swig_register_filebyname("begin", f_sink); - Swig_register_filebyname("runtime", f_sink); - Swig_register_filebyname("init", f_sink); - - Swig_banner_target_lang(out, ";;;"); - - Language::top(n); - Printf(out, "\n"); - Printf(out, ";;; Lisp parse tree produced by SWIG\n"); - print_circle_hash = NewHash(); - print_circle_count = 0; - hanging_parens = 0; - need_whitespace = 0; - need_newline = 0; - Sexp_print_node(n); - flush_parens(); - return SWIG_OK; - } - - void print_indent() { - int i; - for (i = 0; i < indent_level; i++) { - Printf(out, " "); - } - } - - void open_paren(const String *oper) { - flush_parens(); - Printf(out, "("); - if (oper) - Printf(out, "%s ", oper); - indent_level += 2; - } - - void close_paren(bool neednewline = false) { - hanging_parens++; - if (neednewline) - print_lazy_whitespace(); - indent_level -= 2; - } - - void flush_parens() { - int i; - if (hanging_parens) { - for (i = 0; i < hanging_parens; i++) - Printf(out, ")"); - hanging_parens = 0; - need_newline = true; - need_whitespace = true; - } - if (need_newline) { - Printf(out, "\n"); - print_indent(); - need_newline = false; - need_whitespace = false; - } else if (need_whitespace) { - Printf(out, " "); - need_whitespace = false; - } - } - - void print_lazy_whitespace() { - need_whitespace = 1; - } - - void print_lazy_newline() { - need_newline = 1; - } - - bool internal_key_p(DOH *key) { - return ((Cmp(key, "nodeType") == 0) - || (Cmp(key, "firstChild") == 0) - || (Cmp(key, "lastChild") == 0) - || (Cmp(key, "parentNode") == 0) - || (Cmp(key, "nextSibling") == 0) - || (Cmp(key, "previousSibling") == 0) - || (Cmp(key, "csym:nextSibling") == 0) - || (Cmp(key, "csym:previousSibling") == 0) - || (Cmp(key, "typepass:visit") == 0) - || (Cmp(key, "allocate:visit") == 0) - || (*(Char(key)) == '$')); - } - - bool boolean_key_p(DOH *key) { - return ((Cmp(key, "allocate:default_constructor") == 0) - || (Cmp(key, "allocate:default_destructor") == 0) - || (Cmp(key, "allows_typedef") == 0) - || (Cmp(key, "feature:immutable") == 0)); - } - - bool list_key_p(DOH *key) { - return ((Cmp(key, "parms") == 0) - || (Cmp(key, "baselist") == 0)); - } - - bool plist_key_p(DOH *key) - // true if KEY is the name of data that is a mapping from keys to - // values, which should be printed as a plist. - { - return ((Cmp(key, "typescope") == 0)); - } - - bool maybe_plist_key_p(DOH *key) { - return (Strncmp(key, "tmap:", 5) == 0); - } - - bool print_circle(DOH *obj, bool list_p) - // We have a complex object, which might be referenced several - // times, or even recursively. Use Lisp's reader notation for - // circular structures (#n#, #n=). - // - // An object can be printed in list-mode or object-mode; LIST_P toggles. - // return TRUE if OBJ still needs to be printed - { - flush_parens(); - // Following is a silly hack. It works around the limitation of - // DOH's hash tables that only work with string keys! - char address[32]; - sprintf(address, "%p%c", obj, list_p ? 'L' : 'O'); - DOH *placeholder = Getattr(print_circle_hash, address); - if (placeholder) { - Printv(out, placeholder, NIL); - return false; - } else { - String *placeholder = NewStringf("#%d#", ++print_circle_count); - Setattr(print_circle_hash, address, placeholder); - Printf(out, "#%d=", print_circle_count); - return true; - } - } - - void Sexp_print_value_of_key(DOH *value, DOH *key) { - if ((Cmp(key, "parms") == 0) || (Cmp(key, "wrap:parms") == 0) - || (Cmp(key, "kwargs") == 0) || (Cmp(key, "pattern") == 0)) - Sexp_print_parms(value); - else if (plist_key_p(key)) - Sexp_print_plist(value); - else if (maybe_plist_key_p(key)) { - if (DohIsMapping(value)) - Sexp_print_plist(value); - else - Sexp_print_doh(value); - } else if (list_key_p(key)) - Sexp_print_list(value); - else if (boolean_key_p(key)) - Sexp_print_boolean(value); - else - Sexp_print_doh(value); - } - - void Sexp_print_boolean(DOH *obj) { - flush_parens(); - /* See DOH/Doh/base.c, DohGetInt() */ - if (DohIsString(obj)) { - if (atoi(Char(obj)) != 0) - Printf(out, "t"); - else - Printf(out, "nil"); - } else - Printf(out, "nil"); - } - - void Sexp_print_list(DOH *obj) { - if (print_circle(obj, true)) { - open_paren(NIL); - for (; obj; obj = nextSibling(obj)) { - Sexp_print_doh(obj); - print_lazy_whitespace(); - } - close_paren(true); - } - } - - void Sexp_print_parms(DOH *obj) { - // print it as a list of plists - if (print_circle(obj, true)) { - open_paren(NIL); - for (; obj; obj = nextSibling(obj)) { - if (DohIsMapping(obj)) { - Iterator k; - open_paren(NIL); - for (k = First(obj); k.key; k = Next(k)) { - if (!internal_key_p(k.key)) { - DOH *value = Getattr(obj, k.key); - Sexp_print_as_keyword(k.key); - Sexp_print_value_of_key(value, k.key); - print_lazy_whitespace(); - } - } - close_paren(true); - } else - Sexp_print_doh(obj); - print_lazy_whitespace(); - } - close_paren(true); - } - } - - void Sexp_print_doh(DOH *obj) { - flush_parens(); - if (DohIsString(obj)) { - String *o = Str(obj); - Replaceall(o, "\\", "\\\\"); - Replaceall(o, "\"", "\\\""); - Printf(out, "\"%s\"", o); - Delete(o); - } else { - if (print_circle(obj, false)) { - // Dispatch type - if (nodeType(obj)) { - Sexp_print_node(obj); - } - - else if (DohIsMapping(obj)) { - Iterator k; - open_paren(NIL); - for (k = First(obj); k.key; k = Next(k)) { - if (!internal_key_p(k.key)) { - DOH *value = Getattr(obj, k.key); - flush_parens(); - open_paren(NIL); - Sexp_print_doh(k.key); - Printf(out, " . "); - Sexp_print_value_of_key(value, k.key); - close_paren(); - } - } - close_paren(); - } else if (strcmp(ObjType(obj)->objname, "List") == 0) { - int i; - open_paren(NIL); - for (i = 0; i < Len(obj); i++) { - DOH *item = Getitem(obj, i); - Sexp_print_doh(item); - } - close_paren(); - } else { - // What is it? - Printf(out, "#", ObjType(obj)->objname, obj); - } - } - } - } - - void Sexp_print_as_keyword(const DOH *k) { - /* Print key, replacing ":" with "-" because : is CL's package prefix */ - flush_parens(); - String *key = NewString(k); - Replaceall(key, ":", "-"); - Replaceall(key, "_", "-"); - Printf(out, ":%s ", key); - Delete(key); - } - - void Sexp_print_plist_noparens(DOH *obj) { - /* attributes map names to objects */ - Iterator k; - bool first; - for (k = First(obj), first = true; k.key; k = Next(k), first = false) { - if (!internal_key_p(k.key)) { - DOH *value = Getattr(obj, k.key); - flush_parens(); - if (!first) { - Printf(out, " "); - } - Sexp_print_as_keyword(k.key); - /* Print value */ - Sexp_print_value_of_key(value, k.key); - } - } - } - - void Sexp_print_plist(DOH *obj) { - flush_parens(); - if (print_circle(obj, true)) { - open_paren(NIL); - Sexp_print_plist_noparens(obj); - close_paren(); - } - } - - void Sexp_print_attributes(Node *obj) { - Sexp_print_plist_noparens(obj); - } - - void Sexp_print_node(Node *obj) { - Node *cobj; - open_paren(nodeType(obj)); - /* A node has an attribute list... */ - Sexp_print_attributes(obj); - /* ... and child nodes. */ - cobj = firstChild(obj); - if (cobj) { - print_lazy_newline(); - flush_parens(); - Sexp_print_as_keyword("children"); - open_paren(NIL); - for (; cobj; cobj = nextSibling(cobj)) { - Sexp_print_node(cobj); - } - close_paren(); - } - close_paren(); - } - - - virtual int functionWrapper(Node *n) { - ParmList *l = Getattr(n, "parms"); - Wrapper *f = NewWrapper(); - emit_attach_parmmaps(l, f); - Setattr(n, "wrap:parms", l); - DelWrapper(f); - return SWIG_OK; - } - -}; - - -static Language *new_swig_sexp() { - return new Sexp(); -} -extern "C" Language *swig_sexp(void) { - return new_swig_sexp(); -} diff --git a/Source/Modules/scilab.cxx b/Source/Modules/scilab.cxx index 23e45f787..697284a77 100644 --- a/Source/Modules/scilab.cxx +++ b/Source/Modules/scilab.cxx @@ -472,7 +472,6 @@ public: String *tm; if ((tm = Getattr(param, "tmap:freearg"))) { if (tm && (Len(tm) != 0)) { - Replaceall(tm, "$source", Getattr(param, "lname")); Printf(wrapper->code, "%s\n", tm); } param = Getattr(param, "tmap:freearg:next"); @@ -484,7 +483,6 @@ public: /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", node, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(wrapper->code, "%s\n", tm); Delete(tm); } diff --git a/Source/Modules/swigmain.cxx b/Source/Modules/swigmain.cxx index ba710c0ce..ef2bf6a2b 100644 --- a/Source/Modules/swigmain.cxx +++ b/Source/Modules/swigmain.cxx @@ -165,7 +165,7 @@ static void merge_options_files(int *argc, char ***argv) { i = 1; while (i < new_argc) { if (new_argv[i] && new_argv[i][0] == '@' && (f = fopen(&new_argv[i][1], "r"))) { - char c; + int ci; char *b; char *be = &buffer[BUFFER_SIZE]; int quote = 0; @@ -176,7 +176,8 @@ static void merge_options_files(int *argc, char ***argv) { insert = i; b = buffer; - while ((c = fgetc(f)) != EOF) { + while ((ci = fgetc(f)) != EOF) { + const char c = static_cast(ci); if (escape) { if (b != be) { *b = c; diff --git a/Source/Modules/swigmod.h b/Source/Modules/swigmod.h index 583cb13fe..bfb93d1a7 100644 --- a/Source/Modules/swigmod.h +++ b/Source/Modules/swigmod.h @@ -371,7 +371,6 @@ struct TargetLanguageModule { int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm); void emit_parameter_variables(ParmList *l, Wrapper *f); void emit_return_variable(Node *n, SwigType *rt, Wrapper *f); -void SWIG_exit(int); /* use EXIT_{SUCCESS,FAILURE} */ void SWIG_config_file(const_String_or_char_ptr ); const String *SWIG_output_directory(); void SWIG_config_cppext(const char *ext); diff --git a/Source/Modules/tcl8.cxx b/Source/Modules/tcl8.cxx index 7a78ede9b..fcf36d17d 100644 --- a/Source/Modules/tcl8.cxx +++ b/Source/Modules/tcl8.cxx @@ -336,8 +336,6 @@ public: if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { - Replaceall(tm, "$target", ln); - Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); @@ -401,7 +399,6 @@ public: /* Insert constraint checking code */ for (p = parms; p;) { if ((tm = Getattr(p, "tmap:check"))) { - Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { @@ -414,7 +411,6 @@ public: if (!checkAttribute(p, "tmap:in:numinputs", "0") && !Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { - Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); @@ -426,12 +422,9 @@ public: /* Insert argument output code */ for (i = 0, p = parms; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { - Replaceall(tm, "$source", Getattr(p, "lname")); #ifdef SWIG_USE_RESULTOBJ - Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else - Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif Replaceall(tm, "$arg", Getattr(p, "emit:input")); @@ -450,12 +443,9 @@ public: /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { - Replaceall(tm, "$source", Swig_cresult_name()); #ifdef SWIG_USE_RESULTOBJ - Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else - Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif if (GetFlag(n, "feature:new")) { @@ -478,13 +468,11 @@ public: /* Look for any remaining cleanup */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { - Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } #ifdef SWIG_USE_RESULTOBJ @@ -580,8 +568,6 @@ public: Printv(getf->def, "SWIGINTERN const char *", getfname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2, int flags) {", NIL); Wrapper_add_local(getf, "value", "Tcl_Obj *value = 0"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { - Replaceall(tm, "$source", name); - Replaceall(tm, "$target", "value"); Replaceall(tm, "$result", "value"); /* Printf(getf->code, "%s\n",tm); */ addfail = emit_action_code(n, getf->code, tm); @@ -616,8 +602,6 @@ public: Wrapper_add_local(setf, "name1o", "Tcl_Obj *name1o = 0"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { - Replaceall(tm, "$source", "value"); - Replaceall(tm, "$target", name); Replaceall(tm, "$input", "value"); Printf(setf->code, "name1o = Tcl_NewStringObj(name1,-1);\n"); Printf(setf->code, "value = Tcl_ObjGetVar2(interp, name1o, 0, flags);\n"); @@ -690,14 +674,10 @@ public: } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(const_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); diff --git a/Source/Modules/typepass.cxx b/Source/Modules/typepass.cxx index 57125fcbb..dc84cf94a 100644 --- a/Source/Modules/typepass.cxx +++ b/Source/Modules/typepass.cxx @@ -267,6 +267,8 @@ class TypePass:private Dispatcher { and smart pointer to base class, so that smart pointer upcasts are automatically generated. */ SwigType *bsmart = Copy(smart); + + // TODO: SwigType_typedef_resolve_all on a String instead of SwigType is incorrect for templates SwigType *rclsname = SwigType_typedef_resolve_all(clsname); SwigType *rbname = SwigType_typedef_resolve_all(bname); int replace_count = Replaceall(bsmart, rclsname, rbname); @@ -276,6 +278,12 @@ class TypePass:private Dispatcher { String *firstname = Getattr(first, "name"); Replaceall(bsmart, firstname, rbname); } + // The code above currently creates a smartptr of the base class by substitution, replacing Derived + // with Base resulting in something like: 'smartptr< Derived >' from 'smartptr< Base >'. Instead + // the feature:smartptr should be used as it also contains 'smartptr< Base >' as specified by the user. + // A similar fix should also be done in upcastsCode in java.cxx, csharp.cxx and writeClassUpcast in d.cxx. + // Printf(stdout, "smartcomparison %s <=> %s\n", SwigType_namestr(bsmart), Getattr(bclass, "feature:smartptr")); + Delete(rclsname); Delete(rbname); String *smartnamestr = SwigType_namestr(smart); @@ -961,7 +969,7 @@ class TypePass:private Dispatcher { if (Getattr(c, "sym:overloaded") != checkoverloaded) { Printf(stdout, "sym:overloaded error c:%p checkoverloaded:%p\n", c, checkoverloaded); Swig_print_node(c); - exit (1); + SWIG_exit(EXIT_FAILURE); } String *decl = Strcmp(nodeType(c), "using") == 0 ? NewString("------") : Getattr(c, "decl"); @@ -969,7 +977,7 @@ class TypePass:private Dispatcher { if (!Getattr(c, "sym:overloaded")) { Printf(stdout, "sym:overloaded error.....%p\n", c); Swig_print_node(c); - exit (1); + SWIG_exit(EXIT_FAILURE); } c = Getattr(c, "sym:nextSibling"); } diff --git a/Source/Modules/uffi.cxx b/Source/Modules/uffi.cxx deleted file mode 100644 index 10a53a561..000000000 --- a/Source/Modules/uffi.cxx +++ /dev/null @@ -1,405 +0,0 @@ -/* ----------------------------------------------------------------------------- - * This file is part of SWIG, which is licensed as a whole under version 3 - * (or any later version) of the GNU General Public License. Some additional - * terms also apply to certain portions of SWIG. The full details of the SWIG - * license and copyrights can be found in the LICENSE and COPYRIGHT files - * included with the SWIG source code as distributed by the SWIG developers - * and at http://www.swig.org/legal.html. - * - * uffi.cxx - * - * Uffi language module for SWIG. - * ----------------------------------------------------------------------------- */ - -// TODO: remove remnants of lisptype - -#include "swigmod.h" - -static const char *usage = "\ -UFFI Options (available with -uffi)\n\ - -identifier-converter - \n\ - Specifies the type of conversion to do on C identifiers\n\ - to convert them to symbols. There are two built-in\n\ - converters: 'null' and 'lispify'. The default is\n\ - 'null'. If you supply a name other than one of the\n\ - built-ins, then a function by that name will be\n\ - called to convert identifiers to symbols.\n\ -"; - -class UFFI:public Language { -public: - - virtual void main(int argc, char *argv[]); - virtual int top(Node *n); - virtual int functionWrapper(Node *n); - virtual int constantWrapper(Node *n); - virtual int classHandler(Node *n); - virtual int membervariableHandler(Node *n); - -}; - -static File *f_cl = 0; - -static struct { - int count; - String **entries; -} defined_foreign_types; - -static String *identifier_converter = NewString("identifier-convert-null"); - -static int any_varargs(ParmList *pl) { - Parm *p; - - for (p = pl; p; p = nextSibling(p)) { - if (SwigType_isvarargs(Getattr(p, "type"))) - return 1; - } - - return 0; -} - - -/* utilities */ -/* returns new string w/ parens stripped */ -static String *strip_parens(String *string) { - char *s = Char(string), *p; - int len = Len(string); - String *res; - - if (len == 0 || s[0] != '(' || s[len - 1] != ')') { - return NewString(string); - } - - p = (char *) malloc(len - 2 + 1); - if (!p) { - Printf(stderr, "Malloc failed\n"); - SWIG_exit(EXIT_FAILURE); - } - - strncpy(p, s + 1, len - 1); - p[len - 2] = 0; /* null terminate */ - - res = NewString(p); - free(p); - - return res; -} - - -static String *convert_literal(String *num_param, String *type) { - String *num = strip_parens(num_param), *res; - char *s = Char(num); - - /* Make sure doubles use 'd' instead of 'e' */ - if (!Strcmp(type, "double")) { - String *updated = Copy(num); - if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { - Printf(stderr, "Weird!! number %s looks invalid.\n", num); - SWIG_exit(EXIT_FAILURE); - } - Delete(num); - return updated; - } - - if (SwigType_type(type) == T_CHAR) { - /* Use CL syntax for character literals */ - return NewStringf("#\\%s", num_param); - } else if (SwigType_type(type) == T_STRING) { - /* Use CL syntax for string literals */ - return NewStringf("\"%s\"", num_param); - } - - if (Len(num) < 2 || s[0] != '0') { - return num; - } - - /* octal or hex */ - - res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); - Delete(num); - - return res; -} - -static void add_defined_foreign_type(String *type) { - if (!defined_foreign_types.count) { - /* Make fresh */ - defined_foreign_types.count = 1; - defined_foreign_types.entries = (String **) malloc(sizeof(String *)); - } else { - /* make room */ - defined_foreign_types.count++; - defined_foreign_types.entries = (String **) - realloc(defined_foreign_types.entries, defined_foreign_types.count * sizeof(String *)); - } - - if (!defined_foreign_types.entries) { - Printf(stderr, "Out of memory\n"); - SWIG_exit(EXIT_FAILURE); - } - - /* Fill in the new data */ - defined_foreign_types.entries[defined_foreign_types.count - 1] = Copy(type); - -} - - -static String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { - Node *node = NewHash(); - Setattr(node, "type", ty); - Setattr(node, "name", name); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *tm = Swig_typemap_lookup("ffitype", node, "", 0); - Delete(node); - - if (tm) { - return NewString(tm); - } else { - SwigType *tr = SwigType_typedef_resolve_all(ty); - char *type_reduced = Char(tr); - int i; - - //Printf(stdout,"convert_type %s\n", ty); - if (SwigType_isconst(tr)) { - SwigType_pop(tr); - type_reduced = Char(tr); - } - - if (SwigType_ispointer(type_reduced) || SwigType_isarray(ty) || !strncmp(type_reduced, "p.f", 3)) { - return NewString(":pointer-void"); - } - - for (i = 0; i < defined_foreign_types.count; i++) { - if (!Strcmp(ty, defined_foreign_types.entries[i])) { - return NewStringf("#.(%s \"%s\" :type :type)", identifier_converter, ty); - } - } - - if (!Strncmp(type_reduced, "enum ", 5)) { - return NewString(":int"); - } - - Printf(stderr, "Unsupported data type: %s (was: %s)\n", type_reduced, ty); - SWIG_exit(EXIT_FAILURE); - } - return 0; -} - -static String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { - Node *node = NewHash(); - Setattr(node, "type", ty); - Setattr(node, "name", name); - Setfile(node, Getfile(n)); - Setline(node, Getline(n)); - const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); - Delete(node); - - return tm ? NewString(tm) : NewString(""); -} - -void UFFI::main(int argc, char *argv[]) { - int i; - - Preprocessor_define("SWIGUFFI 1", 0); - SWIG_library_directory("uffi"); - SWIG_config_file("uffi.swg"); - - - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-identifier-converter")) { - char *conv = argv[i + 1]; - - if (!conv) - Swig_arg_error(); - - Swig_mark_arg(i); - Swig_mark_arg(i + 1); - i++; - - /* check for built-ins */ - if (!strcmp(conv, "lispify")) { - Delete(identifier_converter); - identifier_converter = NewString("identifier-convert-lispify"); - } else if (!strcmp(conv, "null")) { - Delete(identifier_converter); - identifier_converter = NewString("identifier-convert-null"); - } else { - /* Must be user defined */ - Delete(identifier_converter); - identifier_converter = NewString(conv); - } - } - - if (!strcmp(argv[i], "-help")) { - Printf(stdout, "%s\n", usage); - } - } -} - -int UFFI::top(Node *n) { - String *module = Getattr(n, "name"); - String *output_filename = NewString(""); - File *f_null = NewString(""); - - Printf(output_filename, "%s%s.cl", SWIG_output_directory(), module); - - - f_cl = NewFile(output_filename, "w", SWIG_output_files()); - if (!f_cl) { - FileErrorDisplay(output_filename); - SWIG_exit(EXIT_FAILURE); - } - - Swig_register_filebyname("header", f_null); - Swig_register_filebyname("begin", f_null); - Swig_register_filebyname("runtime", f_null); - Swig_register_filebyname("wrapper", f_cl); - - Swig_banner_target_lang(f_cl, ";;"); - - Printf(f_cl, "\n" - ";; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; package: %s -*-\n\n(defpackage :%s\n (:use :common-lisp :uffi))\n\n(in-package :%s)\n", - module, module, module); - Printf(f_cl, "(eval-when (compile load eval)\n (defparameter *swig-identifier-converter* '%s))\n", identifier_converter); - - Language::top(n); - - Delete(f_cl); // Delete the handle, not the file - Delete(f_null); - - return SWIG_OK; -} - -int UFFI::functionWrapper(Node *n) { - String *funcname = Getattr(n, "sym:name"); - ParmList *pl = Getattr(n, "parms"); - Parm *p; - int argnum = 0, first = 1; -// int varargs = 0; - - //Language::functionWrapper(n); - - Printf(f_cl, "(swig-defun \"%s\"\n", funcname); - Printf(f_cl, " ("); - - /* Special cases */ - - if (ParmList_len(pl) == 0) { - Printf(f_cl, ":void"); - } else if (any_varargs(pl)) { - Printf(f_cl, "#| varargs |#"); -// varargs = 1; - } else { - for (p = pl; p; p = nextSibling(p), argnum++) { - String *argname = Getattr(p, "name"); - SwigType *argtype = Getattr(p, "type"); - String *ffitype = get_ffi_type(n, argtype, argname); - String *lisptype = get_lisp_type(n, argtype, argname); - int tempargname = 0; - - if (!argname) { - argname = NewStringf("arg%d", argnum); - tempargname = 1; - } - - if (!first) { - Printf(f_cl, "\n "); - } - Printf(f_cl, "(%s %s %s)", argname, ffitype, lisptype); - first = 0; - - Delete(ffitype); - Delete(lisptype); - if (tempargname) - Delete(argname); - - } - } - Printf(f_cl, ")\n"); /* finish arg list */ - Printf(f_cl, " :returning %s\n" - //" :strings-convert t\n" - //" :call-direct %s\n" - //" :optimize-for-space t" - ")\n", get_ffi_type(n, Getattr(n, "type"), Swig_cresult_name()) - //,varargs ? "nil" : "t" - ); - - - return SWIG_OK; -} - -int UFFI::constantWrapper(Node *n) { - String *type = Getattr(n, "type"); - String *converted_value = convert_literal(Getattr(n, "value"), type); - String *name = Getattr(n, "sym:name"); - -#if 0 - Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); -#endif - - Printf(f_cl, "(swig-defconstant \"%s\" %s)\n", name, converted_value); - - Delete(converted_value); - - return SWIG_OK; -} - -// Includes structs -int UFFI::classHandler(Node *n) { - - String *name = Getattr(n, "sym:name"); - String *kind = Getattr(n, "kind"); - Node *c; - - if (Strcmp(kind, "struct")) { - Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); - Printf(stderr, " (name: %s)\n", name); - SWIG_exit(EXIT_FAILURE); - } - - Printf(f_cl, "(swig-def-struct \"%s\"\n \n", name); - - for (c = firstChild(n); c; c = nextSibling(c)) { - SwigType *type = Getattr(c, "type"); - SwigType *decl = Getattr(c, "decl"); - if (type) { - type = Copy(type); - SwigType_push(type, decl); - String *lisp_type; - - if (Strcmp(nodeType(c), "cdecl")) { - Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); - Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); - SWIG_exit(EXIT_FAILURE); - } - - /* Printf(stdout, "Converting %s in %s\n", type, name); */ - lisp_type = get_ffi_type(n, type, Getattr(c, "sym:name")); - - Printf(f_cl, " (#.(%s \"%s\" :type :slot) %s)\n", identifier_converter, Getattr(c, "sym:name"), lisp_type); - - Delete(lisp_type); - } - } - - // Language::classHandler(n); - - Printf(f_cl, " )\n"); - - /* Add this structure to the known lisp types */ - //Printf(stdout, "Adding %s foreign type\n", name); - add_defined_foreign_type(name); - - return SWIG_OK; -} - -int UFFI::membervariableHandler(Node *n) { - Language::membervariableHandler(n); - return SWIG_OK; -} - - -extern "C" Language *swig_uffi(void) { - return new UFFI(); -} diff --git a/Source/Preprocessor/cpp.c b/Source/Preprocessor/cpp.c index 557b5482b..75bec61fd 100644 --- a/Source/Preprocessor/cpp.c +++ b/Source/Preprocessor/cpp.c @@ -113,7 +113,7 @@ static int is_digits(const String *str) { const char *s = Char(str); int isdigits = (*s != 0); while (*s) { - if (!isdigit(*s)) { + if (!isdigit((int)*s)) { isdigits = 0; break; } diff --git a/Source/README b/Source/README index 814ec45bd..088933308 100644 --- a/Source/README +++ b/Source/README @@ -13,13 +13,3 @@ SWIG Source directory Source/Modules - Language modules. Source/Include - Include files. - -Historic directories which may be in CVS, but have been removed: - - Source/Modules1.1 - Old SWIG-1.1 modules. Empty. - - Source/LParse - Experimental parser. Officially dead - as CParse is more capable. - - Source/SWIG1.1 - Old SWIG1.1 core. Completely empty now. - diff --git a/Source/Swig/fragment.c b/Source/Swig/fragment.c index 5b30e86e0..4ec26f955 100644 --- a/Source/Swig/fragment.c +++ b/Source/Swig/fragment.c @@ -29,7 +29,7 @@ static int debug = 0; * Swig_fragment_register() * * Add a fragment. Use the original Node*, so, if something needs to be - * changed, lang.cxx doesn't nedd to be touched again. + * changed, lang.cxx doesn't need to be touched again. * ----------------------------------------------------------------------------- */ void Swig_fragment_register(Node *fragment) { diff --git a/Source/Swig/getopt.c b/Source/Swig/getopt.c index 74076a5f0..6970dc177 100644 --- a/Source/Swig/getopt.c +++ b/Source/Swig/getopt.c @@ -16,7 +16,6 @@ * sure there are no unmarked options. * * TODO: - * - This module needs to be modified so that it doesn't call exit(). * Should have cleaner error handling in general. * ----------------------------------------------------------------------------- */ @@ -88,11 +87,11 @@ void Swig_check_options(int check_input) { } if (error) { Printf(stderr, "Use 'swig -help' for available options.\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); } if (check_input && marked[numargs - 1]) { Printf(stderr, "Must specify an input file. Use -help for available options.\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); } } @@ -105,5 +104,5 @@ void Swig_check_options(int check_input) { void Swig_arg_error(void) { Printf(stderr, "SWIG : Unable to parse command line options.\n"); Printf(stderr, "Use 'swig -help' for available options.\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); } diff --git a/Source/Swig/misc.c b/Source/Swig/misc.c index 6b071185b..ef6fcc02f 100644 --- a/Source/Swig/misc.c +++ b/Source/Swig/misc.c @@ -249,6 +249,19 @@ String *Swig_filename_escape(String *filename) { return adjusted_filename; } +/* ----------------------------------------------------------------------------- + * Swig_filename_escape() + * + * Escapes spaces in filename - for Makefiles + * ----------------------------------------------------------------------------- */ + +String *Swig_filename_escape_space(String *filename) { + String *adjusted_filename = Copy(filename); + Swig_filename_correct(adjusted_filename); + Replaceall(adjusted_filename, " ", "\\ "); + return adjusted_filename; +} + /* ----------------------------------------------------------------------------- * Swig_filename_unescape() * @@ -1177,7 +1190,7 @@ String *Swig_string_command(String *s) { pclose(fp); } else { Swig_error("SWIG", Getline(s), "Command encoder fails attempting '%s'.\n", s); - exit(1); + SWIG_exit(EXIT_FAILURE); } } #endif @@ -1327,7 +1340,8 @@ static int split_regex_pattern_subst(String *s, String **pattern, String **subst err_out: Swig_error("SWIG", Getline(s), "Invalid regex substitution: '%s'.\n", s); - exit(1); + SWIG_exit(EXIT_FAILURE); + return 0; } /* This function copies len characters from src to dst, possibly applying case conversions to them: if convertCase is 1, to upper case and if it is -1, to lower @@ -1449,7 +1463,7 @@ String *Swig_string_regex(String *s) { if (!compiled_pat) { Swig_error("SWIG", Getline(s), "PCRE compilation failed: '%s' in '%s':%i.\n", pcre_error, Char(pattern), pcre_errorpos); - exit(1); + SWIG_exit(EXIT_FAILURE); } rc = pcre_exec(compiled_pat, NULL, input, (int)strlen(input), 0, 0, captures, 30); if (rc >= 0) { @@ -1457,7 +1471,7 @@ String *Swig_string_regex(String *s) { } else if (rc != PCRE_ERROR_NOMATCH) { Swig_error("SWIG", Getline(s), "PCRE execution failed: error %d while matching \"%s\" using \"%s\".\n", rc, Char(pattern), input); - exit(1); + SWIG_exit(EXIT_FAILURE); } } @@ -1475,7 +1489,8 @@ String *Swig_pcre_version(void) { String *Swig_string_regex(String *s) { Swig_error("SWIG", Getline(s), "PCRE regex support not enabled in this SWIG build.\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); + return 0; } String *Swig_pcre_version(void) { diff --git a/Source/Swig/naming.c b/Source/Swig/naming.c index 1b6c963e7..1d78e7a47 100644 --- a/Source/Swig/naming.c +++ b/Source/Swig/naming.c @@ -1105,7 +1105,7 @@ static int name_regexmatch_value(Node *n, String *pattern, String *s) { Swig_error("SWIG", Getline(n), "Invalid regex \"%s\": compilation failed at %d: %s\n", Char(pattern), errpos, err); - exit(1); + SWIG_exit(EXIT_FAILURE); } rc = pcre_exec(compiled_pat, NULL, Char(s), Len(s), 0, 0, NULL, 0); @@ -1118,7 +1118,7 @@ static int name_regexmatch_value(Node *n, String *pattern, String *s) { Swig_error("SWIG", Getline(n), "Matching \"%s\" against regex \"%s\" failed: %d\n", Char(s), Char(pattern), rc); - exit(1); + SWIG_exit(EXIT_FAILURE); } return 1; @@ -1131,7 +1131,8 @@ static int name_regexmatch_value(Node *n, String *pattern, String *s) { (void)s; Swig_error("SWIG", Getline(n), "PCRE regex matching is not available in this SWIG build.\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); + return 0; } #endif /* HAVE_PCRE/!HAVE_PCRE */ diff --git a/Source/Swig/scanner.c b/Source/Swig/scanner.c index 908bc747f..e5a267ae5 100644 --- a/Source/Swig/scanner.c +++ b/Source/Swig/scanner.c @@ -833,7 +833,7 @@ static int look(Scanner *s) { return SWIG_TOKEN_MODEQUAL; } else if (c == '}') { Swig_error(cparse_file, cparse_line, "Syntax error. Extraneous '%%}'\n"); - exit(1); + SWIG_exit(EXIT_FAILURE); } else { retract(s, 1); return SWIG_TOKEN_PERCENT; diff --git a/Source/Swig/stype.c b/Source/Swig/stype.c index 66518f50c..5f876ff04 100644 --- a/Source/Swig/stype.c +++ b/Source/Swig/stype.c @@ -134,7 +134,7 @@ SwigType *NewSwigType(int t) { return NewString("double"); break; case T_COMPLEX: - return NewString("complex"); + return NewString("_Complex"); break; case T_CHAR: return NewString("char"); @@ -1291,11 +1291,29 @@ void SwigType_typename_replace(SwigType *t, String *pat, String *rep) { Replace(e, pat, rep, DOH_REPLACE_ANY); } else if (SwigType_istemplate(e)) { /* Replaces a type of the form 'pat' with 'rep' */ - if (Equal(e, pat)) { - String *repbase = SwigType_templateprefix(rep); - Replace(e, pat, repbase, DOH_REPLACE_ID | DOH_REPLACE_FIRST); - Delete(repbase); + { + /* To match "e=TemplateTemplateT<(float)>" + * with "pat=TemplateTemplateT" + * we need to compare only the first part of the string e. + */ + int len = Len(pat); + + /* Len(e) > len, not >= (because we expect at least a + * character '<' following the template typename) + */ + if (Len(e) > len) { + String *firstPartOfType = NewStringWithSize(e, len); + const char* e_as_char = Char(e); + + if (Equal(firstPartOfType, pat) && e_as_char[len] == '<') { + String *repbase = SwigType_templateprefix(rep); + Replace(e, pat, repbase, DOH_REPLACE_ID | DOH_REPLACE_FIRST); + Delete(repbase); + } + Delete(firstPartOfType); + } } + { String *tsuffix; List *tparms = SwigType_parmlist(e); diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h index 1acd32d5d..76691269e 100644 --- a/Source/Swig/swig.h +++ b/Source/Swig/swig.h @@ -315,6 +315,7 @@ extern int ParmList_is_compactdefargs(ParmList *p); extern String *Swig_new_subdirectory(String *basedirectory, String *subdirectory); extern void Swig_filename_correct(String *filename); extern String *Swig_filename_escape(String *filename); + extern String *Swig_filename_escape_space(String *filename); extern void Swig_filename_unescape(String *filename); extern int Swig_storage_isextern(Node *n); extern int Swig_storage_isexternc(Node *n); @@ -438,6 +439,7 @@ extern int ParmList_is_compactdefargs(ParmList *p); extern void Language_replace_special_variables(String *method, String *tm, Parm *parm); extern void Swig_print(DOH *object, int count); extern void Swig_print_with_location(DOH *object, int count); + extern void SWIG_exit(int exit_code); /* -- template init -- */ diff --git a/Source/Swig/typeobj.c b/Source/Swig/typeobj.c index 69fb6662b..9944a9eeb 100644 --- a/Source/Swig/typeobj.c +++ b/Source/Swig/typeobj.c @@ -404,6 +404,7 @@ SwigType *SwigType_del_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "r.", 2); assert(check == 0); + (void)check; Delslice(t, 0, 2); return t; } @@ -439,6 +440,7 @@ SwigType *SwigType_del_rvalue_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "z.", 2); assert(check == 0); + (void)check; Delslice(t, 0, 2); return t; } @@ -529,6 +531,7 @@ SwigType *SwigType_del_qualifier(SwigType *t) { char *c = Char(t); int check = strncmp(c, "q(", 2); assert(check == 0); + (void)check; Delslice(t, 0, element_size(c)); return t; } @@ -597,6 +600,7 @@ SwigType *SwigType_del_memberpointer(SwigType *t) { char *c = Char(t); int check = strncmp(c, "m(", 2); assert(check == 0); + (void)check; Delslice(t, 0, element_size(c)); return t; } @@ -641,6 +645,7 @@ SwigType *SwigType_del_array(SwigType *t) { char *c = Char(t); int check = strncmp(c, "a(", 2); assert(check == 0); + (void)check; Delslice(t, 0, element_size(c)); return t; } diff --git a/Source/Swig/typesys.c b/Source/Swig/typesys.c index 7564db1a6..d6d6bcc88 100644 --- a/Source/Swig/typesys.c +++ b/Source/Swig/typesys.c @@ -1453,11 +1453,11 @@ int SwigType_type(const SwigType *t) { return T_DOUBLE; if (strcmp(c, "long double") == 0) return T_LONGDOUBLE; - if (!cparse_cplusplus && (strcmp(c, "float complex") == 0)) + if (!cparse_cplusplus && (strcmp(c, "float _Complex") == 0)) return T_FLTCPLX; - if (!cparse_cplusplus && (strcmp(c, "double complex") == 0)) + if (!cparse_cplusplus && (strcmp(c, "double _Complex") == 0)) return T_DBLCPLX; - if (!cparse_cplusplus && (strcmp(c, "complex") == 0)) + if (!cparse_cplusplus && (strcmp(c, "_Complex") == 0)) return T_COMPLEX; if (strcmp(c, "void") == 0) return T_VOID; diff --git a/Tools/CI-linux-install.sh b/Tools/CI-linux-install.sh new file mode 100644 index 000000000..ab5b10ddb --- /dev/null +++ b/Tools/CI-linux-install.sh @@ -0,0 +1,135 @@ +#!/bin/bash +# expected to be called from elsewhere with certain variables set +# e.g. RETRY=travis-retry SWIGLANG=python GCC=7 +set -e # exit on failure (same as -o errexit) + +if [[ -n "$GCC" ]]; then + $RETRY sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + $RETRY sudo apt-get -qq update + $RETRY sudo apt-get install -qq g++-$GCC +fi + +$RETRY sudo apt-get -qq install libboost-dev libpcre3-dev +# testflags.py needs python +$RETRY sudo apt-get install -qq python + +WITHLANG=$SWIGLANG + +case "$SWIGLANG" in + "") ;; + "csharp") + $RETRY sudo apt-get -qq install mono-devel + ;; + "d") + $RETRY wget http://downloads.dlang.org/releases/2.x/${VER}/dmd_${VER}-0_amd64.deb + $RETRY sudo dpkg -i dmd_${VER}-0_amd64.deb + ;; + "go") + if [[ "$VER" ]]; then + eval "$(gimme ${VER}.x)" + fi + ;; + "javascript") + case "$ENGINE" in + "node") + $RETRY wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + $RETRY nvm install ${VER} + nvm use ${VER} + if [ "$VER" == "0.10" ] || [ "$VER" == "0.12" ] || [ "$VER" == "4" ] || [ "$VER" == "6" ] ; then +# $RETRY sudo apt-get install -qq nodejs node-gyp + $RETRY npm install -g node-gyp@$VER + elif [ "$VER" == "8" ] ; then + $RETRY npm install -g node-gyp@6 + elif [ "$VER" == "10" ] || [ "$VER" == "12" ] || [ "$VER" == "14" ] || [ "$VER" == "16" ]; then + $RETRY npm install -g node-gyp@7 + else + $RETRY npm install -g node-gyp + fi + ;; + "jsc") + $RETRY sudo apt-get install -qq libwebkitgtk-dev + ;; + "v8") + $RETRY sudo apt-get install -qq libv8-dev + ;; + esac + ;; + "guile") + $RETRY sudo apt-get -qq install guile-2.0-dev + ;; + "lua") + if [[ -z "$VER" ]]; then + $RETRY sudo apt-get -qq install lua5.2 liblua5.2-dev + else + $RETRY sudo apt-get -qq install lua${VER} liblua${VER}-dev + fi + ;; + "mzscheme") + $RETRY sudo apt-get -qq install racket + ;; + "ocaml") + $RETRY sudo apt-get -qq install ocaml camlp4 + ;; + "octave") + $RETRY sudo apt-get -qq install liboctave-dev + ;; + "php") + $RETRY sudo add-apt-repository -y ppa:ondrej/php + $RETRY sudo apt-get -qq update + $RETRY sudo apt-get -qq install php$VER-cli php$VER-dev + ;; + "python") + pip install --user pycodestyle + if [[ "$VER" ]]; then + $RETRY sudo add-apt-repository -y ppa:deadsnakes/ppa + $RETRY sudo apt-get -qq update + $RETRY sudo apt-get -qq install python${VER}-dev + WITHLANG=$SWIGLANG$PY3=$SWIGLANG$VER + else + $RETRY sudo apt-get install -qq python${PY3}-dev + WITHLANG=$SWIGLANG$PY3 + fi + ;; + "r") + $RETRY sudo apt-get -qq install r-base + ;; + "ruby") + if ! command -v rvm; then + case "$VER" in + 1.9 | 2.0 | 2.1 | 2.2 | 2.3 ) + $RETRY sudo apt-get -qq install libgdbm-dev libncurses5-dev libyaml-dev libssl1.0-dev + ;; + esac + # YOLO + curl -sSL https://rvm.io/mpapis.asc | gpg --import - + curl -sSL https://rvm.io/pkuczynski.asc | gpg --import - + curl -sSL https://get.rvm.io | bash -s stable + set +x + source $HOME/.rvm/scripts/rvm + set -x + fi + if [[ "$VER" == "2.7" || "$VER" == "3.0" ]]; then + # Ruby 2.7+ support is currently only rvm master (30 Dec 2019) + $RETRY rvm get master + rvm reload + rvm list known + fi + if [[ "$VER" ]]; then + $RETRY rvm install $VER + fi + ;; + "scilab") + # Travis has the wrong version of Java pre-installed resulting in error using scilab: + # /usr/bin/scilab-bin: error while loading shared libraries: libjava.so: cannot open shared object file: No such file or directory + echo "JAVA_HOME was set to $JAVA_HOME" + unset JAVA_HOME + $RETRY sudo apt-get -qq install scilab + ;; + "tcl") + $RETRY sudo apt-get -qq install tcl-dev + ;; +esac + +set +e # turn off exit on failure (same as +o errexit) diff --git a/Tools/GHA-linux-install.sh b/Tools/GHA-linux-install.sh new file mode 100644 index 000000000..ea2108fce --- /dev/null +++ b/Tools/GHA-linux-install.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +#lsb_release -a +# find location of current script (only works in bash) +script_dir="$( dirname "${BASH_SOURCE[0]}")" + +# run generic script +RETRY= +source "$script_dir"/CI-linux-install.sh diff --git a/Tools/brew-install b/Tools/brew-install index 408ae13bb..39fe22bc2 100755 --- a/Tools/brew-install +++ b/Tools/brew-install @@ -6,7 +6,7 @@ seconds=0 minutes=0 -brew install $1 & +brew install "$@" & while true; do ps -p$! 2>& 1>/dev/null if [ $? = 0 ]; then diff --git a/Tools/check-include-path.pike b/Tools/check-include-path.pike deleted file mode 100644 index 2bfb2b901..000000000 --- a/Tools/check-include-path.pike +++ /dev/null @@ -1,20 +0,0 @@ -/** - * This is a helper script to identify the proper include path - * for Pike header files. It should be run with the full path - * to the Pike executable as its single argument, e.g. - * - * pike check-include-path.pike /usr/local/bin/pike - * - * and its output should be the correct path to the header - * files, e.g. - * - * /usr/local/pike/7.2.239/include/pike - * - */ - -int main(int argc, array(string) argv) -{ - string prefix = replace(argv[1], "/bin/pike", ""); - write(prefix + "/pike/" + __MAJOR__ + "." + __MINOR__ + "." + __BUILD__ + "/include/pike"); - return 0; -} diff --git a/Tools/cmake/FindPCRE.cmake b/Tools/cmake/FindPCRE.cmake new file mode 100644 index 000000000..dbbd60ada --- /dev/null +++ b/Tools/cmake/FindPCRE.cmake @@ -0,0 +1,37 @@ +# Copyright (C) 2007-2009 LuaDist. +# Created by Peter Kapec +# Redistribution and use of this file is allowed according to the terms of the MIT license. +# For details see the COPYRIGHT file distributed with LuaDist. +# Note: +# Searching headers and libraries is very simple and is NOT as powerful as scripts +# distributed with CMake, because LuaDist defines directories to search for. +# Everyone is encouraged to contact the author with improvements. Maybe this file +# becomes part of CMake distribution sometimes. + +# - Find pcre +# Find the native PCRE headers and libraries. +# +# PCRE_INCLUDE_DIRS - where to find pcre.h, etc. +# PCRE_LIBRARIES - List of libraries when using pcre. +# PCRE_FOUND - True if pcre found. + +# Look for the header file. +FIND_PATH(PCRE_INCLUDE_DIR NAMES pcre.h) + +# Look for the library. +FIND_LIBRARY(PCRE_LIBRARY NAMES pcre) + +# Handle the QUIETLY and REQUIRED arguments and set PCRE_FOUND to TRUE if all listed variables are TRUE. +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE DEFAULT_MSG PCRE_LIBRARY PCRE_INCLUDE_DIR) + +# Copy the results to the output variables. +IF(PCRE_FOUND) + SET(PCRE_LIBRARIES ${PCRE_LIBRARY}) + SET(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR}) +ELSE(PCRE_FOUND) + SET(PCRE_LIBRARIES) + SET(PCRE_INCLUDE_DIRS) +ENDIF(PCRE_FOUND) + +MARK_AS_ADVANCED(PCRE_INCLUDE_DIRS PCRE_LIBRARIES) diff --git a/Tools/cmake/swigconfig.h.in b/Tools/cmake/swigconfig.h.in new file mode 100644 index 000000000..94cee1646 --- /dev/null +++ b/Tools/cmake/swigconfig.h.in @@ -0,0 +1,95 @@ +/* swigconfig.h. Generated by cmake from Tools/cmake/swigconfig.h.in */ + +/* define if the Boost library is available */ +#cmakedefine HAVE_BOOST 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `dl' library (-ldl). */ +#cmakedefine HAVE_LIBDL 1 + +/* Define to 1 if you have the `dld' library (-ldld). */ +#cmakedefine HAVE_LIBDLD 1 + +/* Define if you have PCRE library */ +#cmakedefine HAVE_PCRE 1 + +/* Define if popen is available */ +#cmakedefine HAVE_POPEN 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UNISTD_H 1 + +/* Name of package */ +#define PACKAGE "swig" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://www.swig.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "swig" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "swig @SWIG_VERSION@" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "swig" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "@SWIG_VERSION@" + +/* The size of `void *', as computed by sizeof. */ +/* #undef SIZEOF_VOID_P */ + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#cmakedefine STDC_HEADERS 1 + +/* Compiler that built SWIG */ +#define SWIG_CXX "@CMAKE_CXX_COMPILER@" + +/* Directory for SWIG system-independent libraries */ +#define SWIG_LIB "@CMAKE_INSTALL_PREFIX@/@SWIG_LIB@" + +/* Directory for SWIG system-independent libraries (Unix install on native + Windows) */ +#define SWIG_LIB_WIN_UNIX "@SWIG_LIB_WIN_UNIX@" + +/* Platform that SWIG is built for */ +#define SWIG_PLATFORM "@CMAKE_SYSTEM_NAME@" + +/* Version number of package */ +#define VERSION "@SWIG_VERSION@" + + +/* Deal with attempt by Microsoft to deprecate C standard runtime functions */ +#if defined(_MSC_VER) +# define _CRT_SECURE_NO_DEPRECATE +#endif + diff --git a/Tools/config/ac_compile_warnings.m4 b/Tools/config/ac_compile_warnings.m4 index 7e4239a3c..04f146387 100644 --- a/Tools/config/ac_compile_warnings.m4 +++ b/Tools/config/ac_compile_warnings.m4 @@ -34,7 +34,7 @@ AC_MSG_CHECKING([maximum warning verbosity option]) then if test "$GXX" = "yes" then - ac_compile_warnings_opt='-Wall -W -ansi -pedantic' + ac_compile_warnings_opt='-Wall -W -pedantic' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" @@ -44,7 +44,7 @@ AC_MSG_CHECKING([maximum warning verbosity option]) then if test "$GCC" = "yes" then - ac_compile_warnings_opt='-Wall -W -ansi -pedantic' + ac_compile_warnings_opt='-Wall -W -pedantic' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" diff --git a/Tools/config/ax_cxx_compile_stdcxx_11.m4 b/Tools/config/ax_cxx_compile_stdcxx_11.m4 deleted file mode 100644 index 138ca2aca..000000000 --- a/Tools/config/ax_cxx_compile_stdcxx_11.m4 +++ /dev/null @@ -1,121 +0,0 @@ -# ============================================================================ -# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html -# ============================================================================ -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX_11([ext|noext], [nostop]) -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the C++11 -# standard; if necessary, add switches to CXXFLAGS to enable support. -# CXX11FLAGS will also contain any necessary switches to enable support. -# HAVE_CXX11_COMPILER will additionally be set to yes if there is support. -# If the second argument is not specified, errors out if no mode that -# supports C++11 baseline syntax can be found. The first argument, if -# specified, indicates whether you insist on an extended mode -# (e.g. -std=gnu++11) or a strict conformance mode (e.g. -std=c++11). -# If neither is specified, you get whatever works, with preference for an -# extended mode. -# -# LICENSE -# -# Copyright (c) 2008 Benjamin Kosnik -# Copyright (c) 2012 Zack Weinberg -# Copyright (c) 2012 William Fulton -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 1 - -m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [ - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - typedef check> right_angle_brackets; - - int a; - decltype(a) b; - - typedef check check_type; - check_type c; - check_type&& cr = static_cast(c); -]) - -AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl - m4_if([$1], [], [], - [$1], [ext], [], - [$1], [noext], [], - [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl - m4_if([$2], [], [], - [$2], [nostop], [], - [m4_fatal([invalid argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl - AC_LANG_ASSERT([C++])dnl - ac_success=no - CXX11FLAGS= - AC_CACHE_CHECK(whether $CXX supports C++11 features by default, - ax_cv_cxx_compile_cxx11, - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], - [ax_cv_cxx_compile_cxx11=yes], - [ax_cv_cxx_compile_cxx11=no])]) - if test x$ax_cv_cxx_compile_cxx11 = xyes; then - ac_success=yes - fi - - m4_if([$1], [noext], [], [dnl - if test x$ac_success = xno; then - for switch in -std=gnu++11 -std=gnu++0x; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, - $cachevar, - [ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXXFLAGS="$ac_save_CXXFLAGS"]) - if eval test x\$$cachevar = xyes; then - CXXFLAGS="$CXXFLAGS $switch" - CXX11FLAGS=$switch - ac_success=yes - break - fi - done - fi]) - - m4_if([$1], [ext], [], [dnl - if test x$ac_success = xno; then - for switch in -std=c++11 -std=c++0x; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, - $cachevar, - [ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXXFLAGS="$ac_save_CXXFLAGS"]) - if eval test x\$$cachevar = xyes; then - CXXFLAGS="$CXXFLAGS $switch" - CXX11FLAGS=$switch - ac_success=yes - break - fi - done - fi]) - - if test x$ac_success = xno; then - if test x$2 != xnostop; then - AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) - fi - else - HAVE_CXX11_COMPILER=yes - fi -]) diff --git a/Tools/config/m4_ax_cxx_compile_stdcxx.m4 b/Tools/config/m4_ax_cxx_compile_stdcxx.m4 new file mode 100644 index 000000000..9413da624 --- /dev/null +++ b/Tools/config/m4_ax_cxx_compile_stdcxx.m4 @@ -0,0 +1,962 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for no added switch, and then for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# Copyright (c) 2016, 2018 Krzesimir Nowak +# Copyright (c) 2019 Enji Cooper +# Copyright (c) 2020 Jason Merrill +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 12 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], + [$1], [14], [ax_cxx_compile_alternatives="14 1y"], + [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + + m4_if([$2], [], [dnl + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + ax_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [ax_cv_cxx_compile_cxx$1=yes], + [ax_cv_cxx_compile_cxx$1=no])]) + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi]) + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 +) + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201103L + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + +]]) + + +dnl Tests for new features in C++17 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L + +]]) diff --git a/Tools/javascript/jsc_shell.cxx b/Tools/javascript/jsc_shell.cxx index 292c4042b..c173c147f 100644 --- a/Tools/javascript/jsc_shell.cxx +++ b/Tools/javascript/jsc_shell.cxx @@ -18,7 +18,7 @@ typedef int (*JSCIntializer)(JSGlobalContextRef context, JSObjectRef *module); public: - JSCShell() {}; + JSCShell() { context = 0; }; virtual ~JSCShell(); diff --git a/Tools/mkdist.py b/Tools/mkdist.py index 47cf8e765..4fba4701d 100755 --- a/Tools/mkdist.py +++ b/Tools/mkdist.py @@ -3,6 +3,7 @@ import sys import os import subprocess +from utils import * def failed(): print("mkdist.py failed to complete") @@ -22,6 +23,15 @@ dirname = "swig-" + version force_tag = args.force_tag skip_checks = args.skip_checks +# Tools directory path $ENV/swig/Tools +toolsdir = os.path.dirname(os.path.abspath(__file__)) +# Root directory path (swig) $ENV/swig +rootdir = os.path.abspath(os.path.join(toolsdir, os.pardir)) +# current directory +current_dir = os.getcwd() +# version directory path $ENV/swig/ +dirpath = os.path.join(current_dir, dirname) + if sys.version_info[0:2] < (2, 7): print("Error: Python 2.7 or higher is required") sys.exit(3) @@ -33,21 +43,26 @@ if dirname.lower() != dirname: # If directory and tarball exist, remove it print("Removing " + dirname) -os.system("rm -rf " + dirname) +if check_dir_exists(dirpath): + run_command("rm", "-rf", dirpath) print("Removing " + dirname + ".tar if exists") -os.system("rm -f " + dirname + ".tar.gz") +filename = dirpath + ".tar" +if check_file_exists(filename): + run_command("rm", "-rf", filename) print("Removing " + dirname + ".tar.gz if exists") -os.system("rm -f " + dirname + ".tar") +filename += ".gz" +if check_file_exists(filename): + run_command("rm", "-rf", filename) # Grab the code from git print("Checking there are no local changes in git repo") -os.system("git remote update origin") == 0 or failed() +run_command("git", "remote", "update", "origin") == 0 or failed() command = ["git", "status", "--porcelain", "-uno"] out = subprocess.check_output(command) -if out.strip() != "": +if out.strip(): print("Local git repository has modifications") print(" ".join(command)) print(out) @@ -57,7 +72,7 @@ if not skip_checks: print("Checking git repository is in sync with remote repository") command = ["git", "log", "--oneline", branch + "..origin/" + branch] out = subprocess.check_output(command) - if out.strip() != "": + if out.strip(): print("Remote repository has additional modifications to local repository") print(" ".join(command)) print(out) @@ -65,7 +80,7 @@ if not skip_checks: command = ["git", "log", "--oneline", "origin/" + branch + ".." + branch] out = subprocess.check_output(command) - if out.strip() != "": + if out.strip(): print("Local repository has modifications not pushed to the remote repository") print("These should be pushed and checked that they pass Continuous Integration testing before continuing") print(" ".join(command)) @@ -73,31 +88,49 @@ if not skip_checks: sys.exit(3) print("Tagging release") -tag = "'rel-" + version + "'" +tag = "v" + version force = "-f " if force_tag else "" -os.system("git tag -a -m " + tag + " " + force + tag) == 0 or failed() +command = ["git", "tag", "-a", "-m", "'Release version " + version + "'"] +force and command.extend(force, tag) +not force and command.append(tag) +run_command(*command) == 0 or failed() -outdir = os.path.basename(os.getcwd()) + "/" + dirname + "/" +outdir = dirname + "/" print("Grabbing tagged release git repository using 'git archive' into " + outdir) -os.system("(cd .. && git archive --prefix=" + outdir + " " + tag + " . | tar -xf -)") == 0 or failed() + +# using pipe operator without shell=True; split commands into individual ones. +# git archive command +command = ["git", "archive", "--prefix=" + outdir, tag, "."] +archive_ps = subprocess.Popen(command, cwd=rootdir, stdout=subprocess.PIPE) +# tar -xf - +tar_ps = subprocess.Popen(("tar", "-xf", "-"), stdin=archive_ps.stdout, stdout=subprocess.PIPE) +archive_ps.stdout.close() # Allow archive_ps to receive a SIGPIPE if tar_ps exits. +output = tar_ps.communicate() # Go build the system print("Building system") -os.system("cd " + dirname + " && ./autogen.sh") == 0 or failed() -os.system("cd " + dirname + "/Source/CParse && bison -y -d parser.y && mv y.tab.c parser.c && mv y.tab.h parser.h") == 0 or failed() -os.system("cd " + dirname + " && make -f Makefile.in libfiles srcdir=./") == 0 or failed() +run_command("mkdir", "-p", dirpath) +run_command("./autogen.sh", cwd=dirpath) == 0 or failed() + +cmdpath = os.path.join(dirpath, "Source", "CParse") +run_command("bison", "-y", "-d", "parser.y", cwd=cmdpath) == 0 or failed() +run_command("mv", "y.tab.c", "parser.c", cwd=cmdpath) == 0 or failed() +run_command("mv", "y.tab.h", "parser.h", cwd=cmdpath) == 0 or failed() + +run_command("make", "-f", "Makefile.in", "libfiles", "srcdir=./", cwd=dirpath) == 0 or failed() # Remove autoconf files -os.system("find " + dirname + " -name autom4te.cache -exec rm -rf {} \\;") +run_command("find", dirname, "-name", "autom4te.cache", "-exec", "rm", "-rf", "{}", ";", cwd=rootdir) # Build documentation print("Building html documentation") -os.system("cd " + dirname + "/Doc/Manual && make all clean-baks") == 0 or failed() +docpath = os.path.join(dirpath, "Doc", "Manual") +run_command("make", "all", "clean-baks", cwd=docpath) == 0 or failed() # Build the tar-ball -os.system("tar -cf " + dirname + ".tar " + dirname) == 0 or failed() -os.system("gzip " + dirname + ".tar") == 0 or failed() +run_command("tar", "-cf", dirname + ".tar", dirname, stdout=open(dirname + ".tar", "w")) == 0 or failed() +run_command("gzip", dirname + ".tar", stdout=open(dirname + ".tar.gz", "w")) == 0 or failed() print("Finished building " + dirname + ".tar.gz") diff --git a/Tools/mkrelease.py b/Tools/mkrelease.py index 014cef227..28dca265b 100755 --- a/Tools/mkrelease.py +++ b/Tools/mkrelease.py @@ -2,6 +2,7 @@ import sys import os +from utils import * def failed(message): if message == "": @@ -27,15 +28,17 @@ skip_checks = args.skip_checks username = args.username print("Looking for rsync") -os.system("which rsync") and failed("rsync not installed/found. Please install.") +run_command("which", "rsync") and failed("rsync not installed/found. Please install.") print("Making source tarball") force = "--force-tag" if force_tag else "" skip = "--skip-checks" if skip_checks else "" -os.system("python ./mkdist.py {} {} --branch {} {}".format(force, skip, branch, version)) and failed("") +toolsdir = os.path.dirname(os.path.abspath(__file__)) +cmd = "python {}/mkdist.py {} {} --branch {} {}".format(toolsdir, force, skip, branch, version).split() +run_command(*cmd) and failed("") print("Build Windows package") -os.system("./mkwindows.sh " + version) and failed("") +run_command("{}/mkwindows.sh".format(toolsdir), version) and failed("") if username: print("Uploading to SourceForge") @@ -45,11 +48,11 @@ if username: # If a file with 'readme' in the name exists in the same folder as the zip/tarball, it gets automatically displayed as the release notes by SF full_readme_file = "readme-" + version + ".txt" - os.system("rm -f " + full_readme_file) - os.system("cat swig-" + version + "/README " + "swig-" + version + "/CHANGES.current " + "swig-" + version + "/RELEASENOTES " + "> " + full_readme_file) + run_command("rm", "-f", full_readme_file) + run_command("cat", "swig-" + version + "/README", "swig-" + version + "/CHANGES.current", "swig-" + version + "/RELEASENOTES", ">", full_readme_file) - os.system("rsync --archive --verbose -P --times -e ssh " + "swig-" + version + ".tar.gz " + full_readme_file + " " + swig_dir_sf) and failed("") - os.system("rsync --archive --verbose -P --times -e ssh " + "swigwin-" + version + ".zip " + full_readme_file + " " + swigwin_dir_sf) and failed("") + run_command("rsync", "--archive", "--verbose", "-P", "--times", "-e", "ssh", "swig-" + version + ".tar.gz", full_readme_file, swig_dir_sf) and failed("") + run_command("rsync", "--archive", "--verbose", "-P", "--times", "-e", "ssh", "swigwin-" + version + ".zip", full_readme_file, swigwin_dir_sf) and failed("") print("Finished") diff --git a/Tools/testflags.py b/Tools/testflags.py index f3d216b59..16e4d8aee 100755 --- a/Tools/testflags.py +++ b/Tools/testflags.py @@ -3,11 +3,15 @@ def get_cflags(language, std, compiler): if std == None or len(std) == 0: std = "gnu89" - c_common = "-fdiagnostics-show-option -std=" + std + " -Wno-long-long -Wreturn-type -Wdeclaration-after-statement -Wmissing-field-initializers" + c_common = "-fdiagnostics-show-option -std=" + std + " -Wno-long-long -Wreturn-type -Wmissing-field-initializers" + if std == "gnu89" or std == "gnu90": + # gnu89 standard allows declaration after headers + # use c99 or gnu99 if feature is necessary for using target language + c_common = c_common + " -Wdeclaration-after-statement" cflags = { "csharp":"-Werror " + c_common, "d":"-Werror " + c_common, - "go":"-Werror " + c_common + " -Wno-declaration-after-statement", + "go":"-Werror " + c_common, "guile":"-Werror " + c_common, "java":"-Werror " + c_common, "javascript":"-Werror " + c_common, diff --git a/Tools/travis-linux-install.sh b/Tools/travis-linux-install.sh index 37ef841dd..cda834112 100755 --- a/Tools/travis-linux-install.sh +++ b/Tools/travis-linux-install.sh @@ -2,127 +2,10 @@ # Install Linux packages where the version has been overidden in .travis.yml -set -e # exit on failure (same as -o errexit) - lsb_release -a -travis_retry sudo apt-get -qq update +# find location of current script (only works in bash) +script_dir="$( dirname "${BASH_SOURCE[0]}")" -if [[ -n "$GCC" ]]; then - travis_retry sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - travis_retry sudo apt-get -qq update - travis_retry sudo apt-get install -qq g++-$GCC -fi - -travis_retry sudo apt-get -qq install libboost-dev - -WITHLANG=$SWIGLANG - -case "$SWIGLANG" in - "") ;; - "csharp") - travis_retry sudo apt-get -qq install mono-devel - ;; - "d") - travis_retry wget http://downloads.dlang.org/releases/2014/dmd_2.066.0-0_amd64.deb - travis_retry sudo dpkg -i dmd_2.066.0-0_amd64.deb - ;; - "go") - if [[ "$VER" ]]; then - eval "$(gimme ${VER}.x)" - fi - ;; - "javascript") - case "$ENGINE" in - "node") - travis_retry wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash - export NVM_DIR="$HOME/.nvm" - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" - travis_retry nvm install ${VER} - nvm use ${VER} - if [ "$VER" == "0.10" ] || [ "$VER" == "0.12" ] || [ "$VER" == "4" ] ; then -# travis_retry sudo apt-get install -qq nodejs node-gyp - travis_retry npm install -g node-gyp@$VER - else - travis_retry npm install -g node-gyp - fi - ;; - "jsc") - travis_retry sudo apt-get install -qq libwebkitgtk-dev - ;; - "v8") - travis_retry sudo apt-get install -qq libv8-dev - ;; - esac - ;; - "guile") - travis_retry sudo apt-get -qq install guile-2.0-dev - ;; - "lua") - if [[ -z "$VER" ]]; then - travis_retry sudo apt-get -qq install lua5.2 liblua5.2-dev - else - travis_retry sudo apt-get -qq install lua${VER} liblua${VER}-dev - fi - ;; - "mzscheme") - travis_retry sudo apt-get -qq install racket - ;; - "ocaml") - travis_retry sudo apt-get -qq install ocaml camlp4 - ;; - "octave") - if [[ -z "$VER" ]]; then - travis_retry sudo apt-get -qq install liboctave-dev - else - # Travis adds external PPAs which contain newer versions of packages - # than in baseline trusty. These newer packages prevent some of the - # Octave packages in ppa:kwwette/octave, which rely on the older - # packages in trusty, from installing. To prevent these kind of - # interactions arising, clean out all external PPAs added by Travis - # before installing Octave - sudo rm -rf /etc/apt/sources.list.d/* - travis_retry sudo apt-get -qq update - travis_retry sudo add-apt-repository -y ppa:kwwette/octaves - travis_retry sudo apt-get -qq update - travis_retry sudo apt-get -qq install liboctave${VER}-dev - fi - ;; - "php") - travis_retry sudo add-apt-repository -y ppa:ondrej/php - travis_retry sudo apt-get -qq update - travis_retry sudo apt-get -qq install php$VER-cli php$VER-dev - ;; - "python") - pip install --user pycodestyle - if [[ "$PY3" ]]; then - travis_retry sudo apt-get install -qq python3-dev - fi - WITHLANG=$SWIGLANG$PY3 - if [[ "$VER" ]]; then - travis_retry sudo add-apt-repository -y ppa:deadsnakes/ppa - travis_retry sudo apt-get -qq update - travis_retry sudo apt-get -qq install python${VER}-dev - WITHLANG=$SWIGLANG$PY3=$SWIGLANG$VER - fi - ;; - "r") - travis_retry sudo apt-get -qq install r-base - ;; - "ruby") - if [[ "$VER" ]]; then - travis_retry rvm install $VER - fi - ;; - "scilab") - # Travis has the wrong version of Java pre-installed resulting in error using scilab: - # /usr/bin/scilab-bin: error while loading shared libraries: libjava.so: cannot open shared object file: No such file or directory - echo "JAVA_HOME was set to $JAVA_HOME" - unset JAVA_HOME - travis_retry sudo apt-get -qq install scilab - ;; - "tcl") - travis_retry sudo apt-get -qq install tcl-dev - ;; -esac - -set +e # turn off exit on failure (same as +o errexit) +# run generic script +RETRY=travis-retry +source "$script_dir"/CI-linux-install.sh diff --git a/Tools/travis-osx-install.sh b/Tools/travis-osx-install.sh index 393d96e60..71545ad5c 100755 --- a/Tools/travis-osx-install.sh +++ b/Tools/travis-osx-install.sh @@ -4,9 +4,13 @@ set -e # exit on failure (same as -o errexit) +# Disable 'brew cleanup', just wastes Travis job run time +export HOMEBREW_NO_INSTALL_CLEANUP=1 + sw_vers travis_retry brew update -travis_retry brew list +echo "Installed packages..." +travis_retry brew list --versions # travis_retry brew install pcre # Travis Xcode-7.3 has pcre # travis_retry brew install boost @@ -16,18 +20,21 @@ case "$SWIGLANG" in "csharp") travis_retry brew install mono ;; - "guile") - travis_retry Tools/brew-install guile - ;; "lua") travis_retry brew install lua ;; "octave") - travis_retry brew install octave + travis_retry Tools/brew-install octave + ;; + "perl5") + travis_retry Tools/brew-install perl ;; "python") WITHLANG=$SWIGLANG$PY3 ;; + "tcl") + travis_retry Tools/brew-install --cask tcl + ;; esac # Workaround for https://github.com/travis-ci/travis-ci/issues/6522 diff --git a/Tools/utils.py b/Tools/utils.py new file mode 100644 index 000000000..496882f19 --- /dev/null +++ b/Tools/utils.py @@ -0,0 +1,26 @@ +import os, subprocess + + +def check_file_exists(path): + """ + Checks if a file exists or not. + """ + return os.path.isfile(path) + + +def check_dir_exists(path): + """ + Checks if a folder exists or not. + """ + return os.path.isdir(path) + + +def run_command(*args, **kwargs): + """ + Runs an os command using subprocess module. + """ + redirect_out = list(map(str.strip, " ".join(args).split(" > "))) + if len(redirect_out) > 1: + args, filepath = redirect_out[0].split(), redirect_out[-1] + kwargs.update(stdout=open(filepath, "w")) + return subprocess.call(args, **kwargs) diff --git a/appveyor.yml b/appveyor.yml index 42eaa36f4..fad8f0bc0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -17,19 +17,33 @@ environment: VSVER: 14 VER: 27 - SWIGLANG: python - VSVER: 14 - VER: 36 + VSVER: 15 + VER: 38 PY3: 3 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + - SWIGLANG: python + VSVER: 16 + VER: 39 + PY3: 3 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - SWIGLANG: python OSVARIANT: cygwin - - SWIGLANG: python + - SWIGLANG: java OSVARIANT: mingw - VER: 27 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - SWIGLANG: python OSVARIANT: mingw WITHLANG: python VER: 37 PY3: 3 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + - BUILDSYSTEM: cmake + VSVER: 14 + +matrix: + allow_failures: + - SWIGLANG: python + OSVARIANT: cygwin install: - date /T & time /T @@ -45,9 +59,10 @@ install: $env:MINGWBIN="C:\msys64\mingw32\bin" $env:MBITS="32" $env:MARCH="i686" + $env:VSARCH="" } else { $env:PCRE_PLATFORM="x64" - $env:JAVA_HOME="C:/Program Files/Java/jdk1.8.0" + $env:JAVA_HOME="C:/Program Files/Java/jdk15" $env:VCVARS_PLATFORM="amd64" $env:LANG_PLATFORM="-x64" $env:CYGWINBIN="C:\cygwin64\bin" @@ -56,14 +71,26 @@ install: $env:MINGWBIN="C:\msys64\mingw64\bin" $env:MBITS="64" $env:MARCH="x86_64" + $env:VSARCH=" Win64" } - ps: >- if (!$env:OSVARIANT) { $env:PATH="$env:CYGWINBIN;$env:PATH" $env:CYGWIN="nodosfilewarning" - $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS")) $env:CC="cccl" $env:CXX="cccl" + if ($env:VSVER -ge 16) { + $env:VCVARSBAT="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars$env:MBITS.bat" + $env:BOOSTROOT="C:/Libraries/boost_1_73_0" + } elseif ($env:VSVER -eq 15) { + $env:VCVARSBAT="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars$env:MBITS.bat" + $env:BOOSTROOT="C:/Libraries/boost_1_69_0" + } else { + $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS")) + $env:VCVARSBAT="$env:VSCOMNTOOLS..\..\VC\vcvarsall.bat" + $env:VCVARSARG="$env:VCVARS_PLATFORM" + $env:BOOSTROOT="C:/Libraries/boost_1_69_0" + } } elseif ($env:OSVARIANT -eq "cygwin") { $env:PATH="$env:CYGWINBIN;$env:PATH" $env:CYGWIN="nodosfilewarning" @@ -79,9 +106,8 @@ install: $env:CHECK_OPTIONS2="CFLAGS+=-DMS_WIN64 CXXFLAGS+=-DMS_WIN64" } } -- if "%OSVARIANT%"=="" bash -c "cd /usr/bin && curl --retry 15 -s -L https://github.com/swig/cccl/archive/cccl-1.0.tar.gz | tar -xz --strip 1 cccl-cccl-1.0/cccl" -- if "%OSVARIANT%"=="" echo Using Visual Studio %VSVER%.0 at %VSCOMNTOOLS% -- if "%OSVARIANT%"=="" call "%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM% +- if "%OSVARIANT%"=="" bash -c "cd /usr/bin && curl --retry 15 -s -L https://github.com/swig/cccl/archive/cccl-1.2.tar.gz | tar -xz --strip 1 cccl-cccl-1.2/cccl" +- if "%OSVARIANT%"=="" call "%VCVARSBAT%" %VCVARSARG% - if "%OSVARIANT%"=="" Tools\nuget-install.cmd pcre -Verbosity quiet -Version 8.33.0.1 -OutputDirectory C:\pcre - if "%OSVARIANT%"=="" set PCRE_ROOT=C:/pcre/pcre.8.33.0.1/build/native - if not "%OSVARIANT%"=="cygwin" set PATH=C:\Python%VER%%LANG_PLATFORM%;%PATH% @@ -107,8 +133,9 @@ install: build_script: - set CCCL_OPTIONS=--cccl-muffle /W3 /EHsc - set CHECK_OPTIONS=CSHARPOPTIONS=-platform:%Platform% +- if "%BUILDSYSTEM%"=="cmake" cmake --version && cmake -G "Visual Studio 14 2015%VSARCH%" -DCMAKE_INSTALL_PREFIX="%CD:\=/%/install2" -DCMAKE_C_FLAGS="/WX /DPCRE_STATIC" -DCMAKE_CXX_FLAGS="/WX /DPCRE_STATIC" -DPCRE_INCLUDE_DIR=%PCRE_ROOT%/include -DPCRE_LIBRARY=%PCRE_ROOT%/lib/v110/%PCRE_PLATFORM%/Release/static/utf8/pcre8.lib -DBISON_EXECUTABLE=C:/cygwin/bin/bison.exe . && cmake --build . --config Release --target install && ctest --output-on-failure -V -C Release && appveyor exit # Open dummy file descriptor to fix error on cygwin: ./configure: line 560: 0: Bad file descriptor -- if "%OSVARIANT%"=="" bash -c "exec 0' > conftest.hpp +echo '#include "conftest.hpp"' > conftest.cpp +$CXX -c conftest.hpp 2>/dev/null +if test $? -eq 0; then + if test -f conftest.hpp.gch; then + $CXX -H -c -I. ${PCHINCLUDEARG} ./conftest.hpp${PCHINCLUDEEXT} -o conftest.o conftest.cpp >conftest.out 2>&1 + if test $? -eq 0; then + if test "$CLANGXX" = "yes"; then + PCHSUPPORT=yes + elif grep -q '^!.*conftest.hpp.gch$' conftest.out; then + PCHSUPPORT=yes + fi + fi + fi +fi +rm -f conftest.hpp conftest.cpp conftest.out +AC_LANG_POP([C++]) +AC_MSG_RESULT([$PCHSUPPORT]) +AC_SUBST(PCHSUPPORT) +AC_SUBST(PCHINCLUDEARG) +AC_SUBST(PCHINCLUDEEXT) + # Set info about shared libraries. AC_SUBST(SO) AC_SUBST(LDSHARED) @@ -342,7 +402,6 @@ AC_SUBST(TRYLINKINGWITHCXX) AC_SUBST(RPATH) AC_SUBST(PLATCFLAGS) AC_SUBST(PLATCXXFLAGS) -AC_SUBST(HAVE_CXX11_COMPILER) AC_SUBST(LINKFORSHARED) # This variation is needed on OS-X because there is no (apparent) consistency in shared library naming. @@ -435,7 +494,7 @@ else alllang_default=yes fi -AC_CHECK_PROGS(PKGCONFIG, [pkg-config]) +AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) #-------------------------------------------------------------------- # Look for Tcl @@ -444,6 +503,7 @@ AC_CHECK_PROGS(PKGCONFIG, [pkg-config]) TCLINCLUDE= TCLLIB= TCLPACKAGE= +TCLLINK= AC_ARG_WITH(tclconfig, AS_HELP_STRING([--without-tcl], [Disable Tcl]) AS_HELP_STRING([--with-tclconfig=path], [Set location of tclConfig.sh]), [with_tclconfig="$withval"], [with_tclconfig=]) @@ -451,7 +511,7 @@ AC_ARG_WITH(tcl, [ --with-tcl=path Set location of Tcl package],[ TCLPACKAGE="$withval"], [TCLPACKAGE="$alllang_default"]) AC_ARG_WITH(tclincl,[ --with-tclincl=path Set location of Tcl include directory],[ - TCLINCLUDE="$ISYSTEM$withval"], [TCLINCLUDE=]) + TCLINCLUDE="-I$withval"], [TCLINCLUDE=]) AC_ARG_WITH(tcllib,[ --with-tcllib=path Set location of Tcl library directory],[ TCLLIB="-L$withval"], [TCLLIB=]) @@ -472,7 +532,9 @@ fi dirs="/usr/lib*/ /usr/lib*/tcl*/ /usr/local/lib*/ /usr/local/lib*/tcl*/" case $host in *-*-darwin*) - dirs="/System/Library/Frameworks/Tcl.framework/ $dirs" + tcl_framework="/System/Library/Frameworks/Tcl.framework/" + macos_sysroot="$(xcodebuild -version -sdk macosx Path 2>/dev/null)" # For MacOSX10.14 and later + dirs="$macos_sysroot$tcl_framework $tcl_framework $dirs" ;; *) ;; @@ -493,7 +555,7 @@ else AC_MSG_RESULT(found $TCLCONFIG/tclConfig.sh) . $TCLCONFIG/tclConfig.sh if test -z "$TCLINCLUDE"; then - TCLINCLUDE=`echo $TCL_INCLUDE_SPEC | sed "s/-I/$ISYSTEM/"` + TCLINCLUDE=`echo $TCL_INCLUDE_SPEC` fi if test -z "$TCLLIB"; then TCLLIB=$TCL_LIB_SPEC @@ -502,7 +564,7 @@ fi if test -z "$TCLINCLUDE"; then if test "x$TCLPACKAGE" != xyes; then - TCLINCLUDE="$ISYSTEM$TCLPACKAGE/include" + TCLINCLUDE="-I$TCLPACKAGE/include" fi fi @@ -514,13 +576,13 @@ fi AC_MSG_CHECKING(for Tcl header files) if test -z "$TCLINCLUDE"; then -AC_TRY_CPP([#include ], , TCLINCLUDE="") +AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include ]])],[],[TCLINCLUDE=""]) if test -z "$TCLINCLUDE"; then dirs="/usr/local/include /usr/include /opt/local/include" for i in $dirs ; do if test -r $i/tcl.h; then AC_MSG_RESULT($i) - TCLINCLUDE="$ISYSTEM$i" + TCLINCLUDE="-I$i" break fi done @@ -534,7 +596,7 @@ fi AC_MSG_CHECKING(for Tcl library) if test -z "$TCLLIB"; then -dirs="/usr/local/lib /usr/lib /opt/local/lib" +dirs="/usr/local/lib /usr/lib /opt/local/lib /opt/freeware/lib" for i in $dirs ; do if test -r $i/libtcl.a; then AC_MSG_RESULT($i) @@ -552,9 +614,16 @@ fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; +*-*-aix*) TCLDYNAMICLINKING="$TCLLIB";; *)TCLDYNAMICLINKING="";; esac +# AIX needs -ltcl for linking at test time +case $host in +*-*-aix*) TCLLINK="-ltcl";; +*)TCLLINK="";; +esac + case $host in *-*-darwin*) TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' @@ -573,6 +642,7 @@ AC_SUBST(TCLLIB) AC_SUBST(TCLDYNAMICLINKING) AC_SUBST(TCLLDSHARED) AC_SUBST(TCLCXXSHARED) +AC_SUBST(TCLLINK) #---------------------------------------------------------------- # Look for Python @@ -895,30 +965,6 @@ if test -n "$PYINCLUDE" || test -n "$PY3INCLUDE" ; then fi fi -AC_ARG_WITH(2to3, AS_HELP_STRING([--with-2to3=path], [Set location of Python 2to3 tool]), [PY2TO3BIN="$withval"], [PY2TO3BIN="yes"]) -if test -n "$PYTHON3"; then - if test "x$PY2TO3BIN" = xyes; then - py3to2=`echo $PYTHON3 | sed -e "s/python/2to3-/"` - AC_CHECK_PROGS(PY2TO3, $py3to2 2to3) - if test -z "$PY2TO3"; then - # Windows distributions don't always have the 2to3 executable - AC_MSG_CHECKING(for 2to3.py) - py2to3script="$PY3PREFIX/Tools/scripts/2to3.py" - if test -f "$py2to3script"; then - AC_MSG_RESULT($py2to3script) - PY2TO3="$PYTHON3 $py2to3script" - else - AC_MSG_RESULT(Not found) - fi - fi - else - PY2TO3="$PY2TO3BIN" - fi - if test -z "$PY2TO3"; then - PYTHON3= - fi -fi - #---------------------------------------------------------------- # Look for Perl5 #---------------------------------------------------------------- @@ -971,7 +1017,7 @@ if test -n "$PERL"; then AC_MSG_RESULT($PERL5LIB) fi AC_MSG_CHECKING(for Perl5 ccflags) - PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//" | sed "s/-I/$ISYSTEM/") 2>/dev/null` + PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//") 2>/dev/null` if test -z "$PERL5CCFLAGS" ; then AC_MSG_RESULT(not found) else @@ -1058,7 +1104,7 @@ if test -n "$OCTAVE"; then AS_IF([test "x`${OCTAVE} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/Octave, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ - AC_MSG_NOTICE([no]) + AC_MSG_RESULT([no]) OCTAVE= ]) fi @@ -1079,6 +1125,7 @@ if test -n "$OCTAVE"; then fi AC_MSG_RESULT([${mkoctfile}]) AC_MSG_CHECKING([if ${mkoctfile} works]) + mkoctfile="env - PATH=$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH ${mkoctfile}" AS_IF([test "x`${mkoctfile} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/mkoctfile, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ @@ -1093,7 +1140,7 @@ if test -n "$OCTAVE"; then AC_MSG_CHECKING([for Octave preprocessor flags]) OCTAVE_CPPFLAGS= for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do - for flag in `env - ${mkoctfile} -p ${var}`; do + for flag in `${mkoctfile} -p ${var}`; do case ${flag} in -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";; *) ;; @@ -1105,7 +1152,7 @@ if test -n "$OCTAVE"; then AC_MSG_CHECKING([for Octave compiler flags]) OCTAVE_CXXFLAGS= for var in CXX ALL_CXXFLAGS; do - for flag in `env - ${mkoctfile} -p ${var}`; do + for flag in `${mkoctfile} -p ${var}`; do case ${flag} in -std=*|-g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";; *) ;; @@ -1125,10 +1172,10 @@ if test -n "$OCTAVE"; then AC_MSG_CHECKING([for Octave linker flags]) OCTAVE_LDFLAGS= for var in OCTLIBDIR; do - OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "-L`env - ${mkoctfile} -p ${var}` + OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "-L`${mkoctfile} -p ${var}` done for var in RDYNAMIC_FLAG RLD_FLAG OCTAVE_LIBS LIBS; do - OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`env - ${mkoctfile} -p ${var}` + OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`${mkoctfile} -p ${var}` done AC_MSG_RESULT([$OCTAVE_LDFLAGS]) @@ -1210,8 +1257,8 @@ else AC_MSG_CHECKING(for Scilab header files) if test "$SCILABINCDIR" != ""; then dirs="$SCILABINCDIR" - elif test -n "$PKGCONFIG"; then - dirs=`$PKGCONFIG scilab --cflags-only-I | sed -e 's/-I//g'` + elif test -n "$PKG_CONFIG "; then + dirs=`$PKG_CONFIG scilab --cflags-only-I | sed -e 's/-I//g'` else dirs="" fi @@ -1348,6 +1395,33 @@ else JAVAC="$JAVACBIN" fi +# Check Java version: we require Java 9 or later for Doxygen tests. +if test -n "$JAVAC"; then + AC_MSG_CHECKING(if java version is 9 or greater) + javac_version=`"$JAVAC" -version 2>&1` + java_version_num=`echo $javac_version | sed -n 's/^javac //p'` + if test -z "$java_version_num"; then + AC_MSG_WARN([unknown format for Java version returned by "$JAVAC" ($javac_version)]) + JAVA_SKIP_DOXYGEN_TEST_CASES=1 + AC_MSG_RESULT(unknown) + else + dnl Until Java 8 version number was in format "1.x", starting from + dnl Java 9 it's just "x". + case $java_version_num in + 1.*) + JAVA_SKIP_DOXYGEN_TEST_CASES=1 + AC_MSG_RESULT([no, disabling Doxygen tests]) + ;; + + *) + AC_MSG_RESULT(yes) + ;; + esac + fi + + AC_SUBST(JAVA_SKIP_DOXYGEN_TEST_CASES) +fi + AC_MSG_CHECKING(for java include file jni.h) AC_ARG_WITH(javaincl, [ --with-javaincl=path Set location of Java include directory], [JAVAINCDIR="$withval"], [JAVAINCDIR=]) @@ -1408,15 +1482,6 @@ if test -z "$JAVA_HOME" && test -n "$JAVA_HOME_MAYBE" ; then fi fi -# Javadoc support required for the Java test-suite is available by default in jdk9+ and in tools.jar in earlier jdk versions -AC_MSG_CHECKING(for java tools.jar) -if test -n "$JAVA_HOME" && test -r "$JAVA_HOME/lib/tools.jar" ; then - JAVA_TOOLS_JAR="$JAVA_HOME/lib/tools.jar" - AC_MSG_RESULT([$JAVA_TOOLS_JAR]) -else - AC_MSG_RESULT(not found) -fi - case $host in *-*-cygwin*) # TODO: Only use this flag if the compiler supports it, later versions of gcc no longer have it @@ -1483,7 +1548,6 @@ AC_SUBST(JAVA) AC_SUBST(JAVAC) AC_SUBST(JAVAINC) AC_SUBST(JAVA_CLASSPATH_SEP) -AC_SUBST(JAVA_TOOLS_JAR) AC_SUBST(JAVADYNAMICLINKING) AC_SUBST(JAVALIBRARYPREFIX) AC_SUBST(JAVASO) @@ -1526,7 +1590,7 @@ else # Look for Node.js which is the default Javascript engine #---------------------------------------------------------------- - AC_CHECK_PROGS(NODEJS, [nodejs node]) + AC_CHECK_PROGS(NODEJS, [node nodejs]) if test -n "$NODEJS"; then # node-gyp is needed to run the test-suite/examples @@ -1578,11 +1642,19 @@ else # check for JavaScriptCore/Webkit libraries AC_ARG_WITH(jscorelib,[ --with-jscorelib=path Set location of the JavaScriptCore/Webkit library directory],[JSCORELIB="-L$withval"], [JSCORELIB=]) - if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then + if test -z "$JSCORELIB" -a -n "$PKG_CONFIG "; then AC_MSG_CHECKING(for JavaScriptCore/Webkit library) - if pkg-config javascriptcoregtk-1.0; then - JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0` - JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0` + if $PKG_CONFIG javascriptcoregtk-4.0 2>/dev/null ; then + JSCORELIB=`$PKG_CONFIG --libs javascriptcoregtk-4.0` + JSCOREINC=`$PKG_CONFIG --cflags-only-I javascriptcoregtk-4.0` + JSCOREVERSION=`$PKG_CONFIG --modversion javascriptcoregtk-4.0` + elif $PKG_CONFIG javascriptcoregtk-3.0 2>/dev/null ; then + JSCORELIB=`$PKG_CONFIG --libs javascriptcoregtk-3.0` + JSCOREINC=`$PKG_CONFIG --cflags-only-I javascriptcoregtk-3.0` + JSCOREVERSION=`$PKG_CONFIG --modversion javascriptcoregtk-3.0` + elif $PKG_CONFIG javascriptcoregtk-1.0 2>/dev/null ; then + JSCORELIB=`$PKG_CONFIG --libs javascriptcoregtk-1.0` + JSCOREVERSION=`$PKG_CONFIG --modversion javascriptcoregtk-1.0` fi if test -z "$JSCORELIB"; then AC_MSG_RESULT(not found) @@ -1993,7 +2065,7 @@ AC_SUBST(RUBYSO) AC_SUBST(RUBYDYNAMICLINKING) #------------------------------------------------------------------------- -# Look for PHP7 +# Look for PHP #------------------------------------------------------------------------- PHPBIN= @@ -2007,7 +2079,7 @@ if test x"${PHPBIN}" = xno; then PHP= else if test "x$PHPBIN" = xyes; then - AC_CHECK_PROGS(PHP, [php7.3 php7.2 php7.1 php7.0 php]) + AC_CHECK_PROGS(PHP, [php8.0 php7.4 php7.3 php7.2 php7.1 php7.0 php]) else PHP=$PHPBIN fi @@ -2018,12 +2090,14 @@ else case $PHP in *7.*) PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;; + *8.*) + PHPCONFIG=`echo "$PHP"|sed 's/8\...*$/-config&/'` ;; *) PHPCONFIG=$PHP-config ;; esac php_version=`$PHPCONFIG --version 2>/dev/null` case $php_version in - 7.*) + 7.*|8.*) PHPINC=`$PHPCONFIG --includes 2>/dev/null` if test -n "$PHPINC"; then AC_MSG_RESULT($PHPINC) @@ -2034,7 +2108,7 @@ else "") AC_MSG_RESULT([could not find $PHPCONFIG or obtain PHP version from it]) ;; *) - AC_MSG_RESULT([found PHP $php_version - not PHP 7]) ;; + AC_MSG_RESULT([found PHP $php_version - not PHP 7 or 8]) ;; esac fi fi @@ -2275,7 +2349,7 @@ if test "$LUABIN"; then # look for the header files & set LUAFLAGS accordingly # will clear LUABIN if not present if test -n "$LUAINCLUDE"; then - AC_CHECK_FILE($LUAINCLUDE/lua.h,[LUAFLAGS="$ISYSTEM$LUAINCLUDE"],[LUABIN=]) + AC_CHECK_FILE($LUAINCLUDE/lua.h,[LUAFLAGS="-I$LUAINCLUDE"],[LUABIN=]) else LUA_OK="1" CFLAGS_SAVED=$CFLAGS @@ -2299,7 +2373,7 @@ if test "$LUABIN"; then #echo "$i" if test -r $i/lua.h; then AC_MSG_RESULT($i/lua.h) - LUAFLAGS="$ISYSTEM$i" + LUAFLAGS="-I$i" break fi done @@ -2388,11 +2462,6 @@ AS_HELP_STRING([--with-go=path], [Set location of Go compiler]),[GOBIN="$withval if test x"${GOBIN}" = xno; then AC_MSG_NOTICE([Disabling Go]) GO= - GOC= - GO1=false - GO12=false - GO13=false - GO15=false GOGCC=false GCCGO= GOOPT= @@ -2408,30 +2477,17 @@ else GOGCC=false GCCGO= - GO1=false - GO12=false - GO13=false - GO15=false GOOPT= GCCGOOPT= GOVERSIONOPTION= if test -n "$GO" ; then - GO1=true GOVERSIONOPTION=version go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') - case "$go_version" in - go1 | go1.[[01234]] | go1.[[01234]].*) - GOC=$(sh -c "$(go env) && echo \$GOCHAR")c - ;; - *) - GOC=compile - ;; - esac AC_MSG_CHECKING([whether go version is too old]) case $go_version in - go1.1.* | go1.1 | go1.0 | go1.0.* | go1 ) - AC_MSG_RESULT([yes - minimum version is 1.2]) + go1.[012]*) + AC_MSG_RESULT([yes - minimum version is 1.3]) GO= GOOPT="-intgosize 32" ;; @@ -2447,20 +2503,6 @@ else esac ;; esac - case $go_version in - go1.0 | go1.0.* | go1 | go1.1 | go1.1.*) - GOOPT="$GOOPT -use-shlib" - ;; - go1.2 | go1.2.*) - GO12=true - ;; - go1.3 | go1.3.* | go1.4 | go1.4.*) - GO13=true - ;; - *) - GO15=true - ;; - esac fi AC_CHECK_PROGS(GCCGO, gccgo)