summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml102
-rw-r--r--.github/workflows/codeql-analysis.yml51
-rw-r--r--.github/workflows/main.yml24
-rw-r--r--.gitignore3
-rw-r--r--.travis.yml15
-rw-r--r--AUTHORS2
-rw-r--r--Doxyfile2
-rw-r--r--LICENSE2
-rw-r--r--README.md8
-rw-r--r--appveyor.yml54
-rw-r--r--appveyor_config.rb9
-rw-r--r--build_config.rb12
-rw-r--r--doc/guides/compile.md8
-rw-r--r--doc/guides/debugger.md2
-rw-r--r--doc/limitations.md20
-rw-r--r--doc/opcode.md203
-rw-r--r--examples/targets/build_config_ArduinoDue.rb4
-rw-r--r--examples/targets/build_config_IntelEdison.rb4
-rw-r--r--examples/targets/build_config_IntelGalileo.rb4
-rw-r--r--examples/targets/build_config_RX630.rb4
-rw-r--r--examples/targets/build_config_chipKITMax32.rb4
-rw-r--r--examples/targets/build_config_dreamcast_shelf.rb108
-rw-r--r--include/mrbconf.h8
-rw-r--r--include/mruby.h62
-rw-r--r--include/mruby/array.h4
-rw-r--r--include/mruby/boxing_nan.h13
-rw-r--r--include/mruby/boxing_word.h6
-rw-r--r--include/mruby/common.h13
-rw-r--r--include/mruby/compile.h14
-rw-r--r--include/mruby/debug.h2
-rw-r--r--include/mruby/dump.h18
-rw-r--r--include/mruby/gc.h1
-rw-r--r--include/mruby/hash.h1
-rw-r--r--include/mruby/irep.h10
-rw-r--r--include/mruby/istruct.h5
-rw-r--r--include/mruby/khash.h26
-rw-r--r--include/mruby/numeric.h1
-rw-r--r--include/mruby/ops.h5
-rw-r--r--include/mruby/proc.h21
-rw-r--r--include/mruby/string.h3
-rw-r--r--include/mruby/value.h61
-rw-r--r--include/mruby/variable.h1
-rw-r--r--include/mruby/version.h8
-rw-r--r--lib/mruby/build.rb32
-rw-r--r--lib/mruby/build/command.rb67
-rw-r--r--lib/mruby/gem.rb9
-rw-r--r--lib/mruby/source.rb4
-rw-r--r--mrbgems/default.gembox7
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb31
-rw-r--r--mrbgems/mruby-array-ext/src/array.c13
-rw-r--r--mrbgems/mruby-array-ext/test/array.rb13
-rw-r--r--mrbgems/mruby-bin-config/mrbgem.rake7
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c1
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h6
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c10
-rw-r--r--mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c45
-rw-r--r--mrbgems/mruby-bin-mruby/mrbgem.rake1
-rw-r--r--mrbgems/mruby-bin-mruby/tools/mruby/mruby.c8
-rw-r--r--mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c8
-rw-r--r--mrbgems/mruby-class-ext/src/class.c7
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c124
-rw-r--r--mrbgems/mruby-compiler/core/parse.y140
-rw-r--r--mrbgems/mruby-compiler/core/y.tab.c13153
-rw-r--r--mrbgems/mruby-compiler/mrbgem.rake28
-rw-r--r--mrbgems/mruby-complex/mrblib/complex.rb2
-rw-r--r--mrbgems/mruby-complex/src/complex.c3
-rw-r--r--mrbgems/mruby-error/src/exception.c6
-rw-r--r--mrbgems/mruby-eval/src/eval.c217
-rw-r--r--mrbgems/mruby-eval/test/eval.rb21
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c3
-rw-r--r--mrbgems/mruby-inline-struct/test/inline.c7
-rw-r--r--mrbgems/mruby-io/include/mruby/ext/io.h46
-rw-r--r--mrbgems/mruby-io/mrbgem.rake10
-rw-r--r--mrbgems/mruby-io/mrblib/file.rb5
-rw-r--r--mrbgems/mruby-io/mrblib/file_constants.rb16
-rw-r--r--mrbgems/mruby-io/mrblib/io.rb19
-rw-r--r--mrbgems/mruby-io/src/file.c130
-rw-r--r--mrbgems/mruby-io/src/file_test.c54
-rw-r--r--mrbgems/mruby-io/src/io.c453
-rw-r--r--mrbgems/mruby-io/test/file.rb30
-rw-r--r--mrbgems/mruby-io/test/io.rb32
-rw-r--r--mrbgems/mruby-io/test/mruby_io_test.c106
-rw-r--r--mrbgems/mruby-kernel-ext/src/kernel.c14
-rw-r--r--mrbgems/mruby-metaprog/src/metaprog.c32
-rw-r--r--mrbgems/mruby-metaprog/test/metaprog.rb9
-rw-r--r--mrbgems/mruby-method/src/method.c9
-rw-r--r--mrbgems/mruby-object-ext/src/object.c15
-rw-r--r--mrbgems/mruby-objectspace/src/mruby_objectspace.c24
-rw-r--r--mrbgems/mruby-os-memsize/mrbgem.rake10
-rw-r--r--mrbgems/mruby-os-memsize/src/memsize.c244
-rw-r--r--mrbgems/mruby-os-memsize/test/memsize.rb63
-rw-r--r--mrbgems/mruby-pack/src/pack.c134
-rw-r--r--mrbgems/mruby-print/mrblib/print.rb31
-rw-r--r--mrbgems/mruby-print/src/print.c91
-rw-r--r--mrbgems/mruby-proc-ext/src/proc.c4
-rw-r--r--mrbgems/mruby-random/src/random.c28
-rw-r--r--mrbgems/mruby-range-ext/src/range.c4
-rw-r--r--mrbgems/mruby-rational/mrblib/rational.rb4
-rw-r--r--mrbgems/mruby-rational/src/rational.c18
-rw-r--r--mrbgems/mruby-sleep/src/mrb_sleep.c6
-rw-r--r--mrbgems/mruby-socket/mrbgem.rake2
-rw-r--r--mrbgems/mruby-socket/src/socket.c1
-rw-r--r--mrbgems/mruby-socket/test/sockettest.c5
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c87
-rw-r--r--mrbgems/mruby-sprintf/test/sprintf.rb28
-rw-r--r--mrbgems/mruby-string-ext/src/string.c9
-rw-r--r--mrbgems/mruby-struct/src/struct.c16
-rw-r--r--mrbgems/mruby-symbol-ext/src/symbol.c2
-rw-r--r--mrbgems/mruby-test/mrbgem.rake15
-rw-r--r--mrbgems/mruby-time/src/time.c26
-rw-r--r--mrblib/00class.rb10
-rw-r--r--mrblib/array.rb6
-rw-r--r--mrblib/hash.rb6
-rw-r--r--src/array.c60
-rw-r--r--src/backtrace.c4
-rw-r--r--src/class.c107
-rw-r--r--src/codedump.c4
-rw-r--r--src/debug.c15
-rw-r--r--src/dump.c68
-rw-r--r--src/error.c65
-rw-r--r--src/etc.c25
-rw-r--r--src/fmt_fp.c119
-rw-r--r--src/gc.c327
-rw-r--r--src/hash.c58
-rw-r--r--src/kernel.c87
-rw-r--r--src/load.c88
-rw-r--r--src/numeric.c145
-rw-r--r--src/object.c29
-rw-r--r--src/print.c30
-rw-r--r--src/proc.c33
-rw-r--r--src/range.c16
-rw-r--r--src/state.c47
-rw-r--r--src/string.c126
-rw-r--r--src/symbol.c25
-rw-r--r--src/variable.c21
-rw-r--r--src/vm.c243
-rw-r--r--tasks/benchmark.rake6
-rw-r--r--tasks/mrbgems.rake12
-rw-r--r--tasks/toolchains/android.rake47
-rw-r--r--tasks/toolchains/gcc.rake6
-rw-r--r--tasks/toolchains/openwrt.rake12
-rw-r--r--tasks/toolchains/visualcpp.rake16
-rw-r--r--test/assert.rb9
-rw-r--r--test/t/ensure.rb34
-rw-r--r--test/t/exception.rb4
-rw-r--r--test/t/kernel.rb39
146 files changed, 16420 insertions, 2262 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000..335c0cdf6
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,102 @@
+name: Build & Test
+
+on: [push, pull_request]
+
+jobs:
+ Ubuntu-1604:
+ runs-on: ubuntu-16.04
+ env:
+ MRUBY_CONFIG: travis_config.rb
+ steps:
+ - uses: actions/checkout@v1
+ - name: apt
+ run: sudo apt install ruby gperf
+ - name: build
+ run: rake -m
+ - name: test
+ run: rake test
+
+ Ubuntu-1804-gcc:
+ runs-on: ubuntu-18.04
+ env:
+ MRUBY_CONFIG: travis_config.rb
+ CC: gcc
+ CXX: g++
+ steps:
+ - uses: actions/checkout@v1
+ - name: apt
+ run: sudo apt install ruby gperf gcc g++
+ - name: build
+ run: rake -m
+ - name: test
+ run: rake test
+
+ Ubuntu-1804-clang:
+ runs-on: ubuntu-18.04
+ env:
+ MRUBY_CONFIG: travis_config.rb
+ CC: clang
+ CXX: clang++
+ steps:
+ - uses: actions/checkout@v1
+ - name: apt
+ run: sudo apt install ruby gperf
+ - name: build
+ run: rake -m
+ - name: test
+ run: rake test
+
+ macOS:
+ runs-on: macos-latest
+ env:
+ MRUBY_CONFIG: travis_config.rb
+ steps:
+ - uses: actions/checkout@v1
+ - name: brew
+ run: brew install ruby gperf
+ - name: build
+ run: rake -m
+ - name: test
+ run: rake test
+
+ Windows-MinGW:
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v1
+ - name: chocolatey
+ run: choco install -y ruby gperf
+ - name: build
+ run: rake -E 'STDOUT.sync=true' test
+ env:
+ MRUBY_CONFIG: travis_config.rb
+ CFLAGS: -g -O1 -Wall -Wundef
+
+ Windows-Cygwin:
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v1
+ - uses: actions/cache@v1
+ with:
+ path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
+ key: ${{ runner.os }}-cygwin-chocolatey-${{ matrix.os }}-${{ github.sha }}
+ restore-keys: |
+ ${{ runner.os }}-cygwin-chocolatey-${{ matrix.os }}-
+ ${{ runner.os }}-cygwin-chocolatey-
+ - name: chocolatey
+ run: choco install -y cygwin
+ - name: Install cygwin packages
+ shell: cmd
+ run: C:\tools\cygwin\cygwinsetup.exe -qgnNdO -R C:/tools/cygwin -l C:/tools/cygwin/package -s http://mirrors.kernel.org/sourceware/cygwin/ -P gcc-core,gcc-g++,make,gperf,ruby
+ - name: Set ENV
+ run: |
+ echo '::set-env name=PATH::C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin'
+ - name: build
+ shell: cmd
+ run: C:\tools\cygwin\bin\ruby.exe /usr/bin/rake -E 'STDOUT.sync=true' -m
+ env:
+ MRUBY_CONFIG: travis_config.rb
+ - name: test
+ shell: cmd
+ run: C:\tools\cygwin\bin\ruby.exe /usr/bin/rake -E 'STDOUT.sync=true' test
+ env:
+ MRUBY_CONFIG: travis_config.rb
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
new file mode 100644
index 000000000..0e7a5591f
--- /dev/null
+++ b/.github/workflows/codeql-analysis.yml
@@ -0,0 +1,51 @@
+name: "Code scanning - action"
+
+on:
+ push:
+ pull_request:
+ schedule:
+ - cron: '0 19 * * 4'
+
+jobs:
+ CodeQL-Build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ with:
+ # We must fetch at least the immediate parents so that if this is
+ # a pull request then we can checkout the head.
+ fetch-depth: 2
+
+ # If this run was triggered by a pull request event, then checkout
+ # the head of the pull request instead of the merge commit.
+ - run: git checkout HEAD^2
+ if: ${{ github.event_name == 'pull_request' }}
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v1
+ # Override language selection by uncommenting this and choosing your languages
+ # with:
+ # languages: go, javascript, csharp, python, cpp, java
+
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
+ # If this step fails, then you should remove it and run the build manually (see below)
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v1
+
+ # ℹ️ Command-line programs to run using the OS shell.
+ # 📚 https://git.io/JvXDl
+
+ # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
+ # and modify them (or add more) to build your code if your project
+ # uses a compiled language
+
+ #- run: |
+ # make bootstrap
+ # make release
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v1
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 000000000..3c1a7e07e
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,24 @@
+name: CIFuzz
+on: [pull_request]
+jobs:
+ Fuzzing:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Build Fuzzers
+ uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
+ with:
+ oss-fuzz-project-name: 'mruby'
+ dry-run: false
+ - name: Run Fuzzers
+ uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
+ with:
+ oss-fuzz-project-name: 'mruby'
+ fuzz-seconds: 600
+ dry-run: false
+ - name: Upload Crash
+ uses: actions/upload-artifact@v1
+ if: failure()
+ with:
+ name: artifacts
+ path: ./out/artifacts
+
diff --git a/.gitignore b/.gitignore
index 48f085183..6a0e7e46b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,9 @@
.svn
.vscode
.yardoc
+.ccls*
+compile_flags.txt
+compile_commands.json
cscope.files
cscope.out
tags
diff --git a/.travis.yml b/.travis.yml
index fde7f7525..f04132d07 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,11 @@
language: c
-sudo: false
-
-matrix:
- include:
- - os: linux
- sudo: false
- - os: osx
- osx_image: xcode7.1
+jobs:
+ - os: linux
+ - os: osx
env:
- MRUBY_CONFIG=travis_config.rb
-script: "rake -m && rake test"
+
+script:
+ - rake -m && rake test
diff --git a/AUTHORS b/AUTHORS
index 2353ff683..83a0772a6 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -42,3 +42,5 @@ of this list.
Masahiro Wakame
YAMAMOTO Masaya
KOBAYASHI Shuji
+ RIZAL Reckordp
+ Rory O'Connell
diff --git a/Doxyfile b/Doxyfile
index 8e465afad..2550aac22 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -6,7 +6,7 @@
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "mruby"
-PROJECT_NUMBER = 2.1.0
+PROJECT_NUMBER = 2.1.2
PROJECT_BRIEF = "mruby is the lightweight implementation of the Ruby language"
diff --git a/LICENSE b/LICENSE
index ab5432331..363428a1e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2019 mruby developers
+Copyright (c) 2020 mruby developers
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/README.md b/README.md
index ab518734b..5bea9d442 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ of the Ministry of Economy, Trade and Industry of Japan.
## How to get mruby
-The stable version 2.1.0 of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/archive/2.1.0.zip](https://github.com/mruby/mruby/archive/2.1.0.zip)
+The stable version 2.1.2 of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/archive/2.1.2.zip](https://github.com/mruby/mruby/archive/2.1.2.zip)
The latest development version of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/zipball/master](https://github.com/mruby/mruby/zipball/master)
@@ -34,7 +34,7 @@ The URL of the mruby home-page is: https://mruby.org.
## Mailing list
-We don't have a mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby).
+We don't have a mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby/issues).
## How to compile and install (mruby and gems)
@@ -46,6 +46,10 @@ To run the tests, execute the following from the project's root directory.
$ rake test
+Note: `bison` bundled with MacOS is too old to compile `mruby`.
+Try `brew install bison` and follow the instuction shown to update
+the `$PATH` to compile `mruby`.
+
## Building documentation
There are two sets of documentation in mruby: the mruby API (generated by yard) and C API (Doxygen)
diff --git a/appveyor.yml b/appveyor.yml
index a91834cef..e963ea035 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,42 +1,44 @@
version: "{build}"
-os: Visual Studio 2017
-
shallow_clone: true
-
-cache:
- - win_flex_bison
-
-
environment:
matrix:
- # Visual Studio 2017 64bit
- - visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat
+ - job_name: Visual Studio 2019 64bit
+ visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat
+ appveyor_build_worker_image: Visual Studio 2019
- # Visual Studio 2015 64bit
- - visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
- machine: amd64
+ - job_name: Visual Studio 2019 32bit
+ visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat
+ appveyor_build_worker_image: Visual Studio 2019
- # Visual Studio 2013 64bit
- - visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat
- machine: amd64
+ - job_name: Visual Studio 2017 64bit
+ visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat
+ appveyor_build_worker_image: Visual Studio 2017
+ - job_name: Visual Studio 2017 32bit
+ visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat
+ appveyor_build_worker_image: Visual Studio 2017
+
+ - job_name: Visual Studio 2015 64bit
+ visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
+ appveyor_build_worker_image: Visual Studio 2015
+ machine: x86_amd64
+
+ - job_name: Visual Studio 2015 32bit
+ visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
+ appveyor_build_worker_image: Visual Studio 2015
+ machine: x86
init:
- call "%visualcpp%" %machine%
- # For using Rubyinstaller's Ruby 2.4 64bit
- - set PATH=C:\Ruby24-x64\bin;%PATH%
+ # For using Rubyins4aller's Ruby 2.6 64bit
+ # 2.6 is the highest supported Ruby version across all historical
+ # Visual Studio AppVeyor images. Ruby 2.7 is only on the 2019 image.
+ - set PATH=C:\Ruby26-x64\bin;%PATH%
- ruby --version
-
-install:
- - if not exist win_flex_bison (
- appveyor DownloadFile "https://github.com/lexxmark/winflexbison/releases/download/v.2.5.10/win_flex_bison-2.5.10.zip" &
- 7z x -y -owin_flex_bison win_flex_bison-2.5.10.zip
- )
-
build_script:
- - set YACC=.\win_flex_bison\win_bison.exe
- set MRUBY_CONFIG=appveyor_config.rb
- - rake -E $stdout.sync=true test
+ - rake -m -j4
+ - rake -E STDOUT.sync=true test
diff --git a/appveyor_config.rb b/appveyor_config.rb
index fd14f4a4c..25745daa8 100644
--- a/appveyor_config.rb
+++ b/appveyor_config.rb
@@ -1,3 +1,9 @@
+def setup_option(conf)
+ conf.cc.flags[0].delete("/Zi") unless ENV['CFLAGS']
+ conf.cxx.flags[0].delete("/Zi") unless ENV['CFLAGS'] || ENV['CXXFLAGS']
+ conf.linker.flags << "/DEBUG:NONE" unless ENV['LDFLAGS']
+end
+
MRuby::Build.new('full-debug') do |conf|
toolchain :visualcpp
enable_debug
@@ -5,6 +11,7 @@ MRuby::Build.new('full-debug') do |conf|
# include all core GEMs
conf.gembox 'full-core'
conf.cc.defines += %w(MRB_GC_STRESS MRB_METHOD_CACHE MRB_ENABLE_DEBUG_HOOK)
+ setup_option(conf)
conf.enable_test
end
@@ -17,6 +24,7 @@ MRuby::Build.new do |conf|
conf.compilers.each do |c|
c.defines += %w(MRB_GC_FIXED_ARENA)
end
+ setup_option(conf)
conf.enable_bintest
conf.enable_test
end
@@ -28,6 +36,7 @@ MRuby::Build.new('cxx_abi') do |conf|
conf.compilers.each do |c|
c.defines += %w(MRB_GC_FIXED_ARENA)
end
+ setup_option(conf)
conf.enable_bintest
conf.enable_test
diff --git a/build_config.rb b/build_config.rb
index c0c079c89..254a28ce0 100644
--- a/build_config.rb
+++ b/build_config.rb
@@ -30,9 +30,9 @@ MRuby::Build.new do |conf|
# cc.flags = [ENV['CFLAGS'] || %w()]
# cc.include_paths = ["#{root}/include"]
# cc.defines = %w()
- # cc.option_include_path = '-I%s'
+ # cc.option_include_path = %q[-I"%s"]
# cc.option_define = '-D%s'
- # cc.compile_options = "%{flags} -MMD -o %{outfile} -c %{infile}"
+ # cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"]
# end
# mrbc settings
@@ -50,25 +50,25 @@ MRuby::Build.new do |conf|
# linker.library_paths = []
# linker.option_library = '-l%s'
# linker.option_library_path = '-L%s'
- # linker.link_options = "%{flags} -o %{outfile} %{objs} %{libs}"
+ # linker.link_options = "%{flags} -o "%{outfile}" %{objs} %{libs}"
# end
# Archiver settings
# conf.archiver do |archiver|
# archiver.command = ENV['AR'] || 'ar'
- # archiver.archive_options = 'rs %{outfile} %{objs}'
+ # archiver.archive_options = 'rs "%{outfile}" %{objs}'
# end
# Parser generator settings
# conf.yacc do |yacc|
# yacc.command = ENV['YACC'] || 'bison'
- # yacc.compile_options = '-o %{outfile} %{infile}'
+ # yacc.compile_options = %q[-o "%{outfile}" "%{infile}"]
# end
# gperf settings
# conf.gperf do |gperf|
# gperf.command = 'gperf'
- # gperf.compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'
+ # gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"]
# end
# file extensions
diff --git a/doc/guides/compile.md b/doc/guides/compile.md
index ba23fcfb4..d7937bb2e 100644
--- a/doc/guides/compile.md
+++ b/doc/guides/compile.md
@@ -6,12 +6,16 @@ binaries.
## Prerequisites
To compile mruby out of the source code you need the following tools:
-* C Compiler (e.g. `gcc`)
-* Linker (e.g. `gcc`)
+* C Compiler (e.g. `gcc` or `clang`)
+* Linker (e.g. `gcc` or `clang`)
* Archive utility (e.g. `ar`)
* Parser generator (e.g. `bison`)
* Ruby 2.0 or later (e.g. `ruby` or `jruby`)
+Note that `bison` bundled with MacOS is too old to compile `mruby`.
+Try `brew install bison` and follow the instuction shown to update
+the `$PATH` to compile `mruby`.
+
Optional:
* GIT (to update mruby source and integrate mrbgems easier)
* C++ compiler (to use GEMs which include \*.cpp, \*.cxx, \*.cc)
diff --git a/doc/guides/debugger.md b/doc/guides/debugger.md
index a94ef1802..61c0418b0 100644
--- a/doc/guides/debugger.md
+++ b/doc/guides/debugger.md
@@ -38,7 +38,7 @@ To confirm mrdb was installed properly, run mrdb with the `--version` option:
```bash
$ mrdb --version
-mruby 2.1.0 (2019-11-19)
+mruby 2.1.2 (2020-08-06)
```
## 2.2 Basic Operation
diff --git a/doc/limitations.md b/doc/limitations.md
index 9ad2019f7..770daa7a4 100644
--- a/doc/limitations.md
+++ b/doc/limitations.md
@@ -38,7 +38,7 @@ puts [1,2,3]
3
```
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
```
[1, 2, 3]
@@ -61,7 +61,7 @@ end
`ZeroDivisionError` is raised.
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
No exception is raised.
@@ -89,7 +89,7 @@ p Liste.new "foobar"
` [] `
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
`ArgumentError` is raised.
@@ -119,7 +119,7 @@ false
true
```
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
```
true
@@ -156,7 +156,7 @@ p 'ok'
ok
```
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
```
test.rb:8: undefined method 'test_func' (NoMethodError)
@@ -178,7 +178,7 @@ defined?(Foo)
nil
```
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
`NameError` is raised.
@@ -195,7 +195,7 @@ alias $a $__a__
` nil `
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
Syntax error
@@ -217,7 +217,7 @@ end
`ArgumentError` is raised.
The re-defined `+` operator does not accept any arguments.
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
` 'ab' `
Behavior of the operator wasn't changed.
@@ -233,7 +233,7 @@ $ ruby -e 'puts Proc.new {}.binding'
#<Binding:0x00000e9deabb9950>
```
-#### mruby [2.1.0 (2019-11-19)]
+#### mruby [2.1.2 (2020-08-06)]
```
$ ./bin/mruby -e 'puts Proc.new {}.binding'
@@ -255,7 +255,7 @@ $ ruby -e 'def m(*r,**k) p [r,k] end; m("a"=>1,:b=>2)'
[[{"a"=>1}], {:b=>2}]
```
-#### mruby [mruby 2.1.0]
+#### mruby [mruby 2.1.2]
```
$ ./bin/mruby -e 'def m(*r,**k) p [r,k] end; m("a"=>1,:b=>2)'
diff --git a/doc/opcode.md b/doc/opcode.md
index 574a3c83f..a79453e8a 100644
--- a/doc/opcode.md
+++ b/doc/opcode.md
@@ -16,7 +16,6 @@ In the table.1 below, the second field describes the size (and
sign) of operands.
* B: 8bit
-* sB: signed 8bit
* S: 16bit
* sS: signed 16bit
* W: 24bit
@@ -31,97 +30,111 @@ with `"`, either `OP_EXT1` or `OP_EXT2` or `OP_EXT2` can be prefixed.
## table.1 Instruction Table
-| Instruction Name | Operand type | Semantics |
-|:-----------------|--------------|---------------------|
-| OP_NOP | - | |
-| OP_MOVE" | BB | R(a) = R(b)
-| OP_LOADL" | BB | R(a) = Pool(b)
-| OP_LOADI" | BsB | R(a) = mrb_int(b)
-| OP_LOADI_0' | B | R(a) = 0
-| OP_LOADI_1' | B | R(a) = 1
-| OP_LOADI_2' | B | R(a) = 2
-| OP_LOADI_3' | B | R(a) = 3
-| OP_LOADSYM" | BB | R(a) = Syms(b)
-| OP_LOADNIL' | B | R(a) = nil
-| OP_LOADSELF' | B | R(a) = self
-| OP_LOADT' | B | R(a) = true
-| OP_LOADF' | B | R(a) = false
-| OP_GETGV" | BB | R(a) = getglobal(Syms(b))
-| OP_SETGV" | BB | setglobal(Syms(b), R(a))
-| OP_GETSV" | BB | R(a) = Special[b]
-| OP_SETSV" | BB | Special[b] = R(a)
-| OP_GETIV" | BB | R(a) = ivget(Syms(b))
-| OP_SETIV" | BB | ivset(Syms(b),R(a))
-| OP_GETCV" | BB | R(a) = cvget(Syms(b))
-| OP_SETCV" | BB | cvset(Syms(b),R(a))
-| OP_GETCONST" | BB | R(a) = constget(Syms(b))
-| OP_SETCONST" | BB | constset(Syms(b),R(a))
-| OP_GETMCNST" | BB | R(a) = R(a)::Syms(b)
-| OP_SETMCNST" | BB | R(a+1)::Syms(b) = R(a)
-| OP_GETUPVAR' | BBB | R(a) = uvget(b,c)
-| OP_SETUPVAR' | BBB | uvset(b,c,R(a))
-| OP_JMP | S | pc+=a
-| OP_JMPIF' | SB | if R(b) pc+=a
-| OP_JMPNOT' | SB | if !R(b) pc+=a
-| OP_ONERR | sS | rescue_push(pc+a)
-| OP_EXCEPT' | B | R(a) = exc
-| OP_RESCUE" | BB | R(b) = R(a).isa?(R(b))
-| OP_POPERR | B | a.times{rescue_pop()}
-| OP_RAISE' | B | raise(R(a))
-| OP_EPUSH' | B | ensure_push(SEQ[a])
-| OP_EPOP | B | A.times{ensure_pop().call}
-| OP_SENDV" | BB | R(a) = call(R(a),Syms(b),*R(a+1))
-| OP_SENDVB" | BB | R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2))
-| OP_SEND" | BBB | R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c))
-| OP_SENDB" | BBB | R(a) = call(R(a),Syms(Bx),R(a+1),...,R(a+c),&R(a+c+1))
-| OP_CALL' | B | R(a) = self.call(frame.argc, frame.argv)
-| OP_SUPER' | BB | R(a) = super(R(a+1),... ,R(a+b+1))
-| OP_ARGARY' | BS | R(a) = argument array (16=5:1:5:1:4)
-| OP_ENTER | W | arg setup according to flags (23=5:5:1:5:5:1:1)
-| OP_KARG" | BB | R(a) = kdict[Syms(Bx)] # todo
-| OP_KARG2" | BB | R(a) = kdict[Syms(Bx)]; kdict.rm(Syms(b)) # todo
-| OP_RETURN' | B | return R(a) (normal)
-| OP_RETURN_BLK' | B | return R(a) (in-block return)
-| OP_BREAK' | B | break R(a)
-| OP_BLKPUSH' | BS | R(a) = block (16=5:1:5:1:4)
-| OP_ADD" | BB | R(a) = R(a)+R(a+1)
-| OP_ADDI" | BBB | R(a) = R(a)+mrb_int(c)
-| OP_SUB" | BB | R(a) = R(a)-R(a+1)
-| OP_SUBI" | BB | R(a) = R(a)-C
-| OP_MUL" | BB | R(a) = R(a)*R(a+1)
-| OP_DIV" | BB | R(a) = R(a)/R(a+1)
-| OP_EQ" | BB | R(a) = R(a)==R(a+1)
-| OP_LT" | BB | R(a) = R(a)<R(a+1)
-| OP_LE" | BB | R(a) = R(a)<=R(a+1)
-| OP_GT" | BB | R(a) = R(a)>R(a+1)
-| OP_GE" | BB | R(a) = R(a)>=R(a+1)
-| OP_ARRAY' | BB | R(a) = ary_new(R(a),R(a+1)..R(a+b))
-| OP_ARRAY2" | BB | R(a) = ary_new(R(b),R(b+1)..R(b+c))
-| OP_ARYCAT' | B | ary_cat(R(a),R(a+1))
-| OP_ARYPUSH' | B | ary_push(R(a),R(a+1))
-| OP_AREF' | BB | R(a) = R(a)[b]
-| OP_ASET' | BB | R(a)[b] = R(a+1)
-| OP_APOST' | BB | *R(a),R(A+1)..R(A+C) = R(a)[B..]
-| OP_STRING" | BB | R(a) = str_dup(Lit(b))
-| OP_STRCAT' | B | str_cat(R(a),R(a+1))
-| OP_HASH' | BB | R(a) = hash_new(R(a),R(a+1)..R(a+b))
-| OP_HASHADD' | BB | R(a) = hash_push(R(a),R(a+1)..R(a+b))
-| OP_LAMBDA" | BB | R(a) = lambda(SEQ[b],OP_L_LAMBDA)
-| OP_BLOCK" | BB | R(a) = lambda(SEQ[b],OP_L_BLOCK)
-| OP_METHOD" | BB | R(a) = lambda(SEQ[b],OP_L_METHOD)
-| OP_RANGE_INC' | B | R(a) = range_new(R(a),R(a+1),FALSE)
-| OP_RANGE_EXC' | B | R(a) = range_new(R(a),R(a+1),TRUE)
-| OP_OCLASS' | B | R(a) = ::Object
-| OP_CLASS" | BB | R(a) = newclass(R(a),Syms(b),R(a+1))
-| OP_MODULE" | BB | R(a) = newmodule(R(a),Syms(b))
-| OP_EXEC" | BB | R(a) = blockexec(R(a),SEQ[b])
-| OP_DEF" | BB | R(a).newmethod(Syms(b),R(a+1))
-| OP_ALIAS' | B | alias_method(R(a),R(a+1),R(a+2))
-| OP_UNDEF" | BB | undef_method(R(a),Syms(b))
-| OP_SCLASS' | B | R(a) = R(a).singleton_class
-| OP_TCLASS' | B | R(a) = target_class
-| OP_ERR' | B | raise(RuntimeError, Lit(Bx))
-| OP_EXT1 | - | make 1st operand 16bit
-| OP_EXT2 | - | make 2nd operand 16bit
-| OP_EXT3 | - | make 1st and 2nd operands 16bit
-| OP_STOP | - | stop VM
+| Instruction Name | Operand type | Semantics |
+|------------------|--------------|--------------------------------------------------------|
+| OP_NOP | - | no operation |
+| OP_MOVE" | BB | R(a) = R(b) |
+| OP_LOADL" | BB | R(a) = Pool(b) |
+| OP_LOADI" | BB | R(a) = mrb_int(b) |
+| OP_LOADINEG" | BB | R(a) = mrb_int(-b) |
+| OP_LOADI__1' | B | R(a) = mrb_int(-1) |
+| OP_LOADI_0' | B | R(a) = mrb_int(0) |
+| OP_LOADI_1' | B | R(a) = mrb_int(1) |
+| OP_LOADI_2' | B | R(a) = mrb_int(2) |
+| OP_LOADI_3' | B | R(a) = mrb_int(3) |
+| OP_LOADI_4' | B | R(a) = mrb_int(4) |
+| OP_LOADI_5' | B | R(a) = mrb_int(5) |
+| OP_LOADI_6' | B | R(a) = mrb_int(6) |
+| OP_LOADI_7' | B | R(a) = mrb_int(7) |
+| OP_LOADI16' | BsS | R(a) = mrb_int(b) |
+| OP_LOADSYM" | BB | R(a) = Syms(b) |
+| OP_LOADNIL' | B | R(a) = nil |
+| OP_LOADSELF' | B | R(a) = self |
+| OP_LOADT' | B | R(a) = true |
+| OP_LOADF' | B | R(a) = false |
+| OP_GETGV" | BB | R(a) = getglobal(Syms(b)) |
+| OP_SETGV" | BB | setglobal(Syms(b), R(a)) |
+| OP_GETSV" | BB | R(a) = Special[Syms(b)] |
+| OP_SETSV" | BB | Special[Syms(b)] = R(a) |
+| OP_GETIV" | BB | R(a) = ivget(Syms(b)) |
+| OP_SETIV" | BB | ivset(Syms(b),R(a)) |
+| OP_GETCV" | BB | R(a) = cvget(Syms(b)) |
+| OP_SETCV" | BB | cvset(Syms(b),R(a)) |
+| OP_GETCONST" | BB | R(a) = constget(Syms(b)) |
+| OP_SETCONST" | BB | constset(Syms(b),R(a)) |
+| OP_GETMCNST" | BB | R(a) = R(a)::Syms(b) |
+| OP_SETMCNST" | BB | R(a+1)::Syms(b) = R(a) |
+| OP_GETUPVAR" | BBB | R(a) = uvget(b,c) |
+| OP_SETUPVAR" | BBB | uvset(b,c,R(a)) |
+| OP_JMP | S | pc=a |
+| OP_JMPIF' | BS | if R(a) pc=b |
+| OP_JMPNOT' | BS | if !R(a) pc=b |
+| OP_JMPNIL' | BS | if R(a)==nil pc=b |
+| OP_ONERR | S | rescue_push(a) |
+| OP_EXCEPT' | B | R(a) = exc |
+| OP_RESCUE" | BB | R(b) = R(a).isa?(R(b)) |
+| OP_POPERR' | B | a.times{rescue_pop()} |
+| OP_RAISE' | B | raise(R(a)) |
+| OP_EPUSH' | B | ensure_push(SEQ[a]) |
+| OP_EPOP' | B | A.times{ensure_pop().call} |
+| OP_SENDV" | BB | R(a) = call(R(a),Syms(b),*R(a+1)) |
+| OP_SENDVB" | BB | R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2)) |
+| OP_SEND" | BBB | R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c)) |
+| OP_SENDB" | BBB | R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c),&R(a+c+1)) |
+| OP_CALL | - | R(0) = self.call(frame.argc, frame.argv) |
+| OP_SUPER" | BB | R(a) = super(R(a+1),... ,R(a+b+1)) |
+| OP_ARGARY' | BS | R(a) = argument array (16=5:1:5:1:4) |
+| OP_ENTER | W | arg setup according to flags (23=5:5:1:5:5:1:1) |
+| OP_KEY_P" | BB | R(a) = kdict.key?(Syms(b)) |
+| OP_KEYEND | - | raise unless kdict.empty? |
+| OP_KARG" | BB | R(a) = kdict[Syms(b)]; kdict.delete(Syms(b)) |
+| OP_RETURN' | B | return R(a) (normal) |
+| OP_RETURN_BLK' | B | return R(a) (in-block return) |
+| OP_BREAK' | B | break R(a) |
+| OP_BLKPUSH' | BS | R(a) = block (16=5:1:5:1:4) |
+| OP_ADD' | B | R(a) = R(a)+R(a+1) |
+| OP_ADDI" | BB | R(a) = R(a)+mrb_int(b) |
+| OP_SUB' | B | R(a) = R(a)-R(a+1) |
+| OP_SUBI" | BB | R(a) = R(a)-mrb_int(b) |
+| OP_MUL' | B | R(a) = R(a)*R(a+1) |
+| OP_DIV' | B | R(a) = R(a)/R(a+1) |
+| OP_EQ' | B | R(a) = R(a)==R(a+1) |
+| OP_LT' | B | R(a) = R(a)<R(a+1) |
+| OP_LE' | B | R(a) = R(a)<=R(a+1) |
+| OP_GT' | B | R(a) = R(a)>R(a+1) |
+| OP_GE' | B | R(a) = R(a)>=R(a+1) |
+| OP_ARRAY" | BB | R(a) = ary_new(R(a),R(a+1)..R(a+b)) |
+| OP_ARRAY2" | BBB | R(a) = ary_new(R(b),R(b+1)..R(b+c)) |
+| OP_ARYCAT' | B | ary_cat(R(a),R(a+1)) |
+| OP_ARYPUSH' | B | ary_push(R(a),R(a+1)) |
+| OP_ARYDUP' | B | R(a) = ary_dup(R(a)) |
+| OP_AREF" | BBB | R(a) = R(b)[c] |
+| OP_ASET" | BBB | R(a)[c] = R(b) |
+| OP_APOST" | BBB | *R(a),R(a+1)..R(a+c) = R(a)[b..] |
+| OP_INTERN' | B | R(a) = intern(R(a)) |
+| OP_STRING" | BB | R(a) = str_dup(Lit(b)) |
+| OP_STRCAT' | B | str_cat(R(a),R(a+1)) |
+| OP_HASH" | BB | R(a) = hash_new(R(a),R(a+1)..R(a+b)) |
+| OP_HASHADD" | BB | R(a) = hash_push(R(a),R(a+1)..R(a+b)) |
+| OP_HASHCAT' | B | R(a) = hash_cat(R(a),R(a+1)) |
+| OP_LAMBDA" | BB | R(a) = lambda(SEQ[b],OP_L_LAMBDA) |
+| OP_BLOCK" | BB | R(a) = lambda(SEQ[b],OP_L_BLOCK) |
+| OP_METHOD" | BB | R(a) = lambda(SEQ[b],OP_L_METHOD) |
+| OP_RANGE_INC' | B | R(a) = range_new(R(a),R(a+1),FALSE) |
+| OP_RANGE_EXC' | B | R(a) = range_new(R(a),R(a+1),TRUE) |
+| OP_OCLASS' | B | R(a) = ::Object |
+| OP_CLASS" | BB | R(a) = newclass(R(a),Syms(b),R(a+1)) |
+| OP_MODULE" | BB | R(a) = newmodule(R(a),Syms(b)) |
+| OP_EXEC" | BB | R(a) = blockexec(R(a),SEQ[b]) |
+| OP_DEF" | BB | R(a).newmethod(Syms(b),R(a+1)) |
+| OP_ALIAS" | BB | alias_method(target_class,Syms(a),Syms(b)) |
+| OP_UNDEF' | B | undef_method(target_class,Syms(a)) |
+| OP_SCLASS' | B | R(a) = R(a).singleton_class |
+| OP_TCLASS' | B | R(a) = target_class |
+| OP_DEBUG" | BBB | print a,b,c |
+| OP_ERR' | B | raise(LocalJumpError, Lit(a)) |
+| OP_EXT1 | - | make 1st operand 16bit |
+| OP_EXT2 | - | make 2nd operand 16bit |
+| OP_EXT3 | - | make 1st and 2nd operands 16bit |
+| OP_STOP | - | stop VM |
+|------------------|--------------|--------------------------------------------------------|
diff --git a/examples/targets/build_config_ArduinoDue.rb b/examples/targets/build_config_ArduinoDue.rb
index 527aaa4f6..09646a700 100644
--- a/examples/targets/build_config_ArduinoDue.rb
+++ b/examples/targets/build_config_ArduinoDue.rb
@@ -42,7 +42,7 @@ MRuby::CrossBuild.new("ArduinoDue") do |conf|
cc.flags = %w(-g -Os -w -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500
-Dprintf=iprintf -mcpu=cortex-m3 -DF_CPU=84000000L -DARDUINO=156 -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM
-D__SAM3X8E__ -mthumb -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON -DUSB_MANUFACTURER="Unknown" -DUSB_PRODUCT="Arduino Due")
- cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
+ cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
#configuration for low memory environment
cc.defines << %w(MRB_HEAP_PAGE_SIZE=64)
@@ -64,7 +64,7 @@ MRuby::CrossBuild.new("ArduinoDue") do |conf|
conf.archiver do |archiver|
archiver.command = "#{BIN_PATH}/arm-none-eabi-ar"
- archiver.archive_options = 'rcs %{outfile} %{objs}'
+ archiver.archive_options = 'rcs "%{outfile}" %{objs}'
end
#no executables
diff --git a/examples/targets/build_config_IntelEdison.rb b/examples/targets/build_config_IntelEdison.rb
index 8fa3aa0c0..a22f9cfd2 100644
--- a/examples/targets/build_config_IntelEdison.rb
+++ b/examples/targets/build_config_IntelEdison.rb
@@ -32,7 +32,7 @@ MRuby::CrossBuild.new('core2-32-poky-linux') do |conf|
cc.flags = %w(-m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign -fno-omit-frame-pointer)
cc.flags << %w(-O2 -pipe -g -feliminate-unused-debug-types)
cc.flags << "--sysroot=#{POKY_EDISON_SYSROOT}"
- cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
+ cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
cc.defines = %w(ENABLE_READLINE)
end
@@ -47,7 +47,7 @@ MRuby::CrossBuild.new('core2-32-poky-linux') do |conf|
conf.archiver do |archiver|
archiver.command = "#{POKY_EDISON_BIN_PATH}/i586-poky-linux-ar"
- archiver.archive_options = 'rcs %{outfile} %{objs}'
+ archiver.archive_options = 'rcs "%{outfile}" %{objs}'
end
conf.linker do |linker|
diff --git a/examples/targets/build_config_IntelGalileo.rb b/examples/targets/build_config_IntelGalileo.rb
index 42f800d9f..42f39c456 100644
--- a/examples/targets/build_config_IntelGalileo.rb
+++ b/examples/targets/build_config_IntelGalileo.rb
@@ -39,7 +39,7 @@ MRuby::CrossBuild.new("Galileo") do |conf|
cc.flags = %w(-m32 -march=i586 -c -g -Os -w
-ffunction-sections -fdata-sections -MMD -DARDUINO=153)
cc.flags << "--sysroot=#{GALILEO_SYSROOT}"
- cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
+ cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
end
conf.cxx do |cxx|
@@ -54,7 +54,7 @@ MRuby::CrossBuild.new("Galileo") do |conf|
conf.archiver do |archiver|
archiver.command = "#{GALILEO_BIN_PATH}/i586-poky-linux-uclibc-ar"
- archiver.archive_options = 'rcs %{outfile} %{objs}'
+ archiver.archive_options = 'rcs "%{outfile}" %{objs}'
end
conf.linker do |linker|
diff --git a/examples/targets/build_config_RX630.rb b/examples/targets/build_config_RX630.rb
index fd17eae99..8b1bbb42f 100644
--- a/examples/targets/build_config_RX630.rb
+++ b/examples/targets/build_config_RX630.rb
@@ -27,7 +27,7 @@ MRuby::CrossBuild.new("RX630") do |conf|
conf.cc do |cc|
cc.command = "#{BIN_PATH}/rx-elf-gcc"
cc.flags = "-Wall -g -O2 -flto -mcpu=rx600 -m64bit-doubles"
- cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
+ cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
#configuration for low memory environment
cc.defines << %w(MRB_USE_FLOAT)
@@ -53,7 +53,7 @@ MRuby::CrossBuild.new("RX630") do |conf|
conf.archiver do |archiver|
archiver.command = "#{BIN_PATH}/rx-elf-ar"
- archiver.archive_options = 'rcs %{outfile} %{objs}'
+ archiver.archive_options = 'rcs "%{outfile}" %{objs}'
end
#no executables
diff --git a/examples/targets/build_config_chipKITMax32.rb b/examples/targets/build_config_chipKITMax32.rb
index 951f71483..8617d8d10 100644
--- a/examples/targets/build_config_chipKITMax32.rb
+++ b/examples/targets/build_config_chipKITMax32.rb
@@ -39,7 +39,7 @@ MRuby::CrossBuild.new("chipKITMax32") do |conf|
cc.flags = %w(-O2 -mno-smart-io -w -ffunction-sections -fdata-sections -g -mdebugger -Wcast-align
-fno-short-double -mprocessor=32MX795F512L -DF_CPU=80000000L -DARDUINO=23 -D_BOARD_MEGA_
-DMPIDEVER=0x01000202 -DMPIDE=23)
- cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
+ cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
#configuration for low memory environment
cc.defines << %w(MRB_HEAP_PAGE_SIZE=64)
@@ -60,7 +60,7 @@ MRuby::CrossBuild.new("chipKITMax32") do |conf|
conf.archiver do |archiver|
archiver.command = "#{PIC32_PATH}/compiler/pic32-tools/bin/pic32-ar"
- archiver.archive_options = 'rcs %{outfile} %{objs}'
+ archiver.archive_options = 'rcs "%{outfile}" %{objs}'
end
#no executables
diff --git a/examples/targets/build_config_dreamcast_shelf.rb b/examples/targets/build_config_dreamcast_shelf.rb
new file mode 100644
index 000000000..85b2ff20d
--- /dev/null
+++ b/examples/targets/build_config_dreamcast_shelf.rb
@@ -0,0 +1,108 @@
+MRuby::Build.new do |conf|
+ # Gets set by the VS command prompts
+ if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']
+ toolchain :visualcpp
+ else
+ toolchain :gcc
+ end
+
+ enable_debug
+
+ # Include the default GEMs
+ conf.gembox 'default'
+end
+
+# Cross Compiling configuration for the Sega Dreamcast
+# This configuration requires KallistiOS (KOS)
+# https://dreamcast.wiki
+#
+# Tested on GNU/Linux, MinGW-w64/MSYS2, Cygwin, macOS and MinGW/MSYS (see below)
+#
+MRuby::CrossBuild.new("dreamcast") do |conf|
+ toolchain :gcc
+
+ # Support for DreamSDK (based on MinGW/MSYS)
+ # To compile mruby with DreamSDK, RubyInstaller for Windows should be installed
+ DREAMSDK_HOME = ENV["DREAMSDK_HOME"]
+ MSYS_ROOT = !(DREAMSDK_HOME.nil? || DREAMSDK_HOME.empty?) ? "#{DREAMSDK_HOME}/msys/1.0" : ""
+
+ # Setting paths
+ DREAMCAST_PATH = "#{MSYS_ROOT}/opt/toolchains/dc"
+ KOS_PATH = "#{DREAMCAST_PATH}/kos"
+ BIN_PATH = "#{DREAMCAST_PATH}/sh-elf/bin"
+
+ # C compiler
+ # Flags were extracted from KallistiOS environment files
+ conf.cc do |cc|
+ cc.command = "#{BIN_PATH}/sh-elf-gcc"
+ cc.include_paths << ["#{KOS_PATH}/include", "#{KOS_PATH}/kernel/arch/dreamcast/include", "#{KOS_PATH}/addons/include", "#{KOS_PATH}/../kos-ports/include"]
+ cc.flags << ["-O2", "-fomit-frame-pointer", "-ml", "-m4-single-only", "-ffunction-sections", "-fdata-sections", "-Wall", "-g", "-fno-builtin", "-ml", "-m4-single-only", "-Wl,-Ttext=0x8c010000", "-Wl,--gc-sections", "-T#{KOS_PATH}/utils/ldscripts/shlelf.xc", "-nodefaultlibs"]
+ cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
+ cc.defines << %w(_arch_dreamcast)
+ cc.defines << %w(_arch_sub_pristine)
+ end
+
+ # C++ compiler
+ conf.cxx do |cxx|
+ cxx.command = conf.cc.command.dup
+ cxx.include_paths = conf.cc.include_paths.dup
+ cxx.flags = conf.cc.flags.dup
+ cxx.flags << %w(-fno-rtti -fno-exceptions)
+ cxx.defines = conf.cc.defines.dup
+ cxx.compile_options = conf.cc.compile_options.dup
+ end
+
+ # Linker
+ # There is an issue when making the mruby library with KallistiOS:
+ # 'newlib_kill.o' and 'newlib_getpid.o' aren't found so they are explicitly
+ # specified here at least for now.
+ conf.linker do |linker|
+ linker.command="#{BIN_PATH}/sh-elf-gcc"
+ linker.flags << ["#{MSYS_ROOT}/opt/toolchains/dc/kos/kernel/build/newlib_kill.o", "#{MSYS_ROOT}/opt/toolchains/dc/kos/kernel/build/newlib_getpid.o", "-Wl,--start-group -lkallisti -lc -lgcc -Wl,--end-group"]
+ linker.library_paths << ["#{KOS_PATH}/lib/dreamcast", "#{KOS_PATH}/addons/lib/dreamcast", "#{KOS_PATH}/../kos-ports/lib"]
+ end
+
+ # Archiver
+ conf.archiver do |archiver|
+ archiver.command = "#{BIN_PATH}/sh-elf-ar"
+ archiver.archive_options = 'rcs "%{outfile}" %{objs}'
+ end
+
+ # No executables
+ conf.bins = []
+
+ # Do not build executable test
+ conf.build_mrbtest_lib_only
+
+ # Disable C++ exception
+ conf.disable_cxx_exception
+
+ # Gems from core
+ # removing mruby-io
+ conf.gem :core => "mruby-metaprog"
+ conf.gem :core => "mruby-pack"
+ conf.gem :core => "mruby-sprintf"
+ conf.gem :core => "mruby-print"
+ conf.gem :core => "mruby-math"
+ conf.gem :core => "mruby-time"
+ conf.gem :core => "mruby-struct"
+ conf.gem :core => "mruby-compar-ext"
+ conf.gem :core => "mruby-enum-ext"
+ conf.gem :core => "mruby-string-ext"
+ conf.gem :core => "mruby-numeric-ext"
+ conf.gem :core => "mruby-array-ext"
+ conf.gem :core => "mruby-hash-ext"
+ conf.gem :core => "mruby-range-ext"
+ conf.gem :core => "mruby-proc-ext"
+ conf.gem :core => "mruby-symbol-ext"
+ conf.gem :core => "mruby-random"
+ conf.gem :core => "mruby-object-ext"
+ conf.gem :core => "mruby-objectspace"
+ conf.gem :core => "mruby-fiber"
+ conf.gem :core => "mruby-enumerator"
+ conf.gem :core => "mruby-enum-lazy"
+ conf.gem :core => "mruby-toplevel-ext"
+ conf.gem :core => "mruby-kernel-ext"
+ conf.gem :core => "mruby-class-ext"
+ conf.gem :core => "mruby-compiler"
+end
diff --git a/include/mrbconf.h b/include/mrbconf.h
index 3a574c7d2..2b1adb24e 100644
--- a/include/mrbconf.h
+++ b/include/mrbconf.h
@@ -38,7 +38,13 @@
/* add -DMRB_METHOD_T_STRUCT on machines that use higher bits of pointers */
/* no MRB_METHOD_T_STRUCT requires highest 2 bits of function pointers to be zero */
-//#define MRB_METHOD_T_STRUCT
+#ifndef MRB_METHOD_T_STRUCT
+ // can't use highest 2 bits of function pointers at least on 32bit
+ // Windows and 32bit Linux.
+# ifdef MRB_32BIT
+# define MRB_METHOD_T_STRUCT
+# endif
+#endif
/* add -DMRB_INT32 to use 32bit integer for mrb_int; conflict with MRB_INT64;
Default for 32-bit CPU mode. */
diff --git a/include/mruby.h b/include/mruby.h
index 671053ff9..63cd753b0 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -1,7 +1,7 @@
/*
** mruby - An embeddable Ruby implementation
**
-** Copyright (c) mruby developers 2010-2019
+** Copyright (c) mruby developers 2010-2020
**
** Permission is hereby granted, free of charge, to any person obtaining
** a copy of this software and associated documentation files (the
@@ -62,15 +62,37 @@
#define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
#endif
-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L
-#define mrb_static_assert(exp, str) _Static_assert(exp, str)
+#if (defined __cplusplus && __cplusplus >= 201103L) || \
+ (defined _MSC_VER) || \
+ (defined __GXX_EXPERIMENTAL_CXX0X__) /* for old G++/Clang++ */
+# define mrb_static_assert(exp, str) static_assert(exp, str)
+#elif defined __STDC_VERSION__ && \
+ ((__STDC_VERSION__ >= 201112L) || \
+ (defined __GNUC__ && __GNUC__ * 100 + __GNUC_MINOR__ >= 406))
+# define mrb_static_assert(exp, str) _Static_assert(exp, str)
#else
-#define mrb_static_assert(exp, str) mrb_assert(exp)
+# /* alternative implementation of static_assert() */
+# define _mrb_static_assert_cat0(a, b) a##b
+# define _mrb_static_assert_cat(a, b) _mrb_static_assert_cat0(a, b)
+# ifdef __COUNTER__
+# define _mrb_static_assert_id(prefix) _mrb_static_assert_cat(prefix, __COUNTER__)
+# else
+# define _mrb_static_assert_id(prefix) _mrb_static_assert_cat(prefix, __LINE__)
+# endif
+# define mrb_static_assert(exp, str) \
+ struct _mrb_static_assert_id(_mrb_static_assert_) { char x[(exp) ? 1 : -1]; }
#endif
+#define mrb_static_assert1(exp) mrb_static_assert(exp, #exp)
#include "mrbconf.h"
+#include <mruby/common.h>
+#include <mruby/value.h>
+#include <mruby/gc.h>
+#include <mruby/version.h>
+
#ifndef MRB_WITHOUT_FLOAT
+#include <float.h>
#ifndef FLT_EPSILON
#define FLT_EPSILON (1.19209290e-07f)
#endif
@@ -88,11 +110,6 @@
#endif
#endif
-#include <mruby/common.h>
-#include <mruby/value.h>
-#include <mruby/gc.h>
-#include <mruby/version.h>
-
/**
* MRuby C API entry point
*/
@@ -164,8 +181,8 @@ struct mrb_context {
struct RProc **ensure; /* ensure handler stack */
uint16_t esize, eidx;
- enum mrb_fiber_state status;
- mrb_bool vmexec;
+ enum mrb_fiber_state status : 4;
+ mrb_bool vmexec : 1;
struct RFiber *fib;
};
@@ -317,7 +334,9 @@ MRB_API struct RClass *mrb_define_class(mrb_state *mrb, const char *name, struct
* @return [struct RClass *] Reference to the newly defined module.
*/
MRB_API struct RClass *mrb_define_module(mrb_state *mrb, const char *name);
+
MRB_API mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value val);
+MRB_API struct RClass *mrb_singleton_class_ptr(mrb_state *mrb, mrb_value val);
/**
* Include a module in another class or module.
@@ -956,8 +975,21 @@ mrb_get_mid(mrb_state *mrb) /* get method symbol */
*/
MRB_API mrb_int mrb_get_argc(mrb_state *mrb);
+/**
+ * Retrieve an array of arguments from mrb_state.
+ *
+ * Correctly handles *splat arguments.
+ */
MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
+/**
+ * Retrieve the first and only argument from mrb_state.
+ * Raises ArgumentError unless the number of arguments is exactly one.
+ *
+ * Correctly handles *splat arguments.
+ */
+MRB_API mrb_value mrb_get_arg1(mrb_state *mrb);
+
/* `strlen` for character string literals (use with caution or `strlen` instead)
Adjacent string literals are concatenated in C/C++ in translation phase 6.
If `lit` is not one, the compiler will report a syntax error:
@@ -1148,7 +1180,6 @@ MRB_API void mrb_close(mrb_state *mrb);
MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
MRB_API mrb_value mrb_top_self(mrb_state *mrb);
-MRB_API mrb_value mrb_run(mrb_state *mrb, struct RProc* proc, mrb_value self);
MRB_API mrb_value mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep);
MRB_API mrb_value mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep);
MRB_API mrb_value mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *iseq);
@@ -1292,13 +1323,6 @@ MRB_INLINE void mrb_check_frozen(mrb_state *mrb, void *o)
if (mrb_frozen_p((struct RBasic*)o)) mrb_frozen_error(mrb, o);
}
-typedef enum call_type {
- CALL_PUBLIC,
- CALL_FCALL,
- CALL_VCALL,
- CALL_TYPE_MAX
-} call_type;
-
MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass *c, const char *a, const char *b);
MRB_API const char *mrb_class_name(mrb_state *mrb, struct RClass* klass);
MRB_API void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val);
diff --git a/include/mruby/array.h b/include/mruby/array.h
index e2dd9bb1c..92c86a8c5 100644
--- a/include/mruby/array.h
+++ b/include/mruby/array.h
@@ -239,6 +239,7 @@ MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
* @param head Beginning position of a replacement subsequence.
* @param len Length of a replacement subsequence.
* @param rpl The array of replacement elements.
+ * It is possible to pass `mrb_undef_value()` instead of an empty array.
* @return The receiver array.
*/
MRB_API mrb_value mrb_ary_splice(mrb_state *mrb, mrb_value self, mrb_int head, mrb_int len, mrb_value rpl);
@@ -291,6 +292,9 @@ MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep);
*/
MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len);
+/* helper functions */
+mrb_value mrb_ary_subseq(mrb_state *mrb, mrb_value ary, mrb_int beg, mrb_int len);
+
MRB_END_DECL
#endif /* MRUBY_ARRAY_H */
diff --git a/include/mruby/boxing_nan.h b/include/mruby/boxing_nan.h
index e7bc9331c..fae3b7630 100644
--- a/include/mruby/boxing_nan.h
+++ b/include/mruby/boxing_nan.h
@@ -44,6 +44,9 @@ typedef struct mrb_value {
};
)
};
+#ifdef MRB_64BIT
+ struct RCptr *vp;
+#endif
} value;
};
} mrb_value;
@@ -54,13 +57,15 @@ typedef struct mrb_value {
#define mrb_type(o) (enum mrb_vtype)((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
#define mrb_ptr(o) ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2))
#define mrb_float(o) (o).f
-#define mrb_cptr(o) mrb_ptr(o)
#define mrb_fixnum(o) (o).value.i
#define mrb_symbol(o) (o).value.sym
#ifdef MRB_64BIT
+MRB_API mrb_value mrb_nan_boxing_cptr_value(struct mrb_state*, void*);
+#define mrb_cptr(o) (((struct RCptr*)mrb_ptr(o))->p)
#define BOXNAN_SHIFT_LONG_POINTER(v) (((uintptr_t)(v)>>34)&0x3fff)
#else
+#define mrb_cptr(o) ((o).value.p)
#define BOXNAN_SHIFT_LONG_POINTER(v) 0
#endif
@@ -90,7 +95,11 @@ typedef struct mrb_value {
#define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
#define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
#define SET_OBJ_VALUE(r,v) BOXNAN_SET_OBJ_VALUE(r, (((struct RObject*)(v))->tt), (v))
-#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_OBJ_VALUE(r, MRB_TT_CPTR, v)
+#ifdef MRB_64BIT
+#define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_nan_boxing_cptr_value(mrb, v))
+#else
+#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
+#endif
#define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
#endif /* MRUBY_BOXING_NAN_H */
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h
index 1388bb9f6..1b7815b7f 100644
--- a/include/mruby/boxing_word.h
+++ b/include/mruby/boxing_word.h
@@ -18,11 +18,6 @@ struct RFloat {
};
#endif
-struct RCptr {
- MRB_OBJECT_HEADER;
- void *p;
-};
-
enum mrb_special_consts {
MRB_Qnil = 0,
MRB_Qfalse = 4,
@@ -142,7 +137,6 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
#define mrb_sclass_p(o) BOXWORD_OBJ_TYPE_P(o, SCLASS)
#define mrb_proc_p(o) BOXWORD_OBJ_TYPE_P(o, PROC)
#define mrb_range_p(o) BOXWORD_OBJ_TYPE_P(o, RANGE)
-#define mrb_file_p(o) BOXWORD_OBJ_TYPE_P(o, FILE)
#define mrb_env_p(o) BOXWORD_OBJ_TYPE_P(o, ENV)
#define mrb_data_p(o) BOXWORD_OBJ_TYPE_P(o, DATA)
#define mrb_fiber_p(o) BOXWORD_OBJ_TYPE_P(o, FIBER)
diff --git a/include/mruby/common.h b/include/mruby/common.h
index 5be9a40c6..1f91c5607 100644
--- a/include/mruby/common.h
+++ b/include/mruby/common.h
@@ -74,6 +74,19 @@ MRB_BEGIN_DECL
#endif
#endif
+/** Declare mingw versions */
+#if defined(__MINGW32__) || defined(__MINGW64__)
+# include <_mingw.h>
+# if defined(__MINGW64_VERSION_MAJOR)
+# define MRB_MINGW64_VERSION (__MINGW64_VERSION_MAJOR * 1000 + __MINGW64_VERSION_MINOR)
+# elif defined(__MINGW32_MAJOR_VERSION)
+# define MRB_MINGW32_VERSION (__MINGW32_MAJOR_VERSION * 1000 + __MINGW32_MINOR_VERSION)
+# endif
+# if defined(__MINGW32__) && !defined(__MINGW64__)
+# define MRB_MINGW32_LEGACY
+# endif
+#endif
+
MRB_END_DECL
#endif /* MRUBY_COMMON_H */
diff --git a/include/mruby/compile.h b/include/mruby/compile.h
index 69ba95f33..e8ab91eb9 100644
--- a/include/mruby/compile.h
+++ b/include/mruby/compile.h
@@ -33,7 +33,7 @@ typedef struct mrbc_context {
mrb_bool no_exec:1;
mrb_bool keep_lv:1;
mrb_bool no_optimize:1;
- mrb_bool on_eval:1;
+ struct RProc *upper;
size_t parser_nerr;
} mrbc_context;
@@ -152,8 +152,8 @@ struct mrb_parser_state {
mrb_ast_node *tree;
mrb_bool no_optimize:1;
- mrb_bool on_eval:1;
mrb_bool capture_errors:1;
+ struct RProc *upper;
struct mrb_parser_message error_buffer[10];
struct mrb_parser_message warn_buffer[10];
@@ -181,7 +181,15 @@ MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t
MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c);
-/* program load functions */
+/** program load functions
+* Please note! Currently due to interactions with the GC calling these functions will
+* leak one RProc object per function call.
+* To prevent this save the current memory arena before calling and restore the arena
+* right after, like so
+* int ai = mrb_gc_arena_save(mrb);
+* mrb_value status = mrb_load_string(mrb, buffer);
+* mrb_gc_arena_restore(mrb, ai);
+*/
#ifndef MRB_DISABLE_STDIO
MRB_API mrb_value mrb_load_file(mrb_state*,FILE*);
MRB_API mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt);
diff --git a/include/mruby/debug.h b/include/mruby/debug.h
index f28dd645a..5c5d56924 100644
--- a/include/mruby/debug.h
+++ b/include/mruby/debug.h
@@ -52,7 +52,7 @@ MRB_API const char *mrb_debug_get_filename(mrb_state *mrb, mrb_irep *irep, ptrdi
* get line from irep's debug info and program counter
* @return returns -1 if not found
*/
-MRB_API int32_t mrb_debug_get_line(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc);
+MRB_API int32_t mrb_debug_get_line(mrb_state *mrb, const mrb_irep *irep, size_t pc);
MRB_API mrb_irep_debug_info *mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep);
MRB_API mrb_irep_debug_info_file *mrb_debug_info_append_file(
diff --git a/include/mruby/dump.h b/include/mruby/dump.h
index 46c3b63ce..db3e287d3 100644
--- a/include/mruby/dump.h
+++ b/include/mruby/dump.h
@@ -17,10 +17,6 @@
MRB_BEGIN_DECL
#define DUMP_DEBUG_INFO 1
-#define DUMP_ENDIAN_BIG 2
-#define DUMP_ENDIAN_LIL 4
-#define DUMP_ENDIAN_NAT 6
-#define DUMP_ENDIAN_MASK 6
int mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size);
#ifndef MRB_DISABLE_STDIO
@@ -52,8 +48,7 @@ MRB_API mrb_irep *mrb_read_irep_buf(mrb_state*, const void*, size_t);
/* Rite Binary File header */
#define RITE_BINARY_IDENT "RITE"
-#define RITE_BINARY_IDENT_LIL "ETIR"
-#define RITE_BINARY_FORMAT_VER "0006"
+#define RITE_BINARY_FORMAT_VER "0007"
#define RITE_COMPILER_NAME "MATZ"
#define RITE_COMPILER_VERSION "0000"
@@ -106,17 +101,6 @@ struct rite_binary_footer {
RITE_SECTION_HEADER;
};
-static inline int
-bigendian_p()
-{
- int i;
- char *p;
-
- i = 1;
- p = (char*)&i;
- return p[0]?0:1;
-}
-
static inline size_t
uint8_to_bin(uint8_t s, uint8_t *bin)
{
diff --git a/include/mruby/gc.h b/include/mruby/gc.h
index 4d9fb60eb..98236a219 100644
--- a/include/mruby/gc.h
+++ b/include/mruby/gc.h
@@ -21,6 +21,7 @@ struct mrb_state;
#define MRB_EACH_OBJ_BREAK 1
typedef int (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data);
void mrb_objspace_each_objects(struct mrb_state *mrb, mrb_each_object_callback *callback, void *data);
+size_t mrb_objspace_page_slot_size(void);
MRB_API void mrb_free_context(struct mrb_state *mrb, struct mrb_context *c);
#ifndef MRB_GC_ARENA_SIZE
diff --git a/include/mruby/hash.h b/include/mruby/hash.h
index 0052a1105..86fbe329d 100644
--- a/include/mruby/hash.h
+++ b/include/mruby/hash.h
@@ -23,6 +23,7 @@ struct RHash {
#define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v)))
#define mrb_hash_value(p) mrb_obj_value((void*)(p))
+size_t mrb_os_memsize_of_hash_table(mrb_value obj);
MRB_API mrb_value mrb_hash_new_capa(mrb_state *mrb, mrb_int capa);
MRB_API mrb_value mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash);
MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash);
diff --git a/include/mruby/irep.h b/include/mruby/irep.h
index 4393129c7..661ef2b48 100644
--- a/include/mruby/irep.h
+++ b/include/mruby/irep.h
@@ -49,6 +49,16 @@ typedef struct mrb_irep {
MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb);
+/** load mruby bytecode functions
+* Please note! Currently due to interactions with the GC calling these functions will
+* leak one RProc object per function call.
+* To prevent this save the current memory arena before calling and restore the arena
+* right after, like so
+* int ai = mrb_gc_arena_save(mrb);
+* mrb_value status = mrb_load_irep(mrb, buffer);
+* mrb_gc_arena_restore(mrb, ai);
+*/
+
/* @param [const uint8_t*] irep code, expected as a literal */
MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*);
diff --git a/include/mruby/istruct.h b/include/mruby/istruct.h
index 45b1fadae..d6b6116a7 100644
--- a/include/mruby/istruct.h
+++ b/include/mruby/istruct.h
@@ -21,7 +21,10 @@ MRB_BEGIN_DECL
struct RIStruct {
MRB_OBJECT_HEADER;
- char inline_data[ISTRUCT_DATA_SIZE];
+ union {
+ intptr_t inline_alignment[3];
+ char inline_data[ISTRUCT_DATA_SIZE];
+ };
};
#define RISTRUCT(obj) ((struct RIStruct*)(mrb_ptr(obj)))
diff --git a/include/mruby/khash.h b/include/mruby/khash.h
index c00357061..4884ba73c 100644
--- a/include/mruby/khash.h
+++ b/include/mruby/khash.h
@@ -61,7 +61,6 @@ static const uint8_t __m_either[] = {0x03, 0x0c, 0x30, 0xc0};
typedef struct kh_##name { \
khint_t n_buckets; \
khint_t size; \
- khint_t n_occupied; \
uint8_t *ed_flags; \
khkey_t *keys; \
khval_t *vals; \
@@ -95,16 +94,25 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
__hash_equal: hash comparation function
*/
#define KHASH_DEFINE(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
- void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h) \
+ mrb_noreturn void mrb_raise_nomemory(mrb_state *mrb); \
+ int kh_alloc_simple_##name(mrb_state *mrb, kh_##name##_t *h) \
{ \
khint_t sz = h->n_buckets; \
size_t len = sizeof(khkey_t) + (kh_is_map ? sizeof(khval_t) : 0); \
- uint8_t *p = (uint8_t*)mrb_malloc(mrb, sizeof(uint8_t)*sz/4+len*sz); \
- h->size = h->n_occupied = 0; \
+ uint8_t *p = (uint8_t*)mrb_malloc_simple(mrb, sizeof(uint8_t)*sz/4+len*sz); \
+ if (!p) { return 1; } \
+ h->size = 0; \
h->keys = (khkey_t *)p; \
h->vals = kh_is_map ? (khval_t *)(p+sizeof(khkey_t)*sz) : NULL; \
h->ed_flags = p+len*sz; \
kh_fill_flags(h->ed_flags, 0xaa, sz/4); \
+ return 0; \
+ } \
+ void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h) \
+ { \
+ if (kh_alloc_simple_##name(mrb, h)) { \
+ mrb_raise_nomemory(mrb); \
+ } \
} \
kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size) { \
kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \
@@ -112,7 +120,10 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
size = KHASH_MIN_SIZE; \
khash_power2(size); \
h->n_buckets = size; \
- kh_alloc_##name(mrb, h); \
+ if (kh_alloc_simple_##name(mrb, h)) { \
+ mrb_free(mrb, h); \
+ mrb_raise_nomemory(mrb); \
+ } \
return h; \
} \
kh_##name##_t *kh_init_##name(mrb_state *mrb) { \
@@ -130,7 +141,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
(void)mrb; \
if (h && h->ed_flags) { \
kh_fill_flags(h->ed_flags, 0xaa, h->n_buckets/4); \
- h->size = h->n_occupied = 0; \
+ h->size = 0; \
} \
} \
khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key) \
@@ -174,7 +185,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret) \
{ \
khint_t k, del_k, step = 0; \
- if (h->n_occupied >= khash_upper_bound(h)) { \
+ if (h->size >= khash_upper_bound(h)) { \
kh_resize_##name(mrb, h, h->n_buckets*2); \
} \
k = __hash_func(mrb,key) & khash_mask(h); \
@@ -204,7 +215,6 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
h->keys[k] = key; \
h->ed_flags[k/4] &= ~__m_empty[k%4]; \
h->size++; \
- h->n_occupied++; \
if (ret) *ret = 1; \
return k; \
} \
diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h
index a176d96cd..06a33cc6f 100644
--- a/include/mruby/numeric.h
+++ b/include/mruby/numeric.h
@@ -37,6 +37,7 @@ MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base);
/* ArgumentError if format string doesn't match /%(\.[0-9]+)?[aAeEfFgG]/ */
#ifndef MRB_WITHOUT_FLOAT
MRB_API mrb_value mrb_float_to_str(mrb_state *mrb, mrb_value x, const char *fmt);
+MRB_API int mrb_float_to_cstr(mrb_state *mrb, char *buf, size_t len, const char *fmt, mrb_float f);
MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x);
MRB_API mrb_value mrb_int_value(mrb_state *mrb, mrb_float f);
#endif
diff --git a/include/mruby/ops.h b/include/mruby/ops.h
index 2327c33fd..e85ee3133 100644
--- a/include/mruby/ops.h
+++ b/include/mruby/ops.h
@@ -92,8 +92,8 @@ OPCODE(APOST, BBB) /* *R(a),R(a+1)..R(a+c) = R(a)[b..] */
OPCODE(INTERN, B) /* R(a) = intern(R(a)) */
OPCODE(STRING, BB) /* R(a) = str_dup(Lit(b)) */
OPCODE(STRCAT, B) /* str_cat(R(a),R(a+1)) */
-OPCODE(HASH, BB) /* R(a) = hash_new(R(a),R(a+1)..R(a+b)) */
-OPCODE(HASHADD, BB) /* R(a) = hash_push(R(a),R(a+1)..R(a+b)) */
+OPCODE(HASH, BB) /* R(a) = hash_new(R(a),R(a+1)..R(a+b*2-1)) */
+OPCODE(HASHADD, BB) /* R(a) = hash_push(R(a),R(a+1)..R(a+b*2)) */
OPCODE(HASHCAT, B) /* R(a) = hash_cat(R(a),R(a+1)) */
OPCODE(LAMBDA, BB) /* R(a) = lambda(SEQ[b],L_LAMBDA) */
OPCODE(BLOCK, BB) /* R(a) = lambda(SEQ[b],L_BLOCK) */
@@ -115,3 +115,4 @@ OPCODE(EXT1, Z) /* make 1st operand 16bit */
OPCODE(EXT2, Z) /* make 2nd operand 16bit */
OPCODE(EXT3, Z) /* make 1st and 2nd operands 16bit */
OPCODE(STOP, Z) /* stop VM */
+OPCODE(LOADI16, BS) /* R(a) = mrb_int(b) */
diff --git a/include/mruby/proc.h b/include/mruby/proc.h
index a4ca25043..12013c3ae 100644
--- a/include/mruby/proc.h
+++ b/include/mruby/proc.h
@@ -22,14 +22,19 @@ struct REnv {
mrb_sym mid;
};
-/* flags (21bits): 1(shared flag):10(cioff/bidx):10(stack_len) */
-#define MRB_ENV_SET_STACK_LEN(e,len) ((e)->flags = (((e)->flags & ~0x3ff)|((unsigned int)(len) & 0x3ff)))
-#define MRB_ENV_STACK_LEN(e) ((mrb_int)((e)->flags & 0x3ff))
-#define MRB_ENV_STACK_UNSHARED (1<<20)
-#define MRB_ENV_UNSHARE_STACK(e) ((e)->flags |= MRB_ENV_STACK_UNSHARED)
-#define MRB_ENV_STACK_SHARED_P(e) (((e)->flags & MRB_ENV_STACK_UNSHARED) == 0)
-#define MRB_ENV_BIDX(e) (((e)->flags >> 10) & 0x3ff)
-#define MRB_ENV_SET_BIDX(e,idx) ((e)->flags = (((e)->flags & ~(0x3ff<<10))|((unsigned int)(idx) & 0x3ff)<<10))
+/* flags (21bits): 1(close):1(touched):1(heap):8(cioff/bidx):8(stack_len) */
+#define MRB_ENV_SET_LEN(e,len) ((e)->flags = (((e)->flags & ~0xff)|((unsigned int)(len) & 0xff)))
+#define MRB_ENV_LEN(e) ((mrb_int)((e)->flags & 0xff))
+#define MRB_ENV_CLOSED (1<<20)
+#define MRB_ENV_TOUCHED (1<<19)
+#define MRB_ENV_HEAPED (1<<18)
+#define MRB_ENV_CLOSE(e) ((e)->flags |= MRB_ENV_CLOSED)
+#define MRB_ENV_TOUCH(e) ((e)->flags |= MRB_ENV_TOUCHED)
+#define MRB_ENV_HEAP(e) ((e)->flags |= MRB_ENV_HEAPED)
+#define MRB_ENV_HEAP_P(e) ((e)->flags & MRB_ENV_HEAPED)
+#define MRB_ENV_ONSTACK_P(e) (((e)->flags & MRB_ENV_CLOSED) == 0)
+#define MRB_ENV_BIDX(e) (((e)->flags >> 8) & 0xff)
+#define MRB_ENV_SET_BIDX(e,idx) ((e)->flags = (((e)->flags & ~(0xff<<8))|((unsigned int)(idx) & 0xff)<<8))
void mrb_env_unshare(mrb_state*, struct REnv*);
diff --git a/include/mruby/string.h b/include/mruby/string.h
index a518d9147..93c94ef5d 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -465,7 +465,8 @@ mrb_bool mrb_str_beg_len(mrb_int str_len, mrb_int *begp, mrb_int *lenp);
mrb_value mrb_str_byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
#ifdef MRB_UTF8_STRING
-mrb_int mrb_utf8_len(const char *str, mrb_int byte_len);
+mrb_int mrb_utf8len(const char *str, const char *end);
+mrb_int mrb_utf8_strlen(const char *str, mrb_int byte_len);
#endif
MRB_END_DECL
diff --git a/include/mruby/value.h b/include/mruby/value.h
index 232beb1dc..473774b00 100644
--- a/include/mruby/value.h
+++ b/include/mruby/value.h
@@ -103,32 +103,31 @@ static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
#endif
enum mrb_vtype {
- MRB_TT_FALSE = 0, /* 0 */
- MRB_TT_TRUE, /* 1 */
- MRB_TT_FLOAT, /* 2 */
- MRB_TT_FIXNUM, /* 3 */
- MRB_TT_SYMBOL, /* 4 */
- MRB_TT_UNDEF, /* 5 */
- MRB_TT_CPTR, /* 6 */
- MRB_TT_FREE, /* 7 */
- MRB_TT_OBJECT, /* 8 */
- MRB_TT_CLASS, /* 9 */
- MRB_TT_MODULE, /* 10 */
- MRB_TT_ICLASS, /* 11 */
- MRB_TT_SCLASS, /* 12 */
- MRB_TT_PROC, /* 13 */
- MRB_TT_ARRAY, /* 14 */
- MRB_TT_HASH, /* 15 */
- MRB_TT_STRING, /* 16 */
- MRB_TT_RANGE, /* 17 */
- MRB_TT_EXCEPTION, /* 18 */
- MRB_TT_FILE, /* 19 */
- MRB_TT_ENV, /* 20 */
- MRB_TT_DATA, /* 21 */
- MRB_TT_FIBER, /* 22 */
- MRB_TT_ISTRUCT, /* 23 */
- MRB_TT_BREAK, /* 24 */
- MRB_TT_MAXDEFINE /* 25 */
+ MRB_TT_FALSE = 0,
+ MRB_TT_TRUE,
+ MRB_TT_FLOAT,
+ MRB_TT_FIXNUM,
+ MRB_TT_SYMBOL,
+ MRB_TT_UNDEF,
+ MRB_TT_CPTR,
+ MRB_TT_FREE,
+ MRB_TT_OBJECT,
+ MRB_TT_CLASS,
+ MRB_TT_MODULE,
+ MRB_TT_ICLASS,
+ MRB_TT_SCLASS,
+ MRB_TT_PROC,
+ MRB_TT_ARRAY,
+ MRB_TT_HASH,
+ MRB_TT_STRING,
+ MRB_TT_RANGE,
+ MRB_TT_EXCEPTION,
+ MRB_TT_ENV,
+ MRB_TT_DATA,
+ MRB_TT_FIBER,
+ MRB_TT_ISTRUCT,
+ MRB_TT_BREAK,
+ MRB_TT_MAXDEFINE
};
#include <mruby/object.h>
@@ -149,6 +148,13 @@ typedef void mrb_value;
#endif
+#if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT))
+struct RCptr {
+ MRB_OBJECT_HEADER;
+ void *p;
+};
+#endif
+
#if defined(MRB_NAN_BOXING)
#include "boxing_nan.h"
#elif defined(MRB_WORD_BOXING)
@@ -233,9 +239,6 @@ typedef void mrb_value;
#ifndef mrb_range_p
#define mrb_range_p(o) (mrb_type(o) == MRB_TT_RANGE)
#endif
-#ifndef mrb_file_p
-#define mrb_file_p(o) (mrb_type(o) == MRB_TT_FILE)
-#endif
#ifndef mrb_env_p
#define mrb_env_p(o) (mrb_type(o) == MRB_TT_ENV)
#endif
diff --git a/include/mruby/variable.h b/include/mruby/variable.h
index 6e918cf57..6d242b000 100644
--- a/include/mruby/variable.h
+++ b/include/mruby/variable.h
@@ -35,6 +35,7 @@ mrb_value mrb_vm_cv_get(mrb_state*, mrb_sym);
void mrb_vm_cv_set(mrb_state*, mrb_sym, mrb_value);
mrb_value mrb_vm_const_get(mrb_state*, mrb_sym);
void mrb_vm_const_set(mrb_state*, mrb_sym, mrb_value);
+size_t mrb_obj_iv_tbl_memsize(mrb_state*, mrb_value);
MRB_API mrb_value mrb_const_get(mrb_state*, mrb_value, mrb_sym);
MRB_API void mrb_const_set(mrb_state*, mrb_value, mrb_sym, mrb_value);
MRB_API mrb_bool mrb_const_defined(mrb_state*, mrb_value, mrb_sym);
diff --git a/include/mruby/version.h b/include/mruby/version.h
index f4ef21021..f52cb3ffd 100644
--- a/include/mruby/version.h
+++ b/include/mruby/version.h
@@ -47,7 +47,7 @@ MRB_BEGIN_DECL
/*
* Tiny release version number.
*/
-#define MRUBY_RELEASE_TEENY 0
+#define MRUBY_RELEASE_TEENY 2
/*
* The mruby version.
@@ -62,17 +62,17 @@ MRB_BEGIN_DECL
/*
* Release year.
*/
-#define MRUBY_RELEASE_YEAR 2019
+#define MRUBY_RELEASE_YEAR 2020
/*
* Release month.
*/
-#define MRUBY_RELEASE_MONTH 11
+#define MRUBY_RELEASE_MONTH 8
/*
* Release day.
*/
-#define MRUBY_RELEASE_DAY 19
+#define MRUBY_RELEASE_DAY 6
/*
* Release date as a string.
diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb
index 1e0ef67d7..9ba136cf3 100644
--- a/lib/mruby/build.rb
+++ b/lib/mruby/build.rb
@@ -276,14 +276,6 @@ EOS
end
end
- def cygwin_filename(name)
- if name.is_a?(Array)
- name.flatten.map { |n| cygwin_filename(n) }
- else
- '"%s"' % `cygpath -w "#{filename(name)}"`.strip
- end
- end
-
def exefile(name)
if name.is_a?(Array)
name.flatten.map { |n| exefile(n) }
@@ -344,7 +336,8 @@ EOS
puts " Binaries: #{@bins.join(', ')}" unless @bins.empty?
unless @gems.empty?
puts " Included Gems:"
- @gems.map do |gem|
+ gems = @gems.sort_by { |gem| gem.name }
+ gems.each do |gem|
gem_version = " - #{gem.version}" if gem.version != '0.0.0'
gem_summary = " - #{gem.summary}" if gem.summary
puts " #{gem.name}#{gem_version}#{gem_summary}"
@@ -395,26 +388,5 @@ EOS
@test_runner.run(mrbtest)
end
end
-
- def big_endian
- if @endian
- puts "Endian has already specified as #{@endian}."
- return
- end
- @endian = :big
- @mrbc.compile_options += ' -E'
- compilers.each do |c|
- c.defines += %w(MRB_ENDIAN_BIG)
- end
- end
-
- def little_endian
- if @endian
- puts "Endian has already specified as #{@endian}."
- return
- end
- @endian = :little
- @mrbc.compile_options += ' -e'
- end
end # CrossBuild
end # MRuby
diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb
index 03d814800..bed0c3a6a 100644
--- a/lib/mruby/build/command.rb
+++ b/lib/mruby/build/command.rb
@@ -4,7 +4,7 @@ module MRuby
class Command
include Rake::DSL
extend Forwardable
- def_delegators :@build, :filename, :objfile, :libfile, :exefile, :cygwin_filename
+ def_delegators :@build, :filename, :objfile, :libfile, :exefile
attr_accessor :build, :command
def initialize(build)
@@ -58,9 +58,9 @@ module MRuby
@source_exts = source_exts
@include_paths = ["#{MRUBY_ROOT}/include"]
@defines = %w()
- @option_include_path = '-I%s'
- @option_define = '-D%s'
- @compile_options = '%{flags} -o %{outfile} -c %{infile}'
+ @option_include_path = %q[-I"%s"]
+ @option_define = %q[-D"%s"]
+ @compile_options = %q[%{flags} -o "%{outfile}" -c "%{infile}"]
@cxx_invalid_flags = []
end
@@ -79,11 +79,7 @@ module MRuby
def all_flags(_defines=[], _include_paths=[], _flags=[])
define_flags = [defines, _defines].flatten.map{ |d| option_define % d }
include_path_flags = [include_paths, _include_paths].flatten.map do |f|
- if MRUBY_BUILD_HOST_IS_CYGWIN
- option_include_path % cygwin_filename(f)
- else
- option_include_path % filename(f)
- end
+ option_include_path % filename(f)
end
[flags, define_flags, include_path_flags, _flags].flatten.join(' ')
end
@@ -91,13 +87,8 @@ module MRuby
def run(outfile, infile, _defines=[], _include_paths=[], _flags=[])
mkdir_p File.dirname(outfile)
_pp "CC", infile.relative_path, outfile.relative_path
- if MRUBY_BUILD_HOST_IS_CYGWIN
- _run compile_options, { :flags => all_flags(_defines, _include_paths, _flags),
- :infile => cygwin_filename(infile), :outfile => cygwin_filename(outfile) }
- else
- _run compile_options, { :flags => all_flags(_defines, _include_paths, _flags),
- :infile => filename(infile), :outfile => filename(outfile) }
- end
+ _run compile_options, { :flags => all_flags(_defines, _include_paths, _flags),
+ :infile => filename(infile), :outfile => filename(outfile) }
end
def define_rules(build_dir, source_dir='')
@@ -184,18 +175,14 @@ module MRuby
@flags_before_libraries, @flags_after_libraries = [], []
@libraries = []
@library_paths = []
- @option_library = '-l%s'
- @option_library_path = '-L%s'
- @link_options = "%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}"
+ @option_library = %q[-l"%s"]
+ @option_library_path = %q[-L"%s"]
+ @link_options = %Q[%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}]
end
def all_flags(_library_paths=[], _flags=[])
library_path_flags = [library_paths, _library_paths].flatten.map do |f|
- if MRUBY_BUILD_HOST_IS_CYGWIN
- option_library_path % cygwin_filename(f)
- else
- option_library_path % filename(f)
- end
+ option_library_path % filename(f)
end
[flags, library_path_flags, _flags].flatten.join(' ')
end
@@ -209,19 +196,11 @@ module MRuby
library_flags = [libraries, _libraries].flatten.map { |d| option_library % d }
_pp "LD", outfile.relative_path
- if MRUBY_BUILD_HOST_IS_CYGWIN
- _run link_options, { :flags => all_flags(_library_paths, _flags),
- :outfile => cygwin_filename(outfile) , :objs => cygwin_filename(objfiles).join(' '),
- :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
- :flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
- :libs => library_flags.join(' ') }
- else
- _run link_options, { :flags => all_flags(_library_paths, _flags),
- :outfile => filename(outfile) , :objs => filename(objfiles).join(' '),
- :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
- :flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
- :libs => library_flags.join(' ') }
- end
+ _run link_options, { :flags => all_flags(_library_paths, _flags),
+ :outfile => filename(outfile) , :objs => filename(objfiles).map{|f| %Q["#{f}"]}.join(' '),
+ :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
+ :flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
+ :libs => library_flags.join(' ') }
end
end
@@ -231,17 +210,13 @@ module MRuby
def initialize(build)
super
@command = ENV['AR'] || 'ar'
- @archive_options = 'rs %{outfile} %{objs}'
+ @archive_options = 'rs "%{outfile}" %{objs}'
end
def run(outfile, objfiles)
mkdir_p File.dirname(outfile)
_pp "AR", outfile.relative_path
- if MRUBY_BUILD_HOST_IS_CYGWIN
- _run archive_options, { :outfile => cygwin_filename(outfile), :objs => cygwin_filename(objfiles).join(' ') }
- else
- _run archive_options, { :outfile => filename(outfile), :objs => filename(objfiles).join(' ') }
- end
+ _run archive_options, { :outfile => filename(outfile), :objs => filename(objfiles).map{|f| %Q["#{f}"]}.join(' ') }
end
end
@@ -251,7 +226,7 @@ module MRuby
def initialize(build)
super
@command = 'bison'
- @compile_options = '-o %{outfile} %{infile}'
+ @compile_options = %q[-o "%{outfile}" "%{infile}"]
end
def run(outfile, infile)
@@ -267,7 +242,7 @@ module MRuby
def initialize(build)
super
@command = 'gperf'
- @compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'
+ @compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"]
end
def run(outfile, infile)
@@ -341,7 +316,7 @@ module MRuby
infiles.each do |f|
_pp "MRBC", f.relative_path, nil, :indent => 2
end
- cmd = "#{filename @command} #{@compile_options % {:funcname => funcname}} #{filename(infiles).join(' ')}"
+ cmd = %Q["#{filename @command}" #{@compile_options % {:funcname => funcname}} #{filename(infiles).map{|f| %Q["#{f}"]}.join(' ')}]
puts cmd if Rake.verbose
IO.popen(cmd, 'r+') do |io|
out.puts io.read
diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb
index 0793da350..6fcaad9c1 100644
--- a/lib/mruby/gem.rb
+++ b/lib/mruby/gem.rb
@@ -106,6 +106,15 @@ module MRuby
define_gem_init_builder if @generate_functions
end
+ def for_windows?
+ if build.kind_of?(MRuby::CrossBuild)
+ return %w(x86_64-w64-mingw32 i686-w64-mingw32).include?(build.host_target)
+ elsif build.kind_of?(MRuby::Build)
+ return ('A'..'Z').to_a.any? { |vol| Dir.exist?("#{vol}:") }
+ end
+ return false
+ end
+
def add_dependency(name, *requirements)
default_gem = requirements.last.kind_of?(Hash) ? requirements.pop : nil
requirements = ['>= 0.0.0'] if requirements.empty?
diff --git a/lib/mruby/source.rb b/lib/mruby/source.rb
index 5819a322b..a305c7b04 100644
--- a/lib/mruby/source.rb
+++ b/lib/mruby/source.rb
@@ -6,7 +6,9 @@ module MRuby
ROOT = Pathname.new(File.expand_path('../../../',__FILE__))
# Reads a constant defined at version.h
- MRUBY_READ_VERSION_CONSTANT = Proc.new { |name| ROOT.join('include','mruby','version.h').read.match(/^#define #{name} +"?([\w\. ]+)"?$/)[1] }
+ MRUBY_READ_VERSION_CONSTANT = Proc.new do |name|
+ ROOT.join('include','mruby','version.h').read.match(/^#define #{name} +"?([\w\. ]+)"?\r?$/)[1]
+ end
MRUBY_RUBY_VERSION = MRUBY_READ_VERSION_CONSTANT['MRUBY_RUBY_VERSION']
MRUBY_RUBY_ENGINE = MRUBY_READ_VERSION_CONSTANT['MRUBY_RUBY_ENGINE']
diff --git a/mrbgems/default.gembox b/mrbgems/default.gembox
index 9859c7d52..de1e9a573 100644
--- a/mrbgems/default.gembox
+++ b/mrbgems/default.gembox
@@ -71,6 +71,10 @@ MRuby::GemBox.new do |conf|
# Use toplevel object (main) methods extension
conf.gem :core => "mruby-toplevel-ext"
+ # Use Rational/Complex numbers
+ conf.gem :core => "mruby-rational"
+ conf.gem :core => "mruby-complex"
+
# Generate mirb command
conf.gem :core => "mruby-bin-mirb"
@@ -89,6 +93,9 @@ MRuby::GemBox.new do |conf|
# Use Method/UnboundMethod class
conf.gem :core => "mruby-method"
+ # Use eval()
+ conf.gem :core => "mruby-eval"
+
# Use mruby-compiler to build other mrbgems
conf.gem :core => "mruby-compiler"
end
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index 5492ba2eb..f3246af4f 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -688,37 +688,6 @@ class Array
##
# call-seq:
- # ary.delete_if { |item| block } -> ary
- # ary.delete_if -> Enumerator
- #
- # Deletes every element of +self+ for which block evaluates to +true+.
- #
- # The array is changed instantly every time the block is called, not after
- # the iteration is over.
- #
- # See also Array#reject!
- #
- # If no block is given, an Enumerator is returned instead.
- #
- # scores = [ 97, 42, 75 ]
- # scores.delete_if {|score| score < 80 } #=> [97]
-
- def delete_if(&block)
- return to_enum :delete_if unless block
-
- idx = 0
- while idx < self.size do
- if block.call(self[idx])
- self.delete_at(idx)
- else
- idx += 1
- end
- end
- self
- end
-
- ##
- # call-seq:
# ary.keep_if { |item| block } -> ary
# ary.keep_if -> Enumerator
#
diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c
index ab6d99133..3ce5d822e 100644
--- a/mrbgems/mruby-array-ext/src/array.c
+++ b/mrbgems/mruby-array-ext/src/array.c
@@ -28,9 +28,8 @@ static mrb_value
mrb_ary_assoc(mrb_state *mrb, mrb_value ary)
{
mrb_int i;
- mrb_value v, k;
-
- mrb_get_args(mrb, "o", &k);
+ mrb_value v;
+ mrb_value k = mrb_get_arg1(mrb);
for (i = 0; i < RARRAY_LEN(ary); ++i) {
v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
@@ -59,9 +58,8 @@ static mrb_value
mrb_ary_rassoc(mrb_state *mrb, mrb_value ary)
{
mrb_int i;
- mrb_value v, value;
-
- mrb_get_args(mrb, "o", &value);
+ mrb_value v;
+ mrb_value value = mrb_get_arg1(mrb);
for (i = 0; i < RARRAY_LEN(ary); ++i) {
v = RARRAY_PTR(ary)[i];
@@ -140,9 +138,8 @@ mrb_ary_slice_bang(mrb_state *mrb, mrb_value self)
mrb_ary_modify(mrb, a);
if (mrb_get_argc(mrb) == 1) {
- mrb_value index;
+ mrb_value index = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o|i", &index, &len);
switch (mrb_type(index)) {
case MRB_TT_RANGE:
if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) == MRB_RANGE_OK) {
diff --git a/mrbgems/mruby-array-ext/test/array.rb b/mrbgems/mruby-array-ext/test/array.rb
index 51172f9a8..2955ef391 100644
--- a/mrbgems/mruby-array-ext/test/array.rb
+++ b/mrbgems/mruby-array-ext/test/array.rb
@@ -299,19 +299,6 @@ end
#assert("Array#bsearch_index") do
#end
-assert("Array#delete_if") do
- a = [1, 2, 3, 4, 5]
- assert_equal [1, 2, 3, 4, 5], a.delete_if { false }
- assert_equal [1, 2, 3, 4, 5], a
-
- a = [1, 2, 3, 4, 5]
- assert_equal [], a.delete_if { true }
- assert_equal [], a
-
- a = [ 1, 2, 3, 4, 5 ]
- assert_equal [1, 2, 3], a.delete_if { |val| val > 3 }
-end
-
assert("Array#keep_if") do
a = [1, 2, 3, 4, 5]
assert_equal [1, 2, 3, 4, 5], a.keep_if { true }
diff --git a/mrbgems/mruby-bin-config/mrbgem.rake b/mrbgems/mruby-bin-config/mrbgem.rake
index 6005a876d..c56af435f 100644
--- a/mrbgems/mruby-bin-config/mrbgem.rake
+++ b/mrbgems/mruby-bin-config/mrbgem.rake
@@ -5,13 +5,16 @@ unless MRuby::Build.current.kind_of?(MRuby::CrossBuild)
spec.author = 'mruby developers'
spec.summary = "#{name} command"
+ mruby_config_dir = "#{build.build_dir}/bin"
mruby_config = name + (ENV['OS'] == 'Windows_NT' ? '.bat' : '')
- mruby_config_path = "#{build.build_dir}/bin/#{mruby_config}"
+ mruby_config_path = "#{mruby_config_dir}/#{mruby_config}"
make_cfg = "#{build.build_dir}/lib/libmruby.flags.mak"
tmplt_path = "#{__dir__}/#{mruby_config}"
build.bins << mruby_config
- file mruby_config_path => [make_cfg, tmplt_path] do |t|
+ directory mruby_config_dir
+
+ file mruby_config_path => [mruby_config_dir, make_cfg, tmplt_path] do |t|
config = Hash[File.readlines(make_cfg).map!(&:chomp).map! {|l|
l.gsub('\\"', '"').split(' = ', 2).map! {|s| s.sub(/^(?=.)/, 'echo ')}
}]
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c
index d2fa4c856..8fab3c2e8 100644
--- a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c
@@ -5,7 +5,6 @@
#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
#include <ctype.h>
#include <mruby.h>
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h
index de2f90144..080b0616b 100644
--- a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h
@@ -7,7 +7,11 @@
#define MRDBCONF_H
#ifndef MRB_ENABLE_DEBUG_HOOK
-# error Need 'MRB_ENABLE_DEBUG_HOOK' configuration in your 'build_config.rb'
+# error mruby-bin-debugger need 'MRB_ENABLE_DEBUG_HOOK' configuration in your 'build_config.rb'
+#endif
+
+#ifdef MRB_DISABLE_STDIO
+# error mruby-bin-debugger conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
#endif
/* configuration options: */
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
index 8a3568ca0..51ba3fd78 100644
--- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
+++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
@@ -7,6 +7,11 @@
*/
#include <mruby.h>
+
+#ifdef MRB_DISABLE_STDIO
+# error mruby-bin-mirb conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
+#endif
+
#include <mruby/array.h>
#include <mruby/proc.h>
#include <mruby/compile.h>
@@ -17,7 +22,6 @@
#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
#include <ctype.h>
#include <signal.h>
@@ -650,8 +654,8 @@ main(int argc, char **argv)
/* adjust stack length of toplevel environment */
if (mrb->c->cibase->env) {
struct REnv *e = mrb->c->cibase->env;
- if (e && MRB_ENV_STACK_LEN(e) < proc->body.irep->nlocals) {
- MRB_ENV_SET_STACK_LEN(e, proc->body.irep->nlocals);
+ if (e && MRB_ENV_LEN(e) < proc->body.irep->nlocals) {
+ MRB_ENV_SET_LEN(e, proc->body.irep->nlocals);
}
}
/* pass a proc for evaluation */
diff --git a/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c b/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c
index 716b79c88..4d984e773 100644
--- a/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c
+++ b/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c
@@ -1,7 +1,11 @@
-#include <stdio.h>
+#include <mruby.h>
+
+#ifdef MRB_DISABLE_STDIO
+# error mruby-bin-mrbc conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
+#endif
+
#include <stdlib.h>
#include <string.h>
-#include <mruby.h>
#include <mruby/compile.h>
#include <mruby/dump.h>
#include <mruby/proc.h>
@@ -32,8 +36,6 @@ usage(const char *name)
"-v print version number, then turn on verbose mode",
"-g produce debugging information",
"-B<symbol> binary <symbol> output in C language format",
- "-e generate little endian iseq data",
- "-E generate big endian iseq data",
"--remove-lv remove local variables",
"--verbose run at verbose mode",
"--version print the version",
@@ -50,19 +52,26 @@ usage(const char *name)
static char *
get_outfilename(mrb_state *mrb, char *infile, const char *ext)
{
- size_t infilelen;
- size_t extlen;
+ size_t ilen, flen, elen;
char *outfile;
- char *p;
+ char *p = NULL;
- infilelen = strlen(infile);
- extlen = strlen(ext);
- outfile = (char*)mrb_malloc(mrb, infilelen + extlen + 1);
- memcpy(outfile, infile, infilelen + 1);
+ ilen = strlen(infile);
+ flen = ilen;
if (*ext) {
- if ((p = strrchr(outfile, '.')) == NULL)
- p = outfile + infilelen;
- memcpy(p, ext, extlen + 1);
+ elen = strlen(ext);
+ if ((p = strrchr(infile, '.'))) {
+ ilen = p - infile;
+ }
+ flen += elen;
+ }
+ else {
+ flen = ilen;
+ }
+ outfile = (char*)mrb_malloc(mrb, flen+1);
+ strncpy(outfile, infile, ilen+1);
+ if (p) {
+ strncpy(outfile+ilen, ext, elen+1);
}
return outfile;
@@ -120,10 +129,8 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
args->flags |= DUMP_DEBUG_INFO;
break;
case 'E':
- args->flags = DUMP_ENDIAN_BIG | (args->flags & ~DUMP_ENDIAN_MASK);
- break;
case 'e':
- args->flags = DUMP_ENDIAN_LIL | (args->flags & ~DUMP_ENDIAN_MASK);
+ fprintf(stderr, "%s: -e/-E option no longer needed.\n", args->prog);
break;
case 'h':
return -1;
@@ -156,10 +163,6 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
break;
}
}
- if (args->verbose && args->initname && (args->flags & DUMP_ENDIAN_MASK) == 0) {
- fprintf(stderr, "%s: generating %s endian C file. specify -e/-E for cross compiling.\n",
- args->prog, bigendian_p() ? "big" : "little");
- }
return i;
}
diff --git a/mrbgems/mruby-bin-mruby/mrbgem.rake b/mrbgems/mruby-bin-mruby/mrbgem.rake
index 280621e31..1415013e3 100644
--- a/mrbgems/mruby-bin-mruby/mrbgem.rake
+++ b/mrbgems/mruby-bin-mruby/mrbgem.rake
@@ -4,7 +4,6 @@ MRuby::Gem::Specification.new('mruby-bin-mruby') do |spec|
spec.summary = 'mruby command'
spec.bins = %w(mruby)
spec.add_dependency('mruby-compiler', :core => 'mruby-compiler')
- spec.add_dependency('mruby-error', :core => 'mruby-error')
spec.add_test_dependency('mruby-print', :core => 'mruby-print')
if build.cxx_exception_enabled?
diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
index b44345fe4..793245875 100644
--- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
+++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
@@ -1,7 +1,11 @@
-#include <stdio.h>
+#include <mruby.h>
+
+#ifdef MRB_DISABLE_STDIO
+# error mruby-bin-mruby conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
+#endif
+
#include <stdlib.h>
#include <string.h>
-#include <mruby.h>
#include <mruby/array.h>
#include <mruby/compile.h>
#include <mruby/dump.h>
diff --git a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c
index fb78b0c3b..3d05238d2 100644
--- a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c
+++ b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c
@@ -1,7 +1,11 @@
-#include <stdio.h>
+#include <mruby.h>
+
+#ifdef MRB_DISABLE_STDIO
+# error mruby-bin-strip conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
+#endif
+
#include <stdlib.h>
#include <string.h>
-#include <mruby.h>
#include <mruby/irep.h>
#include <mruby/dump.h>
diff --git a/mrbgems/mruby-class-ext/src/class.c b/mrbgems/mruby-class-ext/src/class.c
index 02ebf80cc..b7b5e18f8 100644
--- a/mrbgems/mruby-class-ext/src/class.c
+++ b/mrbgems/mruby-class-ext/src/class.c
@@ -43,10 +43,15 @@ mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
const mrb_value *argv;
mrb_int argc;
mrb_value blk;
+ struct RClass *c;
mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
- mrb->c->ci->target_class = mrb_class_ptr(self);
+ c = mrb_class_ptr(self);
+ if (mrb->c->ci->acc < 0) {
+ return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
+ }
+ mrb->c->ci->target_class = c;
return mrb_yield_cont(mrb, blk, self, argc, argv);
}
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 717d9eb9a..c64ffc473 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -281,15 +281,6 @@ no_optimize(codegen_scope *s)
return FALSE;
}
-static
-mrb_bool
-on_eval(codegen_scope *s)
-{
- if (s && s->parser && s->parser->on_eval)
- return TRUE;
- return FALSE;
-}
-
struct mrb_insn_data
mrb_decode_insn(const mrb_code *pc)
{
@@ -407,9 +398,6 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep)
if (no_peephole(s)) {
normal:
genop_2(s, OP_MOVE, dst, src);
- if (on_eval(s)) {
- genop_0(s, OP_NOP);
- }
return;
}
else {
@@ -674,6 +662,43 @@ lv_idx(codegen_scope *s, mrb_sym id)
return 0;
}
+static int
+search_upvar(codegen_scope *s, mrb_sym id, int *idx)
+{
+ struct RProc *u;
+ int lv = 0;
+ codegen_scope *up = s->prev;
+
+ while (up) {
+ *idx = lv_idx(up, id);
+ if (*idx > 0) {
+ return lv;
+ }
+ lv ++;
+ up = up->prev;
+ }
+
+ if (lv < 1) lv = 1;
+ u = s->parser->upper;
+ while (u && !MRB_PROC_CFUNC_P(u)) {
+ struct mrb_irep *ir = u->body.irep;
+ uint_fast16_t n = ir->nlocals;
+ const struct mrb_locals *v = ir->lv;
+ for (; n > 1; n --, v ++) {
+ if (v->name == id) {
+ *idx = v->r;
+ return lv - 1;
+ }
+ }
+ if (MRB_PROC_SCOPE_P(u)) break;
+ u = u->upper;
+ lv ++;
+ }
+
+ codegen_error(s, "Can't found local variables");
+ return -1; /* not reached */
+}
+
static void
for_body(codegen_scope *s, node *tree)
{
@@ -786,12 +811,19 @@ lambda_body(codegen_scope *s, node *tree, int blk)
i = 0;
while (opt) {
int idx;
+ mrb_sym id = nsym(opt->car->car);
dispatch(s, pos+i*3+1);
codegen(s, opt->car->cdr, VAL);
pop();
- idx = lv_idx(s, nsym(opt->car->car));
- gen_move(s, idx, cursp(), 0);
+ idx = lv_idx(s, id);
+ if (idx > 0) {
+ gen_move(s, idx, cursp(), 0);
+ }
+ else {
+ int lv = search_upvar(s, id, &idx);
+ genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
+ }
i++;
opt = opt->cdr;
}
@@ -818,11 +850,19 @@ lambda_body(codegen_scope *s, node *tree, int blk)
mrb_assert(nint(kwd->car) == NODE_KW_ARG);
if (def_arg) {
+ int idx;
genop_2(s, OP_KEY_P, lv_idx(s, kwd_sym), new_sym(s, kwd_sym));
jmpif_key_p = genjmp2(s, OP_JMPIF, lv_idx(s, kwd_sym), 0, 0);
codegen(s, def_arg, VAL);
pop();
- gen_move(s, lv_idx(s, kwd_sym), cursp(), 0);
+ idx = lv_idx(s, kwd_sym);
+ if (idx > 0) {
+ gen_move(s, idx, cursp(), 0);
+ }
+ else {
+ int lv = search_upvar(s, kwd_sym, &idx);
+ genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
+ }
jmp_def_set = genjmp(s, OP_JMP, 0);
dispatch(s, jmpif_key_p);
}
@@ -1103,23 +1143,12 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
if (idx > 0) {
if (idx != sp) {
gen_move(s, idx, sp, val);
- if (val && on_eval(s)) genop_0(s, OP_NOP);
}
break;
}
else { /* upvar */
- int lv = 0;
- codegen_scope *up = s->prev;
-
- while (up) {
- idx = lv_idx(up, nsym(tree));
- if (idx > 0) {
- genop_3(s, OP_SETUPVAR, sp, idx, lv);
- break;
- }
- lv++;
- up = up->prev;
- }
+ int lv = search_upvar(s, nsym(tree), &idx);
+ genop_3(s, OP_SETUPVAR, sp, idx, lv);
}
break;
case NODE_NVAR:
@@ -1860,7 +1889,7 @@ codegen(codegen_scope *s, node *tree, int val)
len++;
}
tree = tree->cdr;
- if (val && len == 255) {
+ if (val && cursp() > 127) {
pop_n(len*2);
if (!update) {
genop_2(s, OP_HASH, cursp(), len);
@@ -2324,21 +2353,10 @@ codegen(codegen_scope *s, node *tree, int val)
if (idx > 0) {
gen_move(s, cursp(), idx, val);
- if (val && on_eval(s)) genop_0(s, OP_NOP);
}
else {
- int lv = 0;
- codegen_scope *up = s->prev;
-
- while (up) {
- idx = lv_idx(up, nsym(tree));
- if (idx > 0) {
- genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
- break;
- }
- lv++;
- up = up->prev;
- }
+ int lv = search_upvar(s, nsym(tree), &idx);
+ genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
}
push();
}
@@ -2349,7 +2367,6 @@ codegen(codegen_scope *s, node *tree, int val)
int idx = nint(tree);
gen_move(s, cursp(), idx, val);
- if (val && on_eval(s)) genop_0(s, OP_NOP);
push();
}
@@ -2440,12 +2457,20 @@ codegen(codegen_scope *s, node *tree, int val)
else
#endif
{
- if (i == -1) genop_1(s, OP_LOADI__1, cursp());
- else if (i < 0) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
+ if (i < 0) {
+ if (i == -1) genop_1(s, OP_LOADI__1, cursp());
+ else if (i >= -0xff) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
+ else if (i >= -0x8000) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
+ else goto lit_int;
+ }
else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp());
- else if (i <= 0xffff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i);
+ else if (i <= 0xff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i);
+ else if (i <= 0x7fff) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
else {
- int off = new_lit(s, mrb_fixnum_value(i));
+ int off;
+
+ lit_int:
+ off = new_lit(s, mrb_fixnum_value(i));
genop_2(s, OP_LOADL, cursp(), off);
}
}
@@ -2501,9 +2526,12 @@ codegen(codegen_scope *s, node *tree, int val)
else {
#endif
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
- else if (i >= -0xffff) {
+ else if (i >= -0xff) {
genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
}
+ else if (i >= -0x8000) {
+ genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
+ }
else {
int off = new_lit(s, mrb_fixnum_value(i));
genop_2(s, OP_LOADL, cursp(), off);
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index c35d9e1be..9de45a536 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -9,7 +9,6 @@
#ifdef PARSER_DEBUG
# define YYDEBUG 1
#endif
-#define YYERROR_VERBOSE 1
#define YYSTACK_USE_ALLOCA 1
#include <ctype.h>
@@ -266,6 +265,7 @@ local_unnest(parser_state *p)
static mrb_bool
local_var_p(parser_state *p, mrb_sym sym)
{
+ struct RProc *u;
node *l = p->locals;
while (l) {
@@ -276,6 +276,18 @@ local_var_p(parser_state *p, mrb_sym sym)
}
l = l->cdr;
}
+
+ u = p->upper;
+ while (u && !MRB_PROC_CFUNC_P(u)) {
+ struct mrb_irep *ir = u->body.irep;
+ uint_fast16_t n = ir->nlocals;
+ const struct mrb_locals *v = ir->lv;
+ for (; n > 1; n --, v ++) {
+ if (v->name == sym) return TRUE;
+ }
+ if (MRB_PROC_SCOPE_P(u)) break;
+ u = u->upper;
+ }
return FALSE;
}
@@ -827,6 +839,13 @@ new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg)
return list3((node*)NODE_KW_ARG, nsym(kw), def_arg);
}
+/* (:kw_rest_args . a) */
+static node*
+new_kw_rest_args(parser_state *p, node *a)
+{
+ return cons((node*)NODE_KW_REST_ARGS, a);
+}
+
/* (:block_arg . a) */
static node*
new_block_arg(parser_state *p, node *a)
@@ -1323,7 +1342,8 @@ heredoc_end(parser_state *p)
%}
-%pure-parser
+%define parse.error verbose
+%define api.pure
%parse-param {parser_state *p}
%lex-param {parser_state *p}
@@ -2265,6 +2285,30 @@ paren_args : '(' opt_call_args ')'
{
$$ = $2;
}
+ | '(' tDOT3 rparen
+ {
+#if 1
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ if (local_var_p(p, r) && local_var_p(p, b)) {
+ $$ = cons(list1(new_splat(p, new_lvar(p, r))),
+ new_block_arg(p, new_lvar(p, b)));
+ }
+#else
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym k = mrb_intern_lit(p->mrb, "**");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ if (local_var_p(p, r) && local_var_p(p, k) && local_var_p(p, b)) {
+ $$ = cons(list2(new_splat(p, new_lvar(p, r)),
+ new_kw_hash(p, list1(cons(new_kw_rest_args(p, 0), new_lvar(p, k))))),
+ new_block_arg(p, new_lvar(p, b)));
+ }
+#endif
+ else {
+ yyerror(p, "unexpected argument forwarding ...");
+ $$ = 0;
+ }
+ }
;
opt_paren_args : none
@@ -3361,6 +3405,24 @@ f_arglist : '(' f_args rparen
p->lstate = EXPR_BEG;
p->cmd_start = TRUE;
}
+ | '(' tDOT3 rparen
+ {
+#if 1
+ /* til real keyword args implemented */
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ local_add_f(p, r);
+ $$ = new_args(p, 0, 0, r, 0,
+ new_args_tail(p, 0, 0, b));
+#else
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym k = mrb_intern_lit(p->mrb, "**");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ local_add_f(p, r); local_add_f(p, k);
+ $$ = new_args(p, 0, 0, r, 0,
+ new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b));
+#endif
+ }
| f_args term
{
$$ = $1;
@@ -3424,11 +3486,11 @@ kwrest_mark : tPOW
f_kwrest : kwrest_mark tIDENTIFIER
{
- $$ = cons((node*)NODE_KW_REST_ARGS, nsym($2));
+ $$ = new_kw_rest_args(p, nsym($2));
}
| kwrest_mark
{
- $$ = cons((node*)NODE_KW_REST_ARGS, 0);
+ $$ = new_kw_rest_args(p, 0);
}
;
@@ -3743,7 +3805,7 @@ assoc : arg tASSOC arg
| tDSTAR arg
{
void_expr_error(p, $2);
- $$ = cons(cons((node*)NODE_KW_REST_ARGS, 0), $2);
+ $$ = cons(new_kw_rest_args(p, 0), $2);
}
;
@@ -3807,7 +3869,7 @@ term : ';' {yyerrok;}
nl : '\n'
{
- p->lineno++;
+ p->lineno += $<num>1;
p->column = 0;
}
;
@@ -3967,6 +4029,27 @@ static mrb_bool peeks(parser_state *p, const char *s);
static mrb_bool skips(parser_state *p, const char *s);
static inline int
+nextc0(parser_state *p)
+{
+ int c;
+#ifndef MRB_DISABLE_STDIO
+ if (p->f) {
+ if (feof(p->f)) return -1;
+ c = fgetc(p->f);
+ if (c == EOF) return -1;
+ }
+ else
+#endif
+ if (!p->s || p->s >= p->send) {
+ return -1;
+ }
+ else {
+ c = (unsigned char)*p->s++;
+ }
+ return c;
+}
+
+static inline int
nextc(parser_state *p)
{
int c;
@@ -3980,30 +4063,18 @@ nextc(parser_state *p)
cons_free(tmp);
}
else {
-#ifndef MRB_DISABLE_STDIO
- if (p->f) {
- if (feof(p->f)) goto eof;
- c = fgetc(p->f);
- if (c == EOF) goto eof;
- }
- else
-#endif
- if (!p->s || p->s >= p->send) {
- goto eof;
- }
- else {
- c = (unsigned char)*p->s++;
- }
+ c = nextc0(p);
+ if (c < 0) goto eof;
}
if (c >= 0) {
p->column++;
}
if (c == '\r') {
- const int lf = nextc(p);
+ const int lf = nextc0(p);
if (lf == '\n') {
return '\n';
}
- pushback(p, lf);
+ if (lf > 0) pushback(p, lf);
}
return c;
@@ -4786,6 +4857,7 @@ static int
parser_yylex(parser_state *p)
{
int32_t c;
+ int nlines = 1;
int space_seen = 0;
int cmd_state;
enum mrb_lex_state_enum last_state;
@@ -4843,6 +4915,7 @@ parser_yylex(parser_state *p)
break;
}
if (p->parsing_heredoc != NULL) {
+ pylval.num = nlines;
return '\n';
}
while ((c = nextc(p))) {
@@ -4852,13 +4925,13 @@ parser_yylex(parser_state *p)
space_seen = 1;
break;
case '#': /* comment as a whitespace */
- pushback(p, '#');
- p->lineno++;
- goto retry;
+ skip(p, '\n');
+ nlines++;
+ break;
case '.':
if (!peek(p, '.')) {
pushback(p, '.');
- p->lineno++;
+ p->lineno+=nlines; nlines=1;
goto retry;
}
pushback(p, c);
@@ -4866,7 +4939,7 @@ parser_yylex(parser_state *p)
case '&':
if (peek(p, '.')) {
pushback(p, '&');
- p->lineno++;
+ p->lineno+=nlines; nlines=1;
goto retry;
}
pushback(p, c);
@@ -4882,6 +4955,7 @@ parser_yylex(parser_state *p)
normal_newline:
p->cmd_start = TRUE;
p->lstate = EXPR_BEG;
+ pylval.num = nlines;
return '\n';
case '*':
@@ -4964,7 +5038,7 @@ parser_yylex(parser_state *p)
c = nextc(p);
} while (!(c < 0 || ISSPACE(c)));
if (c != '\n') skip(p, '\n');
- p->lineno++;
+ p->lineno+=nlines; nlines=1;
p->column = 0;
goto retry;
}
@@ -5686,7 +5760,7 @@ parser_yylex(parser_state *p)
case '\\':
c = nextc(p);
if (c == '\n') {
- p->lineno++;
+ p->lineno+=nlines; nlines=1;
p->column = 0;
space_seen = 1;
goto retry; /* skip \\n */
@@ -6131,7 +6205,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt)
}
p->capture_errors = cxt->capture_errors;
p->no_optimize = cxt->no_optimize;
- p->on_eval = cxt->on_eval;
+ p->upper = cxt->upper;
if (cxt->partial_hook) {
p->cxt = cxt;
}
@@ -6316,7 +6390,7 @@ MRB_API void
mrb_parser_set_filename(struct mrb_parser_state *p, const char *f)
{
mrb_sym sym;
- size_t i;
+ uint16_t i;
mrb_sym* new_table;
sym = mrb_intern_cstr(p->mrb, f);
@@ -6325,7 +6399,7 @@ mrb_parser_set_filename(struct mrb_parser_state *p, const char *f)
for (i = 0; i < p->filename_table_length; ++i) {
if (p->filename_table[i] == sym) {
- p->current_filename_index = (int)i;
+ p->current_filename_index = i;
return;
}
}
@@ -6560,7 +6634,7 @@ dump_args(mrb_state *mrb, node *n, int offset)
static const char*
str_dump(mrb_state *mrb, const char *str, int len)
{
- mrb_int ai = mrb_gc_arena_save(mrb);
+ int ai = mrb_gc_arena_save(mrb);
mrb_value s;
# if INT_MAX > MRB_INT_MAX / 4
/* check maximum length with "\xNN" charactor */
diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c
new file mode 100644
index 000000000..d9a7b72de
--- /dev/null
+++ b/mrbgems/mruby-compiler/core/y.tab.c
@@ -0,0 +1,13153 @@
+/* A Bison parser, made by GNU Bison 3.5.1. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Undocumented macros, especially those whose name start with YY_,
+ are private implementation details. Do not rely on them. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "3.5.1"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue. */
+#line 7 "mrbgems/mruby-compiler/core/parse.y"
+
+#undef PARSER_DEBUG
+#ifdef PARSER_DEBUG
+# define YYDEBUG 1
+#endif
+#define YYSTACK_USE_ALLOCA 1
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <mruby.h>
+#include <mruby/compile.h>
+#include <mruby/proc.h>
+#include <mruby/error.h>
+#include <mruby/throw.h>
+#include <mruby/string.h>
+#include "node.h"
+
+#define YYLEX_PARAM p
+
+typedef mrb_ast_node node;
+typedef struct mrb_parser_state parser_state;
+typedef struct mrb_parser_heredoc_info parser_heredoc_info;
+
+static int yyparse(parser_state *p);
+static int yylex(void *lval, parser_state *p);
+static void yyerror(parser_state *p, const char *s);
+static void yywarn(parser_state *p, const char *s);
+static void yywarning(parser_state *p, const char *s);
+static void backref_error(parser_state *p, node *n);
+static void void_expr_error(parser_state *p, node *n);
+static void tokadd(parser_state *p, int32_t c);
+
+#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
+
+typedef unsigned int stack_type;
+
+#define BITSTACK_PUSH(stack, n) ((stack) = ((stack)<<1)|((n)&1))
+#define BITSTACK_POP(stack) ((stack) = (stack) >> 1)
+#define BITSTACK_LEXPOP(stack) ((stack) = ((stack) >> 1) | ((stack) & 1))
+#define BITSTACK_SET_P(stack) ((stack)&1)
+
+#define COND_PUSH(n) BITSTACK_PUSH(p->cond_stack, (n))
+#define COND_POP() BITSTACK_POP(p->cond_stack)
+#define COND_LEXPOP() BITSTACK_LEXPOP(p->cond_stack)
+#define COND_P() BITSTACK_SET_P(p->cond_stack)
+
+#define CMDARG_PUSH(n) BITSTACK_PUSH(p->cmdarg_stack, (n))
+#define CMDARG_POP() BITSTACK_POP(p->cmdarg_stack)
+#define CMDARG_LEXPOP() BITSTACK_LEXPOP(p->cmdarg_stack)
+#define CMDARG_P() BITSTACK_SET_P(p->cmdarg_stack)
+
+#define SET_LINENO(c,n) ((c)->lineno = (n))
+#define NODE_LINENO(c,n) do {\
+ if (n) {\
+ (c)->filename_index = (n)->filename_index;\
+ (c)->lineno = (n)->lineno;\
+ }\
+} while (0)
+
+#define sym(x) ((mrb_sym)(intptr_t)(x))
+#define nsym(x) ((node*)(intptr_t)(x))
+#define nint(x) ((node*)(intptr_t)(x))
+#define intn(x) ((int)(intptr_t)(x))
+
+#define NUM_SUFFIX_R (1<<0)
+#define NUM_SUFFIX_I (1<<1)
+
+static inline mrb_sym
+intern_cstr_gen(parser_state *p, const char *s)
+{
+ return mrb_intern_cstr(p->mrb, s);
+}
+#define intern_cstr(s) intern_cstr_gen(p,(s))
+
+static inline mrb_sym
+intern_gen(parser_state *p, const char *s, size_t len)
+{
+ return mrb_intern(p->mrb, s, len);
+}
+#define intern(s,len) intern_gen(p,(s),(len))
+
+#define intern_lit(s) mrb_intern_lit(p->mrb, s)
+
+static void
+cons_free_gen(parser_state *p, node *cons)
+{
+ cons->cdr = p->cells;
+ p->cells = cons;
+}
+#define cons_free(c) cons_free_gen(p, (c))
+
+static void*
+parser_palloc(parser_state *p, size_t size)
+{
+ void *m = mrb_pool_alloc(p->pool, size);
+
+ if (!m) {
+ MRB_THROW(p->jmp);
+ }
+ return m;
+}
+
+static node*
+cons_gen(parser_state *p, node *car, node *cdr)
+{
+ node *c;
+
+ if (p->cells) {
+ c = p->cells;
+ p->cells = p->cells->cdr;
+ }
+ else {
+ c = (node *)parser_palloc(p, sizeof(mrb_ast_node));
+ }
+
+ c->car = car;
+ c->cdr = cdr;
+ c->lineno = p->lineno;
+ c->filename_index = p->current_filename_index;
+ /* beginning of next partial file; need to point the previous file */
+ if (p->lineno == 0 && p->current_filename_index > 0) {
+ c->filename_index-- ;
+ }
+ return c;
+}
+#define cons(a,b) cons_gen(p,(a),(b))
+
+static node*
+list1_gen(parser_state *p, node *a)
+{
+ return cons(a, 0);
+}
+#define list1(a) list1_gen(p, (a))
+
+static node*
+list2_gen(parser_state *p, node *a, node *b)
+{
+ return cons(a, cons(b,0));
+}
+#define list2(a,b) list2_gen(p, (a),(b))
+
+static node*
+list3_gen(parser_state *p, node *a, node *b, node *c)
+{
+ return cons(a, cons(b, cons(c,0)));
+}
+#define list3(a,b,c) list3_gen(p, (a),(b),(c))
+
+static node*
+list4_gen(parser_state *p, node *a, node *b, node *c, node *d)
+{
+ return cons(a, cons(b, cons(c, cons(d, 0))));
+}
+#define list4(a,b,c,d) list4_gen(p, (a),(b),(c),(d))
+
+static node*
+list5_gen(parser_state *p, node *a, node *b, node *c, node *d, node *e)
+{
+ return cons(a, cons(b, cons(c, cons(d, cons(e, 0)))));
+}
+#define list5(a,b,c,d,e) list5_gen(p, (a),(b),(c),(d),(e))
+
+static node*
+list6_gen(parser_state *p, node *a, node *b, node *c, node *d, node *e, node *f)
+{
+ return cons(a, cons(b, cons(c, cons(d, cons(e, cons(f, 0))))));
+}
+#define list6(a,b,c,d,e,f) list6_gen(p, (a),(b),(c),(d),(e),(f))
+
+static node*
+append_gen(parser_state *p, node *a, node *b)
+{
+ node *c = a;
+
+ if (!a) return b;
+ if (!b) return a;
+ while (c->cdr) {
+ c = c->cdr;
+ }
+ c->cdr = b;
+ return a;
+}
+#define append(a,b) append_gen(p,(a),(b))
+#define push(a,b) append_gen(p,(a),list1(b))
+
+static char*
+parser_strndup(parser_state *p, const char *s, size_t len)
+{
+ char *b = (char *)parser_palloc(p, len+1);
+
+ memcpy(b, s, len);
+ b[len] = '\0';
+ return b;
+}
+#undef strndup
+#define strndup(s,len) parser_strndup(p, s, len)
+
+static char*
+parser_strdup(parser_state *p, const char *s)
+{
+ return parser_strndup(p, s, strlen(s));
+}
+#undef strdup
+#define strdup(s) parser_strdup(p, s)
+
+static void
+dump_int(uint16_t i, char *s)
+{
+ char *p = s;
+ char *t = s;
+
+ while (i > 0) {
+ *p++ = (i % 10)+'0';
+ i /= 10;
+ }
+ if (p == s) *p++ = '0';
+ *p = 0;
+ p--; /* point the last char */
+ while (t < p) {
+ char c = *t;
+ *t++ = *p;
+ *p-- = c;
+ }
+}
+
+/* xxx ----------------------------- */
+
+static node*
+local_switch(parser_state *p)
+{
+ node *prev = p->locals;
+
+ p->locals = cons(0, 0);
+ return prev;
+}
+
+static void
+local_resume(parser_state *p, node *prev)
+{
+ p->locals = prev;
+}
+
+static void
+local_nest(parser_state *p)
+{
+ p->locals = cons(0, p->locals);
+}
+
+static void
+local_unnest(parser_state *p)
+{
+ if (p->locals) {
+ p->locals = p->locals->cdr;
+ }
+}
+
+static mrb_bool
+local_var_p(parser_state *p, mrb_sym sym)
+{
+ struct RProc *u;
+ node *l = p->locals;
+
+ while (l) {
+ node *n = l->car;
+ while (n) {
+ if (sym(n->car) == sym) return TRUE;
+ n = n->cdr;
+ }
+ l = l->cdr;
+ }
+
+ u = p->upper;
+ while (u && !MRB_PROC_CFUNC_P(u)) {
+ struct mrb_irep *ir = u->body.irep;
+ uint_fast16_t n = ir->nlocals;
+ const struct mrb_locals *v = ir->lv;
+ for (; n > 1; n --, v ++) {
+ if (v->name == sym) return TRUE;
+ }
+ if (MRB_PROC_SCOPE_P(u)) break;
+ u = u->upper;
+ }
+ return FALSE;
+}
+
+static void
+local_add_f(parser_state *p, mrb_sym sym)
+{
+ if (p->locals) {
+ p->locals->car = push(p->locals->car, nsym(sym));
+ }
+}
+
+static void
+local_add(parser_state *p, mrb_sym sym)
+{
+ if (!local_var_p(p, sym)) {
+ local_add_f(p, sym);
+ }
+}
+
+static void
+local_add_blk(parser_state *p, mrb_sym blk)
+{
+ /* allocate register for block */
+ local_add_f(p, blk ? blk : mrb_intern_lit(p->mrb, "&"));
+}
+
+static void
+local_add_kw(parser_state *p, mrb_sym kwd)
+{
+ /* allocate register for keywords hash */
+ local_add_f(p, kwd ? kwd : mrb_intern_lit(p->mrb, "**"));
+}
+
+static node*
+locals_node(parser_state *p)
+{
+ return p->locals ? p->locals->car : NULL;
+}
+
+static void
+nvars_nest(parser_state *p)
+{
+ p->nvars = cons(nint(0), p->nvars);
+}
+
+static void
+nvars_block(parser_state *p)
+{
+ p->nvars = cons(nint(-2), p->nvars);
+}
+
+static void
+nvars_unnest(parser_state *p)
+{
+ p->nvars = p->nvars->cdr;
+}
+
+/* (:scope (vars..) (prog...)) */
+static node*
+new_scope(parser_state *p, node *body)
+{
+ return cons((node*)NODE_SCOPE, cons(locals_node(p), body));
+}
+
+/* (:begin prog...) */
+static node*
+new_begin(parser_state *p, node *body)
+{
+ if (body) {
+ return list2((node*)NODE_BEGIN, body);
+ }
+ return cons((node*)NODE_BEGIN, 0);
+}
+
+#define newline_node(n) (n)
+
+/* (:rescue body rescue else) */
+static node*
+new_rescue(parser_state *p, node *body, node *resq, node *els)
+{
+ return list4((node*)NODE_RESCUE, body, resq, els);
+}
+
+static node*
+new_mod_rescue(parser_state *p, node *body, node *resq)
+{
+ return new_rescue(p, body, list1(list3(0, 0, resq)), 0);
+}
+
+/* (:ensure body ensure) */
+static node*
+new_ensure(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_ENSURE, cons(a, cons(0, b)));
+}
+
+/* (:nil) */
+static node*
+new_nil(parser_state *p)
+{
+ return list1((node*)NODE_NIL);
+}
+
+/* (:true) */
+static node*
+new_true(parser_state *p)
+{
+ return list1((node*)NODE_TRUE);
+}
+
+/* (:false) */
+static node*
+new_false(parser_state *p)
+{
+ return list1((node*)NODE_FALSE);
+}
+
+/* (:alias new old) */
+static node*
+new_alias(parser_state *p, mrb_sym a, mrb_sym b)
+{
+ return cons((node*)NODE_ALIAS, cons(nsym(a), nsym(b)));
+}
+
+/* (:if cond then else) */
+static node*
+new_if(parser_state *p, node *a, node *b, node *c)
+{
+ void_expr_error(p, a);
+ return list4((node*)NODE_IF, a, b, c);
+}
+
+/* (:unless cond then else) */
+static node*
+new_unless(parser_state *p, node *a, node *b, node *c)
+{
+ void_expr_error(p, a);
+ return list4((node*)NODE_IF, a, c, b);
+}
+
+/* (:while cond body) */
+static node*
+new_while(parser_state *p, node *a, node *b)
+{
+ void_expr_error(p, a);
+ return cons((node*)NODE_WHILE, cons(a, b));
+}
+
+/* (:until cond body) */
+static node*
+new_until(parser_state *p, node *a, node *b)
+{
+ void_expr_error(p, a);
+ return cons((node*)NODE_UNTIL, cons(a, b));
+}
+
+/* (:for var obj body) */
+static node*
+new_for(parser_state *p, node *v, node *o, node *b)
+{
+ void_expr_error(p, o);
+ return list4((node*)NODE_FOR, v, o, b);
+}
+
+/* (:case a ((when ...) body) ((when...) body)) */
+static node*
+new_case(parser_state *p, node *a, node *b)
+{
+ node *n = list2((node*)NODE_CASE, a);
+ node *n2 = n;
+
+ void_expr_error(p, a);
+ while (n2->cdr) {
+ n2 = n2->cdr;
+ }
+ n2->cdr = b;
+ return n;
+}
+
+/* (:postexe a) */
+static node*
+new_postexe(parser_state *p, node *a)
+{
+ return cons((node*)NODE_POSTEXE, a);
+}
+
+/* (:self) */
+static node*
+new_self(parser_state *p)
+{
+ return list1((node*)NODE_SELF);
+}
+
+/* (:call a b c) */
+static node*
+new_call(parser_state *p, node *a, mrb_sym b, node *c, int pass)
+{
+ node *n = list4(nint(pass?NODE_CALL:NODE_SCALL), a, nsym(b), c);
+ void_expr_error(p, a);
+ NODE_LINENO(n, a);
+ return n;
+}
+
+/* (:fcall self mid args) */
+static node*
+new_fcall(parser_state *p, mrb_sym b, node *c)
+{
+ node *n = new_self(p);
+ NODE_LINENO(n, c);
+ n = list4((node*)NODE_FCALL, n, nsym(b), c);
+ NODE_LINENO(n, c);
+ return n;
+}
+
+/* (:super . c) */
+static node*
+new_super(parser_state *p, node *c)
+{
+ return cons((node*)NODE_SUPER, c);
+}
+
+/* (:zsuper) */
+static node*
+new_zsuper(parser_state *p)
+{
+ return list1((node*)NODE_ZSUPER);
+}
+
+/* (:yield . c) */
+static node*
+new_yield(parser_state *p, node *c)
+{
+ if (c) {
+ if (c->cdr) {
+ yyerror(p, "both block arg and actual block given");
+ }
+ return cons((node*)NODE_YIELD, c->car);
+ }
+ return cons((node*)NODE_YIELD, 0);
+}
+
+/* (:return . c) */
+static node*
+new_return(parser_state *p, node *c)
+{
+ return cons((node*)NODE_RETURN, c);
+}
+
+/* (:break . c) */
+static node*
+new_break(parser_state *p, node *c)
+{
+ return cons((node*)NODE_BREAK, c);
+}
+
+/* (:next . c) */
+static node*
+new_next(parser_state *p, node *c)
+{
+ return cons((node*)NODE_NEXT, c);
+}
+
+/* (:redo) */
+static node*
+new_redo(parser_state *p)
+{
+ return list1((node*)NODE_REDO);
+}
+
+/* (:retry) */
+static node*
+new_retry(parser_state *p)
+{
+ return list1((node*)NODE_RETRY);
+}
+
+/* (:dot2 a b) */
+static node*
+new_dot2(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_DOT2, cons(a, b));
+}
+
+/* (:dot3 a b) */
+static node*
+new_dot3(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_DOT3, cons(a, b));
+}
+
+/* (:colon2 b c) */
+static node*
+new_colon2(parser_state *p, node *b, mrb_sym c)
+{
+ void_expr_error(p, b);
+ return cons((node*)NODE_COLON2, cons(b, nsym(c)));
+}
+
+/* (:colon3 . c) */
+static node*
+new_colon3(parser_state *p, mrb_sym c)
+{
+ return cons((node*)NODE_COLON3, nsym(c));
+}
+
+/* (:and a b) */
+static node*
+new_and(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_AND, cons(a, b));
+}
+
+/* (:or a b) */
+static node*
+new_or(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_OR, cons(a, b));
+}
+
+/* (:array a...) */
+static node*
+new_array(parser_state *p, node *a)
+{
+ return cons((node*)NODE_ARRAY, a);
+}
+
+/* (:splat . a) */
+static node*
+new_splat(parser_state *p, node *a)
+{
+ return cons((node*)NODE_SPLAT, a);
+}
+
+/* (:hash (k . v) (k . v)...) */
+static node*
+new_hash(parser_state *p, node *a)
+{
+ return cons((node*)NODE_HASH, a);
+}
+
+/* (:kw_hash (k . v) (k . v)...) */
+static node*
+new_kw_hash(parser_state *p, node *a)
+{
+ return cons((node*)NODE_KW_HASH, a);
+}
+
+/* (:sym . a) */
+static node*
+new_sym(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_SYM, nsym(sym));
+}
+
+static mrb_sym
+new_strsym(parser_state *p, node* str)
+{
+ const char *s = (const char*)str->cdr->car;
+ size_t len = (size_t)str->cdr->cdr;
+
+ return mrb_intern(p->mrb, s, len);
+}
+
+/* (:lvar . a) */
+static node*
+new_lvar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_LVAR, nsym(sym));
+}
+
+/* (:gvar . a) */
+static node*
+new_gvar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_GVAR, nsym(sym));
+}
+
+/* (:ivar . a) */
+static node*
+new_ivar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_IVAR, nsym(sym));
+}
+
+/* (:cvar . a) */
+static node*
+new_cvar(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_CVAR, nsym(sym));
+}
+
+/* (:nvar . a) */
+static node*
+new_nvar(parser_state *p, int num)
+{
+ int nvars = intn(p->nvars->car);
+
+ p->nvars->car = nint(nvars > num ? nvars : num);
+ return cons((node*)NODE_NVAR, nint(num));
+}
+
+/* (:const . a) */
+static node*
+new_const(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_CONST, nsym(sym));
+}
+
+/* (:undef a...) */
+static node*
+new_undef(parser_state *p, mrb_sym sym)
+{
+ return list2((node*)NODE_UNDEF, nsym(sym));
+}
+
+/* (:class class super body) */
+static node*
+new_class(parser_state *p, node *c, node *s, node *b)
+{
+ void_expr_error(p, s);
+ return list4((node*)NODE_CLASS, c, s, cons(locals_node(p), b));
+}
+
+/* (:sclass obj body) */
+static node*
+new_sclass(parser_state *p, node *o, node *b)
+{
+ void_expr_error(p, o);
+ return list3((node*)NODE_SCLASS, o, cons(locals_node(p), b));
+}
+
+/* (:module module body) */
+static node*
+new_module(parser_state *p, node *m, node *b)
+{
+ return list3((node*)NODE_MODULE, m, cons(locals_node(p), b));
+}
+
+/* (:def m lv (arg . body)) */
+static node*
+new_def(parser_state *p, mrb_sym m, node *a, node *b)
+{
+ return list5((node*)NODE_DEF, nsym(m), locals_node(p), a, b);
+}
+
+/* (:sdef obj m lv (arg . body)) */
+static node*
+new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b)
+{
+ void_expr_error(p, o);
+ return list6((node*)NODE_SDEF, o, nsym(m), locals_node(p), a, b);
+}
+
+/* (:arg . sym) */
+static node*
+new_arg(parser_state *p, mrb_sym sym)
+{
+ return cons((node*)NODE_ARG, nsym(sym));
+}
+
+static void
+local_add_margs(parser_state *p, node *n)
+{
+ while (n) {
+ if (n->car->car == (node*)NODE_MASGN) {
+ node *t = n->car->cdr->cdr;
+
+ n->car->cdr->cdr = NULL;
+ while (t) {
+ local_add_f(p, sym(t->car));
+ t = t->cdr;
+ }
+ local_add_margs(p, n->car->cdr->car->car);
+ local_add_margs(p, n->car->cdr->car->cdr->cdr->car);
+ }
+ n = n->cdr;
+ }
+}
+
+static void
+local_add_lv(parser_state *p, node *lv)
+{
+ while (lv) {
+ local_add_f(p, sym(lv->car));
+ lv = lv->cdr;
+ }
+}
+
+/* (m o r m2 tail) */
+/* m: (a b c) */
+/* o: ((a . e1) (b . e2)) */
+/* r: a */
+/* m2: (a b c) */
+/* b: a */
+static node*
+new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, node *tail)
+{
+ node *n;
+
+ local_add_margs(p, m);
+ local_add_margs(p, m2);
+ n = cons(m2, tail);
+ n = cons(nsym(rest), n);
+ n = cons(opt, n);
+ while (opt) {
+ /* opt: (sym . (opt . lv)) -> (sym . opt) */
+ local_add_lv(p, opt->car->cdr->cdr);
+ opt->car->cdr = opt->car->cdr->car;
+ opt = opt->cdr;
+ }
+ return cons(m, n);
+}
+
+/* (:args_tail keywords rest_keywords_sym block_sym) */
+static node*
+new_args_tail(parser_state *p, node *kws, node *kwrest, mrb_sym blk)
+{
+ node *k;
+
+ if (kws || kwrest) {
+ local_add_kw(p, (kwrest && kwrest->cdr)? sym(kwrest->cdr) : 0);
+ }
+
+ local_add_blk(p, blk);
+
+ /* allocate register for keywords arguments */
+ /* order is for Proc#parameters */
+ for (k = kws; k; k = k->cdr) {
+ if (!k->car->cdr->cdr->car) { /* allocate required keywords */
+ local_add_f(p, sym(k->car->cdr->car));
+ }
+ }
+ for (k = kws; k; k = k->cdr) {
+ if (k->car->cdr->cdr->car) { /* allocate keywords with default */
+ local_add_lv(p, k->car->cdr->cdr->car->cdr);
+ k->car->cdr->cdr->car = k->car->cdr->cdr->car->car;
+ local_add_f(p, sym(k->car->cdr->car));
+ }
+ }
+
+ return list4((node*)NODE_ARGS_TAIL, kws, kwrest, nsym(blk));
+}
+
+/* (:kw_arg kw_sym def_arg) */
+static node*
+new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg)
+{
+ mrb_assert(kw);
+ return list3((node*)NODE_KW_ARG, nsym(kw), def_arg);
+}
+
+/* (:kw_rest_args . a) */
+static node*
+new_kw_rest_args(parser_state *p, node *a)
+{
+ return cons((node*)NODE_KW_REST_ARGS, a);
+}
+
+/* (:block_arg . a) */
+static node*
+new_block_arg(parser_state *p, node *a)
+{
+ return cons((node*)NODE_BLOCK_ARG, a);
+}
+
+static node*
+setup_numparams(parser_state *p, node *a)
+{
+ int nvars = intn(p->nvars->car);
+ if (nvars > 0) {
+ int i;
+ mrb_sym sym;
+ // m || opt || rest || tail
+ if (a && (a->car || (a->cdr && a->cdr->car) || (a->cdr->cdr && a->cdr->cdr->car) || (a->cdr->cdr->cdr->cdr && a->cdr->cdr->cdr->cdr->car))) {
+ yyerror(p, "ordinary parameter is defined");
+ }
+ else if (p->locals) {
+ /* p->locals should not be NULL unless error happens before the point */
+ node* args = 0;
+ for (i = nvars; i > 0; i--) {
+ char buf[3];
+
+ buf[0] = '_';
+ buf[1] = i+'0';
+ buf[2] = '\0';
+ sym = intern_cstr(buf);
+ args = cons(new_arg(p, sym), args);
+ p->locals->car = cons(nsym(sym), p->locals->car);
+ }
+ a = new_args(p, args, 0, 0, 0, 0);
+ }
+ }
+ return a;
+}
+
+/* (:block arg body) */
+static node*
+new_block(parser_state *p, node *a, node *b)
+{
+ a = setup_numparams(p, a);
+ return list4((node*)NODE_BLOCK, locals_node(p), a, b);
+}
+
+/* (:lambda arg body) */
+static node*
+new_lambda(parser_state *p, node *a, node *b)
+{
+ return list4((node*)NODE_LAMBDA, locals_node(p), a, b);
+}
+
+/* (:asgn lhs rhs) */
+static node*
+new_asgn(parser_state *p, node *a, node *b)
+{
+ void_expr_error(p, b);
+ return cons((node*)NODE_ASGN, cons(a, b));
+}
+
+/* (:masgn mlhs=(pre rest post) mrhs) */
+static node*
+new_masgn(parser_state *p, node *a, node *b)
+{
+ void_expr_error(p, b);
+ return cons((node*)NODE_MASGN, cons(a, b));
+}
+
+/* (:masgn mlhs mrhs) no check */
+static node*
+new_masgn_param(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_MASGN, cons(a, b));
+}
+
+/* (:asgn lhs rhs) */
+static node*
+new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b)
+{
+ void_expr_error(p, b);
+ return list4((node*)NODE_OP_ASGN, a, nsym(op), b);
+}
+
+static node*
+new_imaginary(parser_state *p, node *imaginary)
+{
+ return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Complex"), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1);
+}
+
+static node*
+new_rational(parser_state *p, node *rational)
+{
+ return new_call(p, new_const(p, intern_lit("Kernel")), intern_lit("Rational"), list1(list1(rational)), 1);
+}
+
+/* (:int . i) */
+static node*
+new_int(parser_state *p, const char *s, int base, int suffix)
+{
+ node* result = list3((node*)NODE_INT, (node*)strdup(s), nint(base));
+ if (suffix & NUM_SUFFIX_R) {
+ result = new_rational(p, result);
+ }
+ if (suffix & NUM_SUFFIX_I) {
+ result = new_imaginary(p, result);
+ }
+ return result;
+}
+
+#ifndef MRB_WITHOUT_FLOAT
+/* (:float . i) */
+static node*
+new_float(parser_state *p, const char *s, int suffix)
+{
+ node* result = cons((node*)NODE_FLOAT, (node*)strdup(s));
+ if (suffix & NUM_SUFFIX_R) {
+ result = new_rational(p, result);
+ }
+ if (suffix & NUM_SUFFIX_I) {
+ result = new_imaginary(p, result);
+ }
+ return result;
+}
+#endif
+
+/* (:str . (s . len)) */
+static node*
+new_str(parser_state *p, const char *s, size_t len)
+{
+ return cons((node*)NODE_STR, cons((node*)strndup(s, len), nint(len)));
+}
+
+/* (:dstr . a) */
+static node*
+new_dstr(parser_state *p, node *a)
+{
+ return cons((node*)NODE_DSTR, a);
+}
+
+static int
+string_node_p(node *n)
+{
+ return (int)((enum node_type)(intptr_t)n->car == NODE_STR);
+}
+
+static node*
+composite_string_node(parser_state *p, node *a, node *b)
+{
+ size_t newlen = (size_t)a->cdr + (size_t)b->cdr;
+ char *str = (char*)mrb_pool_realloc(p->pool, a->car, (size_t)a->cdr + 1, newlen + 1);
+ memcpy(str + (size_t)a->cdr, b->car, (size_t)b->cdr);
+ str[newlen] = '\0';
+ a->car = (node*)str;
+ a->cdr = (node*)newlen;
+ cons_free(b);
+ return a;
+}
+
+static node*
+concat_string(parser_state *p, node *a, node *b)
+{
+ if (string_node_p(a)) {
+ if (string_node_p(b)) {
+ /* a == NODE_STR && b == NODE_STR */
+ composite_string_node(p, a->cdr, b->cdr);
+ cons_free(b);
+ return a;
+ }
+ else {
+ /* a == NODE_STR && b == NODE_DSTR */
+
+ if (string_node_p(b->cdr->car)) {
+ /* a == NODE_STR && b->[NODE_STR, ...] */
+ composite_string_node(p, a->cdr, b->cdr->car->cdr);
+ cons_free(b->cdr->car);
+ b->cdr->car = a;
+ return b;
+ }
+ }
+ }
+ else {
+ node *c; /* last node of a */
+ for (c = a; c->cdr != NULL; c = c->cdr) ;
+
+ if (string_node_p(b)) {
+ /* a == NODE_DSTR && b == NODE_STR */
+ if (string_node_p(c->car)) {
+ /* a->[..., NODE_STR] && b == NODE_STR */
+ composite_string_node(p, c->car->cdr, b->cdr);
+ cons_free(b);
+ return a;
+ }
+
+ push(a, b);
+ return a;
+ }
+ else {
+ /* a == NODE_DSTR && b == NODE_DSTR */
+ if (string_node_p(c->car) && string_node_p(b->cdr->car)) {
+ /* a->[..., NODE_STR] && b->[NODE_STR, ...] */
+ node *d = b->cdr;
+ cons_free(b);
+ composite_string_node(p, c->car->cdr, d->car->cdr);
+ cons_free(d->car);
+ c->cdr = d->cdr;
+ cons_free(d);
+ return a;
+ }
+ else {
+ c->cdr = b->cdr;
+ cons_free(b);
+ return a;
+ }
+ }
+ }
+
+ return new_dstr(p, list2(a, b));
+}
+
+/* (:str . (s . len)) */
+static node*
+new_xstr(parser_state *p, const char *s, int len)
+{
+ return cons((node*)NODE_XSTR, cons((node*)strndup(s, len), nint(len)));
+}
+
+/* (:xstr . a) */
+static node*
+new_dxstr(parser_state *p, node *a)
+{
+ return cons((node*)NODE_DXSTR, a);
+}
+
+/* (:dsym . a) */
+static node*
+new_dsym(parser_state *p, node *a)
+{
+ return cons((node*)NODE_DSYM, a);
+}
+
+/* (:regx . (s . (opt . enc))) */
+static node*
+new_regx(parser_state *p, const char *p1, const char* p2, const char* p3)
+{
+ return cons((node*)NODE_REGX, cons((node*)p1, cons((node*)p2, (node*)p3)));
+}
+
+/* (:dregx . (a . b)) */
+static node*
+new_dregx(parser_state *p, node *a, node *b)
+{
+ return cons((node*)NODE_DREGX, cons(a, b));
+}
+
+/* (:backref . n) */
+static node*
+new_back_ref(parser_state *p, int n)
+{
+ return cons((node*)NODE_BACK_REF, nint(n));
+}
+
+/* (:nthref . n) */
+static node*
+new_nth_ref(parser_state *p, int n)
+{
+ return cons((node*)NODE_NTH_REF, nint(n));
+}
+
+/* (:heredoc . a) */
+static node*
+new_heredoc(parser_state *p)
+{
+ parser_heredoc_info *inf = (parser_heredoc_info *)parser_palloc(p, sizeof(parser_heredoc_info));
+ return cons((node*)NODE_HEREDOC, (node*)inf);
+}
+
+static void
+new_bv(parser_state *p, mrb_sym id)
+{
+}
+
+static node*
+new_literal_delim(parser_state *p)
+{
+ return cons((node*)NODE_LITERAL_DELIM, 0);
+}
+
+/* (:words . a) */
+static node*
+new_words(parser_state *p, node *a)
+{
+ return cons((node*)NODE_WORDS, a);
+}
+
+/* (:symbols . a) */
+static node*
+new_symbols(parser_state *p, node *a)
+{
+ return cons((node*)NODE_SYMBOLS, a);
+}
+
+/* xxx ----------------------------- */
+
+/* (:call a op) */
+static node*
+call_uni_op(parser_state *p, node *recv, const char *m)
+{
+ void_expr_error(p, recv);
+ return new_call(p, recv, intern_cstr(m), 0, 1);
+}
+
+/* (:call a op b) */
+static node*
+call_bin_op(parser_state *p, node *recv, const char *m, node *arg1)
+{
+ return new_call(p, recv, intern_cstr(m), list1(list1(arg1)), 1);
+}
+
+static void
+args_with_block(parser_state *p, node *a, node *b)
+{
+ if (b) {
+ if (a->cdr) {
+ yyerror(p, "both block arg and actual block given");
+ }
+ a->cdr = b;
+ }
+}
+
+static void
+call_with_block(parser_state *p, node *a, node *b)
+{
+ node *n;
+
+ switch ((enum node_type)intn(a->car)) {
+ case NODE_SUPER:
+ case NODE_ZSUPER:
+ if (!a->cdr) a->cdr = cons(0, b);
+ else {
+ args_with_block(p, a->cdr, b);
+ }
+ break;
+ case NODE_CALL:
+ case NODE_FCALL:
+ case NODE_SCALL:
+ n = a->cdr->cdr->cdr;
+ if (!n->car) n->car = cons(0, b);
+ else {
+ args_with_block(p, n->car, b);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static node*
+negate_lit(parser_state *p, node *n)
+{
+ return cons((node*)NODE_NEGATE, n);
+}
+
+static node*
+cond(node *n)
+{
+ return n;
+}
+
+static node*
+ret_args(parser_state *p, node *n)
+{
+ if (n->cdr) {
+ yyerror(p, "block argument should not be given");
+ return NULL;
+ }
+ if (!n->car->cdr) return n->car->car;
+ return new_array(p, n->car);
+}
+
+static void
+assignable(parser_state *p, node *lhs)
+{
+ if (intn(lhs->car) == NODE_LVAR) {
+ local_add(p, sym(lhs->cdr));
+ }
+}
+
+static node*
+var_reference(parser_state *p, node *lhs)
+{
+ node *n;
+
+ if (intn(lhs->car) == NODE_LVAR) {
+ if (!local_var_p(p, sym(lhs->cdr))) {
+ n = new_fcall(p, sym(lhs->cdr), 0);
+ cons_free(lhs);
+ return n;
+ }
+ }
+
+ return lhs;
+}
+
+typedef enum mrb_string_type string_type;
+
+static node*
+new_strterm(parser_state *p, string_type type, int term, int paren)
+{
+ return cons(nint(type), cons((node*)0, cons(nint(paren), nint(term))));
+}
+
+static void
+end_strterm(parser_state *p)
+{
+ cons_free(p->lex_strterm->cdr->cdr);
+ cons_free(p->lex_strterm->cdr);
+ cons_free(p->lex_strterm);
+ p->lex_strterm = NULL;
+}
+
+static parser_heredoc_info *
+parsing_heredoc_inf(parser_state *p)
+{
+ node *nd = p->parsing_heredoc;
+ if (nd == NULL)
+ return NULL;
+ /* mrb_assert(nd->car->car == NODE_HEREDOC); */
+ return (parser_heredoc_info*)nd->car->cdr;
+}
+
+static void
+heredoc_treat_nextline(parser_state *p)
+{
+ if (p->heredocs_from_nextline == NULL)
+ return;
+ if (p->parsing_heredoc == NULL) {
+ node *n;
+ p->parsing_heredoc = p->heredocs_from_nextline;
+ p->lex_strterm_before_heredoc = p->lex_strterm;
+ p->lex_strterm = new_strterm(p, parsing_heredoc_inf(p)->type, 0, 0);
+ n = p->all_heredocs;
+ if (n) {
+ while (n->cdr)
+ n = n->cdr;
+ n->cdr = p->parsing_heredoc;
+ }
+ else {
+ p->all_heredocs = p->parsing_heredoc;
+ }
+ }
+ else {
+ node *n, *m;
+ m = p->heredocs_from_nextline;
+ while (m->cdr)
+ m = m->cdr;
+ n = p->all_heredocs;
+ mrb_assert(n != NULL);
+ if (n == p->parsing_heredoc) {
+ m->cdr = n;
+ p->all_heredocs = p->heredocs_from_nextline;
+ p->parsing_heredoc = p->heredocs_from_nextline;
+ }
+ else {
+ while (n->cdr != p->parsing_heredoc) {
+ n = n->cdr;
+ mrb_assert(n != NULL);
+ }
+ m->cdr = n->cdr;
+ n->cdr = p->heredocs_from_nextline;
+ p->parsing_heredoc = p->heredocs_from_nextline;
+ }
+ }
+ p->heredocs_from_nextline = NULL;
+}
+
+static void
+heredoc_end(parser_state *p)
+{
+ p->parsing_heredoc = p->parsing_heredoc->cdr;
+ if (p->parsing_heredoc == NULL) {
+ p->lstate = EXPR_BEG;
+ end_strterm(p);
+ p->lex_strterm = p->lex_strterm_before_heredoc;
+ p->lex_strterm_before_heredoc = NULL;
+ }
+ else {
+ /* next heredoc */
+ p->lex_strterm->car = nint(parsing_heredoc_inf(p)->type);
+ }
+}
+#define is_strterm_type(p,str_func) (intn((p)->lex_strterm->car) & (str_func))
+
+/* xxx ----------------------------- */
+
+
+#line 1408 "mrbgems/mruby-compiler/core/y.tab.c"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 1
+#endif
+
+
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token type. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ keyword_class = 258,
+ keyword_module = 259,
+ keyword_def = 260,
+ keyword_begin = 261,
+ keyword_if = 262,
+ keyword_unless = 263,
+ keyword_while = 264,
+ keyword_until = 265,
+ keyword_for = 266,
+ keyword_undef = 267,
+ keyword_rescue = 268,
+ keyword_ensure = 269,
+ keyword_end = 270,
+ keyword_then = 271,
+ keyword_elsif = 272,
+ keyword_else = 273,
+ keyword_case = 274,
+ keyword_when = 275,
+ keyword_break = 276,
+ keyword_next = 277,
+ keyword_redo = 278,
+ keyword_retry = 279,
+ keyword_in = 280,
+ keyword_do = 281,
+ keyword_do_cond = 282,
+ keyword_do_block = 283,
+ keyword_do_LAMBDA = 284,
+ keyword_return = 285,
+ keyword_yield = 286,
+ keyword_super = 287,
+ keyword_self = 288,
+ keyword_nil = 289,
+ keyword_true = 290,
+ keyword_false = 291,
+ keyword_and = 292,
+ keyword_or = 293,
+ keyword_not = 294,
+ modifier_if = 295,
+ modifier_unless = 296,
+ modifier_while = 297,
+ modifier_until = 298,
+ modifier_rescue = 299,
+ keyword_alias = 300,
+ keyword_BEGIN = 301,
+ keyword_END = 302,
+ keyword__LINE__ = 303,
+ keyword__FILE__ = 304,
+ keyword__ENCODING__ = 305,
+ tIDENTIFIER = 306,
+ tFID = 307,
+ tGVAR = 308,
+ tIVAR = 309,
+ tCONSTANT = 310,
+ tCVAR = 311,
+ tLABEL_TAG = 312,
+ tINTEGER = 313,
+ tFLOAT = 314,
+ tCHAR = 315,
+ tXSTRING = 316,
+ tREGEXP = 317,
+ tSTRING = 318,
+ tSTRING_PART = 319,
+ tSTRING_MID = 320,
+ tNTH_REF = 321,
+ tBACK_REF = 322,
+ tREGEXP_END = 323,
+ tNUMPARAM = 324,
+ tUPLUS = 325,
+ tUMINUS = 326,
+ tPOW = 327,
+ tCMP = 328,
+ tEQ = 329,
+ tEQQ = 330,
+ tNEQ = 331,
+ tGEQ = 332,
+ tLEQ = 333,
+ tANDOP = 334,
+ tOROP = 335,
+ tMATCH = 336,
+ tNMATCH = 337,
+ tDOT2 = 338,
+ tDOT3 = 339,
+ tAREF = 340,
+ tASET = 341,
+ tLSHFT = 342,
+ tRSHFT = 343,
+ tCOLON2 = 344,
+ tCOLON3 = 345,
+ tOP_ASGN = 346,
+ tASSOC = 347,
+ tLPAREN = 348,
+ tLPAREN_ARG = 349,
+ tRPAREN = 350,
+ tLBRACK = 351,
+ tLBRACE = 352,
+ tLBRACE_ARG = 353,
+ tSTAR = 354,
+ tDSTAR = 355,
+ tAMPER = 356,
+ tLAMBDA = 357,
+ tANDDOT = 358,
+ tSYMBEG = 359,
+ tREGEXP_BEG = 360,
+ tWORDS_BEG = 361,
+ tSYMBOLS_BEG = 362,
+ tSTRING_BEG = 363,
+ tXSTRING_BEG = 364,
+ tSTRING_DVAR = 365,
+ tLAMBEG = 366,
+ tHEREDOC_BEG = 367,
+ tHEREDOC_END = 368,
+ tLITERAL_DELIM = 369,
+ tHD_LITERAL_DELIM = 370,
+ tHD_STRING_PART = 371,
+ tHD_STRING_MID = 372,
+ tLOWEST = 373,
+ tUMINUS_NUM = 374,
+ tLAST_TOKEN = 375
+ };
+#endif
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 1350 "mrbgems/mruby-compiler/core/parse.y"
+
+ node *nd;
+ mrb_sym id;
+ int num;
+ stack_type stack;
+ const struct vtable *vars;
+
+#line 1586 "mrbgems/mruby-compiler/core/y.tab.c"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+int yyparse (parser_state *p);
+
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int16 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(E) ((void) (E))
+#else
+# define YYUSE(E) /* empty */
+#endif
+
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 3
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 11586
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 147
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 176
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 594
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 1034
+
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 375
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 146, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 133, 2, 2, 2, 131, 126, 2,
+ 142, 143, 129, 127, 140, 128, 145, 130, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 121, 144,
+ 123, 119, 122, 120, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 138, 2, 139, 125, 2, 141, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 136, 124, 137, 134, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
+ 115, 116, 117, 118, 132, 135
+};
+
+#if YYDEBUG
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 1508, 1508, 1508, 1519, 1525, 1529, 1534, 1538, 1544,
+ 1546, 1545, 1559, 1586, 1592, 1596, 1601, 1605, 1611, 1611,
+ 1615, 1619, 1623, 1627, 1631, 1635, 1639, 1644, 1645, 1649,
+ 1653, 1657, 1661, 1664, 1668, 1672, 1676, 1680, 1684, 1689,
+ 1693, 1700, 1701, 1705, 1709, 1710, 1714, 1718, 1722, 1726,
+ 1729, 1738, 1739, 1742, 1743, 1750, 1749, 1764, 1768, 1773,
+ 1777, 1782, 1786, 1791, 1795, 1799, 1803, 1807, 1813, 1817,
+ 1823, 1824, 1830, 1834, 1838, 1842, 1846, 1850, 1854, 1858,
+ 1862, 1866, 1872, 1873, 1879, 1883, 1889, 1893, 1899, 1903,
+ 1907, 1911, 1915, 1919, 1925, 1931, 1938, 1942, 1946, 1950,
+ 1954, 1958, 1964, 1970, 1975, 1981, 1985, 1988, 1992, 1996,
+ 2003, 2004, 2005, 2006, 2011, 2018, 2019, 2022, 2026, 2026,
+ 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041,
+ 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051,
+ 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061,
+ 2064, 2064, 2064, 2065, 2065, 2066, 2066, 2066, 2067, 2067,
+ 2067, 2067, 2068, 2068, 2068, 2069, 2069, 2069, 2070, 2070,
+ 2070, 2070, 2071, 2071, 2071, 2071, 2072, 2072, 2072, 2072,
+ 2073, 2073, 2073, 2073, 2074, 2074, 2074, 2074, 2075, 2075,
+ 2078, 2082, 2086, 2090, 2094, 2098, 2102, 2107, 2112, 2117,
+ 2121, 2125, 2129, 2133, 2137, 2141, 2145, 2149, 2153, 2157,
+ 2161, 2165, 2169, 2173, 2177, 2181, 2185, 2189, 2193, 2197,
+ 2201, 2205, 2209, 2213, 2217, 2221, 2225, 2229, 2233, 2237,
+ 2241, 2245, 2249, 2255, 2256, 2261, 2265, 2272, 2276, 2284,
+ 2288, 2314, 2315, 2318, 2319, 2320, 2325, 2330, 2337, 2343,
+ 2348, 2353, 2358, 2365, 2365, 2376, 2382, 2386, 2392, 2393,
+ 2396, 2402, 2408, 2413, 2420, 2425, 2430, 2437, 2438, 2439,
+ 2440, 2441, 2442, 2443, 2444, 2448, 2453, 2452, 2464, 2468,
+ 2463, 2473, 2473, 2477, 2481, 2485, 2489, 2494, 2499, 2503,
+ 2507, 2511, 2515, 2519, 2520, 2526, 2532, 2525, 2544, 2552,
+ 2560, 2560, 2560, 2567, 2567, 2567, 2574, 2580, 2585, 2587,
+ 2584, 2596, 2594, 2612, 2617, 2610, 2634, 2632, 2649, 2653,
+ 2648, 2670, 2676, 2669, 2693, 2697, 2701, 2705, 2711, 2718,
+ 2719, 2720, 2723, 2724, 2727, 2728, 2736, 2737, 2743, 2747,
+ 2750, 2754, 2758, 2762, 2767, 2771, 2775, 2779, 2785, 2784,
+ 2794, 2798, 2802, 2806, 2812, 2817, 2822, 2826, 2830, 2834,
+ 2838, 2842, 2846, 2850, 2854, 2858, 2862, 2866, 2870, 2874,
+ 2878, 2884, 2889, 2896, 2896, 2900, 2905, 2912, 2916, 2922,
+ 2923, 2926, 2931, 2934, 2938, 2944, 2948, 2955, 2954, 2969,
+ 2979, 2983, 2988, 2995, 2999, 3003, 3007, 3011, 3015, 3019,
+ 3023, 3027, 3034, 3033, 3048, 3047, 3063, 3071, 3080, 3083,
+ 3090, 3093, 3097, 3098, 3101, 3105, 3108, 3112, 3115, 3116,
+ 3117, 3118, 3121, 3122, 3128, 3129, 3130, 3134, 3140, 3141,
+ 3147, 3152, 3151, 3162, 3166, 3172, 3176, 3182, 3186, 3192,
+ 3195, 3196, 3199, 3205, 3211, 3212, 3215, 3222, 3221, 3235,
+ 3239, 3246, 3251, 3258, 3264, 3265, 3266, 3267, 3268, 3272,
+ 3278, 3282, 3288, 3289, 3290, 3294, 3300, 3304, 3308, 3312,
+ 3316, 3322, 3326, 3332, 3336, 3340, 3344, 3348, 3352, 3360,
+ 3367, 3378, 3379, 3383, 3387, 3386, 3402, 3408, 3426, 3432,
+ 3438, 3444, 3451, 3456, 3463, 3467, 3473, 3477, 3483, 3484,
+ 3487, 3491, 3497, 3501, 3505, 3509, 3515, 3520, 3525, 3529,
+ 3533, 3537, 3541, 3545, 3549, 3553, 3557, 3561, 3565, 3569,
+ 3573, 3577, 3582, 3588, 3593, 3598, 3603, 3608, 3615, 3619,
+ 3626, 3631, 3630, 3642, 3646, 3652, 3660, 3668, 3676, 3680,
+ 3686, 3690, 3696, 3697, 3700, 3705, 3712, 3713, 3716, 3722,
+ 3726, 3732, 3737, 3737, 3762, 3763, 3769, 3774, 3780, 3781,
+ 3784, 3790, 3795, 3805, 3812, 3813, 3814, 3817, 3818, 3819,
+ 3820, 3823, 3824, 3825, 3828, 3829, 3832, 3836, 3842, 3843,
+ 3849, 3850, 3853, 3854, 3857, 3860, 3861, 3862, 3865, 3866,
+ 3867, 3870, 3877, 3878, 3882
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || 1
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "keyword_class", "keyword_module",
+ "keyword_def", "keyword_begin", "keyword_if", "keyword_unless",
+ "keyword_while", "keyword_until", "keyword_for", "keyword_undef",
+ "keyword_rescue", "keyword_ensure", "keyword_end", "keyword_then",
+ "keyword_elsif", "keyword_else", "keyword_case", "keyword_when",
+ "keyword_break", "keyword_next", "keyword_redo", "keyword_retry",
+ "keyword_in", "keyword_do", "keyword_do_cond", "keyword_do_block",
+ "keyword_do_LAMBDA", "keyword_return", "keyword_yield", "keyword_super",
+ "keyword_self", "keyword_nil", "keyword_true", "keyword_false",
+ "keyword_and", "keyword_or", "keyword_not", "modifier_if",
+ "modifier_unless", "modifier_while", "modifier_until", "modifier_rescue",
+ "keyword_alias", "keyword_BEGIN", "keyword_END", "keyword__LINE__",
+ "keyword__FILE__", "keyword__ENCODING__", "tIDENTIFIER", "tFID", "tGVAR",
+ "tIVAR", "tCONSTANT", "tCVAR", "tLABEL_TAG", "tINTEGER", "tFLOAT",
+ "tCHAR", "tXSTRING", "tREGEXP", "tSTRING", "tSTRING_PART", "tSTRING_MID",
+ "tNTH_REF", "tBACK_REF", "tREGEXP_END", "tNUMPARAM", "tUPLUS", "tUMINUS",
+ "tPOW", "tCMP", "tEQ", "tEQQ", "tNEQ", "tGEQ", "tLEQ", "tANDOP", "tOROP",
+ "tMATCH", "tNMATCH", "tDOT2", "tDOT3", "tAREF", "tASET", "tLSHFT",
+ "tRSHFT", "tCOLON2", "tCOLON3", "tOP_ASGN", "tASSOC", "tLPAREN",
+ "tLPAREN_ARG", "tRPAREN", "tLBRACK", "tLBRACE", "tLBRACE_ARG", "tSTAR",
+ "tDSTAR", "tAMPER", "tLAMBDA", "tANDDOT", "tSYMBEG", "tREGEXP_BEG",
+ "tWORDS_BEG", "tSYMBOLS_BEG", "tSTRING_BEG", "tXSTRING_BEG",
+ "tSTRING_DVAR", "tLAMBEG", "tHEREDOC_BEG", "tHEREDOC_END",
+ "tLITERAL_DELIM", "tHD_LITERAL_DELIM", "tHD_STRING_PART",
+ "tHD_STRING_MID", "tLOWEST", "'='", "'?'", "':'", "'>'", "'<'", "'|'",
+ "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "tUMINUS_NUM", "'!'",
+ "'~'", "tLAST_TOKEN", "'{'", "'}'", "'['", "']'", "','", "'`'", "'('",
+ "')'", "';'", "'.'", "'\\n'", "$accept", "program", "$@1",
+ "top_compstmt", "top_stmts", "top_stmt", "@2", "bodystmt", "compstmt",
+ "stmts", "stmt", "$@3", "command_asgn", "command_rhs", "expr",
+ "expr_value", "command_call", "block_command", "cmd_brace_block", "$@4",
+ "command", "mlhs", "mlhs_inner", "mlhs_basic", "mlhs_item", "mlhs_list",
+ "mlhs_post", "mlhs_node", "lhs", "cname", "cpath", "fname", "fsym",
+ "undef_list", "$@5", "op", "reswords", "arg", "aref_args", "arg_rhs",
+ "paren_args", "opt_paren_args", "opt_call_args", "call_args",
+ "command_args", "@6", "block_arg", "opt_block_arg", "comma", "args",
+ "mrhs", "primary", "@7", "@8", "$@9", "$@10", "@11", "@12", "$@13",
+ "$@14", "$@15", "$@16", "$@17", "$@18", "@19", "@20", "@21", "@22",
+ "@23", "@24", "@25", "@26", "primary_value", "then", "do", "if_tail",
+ "opt_else", "for_var", "f_margs", "$@27", "block_args_tail",
+ "opt_block_args_tail", "block_param", "opt_block_param",
+ "block_param_def", "$@28", "opt_bv_decl", "bv_decls", "bvar",
+ "f_larglist", "lambda_body", "do_block", "$@29", "block_call",
+ "method_call", "brace_block", "@30", "@31", "case_body", "cases",
+ "opt_rescue", "exc_list", "exc_var", "opt_ensure", "literal", "string",
+ "string_fragment", "string_rep", "string_interp", "@32", "xstring",
+ "regexp", "heredoc", "heredoc_bodies", "heredoc_body",
+ "heredoc_string_rep", "heredoc_string_interp", "@33", "words", "symbol",
+ "basic_symbol", "sym", "symbols", "numeric", "variable", "var_lhs",
+ "var_ref", "backref", "superclass", "$@34", "f_arglist", "f_label",
+ "f_kw", "f_block_kw", "f_block_kwarg", "f_kwarg", "kwrest_mark",
+ "f_kwrest", "args_tail", "opt_args_tail", "f_args", "f_bad_arg",
+ "f_norm_arg", "f_arg_item", "@35", "f_arg", "f_opt_asgn", "f_opt",
+ "f_block_opt", "f_block_optarg", "f_optarg", "restarg_mark",
+ "f_rest_arg", "blkarg_mark", "f_block_arg", "opt_f_block_arg",
+ "singleton", "$@36", "assoc_list", "assocs", "label_tag", "assoc",
+ "operation", "operation2", "operation3", "dot_or_colon", "call_op",
+ "call_op2", "opt_terms", "opt_nl", "rparen", "trailer", "term", "nl",
+ "terms", "none", YY_NULLPTR
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+ (internal) symbol number NUM (which must be that of a token). */
+static const yytype_int16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+ 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
+ 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
+ 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
+ 325, 326, 327, 328, 329, 330, 331, 332, 333, 334,
+ 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,
+ 345, 346, 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
+ 365, 366, 367, 368, 369, 370, 371, 372, 373, 61,
+ 63, 58, 62, 60, 124, 94, 38, 43, 45, 42,
+ 47, 37, 374, 33, 126, 375, 123, 125, 91, 93,
+ 44, 96, 40, 41, 59, 46, 10
+};
+# endif
+
+#define YYPACT_NINF (-829)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-595)
+
+#define yytable_value_is_error(Yyn) \
+ ((Yyn) == YYTABLE_NINF)
+
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ -829, 164, 2491, -829, 7022, 8994, 9330, 5100, -829, 8646,
+ 8646, -829, -829, 9106, 6520, 4956, 7370, 7370, -829, -829,
+ 7370, 2735, 5870, -829, -829, -829, -829, -39, 6520, -829,
+ 36, -829, -829, -829, 5240, 5380, -829, -829, 5520, -829,
+ -829, -829, -829, -829, -829, -829, 20, 8762, 8762, 129,
+ 4227, 1481, 7602, 7950, 6798, -829, 6242, 614, 927, 1024,
+ 1126, 839, -829, 410, 8878, 8762, -829, 852, -829, 1251,
+ -829, 448, -829, -829, 166, 171, -829, 80, 9218, -829,
+ 198, 11318, 299, 402, 21, 59, -829, 354, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, 203, 165, -829,
+ 340, 137, -829, -829, -829, -829, -829, 159, 159, 177,
+ 72, 552, -829, 8646, 99, 4344, 607, -829, 200, -829,
+ 494, -829, -829, 137, -829, -829, -829, -829, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, -829, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, -829, -829, -829,
+ -829, -829, 33, 44, 47, 101, -829, -829, -829, -829,
+ -829, -829, 170, 218, 219, 227, -829, 229, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, -829, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, -829, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, -829, -829, -829,
+ -829, -829, -829, 240, 3417, 270, 448, 83, 225, 526,
+ 61, 247, 86, 83, 8646, 8646, 539, 306, -829, -829,
+ 609, 329, 95, 110, -829, -829, -829, -829, -829, -829,
+ -829, -829, -829, 6381, -829, -829, 253, -829, -829, -829,
+ -829, -829, -829, 852, -829, 264, -829, 386, -829, -829,
+ 852, 2601, 8762, 8762, 8762, 8762, -829, 11297, -829, -829,
+ 271, 361, 271, -829, -829, -829, 7138, -829, -829, -829,
+ 7370, -829, -829, -829, 4956, 8646, -829, -829, 286, 4461,
+ -829, 796, 355, 398, 7254, 4227, 302, 852, 1251, 852,
+ 323, -829, 7254, 852, 325, 1517, 1517, -829, 11297, 316,
+ 1517, -829, 421, 9442, 370, 798, 826, 859, 1597, -829,
+ -829, -829, -829, 1166, -829, -829, -829, -829, -829, -829,
+ 679, 749, -829, -829, 1186, -829, 1195, -829, 1257, -829,
+ 860, 444, 446, -829, -829, -829, -829, 4722, 8646, 8646,
+ 8646, 8646, 7254, 8646, 8646, -829, -829, 8066, -829, 4227,
+ 6910, 392, 8066, 8762, 8762, 8762, 8762, 8762, 8762, 8762,
+ 8762, 8762, 8762, 8762, 8762, 8762, 8762, 8762, 8762, 8762,
+ 8762, 8762, 8762, 8762, 8762, 8762, 8762, 8762, 8762, 9714,
+ -829, 7370, -829, 9798, -829, -829, 10974, -829, -829, -829,
+ -829, 8878, 8878, -829, 428, -829, 448, -829, 961, -829,
+ -829, -829, -829, -829, 9882, 7370, 9966, 3417, 8646, -829,
+ -829, -829, -829, 522, 528, 149, -829, 3561, 533, 8762,
+ 10050, 7370, 10134, 8762, 8762, 3849, 126, 126, 113, 10218,
+ 7370, 10302, -829, 501, -829, 4461, 386, -829, -829, 8182,
+ 542, -829, 679, 8762, 11318, 11318, 11318, 8762, 476, -829,
+ 7486, -829, 8762, -829, 7718, 852, 425, 852, 271, 271,
+ -829, -829, 745, 431, -829, -829, 6520, 3966, 443, 10050,
+ 10134, 8762, 1251, 852, -829, -829, 4839, 445, 1251, -829,
+ -829, 7834, -829, 852, 7950, -829, -829, -829, 961, 80,
+ 9442, -829, 9442, 10386, 7370, 10470, 30, -829, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, -829, -829, 1719,
+ -829, 8762, -829, 451, 554, 472, -829, -829, -829, -829,
+ -829, 479, 8762, -829, 497, 596, 511, 608, -829, -829,
+ 1283, 4461, 679, -829, -829, -829, -829, -829, -829, -829,
+ 8762, 8762, -829, -829, -829, -829, -829, -829, -829, -829,
+ 153, 8762, -829, 11121, 271, -829, 852, 9442, 532, -829,
+ -829, -829, 570, 572, 2302, -829, -829, 976, 180, 355,
+ 2331, 2331, 2331, 2331, 1479, 1479, 11455, 11395, 2331, 2331,
+ 11378, 11378, 671, 671, 11061, 1479, 1479, 1462, 1462, 1490,
+ 175, 175, 355, 355, 355, 2869, 5986, 3137, 6102, -829,
+ 159, -829, 550, 437, -829, 563, -829, -829, 5870, -829,
+ -829, 2061, 153, 153, -829, 11044, -829, -829, -829, -829,
+ -829, 852, 8646, 3417, 736, 813, -829, 159, 560, 159,
+ 699, 745, 1650, 6659, -829, 8298, 706, -829, 690, -829,
+ 5636, 5753, 605, 268, 276, 706, -829, -829, -829, -829,
+ 79, 88, 613, 121, 140, 8646, 6520, 616, 740, 11318,
+ 450, -829, 679, 11318, 11318, 679, 8762, 11297, -829, 271,
+ 11318, -829, -829, -829, -829, 7486, 7718, -829, -829, -829,
+ 623, -829, -829, 136, 1251, 852, 1517, 392, -829, 736,
+ 813, 626, 959, 1023, -829, -829, 1123, 622, 77, 11318,
+ 768, -829, -829, -829, 201, -829, 1719, -829, 11318, 1719,
+ -829, -829, 1907, -829, -829, -829, 637, -829, 355, 355,
+ -829, 1719, 3417, -829, -829, 11140, 8414, -829, -829, 9442,
+ 7254, 8878, 8762, 10554, 7370, 10638, 70, 8878, 8878, -829,
+ 428, 672, 8878, 8878, -829, 428, 59, 166, 3417, 4461,
+ 153, -829, 852, 762, -829, -829, -829, 1826, 3417, 852,
+ -829, 11121, -829, 689, -829, 4110, 774, -829, 8646, 779,
+ -829, 8762, 8762, 358, 8762, 8762, 800, 4605, 4605, 156,
+ 126, -829, -829, -829, 8530, 3705, 679, 11318, -829, 271,
+ -829, -829, -829, 192, -829, 104, 852, 676, 674, 678,
+ 3417, 4461, -829, 766, -829, 472, -829, -829, -829, 684,
+ 686, 687, -829, 691, 766, 687, -829, -829, 622, 622,
+ 9554, -829, 694, 472, 695, 9554, -829, 698, 701, -829,
+ 835, 8762, 11209, -829, -829, 11318, 3003, 3271, 712, 408,
+ 432, 8762, 8762, -829, -829, -829, -829, -829, 8878, -829,
+ -829, -829, -829, -829, -829, -829, 840, 722, 4461, 3417,
+ -829, -829, 852, 852, 845, -829, 1650, 9666, 83, -829,
+ -829, 4605, -829, -829, 83, -829, 8762, -829, 855, 856,
+ -829, 11318, 193, 7718, -829, 733, -829, 1530, -829, 680,
+ 868, 753, -829, 1719, -829, 1907, -829, 1907, -829, 1907,
+ -829, -829, 769, 771, 837, 995, 768, -829, -829, 1282,
+ -829, 995, 1719, -829, 1907, -829, -829, 11228, 439, 11318,
+ 11318, -829, -829, -829, -829, 761, 896, -829, -829, -829,
+ 3417, 862, -829, 1028, 826, 859, 3417, -829, 3561, -829,
+ -829, 4605, -829, -829, -829, 1585, 1585, 547, -829, 22,
+ -829, -829, -829, -829, 687, 778, 687, 687, -829, -829,
+ -829, 10722, -829, 472, 768, -829, -829, 780, 792, 793,
+ -829, 799, 793, -829, -829, 913, 961, 10806, 7370, 10890,
+ 528, 690, 935, 812, 812, 1585, 823, 680, -829, -829,
+ 1907, -829, -829, -829, 824, 828, -829, 1719, -829, 1907,
+ -829, 1907, -829, 1907, -829, -829, -829, 736, 813, 834,
+ 357, 579, -829, -829, -829, 1585, 812, 1585, -829, 687,
+ 793, 842, 793, 793, 192, 812, -829, -829, 1907, -829,
+ -829, -829, 793, -829
+};
+
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int16 yydefact[] =
+{
+ 2, 0, 0, 1, 0, 0, 0, 0, 276, 0,
+ 0, 300, 303, 0, 0, 580, 324, 325, 326, 327,
+ 288, 253, 400, 475, 474, 476, 477, 582, 0, 10,
+ 0, 479, 478, 480, 466, 275, 468, 467, 470, 469,
+ 462, 463, 424, 425, 481, 482, 274, 0, 0, 0,
+ 0, 278, 594, 594, 80, 295, 0, 0, 0, 0,
+ 0, 0, 439, 0, 0, 0, 3, 580, 6, 9,
+ 27, 32, 44, 52, 51, 0, 68, 0, 72, 82,
+ 0, 49, 232, 0, 53, 293, 267, 268, 422, 269,
+ 270, 271, 420, 419, 451, 421, 418, 473, 0, 272,
+ 273, 253, 5, 8, 324, 325, 288, 594, 400, 0,
+ 105, 106, 274, 0, 0, 0, 0, 108, 483, 328,
+ 0, 473, 273, 0, 316, 160, 170, 161, 157, 186,
+ 187, 188, 189, 168, 183, 176, 166, 165, 181, 164,
+ 163, 159, 184, 158, 171, 175, 177, 169, 162, 178,
+ 185, 180, 179, 172, 182, 167, 156, 174, 173, 155,
+ 153, 154, 150, 151, 152, 110, 112, 111, 145, 146,
+ 141, 123, 124, 125, 132, 129, 131, 126, 127, 147,
+ 148, 133, 134, 138, 142, 128, 130, 120, 121, 122,
+ 135, 136, 137, 139, 140, 143, 144, 149, 552, 318,
+ 113, 114, 551, 0, 0, 0, 50, 0, 0, 0,
+ 473, 0, 273, 0, 0, 0, 104, 0, 339, 338,
+ 0, 0, 473, 273, 179, 172, 182, 167, 150, 151,
+ 152, 110, 111, 0, 115, 117, 20, 116, 442, 447,
+ 446, 588, 591, 580, 590, 0, 444, 0, 592, 589,
+ 581, 564, 0, 0, 0, 0, 248, 260, 66, 252,
+ 594, 422, 594, 556, 67, 65, 594, 242, 289, 64,
+ 0, 241, 399, 63, 580, 0, 583, 18, 0, 0,
+ 209, 0, 210, 285, 0, 0, 0, 580, 15, 580,
+ 70, 14, 0, 580, 0, 585, 585, 233, 0, 0,
+ 585, 554, 0, 0, 78, 0, 88, 95, 522, 456,
+ 455, 457, 458, 0, 454, 453, 437, 431, 430, 433,
+ 0, 0, 428, 449, 0, 460, 0, 426, 0, 435,
+ 0, 464, 465, 48, 224, 225, 4, 581, 0, 0,
+ 0, 0, 0, 0, 0, 387, 389, 0, 84, 0,
+ 76, 73, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 577, 594, 576, 0, 579, 578, 0, 404, 402, 294,
+ 423, 0, 0, 393, 57, 292, 313, 105, 106, 107,
+ 464, 465, 484, 311, 0, 594, 0, 0, 0, 319,
+ 575, 574, 321, 0, 594, 285, 330, 0, 329, 0,
+ 0, 594, 0, 0, 0, 0, 0, 0, 285, 0,
+ 594, 0, 308, 0, 118, 0, 0, 443, 445, 0,
+ 0, 593, 558, 0, 261, 563, 255, 0, 258, 249,
+ 0, 257, 0, 250, 0, 580, 0, 580, 594, 594,
+ 243, 254, 580, 0, 291, 47, 0, 0, 0, 0,
+ 0, 0, 17, 580, 283, 13, 581, 69, 279, 282,
+ 286, 587, 234, 586, 587, 236, 287, 555, 94, 86,
+ 0, 81, 0, 0, 594, 0, 529, 525, 524, 523,
+ 526, 527, 498, 531, 543, 499, 547, 546, 542, 522,
+ 296, 491, 496, 594, 501, 594, 521, 384, 528, 530,
+ 533, 507, 0, 540, 507, 545, 507, 0, 505, 459,
+ 0, 0, 434, 440, 438, 429, 450, 461, 427, 436,
+ 0, 0, 7, 21, 22, 23, 24, 25, 45, 46,
+ 594, 0, 28, 30, 0, 31, 580, 0, 74, 85,
+ 43, 33, 41, 0, 237, 190, 29, 0, 273, 206,
+ 214, 219, 220, 221, 216, 218, 228, 229, 222, 223,
+ 199, 200, 226, 227, 582, 215, 217, 211, 212, 213,
+ 201, 202, 203, 204, 205, 567, 572, 568, 573, 398,
+ 253, 396, 0, 567, 569, 568, 570, 397, 594, 567,
+ 568, 253, 594, 594, 34, 237, 191, 40, 198, 55,
+ 58, 0, 0, 0, 105, 106, 109, 0, 0, 594,
+ 0, 580, 522, 0, 277, 594, 594, 410, 594, 331,
+ 571, 284, 0, 567, 568, 594, 333, 301, 332, 304,
+ 571, 284, 0, 567, 568, 0, 0, 0, 0, 260,
+ 0, 307, 559, 561, 560, 0, 0, 262, 256, 594,
+ 562, 557, 240, 239, 244, 245, 247, 290, 584, 19,
+ 0, 26, 197, 71, 16, 580, 585, 87, 79, 91,
+ 93, 0, 90, 92, 489, 535, 0, 582, 0, 490,
+ 0, 503, 550, 500, 0, 504, 0, 514, 536, 0,
+ 517, 544, 0, 519, 548, 452, 0, 441, 207, 208,
+ 375, 373, 0, 372, 371, 266, 0, 83, 77, 0,
+ 0, 0, 0, 0, 594, 0, 0, 0, 0, 395,
+ 61, 401, 0, 0, 394, 59, 390, 54, 0, 0,
+ 594, 314, 0, 0, 401, 317, 553, 522, 0, 0,
+ 322, 411, 412, 594, 413, 0, 594, 336, 0, 0,
+ 334, 0, 0, 401, 0, 0, 0, 0, 0, 401,
+ 0, 119, 448, 306, 0, 0, 259, 263, 251, 594,
+ 11, 280, 235, 89, 529, 347, 580, 340, 0, 377,
+ 0, 0, 297, 0, 497, 594, 549, 506, 534, 507,
+ 507, 507, 541, 507, 529, 507, 432, 370, 582, 582,
+ 493, 494, 594, 594, 355, 0, 538, 355, 355, 353,
+ 0, 0, 264, 75, 42, 238, 567, 568, 0, 567,
+ 568, 0, 0, 39, 195, 38, 196, 62, 0, 36,
+ 193, 37, 194, 60, 391, 392, 0, 0, 0, 0,
+ 485, 312, 580, 580, 0, 488, 522, 0, 0, 415,
+ 337, 0, 12, 417, 0, 298, 0, 299, 0, 0,
+ 309, 262, 594, 246, 348, 345, 532, 0, 383, 0,
+ 0, 0, 502, 0, 510, 0, 512, 0, 518, 0,
+ 515, 520, 0, 0, 0, 492, 0, 351, 352, 355,
+ 363, 537, 0, 366, 0, 368, 388, 265, 401, 231,
+ 230, 35, 192, 405, 403, 0, 0, 487, 486, 320,
+ 0, 0, 414, 0, 96, 103, 0, 416, 0, 302,
+ 305, 0, 407, 408, 406, 0, 0, 343, 381, 582,
+ 379, 382, 386, 385, 507, 507, 507, 507, 376, 374,
+ 285, 0, 495, 594, 0, 354, 361, 355, 355, 355,
+ 539, 355, 355, 56, 315, 0, 102, 0, 594, 0,
+ 594, 594, 0, 349, 346, 0, 341, 0, 378, 511,
+ 0, 508, 513, 516, 571, 284, 350, 0, 358, 0,
+ 360, 0, 367, 0, 364, 369, 323, 99, 101, 0,
+ 567, 568, 409, 335, 310, 0, 344, 0, 380, 507,
+ 355, 355, 355, 355, 97, 342, 509, 359, 0, 356,
+ 362, 365, 355, 357
+};
+
+ /* YYPGOTO[NTERM-NUM]. */
+static const yytype_int16 yypgoto[] =
+{
+ -829, -829, -829, 510, -829, 32, -829, -214, 182, -829,
+ 28, -829, -155, -302, 867, 1, -16, -829, -536, -829,
+ 131, 971, -170, 4, -69, -266, -431, -15, 1295, -48,
+ 981, 19, 5, -829, -829, 24, -829, 653, -829, 413,
+ 75, -58, -352, 54, 13, -829, -390, -235, -11, 39,
+ -303, 89, -829, -829, -829, -829, -829, -829, -829, -829,
+ -829, -829, -829, -829, -829, -829, -829, -829, -829, -829,
+ -829, -829, 8, -206, -382, 7, -568, -829, -829, -829,
+ 272, 538, -829, -512, -829, -829, -78, -829, 2, -829,
+ -829, 255, -829, -829, -829, -65, -829, -829, -430, -829,
+ 14, -829, -829, -829, -829, -829, 154, 58, -196, -829,
+ -829, -829, -829, -377, -257, -829, 787, -829, -829, -829,
+ -6, -829, -829, -829, 1461, 1552, 1026, 1065, -829, -829,
+ 173, 314, 343, 141, -829, -829, -829, 524, -306, 246,
+ -307, -801, -716, -519, -829, 474, -664, -627, -828, 142,
+ 346, -829, 236, -829, 517, -439, -829, -829, -829, 92,
+ 785, -411, 505, -339, -829, -829, -80, -829, 26, -22,
+ -152, -254, 788, -12, -33, -2
+};
+
+ /* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int16 yydefgoto[] =
+{
+ -1, 1, 2, 66, 67, 68, 278, 413, 414, 287,
+ 288, 466, 70, 561, 71, 207, 72, 73, 620, 750,
+ 74, 75, 289, 76, 77, 78, 491, 79, 208, 117,
+ 118, 234, 235, 236, 656, 598, 201, 81, 294, 565,
+ 599, 268, 456, 457, 269, 270, 259, 449, 484, 458,
+ 555, 82, 204, 292, 685, 293, 308, 698, 214, 777,
+ 215, 778, 655, 941, 623, 621, 859, 407, 409, 632,
+ 633, 866, 281, 417, 647, 769, 770, 221, 796, 945,
+ 965, 910, 818, 722, 723, 819, 798, 949, 950, 510,
+ 802, 346, 550, 84, 85, 395, 613, 612, 440, 944,
+ 636, 763, 868, 872, 86, 87, 88, 321, 322, 531,
+ 89, 90, 91, 532, 244, 245, 246, 435, 92, 93,
+ 94, 315, 95, 96, 210, 211, 99, 212, 403, 622,
+ 758, 511, 512, 821, 822, 513, 514, 515, 807, 707,
+ 759, 518, 519, 520, 696, 521, 522, 523, 826, 827,
+ 524, 525, 526, 527, 528, 701, 203, 408, 299, 459,
+ 443, 263, 123, 627, 601, 412, 406, 386, 463, 799,
+ 464, 482, 248, 249, 250, 291
+};
+
+ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int16 yytable[] =
+{
+ 102, 517, 516, 383, 385, 275, 658, 425, 237, 351,
+ 83, 213, 83, 120, 120, 276, 243, 209, 209, 271,
+ 389, 220, 237, 209, 209, 209, 199, 453, 209, 602,
+ 69, 200, 69, 277, 337, 273, 103, 490, 200, 304,
+ 600, 247, 485, 671, 608, 649, 487, 611, 333, 566,
+ 297, 301, 200, 628, 290, 260, 260, 825, 83, 260,
+ 668, 688, 305, 533, 668, 662, 399, 629, 766, 642,
+ 258, 264, 209, 671, 265, 314, 705, 776, 652, 885,
+ 200, 600, 812, 608, 970, 387, 305, 694, 951, 614,
+ 617, 295, 629, 336, 119, 119, 267, 272, -564, 416,
+ 748, 749, 119, 274, -99, 271, 800, 242, 262, 262,
+ 384, -472, 262, -101, 394, 473, 324, 326, 328, 330,
+ -96, 209, -475, 83, 380, 535, 728, 841, 535, 422,
+ 535, 629, 535, -474, 535, -103, -476, 477, -102, -104,
+ 431, 479, 691, 119, 296, 300, -98, 256, 256, 695,
+ 397, 256, -471, 646, 398, 794, 629, 497, 498, 499,
+ 500, -466, 987, 387, 3, -100, 382, 119, 242, 970,
+ 261, 261, 279, 501, 261, -466, 393, 424, -475, 556,
+ -96, -97, 267, 272, 283, 533, 951, 808, 801, -474,
+ -477, 842, -476, 630, 345, 388, 238, 560, 393, 239,
+ 240, 470, 697, 516, 847, -103, 261, 261, -564, 853,
+ -466, 765, 83, 439, -564, 426, 427, -466, -401, -91,
+ 348, -567, 209, 209, 453, 495, 490, 241, -93, 242,
+ -568, 986, 286, 720, 489, -88, 560, 560, 858, 238,
+ 471, 390, 239, 240, 884, 825, -477, 353, 825, 450,
+ -95, 454, 314, -94, 476, -69, 391, 200, 451, -479,
+ 451, -90, 483, 483, 460, 671, 812, 483, -102, 436,
+ 241, 392, 242, 388, 209, 717, -83, 721, 209, 266,
+ -92, -401, 209, 209, 481, 668, 668, 83, 786, 290,
+ 347, 490, 83, 83, -471, -401, -89, 286, 833, -103,
+ 83, 266, 506, 672, 376, 377, 378, -478, -480, 260,
+ 677, 305, 472, 475, 942, -479, -466, 352, -470, 274,
+ 478, 683, -96, 402, 461, 415, 516, 507, -401, 410,
+ -401, 552, 762, 825, 535, 558, 562, -401, 423, 543,
+ 544, 545, 546, -88, 419, 83, 209, 209, 209, 209,
+ 83, 209, 209, 290, 432, 209, 626, 83, 305, 774,
+ 567, 428, 262, -478, -480, 69, 892, 775, 808, 542,
+ 547, 530, -466, -98, -470, 562, 562, 437, 808, 460,
+ 239, 240, 838, 907, 908, 411, 554, -98, -328, 209,
+ 808, 554, 119, 434, 600, -100, 608, 256, 880, 567,
+ 567, 256, -328, 460, 727, 717, 439, 606, 533, 753,
+ 606, 448, 637, 209, 42, 83, 209, 43, 442, 460,
+ 261, 687, 467, 489, 261, 83, 665, 353, 460, 209,
+ 606, 392, 792, 83, 788, 843, 276, -328, 209, 119,
+ 849, 851, -68, 83, -328, 474, 606, 675, 676, 876,
+ 863, 516, 943, 486, 785, 606, 451, 451, 607, -103,
+ 237, 468, 60, 490, 480, 102, 416, 286, 331, 332,
+ -98, 679, 671, -98, -98, 83, 488, -97, 660, 756,
+ -95, 607, 808, 674, 83, 343, 344, 735, 489, 471,
+ 200, 379, 460, 668, 606, 69, 808, 607, 305, 742,
+ 305, -98, 209, -98, 684, 380, 607, 101, 830, 101,
+ 492, 702, 256, 702, 101, 101, 540, -102, 541, 606,
+ 101, 101, 101, 743, 996, 101, 619, -98, 742, 717,
+ 848, 286, 559, 791, 856, 261, 256, 634, -94, 83,
+ 381, 635, 669, 726, 864, 607, 921, 382, 724, 639,
+ 744, -100, 256, 746, 788, 101, -98, 661, -97, 261,
+ 516, 256, 736, 238, 529, 305, 239, 240, 673, 101,
+ 607, 744, 276, 686, 678, 261, 560, -90, -565, 119,
+ 681, 119, 560, 404, 261, -83, 890, 560, 560, -582,
+ 448, 700, -582, -582, 241, -100, 242, 380, 794, 638,
+ 497, 498, 499, 500, 261, 703, 271, 645, 261, 271,
+ 724, 724, 704, 740, 730, 420, 501, 657, 101, 706,
+ 101, 745, 242, 752, 747, 256, 1009, 271, -274, 380,
+ 209, 83, 405, 764, 767, 261, 767, 709, 261, 382,
+ 629, -470, -274, 767, 886, 926, 119, 711, 261, 784,
+ 237, 712, 760, 483, 743, -470, 780, 200, 454, 714,
+ 489, 781, 936, 209, 421, 400, 401, 451, 938, 257,
+ 257, 382, 729, 257, 554, 739, 316, -274, 317, 318,
+ 200, 854, -100, 267, -274, 276, 267, 985, -565, 741,
+ -470, 731, -100, 560, -565, -100, -100, -470, 429, 754,
+ 280, 282, 739, -92, 267, 257, 298, 768, 765, 101,
+ 927, 928, 380, 716, 755, 562, 975, 334, 335, 101,
+ 101, 562, 845, -100, 765, -100, 562, 562, 319, 320,
+ 83, 948, 460, 497, 498, 499, 500, 305, 83, 567,
+ 902, 903, 209, 353, 773, 567, 209, 430, 724, 501,
+ 567, 567, 779, 782, 382, 783, 83, 83, 834, 606,
+ 790, 869, -571, 848, 873, 793, 83, 789, 242, 874,
+ 710, 101, 713, 83, 816, 101, 209, 861, 883, 101,
+ 101, 867, 343, 344, 101, 83, 83, 451, 871, 101,
+ 101, -97, 238, 83, 875, 239, 240, 101, 374, 375,
+ 376, 377, 378, 702, 616, 618, 276, 276, 83, 83,
+ 607, 534, -89, 317, 318, 877, 887, 888, 119, 803,
+ 702, 702, 889, 694, 893, -571, 895, 897, 905, 261,
+ 261, 899, 562, 911, 906, 909, 616, 618, 912, -571,
+ 502, 914, 101, 101, 101, 101, 101, 101, 101, 101,
+ 916, 918, 101, 979, 101, 923, 567, 101, 238, 924,
+ 929, 239, 240, 319, 320, 256, 83, 83, 505, 506,
+ 939, 940, -571, 946, -571, 933, 206, 206, -567, 83,
+ 767, -571, 206, 952, 682, 469, 101, 493, 261, 241,
+ 953, 242, 960, 958, 507, 959, 101, 101, 973, 380,
+ 329, 380, -284, 317, 318, 444, 445, 446, 334, 119,
+ 101, 974, 101, 101, 119, -473, -284, 976, 990, 257,
+ 997, 539, 101, 257, 317, 318, 101, 988, 1006, -473,
+ 101, 857, 999, 1001, 421, 101, 494, 276, 83, 1003,
+ 101, 382, 810, 382, 83, 813, 83, 870, -273, 83,
+ 1014, -284, 1015, 319, 320, -568, 119, 828, -284, 878,
+ 879, 702, -273, 1017, -473, 238, -567, 882, 239, 240,
+ -568, -473, 101, 1024, 319, 320, 460, 680, 637, 767,
+ 396, 101, 1028, 891, 218, -567, 209, 124, 1013, 1018,
+ 323, 317, 318, 817, 1012, 418, 241, -273, 242, 101,
+ 553, 418, 855, 606, -273, 564, 569, 570, 571, 572,
+ 573, 574, 575, 576, 577, 578, 579, 580, 581, 582,
+ 583, 584, 585, 586, 587, 588, 589, 590, 591, 592,
+ 593, 594, 438, 202, 257, 820, 101, 261, 441, 930,
+ 925, 319, 320, 804, 615, 615, 452, 962, -567, -568,
+ -285, 967, 809, 937, 607, 894, 896, 898, 257, 900,
+ 0, 901, -567, 0, -285, 733, 0, 100, 0, 100,
+ 122, 122, 615, 0, 257, 0, 615, 615, 223, 380,
+ 0, 206, 206, 257, 961, 0, 0, 325, 317, 318,
+ 0, 0, 659, 0, 0, -567, 663, -567, 380, -285,
+ 664, -567, 0, 667, -567, 670, -285, 298, 0, 256,
+ 0, 0, -568, 0, 734, 100, 0, 977, 980, 307,
+ 981, 382, 0, 982, 615, 441, -568, 101, 101, 955,
+ 0, 380, 261, 405, 667, 0, 0, 298, 319, 320,
+ 382, 462, 465, 307, 0, 968, 0, 257, 971, 0,
+ 844, 846, 0, 0, 0, 850, 852, 0, 0, -568,
+ 101, -568, 0, 0, 699, -568, 978, 0, -568, 0,
+ 797, 0, 0, 382, 794, 708, 497, 498, 499, 500,
+ 100, 0, 0, 811, 844, 846, 815, 850, 852, 327,
+ 317, 318, 501, 718, 719, 824, 0, 0, 0, 0,
+ 989, 991, 992, 993, 725, 206, 206, 206, 206, 0,
+ 548, 549, 0, 0, 648, 648, 503, 806, 0, 0,
+ 820, 806, 795, 820, 805, 0, 820, 101, 820, 529,
+ 317, 318, 0, 1021, 0, 101, 101, 0, 829, 101,
+ 319, 320, 101, 101, 0, 823, 0, 101, 101, 536,
+ 317, 318, 0, 101, 101, 0, 0, 0, 537, 317,
+ 318, 922, 0, 101, 441, 1026, 0, 0, 0, 100,
+ 101, 441, 0, 101, 0, 631, 0, 0, 820, 0,
+ 319, 320, 101, 101, 0, 0, 0, 0, 761, 922,
+ 101, 338, 339, 340, 341, 342, 0, 80, 0, 80,
+ 319, 320, 0, 0, 0, 101, 101, 0, 219, 319,
+ 320, 820, 0, 820, 0, 820, 0, 820, 0, 787,
+ 538, 317, 318, 0, 0, 0, 0, 0, 667, 298,
+ 0, 0, 0, 496, 0, 497, 498, 499, 500, 0,
+ 0, 0, 820, 0, 100, 80, 715, 317, 318, 100,
+ 100, 501, 0, 101, 502, 0, 0, 100, 0, 0,
+ 0, 0, 0, 101, 101, 913, 915, 954, 307, 956,
+ 0, 319, 320, 957, 0, 503, 101, 0, 0, 832,
+ 0, 504, 505, 506, 615, 835, 969, 257, 972, 0,
+ 615, 615, 0, 0, 0, 615, 615, 319, 320, 0,
+ 0, 0, 100, 0, 0, 0, 0, 100, 507, 751,
+ 80, 508, 0, 0, 100, 307, 0, 568, 0, 983,
+ 984, 0, 964, 806, 615, 615, 829, 615, 615, 829,
+ 963, 829, 0, 823, 0, 101, 823, 881, 823, 0,
+ 0, 101, 0, 101, 0, 0, 101, 966, 418, 0,
+ 0, 0, 0, 0, 0, 0, 568, 568, 0, 1016,
+ 0, 0, 0, 97, 1019, 97, 121, 121, 121, 0,
+ 0, 1020, 100, 1022, 222, 0, 0, 1023, 0, 0,
+ 0, 829, 100, 101, 917, 0, 0, 0, 823, 206,
+ 100, 1025, 0, 0, 919, 920, 0, 0, 0, 80,
+ 100, 615, 1032, 0, 0, 998, 1000, 1002, 0, 1004,
+ 1005, 97, 0, 0, 829, 306, 829, 0, 829, 0,
+ 829, 823, 206, 823, 0, 823, 0, 823, 0, 615,
+ 0, 0, 100, 0, 353, 0, 298, 0, 0, 306,
+ 860, 100, 0, 0, 0, 829, 0, 865, 0, 366,
+ 367, 353, 823, 0, 98, 307, 98, 307, 1027, 1029,
+ 1030, 1031, 353, 0, 0, 0, 366, 367, 648, 0,
+ 1033, 0, 0, 0, 80, 0, 97, 366, 367, 80,
+ 80, 794, 0, 497, 498, 499, 500, 80, 373, 374,
+ 375, 376, 377, 378, -281, 0, 100, -281, -281, 501,
+ 0, 0, 98, 371, 372, 373, 374, 375, 376, 377,
+ 378, 0, 0, 0, 0, 0, 0, 374, 375, 376,
+ 377, 378, 307, 503, -281, -281, 0, -281, 0, 947,
+ 238, 257, 80, 239, 240, 206, 794, 80, 497, 498,
+ 499, 500, 0, 0, 80, 0, 0, 563, 496, 0,
+ 497, 498, 499, 500, 501, 0, 418, 448, 0, 0,
+ 0, 241, 418, 242, 0, 97, 501, 98, 0, 502,
+ 0, 0, 0, 0, 0, 0, 0, 0, 503, 0,
+ 0, 0, 0, 0, 0, 0, 563, 563, 100, 0,
+ 503, 0, 0, 0, 0, 0, 504, 505, 506, 0,
+ 0, 496, 80, 497, 498, 499, 500, 0, 0, 0,
+ 0, 0, 80, 0, 0, 0, 0, 0, 0, 501,
+ 80, 0, 502, 507, 0, 0, 508, 0, 0, 0,
+ 80, 0, 0, 0, 0, 0, 0, 0, 0, 509,
+ 97, 0, 0, 503, 0, 97, 97, 0, 0, 504,
+ 505, 506, 0, 97, 0, 0, 98, 0, 0, 0,
+ 0, 0, 80, 0, 306, 0, 0, 0, 0, 0,
+ 496, 80, 497, 498, 499, 500, 507, 0, 0, 508,
+ 0, 0, 0, 0, 0, 0, 0, 100, 501, 0,
+ 0, 502, 757, 0, 307, 100, 568, 0, 97, 0,
+ 0, 0, 568, 97, 0, 0, 0, 568, 568, 0,
+ 97, 306, 503, 100, 100, 0, 0, 0, 504, 505,
+ 506, 0, 0, 100, 0, 0, 80, 0, 0, 0,
+ 100, 98, 0, 0, 0, 0, 98, 98, 0, 0,
+ 0, 0, 100, 100, 98, 507, 0, 0, 508, 0,
+ 100, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 100, 100, 0, 97, 0,
+ 0, 0, 0, 0, 0, 0, 0, 496, 97, 497,
+ 498, 499, 500, 0, 0, 122, 97, 0, 0, 98,
+ 122, 0, 0, 0, 98, 501, 97, 0, 502, 0,
+ 0, 98, 0, 0, 98, 0, 0, 0, 0, 0,
+ 862, 0, 0, 568, 0, 0, 0, 0, 80, 503,
+ 0, 0, 0, 100, 100, 504, 505, 506, 97, 0,
+ 0, 0, 935, 0, 0, 0, 100, 97, 0, 0,
+ 0, 0, 0, 98, 98, 0, 0, 0, 0, 0,
+ 0, 306, 507, 306, 0, 508, 0, 0, 814, 98,
+ 497, 498, 499, 500, 0, 0, 0, 0, 0, 98,
+ 0, 0, 0, 0, 0, 0, 501, 98, 0, 502,
+ 0, 0, 0, 0, 0, 0, 0, 98, 0, 0,
+ 0, 0, 97, 0, 0, 100, 0, 0, 0, 0,
+ 503, 100, 0, 100, 0, 0, 100, 505, 506, 0,
+ 0, 0, 0, 0, 0, 0, 0, 80, 306, 98,
+ 0, 0, 0, 0, 0, 80, 563, 0, 98, 0,
+ 0, 0, 563, 507, 0, 0, 0, 563, 563, 0,
+ 0, 0, 0, 80, 80, 0, 0, 0, 0, 0,
+ 0, 0, 0, 80, 0, 0, 0, 0, 0, 0,
+ 80, -594, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 80, 80, -594, -594, -594, -594, -594, -594,
+ 80, -594, 0, 98, 97, 0, 0, -594, -594, 0,
+ 0, 0, 0, 0, 0, 80, 80, 0, -594, -594,
+ 0, -594, -594, -594, -594, -594, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 563, 0, 0, 0, 0, 0, 0,
+ -594, 0, 0, 80, 80, 0, 0, 0, 0, 0,
+ 0, 0, 932, 0, -594, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, -594, 98, 0, -594, -594, 0,
+ 0, 0, 0, 97, 0, 0, 0, 0, 0, 0,
+ 306, 97, 0, 0, 0, 0, 0, -594, -594, 0,
+ 0, 0, 0, 266, -594, -594, -594, -594, 0, 97,
+ 97, 0, 0, 0, 0, 0, 0, 0, 0, 97,
+ 0, 0, 0, 0, 0, 80, 97, 0, 0, 0,
+ 0, 80, 0, 80, 0, 0, 80, 0, 97, 97,
+ 0, 0, 0, 0, 0, 0, 97, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 97, 97, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 98, 0, 0, 0, 0, 0,
+ 0, 121, 98, 98, 0, 0, 121, 0, 0, 98,
+ 0, 0, 0, 0, 98, 98, 0, 0, 0, 0,
+ 98, 98, 0, 0, 0, 0, 0, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 0, 98, 0, 97,
+ 97, 0, 0, 0, 0, 0, 0, 0, 934, 98,
+ 98, 0, 97, 0, 0, 0, 0, 98, 0, 0,
+ 0, 0, 0, 0, 0, 0, 732, 0, 0, 0,
+ 0, 0, 98, 98, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 353, 354, 355, 356, 357, 358,
+ 359, 360, 361, 362, 363, 364, 365, 0, 0, 366,
+ 367, 97, 0, 0, 0, 0, 0, 97, 0, 97,
+ 98, 0, 97, 353, -595, -595, -595, -595, 358, 359,
+ 98, 98, -595, -595, 0, 0, 0, 0, 366, 367,
+ 0, 0, 368, 98, 369, 370, 371, 372, 373, 374,
+ 375, 376, 377, 378, 0, 0, 0, 0, 0, 0,
+ 0, 0, -260, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 369, 370, 371, 372, 373, 374, 375,
+ 376, 377, 378, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 98, 0, 0, 0, 0, 0, 98, 0,
+ 98, -594, 4, 98, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 0, 0, 0, 0, 0, 0,
+ 15, 0, 16, 17, 18, 19, 0, 0, 0, 0,
+ 0, 20, 21, 22, 23, 24, 25, 26, 0, 0,
+ 27, 0, 0, 0, 0, 0, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 0, 40,
+ 41, 42, 0, 0, 43, 0, 0, 44, 45, 0,
+ 46, 47, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 49, 0, 0, 50, 51, 0, 52, 53, 0,
+ 54, 0, 0, 55, 0, 56, 57, 58, 59, 60,
+ 61, -466, 0, 62, -594, 0, 0, -594, -594, 0,
+ 0, 0, 0, 0, -466, -466, -466, -466, -466, -466,
+ 0, -466, 0, 63, 64, 65, 0, 0, -466, -466,
+ 0, 0, 0, 0, 0, -594, 0, -594, -466, -466,
+ 0, -466, -466, -466, -466, -466, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 442, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -466, -466, -466, -466, -466, -466, -466,
+ -466, -466, -466, -466, -466, -466, 0, 0, -466, -466,
+ -466, 0, -466, -466, 0, 0, 0, 0, 0, -466,
+ 0, 0, 0, 0, -466, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -466, 0, 0, -466, -466, 0,
+ -466, -466, 0, -466, -466, -466, -466, -466, -466, -466,
+ -466, -466, -466, 0, 0, -594, 0, 0, -466, -466,
+ -466, -466, 0, 0, -466, -466, -466, -466, -594, -594,
+ -594, -594, -594, -594, 0, -594, 0, 0, 0, 0,
+ 0, 0, -594, -594, 0, 0, 0, 0, 0, 0,
+ 0, 0, -594, -594, 0, -594, -594, -594, -594, -594,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -594, -594, -594,
+ -594, -594, -594, -594, -594, -594, -594, -594, -594, -594,
+ 0, 0, -594, -594, -594, 0, 0, -594, 0, 0,
+ 0, 0, 0, -594, 0, 0, 0, 0, -594, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -594, 0,
+ 0, -594, -594, 0, 0, -594, 0, -594, -594, -594,
+ -594, -594, -594, -594, -594, -594, -594, 0, 0, -571,
+ 0, 0, -594, -594, -594, -594, 0, 266, -594, -594,
+ -594, -594, -571, -571, -571, 0, -571, -571, 0, -571,
+ 0, 0, 0, 0, 0, -571, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -571, -571, 0, -571,
+ -571, -571, -571, -571, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -571, -571, -571, -571, -571, -571, -571, -571, -571,
+ -571, -571, -571, -571, 0, 0, -571, -571, -571, 0,
+ 737, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -571, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -571, 0, 0, -571, -571, 0, -99, -571,
+ 0, -571, -571, -571, -571, -571, -571, -571, -571, -571,
+ -571, 0, 0, -571, 0, -571, -571, -571, 0, -91,
+ 0, 0, -571, -571, -571, -571, -571, -571, -571, 0,
+ -571, -571, 0, -571, 0, 0, 0, 0, 0, -571,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -571, -571, 0, -571, -571, -571, -571, -571, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -571, -571, -571, -571, -571,
+ -571, -571, -571, -571, -571, -571, -571, -571, 0, 0,
+ -571, -571, -571, 0, 737, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -571, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -571, 0, 0, -571,
+ -571, 0, -99, -571, 0, -571, -571, -571, -571, -571,
+ -571, -571, -571, -571, -571, 0, 0, -284, 0, -571,
+ -571, -571, 0, -571, 0, 0, -571, -571, -571, -571,
+ -284, -284, -284, 0, -284, -284, 0, -284, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -284, -284, 0, -284, -284, -284,
+ -284, -284, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, 0, 0, -284, -284, -284, 0, 738, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -284, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -284, 0, 0, -284, -284, 0, -101, -284, 0, -284,
+ -284, -284, -284, -284, -284, -284, -284, -284, -284, 0,
+ 0, -284, 0, 0, -284, -284, 0, -93, 0, 0,
+ -284, -284, -284, -284, -284, -284, -284, 0, -284, -284,
+ 0, -284, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -284, -284,
+ 0, -284, -284, -284, -284, -284, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, -284, -284, -284, 0, 0, -284, -284,
+ -284, 0, 738, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -284, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -284, 0, 0, -284, -284, 0,
+ -101, -284, 0, -284, -284, -284, -284, -284, -284, -284,
+ -284, -284, -284, 0, 0, 0, 0, 0, -284, -284,
+ 0, -284, 0, 0, -284, -284, -284, -284, 284, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ -594, -594, -594, 0, 0, -594, 15, 0, 16, 17,
+ 18, 19, 0, 0, 0, 0, 0, 20, 21, 22,
+ 23, 24, 25, 26, 0, 0, 27, 0, 0, 0,
+ 0, 0, 28, 0, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 0, 40, 41, 42, 0, 0,
+ 43, 0, 0, 44, 45, 0, 46, 47, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 49, 0, 0,
+ 50, 51, 0, 52, 53, 0, 54, 0, 0, 55,
+ 0, 56, 57, 58, 59, 60, 61, 0, 0, 62,
+ -594, 0, 0, -594, -594, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 64, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -594, 284, -594, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 0, 0, -594, 0, -594, -594,
+ 15, 0, 16, 17, 18, 19, 0, 0, 0, 0,
+ 0, 20, 21, 22, 23, 24, 25, 26, 0, 0,
+ 27, 0, 0, 0, 0, 0, 28, 0, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 0, 40,
+ 41, 42, 0, 0, 43, 0, 0, 44, 45, 0,
+ 46, 47, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 49, 0, 0, 50, 51, 0, 52, 53, 0,
+ 54, 0, 0, 55, 0, 56, 57, 58, 59, 60,
+ 61, 0, 0, 62, -594, 0, 0, -594, -594, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 64, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -594, 284, -594, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 0, 0,
+ -594, 0, 0, -594, 15, -594, 16, 17, 18, 19,
+ 0, 0, 0, 0, 0, 20, 21, 22, 23, 24,
+ 25, 26, 0, 0, 27, 0, 0, 0, 0, 0,
+ 28, 0, 30, 31, 32, 33, 34, 35, 36, 37,
+ 38, 39, 0, 40, 41, 42, 0, 0, 43, 0,
+ 0, 44, 45, 0, 46, 47, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 49, 0, 0, 50, 51,
+ 0, 52, 53, 0, 54, 0, 0, 55, 0, 56,
+ 57, 58, 59, 60, 61, 0, 0, 62, -594, 0,
+ 0, -594, -594, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 63, 64, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, -594,
+ 284, -594, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 0, 0, -594, 0, 0, -594, 15, 0,
+ 16, 17, 18, 19, 0, 0, 0, 0, 0, 20,
+ 21, 22, 23, 24, 25, 26, 0, 0, 27, 0,
+ 0, 0, 0, 0, 28, 0, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 0, 40, 41, 42,
+ 0, 0, 43, 0, 0, 44, 45, 0, 46, 47,
+ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,
+ 0, 0, 50, 51, 0, 52, 53, 0, 54, 0,
+ 0, 55, 0, 56, 57, 58, 59, 60, 61, 0,
+ 0, 62, -594, 0, 0, -594, -594, 4, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
+ 0, 63, 64, 65, 0, 15, 0, 16, 17, 18,
+ 19, 0, 0, -594, 0, -594, 20, 21, 22, 23,
+ 24, 25, 26, 0, 0, 27, 0, 0, 0, 0,
+ 0, 28, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
+ 0, 0, 44, 45, 0, 46, 47, 48, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 49, 0, 0, 50,
+ 51, 0, 52, 53, 0, 54, 0, 0, 55, 0,
+ 56, 57, 58, 59, 60, 61, 0, 0, 62, -594,
+ 0, 0, -594, -594, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 64,
+ 65, 0, 0, -594, 0, 0, 0, 0, 0, 0,
+ -594, 284, -594, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 0, -594, -594, 0, 0, 0, 15,
+ 0, 16, 17, 18, 19, 0, 0, 0, 0, 0,
+ 20, 21, 22, 23, 24, 25, 26, 0, 0, 27,
+ 0, 0, 0, 0, 0, 28, 0, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 0, 40, 41,
+ 42, 0, 0, 43, 0, 0, 44, 45, 0, 46,
+ 47, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 49, 0, 0, 50, 51, 0, 52, 53, 0, 54,
+ 0, 0, 55, 0, 56, 57, 58, 59, 60, 61,
+ 0, 0, 62, -594, 0, 0, -594, -594, 284, 0,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 0, 0, 63, 64, 65, 0, 15, 0, 16, 17,
+ 18, 19, 0, 0, -594, 0, -594, 20, 21, 22,
+ 23, 24, 25, 26, 0, 0, 27, 0, 0, 0,
+ 0, 0, 28, 0, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 0, 40, 41, 42, 0, 0,
+ 43, 0, 0, 44, 45, 0, 46, 47, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 49, 0, 0,
+ 285, 51, 0, 52, 53, 0, 54, 0, 0, 55,
+ 0, 56, 57, 58, 59, 60, 61, 0, 0, 62,
+ -594, 0, 0, -594, -594, 284, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 0, 0, 63,
+ 64, 65, 0, 15, 0, 16, 17, 18, 19, 0,
+ -594, -594, 0, -594, 20, 21, 22, 23, 24, 25,
+ 26, 0, 0, 27, 0, 0, 0, 0, 0, 28,
+ 0, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
+ 44, 45, 0, 46, 47, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 49, 0, 0, 50, 51, 0,
+ 52, 53, 0, 54, 0, 0, 55, 0, 56, 57,
+ 58, 59, 60, 61, 0, 0, 62, -594, 0, 0,
+ -594, -594, 284, 0, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 0, 0, 63, 64, 65, 0,
+ 15, 0, 16, 17, 18, 19, 0, -594, -594, 0,
+ -594, 20, 21, 22, 23, 24, 25, 26, 0, 0,
+ 27, 0, 0, 0, 0, 0, 28, 0, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 0, 40,
+ 41, 42, 0, 0, 43, 0, 0, 44, 45, 0,
+ 46, 47, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 49, 0, 0, 50, 51, 0, 52, 53, 0,
+ 54, 0, 0, 55, 0, 56, 57, 58, 59, 60,
+ 61, 0, 0, 62, -594, 0, 0, -594, -594, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 64, 65, 0, 0, -594, 0,
+ 0, 0, 0, 0, 0, -594, 284, -594, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 0, 0,
+ -594, 0, 0, 0, 15, 0, 16, 17, 18, 19,
+ 0, 0, 0, 0, 0, 20, 21, 22, 23, 24,
+ 25, 26, 0, 0, 27, 0, 0, 0, 0, 0,
+ 28, 0, 30, 31, 32, 33, 34, 35, 36, 37,
+ 38, 39, 0, 40, 41, 42, 0, 0, 43, 0,
+ 0, 44, 45, 0, 46, 47, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 49, 0, 0, 50, 51,
+ 0, 52, 53, 0, 54, 0, 0, 55, 0, 56,
+ 57, 58, 59, 60, 61, 0, 0, 62, -594, 0,
+ 0, -594, -594, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 0, 0, 63, 64, 65,
+ 0, 15, 0, 16, 17, 18, 19, 0, 0, -594,
+ 0, -594, 20, 21, 22, 23, 24, 25, 26, 0,
+ 0, 27, 0, 0, 0, 0, 0, 28, 29, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 0,
+ 40, 41, 42, 0, 0, 43, 0, 0, 44, 45,
+ 0, 46, 47, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 49, 0, 0, 50, 51, 0, 52, 53,
+ 0, 54, 0, 0, 55, 0, 56, 57, 58, 59,
+ 60, 61, 0, 0, 62, 238, 0, 0, 239, 240,
+ 0, 0, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 0, 0, 63, 64, 65, 0, 15, 0,
+ 16, 17, 18, 19, 0, 0, 241, 0, 242, 20,
+ 21, 22, 23, 24, 25, 26, 0, 0, 27, 0,
+ 0, 0, 0, 0, 28, 0, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 0, 40, 41, 42,
+ 0, 0, 43, 0, 0, 44, 45, 0, 46, 47,
+ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,
+ 0, 0, 50, 51, 0, 52, 53, 0, 54, 0,
+ 0, 55, 0, 56, 57, 58, 59, 60, 61, 0,
+ 0, 62, 238, 0, 0, 239, 240, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 63, 64, 65, 0, 15, 0, 16, 17, 18,
+ 19, 0, 0, 241, 0, 242, 20, 21, 22, 23,
+ 24, 25, 26, 0, 0, 27, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
+ 0, 0, 44, 45, 0, 46, 47, 48, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 205, 0, 0, 115,
+ 51, 0, 52, 53, 0, 0, 0, 0, 55, 0,
+ 56, 57, 58, 59, 60, 61, 0, 0, 62, 238,
+ 0, 0, 239, 240, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 64,
+ 65, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 241, 0, 242, 125, 126, 127, 128, 129, 130, 131,
+ 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
+ 142, 143, 144, 145, 146, 147, 148, 0, 0, 0,
+ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
+ 0, 0, 0, 0, 0, 159, 160, 161, 162, 163,
+ 164, 165, 166, 36, 37, 167, 39, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 0,
+ 0, 177, 178, 0, 0, 179, 180, 181, 182, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 183,
+ 184, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 0, 195, 196, 0, 0, 0, 0, 0,
+ 0, 197, 198, -564, -564, -564, -564, -564, -564, -564,
+ -564, -564, 0, 0, 0, 0, 0, 0, 0, -564,
+ 0, -564, -564, -564, -564, 0, -564, 0, 0, 0,
+ -564, -564, -564, -564, -564, -564, -564, 0, 0, -564,
+ 0, 0, 0, 0, 0, 0, 0, 0, -564, -564,
+ -564, -564, -564, -564, -564, -564, -564, 0, -564, -564,
+ -564, 0, 0, -564, 0, 0, -564, -564, 0, -564,
+ -564, -564, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -564, 0, 0, -564, -564, 0, -564, -564, 0, -564,
+ -564, -564, -564, 0, -564, -564, -564, -564, -564, -564,
+ 0, 0, -564, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -564, -564, -564, 0, -564, 0, 0, 0,
+ 0, 0, -564, -566, -566, -566, -566, -566, -566, -566,
+ -566, -566, 0, 0, 0, 0, 0, 0, 0, -566,
+ 0, -566, -566, -566, -566, 0, -566, 0, 0, 0,
+ -566, -566, -566, -566, -566, -566, -566, 0, 0, -566,
+ 0, 0, 0, 0, 0, 0, 0, 0, -566, -566,
+ -566, -566, -566, -566, -566, -566, -566, 0, -566, -566,
+ -566, 0, 0, -566, 0, 0, -566, -566, 0, -566,
+ -566, -566, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -566, 0, 0, -566, -566, 0, -566, -566, 0, -566,
+ -566, -566, -566, 0, -566, -566, -566, -566, -566, -566,
+ 0, 0, -566, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -566, -566, -566, 0, -566, 0, 0, 0,
+ 0, 0, -566, -565, -565, -565, -565, -565, -565, -565,
+ -565, -565, 0, 0, 0, 0, 0, 0, 0, -565,
+ 0, -565, -565, -565, -565, 0, -565, 0, 0, 0,
+ -565, -565, -565, -565, -565, -565, -565, 0, 0, -565,
+ 0, 0, 0, 0, 0, 0, 0, 0, -565, -565,
+ -565, -565, -565, -565, -565, -565, -565, 0, -565, -565,
+ -565, 0, 0, -565, 0, 0, -565, -565, 0, -565,
+ -565, -565, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -565, 0, 0, -565, -565, 0, -565, -565, 0, -565,
+ -565, -565, -565, 0, -565, -565, -565, -565, -565, -565,
+ 0, 0, -565, 0, 0, 0, 0, 0, 0, -567,
+ -567, -567, -567, -567, -567, -567, -567, -567, 0, 0,
+ 0, 0, -565, -565, -565, -567, -565, -567, -567, -567,
+ -567, 0, -565, 0, 0, 0, -567, -567, -567, -567,
+ -567, -567, -567, 0, 0, -567, 0, 0, 0, 0,
+ 0, 0, 0, 0, -567, -567, -567, -567, -567, -567,
+ -567, -567, -567, 0, -567, -567, -567, 0, 0, -567,
+ 0, 0, -567, -567, 0, -567, -567, -567, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -567, 771, 0, -567,
+ -567, 0, -567, -567, 0, -567, -567, -567, -567, 0,
+ -567, -567, -567, -567, -567, -567, 0, 0, -567, 0,
+ 0, 0, 0, 0, 0, -99, -568, -568, -568, -568,
+ -568, -568, -568, -568, -568, 0, 0, 0, -567, -567,
+ -567, 0, -568, 0, -568, -568, -568, -568, -567, 0,
+ 0, 0, 0, -568, -568, -568, -568, -568, -568, -568,
+ 0, 0, -568, 0, 0, 0, 0, 0, 0, 0,
+ 0, -568, -568, -568, -568, -568, -568, -568, -568, -568,
+ 0, -568, -568, -568, 0, 0, -568, 0, 0, -568,
+ -568, 0, -568, -568, -568, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -568, 772, 0, -568, -568, 0, -568,
+ -568, 0, -568, -568, -568, -568, 0, -568, -568, -568,
+ -568, -568, -568, 0, 0, -568, 0, 0, 0, 0,
+ 0, 0, -101, -253, -253, -253, -253, -253, -253, -253,
+ -253, -253, 0, 0, 0, -568, -568, -568, 0, -253,
+ 0, -253, -253, -253, -253, -568, 0, 0, 0, 0,
+ -253, -253, -253, -253, -253, -253, -253, 0, 0, -253,
+ 0, 0, 0, 0, 0, 0, 0, 0, -253, -253,
+ -253, -253, -253, -253, -253, -253, -253, 0, -253, -253,
+ -253, 0, 0, -253, 0, 0, -253, -253, 0, -253,
+ -253, -253, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -253, 0, 0, -253, -253, 0, -253, -253, 0, -253,
+ -253, -253, -253, 0, -253, -253, -253, -253, -253, -253,
+ 0, 0, -253, 0, 0, 0, 0, 0, 0, -569,
+ -569, -569, -569, -569, -569, -569, -569, -569, 0, 0,
+ 0, 0, -253, -253, -253, -569, 0, -569, -569, -569,
+ -569, 0, 266, 0, 0, 0, -569, -569, -569, -569,
+ -569, -569, -569, 0, 0, -569, 0, 0, 0, 0,
+ 0, 0, 0, 0, -569, -569, -569, -569, -569, -569,
+ -569, -569, -569, 0, -569, -569, -569, 0, 0, -569,
+ 0, 0, -569, -569, 0, -569, -569, -569, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -569, 0, 0, -569,
+ -569, 0, -569, -569, 0, -569, -569, -569, -569, 0,
+ -569, -569, -569, -569, -569, -569, 0, 0, -569, 0,
+ 0, 0, 0, 0, 0, -570, -570, -570, -570, -570,
+ -570, -570, -570, -570, 0, 0, 0, 0, -569, -569,
+ -569, -570, 0, -570, -570, -570, -570, 0, -569, 0,
+ 0, 0, -570, -570, -570, -570, -570, -570, -570, 0,
+ 0, -570, 0, 0, 0, 0, 0, 0, 0, 0,
+ -570, -570, -570, -570, -570, -570, -570, -570, -570, 0,
+ -570, -570, -570, 0, 0, -570, 0, 0, -570, -570,
+ 0, -570, -570, -570, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -570, 0, 0, -570, -570, 0, -570, -570,
+ 0, -570, -570, -570, -570, 0, -570, -570, -570, -570,
+ -570, -570, 0, 0, -570, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -570, -570, -570, 0, 0, 0,
+ 0, 0, 0, 0, -570, 125, 126, 127, 128, 129,
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 0,
+ 0, 0, 149, 150, 151, 224, 225, 226, 227, 156,
+ 157, 158, 0, 0, 0, 0, 0, 159, 160, 161,
+ 228, 229, 230, 231, 166, 309, 310, 232, 311, 0,
+ 0, 0, 0, 0, 0, 312, 0, 0, 0, 0,
+ 0, 0, 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 0, 0, 177, 178, 0, 0, 179, 180, 181,
+ 182, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 183, 184, 0, 0, 0, 0, 0, 0, 0,
+ 313, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 185, 186, 187, 188, 189, 190,
+ 191, 192, 193, 194, 0, 195, 196, 0, 0, 0,
+ 0, 0, 0, 197, 125, 126, 127, 128, 129, 130,
+ 131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
+ 141, 142, 143, 144, 145, 146, 147, 148, 0, 0,
+ 0, 149, 150, 151, 224, 225, 226, 227, 156, 157,
+ 158, 0, 0, 0, 0, 0, 159, 160, 161, 228,
+ 229, 230, 231, 166, 309, 310, 232, 311, 0, 0,
+ 0, 0, 0, 0, 312, 0, 0, 0, 0, 0,
+ 0, 168, 169, 170, 171, 172, 173, 174, 175, 176,
+ 0, 0, 177, 178, 0, 0, 179, 180, 181, 182,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 183, 184, 0, 0, 0, 0, 0, 0, 0, 433,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 0, 195, 196, 0, 0, 0, 0,
+ 0, 0, 197, 125, 126, 127, 128, 129, 130, 131,
+ 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
+ 142, 143, 144, 145, 146, 147, 148, 0, 0, 0,
+ 149, 150, 151, 224, 225, 226, 227, 156, 157, 158,
+ 0, 0, 0, 0, 0, 159, 160, 161, 228, 229,
+ 230, 231, 166, 0, 0, 232, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 0,
+ 0, 177, 178, 0, 0, 179, 180, 181, 182, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 183,
+ 184, 0, 0, 0, 233, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 0, 195, 196, 0, 0, 0, 0, 0,
+ 0, 197, 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
+ 143, 144, 145, 146, 147, 148, 0, 0, 0, 149,
+ 150, 151, 224, 225, 226, 227, 156, 157, 158, 0,
+ 0, 0, 0, 0, 159, 160, 161, 228, 229, 230,
+ 231, 166, 0, 0, 232, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 168,
+ 169, 170, 171, 172, 173, 174, 175, 176, 0, 0,
+ 177, 178, 0, 0, 179, 180, 181, 182, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 183, 184,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 185, 186, 187, 188, 189, 190, 191, 192, 193,
+ 194, 0, 195, 196, 0, 0, 0, 0, 0, 0,
+ 197, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 0, 0, 0, 0, 0, 15, 0, 104,
+ 105, 18, 19, 0, 0, 0, 0, 0, 106, 107,
+ 108, 23, 24, 25, 26, 0, 0, 109, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 0, 40, 41, 42, 0,
+ 0, 43, 0, 0, 44, 45, 0, 112, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 302, 0,
+ 0, 115, 51, 0, 52, 53, 0, 0, 0, 0,
+ 55, 0, 56, 57, 58, 59, 60, 61, 0, 0,
+ 62, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 0, 0, 0, 15,
+ 116, 104, 105, 18, 19, 0, 0, 0, 303, 0,
+ 106, 107, 108, 23, 24, 25, 26, 0, 0, 109,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 0, 40, 41,
+ 42, 0, 0, 43, 0, 0, 44, 45, 0, 112,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 302, 0, 0, 115, 51, 0, 52, 53, 0, 0,
+ 0, 0, 55, 0, 56, 57, 58, 59, 60, 61,
+ 0, 0, 62, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 0, 0, 0, 0, 0,
+ 0, 15, 116, 16, 17, 18, 19, 0, 0, 0,
+ 557, 0, 20, 21, 22, 23, 24, 25, 26, 0,
+ 0, 27, 0, 0, 0, 0, 0, 28, 29, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 0,
+ 40, 41, 42, 0, 0, 43, 0, 0, 44, 45,
+ 0, 46, 47, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 49, 0, 0, 50, 51, 0, 52, 53,
+ 0, 54, 0, 0, 55, 0, 56, 57, 58, 59,
+ 60, 61, 0, 0, 62, 0, 0, 0, 0, 0,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 0, 0, 63, 64, 65, 15, 0, 16,
+ 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 22, 23, 24, 25, 26, 0, 0, 109, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 33, 251,
+ 35, 36, 37, 38, 39, 0, 40, 41, 42, 0,
+ 0, 43, 0, 0, 44, 45, 0, 46, 47, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 455, 0, 0, 0, 0, 0, 205, 0,
+ 0, 115, 51, 0, 52, 53, 0, 252, 253, 254,
+ 55, 0, 56, 57, 58, 59, 60, 61, 0, 0,
+ 62, 0, 0, 0, 0, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 0, 0, 0,
+ 63, 255, 65, 15, 0, 16, 17, 18, 19, 0,
+ 0, 0, 0, 0, 20, 21, 22, 23, 24, 25,
+ 26, 0, 0, 27, 0, 0, 0, 0, 0, 28,
+ 0, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
+ 44, 45, 0, 46, 47, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 49, 0, 0, 50, 51, 0,
+ 52, 53, 0, 54, 0, 0, 55, 0, 56, 57,
+ 58, 59, 60, 61, 0, 0, 62, 0, 0, 0,
+ 0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 63, 64, 65, 15,
+ 0, 16, 17, 18, 19, 0, 0, 0, 0, 0,
+ 20, 21, 22, 23, 24, 25, 26, 0, 0, 109,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 33, 251, 35, 36, 37, 38, 39, 0, 40, 41,
+ 42, 0, 0, 43, 0, 0, 44, 45, 0, 46,
+ 47, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 205, 0, 0, 115, 51, 0, 52, 53, 0, 252,
+ 253, 254, 55, 0, 56, 57, 58, 59, 60, 61,
+ 0, 0, 62, 0, 0, 0, 0, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 63, 255, 65, 15, 0, 104, 105, 18,
+ 19, 0, 0, 0, 0, 0, 106, 107, 108, 23,
+ 24, 25, 26, 0, 0, 109, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 33, 251, 35, 36,
+ 37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
+ 0, 0, 44, 45, 0, 46, 47, 48, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 205, 0, 0, 115,
+ 51, 0, 52, 53, 0, 666, 253, 254, 55, 0,
+ 56, 57, 58, 59, 60, 61, 0, 0, 62, 0,
+ 0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 63, 255,
+ 65, 15, 0, 104, 105, 18, 19, 0, 0, 0,
+ 0, 0, 106, 107, 108, 23, 24, 25, 26, 0,
+ 0, 109, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 32, 33, 251, 35, 36, 37, 38, 39, 0,
+ 40, 41, 42, 0, 0, 43, 0, 0, 44, 45,
+ 0, 46, 47, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 205, 0, 0, 115, 51, 0, 52, 53,
+ 0, 252, 253, 0, 55, 0, 56, 57, 58, 59,
+ 60, 61, 0, 0, 62, 0, 0, 0, 0, 0,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 0, 0, 63, 255, 65, 15, 0, 104,
+ 105, 18, 19, 0, 0, 0, 0, 0, 106, 107,
+ 108, 23, 24, 25, 26, 0, 0, 109, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 33, 251,
+ 35, 36, 37, 38, 39, 0, 40, 41, 42, 0,
+ 0, 43, 0, 0, 44, 45, 0, 46, 47, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 205, 0,
+ 0, 115, 51, 0, 52, 53, 0, 0, 253, 254,
+ 55, 0, 56, 57, 58, 59, 60, 61, 0, 0,
+ 62, 0, 0, 0, 0, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
+ 63, 255, 65, 15, 0, 104, 105, 18, 19, 0,
+ 0, 0, 0, 0, 106, 107, 108, 23, 24, 25,
+ 26, 0, 0, 109, 0, 0, 0, 0, 0, 0,
+ 0, 0, 31, 32, 33, 251, 35, 36, 37, 38,
+ 39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
+ 44, 45, 0, 46, 47, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 205, 0, 0, 115, 51, 0,
+ 52, 53, 0, 666, 253, 0, 55, 0, 56, 57,
+ 58, 59, 60, 61, 0, 0, 62, 0, 0, 0,
+ 0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 63, 255, 65, 15,
+ 0, 104, 105, 18, 19, 0, 0, 0, 0, 0,
+ 106, 107, 108, 23, 24, 25, 26, 0, 0, 109,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 33, 251, 35, 36, 37, 38, 39, 0, 40, 41,
+ 42, 0, 0, 43, 0, 0, 44, 45, 0, 46,
+ 47, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 205, 0, 0, 115, 51, 0, 52, 53, 0, 0,
+ 253, 0, 55, 0, 56, 57, 58, 59, 60, 61,
+ 0, 0, 62, 0, 0, 0, 0, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 63, 255, 65, 15, 0, 16, 17, 18,
+ 19, 0, 0, 0, 0, 0, 20, 21, 22, 23,
+ 24, 25, 26, 0, 0, 109, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
+ 0, 0, 44, 45, 0, 46, 47, 48, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 205, 0, 0, 115,
+ 51, 0, 52, 53, 0, 551, 0, 0, 55, 0,
+ 56, 57, 58, 59, 60, 61, 0, 0, 62, 0,
+ 0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 63, 255,
+ 65, 15, 0, 104, 105, 18, 19, 0, 0, 0,
+ 0, 0, 106, 107, 108, 23, 24, 25, 26, 0,
+ 0, 109, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 0,
+ 40, 41, 42, 0, 0, 43, 0, 0, 44, 45,
+ 0, 46, 47, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 205, 0, 0, 115, 51, 0, 52, 53,
+ 0, 252, 0, 0, 55, 0, 56, 57, 58, 59,
+ 60, 61, 0, 0, 62, 0, 0, 0, 0, 0,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 0, 0, 63, 255, 65, 15, 0, 104,
+ 105, 18, 19, 0, 0, 0, 0, 0, 106, 107,
+ 108, 23, 24, 25, 26, 0, 0, 109, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 0, 40, 41, 42, 0,
+ 0, 43, 0, 0, 44, 45, 0, 46, 47, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 205, 0,
+ 0, 115, 51, 0, 52, 53, 0, 551, 0, 0,
+ 55, 0, 56, 57, 58, 59, 60, 61, 0, 0,
+ 62, 0, 0, 0, 0, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
+ 63, 255, 65, 15, 0, 104, 105, 18, 19, 0,
+ 0, 0, 0, 0, 106, 107, 108, 23, 24, 25,
+ 26, 0, 0, 109, 0, 0, 0, 0, 0, 0,
+ 0, 0, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
+ 44, 45, 0, 46, 47, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 205, 0, 0, 115, 51, 0,
+ 52, 53, 0, 831, 0, 0, 55, 0, 56, 57,
+ 58, 59, 60, 61, 0, 0, 62, 0, 0, 0,
+ 0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 63, 255, 65, 15,
+ 0, 104, 105, 18, 19, 0, 0, 0, 0, 0,
+ 106, 107, 108, 23, 24, 25, 26, 0, 0, 109,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 0, 40, 41,
+ 42, 0, 0, 43, 0, 0, 44, 45, 0, 46,
+ 47, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 205, 0, 0, 115, 51, 0, 52, 53, 0, 666,
+ 0, 0, 55, 0, 56, 57, 58, 59, 60, 61,
+ 0, 0, 62, 0, 0, 0, 0, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 63, 255, 65, 15, 0, 16, 17, 18,
+ 19, 0, 0, 0, 0, 0, 20, 21, 22, 23,
+ 24, 25, 26, 0, 0, 27, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
+ 0, 0, 44, 45, 0, 46, 47, 48, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 205, 0, 0, 115,
+ 51, 0, 52, 53, 0, 0, 0, 0, 55, 0,
+ 56, 57, 58, 59, 60, 61, 0, 0, 62, 0,
+ 0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 63, 64,
+ 65, 15, 0, 104, 105, 18, 19, 0, 0, 0,
+ 0, 0, 106, 107, 108, 23, 24, 25, 26, 0,
+ 0, 109, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 0,
+ 40, 41, 42, 0, 0, 43, 0, 0, 44, 45,
+ 0, 46, 47, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 205, 0, 0, 115, 51, 0, 52, 53,
+ 0, 0, 0, 0, 55, 0, 56, 57, 58, 59,
+ 60, 61, 0, 0, 62, 0, 0, 0, 0, 0,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 0, 0, 63, 255, 65, 15, 0, 16,
+ 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 22, 23, 24, 25, 26, 0, 0, 109, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 0, 40, 41, 42, 0,
+ 0, 43, 0, 0, 44, 45, 0, 46, 47, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 205, 0,
+ 0, 115, 51, 0, 52, 53, 0, 0, 0, 0,
+ 55, 0, 56, 57, 58, 59, 60, 61, 0, 0,
+ 62, 0, 0, 0, 0, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
+ 63, 255, 65, 15, 0, 104, 105, 18, 19, 0,
+ 0, 0, 0, 0, 106, 107, 108, 23, 24, 25,
+ 26, 0, 0, 109, 0, 0, 0, 0, 0, 0,
+ 0, 0, 31, 32, 33, 110, 35, 36, 37, 111,
+ 39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
+ 44, 45, 0, 112, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 113, 0, 0, 114, 0, 0, 115, 51, 0,
+ 52, 53, 0, 0, 0, 0, 55, 0, 56, 57,
+ 58, 59, 60, 61, 0, 0, 62, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 0, 0, 0, 15, 116, 104, 105, 18,
+ 19, 0, 0, 0, 0, 0, 106, 107, 108, 23,
+ 24, 25, 26, 0, 0, 109, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
+ 0, 0, 44, 45, 0, 216, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 217, 0, 0, 50,
+ 51, 0, 52, 53, 0, 54, 0, 0, 55, 0,
+ 56, 57, 58, 59, 60, 61, 0, 0, 62, 0,
+ 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 0, 0, 0, 0, 0, 0, 0, 15, 116, 104,
+ 105, 18, 19, 0, 0, 0, 0, 0, 106, 107,
+ 108, 23, 24, 25, 26, 0, 0, 109, 0, 0,
+ 0, 0, 0, 0, 0, 0, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 0, 40, 41, 42, 0,
+ 0, 43, 0, 0, 44, 45, 0, 112, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 302, 0,
+ 0, 349, 51, 0, 52, 53, 0, 350, 0, 0,
+ 55, 0, 56, 57, 58, 59, 60, 61, 0, 0,
+ 62, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 0, 0, 0, 15,
+ 116, 104, 105, 18, 19, 0, 0, 0, 0, 0,
+ 106, 107, 108, 23, 24, 25, 26, 0, 0, 109,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
+ 33, 110, 35, 36, 37, 111, 39, 0, 40, 41,
+ 42, 0, 0, 43, 0, 0, 44, 45, 0, 112,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 114, 0, 0, 115, 51, 0, 52, 53, 0, 0,
+ 0, 0, 55, 0, 56, 57, 58, 59, 60, 61,
+ 0, 0, 62, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 0, 0,
+ 0, 15, 116, 104, 105, 18, 19, 0, 0, 0,
+ 0, 0, 106, 107, 108, 23, 24, 25, 26, 0,
+ 0, 109, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 0,
+ 40, 41, 42, 0, 0, 43, 0, 0, 44, 45,
+ 0, 112, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 302, 0, 0, 349, 51, 0, 52, 53,
+ 0, 0, 0, 0, 55, 0, 56, 57, 58, 59,
+ 60, 61, 0, 0, 62, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
+ 0, 0, 0, 15, 116, 104, 105, 18, 19, 0,
+ 0, 0, 0, 0, 106, 107, 108, 23, 24, 25,
+ 26, 0, 0, 109, 0, 0, 0, 0, 0, 0,
+ 0, 0, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
+ 44, 45, 0, 112, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 904, 0, 0, 115, 51, 0,
+ 52, 53, 0, 0, 0, 0, 55, 0, 56, 57,
+ 58, 59, 60, 61, 0, 0, 62, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 0, 0, 0, 15, 116, 104, 105, 18,
+ 19, 0, 0, 0, 0, 0, 106, 107, 108, 23,
+ 24, 25, 26, 0, 0, 109, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
+ 0, 0, 44, 45, 0, 216, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 931, 0, 0, 115,
+ 51, 0, 52, 53, 0, 595, 596, 0, 55, 597,
+ 56, 57, 58, 59, 60, 61, 0, 0, 62, 0,
+ 0, 0, 0, 0, 168, 169, 170, 171, 172, 173,
+ 174, 175, 176, 0, 0, 177, 178, 0, 116, 179,
+ 180, 181, 182, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 183, 184, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 185, 186, 187, 188,
+ 189, 190, 191, 192, 193, 194, 0, 195, 196, 603,
+ 604, 0, 0, 605, 0, 197, 266, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 0, 0, 177,
+ 178, 0, 0, 179, 180, 181, 182, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 183, 184, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
+ 0, 195, 196, 624, 596, 0, 0, 625, 0, 197,
+ 266, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 0, 0, 177, 178, 0, 0, 179, 180, 181,
+ 182, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 183, 184, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 185, 186, 187, 188, 189, 190,
+ 191, 192, 193, 194, 0, 195, 196, 609, 604, 0,
+ 0, 610, 0, 197, 266, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 0, 0, 177, 178, 0,
+ 0, 179, 180, 181, 182, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 183, 184, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 185, 186,
+ 187, 188, 189, 190, 191, 192, 193, 194, 0, 195,
+ 196, 640, 596, 0, 0, 641, 0, 197, 266, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 0,
+ 0, 177, 178, 0, 0, 179, 180, 181, 182, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 183,
+ 184, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 0, 195, 196, 643, 604, 0, 0, 644,
+ 0, 197, 266, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 168, 169, 170, 171, 172, 173,
+ 174, 175, 176, 0, 0, 177, 178, 0, 0, 179,
+ 180, 181, 182, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 183, 184, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 185, 186, 187, 188,
+ 189, 190, 191, 192, 193, 194, 0, 195, 196, 650,
+ 596, 0, 0, 651, 0, 197, 266, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 0, 0, 177,
+ 178, 0, 0, 179, 180, 181, 182, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 183, 184, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
+ 0, 195, 196, 653, 604, 0, 0, 654, 0, 197,
+ 266, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 0, 0, 177, 178, 0, 0, 179, 180, 181,
+ 182, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 183, 184, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 185, 186, 187, 188, 189, 190,
+ 191, 192, 193, 194, 0, 195, 196, 689, 596, 0,
+ 0, 690, 0, 197, 266, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 0, 0, 177, 178, 0,
+ 0, 179, 180, 181, 182, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 183, 184, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 185, 186,
+ 187, 188, 189, 190, 191, 192, 193, 194, 0, 195,
+ 196, 692, 604, 0, 0, 693, 0, 197, 266, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 0,
+ 0, 177, 178, 0, 0, 179, 180, 181, 182, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 183,
+ 184, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 0, 195, 196, 836, 596, 0, 0, 837,
+ 0, 197, 266, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 168, 169, 170, 171, 172, 173,
+ 174, 175, 176, 0, 0, 177, 178, 0, 0, 179,
+ 180, 181, 182, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 183, 184, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 185, 186, 187, 188,
+ 189, 190, 191, 192, 193, 194, 0, 195, 196, 839,
+ 604, 0, 0, 840, 0, 197, 266, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 0, 0, 177,
+ 178, 0, 0, 179, 180, 181, 182, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 183, 184, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
+ 0, 195, 196, 994, 596, 0, 0, 995, 0, 197,
+ 266, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 0, 0, 177, 178, 0, 0, 179, 180, 181,
+ 182, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 183, 184, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 185, 186, 187, 188, 189, 190,
+ 191, 192, 193, 194, 0, 195, 196, 1007, 596, 0,
+ 0, 1008, 0, 197, 266, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 0, 0, 177, 178, 0,
+ 0, 179, 180, 181, 182, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 183, 184, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 185, 186,
+ 187, 188, 189, 190, 191, 192, 193, 194, 0, 195,
+ 196, 1010, 604, 0, 0, 1011, 0, 197, 266, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 0,
+ 0, 177, 178, 0, 0, 179, 180, 181, 182, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 183,
+ 184, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 185, 186, 187, 188, 189, 190, 191, 192,
+ 193, 194, 0, 195, 196, 609, 604, 0, 0, 610,
+ 0, 197, 266, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 168, 169, 170, 171, 172, 173,
+ 174, 175, 176, 0, 0, 177, 178, 0, 0, 179,
+ 180, 181, 182, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 183, 184, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 732, 0,
+ 0, 0, 0, 0, 0, 0, 185, 186, 187, 188,
+ 189, 190, 191, 192, 193, 194, 0, 195, 196, 0,
+ 0, 0, 0, 0, 0, 197, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 363, 364, 365, 0,
+ 0, 366, 367, 353, 354, 355, 356, 357, 358, 359,
+ 360, 361, 362, 363, 364, 365, 0, 0, 366, 367,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 368, 0, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378, 0, 0, 0, 0,
+ 0, 368, 0, 369, 370, 371, 372, 373, 374, 375,
+ 376, 377, 378, 353, 354, 355, 356, 357, 358, 359,
+ 360, 361, 362, 363, 364, 365, 0, 242, 366, 367,
+ 0, 0, 353, 354, 355, 356, 357, 358, 359, 360,
+ 361, 362, 363, 364, 365, 0, 0, 366, 367, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 368, 0, 369, 370, 371, 372, 373, 374, 375,
+ 376, 377, 378, 0, 0, 0, 0, 0, 0, 0,
+ 368, -260, 369, 370, 371, 372, 373, 374, 375, 376,
+ 377, 378, 0, 0, 0, 0, 0, 0, 0, 0,
+ -261, 353, 354, 355, 356, 357, 358, 359, 360, 361,
+ 362, 363, 364, 365, 0, 0, 366, 367, 0, 0,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 0, 0, 366, 367, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 368,
+ 0, 369, 370, 371, 372, 373, 374, 375, 376, 377,
+ 378, 0, 0, 0, 0, 0, 0, 0, 368, -262,
+ 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,
+ 0, 0, 0, 0, 0, 0, 0, 0, -263, 353,
+ 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,
+ 364, 365, 0, 0, 366, 367, 0, 0, 0, 447,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 0, 0, 366, 367, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 368, 0, 369,
+ 370, 371, 372, 373, 374, 375, 376, 377, 378, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 368, 0,
+ 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, -595, -595, 0, 0, 366, 367, 353, 354, 355,
+ 356, 357, 358, 359, 360, 0, 362, 363, 0, 0,
+ 0, 0, 366, 367, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,
+ 0, 0, 0, 0, 0, 0, 0, 369, 370, 371,
+ 372, 373, 374, 375, 376, 377, 378, 353, 354, 355,
+ 356, 357, 358, 359, 0, 0, 362, 363, 0, 0,
+ 0, 0, 366, 367, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 369, 370, 371,
+ 372, 373, 374, 375, 376, 377, 378
+};
+
+static const yytype_int16 yycheck[] =
+{
+ 2, 308, 308, 83, 84, 27, 436, 213, 14, 78,
+ 2, 10, 4, 5, 6, 27, 15, 9, 10, 21,
+ 85, 13, 28, 15, 16, 17, 7, 262, 20, 381,
+ 2, 7, 4, 28, 67, 22, 4, 303, 14, 54,
+ 379, 15, 296, 454, 383, 427, 300, 386, 64, 352,
+ 52, 53, 28, 405, 50, 16, 17, 721, 50, 20,
+ 450, 492, 54, 320, 454, 442, 114, 406, 636, 421,
+ 16, 17, 64, 484, 20, 56, 515, 645, 430, 795,
+ 56, 420, 709, 422, 912, 26, 78, 57, 889, 391,
+ 392, 52, 431, 67, 5, 6, 21, 22, 26, 16,
+ 612, 613, 13, 142, 25, 107, 29, 146, 16, 17,
+ 89, 91, 20, 25, 101, 285, 58, 59, 60, 61,
+ 25, 113, 89, 115, 103, 321, 557, 57, 324, 209,
+ 326, 470, 328, 89, 330, 25, 89, 289, 25, 119,
+ 220, 293, 494, 54, 52, 53, 25, 16, 17, 119,
+ 51, 20, 91, 27, 55, 51, 495, 53, 54, 55,
+ 56, 89, 140, 26, 0, 25, 145, 78, 146, 997,
+ 16, 17, 136, 69, 20, 103, 101, 91, 145, 349,
+ 119, 25, 107, 108, 55, 442, 987, 706, 111, 145,
+ 89, 121, 145, 407, 28, 136, 113, 352, 123, 116,
+ 117, 281, 509, 509, 740, 119, 52, 53, 136, 745,
+ 138, 18, 204, 20, 142, 214, 215, 145, 26, 140,
+ 140, 142, 214, 215, 459, 305, 492, 144, 140, 146,
+ 142, 947, 50, 80, 303, 140, 391, 392, 750, 113,
+ 91, 87, 116, 117, 140, 909, 145, 72, 912, 260,
+ 140, 262, 233, 140, 287, 119, 91, 233, 260, 89,
+ 262, 140, 295, 296, 266, 676, 893, 300, 119, 243,
+ 144, 91, 146, 136, 266, 532, 140, 124, 270, 142,
+ 140, 89, 274, 275, 295, 675, 676, 279, 665, 285,
+ 119, 557, 284, 285, 91, 103, 140, 115, 729, 119,
+ 292, 142, 101, 455, 129, 130, 131, 89, 89, 270,
+ 462, 303, 284, 287, 882, 145, 89, 119, 89, 142,
+ 292, 473, 119, 123, 270, 55, 632, 126, 136, 89,
+ 138, 347, 635, 997, 530, 350, 352, 145, 91, 338,
+ 339, 340, 341, 140, 119, 337, 338, 339, 340, 341,
+ 342, 343, 344, 349, 25, 347, 404, 349, 350, 91,
+ 352, 55, 270, 145, 145, 337, 805, 91, 887, 337,
+ 342, 313, 145, 16, 145, 391, 392, 113, 897, 381,
+ 116, 117, 734, 822, 823, 145, 347, 119, 89, 381,
+ 909, 352, 303, 140, 733, 119, 735, 266, 780, 391,
+ 392, 270, 103, 405, 556, 662, 20, 383, 665, 623,
+ 386, 140, 414, 405, 60, 407, 408, 63, 57, 421,
+ 266, 490, 136, 492, 270, 417, 448, 72, 430, 421,
+ 406, 91, 686, 425, 669, 737, 448, 138, 430, 350,
+ 742, 743, 119, 435, 145, 143, 422, 458, 459, 91,
+ 757, 757, 882, 137, 660, 431, 458, 459, 383, 119,
+ 466, 279, 108, 729, 139, 467, 16, 285, 58, 59,
+ 113, 466, 883, 116, 117, 467, 55, 119, 439, 631,
+ 140, 406, 1001, 457, 476, 37, 38, 567, 557, 91,
+ 466, 89, 494, 883, 470, 467, 1015, 422, 490, 91,
+ 492, 144, 494, 146, 476, 103, 431, 2, 722, 4,
+ 140, 513, 381, 515, 9, 10, 72, 119, 72, 495,
+ 15, 16, 17, 91, 963, 20, 98, 119, 91, 786,
+ 91, 349, 140, 685, 748, 381, 405, 15, 140, 531,
+ 138, 13, 450, 554, 758, 470, 848, 145, 550, 16,
+ 608, 119, 421, 611, 789, 50, 119, 15, 119, 405,
+ 866, 430, 584, 113, 63, 557, 116, 117, 143, 64,
+ 495, 629, 584, 481, 143, 421, 731, 140, 26, 490,
+ 137, 492, 737, 89, 430, 140, 800, 742, 743, 113,
+ 140, 140, 116, 117, 144, 16, 146, 103, 51, 417,
+ 53, 54, 55, 56, 450, 51, 608, 425, 454, 611,
+ 612, 613, 140, 600, 44, 89, 69, 435, 113, 140,
+ 115, 608, 146, 622, 611, 494, 978, 629, 89, 103,
+ 622, 623, 138, 635, 636, 481, 638, 140, 484, 145,
+ 979, 89, 103, 645, 796, 859, 557, 51, 494, 660,
+ 656, 140, 633, 686, 91, 103, 655, 633, 669, 51,
+ 729, 656, 868, 655, 138, 58, 59, 669, 874, 16,
+ 17, 145, 140, 20, 635, 600, 62, 138, 64, 65,
+ 656, 746, 119, 608, 145, 697, 611, 140, 136, 139,
+ 138, 119, 113, 848, 142, 116, 117, 145, 89, 139,
+ 47, 48, 627, 140, 629, 52, 53, 17, 18, 204,
+ 862, 863, 103, 531, 15, 731, 930, 64, 65, 214,
+ 215, 737, 738, 144, 18, 146, 742, 743, 114, 115,
+ 722, 51, 734, 53, 54, 55, 56, 729, 730, 731,
+ 818, 819, 734, 72, 139, 737, 738, 138, 750, 69,
+ 742, 743, 139, 137, 145, 15, 748, 749, 730, 735,
+ 137, 763, 26, 91, 766, 139, 758, 675, 146, 768,
+ 524, 266, 526, 765, 137, 270, 768, 15, 789, 274,
+ 275, 92, 37, 38, 279, 777, 778, 789, 14, 284,
+ 285, 119, 113, 785, 15, 116, 117, 292, 127, 128,
+ 129, 130, 131, 805, 391, 392, 818, 819, 800, 801,
+ 735, 62, 140, 64, 65, 15, 140, 143, 729, 51,
+ 822, 823, 144, 57, 140, 89, 140, 140, 820, 675,
+ 676, 140, 848, 825, 140, 140, 423, 424, 140, 103,
+ 72, 140, 337, 338, 339, 340, 341, 342, 343, 344,
+ 15, 139, 347, 933, 349, 15, 848, 352, 113, 137,
+ 15, 116, 117, 114, 115, 734, 858, 859, 100, 101,
+ 15, 15, 136, 140, 138, 867, 9, 10, 142, 871,
+ 882, 145, 15, 15, 471, 89, 381, 89, 734, 144,
+ 137, 146, 55, 124, 126, 124, 391, 392, 137, 103,
+ 61, 103, 89, 64, 65, 252, 253, 254, 255, 820,
+ 405, 15, 407, 408, 825, 89, 103, 55, 140, 266,
+ 140, 61, 417, 270, 64, 65, 421, 949, 15, 103,
+ 425, 749, 140, 140, 138, 430, 138, 949, 930, 140,
+ 435, 145, 706, 145, 936, 709, 938, 765, 89, 941,
+ 15, 138, 140, 114, 115, 142, 867, 721, 145, 777,
+ 778, 963, 103, 140, 138, 113, 142, 785, 116, 117,
+ 142, 145, 467, 139, 114, 115, 978, 467, 980, 981,
+ 113, 476, 140, 801, 13, 26, 978, 6, 981, 987,
+ 63, 64, 65, 721, 980, 207, 144, 138, 146, 494,
+ 347, 213, 747, 979, 145, 352, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,
+ 367, 368, 369, 370, 371, 372, 373, 374, 375, 376,
+ 377, 378, 245, 7, 381, 721, 531, 883, 250, 866,
+ 858, 114, 115, 700, 391, 392, 261, 906, 89, 26,
+ 89, 909, 706, 871, 979, 809, 810, 811, 405, 813,
+ -1, 815, 103, -1, 103, 89, -1, 2, -1, 4,
+ 5, 6, 419, -1, 421, -1, 423, 424, 13, 103,
+ -1, 214, 215, 430, 89, -1, -1, 63, 64, 65,
+ -1, -1, 439, -1, -1, 136, 443, 138, 103, 138,
+ 447, 142, -1, 450, 145, 452, 145, 454, -1, 978,
+ -1, -1, 89, -1, 138, 50, -1, 89, 936, 54,
+ 938, 145, -1, 941, 471, 337, 103, 622, 623, 893,
+ -1, 103, 978, 138, 481, -1, -1, 484, 114, 115,
+ 145, 274, 275, 78, -1, 909, -1, 494, 912, -1,
+ 737, 738, -1, -1, -1, 742, 743, -1, -1, 136,
+ 655, 138, -1, -1, 511, 142, 138, -1, 145, -1,
+ 696, -1, -1, 145, 51, 522, 53, 54, 55, 56,
+ 115, -1, -1, 709, 771, 772, 712, 774, 775, 63,
+ 64, 65, 69, 540, 541, 721, -1, -1, -1, -1,
+ 954, 955, 956, 957, 551, 338, 339, 340, 341, -1,
+ 343, 344, -1, -1, 426, 427, 93, 700, -1, -1,
+ 906, 704, 99, 909, 700, -1, 912, 722, 914, 63,
+ 64, 65, -1, 997, -1, 730, 731, -1, 721, 734,
+ 114, 115, 737, 738, -1, 721, -1, 742, 743, 63,
+ 64, 65, -1, 748, 749, -1, -1, -1, 63, 64,
+ 65, 848, -1, 758, 476, 1019, -1, -1, -1, 204,
+ 765, 483, -1, 768, -1, 408, -1, -1, 964, -1,
+ 114, 115, 777, 778, -1, -1, -1, -1, 635, 876,
+ 785, 40, 41, 42, 43, 44, -1, 2, -1, 4,
+ 114, 115, -1, -1, -1, 800, 801, -1, 13, 114,
+ 115, 997, -1, 999, -1, 1001, -1, 1003, -1, 666,
+ 63, 64, 65, -1, -1, -1, -1, -1, 675, 676,
+ -1, -1, -1, 51, -1, 53, 54, 55, 56, -1,
+ -1, -1, 1028, -1, 279, 50, 63, 64, 65, 284,
+ 285, 69, -1, 848, 72, -1, -1, 292, -1, -1,
+ -1, -1, -1, 858, 859, 827, 828, 893, 303, 895,
+ -1, 114, 115, 899, -1, 93, 871, -1, -1, 726,
+ -1, 99, 100, 101, 731, 732, 912, 734, 914, -1,
+ 737, 738, -1, -1, -1, 742, 743, 114, 115, -1,
+ -1, -1, 337, -1, -1, -1, -1, 342, 126, 621,
+ 115, 129, -1, -1, 349, 350, -1, 352, -1, 945,
+ 946, -1, 140, 906, 771, 772, 909, 774, 775, 912,
+ 906, 914, -1, 909, -1, 930, 912, 784, 914, -1,
+ -1, 936, -1, 938, -1, -1, 941, 909, 660, -1,
+ -1, -1, -1, -1, -1, -1, 391, 392, -1, 985,
+ -1, -1, -1, 2, 990, 4, 5, 6, 7, -1,
+ -1, 997, 407, 999, 13, -1, -1, 1003, -1, -1,
+ -1, 964, 417, 978, 831, -1, -1, -1, 964, 622,
+ 425, 1017, -1, -1, 841, 842, -1, -1, -1, 204,
+ 435, 848, 1028, -1, -1, 967, 968, 969, -1, 971,
+ 972, 50, -1, -1, 997, 54, 999, -1, 1001, -1,
+ 1003, 997, 655, 999, -1, 1001, -1, 1003, -1, 876,
+ -1, -1, 467, -1, 72, -1, 883, -1, -1, 78,
+ 752, 476, -1, -1, -1, 1028, -1, 759, -1, 87,
+ 88, 72, 1028, -1, 2, 490, 4, 492, 1020, 1021,
+ 1022, 1023, 72, -1, -1, -1, 87, 88, 780, -1,
+ 1032, -1, -1, -1, 279, -1, 115, 87, 88, 284,
+ 285, 51, -1, 53, 54, 55, 56, 292, 126, 127,
+ 128, 129, 130, 131, 113, -1, 531, 116, 117, 69,
+ -1, -1, 50, 124, 125, 126, 127, 128, 129, 130,
+ 131, -1, -1, -1, -1, -1, -1, 127, 128, 129,
+ 130, 131, 557, 93, 143, 144, -1, 146, -1, 99,
+ 113, 978, 337, 116, 117, 768, 51, 342, 53, 54,
+ 55, 56, -1, -1, 349, -1, -1, 352, 51, -1,
+ 53, 54, 55, 56, 69, -1, 868, 140, -1, -1,
+ -1, 144, 874, 146, -1, 204, 69, 115, -1, 72,
+ -1, -1, -1, -1, -1, -1, -1, -1, 93, -1,
+ -1, -1, -1, -1, -1, -1, 391, 392, 623, -1,
+ 93, -1, -1, -1, -1, -1, 99, 100, 101, -1,
+ -1, 51, 407, 53, 54, 55, 56, -1, -1, -1,
+ -1, -1, 417, -1, -1, -1, -1, -1, -1, 69,
+ 425, -1, 72, 126, -1, -1, 129, -1, -1, -1,
+ 435, -1, -1, -1, -1, -1, -1, -1, -1, 142,
+ 279, -1, -1, 93, -1, 284, 285, -1, -1, 99,
+ 100, 101, -1, 292, -1, -1, 204, -1, -1, -1,
+ -1, -1, 467, -1, 303, -1, -1, -1, -1, -1,
+ 51, 476, 53, 54, 55, 56, 126, -1, -1, 129,
+ -1, -1, -1, -1, -1, -1, -1, 722, 69, -1,
+ -1, 72, 142, -1, 729, 730, 731, -1, 337, -1,
+ -1, -1, 737, 342, -1, -1, -1, 742, 743, -1,
+ 349, 350, 93, 748, 749, -1, -1, -1, 99, 100,
+ 101, -1, -1, 758, -1, -1, 531, -1, -1, -1,
+ 765, 279, -1, -1, -1, -1, 284, 285, -1, -1,
+ -1, -1, 777, 778, 292, 126, -1, -1, 129, -1,
+ 785, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 800, 801, -1, 407, -1,
+ -1, -1, -1, -1, -1, -1, -1, 51, 417, 53,
+ 54, 55, 56, -1, -1, 820, 425, -1, -1, 337,
+ 825, -1, -1, -1, 342, 69, 435, -1, 72, -1,
+ -1, 349, -1, -1, 352, -1, -1, -1, -1, -1,
+ 84, -1, -1, 848, -1, -1, -1, -1, 623, 93,
+ -1, -1, -1, 858, 859, 99, 100, 101, 467, -1,
+ -1, -1, 867, -1, -1, -1, 871, 476, -1, -1,
+ -1, -1, -1, 391, 392, -1, -1, -1, -1, -1,
+ -1, 490, 126, 492, -1, 129, -1, -1, 51, 407,
+ 53, 54, 55, 56, -1, -1, -1, -1, -1, 417,
+ -1, -1, -1, -1, -1, -1, 69, 425, -1, 72,
+ -1, -1, -1, -1, -1, -1, -1, 435, -1, -1,
+ -1, -1, 531, -1, -1, 930, -1, -1, -1, -1,
+ 93, 936, -1, 938, -1, -1, 941, 100, 101, -1,
+ -1, -1, -1, -1, -1, -1, -1, 722, 557, 467,
+ -1, -1, -1, -1, -1, 730, 731, -1, 476, -1,
+ -1, -1, 737, 126, -1, -1, -1, 742, 743, -1,
+ -1, -1, -1, 748, 749, -1, -1, -1, -1, -1,
+ -1, -1, -1, 758, -1, -1, -1, -1, -1, -1,
+ 765, 0, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 777, 778, 13, 14, 15, 16, 17, 18,
+ 785, 20, -1, 531, 623, -1, -1, 26, 27, -1,
+ -1, -1, -1, -1, -1, 800, 801, -1, 37, 38,
+ -1, 40, 41, 42, 43, 44, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 848, -1, -1, -1, -1, -1, -1,
+ 89, -1, -1, 858, 859, -1, -1, -1, -1, -1,
+ -1, -1, 867, -1, 103, -1, 871, -1, -1, -1,
+ -1, -1, -1, -1, 113, 623, -1, 116, 117, -1,
+ -1, -1, -1, 722, -1, -1, -1, -1, -1, -1,
+ 729, 730, -1, -1, -1, -1, -1, 136, 137, -1,
+ -1, -1, -1, 142, 143, 144, 145, 146, -1, 748,
+ 749, -1, -1, -1, -1, -1, -1, -1, -1, 758,
+ -1, -1, -1, -1, -1, 930, 765, -1, -1, -1,
+ -1, 936, -1, 938, -1, -1, 941, -1, 777, 778,
+ -1, -1, -1, -1, -1, -1, 785, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 800, 801, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 722, -1, -1, -1, -1, -1,
+ -1, 820, 730, 731, -1, -1, 825, -1, -1, 737,
+ -1, -1, -1, -1, 742, 743, -1, -1, -1, -1,
+ 748, 749, -1, -1, -1, -1, -1, -1, -1, -1,
+ 758, -1, -1, -1, -1, -1, -1, 765, -1, 858,
+ 859, -1, -1, -1, -1, -1, -1, -1, 867, 777,
+ 778, -1, 871, -1, -1, -1, -1, 785, -1, -1,
+ -1, -1, -1, -1, -1, -1, 44, -1, -1, -1,
+ -1, -1, 800, 801, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 84, -1, -1, 87,
+ 88, 930, -1, -1, -1, -1, -1, 936, -1, 938,
+ 848, -1, 941, 72, 73, 74, 75, 76, 77, 78,
+ 858, 859, 81, 82, -1, -1, -1, -1, 87, 88,
+ -1, -1, 120, 871, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, -1, -1, -1, -1, -1, -1,
+ -1, -1, 140, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 930, -1, -1, -1, -1, -1, 936, -1,
+ 938, 0, 1, 941, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, -1, -1, -1, -1, -1, -1,
+ 19, -1, 21, 22, 23, 24, -1, -1, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, -1, -1,
+ 39, -1, -1, -1, -1, -1, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, -1, 58,
+ 59, 60, -1, -1, 63, -1, -1, 66, 67, -1,
+ 69, 70, 71, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 90, -1, -1, 93, 94, -1, 96, 97, -1,
+ 99, -1, -1, 102, -1, 104, 105, 106, 107, 108,
+ 109, 0, -1, 112, 113, -1, -1, 116, 117, -1,
+ -1, -1, -1, -1, 13, 14, 15, 16, 17, 18,
+ -1, 20, -1, 132, 133, 134, -1, -1, 27, 28,
+ -1, -1, -1, -1, -1, 144, -1, 146, 37, 38,
+ -1, 40, 41, 42, 43, 44, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 57, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, -1, -1, 87, 88,
+ 89, -1, 91, 92, -1, -1, -1, -1, -1, 98,
+ -1, -1, -1, -1, 103, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 113, -1, -1, 116, 117, -1,
+ 119, 120, -1, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, -1, -1, 0, -1, -1, 137, 138,
+ 139, 140, -1, -1, 143, 144, 145, 146, 13, 14,
+ 15, 16, 17, 18, -1, 20, -1, -1, -1, -1,
+ -1, -1, 27, 28, -1, -1, -1, -1, -1, -1,
+ -1, -1, 37, 38, -1, 40, 41, 42, 43, 44,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
+ -1, -1, 87, 88, 89, -1, -1, 92, -1, -1,
+ -1, -1, -1, 98, -1, -1, -1, -1, 103, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 113, -1,
+ -1, 116, 117, -1, -1, 120, -1, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131, -1, -1, 0,
+ -1, -1, 137, 138, 139, 140, -1, 142, 143, 144,
+ 145, 146, 13, 14, 15, -1, 17, 18, -1, 20,
+ -1, -1, -1, -1, -1, 26, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 37, 38, -1, 40,
+ 41, 42, 43, 44, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, -1, -1, 87, 88, 89, -1,
+ 91, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 103, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 113, -1, -1, 116, 117, -1, 119, 120,
+ -1, 122, 123, 124, 125, 126, 127, 128, 129, 130,
+ 131, -1, -1, 0, -1, 136, 137, 138, -1, 140,
+ -1, -1, 143, 144, 145, 146, 13, 14, 15, -1,
+ 17, 18, -1, 20, -1, -1, -1, -1, -1, 26,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 37, 38, -1, 40, 41, 42, 43, 44, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, 84, -1, -1,
+ 87, 88, 89, -1, 91, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 103, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 113, -1, -1, 116,
+ 117, -1, 119, 120, -1, 122, 123, 124, 125, 126,
+ 127, 128, 129, 130, 131, -1, -1, 0, -1, 136,
+ 137, 138, -1, 140, -1, -1, 143, 144, 145, 146,
+ 13, 14, 15, -1, 17, 18, -1, 20, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 37, 38, -1, 40, 41, 42,
+ 43, 44, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, -1, -1, 87, 88, 89, -1, 91, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 103, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 113, -1, -1, 116, 117, -1, 119, 120, -1, 122,
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, -1,
+ -1, 0, -1, -1, 137, 138, -1, 140, -1, -1,
+ 143, 144, 145, 146, 13, 14, 15, -1, 17, 18,
+ -1, 20, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, 38,
+ -1, 40, 41, 42, 43, 44, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, -1, -1, 87, 88,
+ 89, -1, 91, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 103, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 113, -1, -1, 116, 117, -1,
+ 119, 120, -1, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, -1, -1, -1, -1, -1, 137, 138,
+ -1, 140, -1, -1, 143, 144, 145, 146, 1, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, -1, -1, 18, 19, -1, 21, 22,
+ 23, 24, -1, -1, -1, -1, -1, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, 45, -1, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, 69, 70, 71, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 90, -1, -1,
+ 93, 94, -1, 96, 97, -1, 99, -1, -1, 102,
+ -1, 104, 105, 106, 107, 108, 109, -1, -1, 112,
+ 113, -1, -1, 116, 117, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 132,
+ 133, 134, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 144, 1, 146, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, -1, -1, 15, -1, 17, 18,
+ 19, -1, 21, 22, 23, 24, -1, -1, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, -1, -1,
+ 39, -1, -1, -1, -1, -1, 45, -1, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, -1, 58,
+ 59, 60, -1, -1, 63, -1, -1, 66, 67, -1,
+ 69, 70, 71, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 90, -1, -1, 93, 94, -1, 96, 97, -1,
+ 99, -1, -1, 102, -1, 104, 105, 106, 107, 108,
+ 109, -1, -1, 112, 113, -1, -1, 116, 117, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 132, 133, 134, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 144, 1, 146, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, -1, -1,
+ 15, -1, -1, 18, 19, 20, 21, 22, 23, 24,
+ -1, -1, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, -1, 39, -1, -1, -1, -1, -1,
+ 45, -1, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, -1, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, 69, 70, 71, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 90, -1, -1, 93, 94,
+ -1, 96, 97, -1, 99, -1, -1, 102, -1, 104,
+ 105, 106, 107, 108, 109, -1, -1, 112, 113, -1,
+ -1, 116, 117, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 132, 133, 134,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 144,
+ 1, 146, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, -1, -1, 15, -1, -1, 18, 19, -1,
+ 21, 22, 23, 24, -1, -1, -1, -1, -1, 30,
+ 31, 32, 33, 34, 35, 36, -1, -1, 39, -1,
+ -1, -1, -1, -1, 45, -1, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, -1, 58, 59, 60,
+ -1, -1, 63, -1, -1, 66, 67, -1, 69, 70,
+ 71, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 90,
+ -1, -1, 93, 94, -1, 96, 97, -1, 99, -1,
+ -1, 102, -1, 104, 105, 106, 107, 108, 109, -1,
+ -1, 112, 113, -1, -1, 116, 117, 1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, -1,
+ -1, 132, 133, 134, -1, 19, -1, 21, 22, 23,
+ 24, -1, -1, 144, -1, 146, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, 99, -1, -1, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, 113,
+ -1, -1, 116, 117, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 132, 133,
+ 134, -1, -1, 137, -1, -1, -1, -1, -1, -1,
+ 144, 1, 146, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, -1, 14, 15, -1, -1, -1, 19,
+ -1, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, 45, -1, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, 99,
+ -1, -1, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, 113, -1, -1, 116, 117, 1, -1,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+ -1, -1, 132, 133, 134, -1, 19, -1, 21, 22,
+ 23, 24, -1, -1, 144, -1, 146, 30, 31, 32,
+ 33, 34, 35, 36, -1, -1, 39, -1, -1, -1,
+ -1, -1, 45, -1, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, -1, -1,
+ 63, -1, -1, 66, 67, -1, 69, 70, 71, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 90, -1, -1,
+ 93, 94, -1, 96, 97, -1, 99, -1, -1, 102,
+ -1, 104, 105, 106, 107, 108, 109, -1, -1, 112,
+ 113, -1, -1, 116, 117, 1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, 12, -1, -1, 132,
+ 133, 134, -1, 19, -1, 21, 22, 23, 24, -1,
+ 143, 144, -1, 146, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, 45,
+ -1, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, 71, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 90, -1, -1, 93, 94, -1,
+ 96, 97, -1, 99, -1, -1, 102, -1, 104, 105,
+ 106, 107, 108, 109, -1, -1, 112, 113, -1, -1,
+ 116, 117, 1, -1, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, -1, -1, 132, 133, 134, -1,
+ 19, -1, 21, 22, 23, 24, -1, 143, 144, -1,
+ 146, 30, 31, 32, 33, 34, 35, 36, -1, -1,
+ 39, -1, -1, -1, -1, -1, 45, -1, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, -1, 58,
+ 59, 60, -1, -1, 63, -1, -1, 66, 67, -1,
+ 69, 70, 71, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 90, -1, -1, 93, 94, -1, 96, 97, -1,
+ 99, -1, -1, 102, -1, 104, 105, 106, 107, 108,
+ 109, -1, -1, 112, 113, -1, -1, 116, 117, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 132, 133, 134, -1, -1, 137, -1,
+ -1, -1, -1, -1, -1, 144, 1, 146, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, -1, -1,
+ 15, -1, -1, -1, 19, -1, 21, 22, 23, 24,
+ -1, -1, -1, -1, -1, 30, 31, 32, 33, 34,
+ 35, 36, -1, -1, 39, -1, -1, -1, -1, -1,
+ 45, -1, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, -1, 58, 59, 60, -1, -1, 63, -1,
+ -1, 66, 67, -1, 69, 70, 71, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 90, -1, -1, 93, 94,
+ -1, 96, 97, -1, 99, -1, -1, 102, -1, 104,
+ 105, 106, 107, 108, 109, -1, -1, 112, 113, -1,
+ -1, 116, 117, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, -1, -1, 132, 133, 134,
+ -1, 19, -1, 21, 22, 23, 24, -1, -1, 144,
+ -1, 146, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, 71, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 90, -1, -1, 93, 94, -1, 96, 97,
+ -1, 99, -1, -1, 102, -1, 104, 105, 106, 107,
+ 108, 109, -1, -1, 112, 113, -1, -1, 116, 117,
+ -1, -1, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, -1, -1, 132, 133, 134, -1, 19, -1,
+ 21, 22, 23, 24, -1, -1, 144, -1, 146, 30,
+ 31, 32, 33, 34, 35, 36, -1, -1, 39, -1,
+ -1, -1, -1, -1, 45, -1, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, -1, 58, 59, 60,
+ -1, -1, 63, -1, -1, 66, 67, -1, 69, 70,
+ 71, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 90,
+ -1, -1, 93, 94, -1, 96, 97, -1, 99, -1,
+ -1, 102, -1, 104, 105, 106, 107, 108, 109, -1,
+ -1, 112, 113, -1, -1, 116, 117, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, 132, 133, 134, -1, 19, -1, 21, 22, 23,
+ 24, -1, -1, 144, -1, 146, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, -1, -1, -1, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, 113,
+ -1, -1, 116, 117, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 132, 133,
+ 134, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 144, -1, 146, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ -1, -1, -1, -1, -1, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, -1,
+ -1, 81, 82, -1, -1, 85, 86, 87, 88, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 99,
+ 100, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, -1, 133, 134, -1, -1, -1, -1, -1,
+ -1, 141, 142, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, -1, -1, -1, 19,
+ -1, 21, 22, 23, 24, -1, 26, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, 99,
+ 100, 101, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 132, 133, 134, -1, 136, -1, -1, -1,
+ -1, -1, 142, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, -1, -1, -1, 19,
+ -1, 21, 22, 23, 24, -1, 26, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, 99,
+ 100, 101, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 132, 133, 134, -1, 136, -1, -1, -1,
+ -1, -1, 142, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, -1, -1, -1, 19,
+ -1, 21, 22, 23, 24, -1, 26, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, 99,
+ 100, 101, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, -1, -1, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, 132, 133, 134, 19, 136, 21, 22, 23,
+ 24, -1, 142, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, 91, -1, 93,
+ 94, -1, 96, 97, -1, 99, 100, 101, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, -1,
+ -1, -1, -1, -1, -1, 119, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, -1, -1, -1, 132, 133,
+ 134, -1, 19, -1, 21, 22, 23, 24, 142, -1,
+ -1, -1, -1, 30, 31, 32, 33, 34, 35, 36,
+ -1, -1, 39, -1, -1, -1, -1, -1, -1, -1,
+ -1, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, -1, -1, 63, -1, -1, 66,
+ 67, -1, 69, 70, 71, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 90, 91, -1, 93, 94, -1, 96,
+ 97, -1, 99, 100, 101, 102, -1, 104, 105, 106,
+ 107, 108, 109, -1, -1, 112, -1, -1, -1, -1,
+ -1, -1, 119, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, 132, 133, 134, -1, 19,
+ -1, 21, 22, 23, 24, 142, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, 99,
+ 100, 101, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, -1, -1, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, 132, 133, 134, 19, -1, 21, 22, 23,
+ 24, -1, 142, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, 99, 100, 101, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, -1,
+ -1, -1, -1, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, 132, 133,
+ 134, 19, -1, 21, 22, 23, 24, -1, 142, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, 71, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 90, -1, -1, 93, 94, -1, 96, 97,
+ -1, 99, 100, 101, 102, -1, 104, 105, 106, 107,
+ 108, 109, -1, -1, 112, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 132, 133, 134, -1, -1, -1,
+ -1, -1, -1, -1, 142, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, 37,
+ 38, 39, -1, -1, -1, -1, -1, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ -1, -1, -1, -1, -1, 63, -1, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, -1, -1, 81, 82, -1, -1, 85, 86, 87,
+ 88, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 99, 100, -1, -1, -1, -1, -1, -1, -1,
+ 108, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, -1, 133, 134, -1, -1, -1,
+ -1, -1, -1, 141, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, -1, -1,
+ -1, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, -1, -1, -1, -1, -1, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, -1, -1,
+ -1, -1, -1, -1, 63, -1, -1, -1, -1, -1,
+ -1, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ -1, -1, 81, 82, -1, -1, 85, 86, 87, 88,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 99, 100, -1, -1, -1, -1, -1, -1, -1, 108,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, -1, 133, 134, -1, -1, -1, -1,
+ -1, -1, 141, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ -1, -1, -1, -1, -1, 45, 46, 47, 48, 49,
+ 50, 51, 52, -1, -1, 55, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, -1,
+ -1, 81, 82, -1, -1, 85, 86, 87, 88, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 99,
+ 100, -1, -1, -1, 104, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, -1, 133, 134, -1, -1, -1, -1, -1,
+ -1, 141, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, -1, -1, -1, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, -1,
+ -1, -1, -1, -1, 45, 46, 47, 48, 49, 50,
+ 51, 52, -1, -1, 55, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, -1, -1,
+ 81, 82, -1, -1, 85, 86, 87, 88, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 99, 100,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 122, 123, 124, 125, 126, 127, 128, 129, 130,
+ 131, -1, 133, 134, -1, -1, -1, -1, -1, -1,
+ 141, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, -1, -1, -1, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 90, -1,
+ -1, 93, 94, -1, 96, 97, -1, -1, -1, -1,
+ 102, -1, 104, 105, 106, 107, 108, 109, -1, -1,
+ 112, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, -1, -1, -1, 19,
+ 132, 21, 22, 23, 24, -1, -1, -1, 140, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, -1,
+ -1, -1, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, -1, -1, -1, -1, -1,
+ -1, 19, 132, 21, 22, 23, 24, -1, -1, -1,
+ 140, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, 71, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 90, -1, -1, 93, 94, -1, 96, 97,
+ -1, 99, -1, -1, 102, -1, 104, 105, 106, 107,
+ 108, 109, -1, -1, 112, -1, -1, -1, -1, -1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, 132, 133, 134, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, 71,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 84, -1, -1, -1, -1, -1, 90, -1,
+ -1, 93, 94, -1, 96, 97, -1, 99, 100, 101,
+ 102, -1, 104, 105, 106, 107, 108, 109, -1, -1,
+ 112, -1, -1, -1, -1, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, 12, -1, -1, -1,
+ 132, 133, 134, 19, -1, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, 45,
+ -1, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, 71, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 90, -1, -1, 93, 94, -1,
+ 96, 97, -1, 99, -1, -1, 102, -1, 104, 105,
+ 106, 107, 108, 109, -1, -1, 112, -1, -1, -1,
+ -1, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, 132, 133, 134, 19,
+ -1, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, 99,
+ 100, 101, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, -1, -1, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, 132, 133, 134, 19, -1, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, 99, 100, 101, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, -1,
+ -1, -1, -1, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, 132, 133,
+ 134, 19, -1, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, 71, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 90, -1, -1, 93, 94, -1, 96, 97,
+ -1, 99, 100, -1, 102, -1, 104, 105, 106, 107,
+ 108, 109, -1, -1, 112, -1, -1, -1, -1, -1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, 132, 133, 134, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, 71,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 90, -1,
+ -1, 93, 94, -1, 96, 97, -1, -1, 100, 101,
+ 102, -1, 104, 105, 106, 107, 108, 109, -1, -1,
+ 112, -1, -1, -1, -1, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ 132, 133, 134, 19, -1, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, -1,
+ -1, -1, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, 71, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 90, -1, -1, 93, 94, -1,
+ 96, 97, -1, 99, 100, -1, 102, -1, 104, 105,
+ 106, 107, 108, 109, -1, -1, 112, -1, -1, -1,
+ -1, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, 132, 133, 134, 19,
+ -1, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, -1,
+ 100, -1, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, -1, -1, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, 132, 133, 134, 19, -1, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, 99, -1, -1, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, -1,
+ -1, -1, -1, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, 132, 133,
+ 134, 19, -1, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, 71, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 90, -1, -1, 93, 94, -1, 96, 97,
+ -1, 99, -1, -1, 102, -1, 104, 105, 106, 107,
+ 108, 109, -1, -1, 112, -1, -1, -1, -1, -1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, 132, 133, 134, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, 71,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 90, -1,
+ -1, 93, 94, -1, 96, 97, -1, 99, -1, -1,
+ 102, -1, 104, 105, 106, 107, 108, 109, -1, -1,
+ 112, -1, -1, -1, -1, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ 132, 133, 134, 19, -1, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, -1,
+ -1, -1, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, 70, 71, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 90, -1, -1, 93, 94, -1,
+ 96, 97, -1, 99, -1, -1, 102, -1, 104, 105,
+ 106, 107, 108, 109, -1, -1, 112, -1, -1, -1,
+ -1, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, 132, 133, 134, 19,
+ -1, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ 70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, 99,
+ -1, -1, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, -1, -1, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, 132, 133, 134, 19, -1, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, -1, -1, -1, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, -1,
+ -1, -1, -1, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, 132, 133,
+ 134, 19, -1, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, 70, 71, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 90, -1, -1, 93, 94, -1, 96, 97,
+ -1, -1, -1, -1, 102, -1, 104, 105, 106, 107,
+ 108, 109, -1, -1, 112, -1, -1, -1, -1, -1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, 132, 133, 134, 19, -1, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, 70, 71,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 90, -1,
+ -1, 93, 94, -1, 96, 97, -1, -1, -1, -1,
+ 102, -1, 104, 105, 106, 107, 108, 109, -1, -1,
+ 112, -1, -1, -1, -1, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ 132, 133, 134, 19, -1, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, -1,
+ -1, -1, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 87, -1, -1, 90, -1, -1, 93, 94, -1,
+ 96, 97, -1, -1, -1, -1, 102, -1, 104, 105,
+ 106, 107, 108, 109, -1, -1, 112, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, -1, -1, -1, 19, 132, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, 99, -1, -1, 102, -1,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, -1,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, -1, -1, -1, 19, 132, 21,
+ 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
+ -1, -1, -1, -1, -1, -1, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, 63, -1, -1, 66, 67, -1, 69, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 90, -1,
+ -1, 93, 94, -1, 96, 97, -1, 99, -1, -1,
+ 102, -1, 104, 105, 106, 107, 108, 109, -1, -1,
+ 112, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, -1, -1, -1, -1, 19,
+ 132, 21, 22, 23, 24, -1, -1, -1, -1, -1,
+ 30, 31, 32, 33, 34, 35, 36, -1, -1, 39,
+ -1, -1, -1, -1, -1, -1, -1, -1, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, -1, -1, 63, -1, -1, 66, 67, -1, 69,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 90, -1, -1, 93, 94, -1, 96, 97, -1, -1,
+ -1, -1, 102, -1, 104, 105, 106, 107, 108, 109,
+ -1, -1, 112, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, -1, -1,
+ -1, 19, 132, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, 30, 31, 32, 33, 34, 35, 36, -1,
+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, -1, -1, 63, -1, -1, 66, 67,
+ -1, 69, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 90, -1, -1, 93, 94, -1, 96, 97,
+ -1, -1, -1, -1, 102, -1, 104, 105, 106, 107,
+ 108, 109, -1, -1, 112, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ -1, -1, -1, 19, 132, 21, 22, 23, 24, -1,
+ -1, -1, -1, -1, 30, 31, 32, 33, 34, 35,
+ 36, -1, -1, 39, -1, -1, -1, -1, -1, -1,
+ -1, -1, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, -1, -1, 63, -1, -1,
+ 66, 67, -1, 69, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 90, -1, -1, 93, 94, -1,
+ 96, 97, -1, -1, -1, -1, 102, -1, 104, 105,
+ 106, 107, 108, 109, -1, -1, 112, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, -1, -1, -1, 19, 132, 21, 22, 23,
+ 24, -1, -1, -1, -1, -1, 30, 31, 32, 33,
+ 34, 35, 36, -1, -1, 39, -1, -1, -1, -1,
+ -1, -1, -1, -1, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, -1, -1, 63,
+ -1, -1, 66, 67, -1, 69, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 90, -1, -1, 93,
+ 94, -1, 96, 97, -1, 51, 52, -1, 102, 55,
+ 104, 105, 106, 107, 108, 109, -1, -1, 112, -1,
+ -1, -1, -1, -1, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, -1, -1, 81, 82, -1, 132, 85,
+ 86, 87, 88, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 99, 100, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 122, 123, 124, 125,
+ 126, 127, 128, 129, 130, 131, -1, 133, 134, 51,
+ 52, -1, -1, 55, -1, 141, 142, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, -1, -1, 81,
+ 82, -1, -1, 85, 86, 87, 88, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 99, 100, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ -1, 133, 134, 51, 52, -1, -1, 55, -1, 141,
+ 142, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, -1, -1, 81, 82, -1, -1, 85, 86, 87,
+ 88, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 99, 100, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, -1, 133, 134, 51, 52, -1,
+ -1, 55, -1, 141, 142, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, -1, -1, 81, 82, -1,
+ -1, 85, 86, 87, 88, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 99, 100, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 122, 123,
+ 124, 125, 126, 127, 128, 129, 130, 131, -1, 133,
+ 134, 51, 52, -1, -1, 55, -1, 141, 142, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, -1,
+ -1, 81, 82, -1, -1, 85, 86, 87, 88, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 99,
+ 100, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, -1, 133, 134, 51, 52, -1, -1, 55,
+ -1, 141, 142, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, -1, -1, 81, 82, -1, -1, 85,
+ 86, 87, 88, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 99, 100, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 122, 123, 124, 125,
+ 126, 127, 128, 129, 130, 131, -1, 133, 134, 51,
+ 52, -1, -1, 55, -1, 141, 142, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, -1, -1, 81,
+ 82, -1, -1, 85, 86, 87, 88, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 99, 100, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ -1, 133, 134, 51, 52, -1, -1, 55, -1, 141,
+ 142, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, -1, -1, 81, 82, -1, -1, 85, 86, 87,
+ 88, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 99, 100, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, -1, 133, 134, 51, 52, -1,
+ -1, 55, -1, 141, 142, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, -1, -1, 81, 82, -1,
+ -1, 85, 86, 87, 88, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 99, 100, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 122, 123,
+ 124, 125, 126, 127, 128, 129, 130, 131, -1, 133,
+ 134, 51, 52, -1, -1, 55, -1, 141, 142, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, -1,
+ -1, 81, 82, -1, -1, 85, 86, 87, 88, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 99,
+ 100, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, -1, 133, 134, 51, 52, -1, -1, 55,
+ -1, 141, 142, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, -1, -1, 81, 82, -1, -1, 85,
+ 86, 87, 88, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 99, 100, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 122, 123, 124, 125,
+ 126, 127, 128, 129, 130, 131, -1, 133, 134, 51,
+ 52, -1, -1, 55, -1, 141, 142, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, -1, -1, 81,
+ 82, -1, -1, 85, 86, 87, 88, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 99, 100, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ -1, 133, 134, 51, 52, -1, -1, 55, -1, 141,
+ 142, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, -1, -1, 81, 82, -1, -1, 85, 86, 87,
+ 88, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 99, 100, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, -1, 133, 134, 51, 52, -1,
+ -1, 55, -1, 141, 142, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, -1, -1, 81, 82, -1,
+ -1, 85, 86, 87, 88, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 99, 100, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 122, 123,
+ 124, 125, 126, 127, 128, 129, 130, 131, -1, 133,
+ 134, 51, 52, -1, -1, 55, -1, 141, 142, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, -1,
+ -1, 81, 82, -1, -1, 85, 86, 87, 88, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 99,
+ 100, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, -1, 133, 134, 51, 52, -1, -1, 55,
+ -1, 141, 142, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, -1, -1, 81, 82, -1, -1, 85,
+ 86, 87, 88, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 99, 100, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 44, -1,
+ -1, -1, -1, -1, -1, -1, 122, 123, 124, 125,
+ 126, 127, 128, 129, 130, 131, -1, 133, 134, -1,
+ -1, -1, -1, -1, -1, 141, 72, 73, 74, 75,
+ 76, 77, 78, 79, 80, 81, 82, 83, 84, -1,
+ -1, 87, 88, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, -1, -1, 87, 88,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 120, -1, 122, 123, 124, 125,
+ 126, 127, 128, 129, 130, 131, -1, -1, -1, -1,
+ -1, 120, -1, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, -1, 146, 87, 88,
+ -1, -1, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, -1, -1, 87, 88, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 120, -1, 122, 123, 124, 125, 126, 127, 128,
+ 129, 130, 131, -1, -1, -1, -1, -1, -1, -1,
+ 120, 140, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, -1, -1, -1, -1, -1, -1, -1, -1,
+ 140, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, -1, -1, 87, 88, -1, -1,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, 84, -1, -1, 87, 88, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 120,
+ -1, 122, 123, 124, 125, 126, 127, 128, 129, 130,
+ 131, -1, -1, -1, -1, -1, -1, -1, 120, 140,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ -1, -1, -1, -1, -1, -1, -1, -1, 140, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, -1, -1, 87, 88, -1, -1, -1, 92,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, 84, -1, -1, 87, 88, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 120, -1, 122,
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 120, -1,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, 84, -1, -1, 87, 88, 72, 73, 74,
+ 75, 76, 77, 78, 79, -1, 81, 82, -1, -1,
+ -1, -1, 87, 88, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ -1, -1, -1, -1, -1, -1, -1, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131, 72, 73, 74,
+ 75, 76, 77, 78, -1, -1, 81, 82, -1, -1,
+ -1, -1, 87, 88, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131
+};
+
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_int16 yystos[] =
+{
+ 0, 148, 149, 0, 1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 19, 21, 22, 23, 24,
+ 30, 31, 32, 33, 34, 35, 36, 39, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 58, 59, 60, 63, 66, 67, 69, 70, 71, 90,
+ 93, 94, 96, 97, 99, 102, 104, 105, 106, 107,
+ 108, 109, 112, 132, 133, 134, 150, 151, 152, 157,
+ 159, 161, 163, 164, 167, 168, 170, 171, 172, 174,
+ 175, 184, 198, 219, 240, 241, 251, 252, 253, 257,
+ 258, 259, 265, 266, 267, 269, 270, 271, 272, 273,
+ 274, 309, 322, 152, 21, 22, 30, 31, 32, 39,
+ 51, 55, 69, 87, 90, 93, 132, 176, 177, 198,
+ 219, 271, 274, 309, 177, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 30,
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 45,
+ 46, 47, 48, 49, 50, 51, 52, 55, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 81, 82, 85,
+ 86, 87, 88, 99, 100, 122, 123, 124, 125, 126,
+ 127, 128, 129, 130, 131, 133, 134, 141, 142, 178,
+ 182, 183, 273, 303, 199, 90, 161, 162, 175, 219,
+ 271, 272, 274, 162, 205, 207, 69, 90, 168, 175,
+ 219, 224, 271, 274, 33, 34, 35, 36, 48, 49,
+ 50, 51, 55, 104, 178, 179, 180, 267, 113, 116,
+ 117, 144, 146, 162, 261, 262, 263, 315, 319, 320,
+ 321, 51, 99, 100, 101, 133, 167, 184, 190, 193,
+ 196, 253, 306, 308, 190, 190, 142, 187, 188, 191,
+ 192, 322, 187, 191, 142, 316, 320, 179, 153, 136,
+ 184, 219, 184, 55, 1, 93, 155, 156, 157, 169,
+ 170, 322, 200, 202, 185, 196, 306, 322, 184, 305,
+ 306, 322, 90, 140, 174, 219, 271, 274, 203, 53,
+ 54, 56, 63, 108, 178, 268, 62, 64, 65, 114,
+ 115, 254, 255, 63, 254, 63, 254, 63, 254, 61,
+ 254, 58, 59, 163, 184, 184, 315, 321, 40, 41,
+ 42, 43, 44, 37, 38, 28, 238, 119, 140, 93,
+ 99, 171, 119, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 87, 88, 120, 122,
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, 89,
+ 103, 138, 145, 313, 89, 313, 314, 26, 136, 242,
+ 253, 91, 91, 187, 191, 242, 161, 51, 55, 176,
+ 58, 59, 123, 275, 89, 138, 313, 214, 304, 215,
+ 89, 145, 312, 154, 155, 55, 16, 220, 319, 119,
+ 89, 138, 313, 91, 91, 220, 162, 162, 55, 89,
+ 138, 313, 25, 108, 140, 264, 315, 113, 263, 20,
+ 245, 319, 57, 307, 184, 184, 184, 92, 140, 194,
+ 195, 322, 307, 194, 195, 84, 189, 190, 196, 306,
+ 322, 190, 161, 315, 317, 161, 158, 136, 155, 89,
+ 313, 91, 157, 169, 143, 315, 321, 317, 157, 317,
+ 139, 195, 318, 321, 195, 318, 137, 318, 55, 171,
+ 172, 173, 140, 89, 138, 313, 51, 53, 54, 55,
+ 56, 69, 72, 93, 99, 100, 101, 126, 129, 142,
+ 236, 278, 279, 282, 283, 284, 285, 287, 288, 289,
+ 290, 292, 293, 294, 297, 298, 299, 300, 301, 63,
+ 254, 256, 260, 261, 62, 255, 63, 63, 63, 61,
+ 72, 72, 152, 162, 162, 162, 162, 157, 161, 161,
+ 239, 99, 163, 184, 196, 197, 169, 140, 174, 140,
+ 159, 160, 163, 175, 184, 186, 197, 219, 274, 184,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 51, 52, 55, 182, 187,
+ 310, 311, 189, 51, 52, 55, 182, 187, 310, 51,
+ 55, 310, 244, 243, 160, 184, 186, 160, 186, 98,
+ 165, 212, 276, 211, 51, 55, 176, 310, 189, 310,
+ 154, 161, 216, 217, 15, 13, 247, 322, 155, 16,
+ 51, 55, 189, 51, 55, 155, 27, 221, 319, 221,
+ 51, 55, 189, 51, 55, 209, 181, 155, 245, 184,
+ 196, 15, 260, 184, 184, 316, 99, 184, 193, 306,
+ 184, 308, 317, 143, 315, 195, 195, 317, 143, 179,
+ 150, 137, 186, 317, 157, 201, 306, 171, 173, 51,
+ 55, 189, 51, 55, 57, 119, 291, 287, 204, 184,
+ 140, 302, 322, 51, 140, 302, 140, 286, 184, 140,
+ 286, 51, 140, 286, 51, 63, 155, 261, 184, 184,
+ 80, 124, 230, 231, 322, 184, 195, 317, 173, 140,
+ 44, 119, 44, 89, 138, 313, 316, 91, 91, 187,
+ 191, 139, 91, 91, 188, 191, 188, 191, 230, 230,
+ 166, 319, 162, 154, 139, 15, 317, 142, 277, 287,
+ 178, 184, 197, 248, 322, 18, 223, 322, 17, 222,
+ 223, 91, 91, 139, 91, 91, 223, 206, 208, 139,
+ 162, 179, 137, 15, 195, 220, 260, 184, 194, 306,
+ 137, 317, 318, 139, 51, 99, 225, 292, 233, 316,
+ 29, 111, 237, 51, 279, 284, 301, 285, 290, 297,
+ 299, 292, 294, 299, 51, 292, 137, 227, 229, 232,
+ 278, 280, 281, 284, 292, 293, 295, 296, 299, 301,
+ 154, 99, 184, 173, 157, 184, 51, 55, 189, 51,
+ 55, 57, 121, 160, 186, 163, 186, 165, 91, 160,
+ 186, 160, 186, 165, 242, 238, 154, 155, 230, 213,
+ 319, 15, 84, 287, 154, 319, 218, 92, 249, 322,
+ 155, 14, 250, 322, 162, 15, 91, 15, 155, 155,
+ 221, 184, 155, 195, 140, 289, 317, 140, 143, 144,
+ 154, 155, 302, 140, 286, 140, 286, 140, 286, 140,
+ 286, 286, 233, 233, 90, 219, 140, 302, 302, 140,
+ 228, 219, 140, 228, 140, 228, 15, 184, 139, 184,
+ 184, 160, 186, 15, 137, 155, 154, 317, 317, 15,
+ 277, 90, 175, 219, 271, 274, 220, 155, 220, 15,
+ 15, 210, 223, 245, 246, 226, 140, 99, 51, 234,
+ 235, 288, 15, 137, 292, 299, 292, 292, 124, 124,
+ 55, 89, 280, 284, 140, 227, 228, 296, 299, 292,
+ 295, 299, 292, 137, 15, 154, 55, 89, 138, 313,
+ 155, 155, 155, 292, 292, 140, 289, 140, 316, 286,
+ 140, 286, 286, 286, 51, 55, 302, 140, 228, 140,
+ 228, 140, 228, 140, 228, 228, 15, 51, 55, 189,
+ 51, 55, 247, 222, 15, 140, 292, 140, 235, 292,
+ 292, 299, 292, 292, 139, 292, 286, 228, 140, 228,
+ 228, 228, 292, 228
+};
+
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_int16 yyr1[] =
+{
+ 0, 147, 149, 148, 150, 151, 151, 151, 151, 152,
+ 153, 152, 154, 155, 156, 156, 156, 156, 158, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 159, 159, 159, 159, 159, 159, 159,
+ 159, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+ 162, 163, 163, 164, 164, 166, 165, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 168, 168,
+ 169, 169, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 171, 171, 172, 172, 173, 173, 174, 174,
+ 174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 176, 176, 177, 177, 177,
+ 178, 178, 178, 178, 178, 179, 179, 180, 181, 180,
+ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 185, 185, 185, 185, 186, 186, 187,
+ 187, 188, 188, 189, 189, 189, 189, 189, 190, 190,
+ 190, 190, 190, 192, 191, 193, 194, 194, 195, 195,
+ 196, 196, 196, 196, 197, 197, 197, 198, 198, 198,
+ 198, 198, 198, 198, 198, 198, 199, 198, 200, 201,
+ 198, 202, 198, 198, 198, 198, 198, 198, 198, 198,
+ 198, 198, 198, 198, 198, 203, 204, 198, 198, 198,
+ 205, 206, 198, 207, 208, 198, 198, 198, 209, 210,
+ 198, 211, 198, 212, 213, 198, 214, 198, 215, 216,
+ 198, 217, 218, 198, 198, 198, 198, 198, 219, 220,
+ 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
+ 225, 225, 225, 225, 225, 225, 225, 225, 226, 225,
+ 227, 227, 227, 227, 228, 228, 229, 229, 229, 229,
+ 229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
+ 229, 230, 230, 232, 231, 231, 231, 233, 233, 234,
+ 234, 235, 235, 236, 236, 237, 237, 239, 238, 240,
+ 240, 240, 240, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 243, 242, 244, 242, 245, 246, 246, 247,
+ 247, 248, 248, 248, 249, 249, 250, 250, 251, 251,
+ 251, 251, 252, 252, 253, 253, 253, 253, 254, 254,
+ 255, 256, 255, 255, 255, 257, 257, 258, 258, 259,
+ 260, 260, 261, 261, 262, 262, 263, 264, 263, 265,
+ 265, 266, 266, 267, 268, 268, 268, 268, 268, 268,
+ 269, 269, 270, 270, 270, 270, 271, 271, 271, 271,
+ 271, 272, 272, 273, 273, 273, 273, 273, 273, 273,
+ 273, 274, 274, 275, 276, 275, 277, 277, 277, 278,
+ 279, 279, 280, 280, 281, 281, 282, 282, 283, 283,
+ 284, 284, 285, 285, 285, 285, 286, 286, 287, 287,
+ 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+ 287, 287, 287, 288, 288, 288, 288, 288, 289, 289,
+ 290, 291, 290, 292, 292, 293, 294, 295, 296, 296,
+ 297, 297, 298, 298, 299, 299, 300, 300, 301, 302,
+ 302, 303, 304, 303, 305, 305, 306, 306, 307, 307,
+ 308, 308, 308, 308, 309, 309, 309, 310, 310, 310,
+ 310, 311, 311, 311, 312, 312, 313, 313, 314, 314,
+ 315, 315, 316, 316, 317, 318, 318, 318, 319, 319,
+ 319, 320, 321, 321, 322
+};
+
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 0, 2, 2, 1, 1, 3, 2, 1,
+ 0, 5, 4, 2, 1, 1, 3, 2, 0, 4,
+ 2, 3, 3, 3, 3, 3, 4, 1, 3, 3,
+ 3, 3, 1, 3, 3, 6, 5, 5, 5, 5,
+ 3, 1, 3, 1, 1, 3, 3, 3, 2, 1,
+ 1, 1, 1, 1, 4, 0, 5, 2, 3, 4,
+ 5, 4, 5, 2, 2, 2, 2, 2, 1, 3,
+ 1, 3, 1, 2, 3, 5, 2, 4, 2, 4,
+ 1, 3, 1, 3, 2, 3, 1, 2, 1, 4,
+ 3, 3, 3, 3, 2, 1, 1, 4, 3, 3,
+ 3, 3, 2, 1, 1, 1, 1, 2, 1, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 4,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 3, 6, 5, 5, 5, 5, 4, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 4, 2,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 2, 2, 3, 3, 3, 3,
+ 6, 6, 1, 1, 2, 4, 2, 1, 3, 3,
+ 3, 1, 1, 1, 2, 2, 4, 2, 1, 2,
+ 2, 4, 1, 0, 2, 2, 2, 1, 1, 3,
+ 1, 2, 3, 4, 3, 4, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 4, 0, 0,
+ 5, 0, 3, 3, 3, 2, 3, 3, 1, 2,
+ 4, 3, 2, 1, 2, 0, 0, 5, 6, 6,
+ 0, 0, 7, 0, 0, 7, 5, 4, 0, 0,
+ 9, 0, 6, 0, 0, 8, 0, 5, 0, 0,
+ 7, 0, 0, 9, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 1, 1, 5, 1, 2, 1, 1,
+ 1, 4, 6, 3, 5, 2, 4, 1, 0, 4,
+ 4, 2, 2, 1, 2, 0, 6, 8, 4, 6,
+ 4, 3, 6, 2, 4, 6, 2, 4, 2, 4,
+ 1, 1, 1, 0, 4, 1, 4, 1, 4, 1,
+ 3, 1, 1, 4, 1, 3, 3, 0, 5, 2,
+ 4, 5, 5, 2, 4, 4, 3, 3, 3, 2,
+ 1, 4, 0, 5, 0, 5, 5, 1, 1, 6,
+ 1, 1, 1, 1, 2, 1, 2, 1, 1, 1,
+ 1, 1, 1, 2, 1, 1, 2, 3, 1, 2,
+ 1, 0, 4, 1, 2, 2, 3, 2, 3, 1,
+ 1, 2, 1, 2, 1, 2, 1, 0, 4, 2,
+ 3, 1, 4, 2, 1, 1, 1, 1, 1, 2,
+ 2, 3, 1, 1, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 4, 3, 3, 2, 2,
+ 2, 1, 2, 1, 1, 3, 1, 3, 1, 1,
+ 2, 1, 4, 2, 2, 1, 2, 0, 6, 8,
+ 4, 6, 4, 6, 2, 4, 6, 2, 4, 2,
+ 4, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 4, 1, 3, 2, 2, 2, 1, 3,
+ 1, 3, 1, 1, 2, 1, 1, 1, 2, 2,
+ 1, 1, 0, 4, 1, 2, 1, 3, 1, 2,
+ 3, 3, 3, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 0, 1, 2, 0, 1, 1, 1, 1,
+ 1, 1, 1, 2, 0
+};
+
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (p, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Error token number */
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value, p); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, parser_state *p)
+{
+ FILE *yyoutput = yyo;
+ YYUSE (yyoutput);
+ YYUSE (p);
+ if (!yyvaluep)
+ return;
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
+# endif
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YYUSE (yytype);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, parser_state *p)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+
+ yy_symbol_value_print (yyo, yytype, yyvaluep, p);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, parser_state *p)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ yystos[+yyssp[yyi + 1 - yynrhs]],
+ &yyvsp[(yyi + 1) - (yynrhs)]
+ , p);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule, p); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
+# else
+/* Return the length of YYSTR. */
+static YYPTRDIFF_T
+yystrlen (const char *yystr)
+{
+ YYPTRDIFF_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYPTRDIFF_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ YYPTRDIFF_T yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ else
+ goto append;
+
+ append:
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (yyres)
+ return yystpcpy (yyres, yystr) - yyres;
+ else
+ return yystrlen (yystr);
+}
+# endif
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+ about the unexpected token YYTOKEN for the state stack whose top is
+ YYSSP.
+
+ Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
+ not large enough to hold the message. In that case, also set
+ *YYMSG_ALLOC to the required number of bytes. Return 2 if the
+ required number of bytes is too large to store. */
+static int
+yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
+ yy_state_t *yyssp, int yytoken)
+{
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ /* Internationalized format string. */
+ const char *yyformat = YY_NULLPTR;
+ /* Arguments of yyformat: reported tokens (one for the "unexpected",
+ one per "expected"). */
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ /* Actual size of YYARG. */
+ int yycount = 0;
+ /* Cumulated lengths of YYARG. */
+ YYPTRDIFF_T yysize = 0;
+
+ /* There are many possibilities here to consider:
+ - If this state is a consistent state with a default action, then
+ the only way this function was invoked is if the default action
+ is an error action. In that case, don't check for expected
+ tokens because there are none.
+ - The only way there can be no lookahead present (in yychar) is if
+ this state is a consistent state with a default action. Thus,
+ detecting the absence of a lookahead is sufficient to determine
+ that there is no unexpected or expected token to report. In that
+ case, just report a simple "syntax error".
+ - Don't assume there isn't a lookahead just because this state is a
+ consistent state with a default action. There might have been a
+ previous inconsistent state, consistent state with a non-default
+ action, or user semantic action that manipulated yychar.
+ - Of course, the expected token list depends on states to have
+ correct lookahead information, and it depends on the parser not
+ to perform extra reductions after fetching a lookahead from the
+ scanner and before detecting a syntax error. Thus, state merging
+ (from LALR or IELR) and default reductions corrupt the expected
+ token list. However, the list is correct for canonical LR with
+ one exception: it will still contain any token that will not be
+ accepted due to an error action in a later state.
+ */
+ if (yytoken != YYEMPTY)
+ {
+ int yyn = yypact[+*yyssp];
+ YYPTRDIFF_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
+ yysize = yysize0;
+ yyarg[yycount++] = yytname[yytoken];
+ if (!yypact_value_is_default (yyn))
+ {
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. In other words, skip the first -YYN actions for
+ this state because they are default actions. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yyx;
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+ && !yytable_value_is_error (yytable[yyx + yyn]))
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ {
+ YYPTRDIFF_T yysize1
+ = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
+ if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+ yysize = yysize1;
+ else
+ return 2;
+ }
+ }
+ }
+ }
+
+ switch (yycount)
+ {
+# define YYCASE_(N, S) \
+ case N: \
+ yyformat = S; \
+ break
+ default: /* Avoid compiler warnings. */
+ YYCASE_(0, YY_("syntax error"));
+ YYCASE_(1, YY_("syntax error, unexpected %s"));
+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+ YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+ YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+ YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+ }
+
+ {
+ /* Don't count the "%s"s in the final size, but reserve room for
+ the terminator. */
+ YYPTRDIFF_T yysize1 = yysize + (yystrlen (yyformat) - 2 * yycount) + 1;
+ if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+ yysize = yysize1;
+ else
+ return 2;
+ }
+
+ if (*yymsg_alloc < yysize)
+ {
+ *yymsg_alloc = 2 * yysize;
+ if (! (yysize <= *yymsg_alloc
+ && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+ *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+ return 1;
+ }
+
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ {
+ char *yyp = *yymsg;
+ int yyi = 0;
+ while ((*yyp = *yyformat) != '\0')
+ if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyformat += 2;
+ }
+ else
+ {
+ ++yyp;
+ ++yyformat;
+ }
+ }
+ return 0;
+}
+#endif /* YYERROR_VERBOSE */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, parser_state *p)
+{
+ YYUSE (yyvaluep);
+ YYUSE (p);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YYUSE (yytype);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (parser_state *p)
+{
+/* The lookahead symbol. */
+int yychar;
+
+
+/* The semantic value of the lookahead symbol. */
+/* Default value used for initialization, for pacifying older GCCs
+ or non-GCC compilers. */
+YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
+YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
+
+ /* Number of syntax errors so far. */
+ int yynerrs;
+
+ yy_state_fast_t yystate;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+
+ /* The stacks and their tools:
+ 'yyss': related to states.
+ 'yyvs': related to semantic values.
+
+ Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss;
+ yy_state_t *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs;
+ YYSTYPE *yyvsp;
+
+ YYPTRDIFF_T yystacksize;
+
+ int yyn;
+ int yyresult;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken = 0;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ yyssp = yyss = yyssa;
+ yyvsp = yyvs = yyvsa;
+ yystacksize = YYINITDEPTH;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = yylex (&yylval, p);
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+#line 1508 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lstate = EXPR_BEG;
+ if (!p->locals) p->locals = cons(0,0);
+ }
+#line 5675 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 3:
+#line 1513 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->tree = new_scope(p, (yyvsp[0].nd));
+ NODE_LINENO(p->tree, (yyvsp[0].nd));
+ }
+#line 5684 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 4:
+#line 1520 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 5692 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 5:
+#line 1526 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_begin(p, 0);
+ }
+#line 5700 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 6:
+#line 1530 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_begin(p, (yyvsp[0].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[0].nd));
+ }
+#line 5709 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 7:
+#line 1535 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), newline_node((yyvsp[0].nd)));
+ }
+#line 5717 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 8:
+#line 1539 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_begin(p, 0);
+ }
+#line 5725 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 10:
+#line 1546 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = local_switch(p);
+ nvars_block(p);
+ }
+#line 5734 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 11:
+#line 1551 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "BEGIN not supported");
+ local_resume(p, (yyvsp[-3].nd));
+ nvars_unnest(p);
+ (yyval.nd) = 0;
+ }
+#line 5745 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 12:
+#line 1563 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if ((yyvsp[-2].nd)) {
+ (yyval.nd) = new_rescue(p, (yyvsp[-3].nd), (yyvsp[-2].nd), (yyvsp[-1].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[-3].nd));
+ }
+ else if ((yyvsp[-1].nd)) {
+ yywarn(p, "else without rescue is useless");
+ (yyval.nd) = push((yyvsp[-3].nd), (yyvsp[-1].nd));
+ }
+ else {
+ (yyval.nd) = (yyvsp[-3].nd);
+ }
+ if ((yyvsp[0].nd)) {
+ if ((yyval.nd)) {
+ (yyval.nd) = new_ensure(p, (yyval.nd), (yyvsp[0].nd));
+ }
+ else {
+ (yyval.nd) = push((yyvsp[0].nd), new_nil(p));
+ }
+ }
+ }
+#line 5771 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 13:
+#line 1587 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 5779 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 14:
+#line 1593 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_begin(p, 0);
+ }
+#line 5787 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 15:
+#line 1597 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_begin(p, (yyvsp[0].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[0].nd));
+ }
+#line 5796 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 16:
+#line 1602 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), newline_node((yyvsp[0].nd)));
+ }
+#line 5804 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 17:
+#line 1606 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_begin(p, (yyvsp[0].nd));
+ }
+#line 5812 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 18:
+#line 1611 "mrbgems/mruby-compiler/core/parse.y"
+ {p->lstate = EXPR_FNAME;}
+#line 5818 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 19:
+#line 1612 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_alias(p, (yyvsp[-2].id), (yyvsp[0].id));
+ }
+#line 5826 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 20:
+#line 1616 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 5834 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 21:
+#line 1620 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd), 0);
+ }
+#line 5842 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 22:
+#line 1624 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_unless(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd), 0);
+ }
+#line 5850 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 23:
+#line 1628 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_while(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd));
+ }
+#line 5858 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 24:
+#line 1632 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_until(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd));
+ }
+#line 5866 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 25:
+#line 1636 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 5874 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 26:
+#line 1640 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "END not supported");
+ (yyval.nd) = new_postexe(p, (yyvsp[-1].nd));
+ }
+#line 5883 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 28:
+#line 1646 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 5891 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 29:
+#line 1650 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[-2].nd), new_array(p, (yyvsp[0].nd)));
+ }
+#line 5899 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 30:
+#line 1654 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 5907 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 31:
+#line 1658 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[-2].nd), new_array(p, (yyvsp[0].nd)));
+ }
+#line 5915 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 33:
+#line 1665 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 5923 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 34:
+#line 1669 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, (yyvsp[-2].nd), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 5931 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 35:
+#line 1673 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), intern_lit("[]"), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 5939 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 36:
+#line 1677 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 5947 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 37:
+#line 1681 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 5955 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 38:
+#line 1685 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "constant re-assignment");
+ (yyval.nd) = 0;
+ }
+#line 5964 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 39:
+#line 1690 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, tCOLON2), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 5972 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 40:
+#line 1694 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ backref_error(p, (yyvsp[-2].nd));
+ (yyval.nd) = new_begin(p, 0);
+ }
+#line 5981 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 42:
+#line 1702 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 5989 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 45:
+#line 1711 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_and(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 5997 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 46:
+#line 1715 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_or(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 6005 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 47:
+#line 1719 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!");
+ }
+#line 6013 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 48:
+#line 1723 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!");
+ }
+#line 6021 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 50:
+#line 1730 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if (!(yyvsp[0].nd)) (yyval.nd) = new_nil(p);
+ else {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+ }
+#line 6032 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 54:
+#line 1744 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
+ }
+#line 6040 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 55:
+#line 1750 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_nest(p);
+ nvars_nest(p);
+ }
+#line 6049 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 56:
+#line 1757 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_block(p, (yyvsp[-2].nd), (yyvsp[-1].nd));
+ local_unnest(p);
+ nvars_unnest(p);
+ }
+#line 6059 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 57:
+#line 1765 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 6067 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 58:
+#line 1769 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ args_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd));
+ (yyval.nd) = new_fcall(p, (yyvsp[-2].id), (yyvsp[-1].nd));
+ }
+#line 6076 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 59:
+#line 1774 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
+ }
+#line 6084 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 60:
+#line 1778 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ args_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd));
+ (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), (yyvsp[-3].num));
+ }
+#line 6093 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 61:
+#line 1783 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), tCOLON2);
+ }
+#line 6101 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 62:
+#line 1787 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ args_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd));
+ (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), tCOLON2);
+ }
+#line 6110 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 63:
+#line 1792 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_super(p, (yyvsp[0].nd));
+ }
+#line 6118 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 64:
+#line 1796 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_yield(p, (yyvsp[0].nd));
+ }
+#line 6126 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 65:
+#line 1800 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_return(p, ret_args(p, (yyvsp[0].nd)));
+ }
+#line 6134 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 66:
+#line 1804 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_break(p, ret_args(p, (yyvsp[0].nd)));
+ }
+#line 6142 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 67:
+#line 1808 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_next(p, ret_args(p, (yyvsp[0].nd)));
+ }
+#line 6150 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 68:
+#line 1814 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 6158 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 69:
+#line 1818 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 6166 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 71:
+#line 1825 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 6174 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 72:
+#line 1831 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 6182 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 73:
+#line 1835 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1(push((yyvsp[-1].nd),(yyvsp[0].nd)));
+ }
+#line 6190 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 74:
+#line 1839 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list2((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 6198 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 75:
+#line 1843 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[-4].nd), (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 6206 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 76:
+#line 1847 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list2((yyvsp[-1].nd), new_nil(p));
+ }
+#line 6214 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 77:
+#line 1851 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[-3].nd), new_nil(p), (yyvsp[0].nd));
+ }
+#line 6222 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 78:
+#line 1855 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list2(0, (yyvsp[0].nd));
+ }
+#line 6230 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 79:
+#line 1859 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3(0, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 6238 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 80:
+#line 1863 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list2(0, new_nil(p));
+ }
+#line 6246 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 81:
+#line 1867 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3(0, new_nil(p), (yyvsp[0].nd));
+ }
+#line 6254 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 83:
+#line 1874 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_masgn(p, (yyvsp[-1].nd), NULL);
+ }
+#line 6262 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 84:
+#line 1880 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[-1].nd));
+ }
+#line 6270 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 85:
+#line 1884 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[-1].nd));
+ }
+#line 6278 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 86:
+#line 1890 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 6286 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 87:
+#line 1894 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 6294 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 88:
+#line 1900 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ assignable(p, (yyvsp[0].nd));
+ }
+#line 6302 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 89:
+#line 1904 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_lit("[]"), (yyvsp[-1].nd), '.');
+ }
+#line 6310 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 90:
+#line 1908 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
+ }
+#line 6318 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 91:
+#line 1912 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2);
+ }
+#line 6326 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 92:
+#line 1916 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
+ }
+#line 6334 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 93:
+#line 1920 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon2(p, (yyvsp[-2].nd), (yyvsp[0].id));
+ }
+#line 6344 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 94:
+#line 1926 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon3(p, (yyvsp[0].id));
+ }
+#line 6354 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 95:
+#line 1932 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ backref_error(p, (yyvsp[0].nd));
+ (yyval.nd) = 0;
+ }
+#line 6363 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 96:
+#line 1939 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ assignable(p, (yyvsp[0].nd));
+ }
+#line 6371 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 97:
+#line 1943 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_lit("[]"), (yyvsp[-1].nd), '.');
+ }
+#line 6379 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 98:
+#line 1947 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
+ }
+#line 6387 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 99:
+#line 1951 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2);
+ }
+#line 6395 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 100:
+#line 1955 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
+ }
+#line 6403 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 101:
+#line 1959 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon2(p, (yyvsp[-2].nd), (yyvsp[0].id));
+ }
+#line 6413 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 102:
+#line 1965 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "dynamic constant assignment");
+ (yyval.nd) = new_colon3(p, (yyvsp[0].id));
+ }
+#line 6423 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 103:
+#line 1971 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ backref_error(p, (yyvsp[0].nd));
+ (yyval.nd) = 0;
+ }
+#line 6432 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 104:
+#line 1976 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "can't assign to numbered parameter");
+ }
+#line 6440 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 105:
+#line 1982 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "class/module name must be CONSTANT");
+ }
+#line 6448 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 107:
+#line 1989 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons((node*)1, nsym((yyvsp[0].id)));
+ }
+#line 6456 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 108:
+#line 1993 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons((node*)0, nsym((yyvsp[0].id)));
+ }
+#line 6464 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 109:
+#line 1997 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[-2].nd));
+ (yyval.nd) = cons((yyvsp[-2].nd), nsym((yyvsp[0].id)));
+ }
+#line 6473 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 113:
+#line 2007 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lstate = EXPR_ENDFN;
+ (yyval.id) = (yyvsp[0].id);
+ }
+#line 6482 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 114:
+#line 2012 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lstate = EXPR_ENDFN;
+ (yyval.id) = (yyvsp[0].id);
+ }
+#line 6491 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 117:
+#line 2023 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_undef(p, (yyvsp[0].id));
+ }
+#line 6499 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 118:
+#line 2026 "mrbgems/mruby-compiler/core/parse.y"
+ {p->lstate = EXPR_FNAME;}
+#line 6505 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 119:
+#line 2027 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-3].nd), nsym((yyvsp[0].id)));
+ }
+#line 6513 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 120:
+#line 2032 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("|"); }
+#line 6519 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 121:
+#line 2033 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("^"); }
+#line 6525 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 122:
+#line 2034 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("&"); }
+#line 6531 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 123:
+#line 2035 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("<=>"); }
+#line 6537 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 124:
+#line 2036 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("=="); }
+#line 6543 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 125:
+#line 2037 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("==="); }
+#line 6549 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 126:
+#line 2038 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("=~"); }
+#line 6555 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 127:
+#line 2039 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("!~"); }
+#line 6561 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 128:
+#line 2040 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit(">"); }
+#line 6567 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 129:
+#line 2041 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit(">="); }
+#line 6573 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 130:
+#line 2042 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("<"); }
+#line 6579 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 131:
+#line 2043 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("<="); }
+#line 6585 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 132:
+#line 2044 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("!="); }
+#line 6591 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 133:
+#line 2045 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("<<"); }
+#line 6597 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 134:
+#line 2046 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit(">>"); }
+#line 6603 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 135:
+#line 2047 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("+"); }
+#line 6609 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 136:
+#line 2048 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("-"); }
+#line 6615 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 137:
+#line 2049 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("*"); }
+#line 6621 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 138:
+#line 2050 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("*"); }
+#line 6627 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 139:
+#line 2051 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("/"); }
+#line 6633 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 140:
+#line 2052 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("%"); }
+#line 6639 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 141:
+#line 2053 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("**"); }
+#line 6645 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 142:
+#line 2054 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("**"); }
+#line 6651 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 143:
+#line 2055 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("!"); }
+#line 6657 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 144:
+#line 2056 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("~"); }
+#line 6663 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 145:
+#line 2057 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("+@"); }
+#line 6669 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 146:
+#line 2058 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("-@"); }
+#line 6675 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 147:
+#line 2059 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("[]"); }
+#line 6681 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 148:
+#line 2060 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("[]="); }
+#line 6687 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 149:
+#line 2061 "mrbgems/mruby-compiler/core/parse.y"
+ { (yyval.id) = intern_lit("`"); }
+#line 6693 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 190:
+#line 2079 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_asgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 6701 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 191:
+#line 2083 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, (yyvsp[-2].nd), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 6709 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 192:
+#line 2087 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), intern_lit("[]"), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 6717 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 193:
+#line 2091 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 6725 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 194:
+#line 2095 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 6733 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 195:
+#line 2099 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, tCOLON2), (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 6741 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 196:
+#line 2103 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "constant re-assignment");
+ (yyval.nd) = new_begin(p, 0);
+ }
+#line 6750 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 197:
+#line 2108 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "constant re-assignment");
+ (yyval.nd) = new_begin(p, 0);
+ }
+#line 6759 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 198:
+#line 2113 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ backref_error(p, (yyvsp[-2].nd));
+ (yyval.nd) = new_begin(p, 0);
+ }
+#line 6768 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 199:
+#line 2118 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_dot2(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 6776 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 200:
+#line 2122 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_dot3(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 6784 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 201:
+#line 2126 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "+", (yyvsp[0].nd));
+ }
+#line 6792 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 202:
+#line 2130 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "-", (yyvsp[0].nd));
+ }
+#line 6800 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 203:
+#line 2134 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "*", (yyvsp[0].nd));
+ }
+#line 6808 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 204:
+#line 2138 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "/", (yyvsp[0].nd));
+ }
+#line 6816 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 205:
+#line 2142 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "%", (yyvsp[0].nd));
+ }
+#line 6824 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 206:
+#line 2146 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd));
+ }
+#line 6832 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 207:
+#line 2150 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@");
+ }
+#line 6840 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 208:
+#line 2154 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@");
+ }
+#line 6848 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 209:
+#line 2158 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, (yyvsp[0].nd), "+@");
+ }
+#line 6856 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 210:
+#line 2162 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, (yyvsp[0].nd), "-@");
+ }
+#line 6864 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 211:
+#line 2166 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "|", (yyvsp[0].nd));
+ }
+#line 6872 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 212:
+#line 2170 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "^", (yyvsp[0].nd));
+ }
+#line 6880 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 213:
+#line 2174 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "&", (yyvsp[0].nd));
+ }
+#line 6888 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 214:
+#line 2178 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<=>", (yyvsp[0].nd));
+ }
+#line 6896 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 215:
+#line 2182 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">", (yyvsp[0].nd));
+ }
+#line 6904 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 216:
+#line 2186 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">=", (yyvsp[0].nd));
+ }
+#line 6912 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 217:
+#line 2190 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<", (yyvsp[0].nd));
+ }
+#line 6920 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 218:
+#line 2194 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<=", (yyvsp[0].nd));
+ }
+#line 6928 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 219:
+#line 2198 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "==", (yyvsp[0].nd));
+ }
+#line 6936 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 220:
+#line 2202 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "===", (yyvsp[0].nd));
+ }
+#line 6944 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 221:
+#line 2206 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "!=", (yyvsp[0].nd));
+ }
+#line 6952 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 222:
+#line 2210 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "=~", (yyvsp[0].nd));
+ }
+#line 6960 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 223:
+#line 2214 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "!~", (yyvsp[0].nd));
+ }
+#line 6968 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 224:
+#line 2218 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!");
+ }
+#line 6976 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 225:
+#line 2222 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "~");
+ }
+#line 6984 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 226:
+#line 2226 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<<", (yyvsp[0].nd));
+ }
+#line 6992 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 227:
+#line 2230 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">>", (yyvsp[0].nd));
+ }
+#line 7000 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 228:
+#line 2234 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_and(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 7008 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 229:
+#line 2238 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_or(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 7016 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 230:
+#line 2242 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[-5].nd)), (yyvsp[-3].nd), (yyvsp[0].nd));
+ }
+#line 7024 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 231:
+#line 2246 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[-5].nd)), (yyvsp[-3].nd), (yyvsp[0].nd));
+ }
+#line 7032 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 232:
+#line 2250 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 7040 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 234:
+#line 2257 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7049 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 235:
+#line 2262 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-3].nd), new_kw_hash(p, (yyvsp[-1].nd)));
+ }
+#line 7057 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 236:
+#line 2266 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(new_kw_hash(p, (yyvsp[-1].nd)), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7066 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 237:
+#line 2273 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 7074 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 238:
+#line 2277 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[-2].nd));
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 7084 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 239:
+#line 2285 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 7092 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 240:
+#line 2289 "mrbgems/mruby-compiler/core/parse.y"
+ {
+#if 1
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ if (local_var_p(p, r) && local_var_p(p, b)) {
+ (yyval.nd) = cons(list1(new_splat(p, new_lvar(p, r))),
+ new_block_arg(p, new_lvar(p, b)));
+ }
+#else
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym k = mrb_intern_lit(p->mrb, "**");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ if (local_var_p(p, r) && local_var_p(p, k) && local_var_p(p, b)) {
+ (yyval.nd) = cons(list2(new_splat(p, new_lvar(p, r)),
+ new_kw_hash(p, list1(cons(new_kw_rest_args(p, 0), new_lvar(p, k))))),
+ new_block_arg(p, new_lvar(p, b)));
+ }
+#endif
+ else {
+ yyerror(p, "unexpected argument forwarding ...");
+ (yyval.nd) = 0;
+ }
+ }
+#line 7120 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 245:
+#line 2321 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons((yyvsp[-1].nd),0);
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7129 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 246:
+#line 2326 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(push((yyvsp[-3].nd), new_kw_hash(p, (yyvsp[-1].nd))), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[-3].nd));
+ }
+#line 7138 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 247:
+#line 2331 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(list1(new_kw_hash(p, (yyvsp[-1].nd))), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7147 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 248:
+#line 2338 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons(list1((yyvsp[0].nd)), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[0].nd));
+ }
+#line 7157 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 249:
+#line 2344 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons((yyvsp[-1].nd), (yyvsp[0].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7166 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 250:
+#line 2349 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(list1(new_kw_hash(p, (yyvsp[-1].nd))), (yyvsp[0].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7175 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 251:
+#line 2354 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(push((yyvsp[-3].nd), new_kw_hash(p, (yyvsp[-1].nd))), (yyvsp[0].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[-3].nd));
+ }
+#line 7184 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 252:
+#line 2359 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(0, (yyvsp[0].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[0].nd));
+ }
+#line 7193 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 253:
+#line 2365 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ CMDARG_PUSH(1);
+ }
+#line 7202 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 254:
+#line 2370 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->cmdarg_stack = (yyvsp[-1].stack);
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 7211 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 255:
+#line 2377 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_block_arg(p, (yyvsp[0].nd));
+ }
+#line 7219 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 256:
+#line 2383 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 7227 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 257:
+#line 2387 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = 0;
+ }
+#line 7235 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 260:
+#line 2397 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons((yyvsp[0].nd), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[0].nd));
+ }
+#line 7245 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 261:
+#line 2403 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons(new_splat(p, (yyvsp[0].nd)), 0);
+ NODE_LINENO((yyval.nd), (yyvsp[0].nd));
+ }
+#line 7255 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 262:
+#line 2409 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 7264 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 263:
+#line 2414 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = push((yyvsp[-3].nd), new_splat(p, (yyvsp[0].nd)));
+ }
+#line 7273 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 264:
+#line 2421 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 7282 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 265:
+#line 2426 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = push((yyvsp[-3].nd), new_splat(p, (yyvsp[0].nd)));
+ }
+#line 7291 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 266:
+#line 2431 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = list1(new_splat(p, (yyvsp[0].nd)));
+ }
+#line 7300 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 274:
+#line 2445 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_nvar(p, (yyvsp[0].num));
+ }
+#line 7308 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 275:
+#line 2449 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[0].id), 0);
+ }
+#line 7316 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 276:
+#line 2453 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ }
+#line 7325 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 277:
+#line 2459 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->cmdarg_stack = (yyvsp[-2].stack);
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 7334 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 278:
+#line 2464 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ }
+#line 7343 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 279:
+#line 2468 "mrbgems/mruby-compiler/core/parse.y"
+ {p->lstate = EXPR_ENDARG;}
+#line 7349 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 280:
+#line 2469 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->cmdarg_stack = (yyvsp[-3].stack);
+ (yyval.nd) = (yyvsp[-2].nd);
+ }
+#line 7358 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 281:
+#line 2473 "mrbgems/mruby-compiler/core/parse.y"
+ {p->lstate = EXPR_ENDARG;}
+#line 7364 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 282:
+#line 2474 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_nil(p);
+ }
+#line 7372 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 283:
+#line 2478 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 7380 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 284:
+#line 2482 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_colon2(p, (yyvsp[-2].nd), (yyvsp[0].id));
+ }
+#line 7388 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 285:
+#line 2486 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_colon3(p, (yyvsp[0].id));
+ }
+#line 7396 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 286:
+#line 2490 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_array(p, (yyvsp[-1].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7405 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 287:
+#line 2495 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_hash(p, (yyvsp[-1].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
+ }
+#line 7414 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 288:
+#line 2500 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_return(p, 0);
+ }
+#line 7422 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 289:
+#line 2504 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_yield(p, (yyvsp[0].nd));
+ }
+#line 7430 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 290:
+#line 2508 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, cond((yyvsp[-1].nd)), "!");
+ }
+#line 7438 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 291:
+#line 2512 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = call_uni_op(p, new_nil(p), "!");
+ }
+#line 7446 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 292:
+#line 2516 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[-1].id), cons(0, (yyvsp[0].nd)));
+ }
+#line 7454 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 294:
+#line 2521 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ call_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd));
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 7463 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 295:
+#line 2526 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_nest(p);
+ (yyval.num) = p->lpar_beg;
+ p->lpar_beg = ++p->paren_nest;
+ }
+#line 7473 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 296:
+#line 2532 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ }
+#line 7482 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 297:
+#line 2537 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lpar_beg = (yyvsp[-3].num);
+ (yyval.nd) = new_lambda(p, (yyvsp[-2].nd), (yyvsp[0].nd));
+ local_unnest(p);
+ p->cmdarg_stack = (yyvsp[-1].stack);
+ CMDARG_LEXPOP();
+ }
+#line 7494 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 298:
+#line 2548 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[-4].nd)), (yyvsp[-2].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-5].num));
+ }
+#line 7503 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 299:
+#line 2556 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_unless(p, cond((yyvsp[-4].nd)), (yyvsp[-2].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-5].num));
+ }
+#line 7512 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 300:
+#line 2560 "mrbgems/mruby-compiler/core/parse.y"
+ {COND_PUSH(1);}
+#line 7518 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 301:
+#line 2560 "mrbgems/mruby-compiler/core/parse.y"
+ {COND_POP();}
+#line 7524 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 302:
+#line 2563 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_while(p, cond((yyvsp[-4].nd)), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-6].num));
+ }
+#line 7533 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 303:
+#line 2567 "mrbgems/mruby-compiler/core/parse.y"
+ {COND_PUSH(1);}
+#line 7539 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 304:
+#line 2567 "mrbgems/mruby-compiler/core/parse.y"
+ {COND_POP();}
+#line 7545 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 305:
+#line 2570 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_until(p, cond((yyvsp[-4].nd)), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-6].num));
+ }
+#line 7554 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 306:
+#line 2577 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_case(p, (yyvsp[-3].nd), (yyvsp[-1].nd));
+ }
+#line 7562 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 307:
+#line 2581 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_case(p, 0, (yyvsp[-1].nd));
+ }
+#line 7570 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 308:
+#line 2585 "mrbgems/mruby-compiler/core/parse.y"
+ {COND_PUSH(1);}
+#line 7576 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 309:
+#line 2587 "mrbgems/mruby-compiler/core/parse.y"
+ {COND_POP();}
+#line 7582 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 310:
+#line 2590 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_for(p, (yyvsp[-7].nd), (yyvsp[-4].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-8].num));
+ }
+#line 7591 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 311:
+#line 2596 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "class definition in method body");
+ (yyval.nd) = local_switch(p);
+ nvars_block(p);
+ }
+#line 7602 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 312:
+#line 2604 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_class(p, (yyvsp[-4].nd), (yyvsp[-3].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-5].num));
+ local_resume(p, (yyvsp[-2].nd));
+ nvars_unnest(p);
+ }
+#line 7613 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 313:
+#line 2612 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.num) = p->in_def;
+ p->in_def = 0;
+ }
+#line 7622 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 314:
+#line 2617 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(local_switch(p), nint(p->in_single));
+ nvars_block(p);
+ p->in_single = 0;
+ }
+#line 7632 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 315:
+#line 2624 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_sclass(p, (yyvsp[-5].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-7].num));
+ local_resume(p, (yyvsp[-2].nd)->car);
+ nvars_unnest(p);
+ p->in_def = (yyvsp[-4].num);
+ p->in_single = intn((yyvsp[-2].nd)->cdr);
+ }
+#line 7645 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 316:
+#line 2634 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if (p->in_def || p->in_single)
+ yyerror(p, "module definition in method body");
+ (yyval.nd) = local_switch(p);
+ nvars_block(p);
+ }
+#line 7656 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 317:
+#line 2642 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_module(p, (yyvsp[-3].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-4].num));
+ local_resume(p, (yyvsp[-2].nd));
+ nvars_unnest(p);
+ }
+#line 7667 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 318:
+#line 2649 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ }
+#line 7676 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 319:
+#line 2653 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->in_def++;
+ (yyval.nd) = local_switch(p);
+ nvars_block(p);
+ }
+#line 7686 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 320:
+#line 2661 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_def(p, (yyvsp[-5].id), (yyvsp[-2].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-6].num));
+ local_resume(p, (yyvsp[-3].nd));
+ nvars_unnest(p);
+ p->in_def--;
+ p->cmdarg_stack = (yyvsp[-4].stack);
+ }
+#line 7699 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 321:
+#line 2670 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lstate = EXPR_FNAME;
+ (yyval.stack) = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ }
+#line 7709 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 322:
+#line 2676 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->in_single++;
+ p->lstate = EXPR_ENDFN; /* force for args */
+ (yyval.nd) = local_switch(p);
+ nvars_block(p);
+ }
+#line 7720 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 323:
+#line 2685 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_sdef(p, (yyvsp[-7].nd), (yyvsp[-4].id), (yyvsp[-2].nd), (yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-8].num));
+ local_resume(p, (yyvsp[-3].nd));
+ nvars_unnest(p);
+ p->in_single--;
+ p->cmdarg_stack = (yyvsp[-5].stack);
+ }
+#line 7733 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 324:
+#line 2694 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_break(p, 0);
+ }
+#line 7741 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 325:
+#line 2698 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_next(p, 0);
+ }
+#line 7749 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 326:
+#line 2702 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_redo(p);
+ }
+#line 7757 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 327:
+#line 2706 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_retry(p);
+ }
+#line 7765 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 328:
+#line 2712 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+ }
+#line 7774 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 335:
+#line 2731 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_if(p, cond((yyvsp[-3].nd)), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 7782 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 337:
+#line 2738 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 7790 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 338:
+#line 2744 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1(list1((yyvsp[0].nd)));
+ }
+#line 7798 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 340:
+#line 2751 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[0].nd),0,0);
+ }
+#line 7806 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 341:
+#line 2755 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[-3].nd), new_arg(p, (yyvsp[0].id)), 0);
+ }
+#line 7814 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 342:
+#line 2759 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[-5].nd), new_arg(p, (yyvsp[-2].id)), (yyvsp[0].nd));
+ }
+#line 7822 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 343:
+#line 2763 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, 0);
+ (yyval.nd) = list3((yyvsp[-2].nd), (node*)-1, 0);
+ }
+#line 7831 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 344:
+#line 2768 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3((yyvsp[-4].nd), (node*)-1, (yyvsp[0].nd));
+ }
+#line 7839 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 345:
+#line 2772 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3(0, new_arg(p, (yyvsp[0].id)), 0);
+ }
+#line 7847 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 346:
+#line 2776 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3(0, new_arg(p, (yyvsp[-2].id)), (yyvsp[0].nd));
+ }
+#line 7855 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 347:
+#line 2780 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, 0);
+ (yyval.nd) = list3(0, (node*)-1, 0);
+ }
+#line 7864 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 348:
+#line 2785 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, 0);
+ }
+#line 7872 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 349:
+#line 2789 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list3(0, (node*)-1, (yyvsp[0].nd));
+ }
+#line 7880 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 350:
+#line 2795 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, (yyvsp[-3].nd), (yyvsp[-1].nd), (yyvsp[0].id));
+ }
+#line 7888 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 351:
+#line 2799 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, (yyvsp[-1].nd), 0, (yyvsp[0].id));
+ }
+#line 7896 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 352:
+#line 2803 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, 0, (yyvsp[-1].nd), (yyvsp[0].id));
+ }
+#line 7904 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 353:
+#line 2807 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, 0, 0, (yyvsp[0].id));
+ }
+#line 7912 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 354:
+#line 2813 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 7920 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 355:
+#line 2817 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, 0, 0, 0);
+ }
+#line 7928 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 356:
+#line 2823 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 7936 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 357:
+#line 2827 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-7].nd), (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 7944 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 358:
+#line 2831 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-3].nd), (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
+ }
+#line 7952 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 359:
+#line 2835 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 7960 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 360:
+#line 2839 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 7968 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 361:
+#line 2843 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-2].nd), 0, 0, 0, (yyvsp[0].nd));
+ }
+#line 7976 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 362:
+#line 2847 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-5].nd), 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 7984 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 363:
+#line 2851 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-1].nd), 0, 0, 0, (yyvsp[0].nd));
+ }
+#line 7992 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 364:
+#line 2855 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 8000 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 365:
+#line 2859 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8008 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 366:
+#line 2863 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
+ }
+#line 8016 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 367:
+#line 2867 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8024 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 368:
+#line 2871 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 8032 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 369:
+#line 2875 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8040 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 370:
+#line 2879 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[0].nd));
+ }
+#line 8048 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 371:
+#line 2885 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_blk(p, 0);
+ (yyval.nd) = 0;
+ }
+#line 8057 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 372:
+#line 2890 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->cmd_start = TRUE;
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8066 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 373:
+#line 2896 "mrbgems/mruby-compiler/core/parse.y"
+ {local_add_blk(p, 0);}
+#line 8072 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 374:
+#line 2897 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = 0;
+ }
+#line 8080 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 375:
+#line 2901 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_blk(p, 0);
+ (yyval.nd) = 0;
+ }
+#line 8089 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 376:
+#line 2906 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-2].nd);
+ }
+#line 8097 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 377:
+#line 2913 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = 0;
+ }
+#line 8105 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 378:
+#line 2917 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = 0;
+ }
+#line 8113 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 381:
+#line 2927 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, (yyvsp[0].id));
+ new_bv(p, (yyvsp[0].id));
+ }
+#line 8122 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 383:
+#line 2935 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-2].nd);
+ }
+#line 8130 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 384:
+#line 2939 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8138 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 385:
+#line 2945 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 8146 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 386:
+#line 2949 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 8154 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 387:
+#line 2955 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_nest(p);
+ nvars_nest(p);
+ }
+#line 8163 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 388:
+#line 2962 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_block(p,(yyvsp[-2].nd),(yyvsp[-1].nd));
+ local_unnest(p);
+ nvars_unnest(p);
+ }
+#line 8173 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 389:
+#line 2970 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if ((yyvsp[-1].nd)->car == (node*)NODE_YIELD) {
+ yyerror(p, "block given to yield");
+ }
+ else {
+ call_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 8187 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 390:
+#line 2980 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
+ }
+#line 8195 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 391:
+#line 2984 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), (yyvsp[-3].num));
+ call_with_block(p, (yyval.nd), (yyvsp[0].nd));
+ }
+#line 8204 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 392:
+#line 2989 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), (yyvsp[-3].num));
+ call_with_block(p, (yyval.nd), (yyvsp[0].nd));
+ }
+#line 8213 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 393:
+#line 2996 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_fcall(p, (yyvsp[-1].id), (yyvsp[0].nd));
+ }
+#line 8221 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 394:
+#line 3000 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
+ }
+#line 8229 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 395:
+#line 3004 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), tCOLON2);
+ }
+#line 8237 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 396:
+#line 3008 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2);
+ }
+#line 8245 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 397:
+#line 3012 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), intern_lit("call"), (yyvsp[0].nd), (yyvsp[-1].num));
+ }
+#line 8253 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 398:
+#line 3016 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-2].nd), intern_lit("call"), (yyvsp[0].nd), tCOLON2);
+ }
+#line 8261 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 399:
+#line 3020 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_super(p, (yyvsp[0].nd));
+ }
+#line 8269 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 400:
+#line 3024 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_zsuper(p);
+ }
+#line 8277 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 401:
+#line 3028 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_lit("[]"), (yyvsp[-1].nd), '.');
+ }
+#line 8285 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 402:
+#line 3034 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_nest(p);
+ nvars_nest(p);
+ (yyval.num) = p->lineno;
+ }
+#line 8295 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 403:
+#line 3041 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_block(p,(yyvsp[-2].nd),(yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-3].num));
+ local_unnest(p);
+ nvars_unnest(p);
+ }
+#line 8306 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 404:
+#line 3048 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_nest(p);
+ nvars_nest(p);
+ (yyval.num) = p->lineno;
+ }
+#line 8316 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 405:
+#line 3055 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_block(p,(yyvsp[-2].nd),(yyvsp[-1].nd));
+ SET_LINENO((yyval.nd), (yyvsp[-3].num));
+ local_unnest(p);
+ nvars_unnest(p);
+ }
+#line 8327 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 406:
+#line 3066 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(cons((yyvsp[-3].nd), (yyvsp[-1].nd)), (yyvsp[0].nd));
+ }
+#line 8335 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 407:
+#line 3072 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if ((yyvsp[0].nd)) {
+ (yyval.nd) = cons(cons(0, (yyvsp[0].nd)), 0);
+ }
+ else {
+ (yyval.nd) = 0;
+ }
+ }
+#line 8348 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 409:
+#line 3086 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1(list3((yyvsp[-4].nd), (yyvsp[-3].nd), (yyvsp[-1].nd)));
+ if ((yyvsp[0].nd)) (yyval.nd) = append((yyval.nd), (yyvsp[0].nd));
+ }
+#line 8357 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 411:
+#line 3094 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 8365 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 414:
+#line 3102 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8373 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 416:
+#line 3109 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8381 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 423:
+#line 3123 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = concat_string(p, (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8389 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 426:
+#line 3131 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8397 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 427:
+#line 3135 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_dstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ }
+#line 8405 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 429:
+#line 3142 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = append((yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8413 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 430:
+#line 3148 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 8421 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 431:
+#line 3152 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = p->lex_strterm;
+ p->lex_strterm = NULL;
+ }
+#line 8430 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 432:
+#line 3158 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lex_strterm = (yyvsp[-2].nd);
+ (yyval.nd) = list2((yyvsp[-3].nd), (yyvsp[-1].nd));
+ }
+#line 8439 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 433:
+#line 3163 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1(new_literal_delim(p));
+ }
+#line 8447 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 434:
+#line 3167 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1(new_literal_delim(p));
+ }
+#line 8455 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 435:
+#line 3173 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8463 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 436:
+#line 3177 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_dxstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ }
+#line 8471 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 437:
+#line 3183 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8479 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 438:
+#line 3187 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_dregx(p, (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8487 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 442:
+#line 3200 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ parser_heredoc_info * inf = parsing_heredoc_inf(p);
+ inf->doc = push(inf->doc, new_str(p, "", 0));
+ heredoc_end(p);
+ }
+#line 8497 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 443:
+#line 3206 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ heredoc_end(p);
+ }
+#line 8505 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 446:
+#line 3216 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ parser_heredoc_info * inf = parsing_heredoc_inf(p);
+ inf->doc = push(inf->doc, (yyvsp[0].nd));
+ heredoc_treat_nextline(p);
+ }
+#line 8515 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 447:
+#line 3222 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = p->lex_strterm;
+ p->lex_strterm = NULL;
+ }
+#line 8524 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 448:
+#line 3228 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ parser_heredoc_info * inf = parsing_heredoc_inf(p);
+ p->lex_strterm = (yyvsp[-2].nd);
+ inf->doc = push(push(inf->doc, (yyvsp[-3].nd)), (yyvsp[-1].nd));
+ }
+#line 8534 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 449:
+#line 3236 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_words(p, list1((yyvsp[0].nd)));
+ }
+#line 8542 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 450:
+#line 3240 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_words(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ }
+#line 8550 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 451:
+#line 3247 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lstate = EXPR_ENDARG;
+ (yyval.nd) = new_sym(p, (yyvsp[0].id));
+ }
+#line 8559 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 452:
+#line 3252 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lstate = EXPR_ENDARG;
+ (yyval.nd) = new_dsym(p, new_dstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd))));
+ }
+#line 8568 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 453:
+#line 3259 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.id) = (yyvsp[0].id);
+ }
+#line 8576 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 458:
+#line 3269 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.id) = new_strsym(p, (yyvsp[0].nd));
+ }
+#line 8584 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 459:
+#line 3273 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.id) = new_strsym(p, (yyvsp[0].nd));
+ }
+#line 8592 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 460:
+#line 3279 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_symbols(p, list1((yyvsp[0].nd)));
+ }
+#line 8600 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 461:
+#line 3283 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_symbols(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ }
+#line 8608 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 464:
+#line 3291 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = negate_lit(p, (yyvsp[0].nd));
+ }
+#line 8616 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 465:
+#line 3295 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = negate_lit(p, (yyvsp[0].nd));
+ }
+#line 8624 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 466:
+#line 3301 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_lvar(p, (yyvsp[0].id));
+ }
+#line 8632 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 467:
+#line 3305 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_ivar(p, (yyvsp[0].id));
+ }
+#line 8640 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 468:
+#line 3309 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_gvar(p, (yyvsp[0].id));
+ }
+#line 8648 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 469:
+#line 3313 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_cvar(p, (yyvsp[0].id));
+ }
+#line 8656 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 470:
+#line 3317 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_const(p, (yyvsp[0].id));
+ }
+#line 8664 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 471:
+#line 3323 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ assignable(p, (yyvsp[0].nd));
+ }
+#line 8672 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 472:
+#line 3327 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "can't assign to numbered parameter");
+ }
+#line 8680 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 473:
+#line 3333 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = var_reference(p, (yyvsp[0].nd));
+ }
+#line 8688 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 474:
+#line 3337 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_nil(p);
+ }
+#line 8696 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 475:
+#line 3341 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_self(p);
+ }
+#line 8704 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 476:
+#line 3345 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_true(p);
+ }
+#line 8712 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 477:
+#line 3349 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_false(p);
+ }
+#line 8720 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 478:
+#line 3353 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ const char *fn = mrb_sym_name_len(p->mrb, p->filename_sym, NULL);
+ if (!fn) {
+ fn = "(null)";
+ }
+ (yyval.nd) = new_str(p, fn, strlen(fn));
+ }
+#line 8732 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 479:
+#line 3361 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ char buf[16];
+
+ dump_int(p->lineno, buf);
+ (yyval.nd) = new_int(p, buf, 10, 0);
+ }
+#line 8743 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 480:
+#line 3368 "mrbgems/mruby-compiler/core/parse.y"
+ {
+#ifdef MRB_UTF8_STRING
+ const char *enc = "UTF-8";
+#else
+ const char *enc = "ASCII-8BIT";
+#endif
+ (yyval.nd) = new_str(p, enc, strlen(enc));
+ }
+#line 8756 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 483:
+#line 3383 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = 0;
+ }
+#line 8764 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 484:
+#line 3387 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lstate = EXPR_BEG;
+ p->cmd_start = TRUE;
+ }
+#line 8773 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 485:
+#line 3392 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 8781 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 486:
+#line 3403 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ p->lstate = EXPR_BEG;
+ p->cmd_start = TRUE;
+ }
+#line 8791 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 487:
+#line 3409 "mrbgems/mruby-compiler/core/parse.y"
+ {
+#if 1
+ /* til real keyword args implemented */
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ local_add_f(p, r);
+ (yyval.nd) = new_args(p, 0, 0, r, 0,
+ new_args_tail(p, 0, 0, b));
+#else
+ mrb_sym r = mrb_intern_lit(p->mrb, "*");
+ mrb_sym k = mrb_intern_lit(p->mrb, "**");
+ mrb_sym b = mrb_intern_lit(p->mrb, "&");
+ local_add_f(p, r); local_add_f(p, k);
+ (yyval.nd) = new_args(p, 0, 0, r, 0,
+ new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b));
+#endif
+ }
+#line 8813 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 488:
+#line 3427 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 8821 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 489:
+#line 3433 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_nest(p);
+ }
+#line 8829 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 490:
+#line 3439 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = new_kw_arg(p, (yyvsp[-1].id), cons((yyvsp[0].nd), locals_node(p)));
+ local_unnest(p);
+ }
+#line 8839 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 491:
+#line 3445 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_kw_arg(p, (yyvsp[0].id), 0);
+ local_unnest(p);
+ }
+#line 8848 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 492:
+#line 3452 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_kw_arg(p, (yyvsp[-1].id), cons((yyvsp[0].nd), locals_node(p)));
+ local_unnest(p);
+ }
+#line 8857 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 493:
+#line 3457 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_kw_arg(p, (yyvsp[0].id), 0);
+ local_unnest(p);
+ }
+#line 8866 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 494:
+#line 3464 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 8874 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 495:
+#line 3468 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 8882 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 496:
+#line 3474 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 8890 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 497:
+#line 3478 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 8898 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 500:
+#line 3488 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_kw_rest_args(p, nsym((yyvsp[0].id)));
+ }
+#line 8906 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 501:
+#line 3492 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_kw_rest_args(p, 0);
+ }
+#line 8914 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 502:
+#line 3498 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, (yyvsp[-3].nd), (yyvsp[-1].nd), (yyvsp[0].id));
+ }
+#line 8922 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 503:
+#line 3502 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, (yyvsp[-1].nd), 0, (yyvsp[0].id));
+ }
+#line 8930 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 504:
+#line 3506 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, 0, (yyvsp[-1].nd), (yyvsp[0].id));
+ }
+#line 8938 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 505:
+#line 3510 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, 0, 0, (yyvsp[0].id));
+ }
+#line 8946 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 506:
+#line 3516 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ }
+#line 8954 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 507:
+#line 3520 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args_tail(p, 0, 0, 0);
+ }
+#line 8962 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 508:
+#line 3526 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 8970 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 509:
+#line 3530 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-7].nd), (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8978 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 510:
+#line 3534 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-3].nd), (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
+ }
+#line 8986 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 511:
+#line 3538 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 8994 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 512:
+#line 3542 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 9002 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 513:
+#line 3546 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-5].nd), 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 9010 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 514:
+#line 3550 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, (yyvsp[-1].nd), 0, 0, 0, (yyvsp[0].nd));
+ }
+#line 9018 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 515:
+#line 3554 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 9026 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 516:
+#line 3558 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 9034 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 517:
+#line 3562 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
+ }
+#line 9042 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 518:
+#line 3566 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 9050 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 519:
+#line 3570 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
+ }
+#line 9058 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 520:
+#line 3574 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
+ }
+#line 9066 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 521:
+#line 3578 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[0].nd));
+ }
+#line 9074 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 522:
+#line 3582 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, mrb_intern_lit(p->mrb, "&"));
+ (yyval.nd) = new_args(p, 0, 0, 0, 0, 0);
+ }
+#line 9083 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 523:
+#line 3589 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "formal argument cannot be a constant");
+ (yyval.nd) = 0;
+ }
+#line 9092 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 524:
+#line 3594 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "formal argument cannot be an instance variable");
+ (yyval.nd) = 0;
+ }
+#line 9101 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 525:
+#line 3599 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "formal argument cannot be a global variable");
+ (yyval.nd) = 0;
+ }
+#line 9110 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 526:
+#line 3604 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "formal argument cannot be a class variable");
+ (yyval.nd) = 0;
+ }
+#line 9119 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 527:
+#line 3609 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ yyerror(p, "formal argument cannot be a numbered parameter");
+ (yyval.nd) = 0;
+ }
+#line 9128 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 528:
+#line 3616 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.id) = 0;
+ }
+#line 9136 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 529:
+#line 3620 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, (yyvsp[0].id));
+ (yyval.id) = (yyvsp[0].id);
+ }
+#line 9145 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 530:
+#line 3627 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_arg(p, (yyvsp[0].id));
+ }
+#line 9153 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 531:
+#line 3631 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = local_switch(p);
+ }
+#line 9161 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 532:
+#line 3635 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = new_masgn_param(p, (yyvsp[-1].nd), p->locals->car);
+ local_resume(p, (yyvsp[-2].nd));
+ local_add_f(p, 0);
+ }
+#line 9171 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 533:
+#line 3643 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 9179 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 534:
+#line 3647 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 9187 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 535:
+#line 3653 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, (yyvsp[-1].id));
+ local_nest(p);
+ (yyval.id) = (yyvsp[-1].id);
+ }
+#line 9197 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 536:
+#line 3661 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons(nsym((yyvsp[-1].id)), cons((yyvsp[0].nd), locals_node(p)));
+ local_unnest(p);
+ }
+#line 9207 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 537:
+#line 3669 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons(nsym((yyvsp[-1].id)), cons((yyvsp[0].nd), locals_node(p)));
+ local_unnest(p);
+ }
+#line 9217 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 538:
+#line 3677 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 9225 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 539:
+#line 3681 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 9233 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 540:
+#line 3687 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ }
+#line 9241 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 541:
+#line 3691 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 9249 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 544:
+#line 3701 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, (yyvsp[0].id));
+ (yyval.id) = (yyvsp[0].id);
+ }
+#line 9258 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 545:
+#line 3706 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ local_add_f(p, mrb_intern_lit(p->mrb, "*"));
+ (yyval.id) = -1;
+ }
+#line 9267 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 548:
+#line 3717 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.id) = (yyvsp[0].id);
+ }
+#line 9275 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 549:
+#line 3723 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.id) = (yyvsp[0].id);
+ }
+#line 9283 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 550:
+#line 3727 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.id) = 0;
+ }
+#line 9291 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 551:
+#line 3733 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[0].nd);
+ if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+ }
+#line 9300 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 552:
+#line 3737 "mrbgems/mruby-compiler/core/parse.y"
+ {p->lstate = EXPR_BEG;}
+#line 9306 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 553:
+#line 3738 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ if ((yyvsp[-1].nd) == 0) {
+ yyerror(p, "can't define singleton method for ().");
+ }
+ else {
+ switch ((enum node_type)intn((yyvsp[-1].nd)->car)) {
+ case NODE_STR:
+ case NODE_DSTR:
+ case NODE_XSTR:
+ case NODE_DXSTR:
+ case NODE_DREGX:
+ case NODE_MATCH:
+ case NODE_FLOAT:
+ case NODE_ARRAY:
+ case NODE_HEREDOC:
+ yyerror(p, "can't define singleton method for literals");
+ default:
+ break;
+ }
+ }
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 9333 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 555:
+#line 3764 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-1].nd);
+ }
+#line 9341 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 556:
+#line 3770 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = list1((yyvsp[0].nd));
+ NODE_LINENO((yyval.nd), (yyvsp[0].nd));
+ }
+#line 9350 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 557:
+#line 3775 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 9358 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 560:
+#line 3785 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[-2].nd));
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons((yyvsp[-2].nd), (yyvsp[0].nd));
+ }
+#line 9368 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 561:
+#line 3791 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons(new_sym(p, (yyvsp[-2].id)), (yyvsp[0].nd));
+ }
+#line 9377 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 562:
+#line 3796 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ if ((yyvsp[-2].nd)->car == (node*)NODE_DSTR) {
+ (yyval.nd) = cons(new_dsym(p, (yyvsp[-2].nd)), (yyvsp[0].nd));
+ }
+ else {
+ (yyval.nd) = cons(new_sym(p, new_strsym(p, (yyvsp[-2].nd))), (yyvsp[0].nd));
+ }
+ }
+#line 9391 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 563:
+#line 3806 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ void_expr_error(p, (yyvsp[0].nd));
+ (yyval.nd) = cons(new_kw_rest_args(p, 0), (yyvsp[0].nd));
+ }
+#line 9400 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 576:
+#line 3833 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.num) = '.';
+ }
+#line 9408 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 577:
+#line 3837 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.num) = 0;
+ }
+#line 9416 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 579:
+#line 3844 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.num) = tCOLON2;
+ }
+#line 9424 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 588:
+#line 3865 "mrbgems/mruby-compiler/core/parse.y"
+ {yyerrok;}
+#line 9430 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 591:
+#line 3871 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ p->lineno += (yyvsp[0].num);
+ p->column = 0;
+ }
+#line 9439 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 594:
+#line 3882 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = 0;
+ }
+#line 9447 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+
+#line 9451 "mrbgems/mruby-compiler/core/y.tab.c"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (p, YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+ yyssp, yytoken)
+ {
+ char const *yymsgp = YY_("syntax error");
+ int yysyntax_error_status;
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ if (yysyntax_error_status == 0)
+ yymsgp = yymsg;
+ else if (yysyntax_error_status == 1)
+ {
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
+ if (!yymsg)
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ yysyntax_error_status = 2;
+ }
+ else
+ {
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ yymsgp = yymsg;
+ }
+ }
+ yyerror (p, yymsgp);
+ if (yysyntax_error_status == 2)
+ goto yyexhaustedlab;
+ }
+# undef YYSYNTAX_ERROR
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, p);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp, p);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+
+#if !defined yyoverflow || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (p, YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+
+/*-----------------------------------------------------.
+| yyreturn -- parsing is finished, return the result. |
+`-----------------------------------------------------*/
+yyreturn:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, p);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[+*yyssp], yyvsp, p);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ return yyresult;
+}
+#line 3886 "mrbgems/mruby-compiler/core/parse.y"
+
+#define pylval (*((YYSTYPE*)(p->ylval)))
+
+static void
+yyerror(parser_state *p, const char *s)
+{
+ char* c;
+ size_t n;
+
+ if (! p->capture_errors) {
+#ifndef MRB_DISABLE_STDIO
+ if (p->filename_sym) {
+ const char *filename = mrb_sym_name_len(p->mrb, p->filename_sym, NULL);
+ fprintf(stderr, "%s:%d:%d: %s\n", filename, p->lineno, p->column, s);
+ }
+ else {
+ fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
+ }
+#endif
+ }
+ else if (p->nerr < sizeof(p->error_buffer) / sizeof(p->error_buffer[0])) {
+ n = strlen(s);
+ c = (char *)parser_palloc(p, n + 1);
+ memcpy(c, s, n + 1);
+ p->error_buffer[p->nerr].message = c;
+ p->error_buffer[p->nerr].lineno = p->lineno;
+ p->error_buffer[p->nerr].column = p->column;
+ }
+ p->nerr++;
+}
+
+static void
+yyerror_c(parser_state *p, const char *msg, char c)
+{
+ char buf[256];
+
+ strncpy(buf, msg, sizeof(buf) - 2);
+ buf[sizeof(buf) - 2] = '\0';
+ strncat(buf, &c, 1);
+ yyerror(p, buf);
+}
+
+static void
+yywarn(parser_state *p, const char *s)
+{
+ char* c;
+ size_t n;
+
+ if (! p->capture_errors) {
+#ifndef MRB_DISABLE_STDIO
+ if (p->filename_sym) {
+ const char *filename = mrb_sym_name_len(p->mrb, p->filename_sym, NULL);
+ fprintf(stderr, "%s:%d:%d: warning: %s\n", filename, p->lineno, p->column, s);
+ }
+ else {
+ fprintf(stderr, "line %d:%d: warning: %s\n", p->lineno, p->column, s);
+ }
+#endif
+ }
+ else if (p->nwarn < sizeof(p->warn_buffer) / sizeof(p->warn_buffer[0])) {
+ n = strlen(s);
+ c = (char *)parser_palloc(p, n + 1);
+ memcpy(c, s, n + 1);
+ p->warn_buffer[p->nwarn].message = c;
+ p->warn_buffer[p->nwarn].lineno = p->lineno;
+ p->warn_buffer[p->nwarn].column = p->column;
+ }
+ p->nwarn++;
+}
+
+static void
+yywarning(parser_state *p, const char *s)
+{
+ yywarn(p, s);
+}
+
+static void
+yywarning_s(parser_state *p, const char *msg, const char *s)
+{
+ char buf[256];
+
+ strncpy(buf, msg, sizeof(buf) - 1);
+ buf[sizeof(buf) - 1] = '\0';
+ strncat(buf, ": ", sizeof(buf) - strlen(buf) - 1);
+ strncat(buf, s, sizeof(buf) - strlen(buf) - 1);
+ yywarning(p, buf);
+}
+
+static void
+backref_error(parser_state *p, node *n)
+{
+ int c;
+
+ c = intn(n->car);
+
+ if (c == NODE_NTH_REF) {
+ yyerror_c(p, "can't set variable $", (char)intn(n->cdr)+'0');
+ }
+ else if (c == NODE_BACK_REF) {
+ yyerror_c(p, "can't set variable $", (char)intn(n->cdr));
+ }
+ else {
+ mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %d", c);
+ }
+}
+
+static void
+void_expr_error(parser_state *p, node *n)
+{
+ int c;
+
+ if (n == NULL) return;
+ c = intn(n->car);
+ switch (c) {
+ case NODE_BREAK:
+ case NODE_RETURN:
+ case NODE_NEXT:
+ case NODE_REDO:
+ case NODE_RETRY:
+ yyerror(p, "void value expression");
+ break;
+ case NODE_AND:
+ case NODE_OR:
+ if (n->cdr) {
+ void_expr_error(p, n->cdr->car);
+ void_expr_error(p, n->cdr->cdr);
+ }
+ break;
+ case NODE_BEGIN:
+ if (n->cdr) {
+ while (n->cdr) {
+ n = n->cdr;
+ }
+ void_expr_error(p, n->car);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void pushback(parser_state *p, int c);
+static mrb_bool peeks(parser_state *p, const char *s);
+static mrb_bool skips(parser_state *p, const char *s);
+
+static inline int
+nextc0(parser_state *p)
+{
+ int c;
+#ifndef MRB_DISABLE_STDIO
+ if (p->f) {
+ if (feof(p->f)) return -1;
+ c = fgetc(p->f);
+ if (c == EOF) return -1;
+ }
+ else
+#endif
+ if (!p->s || p->s >= p->send) {
+ return -1;
+ }
+ else {
+ c = (unsigned char)*p->s++;
+ }
+ return c;
+}
+
+static inline int
+nextc(parser_state *p)
+{
+ int c;
+
+ if (p->pb) {
+ node *tmp;
+
+ c = intn(p->pb->car);
+ tmp = p->pb;
+ p->pb = p->pb->cdr;
+ cons_free(tmp);
+ }
+ else {
+ c = nextc0(p);
+ if (c < 0) goto eof;
+ }
+ if (c >= 0) {
+ p->column++;
+ }
+ if (c == '\r') {
+ const int lf = nextc0(p);
+ if (lf == '\n') {
+ return '\n';
+ }
+ if (lf > 0) pushback(p, lf);
+ }
+ return c;
+
+ eof:
+ if (!p->cxt) return -1;
+ else {
+ if (p->cxt->partial_hook(p) < 0)
+ return -1; /* end of program(s) */
+ return -2; /* end of a file in the program files */
+ }
+}
+
+static void
+pushback(parser_state *p, int c)
+{
+ if (c >= 0) {
+ p->column--;
+ }
+ p->pb = cons(nint(c), p->pb);
+}
+
+static void
+skip(parser_state *p, char term)
+{
+ int c;
+
+ for (;;) {
+ c = nextc(p);
+ if (c < 0) break;
+ if (c == term) break;
+ }
+}
+
+static int
+peekc_n(parser_state *p, int n)
+{
+ node *list = 0;
+ int c0;
+
+ do {
+ c0 = nextc(p);
+ if (c0 == -1) return c0; /* do not skip partial EOF */
+ if (c0 >= 0) --p->column;
+ list = push(list, nint(c0));
+ } while(n--);
+ if (p->pb) {
+ p->pb = append((node*)list, p->pb);
+ }
+ else {
+ p->pb = list;
+ }
+ return c0;
+}
+
+static mrb_bool
+peek_n(parser_state *p, int c, int n)
+{
+ return peekc_n(p, n) == c && c >= 0;
+}
+#define peek(p,c) peek_n((p), (c), 0)
+
+static mrb_bool
+peeks(parser_state *p, const char *s)
+{
+ size_t len = strlen(s);
+
+#ifndef MRB_DISABLE_STDIO
+ if (p->f) {
+ int n = 0;
+ while (*s) {
+ if (!peek_n(p, *s++, n++)) return FALSE;
+ }
+ return TRUE;
+ }
+ else
+#endif
+ if (p->s && p->s + len <= p->send) {
+ if (memcmp(p->s, s, len) == 0) return TRUE;
+ }
+ return FALSE;
+}
+
+static mrb_bool
+skips(parser_state *p, const char *s)
+{
+ int c;
+
+ for (;;) {
+ /* skip until first char */
+ for (;;) {
+ c = nextc(p);
+ if (c < 0) return FALSE;
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ }
+ if (c == *s) break;
+ }
+ s++;
+ if (peeks(p, s)) {
+ size_t len = strlen(s);
+
+ while (len--) {
+ if (nextc(p) == '\n') {
+ p->lineno++;
+ p->column = 0;
+ }
+ }
+ return TRUE;
+ }
+ else{
+ s--;
+ }
+ }
+ return FALSE;
+}
+
+
+static int
+newtok(parser_state *p)
+{
+ if (p->tokbuf != p->buf) {
+ mrb_free(p->mrb, p->tokbuf);
+ p->tokbuf = p->buf;
+ p->tsiz = MRB_PARSER_TOKBUF_SIZE;
+ }
+ p->tidx = 0;
+ return p->column - 1;
+}
+
+static void
+tokadd(parser_state *p, int32_t c)
+{
+ char utf8[4];
+ int i, len;
+
+ /* mrb_assert(-0x10FFFF <= c && c <= 0xFF); */
+ if (c >= 0) {
+ /* Single byte from source or non-Unicode escape */
+ utf8[0] = (char)c;
+ len = 1;
+ }
+ else {
+ /* Unicode character */
+ c = -c;
+ if (c < 0x80) {
+ utf8[0] = (char)c;
+ len = 1;
+ }
+ else if (c < 0x800) {
+ utf8[0] = (char)(0xC0 | (c >> 6));
+ utf8[1] = (char)(0x80 | (c & 0x3F));
+ len = 2;
+ }
+ else if (c < 0x10000) {
+ utf8[0] = (char)(0xE0 | (c >> 12) );
+ utf8[1] = (char)(0x80 | ((c >> 6) & 0x3F));
+ utf8[2] = (char)(0x80 | ( c & 0x3F));
+ len = 3;
+ }
+ else {
+ utf8[0] = (char)(0xF0 | (c >> 18) );
+ utf8[1] = (char)(0x80 | ((c >> 12) & 0x3F));
+ utf8[2] = (char)(0x80 | ((c >> 6) & 0x3F));
+ utf8[3] = (char)(0x80 | ( c & 0x3F));
+ len = 4;
+ }
+ }
+ if (p->tidx+len >= p->tsiz) {
+ if (p->tsiz >= MRB_PARSER_TOKBUF_MAX) {
+ p->tidx += len;
+ return;
+ }
+ p->tsiz *= 2;
+ if (p->tokbuf == p->buf) {
+ p->tokbuf = (char*)mrb_malloc(p->mrb, p->tsiz);
+ memcpy(p->tokbuf, p->buf, MRB_PARSER_TOKBUF_SIZE);
+ }
+ else {
+ p->tokbuf = (char*)mrb_realloc(p->mrb, p->tokbuf, p->tsiz);
+ }
+ }
+ for (i = 0; i < len; i++) {
+ p->tokbuf[p->tidx++] = utf8[i];
+ }
+}
+
+static int
+toklast(parser_state *p)
+{
+ return p->tokbuf[p->tidx-1];
+}
+
+static void
+tokfix(parser_state *p)
+{
+ if (p->tidx >= MRB_PARSER_TOKBUF_MAX) {
+ p->tidx = MRB_PARSER_TOKBUF_MAX-1;
+ yyerror(p, "string too long (truncated)");
+ }
+ p->tokbuf[p->tidx] = '\0';
+}
+
+static const char*
+tok(parser_state *p)
+{
+ return p->tokbuf;
+}
+
+static int
+toklen(parser_state *p)
+{
+ return p->tidx;
+}
+
+#define IS_ARG() (p->lstate == EXPR_ARG || p->lstate == EXPR_CMDARG)
+#define IS_END() (p->lstate == EXPR_END || p->lstate == EXPR_ENDARG || p->lstate == EXPR_ENDFN)
+#define IS_BEG() (p->lstate == EXPR_BEG || p->lstate == EXPR_MID || p->lstate == EXPR_VALUE || p->lstate == EXPR_CLASS)
+#define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c))
+#define IS_LABEL_POSSIBLE() ((p->lstate == EXPR_BEG && !cmd_state) || IS_ARG())
+#define IS_LABEL_SUFFIX(n) (peek_n(p, ':',(n)) && !peek_n(p, ':', (n)+1))
+
+static int32_t
+scan_oct(const int *start, int len, int *retlen)
+{
+ const int *s = start;
+ int32_t retval = 0;
+
+ /* mrb_assert(len <= 3) */
+ while (len-- && *s >= '0' && *s <= '7') {
+ retval <<= 3;
+ retval |= *s++ - '0';
+ }
+ *retlen = (int)(s - start);
+
+ return retval;
+}
+
+static int32_t
+scan_hex(parser_state *p, const int *start, int len, int *retlen)
+{
+ static const char hexdigit[] = "0123456789abcdef0123456789ABCDEF";
+ const int *s = start;
+ uint32_t retval = 0;
+ char *tmp;
+
+ /* mrb_assert(len <= 8) */
+ while (len-- && *s && (tmp = (char*)strchr(hexdigit, *s))) {
+ retval <<= 4;
+ retval |= (tmp - hexdigit) & 15;
+ s++;
+ }
+ *retlen = (int)(s - start);
+
+ return (int32_t)retval;
+}
+
+static int32_t
+read_escape_unicode(parser_state *p, int limit)
+{
+ int buf[9];
+ int i;
+ int32_t hex;
+
+ /* Look for opening brace */
+ i = 0;
+ buf[0] = nextc(p);
+ if (buf[0] < 0) {
+ eof:
+ yyerror(p, "invalid escape character syntax");
+ return -1;
+ }
+ if (ISXDIGIT(buf[0])) {
+ /* \uxxxx form */
+ for (i=1; i<limit; i++) {
+ buf[i] = nextc(p);
+ if (buf[i] < 0) goto eof;
+ if (!ISXDIGIT(buf[i])) {
+ pushback(p, buf[i]);
+ break;
+ }
+ }
+ }
+ else {
+ pushback(p, buf[0]);
+ }
+ hex = scan_hex(p, buf, i, &i);
+ if (i == 0 || hex > 0x10FFFF || (hex & 0xFFFFF800) == 0xD800) {
+ yyerror(p, "invalid Unicode code point");
+ return -1;
+ }
+ return hex;
+}
+
+/* Return negative to indicate Unicode code point */
+static int32_t
+read_escape(parser_state *p)
+{
+ int32_t c;
+
+ switch (c = nextc(p)) {
+ case '\\':/* Backslash */
+ return c;
+
+ case 'n':/* newline */
+ return '\n';
+
+ case 't':/* horizontal tab */
+ return '\t';
+
+ case 'r':/* carriage-return */
+ return '\r';
+
+ case 'f':/* form-feed */
+ return '\f';
+
+ case 'v':/* vertical tab */
+ return '\13';
+
+ case 'a':/* alarm(bell) */
+ return '\007';
+
+ case 'e':/* escape */
+ return 033;
+
+ case '0': case '1': case '2': case '3': /* octal constant */
+ case '4': case '5': case '6': case '7':
+ {
+ int buf[3];
+ int i;
+
+ buf[0] = c;
+ for (i=1; i<3; i++) {
+ buf[i] = nextc(p);
+ if (buf[i] < 0) goto eof;
+ if (buf[i] < '0' || '7' < buf[i]) {
+ pushback(p, buf[i]);
+ break;
+ }
+ }
+ c = scan_oct(buf, i, &i);
+ }
+ return c;
+
+ case 'x': /* hex constant */
+ {
+ int buf[2];
+ int i;
+
+ for (i=0; i<2; i++) {
+ buf[i] = nextc(p);
+ if (buf[i] < 0) goto eof;
+ if (!ISXDIGIT(buf[i])) {
+ pushback(p, buf[i]);
+ break;
+ }
+ }
+ if (i == 0) {
+ yyerror(p, "invalid hex escape");
+ return -1;
+ }
+ return scan_hex(p, buf, i, &i);
+ }
+
+ case 'u': /* Unicode */
+ if (peek(p, '{')) {
+ /* \u{xxxxxxxx} form */
+ nextc(p);
+ c = read_escape_unicode(p, 8);
+ if (c < 0) return 0;
+ if (nextc(p) != '}') goto eof;
+ }
+ else {
+ c = read_escape_unicode(p, 4);
+ if (c < 0) return 0;
+ }
+ return -c;
+
+ case 'b':/* backspace */
+ return '\010';
+
+ case 's':/* space */
+ return ' ';
+
+ case 'M':
+ if ((c = nextc(p)) != '-') {
+ yyerror(p, "Invalid escape character syntax");
+ pushback(p, c);
+ return '\0';
+ }
+ if ((c = nextc(p)) == '\\') {
+ return read_escape(p) | 0x80;
+ }
+ else if (c < 0) goto eof;
+ else {
+ return ((c & 0xff) | 0x80);
+ }
+
+ case 'C':
+ if ((c = nextc(p)) != '-') {
+ yyerror(p, "Invalid escape character syntax");
+ pushback(p, c);
+ return '\0';
+ }
+ case 'c':
+ if ((c = nextc(p))== '\\') {
+ c = read_escape(p);
+ }
+ else if (c == '?')
+ return 0177;
+ else if (c < 0) goto eof;
+ return c & 0x9f;
+
+ eof:
+ case -1:
+ case -2: /* end of a file */
+ yyerror(p, "Invalid escape character syntax");
+ return '\0';
+
+ default:
+ return c;
+ }
+}
+
+static int
+parse_string(parser_state *p)
+{
+ int c;
+ string_type type = (string_type)(intptr_t)p->lex_strterm->car;
+ int nest_level = intn(p->lex_strterm->cdr->car);
+ int beg = intn(p->lex_strterm->cdr->cdr->car);
+ int end = intn(p->lex_strterm->cdr->cdr->cdr);
+ parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL;
+
+ if (beg == 0) beg = -3; /* should never happen */
+ if (end == 0) end = -3;
+ newtok(p);
+ while ((c = nextc(p)) != end || nest_level != 0) {
+ if (hinf && (c == '\n' || c < 0)) {
+ mrb_bool line_head;
+ tokadd(p, '\n');
+ tokfix(p);
+ p->lineno++;
+ p->column = 0;
+ line_head = hinf->line_head;
+ hinf->line_head = TRUE;
+ if (line_head) {
+ /* check whether end of heredoc */
+ const char *s = tok(p);
+ int len = toklen(p);
+ if (hinf->allow_indent) {
+ while (ISSPACE(*s) && len > 0) {
+ ++s;
+ --len;
+ }
+ }
+ if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) {
+ return tHEREDOC_END;
+ }
+ }
+ if (c < 0) {
+ char buf[256];
+ const char s1[] = "can't find heredoc delimiter \"";
+ const char s2[] = "\" anywhere before EOF";
+
+ if (sizeof(s1)+sizeof(s2)+strlen(hinf->term)+1 >= sizeof(buf)) {
+ yyerror(p, "can't find heredoc delimiter anywhere before EOF");
+ } else {
+ strcpy(buf, s1);
+ strcat(buf, hinf->term);
+ strcat(buf, s2);
+ yyerror(p, buf);
+ }
+ return 0;
+ }
+ pylval.nd = new_str(p, tok(p), toklen(p));
+ return tHD_STRING_MID;
+ }
+ if (c < 0) {
+ yyerror(p, "unterminated string meets end of file");
+ return 0;
+ }
+ else if (c == beg) {
+ nest_level++;
+ p->lex_strterm->cdr->car = nint(nest_level);
+ }
+ else if (c == end) {
+ nest_level--;
+ p->lex_strterm->cdr->car = nint(nest_level);
+ }
+ else if (c == '\\') {
+ c = nextc(p);
+ if (type & STR_FUNC_EXPAND) {
+ if (c == end || c == beg) {
+ tokadd(p, c);
+ }
+ else if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ if (type & STR_FUNC_ARRAY) {
+ tokadd(p, '\n');
+ }
+ }
+ else if (type & STR_FUNC_REGEXP) {
+ tokadd(p, '\\');
+ tokadd(p, c);
+ }
+ else if (c == 'u' && peek(p, '{')) {
+ /* \u{xxxx xxxx xxxx} form */
+ nextc(p);
+ while (1) {
+ do c = nextc(p); while (ISSPACE(c));
+ if (c == '}') break;
+ pushback(p, c);
+ c = read_escape_unicode(p, 8);
+ if (c < 0) break;
+ tokadd(p, -c);
+ }
+ if (hinf)
+ hinf->line_head = FALSE;
+ }
+ else {
+ pushback(p, c);
+ tokadd(p, read_escape(p));
+ if (hinf)
+ hinf->line_head = FALSE;
+ }
+ }
+ else {
+ if (c != beg && c != end) {
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ }
+ if (!(c == '\\' || ((type & STR_FUNC_ARRAY) && ISSPACE(c)))) {
+ tokadd(p, '\\');
+ }
+ }
+ tokadd(p, c);
+ }
+ continue;
+ }
+ else if ((c == '#') && (type & STR_FUNC_EXPAND)) {
+ c = nextc(p);
+ if (c == '{') {
+ tokfix(p);
+ p->lstate = EXPR_BEG;
+ p->cmd_start = TRUE;
+ pylval.nd = new_str(p, tok(p), toklen(p));
+ if (hinf) {
+ hinf->line_head = FALSE;
+ return tHD_STRING_PART;
+ }
+ return tSTRING_PART;
+ }
+ tokadd(p, '#');
+ pushback(p, c);
+ continue;
+ }
+ if ((type & STR_FUNC_ARRAY) && ISSPACE(c)) {
+ if (toklen(p) == 0) {
+ do {
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ heredoc_treat_nextline(p);
+ if (p->parsing_heredoc != NULL) {
+ return tHD_LITERAL_DELIM;
+ }
+ }
+ c = nextc(p);
+ } while (ISSPACE(c));
+ pushback(p, c);
+ return tLITERAL_DELIM;
+ }
+ else {
+ pushback(p, c);
+ tokfix(p);
+ pylval.nd = new_str(p, tok(p), toklen(p));
+ return tSTRING_MID;
+ }
+ }
+ if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
+ }
+ tokadd(p, c);
+ }
+
+ tokfix(p);
+ p->lstate = EXPR_ENDARG;
+ end_strterm(p);
+
+ if (type & STR_FUNC_XQUOTE) {
+ pylval.nd = new_xstr(p, tok(p), toklen(p));
+ return tXSTRING;
+ }
+
+ if (type & STR_FUNC_REGEXP) {
+ int f = 0;
+ int re_opt;
+ char *s = strndup(tok(p), toklen(p));
+ char flags[3];
+ char *flag = flags;
+ char enc = '\0';
+ char *encp;
+ char *dup;
+
+ newtok(p);
+ while (re_opt = nextc(p), re_opt >= 0 && ISALPHA(re_opt)) {
+ switch (re_opt) {
+ case 'i': f |= 1; break;
+ case 'x': f |= 2; break;
+ case 'm': f |= 4; break;
+ case 'u': f |= 16; break;
+ case 'n': f |= 32; break;
+ case 'o': break;
+ default: tokadd(p, re_opt); break;
+ }
+ }
+ pushback(p, re_opt);
+ if (toklen(p)) {
+ char msg[128];
+
+ strcpy(msg, "unknown regexp option");
+ tokfix(p);
+ if (toklen(p) > 1) {
+ strcat(msg, "s");
+ }
+ strcat(msg, " - ");
+ strncat(msg, tok(p), sizeof(msg) - strlen(msg) - 1);
+ yyerror(p, msg);
+ }
+ if (f != 0) {
+ if (f & 1) *flag++ = 'i';
+ if (f & 2) *flag++ = 'x';
+ if (f & 4) *flag++ = 'm';
+ if (f & 16) enc = 'u';
+ if (f & 32) enc = 'n';
+ }
+ if (flag > flags) {
+ dup = strndup(flags, (size_t)(flag - flags));
+ }
+ else {
+ dup = NULL;
+ }
+ if (enc) {
+ encp = strndup(&enc, 1);
+ }
+ else {
+ encp = NULL;
+ }
+ pylval.nd = new_regx(p, s, dup, encp);
+
+ return tREGEXP;
+ }
+ pylval.nd = new_str(p, tok(p), toklen(p));
+
+ return tSTRING;
+}
+
+static int
+number_literal_suffix(parser_state *p)
+{
+ int c, result = 0;
+ node *list = 0;
+ int column = p->column;
+ int mask = NUM_SUFFIX_R|NUM_SUFFIX_I;
+
+ while ((c = nextc(p)) != -1) {
+ list = push(list, (node*)(intptr_t)c);
+
+ if ((mask & NUM_SUFFIX_I) && c == 'i') {
+ result |= (mask & NUM_SUFFIX_I);
+ mask &= ~NUM_SUFFIX_I;
+ /* r after i, rational of complex is disallowed */
+ mask &= ~NUM_SUFFIX_R;
+ continue;
+ }
+ if ((mask & NUM_SUFFIX_R) && c == 'r') {
+ result |= (mask & NUM_SUFFIX_R);
+ mask &= ~NUM_SUFFIX_R;
+ continue;
+ }
+ if (!ISASCII(c) || ISALPHA(c) || c == '_') {
+ p->column = column;
+ if (p->pb) {
+ p->pb = append((node*)list, p->pb);
+ }
+ else {
+ p->pb = list;
+ }
+ return 0;
+ }
+ pushback(p, c);
+ break;
+ }
+ return result;
+}
+
+static int
+heredoc_identifier(parser_state *p)
+{
+ int c;
+ int type = str_heredoc;
+ mrb_bool indent = FALSE;
+ mrb_bool quote = FALSE;
+ node *newnode;
+ parser_heredoc_info *info;
+
+ c = nextc(p);
+ if (ISSPACE(c) || c == '=') {
+ pushback(p, c);
+ return 0;
+ }
+ if (c == '-') {
+ indent = TRUE;
+ c = nextc(p);
+ }
+ if (c == '\'' || c == '"') {
+ int term = c;
+ if (c == '\'')
+ quote = TRUE;
+ newtok(p);
+ while ((c = nextc(p)) >= 0 && c != term) {
+ if (c == '\n') {
+ c = -1;
+ break;
+ }
+ tokadd(p, c);
+ }
+ if (c < 0) {
+ yyerror(p, "unterminated here document identifier");
+ return 0;
+ }
+ }
+ else {
+ if (c < 0) {
+ return 0; /* missing here document identifier */
+ }
+ if (! identchar(c)) {
+ pushback(p, c);
+ if (indent) pushback(p, '-');
+ return 0;
+ }
+ newtok(p);
+ do {
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0 && identchar(c));
+ pushback(p, c);
+ }
+ tokfix(p);
+ newnode = new_heredoc(p);
+ info = (parser_heredoc_info*)newnode->cdr;
+ info->term = strndup(tok(p), toklen(p));
+ info->term_len = toklen(p);
+ if (! quote)
+ type |= STR_FUNC_EXPAND;
+ info->type = (string_type)type;
+ info->allow_indent = indent;
+ info->line_head = TRUE;
+ info->doc = NULL;
+ p->heredocs_from_nextline = push(p->heredocs_from_nextline, newnode);
+ p->lstate = EXPR_END;
+
+ pylval.nd = newnode;
+ return tHEREDOC_BEG;
+}
+
+static int
+arg_ambiguous(parser_state *p)
+{
+ yywarning(p, "ambiguous first argument; put parentheses or even spaces");
+ return 1;
+}
+
+#include "lex.def"
+
+static int
+parser_yylex(parser_state *p)
+{
+ int32_t c;
+ int nlines = 1;
+ int space_seen = 0;
+ int cmd_state;
+ enum mrb_lex_state_enum last_state;
+ int token_column;
+
+ if (p->lex_strterm) {
+ if (is_strterm_type(p, STR_FUNC_HEREDOC)) {
+ if (p->parsing_heredoc != NULL)
+ return parse_string(p);
+ }
+ else
+ return parse_string(p);
+ }
+ cmd_state = p->cmd_start;
+ p->cmd_start = FALSE;
+ retry:
+ last_state = p->lstate;
+ switch (c = nextc(p)) {
+ case '\004': /* ^D */
+ case '\032': /* ^Z */
+ case '\0': /* NUL */
+ case -1: /* end of script. */
+ if (p->heredocs_from_nextline)
+ goto maybe_heredoc;
+ return 0;
+
+ /* white spaces */
+ case ' ': case '\t': case '\f': case '\r':
+ case '\13': /* '\v' */
+ space_seen = 1;
+ goto retry;
+
+ case '#': /* it's a comment */
+ skip(p, '\n');
+ /* fall through */
+ case -2: /* end of a file */
+ case '\n':
+ maybe_heredoc:
+ heredoc_treat_nextline(p);
+ p->column = 0;
+ switch (p->lstate) {
+ case EXPR_BEG:
+ case EXPR_FNAME:
+ case EXPR_DOT:
+ case EXPR_CLASS:
+ case EXPR_VALUE:
+ p->lineno++;
+ if (p->parsing_heredoc != NULL) {
+ if (p->lex_strterm) {
+ return parse_string(p);
+ }
+ }
+ goto retry;
+ default:
+ break;
+ }
+ if (p->parsing_heredoc != NULL) {
+ pylval.num = nlines;
+ return '\n';
+ }
+ while ((c = nextc(p))) {
+ switch (c) {
+ case ' ': case '\t': case '\f': case '\r':
+ case '\13': /* '\v' */
+ space_seen = 1;
+ break;
+ case '#': /* comment as a whitespace */
+ skip(p, '\n');
+ nlines++;
+ break;
+ case '.':
+ if (!peek(p, '.')) {
+ pushback(p, '.');
+ p->lineno+=nlines; nlines=1;
+ goto retry;
+ }
+ pushback(p, c);
+ goto normal_newline;
+ case '&':
+ if (peek(p, '.')) {
+ pushback(p, '&');
+ p->lineno+=nlines; nlines=1;
+ goto retry;
+ }
+ pushback(p, c);
+ goto normal_newline;
+ case -1: /* EOF */
+ case -2: /* end of a file */
+ goto normal_newline;
+ default:
+ pushback(p, c);
+ goto normal_newline;
+ }
+ }
+ normal_newline:
+ p->cmd_start = TRUE;
+ p->lstate = EXPR_BEG;
+ pylval.num = nlines;
+ return '\n';
+
+ case '*':
+ if ((c = nextc(p)) == '*') {
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit("**");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ if (IS_SPCARG(c)) {
+ yywarning(p, "'**' interpreted as argument prefix");
+ c = tDSTAR;
+ }
+ else if (IS_BEG()) {
+ c = tDSTAR;
+ }
+ else {
+ c = tPOW; /* "**", "argument prefix" */
+ }
+ }
+ else {
+ if (c == '=') {
+ pylval.id = intern_lit("*");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ if (IS_SPCARG(c)) {
+ yywarning(p, "'*' interpreted as argument prefix");
+ c = tSTAR;
+ }
+ else if (IS_BEG()) {
+ c = tSTAR;
+ }
+ else {
+ c = '*';
+ }
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return c;
+
+ case '!':
+ c = nextc(p);
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if (c == '@') {
+ return '!';
+ }
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ if (c == '=') {
+ return tNEQ;
+ }
+ if (c == '~') {
+ return tNMATCH;
+ }
+ pushback(p, c);
+ return '!';
+
+ case '=':
+ if (p->column == 1) {
+ static const char begin[] = "begin";
+ static const char end[] = "\n=end";
+ if (peeks(p, begin)) {
+ c = peekc_n(p, sizeof(begin)-1);
+ if (c < 0 || ISSPACE(c)) {
+ do {
+ if (!skips(p, end)) {
+ yyerror(p, "embedded document meets end of file");
+ return 0;
+ }
+ c = nextc(p);
+ } while (!(c < 0 || ISSPACE(c)));
+ if (c != '\n') skip(p, '\n');
+ p->lineno+=nlines; nlines=1;
+ p->column = 0;
+ goto retry;
+ }
+ }
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ if ((c = nextc(p)) == '=') {
+ if ((c = nextc(p)) == '=') {
+ return tEQQ;
+ }
+ pushback(p, c);
+ return tEQ;
+ }
+ if (c == '~') {
+ return tMATCH;
+ }
+ else if (c == '>') {
+ return tASSOC;
+ }
+ pushback(p, c);
+ return '=';
+
+ case '<':
+ c = nextc(p);
+ if (c == '<' &&
+ p->lstate != EXPR_DOT &&
+ p->lstate != EXPR_CLASS &&
+ !IS_END() &&
+ (!IS_ARG() || space_seen)) {
+ int token = heredoc_identifier(p);
+ if (token)
+ return token;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ if (p->lstate == EXPR_CLASS) {
+ p->cmd_start = TRUE;
+ }
+ }
+ if (c == '=') {
+ if ((c = nextc(p)) == '>') {
+ return tCMP;
+ }
+ pushback(p, c);
+ return tLEQ;
+ }
+ if (c == '<') {
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit("<<");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tLSHFT;
+ }
+ pushback(p, c);
+ return '<';
+
+ case '>':
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ if ((c = nextc(p)) == '=') {
+ return tGEQ;
+ }
+ if (c == '>') {
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit(">>");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tRSHFT;
+ }
+ pushback(p, c);
+ return '>';
+
+ case '"':
+ p->lex_strterm = new_strterm(p, str_dquote, '"', 0);
+ return tSTRING_BEG;
+
+ case '\'':
+ p->lex_strterm = new_strterm(p, str_squote, '\'', 0);
+ return parse_string(p);
+
+ case '`':
+ if (p->lstate == EXPR_FNAME) {
+ p->lstate = EXPR_ENDFN;
+ return '`';
+ }
+ if (p->lstate == EXPR_DOT) {
+ if (cmd_state)
+ p->lstate = EXPR_CMDARG;
+ else
+ p->lstate = EXPR_ARG;
+ return '`';
+ }
+ p->lex_strterm = new_strterm(p, str_xquote, '`', 0);
+ return tXSTRING_BEG;
+
+ case '?':
+ if (IS_END()) {
+ p->lstate = EXPR_VALUE;
+ return '?';
+ }
+ c = nextc(p);
+ if (c < 0) {
+ yyerror(p, "incomplete character syntax");
+ return 0;
+ }
+ if (ISSPACE(c)) {
+ if (!IS_ARG()) {
+ int c2;
+ switch (c) {
+ case ' ':
+ c2 = 's';
+ break;
+ case '\n':
+ c2 = 'n';
+ break;
+ case '\t':
+ c2 = 't';
+ break;
+ case '\v':
+ c2 = 'v';
+ break;
+ case '\r':
+ c2 = 'r';
+ break;
+ case '\f':
+ c2 = 'f';
+ break;
+ default:
+ c2 = 0;
+ break;
+ }
+ if (c2) {
+ char buf[256];
+ char cc[] = { (char)c2, '\0' };
+
+ strcpy(buf, "invalid character syntax; use ?\\");
+ strncat(buf, cc, 2);
+ yyerror(p, buf);
+ }
+ }
+ ternary:
+ pushback(p, c);
+ p->lstate = EXPR_VALUE;
+ return '?';
+ }
+ newtok(p);
+ /* need support UTF-8 if configured */
+ if ((ISALNUM(c) || c == '_')) {
+ int c2 = nextc(p);
+ pushback(p, c2);
+ if ((ISALNUM(c2) || c2 == '_')) {
+ goto ternary;
+ }
+ }
+ if (c == '\\') {
+ c = read_escape(p);
+ tokadd(p, c);
+ }
+ else {
+ tokadd(p, c);
+ }
+ tokfix(p);
+ pylval.nd = new_str(p, tok(p), toklen(p));
+ p->lstate = EXPR_ENDARG;
+ return tCHAR;
+
+ case '&':
+ if ((c = nextc(p)) == '&') {
+ p->lstate = EXPR_BEG;
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit("&&");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tANDOP;
+ }
+ else if (c == '.') {
+ p->lstate = EXPR_DOT;
+ return tANDDOT;
+ }
+ else if (c == '=') {
+ pylval.id = intern_lit("&");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ if (IS_SPCARG(c)) {
+ yywarning(p, "'&' interpreted as argument prefix");
+ c = tAMPER;
+ }
+ else if (IS_BEG()) {
+ c = tAMPER;
+ }
+ else {
+ c = '&';
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return c;
+
+ case '|':
+ if ((c = nextc(p)) == '|') {
+ p->lstate = EXPR_BEG;
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit("||");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ return tOROP;
+ }
+ if (c == '=') {
+ pylval.id = intern_lit("|");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ pushback(p, c);
+ return '|';
+
+ case '+':
+ c = nextc(p);
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if (c == '@') {
+ return tUPLUS;
+ }
+ pushback(p, c);
+ return '+';
+ }
+ if (c == '=') {
+ pylval.id = intern_lit("+");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous(p))) {
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ if (c >= 0 && ISDIGIT(c)) {
+ c = '+';
+ goto start_num;
+ }
+ return tUPLUS;
+ }
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ return '+';
+
+ case '-':
+ c = nextc(p);
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if (c == '@') {
+ return tUMINUS;
+ }
+ pushback(p, c);
+ return '-';
+ }
+ if (c == '=') {
+ pylval.id = intern_lit("-");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (c == '>') {
+ p->lstate = EXPR_ENDFN;
+ return tLAMBDA;
+ }
+ if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous(p))) {
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ if (c >= 0 && ISDIGIT(c)) {
+ return tUMINUS_NUM;
+ }
+ return tUMINUS;
+ }
+ p->lstate = EXPR_BEG;
+ pushback(p, c);
+ return '-';
+
+ case '.':
+ p->lstate = EXPR_BEG;
+ if ((c = nextc(p)) == '.') {
+ if ((c = nextc(p)) == '.') {
+ return tDOT3;
+ }
+ pushback(p, c);
+ return tDOT2;
+ }
+ pushback(p, c);
+ if (c >= 0 && ISDIGIT(c)) {
+ yyerror(p, "no .<digit> floating literal anymore; put 0 before dot");
+ }
+ p->lstate = EXPR_DOT;
+ return '.';
+
+ start_num:
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ int is_float, seen_point, seen_e, nondigit;
+ int suffix = 0;
+
+ is_float = seen_point = seen_e = nondigit = 0;
+ p->lstate = EXPR_ENDARG;
+ newtok(p);
+ if (c == '-' || c == '+') {
+ tokadd(p, c);
+ c = nextc(p);
+ }
+ if (c == '0') {
+#define no_digits() do {yyerror(p,"numeric literal without digits"); return 0;} while (0)
+ int start = toklen(p);
+ c = nextc(p);
+ if (c == 'x' || c == 'X') {
+ /* hexadecimal */
+ c = nextc(p);
+ if (c >= 0 && ISXDIGIT(c)) {
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (!ISXDIGIT(c)) break;
+ nondigit = 0;
+ tokadd(p, tolower(c));
+ } while ((c = nextc(p)) >= 0);
+ }
+ pushback(p, c);
+ tokfix(p);
+ if (toklen(p) == start) {
+ no_digits();
+ }
+ else if (nondigit) goto trailing_uc;
+ suffix = number_literal_suffix(p);
+ pylval.nd = new_int(p, tok(p), 16, suffix);
+ return tINTEGER;
+ }
+ if (c == 'b' || c == 'B') {
+ /* binary */
+ c = nextc(p);
+ if (c == '0' || c == '1') {
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (c != '0' && c != '1') break;
+ nondigit = 0;
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0);
+ }
+ pushback(p, c);
+ tokfix(p);
+ if (toklen(p) == start) {
+ no_digits();
+ }
+ else if (nondigit) goto trailing_uc;
+ suffix = number_literal_suffix(p);
+ pylval.nd = new_int(p, tok(p), 2, suffix);
+ return tINTEGER;
+ }
+ if (c == 'd' || c == 'D') {
+ /* decimal */
+ c = nextc(p);
+ if (c >= 0 && ISDIGIT(c)) {
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (!ISDIGIT(c)) break;
+ nondigit = 0;
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0);
+ }
+ pushback(p, c);
+ tokfix(p);
+ if (toklen(p) == start) {
+ no_digits();
+ }
+ else if (nondigit) goto trailing_uc;
+ suffix = number_literal_suffix(p);
+ pylval.nd = new_int(p, tok(p), 10, suffix);
+ return tINTEGER;
+ }
+ if (c == '_') {
+ /* 0_0 */
+ goto octal_number;
+ }
+ if (c == 'o' || c == 'O') {
+ /* prefixed octal */
+ c = nextc(p);
+ if (c < 0 || c == '_' || !ISDIGIT(c)) {
+ no_digits();
+ }
+ }
+ if (c >= '0' && c <= '7') {
+ /* octal */
+ octal_number:
+ do {
+ if (c == '_') {
+ if (nondigit) break;
+ nondigit = c;
+ continue;
+ }
+ if (c < '0' || c > '9') break;
+ if (c > '7') goto invalid_octal;
+ nondigit = 0;
+ tokadd(p, c);
+ } while ((c = nextc(p)) >= 0);
+
+ if (toklen(p) > start) {
+ pushback(p, c);
+ tokfix(p);
+ if (nondigit) goto trailing_uc;
+ suffix = number_literal_suffix(p);
+ pylval.nd = new_int(p, tok(p), 8, suffix);
+ return tINTEGER;
+ }
+ if (nondigit) {
+ pushback(p, c);
+ goto trailing_uc;
+ }
+ }
+ if (c > '7' && c <= '9') {
+ invalid_octal:
+ yyerror(p, "Invalid octal digit");
+ }
+ else if (c == '.' || c == 'e' || c == 'E') {
+ tokadd(p, '0');
+ }
+ else {
+ pushback(p, c);
+ suffix = number_literal_suffix(p);
+ pylval.nd = new_int(p, "0", 10, suffix);
+ return tINTEGER;
+ }
+ }
+
+ for (;;) {
+ switch (c) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ nondigit = 0;
+ tokadd(p, c);
+ break;
+
+ case '.':
+ if (nondigit) goto trailing_uc;
+ if (seen_point || seen_e) {
+ goto decode_num;
+ }
+ else {
+ int c0 = nextc(p);
+ if (c0 < 0 || !ISDIGIT(c0)) {
+ pushback(p, c0);
+ goto decode_num;
+ }
+ c = c0;
+ }
+ tokadd(p, '.');
+ tokadd(p, c);
+ is_float++;
+ seen_point++;
+ nondigit = 0;
+ break;
+
+ case 'e':
+ case 'E':
+ if (nondigit) {
+ pushback(p, c);
+ c = nondigit;
+ goto decode_num;
+ }
+ if (seen_e) {
+ goto decode_num;
+ }
+ tokadd(p, c);
+ seen_e++;
+ is_float++;
+ nondigit = c;
+ c = nextc(p);
+ if (c != '-' && c != '+') continue;
+ tokadd(p, c);
+ nondigit = c;
+ break;
+
+ case '_': /* '_' in number just ignored */
+ if (nondigit) goto decode_num;
+ nondigit = c;
+ break;
+
+ default:
+ goto decode_num;
+ }
+ c = nextc(p);
+ }
+
+ decode_num:
+ pushback(p, c);
+ if (nondigit) {
+ trailing_uc:
+ yyerror_c(p, "trailing non digit in number: ", (char)nondigit);
+ }
+ tokfix(p);
+ if (is_float) {
+#ifdef MRB_WITHOUT_FLOAT
+ yywarning_s(p, "floating point numbers are not supported", tok(p));
+ pylval.nd = new_int(p, "0", 10, 0);
+ return tINTEGER;
+#else
+ double d;
+ char *endp;
+
+ errno = 0;
+ d = mrb_float_read(tok(p), &endp);
+ if (d == 0 && endp == tok(p)) {
+ yywarning_s(p, "corrupted float value", tok(p));
+ }
+ else if (errno == ERANGE) {
+ yywarning_s(p, "float out of range", tok(p));
+ errno = 0;
+ }
+ suffix = number_literal_suffix(p);
+ pylval.nd = new_float(p, tok(p), suffix);
+ return tFLOAT;
+#endif
+ }
+ suffix = number_literal_suffix(p);
+ pylval.nd = new_int(p, tok(p), 10, suffix);
+ return tINTEGER;
+ }
+
+ case ')':
+ case ']':
+ p->paren_nest--;
+ /* fall through */
+ case '}':
+ COND_LEXPOP();
+ CMDARG_LEXPOP();
+ if (c == ')')
+ p->lstate = EXPR_ENDFN;
+ else
+ p->lstate = EXPR_END;
+ return c;
+
+ case ':':
+ c = nextc(p);
+ if (c == ':') {
+ if (IS_BEG() || p->lstate == EXPR_CLASS || IS_SPCARG(-1)) {
+ p->lstate = EXPR_BEG;
+ return tCOLON3;
+ }
+ p->lstate = EXPR_DOT;
+ return tCOLON2;
+ }
+ if (!space_seen && IS_END()) {
+ pushback(p, c);
+ p->lstate = EXPR_BEG;
+ return tLABEL_TAG;
+ }
+ if (!ISSPACE(c) || IS_BEG()) {
+ pushback(p, c);
+ p->lstate = EXPR_FNAME;
+ return tSYMBEG;
+ }
+ pushback(p, c);
+ p->lstate = EXPR_BEG;
+ return ':';
+
+ case '/':
+ if (IS_BEG()) {
+ p->lex_strterm = new_strterm(p, str_regexp, '/', 0);
+ return tREGEXP_BEG;
+ }
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit("/");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ pushback(p, c);
+ if (IS_SPCARG(c)) {
+ p->lex_strterm = new_strterm(p, str_regexp, '/', 0);
+ return tREGEXP_BEG;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return '/';
+
+ case '^':
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit("^");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ pushback(p, c);
+ return '^';
+
+ case ';':
+ p->lstate = EXPR_BEG;
+ return ';';
+
+ case ',':
+ p->lstate = EXPR_BEG;
+ return ',';
+
+ case '~':
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ if ((c = nextc(p)) != '@') {
+ pushback(p, c);
+ }
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ return '~';
+
+ case '(':
+ if (IS_BEG()) {
+ c = tLPAREN;
+ }
+ else if (IS_SPCARG(-1)) {
+ c = tLPAREN_ARG;
+ }
+ else if (p->lstate == EXPR_END && space_seen) {
+ c = tLPAREN_ARG;
+ }
+ p->paren_nest++;
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ p->lstate = EXPR_BEG;
+ return c;
+
+ case '[':
+ p->paren_nest++;
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ if ((c = nextc(p)) == ']') {
+ if ((c = nextc(p)) == '=') {
+ return tASET;
+ }
+ pushback(p, c);
+ return tAREF;
+ }
+ pushback(p, c);
+ return '[';
+ }
+ else if (IS_BEG()) {
+ c = tLBRACK;
+ }
+ else if (IS_ARG() && space_seen) {
+ c = tLBRACK;
+ }
+ p->lstate = EXPR_BEG;
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ return c;
+
+ case '{':
+ if (p->lpar_beg && p->lpar_beg == p->paren_nest) {
+ p->lstate = EXPR_BEG;
+ p->lpar_beg = 0;
+ p->paren_nest--;
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ return tLAMBEG;
+ }
+ if (IS_ARG() || p->lstate == EXPR_END || p->lstate == EXPR_ENDFN)
+ c = '{'; /* block (primary) */
+ else if (p->lstate == EXPR_ENDARG)
+ c = tLBRACE_ARG; /* block (expr) */
+ else
+ c = tLBRACE; /* hash */
+ COND_PUSH(0);
+ CMDARG_PUSH(0);
+ p->lstate = EXPR_BEG;
+ return c;
+
+ case '\\':
+ c = nextc(p);
+ if (c == '\n') {
+ p->lineno+=nlines; nlines=1;
+ p->column = 0;
+ space_seen = 1;
+ goto retry; /* skip \\n */
+ }
+ pushback(p, c);
+ return '\\';
+
+ case '%':
+ if (IS_BEG()) {
+ int term;
+ int paren;
+
+ c = nextc(p);
+ quotation:
+ if (c < 0 || !ISALNUM(c)) {
+ term = c;
+ c = 'Q';
+ }
+ else {
+ term = nextc(p);
+ if (ISALNUM(term)) {
+ yyerror(p, "unknown type of %string");
+ return 0;
+ }
+ }
+ if (c < 0 || term < 0) {
+ yyerror(p, "unterminated quoted string meets end of file");
+ return 0;
+ }
+ paren = term;
+ if (term == '(') term = ')';
+ else if (term == '[') term = ']';
+ else if (term == '{') term = '}';
+ else if (term == '<') term = '>';
+ else paren = 0;
+
+ switch (c) {
+ case 'Q':
+ p->lex_strterm = new_strterm(p, str_dquote, term, paren);
+ return tSTRING_BEG;
+
+ case 'q':
+ p->lex_strterm = new_strterm(p, str_squote, term, paren);
+ return parse_string(p);
+
+ case 'W':
+ p->lex_strterm = new_strterm(p, str_dword, term, paren);
+ return tWORDS_BEG;
+
+ case 'w':
+ p->lex_strterm = new_strterm(p, str_sword, term, paren);
+ return tWORDS_BEG;
+
+ case 'x':
+ p->lex_strterm = new_strterm(p, str_xquote, term, paren);
+ return tXSTRING_BEG;
+
+ case 'r':
+ p->lex_strterm = new_strterm(p, str_regexp, term, paren);
+ return tREGEXP_BEG;
+
+ case 's':
+ p->lex_strterm = new_strterm(p, str_ssym, term, paren);
+ return tSYMBEG;
+
+ case 'I':
+ p->lex_strterm = new_strterm(p, str_dsymbols, term, paren);
+ return tSYMBOLS_BEG;
+
+ case 'i':
+ p->lex_strterm = new_strterm(p, str_ssymbols, term, paren);
+ return tSYMBOLS_BEG;
+
+ default:
+ yyerror(p, "unknown type of %string");
+ return 0;
+ }
+ }
+ if ((c = nextc(p)) == '=') {
+ pylval.id = intern_lit("%");
+ p->lstate = EXPR_BEG;
+ return tOP_ASGN;
+ }
+ if (IS_SPCARG(c)) {
+ goto quotation;
+ }
+ if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+ p->lstate = EXPR_ARG;
+ }
+ else {
+ p->lstate = EXPR_BEG;
+ }
+ pushback(p, c);
+ return '%';
+
+ case '$':
+ p->lstate = EXPR_END;
+ token_column = newtok(p);
+ c = nextc(p);
+ if (c < 0) {
+ yyerror(p, "incomplete global variable syntax");
+ return 0;
+ }
+ switch (c) {
+ case '_': /* $_: last read line string */
+ c = nextc(p);
+ if (c >= 0 && identchar(c)) { /* if there is more after _ it is a variable */
+ tokadd(p, '$');
+ tokadd(p, c);
+ break;
+ }
+ pushback(p, c);
+ c = '_';
+ /* fall through */
+ case '~': /* $~: match-data */
+ case '*': /* $*: argv */
+ case '$': /* $$: pid */
+ case '?': /* $?: last status */
+ case '!': /* $!: error string */
+ case '@': /* $@: error position */
+ case '/': /* $/: input record separator */
+ case '\\': /* $\: output record separator */
+ case ';': /* $;: field separator */
+ case ',': /* $,: output field separator */
+ case '.': /* $.: last read line number */
+ case '=': /* $=: ignorecase */
+ case ':': /* $:: load path */
+ case '<': /* $<: reading filename */
+ case '>': /* $>: default output handle */
+ case '\"': /* $": already loaded files */
+ tokadd(p, '$');
+ tokadd(p, c);
+ tokfix(p);
+ pylval.id = intern(tok(p), toklen(p));
+ return tGVAR;
+
+ case '-':
+ tokadd(p, '$');
+ tokadd(p, c);
+ c = nextc(p);
+ pushback(p, c);
+ gvar:
+ tokfix(p);
+ pylval.id = intern(tok(p), toklen(p));
+ return tGVAR;
+
+ case '&': /* $&: last match */
+ case '`': /* $`: string before last match */
+ case '\'': /* $': string after last match */
+ case '+': /* $+: string matches last pattern */
+ if (last_state == EXPR_FNAME) {
+ tokadd(p, '$');
+ tokadd(p, c);
+ goto gvar;
+ }
+ pylval.nd = new_back_ref(p, c);
+ return tBACK_REF;
+
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ do {
+ tokadd(p, c);
+ c = nextc(p);
+ } while (c >= 0 && ISDIGIT(c));
+ pushback(p, c);
+ if (last_state == EXPR_FNAME) goto gvar;
+ tokfix(p);
+ {
+ unsigned long n = strtoul(tok(p), NULL, 10);
+ if (n > INT_MAX) {
+ yyerror(p, "capture group index must be <= " MRB_STRINGIZE(INT_MAX));
+ return 0;
+ }
+ pylval.nd = new_nth_ref(p, (int)n);
+ }
+ return tNTH_REF;
+
+ default:
+ if (!identchar(c)) {
+ pushback(p, c);
+ return '$';
+ }
+ /* fall through */
+ case '0':
+ tokadd(p, '$');
+ }
+ break;
+
+ case '@':
+ c = nextc(p);
+ token_column = newtok(p);
+ tokadd(p, '@');
+ if (c == '@') {
+ tokadd(p, '@');
+ c = nextc(p);
+ }
+ if (c < 0) {
+ if (p->tidx == 1) {
+ yyerror(p, "incomplete instance variable syntax");
+ }
+ else {
+ yyerror(p, "incomplete class variable syntax");
+ }
+ return 0;
+ }
+ else if (ISDIGIT(c)) {
+ if (p->tidx == 1) {
+ yyerror_c(p, "wrong instance variable name: @", c);
+ }
+ else {
+ yyerror_c(p, "wrong class variable name: @@", c);
+ }
+ return 0;
+ }
+ if (!identchar(c)) {
+ pushback(p, c);
+ return '@';
+ }
+ break;
+
+ case '_':
+ token_column = newtok(p);
+ break;
+
+ default:
+ if (!identchar(c)) {
+ char buf[36];
+ const char s[] = "Invalid char in expression: 0x";
+ const char hexdigits[] = "0123456789ABCDEF";
+
+ strcpy(buf, s);
+ buf[sizeof(s)-1] = hexdigits[(c & 0xf0) >> 4];
+ buf[sizeof(s)] = hexdigits[(c & 0x0f)];
+ buf[sizeof(s)+1] = 0;
+ yyerror(p, buf);
+ goto retry;
+ }
+
+ token_column = newtok(p);
+ break;
+ }
+
+ do {
+ tokadd(p, c);
+ c = nextc(p);
+ if (c < 0) break;
+ } while (identchar(c));
+ if (token_column == 0 && toklen(p) == 7 && (c < 0 || c == '\n') &&
+ strncmp(tok(p), "__END__", toklen(p)) == 0)
+ return -1;
+
+ switch (tok(p)[0]) {
+ case '@': case '$':
+ pushback(p, c);
+ break;
+ default:
+ if ((c == '!' || c == '?') && !peek(p, '=')) {
+ tokadd(p, c);
+ }
+ else {
+ pushback(p, c);
+ }
+ }
+ tokfix(p);
+ {
+ int result = 0;
+
+ switch (tok(p)[0]) {
+ case '$':
+ p->lstate = EXPR_END;
+ result = tGVAR;
+ break;
+ case '@':
+ p->lstate = EXPR_END;
+ if (tok(p)[1] == '@')
+ result = tCVAR;
+ else
+ result = tIVAR;
+ break;
+
+ case '_':
+ if (toklen(p) == 2 && ISDIGIT(tok(p)[1]) && p->nvars) {
+ int n = tok(p)[1] - '0';
+ int nvar;
+
+ if (n > 0) {
+ node *nvars = p->nvars->cdr;
+
+ while (nvars) {
+ nvar = intn(nvars->car);
+ if (nvar == -2) break; /* top of the scope */
+ if (nvar > 0) {
+ yywarning(p, "numbered parameter used in outer block");
+ break;
+ }
+ nvars->car = nint(-1);
+ nvars = nvars->cdr;
+ }
+ nvar = intn(p->nvars->car);
+ if (nvar == -1) {
+ yywarning(p, "numbered parameter used in inner block");
+ }
+ if (nvar >= -1) {
+ pylval.num = n;
+ p->lstate = EXPR_END;
+ return tNUMPARAM;
+ }
+ else {
+ yywarning(p, "identifier for numbered parameter; consider another name");
+ }
+ }
+ }
+ /* fall through */
+ default:
+ if (toklast(p) == '!' || toklast(p) == '?') {
+ result = tFID;
+ }
+ else {
+ if (p->lstate == EXPR_FNAME) {
+ if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') &&
+ (!peek(p, '=') || (peek_n(p, '>', 1)))) {
+ result = tIDENTIFIER;
+ tokadd(p, c);
+ tokfix(p);
+ }
+ else {
+ pushback(p, c);
+ }
+ if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') &&
+ (!peek(p, '=') || (peek_n(p, '>', 1)))) {
+ result = tIDENTIFIER;
+ tokadd(p, c);
+ tokfix(p);
+ }
+ else {
+ pushback(p, c);
+ }
+ }
+ if (result == 0 && ISUPPER(tok(p)[0])) {
+ result = tCONSTANT;
+ }
+ else {
+ result = tIDENTIFIER;
+ }
+ }
+
+ if (IS_LABEL_POSSIBLE()) {
+ if (IS_LABEL_SUFFIX(0)) {
+ p->lstate = EXPR_END;
+ tokfix(p);
+ pylval.id = intern(tok(p), toklen(p));
+ return tIDENTIFIER;
+ }
+ }
+ if (p->lstate != EXPR_DOT) {
+ const struct kwtable *kw;
+
+ /* See if it is a reserved word. */
+ kw = mrb_reserved_word(tok(p), toklen(p));
+ if (kw) {
+ enum mrb_lex_state_enum state = p->lstate;
+ pylval.num = p->lineno;
+ p->lstate = kw->state;
+ if (state == EXPR_FNAME) {
+ pylval.id = intern_cstr(kw->name);
+ return kw->id[0];
+ }
+ if (p->lstate == EXPR_BEG) {
+ p->cmd_start = TRUE;
+ }
+ if (kw->id[0] == keyword_do) {
+ if (p->lpar_beg && p->lpar_beg == p->paren_nest) {
+ p->lpar_beg = 0;
+ p->paren_nest--;
+ return keyword_do_LAMBDA;
+ }
+ if (COND_P()) return keyword_do_cond;
+ if (CMDARG_P() && state != EXPR_CMDARG)
+ return keyword_do_block;
+ if (state == EXPR_ENDARG || state == EXPR_BEG)
+ return keyword_do_block;
+ return keyword_do;
+ }
+ if (state == EXPR_BEG || state == EXPR_VALUE)
+ return kw->id[0];
+ else {
+ if (kw->id[0] != kw->id[1])
+ p->lstate = EXPR_BEG;
+ return kw->id[1];
+ }
+ }
+ }
+
+ if (IS_BEG() || p->lstate == EXPR_DOT || IS_ARG()) {
+ if (cmd_state) {
+ p->lstate = EXPR_CMDARG;
+ }
+ else {
+ p->lstate = EXPR_ARG;
+ }
+ }
+ else if (p->lstate == EXPR_FNAME) {
+ p->lstate = EXPR_ENDFN;
+ }
+ else {
+ p->lstate = EXPR_END;
+ }
+ }
+ {
+ mrb_sym ident = intern(tok(p), toklen(p));
+
+ pylval.id = ident;
+ if (last_state != EXPR_DOT && ISLOWER(tok(p)[0]) && local_var_p(p, ident)) {
+ p->lstate = EXPR_END;
+ }
+ }
+ return result;
+ }
+}
+
+static int
+yylex(void *lval, parser_state *p)
+{
+ p->ylval = lval;
+ return parser_yylex(p);
+}
+
+static void
+parser_init_cxt(parser_state *p, mrbc_context *cxt)
+{
+ if (!cxt) return;
+ if (cxt->filename) mrb_parser_set_filename(p, cxt->filename);
+ if (cxt->lineno) p->lineno = cxt->lineno;
+ if (cxt->syms) {
+ int i;
+
+ p->locals = cons(0,0);
+ for (i=0; i<cxt->slen; i++) {
+ local_add_f(p, cxt->syms[i]);
+ }
+ }
+ p->capture_errors = cxt->capture_errors;
+ p->no_optimize = cxt->no_optimize;
+ p->upper = cxt->upper;
+ if (cxt->partial_hook) {
+ p->cxt = cxt;
+ }
+}
+
+static void
+parser_update_cxt(parser_state *p, mrbc_context *cxt)
+{
+ node *n, *n0;
+ int i = 0;
+
+ if (!cxt) return;
+ if (intn(p->tree->car) != NODE_SCOPE) return;
+ n0 = n = p->tree->cdr->car;
+ while (n) {
+ i++;
+ n = n->cdr;
+ }
+ cxt->syms = (mrb_sym *)mrb_realloc(p->mrb, cxt->syms, i*sizeof(mrb_sym));
+ cxt->slen = i;
+ for (i=0, n=n0; n; i++,n=n->cdr) {
+ cxt->syms[i] = sym(n->car);
+ }
+}
+
+void mrb_codedump_all(mrb_state*, struct RProc*);
+void mrb_parser_dump(mrb_state *mrb, node *tree, int offset);
+
+MRB_API void
+mrb_parser_parse(parser_state *p, mrbc_context *c)
+{
+ struct mrb_jmpbuf buf1;
+ p->jmp = &buf1;
+
+ MRB_TRY(p->jmp) {
+ int n = 1;
+
+ p->cmd_start = TRUE;
+ p->in_def = p->in_single = 0;
+ p->nerr = p->nwarn = 0;
+ p->lex_strterm = NULL;
+
+ parser_init_cxt(p, c);
+
+ if (p->mrb->jmp) {
+ n = yyparse(p);
+ }
+ else {
+ struct mrb_jmpbuf buf2;
+
+ p->mrb->jmp = &buf2;
+ MRB_TRY(p->mrb->jmp) {
+ n = yyparse(p);
+ }
+ MRB_CATCH(p->mrb->jmp) {
+ p->nerr++;
+ }
+ MRB_END_EXC(p->mrb->jmp);
+ p->mrb->jmp = 0;
+ }
+ if (n != 0 || p->nerr > 0) {
+ p->tree = 0;
+ return;
+ }
+ if (!p->tree) {
+ p->tree = new_nil(p);
+ }
+ parser_update_cxt(p, c);
+ if (c && c->dump_result) {
+ mrb_parser_dump(p->mrb, p->tree, 0);
+ }
+ }
+ MRB_CATCH(p->jmp) {
+ yyerror(p, "memory allocation error");
+ p->nerr++;
+ p->tree = 0;
+ return;
+ }
+ MRB_END_EXC(p->jmp);
+}
+
+MRB_API parser_state*
+mrb_parser_new(mrb_state *mrb)
+{
+ mrb_pool *pool;
+ parser_state *p;
+ static const parser_state parser_state_zero = { 0 };
+
+ pool = mrb_pool_open(mrb);
+ if (!pool) return NULL;
+ p = (parser_state *)mrb_pool_alloc(pool, sizeof(parser_state));
+ if (!p) return NULL;
+
+ *p = parser_state_zero;
+ p->mrb = mrb;
+ p->pool = pool;
+
+ p->s = p->send = NULL;
+#ifndef MRB_DISABLE_STDIO
+ p->f = NULL;
+#endif
+
+ p->cmd_start = TRUE;
+ p->in_def = p->in_single = 0;
+
+ p->capture_errors = FALSE;
+ p->lineno = 1;
+ p->column = 0;
+#if defined(PARSER_TEST) || defined(PARSER_DEBUG)
+ yydebug = 1;
+#endif
+ p->tsiz = MRB_PARSER_TOKBUF_SIZE;
+ p->tokbuf = p->buf;
+
+ p->lex_strterm = NULL;
+ p->all_heredocs = p->parsing_heredoc = NULL;
+ p->lex_strterm_before_heredoc = NULL;
+
+ p->current_filename_index = -1;
+ p->filename_table = NULL;
+ p->filename_table_length = 0;
+
+ return p;
+}
+
+MRB_API void
+mrb_parser_free(parser_state *p) {
+ if (p->tokbuf != p->buf) {
+ mrb_free(p->mrb, p->tokbuf);
+ }
+ mrb_pool_close(p->pool);
+}
+
+MRB_API mrbc_context*
+mrbc_context_new(mrb_state *mrb)
+{
+ return (mrbc_context *)mrb_calloc(mrb, 1, sizeof(mrbc_context));
+}
+
+MRB_API void
+mrbc_context_free(mrb_state *mrb, mrbc_context *cxt)
+{
+ mrb_free(mrb, cxt->filename);
+ mrb_free(mrb, cxt->syms);
+ mrb_free(mrb, cxt);
+}
+
+MRB_API const char*
+mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s)
+{
+ if (s) {
+ size_t len = strlen(s);
+ char *p = (char *)mrb_malloc(mrb, len + 1);
+
+ memcpy(p, s, len + 1);
+ if (c->filename) {
+ mrb_free(mrb, c->filename);
+ }
+ c->filename = p;
+ }
+ return c->filename;
+}
+
+MRB_API void
+mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*func)(struct mrb_parser_state*), void *data)
+{
+ c->partial_hook = func;
+ c->partial_data = data;
+}
+
+MRB_API void
+mrb_parser_set_filename(struct mrb_parser_state *p, const char *f)
+{
+ mrb_sym sym;
+ uint16_t i;
+ mrb_sym* new_table;
+
+ sym = mrb_intern_cstr(p->mrb, f);
+ p->filename_sym = sym;
+ p->lineno = (p->filename_table_length > 0)? 0 : 1;
+
+ for (i = 0; i < p->filename_table_length; ++i) {
+ if (p->filename_table[i] == sym) {
+ p->current_filename_index = i;
+ return;
+ }
+ }
+
+ if (p->filename_table_length == UINT16_MAX) {
+ yyerror(p, "too many files to compile");
+ return;
+ }
+ p->current_filename_index = p->filename_table_length++;
+
+ new_table = (mrb_sym*)parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length);
+ if (p->filename_table) {
+ memmove(new_table, p->filename_table, sizeof(mrb_sym) * p->current_filename_index);
+ }
+ p->filename_table = new_table;
+ p->filename_table[p->filename_table_length - 1] = sym;
+}
+
+MRB_API mrb_sym
+mrb_parser_get_filename(struct mrb_parser_state* p, uint16_t idx) {
+ if (idx >= p->filename_table_length) return 0;
+ else {
+ return p->filename_table[idx];
+ }
+}
+
+#ifndef MRB_DISABLE_STDIO
+MRB_API parser_state*
+mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c)
+{
+ parser_state *p;
+
+ p = mrb_parser_new(mrb);
+ if (!p) return NULL;
+ p->s = p->send = NULL;
+ p->f = f;
+
+ mrb_parser_parse(p, c);
+ return p;
+}
+#endif
+
+MRB_API parser_state*
+mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len, mrbc_context *c)
+{
+ parser_state *p;
+
+ p = mrb_parser_new(mrb);
+ if (!p) return NULL;
+ p->s = s;
+ p->send = s + len;
+
+ mrb_parser_parse(p, c);
+ return p;
+}
+
+MRB_API parser_state*
+mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c)
+{
+ return mrb_parse_nstring(mrb, s, strlen(s), c);
+}
+
+MRB_API mrb_value
+mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c)
+{
+ struct RClass *target = mrb->object_class;
+ struct RProc *proc;
+ mrb_value v;
+ unsigned int keep = 0;
+
+ if (!p) {
+ return mrb_undef_value();
+ }
+ if (!p->tree || p->nerr) {
+ if (c) c->parser_nerr = p->nerr;
+ if (p->capture_errors) {
+ char buf[256];
+
+ strcpy(buf, "line ");
+ dump_int(p->error_buffer[0].lineno, buf+5);
+ strcat(buf, ": ");
+ strncat(buf, p->error_buffer[0].message, sizeof(buf) - strlen(buf) - 1);
+ mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, strlen(buf)));
+ mrb_parser_free(p);
+ return mrb_undef_value();
+ }
+ else {
+ if (mrb->exc == NULL) {
+ mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SYNTAX_ERROR, "syntax error"));
+ }
+ mrb_parser_free(p);
+ return mrb_undef_value();
+ }
+ }
+ proc = mrb_generate_code(mrb, p);
+ mrb_parser_free(p);
+ if (proc == NULL) {
+ if (mrb->exc == NULL) {
+ mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "codegen error"));
+ }
+ return mrb_undef_value();
+ }
+ if (c) {
+ if (c->dump_result) mrb_codedump_all(mrb, proc);
+ if (c->no_exec) return mrb_obj_value(proc);
+ if (c->target_class) {
+ target = c->target_class;
+ }
+ if (c->keep_lv) {
+ keep = c->slen + 1;
+ }
+ else {
+ c->keep_lv = TRUE;
+ }
+ }
+ MRB_PROC_SET_TARGET_CLASS(proc, target);
+ if (mrb->c->ci) {
+ mrb->c->ci->target_class = target;
+ }
+ v = mrb_top_run(mrb, proc, mrb_top_self(mrb), keep);
+ if (mrb->exc) return mrb_nil_value();
+ return v;
+}
+
+#ifndef MRB_DISABLE_STDIO
+MRB_API mrb_value
+mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c)
+{
+ return mrb_load_exec(mrb, mrb_parse_file(mrb, f, c), c);
+}
+
+MRB_API mrb_value
+mrb_load_file(mrb_state *mrb, FILE *f)
+{
+ return mrb_load_file_cxt(mrb, f, NULL);
+}
+#endif
+
+MRB_API mrb_value
+mrb_load_nstring_cxt(mrb_state *mrb, const char *s, size_t len, mrbc_context *c)
+{
+ return mrb_load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c);
+}
+
+MRB_API mrb_value
+mrb_load_nstring(mrb_state *mrb, const char *s, size_t len)
+{
+ return mrb_load_nstring_cxt(mrb, s, len, NULL);
+}
+
+MRB_API mrb_value
+mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *c)
+{
+ return mrb_load_nstring_cxt(mrb, s, strlen(s), c);
+}
+
+MRB_API mrb_value
+mrb_load_string(mrb_state *mrb, const char *s)
+{
+ return mrb_load_string_cxt(mrb, s, NULL);
+}
+
+#ifndef MRB_DISABLE_STDIO
+
+static void
+dump_prefix(node *tree, int offset)
+{
+ printf("%05d ", tree->lineno);
+ while (offset--) {
+ putc(' ', stdout);
+ putc(' ', stdout);
+ }
+}
+
+static void
+dump_recur(mrb_state *mrb, node *tree, int offset)
+{
+ while (tree) {
+ mrb_parser_dump(mrb, tree->car, offset);
+ tree = tree->cdr;
+ }
+}
+
+static void
+dump_args(mrb_state *mrb, node *n, int offset)
+{
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("optional args:\n");
+ {
+ node *n2 = n->car;
+
+ while (n2) {
+ dump_prefix(n2, offset+2);
+ printf("%s=\n", mrb_sym_name(mrb, sym(n2->car->car)));
+ mrb_parser_dump(mrb, n2->car->cdr, offset+3);
+ n2 = n2->cdr;
+ }
+ }
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("rest=*%s\n", mrb_sym_name(mrb, sym(n->car)));
+ }
+ n = n->cdr;
+ if (n->car) {
+ dump_prefix(n, offset+1);
+ printf("post mandatory args:\n");
+ dump_recur(mrb, n->car, offset+2);
+ }
+
+ n = n->cdr;
+ if (n) {
+ mrb_assert(intn(n->car) == NODE_ARGS_TAIL);
+ mrb_parser_dump(mrb, n, offset);
+ }
+}
+
+/*
+ * This function restores the GC arena on return.
+ * For this reason, if a process that further generates an object is
+ * performed at the caller, the string pointer returned as the return
+ * value may become invalid.
+ */
+static const char*
+str_dump(mrb_state *mrb, const char *str, int len)
+{
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_value s;
+# if INT_MAX > MRB_INT_MAX / 4
+ /* check maximum length with "\xNN" charactor */
+ if (len > MRB_INT_MAX / 4) {
+ len = MRB_INT_MAX / 4;
+ }
+# endif
+ s = mrb_str_new(mrb, str, (mrb_int)len);
+ s = mrb_str_dump(mrb, s);
+ mrb_gc_arena_restore(mrb, ai);
+ return RSTRING_PTR(s);
+}
+#endif
+
+void
+mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
+{
+#ifndef MRB_DISABLE_STDIO
+ int nodetype;
+
+ if (!tree) return;
+ again:
+ dump_prefix(tree, offset);
+ nodetype = intn(tree->car);
+ tree = tree->cdr;
+ switch (nodetype) {
+ case NODE_BEGIN:
+ printf("NODE_BEGIN:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_RESCUE:
+ printf("NODE_RESCUE:\n");
+ if (tree->car) {
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ node *n2 = tree->car;
+
+ dump_prefix(n2, offset+1);
+ printf("rescue:\n");
+ while (n2) {
+ node *n3 = n2->car;
+ if (n3->car) {
+ dump_prefix(n2, offset+2);
+ printf("handle classes:\n");
+ dump_recur(mrb, n3->car, offset+3);
+ }
+ if (n3->cdr->car) {
+ dump_prefix(n3, offset+2);
+ printf("exc_var:\n");
+ mrb_parser_dump(mrb, n3->cdr->car, offset+3);
+ }
+ if (n3->cdr->cdr->car) {
+ dump_prefix(n3, offset+2);
+ printf("rescue body:\n");
+ mrb_parser_dump(mrb, n3->cdr->cdr->car, offset+3);
+ }
+ n2 = n2->cdr;
+ }
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ dump_prefix(tree, offset+1);
+ printf("else:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ }
+ break;
+
+ case NODE_ENSURE:
+ printf("NODE_ENSURE:\n");
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("ensure:\n");
+ mrb_parser_dump(mrb, tree->cdr->cdr, offset+2);
+ break;
+
+ case NODE_LAMBDA:
+ printf("NODE_LAMBDA:\n");
+ dump_prefix(tree, offset);
+ goto block;
+
+ case NODE_BLOCK:
+ block:
+ printf("NODE_BLOCK:\n");
+ tree = tree->cdr;
+ if (tree->car) {
+ dump_args(mrb, tree->car, offset+1);
+ }
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+ break;
+
+ case NODE_IF:
+ printf("NODE_IF:\n");
+ dump_prefix(tree, offset+1);
+ printf("cond:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("then:\n");
+ mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+ if (tree->cdr->cdr->car) {
+ dump_prefix(tree, offset+1);
+ printf("else:\n");
+ mrb_parser_dump(mrb, tree->cdr->cdr->car, offset+2);
+ }
+ break;
+
+ case NODE_AND:
+ printf("NODE_AND:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_OR:
+ printf("NODE_OR:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_CASE:
+ printf("NODE_CASE:\n");
+ if (tree->car) {
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ }
+ tree = tree->cdr;
+ while (tree) {
+ dump_prefix(tree, offset+1);
+ printf("case:\n");
+ dump_recur(mrb, tree->car->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->car->cdr, offset+2);
+ tree = tree->cdr;
+ }
+ break;
+
+ case NODE_WHILE:
+ printf("NODE_WHILE:\n");
+ dump_prefix(tree, offset+1);
+ printf("cond:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_UNTIL:
+ printf("NODE_UNTIL:\n");
+ dump_prefix(tree, offset+1);
+ printf("cond:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_FOR:
+ printf("NODE_FOR:\n");
+ dump_prefix(tree, offset+1);
+ printf("var:\n");
+ {
+ node *n2 = tree->car;
+
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("pre:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("rest:\n");
+ mrb_parser_dump(mrb, n2->car, offset+3);
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("post:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ }
+ }
+ }
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf("in:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf("do:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ break;
+
+ case NODE_SCOPE:
+ printf("NODE_SCOPE:\n");
+ {
+ node *n2 = tree->car;
+ mrb_bool first_lval = TRUE;
+
+ if (n2 && (n2->car || n2->cdr)) {
+ dump_prefix(n2, offset+1);
+ printf("local variables:\n");
+ dump_prefix(n2, offset+2);
+ while (n2) {
+ if (n2->car) {
+ if (!first_lval) printf(", ");
+ printf("%s", mrb_sym_name(mrb, sym(n2->car)));
+ first_lval = FALSE;
+ }
+ n2 = n2->cdr;
+ }
+ printf("\n");
+ }
+ }
+ tree = tree->cdr;
+ offset++;
+ goto again;
+
+ case NODE_FCALL:
+ case NODE_CALL:
+ case NODE_SCALL:
+ switch (nodetype) {
+ case NODE_FCALL:
+ printf("NODE_FCALL:\n"); break;
+ case NODE_CALL:
+ printf("NODE_CALL(.):\n"); break;
+ case NODE_SCALL:
+ printf("NODE_SCALL(&.):\n"); break;
+ default:
+ break;
+ }
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("method='%s' (%d)\n",
+ mrb_sym_dump(mrb, sym(tree->cdr->car)),
+ intn(tree->cdr->car));
+ tree = tree->cdr->cdr->car;
+ if (tree) {
+ dump_prefix(tree, offset+1);
+ printf("args:\n");
+ dump_recur(mrb, tree->car, offset+2);
+ if (tree->cdr) {
+ dump_prefix(tree, offset+1);
+ printf("block:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ }
+ }
+ break;
+
+ case NODE_DOT2:
+ printf("NODE_DOT2:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_DOT3:
+ printf("NODE_DOT3:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ mrb_parser_dump(mrb, tree->cdr, offset+1);
+ break;
+
+ case NODE_COLON2:
+ printf("NODE_COLON2:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym_name(mrb, sym(tree->cdr)));
+ break;
+
+ case NODE_COLON3:
+ printf("NODE_COLON3: ::%s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ case NODE_ARRAY:
+ printf("NODE_ARRAY:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_HASH:
+ printf("NODE_HASH:\n");
+ while (tree) {
+ dump_prefix(tree, offset+1);
+ printf("key:\n");
+ mrb_parser_dump(mrb, tree->car->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("value:\n");
+ mrb_parser_dump(mrb, tree->car->cdr, offset+2);
+ tree = tree->cdr;
+ }
+ break;
+
+ case NODE_KW_HASH:
+ printf("NODE_KW_HASH:\n");
+ while (tree) {
+ dump_prefix(tree, offset+1);
+ printf("key:\n");
+ mrb_parser_dump(mrb, tree->car->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("value:\n");
+ mrb_parser_dump(mrb, tree->car->cdr, offset+2);
+ tree = tree->cdr;
+ }
+ break;
+
+ case NODE_SPLAT:
+ printf("NODE_SPLAT:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_ASGN:
+ printf("NODE_ASGN:\n");
+ dump_prefix(tree, offset+1);
+ printf("lhs:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ dump_prefix(tree, offset+1);
+ printf("rhs:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_MASGN:
+ printf("NODE_MASGN:\n");
+ dump_prefix(tree, offset+1);
+ printf("mlhs:\n");
+ {
+ node *n2 = tree->car;
+
+ if (n2->car) {
+ dump_prefix(tree, offset+2);
+ printf("pre:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("rest:\n");
+ if (n2->car == (node*)-1) {
+ dump_prefix(n2, offset+2);
+ printf("(empty)\n");
+ }
+ else {
+ mrb_parser_dump(mrb, n2->car, offset+3);
+ }
+ }
+ n2 = n2->cdr;
+ if (n2) {
+ if (n2->car) {
+ dump_prefix(n2, offset+2);
+ printf("post:\n");
+ dump_recur(mrb, n2->car, offset+3);
+ }
+ }
+ }
+ }
+ dump_prefix(tree, offset+1);
+ printf("rhs:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ break;
+
+ case NODE_OP_ASGN:
+ printf("NODE_OP_ASGN:\n");
+ dump_prefix(tree, offset+1);
+ printf("lhs:\n");
+ mrb_parser_dump(mrb, tree->car, offset+2);
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf("op='%s' (%d)\n", mrb_sym_name(mrb, sym(tree->car)), intn(tree->car));
+ tree = tree->cdr;
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ break;
+
+ case NODE_SUPER:
+ printf("NODE_SUPER:\n");
+ if (tree) {
+ dump_prefix(tree, offset+1);
+ printf("args:\n");
+ dump_recur(mrb, tree->car, offset+2);
+ if (tree->cdr) {
+ dump_prefix(tree, offset+1);
+ printf("block:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset+2);
+ }
+ }
+ break;
+
+ case NODE_ZSUPER:
+ printf("NODE_ZSUPER\n");
+ break;
+
+ case NODE_RETURN:
+ printf("NODE_RETURN:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_YIELD:
+ printf("NODE_YIELD:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_BREAK:
+ printf("NODE_BREAK:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_NEXT:
+ printf("NODE_NEXT:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_REDO:
+ printf("NODE_REDO\n");
+ break;
+
+ case NODE_RETRY:
+ printf("NODE_RETRY\n");
+ break;
+
+ case NODE_LVAR:
+ printf("NODE_LVAR %s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ case NODE_GVAR:
+ printf("NODE_GVAR %s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ case NODE_IVAR:
+ printf("NODE_IVAR %s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ case NODE_CVAR:
+ printf("NODE_CVAR %s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ case NODE_NVAR:
+ printf("NODE_NVAR %d\n", intn(tree));
+ break;
+
+ case NODE_CONST:
+ printf("NODE_CONST %s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ case NODE_MATCH:
+ printf("NODE_MATCH:\n");
+ dump_prefix(tree, offset + 1);
+ printf("lhs:\n");
+ mrb_parser_dump(mrb, tree->car, offset + 2);
+ dump_prefix(tree, offset + 1);
+ printf("rhs:\n");
+ mrb_parser_dump(mrb, tree->cdr, offset + 2);
+ break;
+
+ case NODE_BACK_REF:
+ printf("NODE_BACK_REF: $%c\n", intn(tree));
+ break;
+
+ case NODE_NTH_REF:
+ printf("NODE_NTH_REF: $%d\n", intn(tree));
+ break;
+
+ case NODE_ARG:
+ printf("NODE_ARG %s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ case NODE_BLOCK_ARG:
+ printf("NODE_BLOCK_ARG:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_INT:
+ printf("NODE_INT %s base %d\n", (char*)tree->car, intn(tree->cdr->car));
+ break;
+
+ case NODE_FLOAT:
+ printf("NODE_FLOAT %s\n", (char*)tree);
+ break;
+
+ case NODE_NEGATE:
+ printf("NODE_NEGATE:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_STR:
+ printf("NODE_STR %s len %d\n", str_dump(mrb, (char*)tree->car, intn(tree->cdr)), intn(tree->cdr));
+ break;
+
+ case NODE_DSTR:
+ printf("NODE_DSTR:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_XSTR:
+ printf("NODE_XSTR %s len %d\n", str_dump(mrb, (char*)tree->car, intn(tree->cdr)), intn(tree->cdr));
+ break;
+
+ case NODE_DXSTR:
+ printf("NODE_DXSTR:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_REGX:
+ printf("NODE_REGX /%s/%s\n", (char*)tree->car, (char*)tree->cdr);
+ break;
+
+ case NODE_DREGX:
+ printf("NODE_DREGX:\n");
+ dump_recur(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset);
+ printf("tail: %s\n", (char*)tree->cdr->cdr->car);
+ if (tree->cdr->cdr->cdr->car) {
+ dump_prefix(tree, offset);
+ printf("opt: %s\n", (char*)tree->cdr->cdr->cdr->car);
+ }
+ if (tree->cdr->cdr->cdr->cdr) {
+ dump_prefix(tree, offset);
+ printf("enc: %s\n", (char*)tree->cdr->cdr->cdr->cdr);
+ }
+ break;
+
+ case NODE_SYM:
+ printf("NODE_SYM :%s (%d)\n", mrb_sym_dump(mrb, sym(tree)),
+ intn(tree));
+ break;
+
+ case NODE_DSYM:
+ printf("NODE_DSYM:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_WORDS:
+ printf("NODE_WORDS:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_SYMBOLS:
+ printf("NODE_SYMBOLS:\n");
+ dump_recur(mrb, tree, offset+1);
+ break;
+
+ case NODE_LITERAL_DELIM:
+ printf("NODE_LITERAL_DELIM\n");
+ break;
+
+ case NODE_SELF:
+ printf("NODE_SELF\n");
+ break;
+
+ case NODE_NIL:
+ printf("NODE_NIL\n");
+ break;
+
+ case NODE_TRUE:
+ printf("NODE_TRUE\n");
+ break;
+
+ case NODE_FALSE:
+ printf("NODE_FALSE\n");
+ break;
+
+ case NODE_ALIAS:
+ printf("NODE_ALIAS %s %s:\n",
+ mrb_sym_dump(mrb, sym(tree->car)),
+ mrb_sym_dump(mrb, sym(tree->cdr)));
+ break;
+
+ case NODE_UNDEF:
+ printf("NODE_UNDEF");
+ {
+ node *t = tree;
+ while (t) {
+ printf(" %s", mrb_sym_dump(mrb, sym(t->car)));
+ t = t->cdr;
+ }
+ }
+ printf(":\n");
+ break;
+
+ case NODE_CLASS:
+ printf("NODE_CLASS:\n");
+ if (tree->car->car == (node*)0) {
+ dump_prefix(tree, offset+1);
+ printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
+ }
+ else if (tree->car->car == (node*)1) {
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
+ }
+ else {
+ mrb_parser_dump(mrb, tree->car->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
+ }
+ if (tree->cdr->car) {
+ dump_prefix(tree, offset+1);
+ printf("super:\n");
+ mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+ }
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->cdr->car->cdr, offset+2);
+ break;
+
+ case NODE_MODULE:
+ printf("NODE_MODULE:\n");
+ if (tree->car->car == (node*)0) {
+ dump_prefix(tree, offset+1);
+ printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
+ }
+ else if (tree->car->car == (node*)1) {
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
+ }
+ else {
+ mrb_parser_dump(mrb, tree->car->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr)));
+ }
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->car->cdr, offset+2);
+ break;
+
+ case NODE_SCLASS:
+ printf("NODE_SCLASS:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ dump_prefix(tree, offset+1);
+ printf("body:\n");
+ mrb_parser_dump(mrb, tree->cdr->car->cdr, offset+2);
+ break;
+
+ case NODE_DEF:
+ printf("NODE_DEF:\n");
+ dump_prefix(tree, offset+1);
+ printf("%s\n", mrb_sym_dump(mrb, sym(tree->car)));
+ tree = tree->cdr;
+ {
+ node *n2 = tree->car;
+ mrb_bool first_lval = TRUE;
+
+ if (n2 && (n2->car || n2->cdr)) {
+ dump_prefix(n2, offset+1);
+ printf("local variables:\n");
+ dump_prefix(n2, offset+2);
+ while (n2) {
+ if (n2->car) {
+ if (!first_lval) printf(", ");
+ printf("%s", mrb_sym_name(mrb, sym(n2->car)));
+ first_lval = FALSE;
+ }
+ n2 = n2->cdr;
+ }
+ printf("\n");
+ }
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ dump_args(mrb, tree->car, offset);
+ }
+ mrb_parser_dump(mrb, tree->cdr->car, offset+1);
+ break;
+
+ case NODE_SDEF:
+ printf("NODE_SDEF:\n");
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ tree = tree->cdr;
+ dump_prefix(tree, offset+1);
+ printf(":%s\n", mrb_sym_dump(mrb, sym(tree->car)));
+ tree = tree->cdr->cdr;
+ if (tree->car) {
+ dump_args(mrb, tree->car, offset+1);
+ }
+ tree = tree->cdr;
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ break;
+
+ case NODE_POSTEXE:
+ printf("NODE_POSTEXE:\n");
+ mrb_parser_dump(mrb, tree, offset+1);
+ break;
+
+ case NODE_HEREDOC:
+ printf("NODE_HEREDOC (<<%s):\n", ((parser_heredoc_info*)tree)->term);
+ dump_recur(mrb, ((parser_heredoc_info*)tree)->doc, offset+1);
+ break;
+
+ case NODE_ARGS_TAIL:
+ printf("NODE_ARGS_TAIL:\n");
+ {
+ node *kws = tree->car;
+
+ while (kws) {
+ mrb_parser_dump(mrb, kws->car, offset+1);
+ kws = kws->cdr;
+ }
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ mrb_assert(intn(tree->car->car) == NODE_KW_REST_ARGS);
+ mrb_parser_dump(mrb, tree->car, offset+1);
+ }
+ tree = tree->cdr;
+ if (tree->car) {
+ dump_prefix(tree, offset+1);
+ printf("block='%s'\n", mrb_sym_name(mrb, sym(tree->car)));
+ }
+ break;
+
+ case NODE_KW_ARG:
+ printf("NODE_KW_ARG %s:\n", mrb_sym_name(mrb, sym(tree->car)));
+ mrb_parser_dump(mrb, tree->cdr->car, offset + 1);
+ break;
+
+ case NODE_KW_REST_ARGS:
+ printf("NODE_KW_REST_ARGS %s\n", mrb_sym_name(mrb, sym(tree)));
+ break;
+
+ default:
+ printf("node type: %d (0x%x)\n", nodetype, (unsigned)nodetype);
+ break;
+ }
+#endif
+}
diff --git a/mrbgems/mruby-compiler/mrbgem.rake b/mrbgems/mruby-compiler/mrbgem.rake
index 2118ef433..b25bdaff7 100644
--- a/mrbgems/mruby-compiler/mrbgem.rake
+++ b/mrbgems/mruby-compiler/mrbgem.rake
@@ -3,35 +3,33 @@ MRuby::Gem::Specification.new 'mruby-compiler' do |spec|
spec.author = 'mruby developers'
spec.summary = 'mruby compiler library'
- current_dir = spec.dir
- current_build_dir = spec.build_dir
-
- lex_def = "#{current_dir}/core/lex.def"
- core_objs = Dir.glob("#{current_dir}/core/*.c").map { |f|
+ lex_def = "#{dir}/core/lex.def"
+ core_objs = Dir.glob("#{dir}/core/*.c").map { |f|
next nil if build.cxx_exception_enabled? and f =~ /(codegen).c$/
- objfile(f.pathmap("#{current_build_dir}/core/%n"))
+ objfile(f.pathmap("#{build_dir}/core/%n"))
}.compact
if build.cxx_exception_enabled?
core_objs <<
- build.compile_as_cxx("#{current_build_dir}/core/y.tab.c", "#{current_build_dir}/core/y.tab.cxx",
- objfile("#{current_build_dir}/y.tab"), ["#{current_dir}/core"]) <<
- build.compile_as_cxx("#{current_dir}/core/codegen.c", "#{current_build_dir}/core/codegen.cxx")
+ build.compile_as_cxx("#{dir}/core/y.tab.c", "#{build_dir}/core/y.tab.cxx",
+ objfile("#{build_dir}/y.tab"), ["#{dir}/core"]) <<
+ build.compile_as_cxx("#{dir}/core/codegen.c", "#{build_dir}/core/codegen.cxx")
else
- core_objs << objfile("#{current_build_dir}/core/y.tab")
- file objfile("#{current_build_dir}/core/y.tab") => "#{current_build_dir}/core/y.tab.c" do |t|
- cc.run t.name, t.prerequisites.first, [], ["#{current_dir}/core"]
+ core_objs << objfile("#{build_dir}/core/y.tab")
+ file objfile("#{build_dir}/core/y.tab") => "#{dir}/core/y.tab.c" do |t|
+ cc.run t.name, t.prerequisites.first, [], ["#{dir}/core"]
end
end
# Parser
- file "#{current_build_dir}/core/y.tab.c" => ["#{current_dir}/core/parse.y", lex_def] do |t|
- mkdir_p File.dirname t.name
+ file "#{dir}/core/y.tab.c" => ["#{dir}/core/parse.y", lex_def] do |t|
yacc.run t.name, t.prerequisites.first
+ content = File.read(t.name).gsub(/^#line +\d+ +"\K.*$/){$&.relative_path}
+ File.write(t.name, content)
end
# Lexical analyzer
- file lex_def => "#{current_dir}/core/keywords" do |t|
+ file lex_def => "#{dir}/core/keywords" do |t|
gperf.run t.name, t.prerequisites.first
end
diff --git a/mrbgems/mruby-complex/mrblib/complex.rb b/mrbgems/mruby-complex/mrblib/complex.rb
index ea8530919..74c128a07 100644
--- a/mrbgems/mruby-complex/mrblib/complex.rb
+++ b/mrbgems/mruby-complex/mrblib/complex.rb
@@ -107,7 +107,7 @@ class Complex < Numeric
[Fixnum, Float].each do |cls|
[:+, :-, :*, :/, :==].each do |op|
cls.instance_eval do
- original_operator_name = "__original_operator_#{op}_complex"
+ original_operator_name = :"__original_operator_#{op}_complex"
alias_method original_operator_name, op
define_method op do |rhs|
if rhs.is_a? Complex
diff --git a/mrbgems/mruby-complex/src/complex.c b/mrbgems/mruby-complex/src/complex.c
index 10fa42a2c..0432da633 100644
--- a/mrbgems/mruby-complex/src/complex.c
+++ b/mrbgems/mruby-complex/src/complex.c
@@ -174,7 +174,7 @@ div_pair(struct float_pair *q, struct float_pair const *a,
static mrb_value
complex_div(mrb_state *mrb, mrb_value self)
{
- mrb_value rhs;
+ mrb_value rhs = mrb_get_arg1(mrb);
struct mrb_complex *a, *b;
struct float_pair ar, ai, br, bi;
struct float_pair br2, bi2;
@@ -183,7 +183,6 @@ complex_div(mrb_state *mrb, mrb_value self)
struct float_pair ai_br, ar_bi;
struct float_pair zr, zi;
- mrb_get_args(mrb, "o", &rhs);
a = complex_ptr(mrb, self);
b = complex_ptr(mrb, rhs);
diff --git a/mrbgems/mruby-error/src/exception.c b/mrbgems/mruby-error/src/exception.c
index ec4870dc0..e0ea28ac8 100644
--- a/mrbgems/mruby-error/src/exception.c
+++ b/mrbgems/mruby-error/src/exception.c
@@ -8,7 +8,7 @@ mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state)
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
struct mrb_jmpbuf c_jmp;
mrb_value result = mrb_nil_value();
- mrb_int ai = mrb_gc_arena_save(mrb);
+ int ai = mrb_gc_arena_save(mrb);
if (state) { *state = FALSE; }
@@ -34,7 +34,7 @@ mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t ensure,
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
struct mrb_jmpbuf c_jmp;
mrb_value result;
- mrb_int ai = mrb_gc_arena_save(mrb);
+ int ai = mrb_gc_arena_save(mrb);
MRB_TRY(&c_jmp) {
mrb->jmp = &c_jmp;
@@ -71,7 +71,7 @@ mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_fun
mrb_value result;
mrb_bool error_matched = FALSE;
mrb_int i;
- mrb_int ai = mrb_gc_arena_save(mrb);
+ int ai = mrb_gc_arena_save(mrb);
MRB_TRY(&c_jmp) {
mrb->jmp = &c_jmp;
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c
index ca046d88e..eaf07cabe 100644
--- a/mrbgems/mruby-eval/src/eval.c
+++ b/mrbgems/mruby-eval/src/eval.c
@@ -9,217 +9,6 @@
mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p);
mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self);
-static struct mrb_irep *
-get_closure_irep(mrb_state *mrb, int level)
-{
- struct RProc *proc = mrb->c->ci[-1].proc;
-
- while (level--) {
- if (!proc) return NULL;
- proc = proc->upper;
- }
- if (!proc) return NULL;
- if (MRB_PROC_CFUNC_P(proc)) {
- return NULL;
- }
- return proc->body.irep;
-}
-
-/* search for irep lev above the bottom */
-static mrb_irep*
-search_irep(mrb_irep *top, int bnest, int lev, mrb_irep *bottom)
-{
- int i;
-
- for (i=0; i<top->rlen; i++) {
- mrb_irep* tmp = top->reps[i];
-
- if (tmp == bottom) return top;
- tmp = search_irep(tmp, bnest-1, lev, bottom);
- if (tmp) {
- if (bnest == lev) return top;
- return tmp;
- }
- }
- return NULL;
-}
-
-static uint16_t
-search_variable(mrb_state *mrb, mrb_sym vsym, int bnest)
-{
- mrb_irep *virep;
- int level;
- int pos;
-
- for (level = 0; (virep = get_closure_irep(mrb, level)); level++) {
- if (virep->lv == NULL) {
- continue;
- }
- for (pos = 0; pos < virep->nlocals - 1; pos++) {
- if (vsym == virep->lv[pos].name) {
- return (pos+1)<<8 | (level+bnest);
- }
- }
- }
-
- return 0;
-}
-
-static int
-irep_argc(mrb_irep *irep)
-{
- mrb_code c;
-
- c = irep->iseq[0];
- if (c == OP_ENTER) {
- mrb_aspec ax = PEEK_W(irep->iseq+1);
- /* extra 1 means a slot for block */
- return MRB_ASPEC_REQ(ax)+MRB_ASPEC_OPT(ax)+MRB_ASPEC_REST(ax)+MRB_ASPEC_POST(ax)+1;
- }
- return 0;
-}
-
-static mrb_bool
-potential_upvar_p(struct mrb_locals *lv, uint16_t v, int argc, uint16_t nlocals)
-{
- if (v >= nlocals) return FALSE;
- /* skip arguments */
- if (v < argc+1) return FALSE;
- return TRUE;
-}
-
-extern uint8_t mrb_insn_size[];
-extern uint8_t mrb_insn_size1[];
-extern uint8_t mrb_insn_size2[];
-extern uint8_t mrb_insn_size3[];
-
-static void
-patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest, mrb_irep *top)
-{
- int i;
- uint32_t a;
- uint16_t b;
- uint8_t c;
- mrb_code insn;
- int argc = irep_argc(irep);
- mrb_code *iseq = (mrb_code *)irep->iseq;
-
- mrb_assert((irep->flags & MRB_ISEQ_NO_FREE) == 0);
-
- for (i = 0; i < irep->ilen; ) {
- insn = iseq[i];
- switch(insn){
- case OP_EPUSH:
- a = PEEK_B(iseq+i+1);
- patch_irep(mrb, irep->reps[a], bnest + 1, top);
- break;
-
- case OP_LAMBDA:
- case OP_BLOCK:
- a = PEEK_B(iseq+i+1);
- b = PEEK_B(iseq+i+2);
- patch_irep(mrb, irep->reps[b], bnest + 1, top);
- break;
-
- case OP_SEND:
- b = PEEK_B(iseq+i+2);
- c = PEEK_B(iseq+i+3);
- if (c != 0) {
- break;
- }
- else {
- uint16_t arg = search_variable(mrb, irep->syms[b], bnest);
- if (arg != 0) {
- /* must replace */
- iseq[i] = OP_GETUPVAR;
- iseq[i+2] = arg >> 8;
- iseq[i+3] = arg & 0xff;
- }
- }
- break;
-
- case OP_MOVE:
- a = PEEK_B(iseq+i+1);
- b = PEEK_B(iseq+i+2);
- /* src part */
- if (potential_upvar_p(irep->lv, b, argc, irep->nlocals)) {
- uint16_t arg = search_variable(mrb, irep->lv[b - 1].name, bnest);
- if (arg != 0) {
- /* must replace */
- iseq[i] = insn = OP_GETUPVAR;
- iseq[i+2] = arg >> 8;
- iseq[i+3] = arg & 0xff;
- }
- }
- /* dst part */
- if (potential_upvar_p(irep->lv, a, argc, irep->nlocals)) {
- uint16_t arg = search_variable(mrb, irep->lv[a - 1].name, bnest);
- if (arg != 0) {
- /* must replace */
- iseq[i] = insn = OP_SETUPVAR;
- iseq[i+1] = (mrb_code)b;
- iseq[i+2] = arg >> 8;
- iseq[i+3] = arg & 0xff;
- }
- }
- break;
-
- case OP_GETUPVAR:
- a = PEEK_B(iseq+i+1);
- b = PEEK_B(iseq+i+2);
- c = PEEK_B(iseq+i+3);
- {
- int lev = c+1;
- mrb_irep *tmp = search_irep(top, bnest, lev, irep);
- if (potential_upvar_p(tmp->lv, b, irep_argc(tmp), tmp->nlocals)) {
- uint16_t arg = search_variable(mrb, tmp->lv[b-1].name, bnest);
- if (arg != 0) {
- /* must replace */
- iseq[i] = OP_GETUPVAR;
- iseq[i+2] = arg >> 8;
- iseq[i+3] = arg & 0xff;
- }
- }
- }
- break;
-
- case OP_SETUPVAR:
- a = PEEK_B(iseq+i+1);
- b = PEEK_B(iseq+i+2);
- c = PEEK_B(iseq+i+3);
- {
- int lev = c+1;
- mrb_irep *tmp = search_irep(top, bnest, lev, irep);
- if (potential_upvar_p(tmp->lv, b, irep_argc(tmp), tmp->nlocals)) {
- uint16_t arg = search_variable(mrb, tmp->lv[b-1].name, bnest);
- if (arg != 0) {
- /* must replace */
- iseq[i] = OP_SETUPVAR;
- iseq[i+1] = a;
- iseq[i+2] = arg >> 8;
- iseq[i+3] = arg & 0xff;
- }
- }
- }
- break;
-
- case OP_EXT1:
- insn = PEEK_B(iseq+i+1);
- i += mrb_insn_size1[insn]+1;
- continue;
- case OP_EXT2:
- insn = PEEK_B(iseq+i+1);
- i += mrb_insn_size2[insn]+1;
- continue;
- case OP_EXT3:
- insn = PEEK_B(iseq+i+1);
- i += mrb_insn_size3[insn]+1;
- continue;
- }
- i+=mrb_insn_size[insn];
- }
-}
-
void mrb_codedump_all(mrb_state*, struct RProc*);
static struct RProc*
@@ -243,7 +32,8 @@ create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding,
mrbc_filename(mrb, cxt, file ? file : "(eval)");
cxt->capture_errors = TRUE;
cxt->no_optimize = TRUE;
- cxt->on_eval = TRUE;
+ ci = (mrb->c->ci > mrb->c->cibase) ? mrb->c->ci - 1 : mrb->c->cibase;
+ cxt->upper = ci->proc && MRB_PROC_CFUNC_P(ci->proc) ? NULL : ci->proc;
p = mrb_parse_nstring(mrb, s, len, cxt);
@@ -298,7 +88,7 @@ create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding,
e->mid = ci->mid;
e->stack = ci[1].stackent;
e->cxt = mrb->c;
- MRB_ENV_SET_STACK_LEN(e, ci->proc->body.irep->nlocals);
+ MRB_ENV_SET_LEN(e, ci->proc->body.irep->nlocals);
bidx = ci->argc;
if (ci->argc < 0) bidx = 2;
else bidx += 1;
@@ -311,7 +101,6 @@ create_proc_from_string(mrb_state *mrb, char *s, mrb_int len, mrb_value binding,
}
proc->upper = ci->proc;
mrb->c->ci->target_class = target_class;
- patch_irep(mrb, proc->body.irep, 0, proc->body.irep);
/* mrb_codedump_all(mrb, proc); */
mrb_parser_free(p);
diff --git a/mrbgems/mruby-eval/test/eval.rb b/mrbgems/mruby-eval/test/eval.rb
index 4930259c1..639ed68f9 100644
--- a/mrbgems/mruby-eval/test/eval.rb
+++ b/mrbgems/mruby-eval/test/eval.rb
@@ -130,3 +130,24 @@ Proc.new { foo }
EOS
}
end
+
+assert('Calling the same method as the variable name') do
+ hoge = Object.new
+ def hoge.fuga
+ "Hit!"
+ end
+ assert_equal("Hit!") { fuga = "Miss!"; eval "hoge.fuga" }
+ assert_equal("Hit!") { fuga = "Miss!"; -> { eval "hoge.fuga" }.call }
+ assert_equal("Hit!") { -> { fuga = "Miss!"; eval "hoge.fuga" }.call }
+ assert_equal("Hit!") { fuga = "Miss!"; eval("-> { hoge.fuga }").call }
+end
+
+assert('Access numbered parameter from eval') do
+ hoge = Object.new
+ def hoge.fuga(a, &b)
+ b.call(a)
+ end
+ assert_equal(6) {
+ hoge.fuga(3) { _1 + eval("_1") }
+ }
+end
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 3c17b59dd..00ee7c223 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -291,8 +291,7 @@ mrb_fiber_alive_p(mrb_state *mrb, mrb_value self)
static mrb_value
fiber_eq(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
- mrb_get_args(mrb, "o", &other);
+ mrb_value other = mrb_get_arg1(mrb);
if (!mrb_fiber_p(other)) {
return mrb_false_value();
diff --git a/mrbgems/mruby-inline-struct/test/inline.c b/mrbgems/mruby-inline-struct/test/inline.c
index 51804ae31..5d307dcab 100644
--- a/mrbgems/mruby-inline-struct/test/inline.c
+++ b/mrbgems/mruby-inline-struct/test/inline.c
@@ -8,8 +8,7 @@ istruct_test_initialize(mrb_state *mrb, mrb_value self)
{
char *string = (char*)mrb_istruct_ptr(self);
mrb_int size = mrb_istruct_size();
- mrb_value object;
- mrb_get_args(mrb, "o", &object);
+ mrb_value object = mrb_get_arg1(mrb);
if (mrb_fixnum_p(object)) {
strncpy(string, "fixnum", size-1);
@@ -45,8 +44,8 @@ istruct_test_length(mrb_state *mrb, mrb_value self)
static mrb_value
istruct_test_test_receive(mrb_state *mrb, mrb_value self)
{
- mrb_value object;
- mrb_get_args(mrb, "o", &object);
+ mrb_value object = mrb_get_arg1(mrb);
+
if (mrb_obj_class(mrb, object) != mrb_class_get(mrb, "InlineStructTest"))
{
mrb_raise(mrb, E_TYPE_ERROR, "Expected InlineStructTest");
diff --git a/mrbgems/mruby-io/include/mruby/ext/io.h b/mrbgems/mruby-io/include/mruby/ext/io.h
index 5d1dde354..dfff8e0e0 100644
--- a/mrbgems/mruby-io/include/mruby/ext/io.h
+++ b/mrbgems/mruby-io/include/mruby/ext/io.h
@@ -5,10 +5,24 @@
#ifndef MRUBY_IO_H
#define MRUBY_IO_H
+#include <mruby.h>
+
+#ifdef MRB_DISABLE_STDIO
+# error IO and File conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
+#endif
+
#if defined(__cplusplus)
extern "C" {
#endif
+#if defined(MRB_WITHOUT_IO_PREAD_PWRITE)
+# undef MRB_WITH_IO_PREAD_PWRITE
+#elif !defined(MRB_WITH_IO_PREAD_PWRITE)
+# if defined(__unix__) || defined(__MACH__)
+# define MRB_WITH_IO_PREAD_PWRITE
+# endif
+#endif
+
struct mrb_io {
int fd; /* file descriptor, or -1 */
int fd2; /* file descriptor to write if it's different from fd, or -1 */
@@ -19,13 +33,31 @@ struct mrb_io {
is_socket:1;
};
-#define FMODE_READABLE 0x00000001
-#define FMODE_WRITABLE 0x00000002
-#define FMODE_READWRITE (FMODE_READABLE|FMODE_WRITABLE)
-#define FMODE_BINMODE 0x00000004
-#define FMODE_APPEND 0x00000040
-#define FMODE_CREATE 0x00000080
-#define FMODE_TRUNC 0x00000800
+#define MRB_O_RDONLY 0x0000
+#define MRB_O_WRONLY 0x0001
+#define MRB_O_RDWR 0x0002
+#define MRB_O_ACCMODE (MRB_O_RDONLY | MRB_O_WRONLY | MRB_O_RDWR)
+#define MRB_O_NONBLOCK 0x0004
+#define MRB_O_APPEND 0x0008
+#define MRB_O_SYNC 0x0010
+#define MRB_O_NOFOLLOW 0x0020
+#define MRB_O_CREAT 0x0040
+#define MRB_O_TRUNC 0x0080
+#define MRB_O_EXCL 0x0100
+#define MRB_O_NOCTTY 0x0200
+#define MRB_O_DIRECT 0x0400
+#define MRB_O_BINARY 0x0800
+#define MRB_O_SHARE_DELETE 0x1000
+#define MRB_O_TMPFILE 0x2000
+#define MRB_O_NOATIME 0x4000
+#define MRB_O_DSYNC 0x00008000
+#define MRB_O_RSYNC 0x00010000
+
+#define MRB_O_RDONLY_P(f) ((mrb_bool)(((f) & MRB_O_ACCMODE) == MRB_O_RDONLY))
+#define MRB_O_WRONLY_P(f) ((mrb_bool)(((f) & MRB_O_ACCMODE) == MRB_O_WRONLY))
+#define MRB_O_RDWR_P(f) ((mrb_bool)(((f) & MRB_O_ACCMODE) == MRB_O_RDWR))
+#define MRB_O_READABLE_P(f) ((mrb_bool)((((f) & MRB_O_ACCMODE) | 2) == 2))
+#define MRB_O_WRITABLE_P(f) ((mrb_bool)(((((f) & MRB_O_ACCMODE) + 1) & 2) == 2))
#define E_IO_ERROR (mrb_class_get(mrb, "IOError"))
#define E_EOF_ERROR (mrb_class_get(mrb, "EOFError"))
diff --git a/mrbgems/mruby-io/mrbgem.rake b/mrbgems/mruby-io/mrbgem.rake
index bd20f6d20..d0c8fb052 100644
--- a/mrbgems/mruby-io/mrbgem.rake
+++ b/mrbgems/mruby-io/mrbgem.rake
@@ -5,14 +5,8 @@ MRuby::Gem::Specification.new('mruby-io') do |spec|
spec.cc.include_paths << "#{build.root}/src"
- case RUBY_PLATFORM
- when /mingw|mswin|msys/
- spec.linker.libraries += ['Ws2_32']
- #spec.cc.include_paths += ["C:/Windows/system/include"]
- spec.linker.library_paths += ["C:/Windows/system"]
- end
- if build.kind_of?(MRuby::CrossBuild) && %w(x86_64-w64-mingw32 i686-w64-mingw32).include?(build.host_target)
- spec.linker.libraries += ['ws2_32']
+ if for_windows?
+ spec.linker.libraries << "ws2_32"
end
spec.add_test_dependency 'mruby-time', core: 'mruby-time'
end
diff --git a/mrbgems/mruby-io/mrblib/file.rb b/mrbgems/mruby-io/mrblib/file.rb
index d3a4b1ec7..1854deb4e 100644
--- a/mrbgems/mruby-io/mrblib/file.rb
+++ b/mrbgems/mruby-io/mrblib/file.rb
@@ -11,6 +11,11 @@ class File < IO
end
end
+ def mtime
+ t = self._mtime
+ t && Time.at(t)
+ end
+
def self.join(*names)
return "" if names.empty?
diff --git a/mrbgems/mruby-io/mrblib/file_constants.rb b/mrbgems/mruby-io/mrblib/file_constants.rb
index a68ee2598..bd77d53fe 100644
--- a/mrbgems/mruby-io/mrblib/file_constants.rb
+++ b/mrbgems/mruby-io/mrblib/file_constants.rb
@@ -1,21 +1,5 @@
class File
module Constants
- RDONLY = 0
- WRONLY = 1
- RDWR = 2
- NONBLOCK = 4
- APPEND = 8
-
- BINARY = 0
- SYNC = 128
- NOFOLLOW = 256
- CREAT = 512
- TRUNC = 1024
- EXCL = 2048
-
- NOCTTY = 131072
- DSYNC = 4194304
-
FNM_SYSCASE = 0
FNM_NOESCAPE = 1
FNM_PATHNAME = 2
diff --git a/mrbgems/mruby-io/mrblib/io.rb b/mrbgems/mruby-io/mrblib/io.rb
index 5df1932df..e597db886 100644
--- a/mrbgems/mruby-io/mrblib/io.rb
+++ b/mrbgems/mruby-io/mrblib/io.rb
@@ -170,21 +170,16 @@ class IO
end
def _read_buf
- return @buf if @buf && @buf.bytesize >= 4 # maximum UTF-8 character is 4 bytes
- @buf ||= ""
- begin
- @buf += sysread(BUF_SIZE)
- rescue EOFError => e
- raise e if @buf.empty?
- end
+ return @buf if @buf && @buf.bytesize > 0
+ sysread(BUF_SIZE, @buf)
end
def ungetc(substr)
raise TypeError.new "expect String, got #{substr.class}" unless substr.is_a?(String)
if @buf.empty?
- @buf = substr.dup
+ @buf.replace(substr)
else
- @buf = substr + @buf
+ @buf[0,0] = substr
end
nil
end
@@ -288,15 +283,15 @@ class IO
def readchar
_read_buf
- c = @buf[0]
- @buf[0] = ""
- c
+ _readchar(@buf)
end
def getc
begin
readchar
rescue EOFError
+ c = @buf[0]
+ @buf[0,1]="" if c
nil
end
end
diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c
index 830f305fb..d3c4b3885 100644
--- a/mrbgems/mruby-io/src/file.c
+++ b/mrbgems/mruby-io/src/file.c
@@ -48,6 +48,7 @@
#if defined(_WIN32) || defined(_WIN64)
#define PATH_SEPARATOR ";"
#define FILE_ALT_SEPARATOR "\\"
+ #define VOLUME_SEPARATOR ":"
#else
#define PATH_SEPARATOR ":"
#endif
@@ -65,12 +66,16 @@
#define LOCK_UN 8
#endif
-#ifndef _WIN32
+#if !defined(_WIN32) || defined(MRB_MINGW32_LEGACY)
typedef struct stat mrb_stat;
# define mrb_stat(path, sb) stat(path, sb)
# define mrb_fstat(fd, sb) fstat(fd, sb)
+#elif defined MRB_INT32
+typedef struct _stat32 mrb_stat;
+# define mrb_stat(path, sb) _stat32(path, sb)
+# define mrb_fstat(fd, sb) _fstat32(fd, sb)
#else
-typedef struct __stat64 mrb_stat;
+typedef struct _stat64 mrb_stat;
# define mrb_stat(path, sb) _stat64(path, sb)
# define mrb_fstat(fd, sb) _fstat64(fd, sb)
#endif
@@ -88,7 +93,7 @@ flock(int fd, int operation) {
}
#endif
-mrb_value
+static mrb_value
mrb_file_s_umask(mrb_state *mrb, mrb_value klass)
{
#if defined(_WIN32) || defined(_WIN64)
@@ -264,7 +269,7 @@ mrb_file_realpath(mrb_state *mrb, mrb_value klass)
return result;
}
-mrb_value
+static mrb_value
mrb_file__getwd(mrb_state *mrb, mrb_value klass)
{
mrb_value path;
@@ -279,12 +284,59 @@ mrb_file__getwd(mrb_state *mrb, mrb_value klass)
return path;
}
+#ifdef _WIN32
+#define IS_FILESEP(x) (x == (*(char*)(FILE_SEPARATOR)) || x == (*(char*)(FILE_ALT_SEPARATOR)))
+#define IS_VOLSEP(x) (x == (*(char*)(VOLUME_SEPARATOR)))
+#define IS_DEVICEID(x) (x == '.' || x == '?')
+#define CHECK_UNCDEV_PATH (IS_FILESEP(path[0]) && IS_FILESEP(path[1]))
+
+static int
+is_absolute_traditional_path(const char *path, size_t len)
+{
+ if (len < 3) return 0;
+ return (ISALPHA(path[0]) && IS_VOLSEP(path[1]) && IS_FILESEP(path[2]));
+}
+
+static int
+is_aboslute_unc_path(const char *path, size_t len) {
+ if (len < 2) return 0;
+ return (CHECK_UNCDEV_PATH && !IS_DEVICEID(path[2]));
+}
+
+static int
+is_absolute_device_path(const char *path, size_t len) {
+ if (len < 4) return 0;
+ return (CHECK_UNCDEV_PATH && IS_DEVICEID(path[2]) && IS_FILESEP(path[3]));
+}
+
static int
mrb_file_is_absolute_path(const char *path)
{
- return (path[0] == '/');
+ size_t len = strlen(path);
+ if (IS_FILESEP(path[0])) return 1;
+ if (len > 0)
+ return (
+ is_absolute_traditional_path(path, len) ||
+ is_aboslute_unc_path(path, len) ||
+ is_absolute_device_path(path, len)
+ );
+ else
+ return 0;
}
+#undef IS_FILESEP
+#undef IS_VOLSEP
+#undef IS_DEVICEID
+#undef CHECK_UNCDEV_PATH
+
+#else
+static int
+mrb_file_is_absolute_path(const char *path)
+{
+ return (path[0] == *(char*)(FILE_SEPARATOR));
+}
+#endif
+
static mrb_value
mrb_file__gethome(mrb_state *mrb, mrb_value klass)
{
@@ -319,7 +371,7 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass)
path = mrb_str_new_cstr(mrb, home);
mrb_locale_free(home);
return path;
-#else
+#else /* _WIN32 */
argc = mrb_get_argc(mrb);
if (argc == 0) {
home = getenv("USERPROFILE");
@@ -342,18 +394,15 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass)
static mrb_value
mrb_file_mtime(mrb_state *mrb, mrb_value self)
{
- mrb_value obj;
- struct stat st;
- int fd;
+ int fd = mrb_io_fileno(mrb, self);
+ mrb_stat st;
- obj = mrb_obj_value(mrb_class_get(mrb, "Time"));
- fd = mrb_io_fileno(mrb, self);
- if (fstat(fd, &st) == -1)
+ if (mrb_fstat(fd, &st) == -1)
return mrb_false_value();
- return mrb_funcall(mrb, obj, "at", 1, mrb_fixnum_value(st.st_mtime));
+ return mrb_fixnum_value((mrb_int)st.st_mtime);
}
-mrb_value
+static mrb_value
mrb_file_flock(mrb_state *mrb, mrb_value self)
{
#if defined(sun)
@@ -402,15 +451,15 @@ mrb_file_size(mrb_state *mrb, mrb_value self)
#ifdef MRB_WITHOUT_FLOAT
mrb_raise(mrb, E_RUNTIME_ERROR, "File#size too large for MRB_WITHOUT_FLOAT");
#else
- return mrb_float_value(mrb, st.st_size);
+ return mrb_float_value(mrb, (mrb_float)st.st_size);
#endif
}
- return mrb_fixnum_value(st.st_size);
+ return mrb_fixnum_value((mrb_int)st.st_size);
}
static int
-mrb_ftruncate(int fd, int64_t length)
+mrb_ftruncate(int fd, mrb_int length)
{
#ifndef _WIN32
return ftruncate(fd, (off_t)length);
@@ -443,32 +492,11 @@ static mrb_value
mrb_file_truncate(mrb_state *mrb, mrb_value self)
{
int fd;
- int64_t length;
- mrb_value lenv;
+ mrb_int length;
+ mrb_value lenv = mrb_get_arg1(mrb);
fd = mrb_io_fileno(mrb, self);
- mrb_get_args(mrb, "o", &lenv);
- switch (mrb_type(lenv)) {
-#ifndef MRB_WITHOUT_FLOAT
- case MRB_TT_FLOAT:
- {
- mrb_float lenf = mrb_float(lenv);
- if (lenf > INT64_MAX) {
- mrb_raise(mrb, E_ARGUMENT_ERROR, "length too large");
- }
- length = (int64_t)lenf;
- }
- break;
-#endif
- case MRB_TT_FIXNUM:
- default:
- {
- mrb_int leni = mrb_int(mrb, lenv);
- length = (int64_t)leni;
- }
- break;
- }
-
+ length = mrb_int(mrb, lenv);
if (mrb_ftruncate(fd, length) != 0) {
mrb_raise(mrb, E_IO_ERROR, "ftruncate failed");
}
@@ -581,7 +609,7 @@ mrb_init_file(mrb_state *mrb)
mrb_define_class_method(mrb, file, "_gethome", mrb_file__gethome, MRB_ARGS_OPT(1));
mrb_define_method(mrb, file, "flock", mrb_file_flock, MRB_ARGS_REQ(1));
- mrb_define_method(mrb, file, "mtime", mrb_file_mtime, MRB_ARGS_NONE());
+ mrb_define_method(mrb, file, "_mtime", mrb_file_mtime, MRB_ARGS_NONE());
mrb_define_method(mrb, file, "size", mrb_file_size, MRB_ARGS_NONE());
mrb_define_method(mrb, file, "truncate", mrb_file_truncate, MRB_ARGS_REQ(1));
@@ -599,4 +627,22 @@ mrb_init_file(mrb_state *mrb)
#endif
mrb_define_const(mrb, cnst, "NULL", mrb_str_new_cstr(mrb, NULL_FILE));
+ mrb_define_const(mrb, cnst, "RDONLY", mrb_fixnum_value(MRB_O_RDONLY));
+ mrb_define_const(mrb, cnst, "WRONLY", mrb_fixnum_value(MRB_O_WRONLY));
+ mrb_define_const(mrb, cnst, "RDWR", mrb_fixnum_value(MRB_O_RDWR));
+ mrb_define_const(mrb, cnst, "APPEND", mrb_fixnum_value(MRB_O_APPEND));
+ mrb_define_const(mrb, cnst, "CREAT", mrb_fixnum_value(MRB_O_CREAT));
+ mrb_define_const(mrb, cnst, "EXCL", mrb_fixnum_value(MRB_O_EXCL));
+ mrb_define_const(mrb, cnst, "TRUNC", mrb_fixnum_value(MRB_O_TRUNC));
+ mrb_define_const(mrb, cnst, "NONBLOCK", mrb_fixnum_value(MRB_O_NONBLOCK));
+ mrb_define_const(mrb, cnst, "NOCTTY", mrb_fixnum_value(MRB_O_NOCTTY));
+ mrb_define_const(mrb, cnst, "BINARY", mrb_fixnum_value(MRB_O_BINARY));
+ mrb_define_const(mrb, cnst, "SHARE_DELETE", mrb_fixnum_value(MRB_O_SHARE_DELETE));
+ mrb_define_const(mrb, cnst, "SYNC", mrb_fixnum_value(MRB_O_SYNC));
+ mrb_define_const(mrb, cnst, "DSYNC", mrb_fixnum_value(MRB_O_DSYNC));
+ mrb_define_const(mrb, cnst, "RSYNC", mrb_fixnum_value(MRB_O_RSYNC));
+ mrb_define_const(mrb, cnst, "NOFOLLOW", mrb_fixnum_value(MRB_O_NOFOLLOW));
+ mrb_define_const(mrb, cnst, "NOATIME", mrb_fixnum_value(MRB_O_NOATIME));
+ mrb_define_const(mrb, cnst, "DIRECT", mrb_fixnum_value(MRB_O_DIRECT));
+ mrb_define_const(mrb, cnst, "TMPFILE", mrb_fixnum_value(MRB_O_TMPFILE));
}
diff --git a/mrbgems/mruby-io/src/file_test.c b/mrbgems/mruby-io/src/file_test.c
index aadd1ac1c..b7a28f4d3 100644
--- a/mrbgems/mruby-io/src/file_test.c
+++ b/mrbgems/mruby-io/src/file_test.c
@@ -28,7 +28,6 @@
#include <fcntl.h>
#include <errno.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -86,7 +85,7 @@ mrb_lstat(mrb_state *mrb, mrb_value obj, struct stat *st)
* File.directory?(".")
*/
-mrb_value
+static mrb_value
mrb_filetest_s_directory_p(mrb_state *mrb, mrb_value klass)
{
#ifndef S_ISDIR
@@ -94,9 +93,7 @@ mrb_filetest_s_directory_p(mrb_state *mrb, mrb_value klass)
#endif
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_stat(mrb, obj, &st) < 0)
return mrb_false_value();
@@ -113,7 +110,7 @@ mrb_filetest_s_directory_p(mrb_state *mrb, mrb_value klass)
* Returns <code>true</code> if the named file is a pipe.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_pipe_p(mrb_state *mrb, mrb_value klass)
{
#if defined(_WIN32) || defined(_WIN64)
@@ -125,9 +122,7 @@ mrb_filetest_s_pipe_p(mrb_state *mrb, mrb_value klass)
# endif
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_stat(mrb, obj, &st) < 0)
return mrb_false_value();
@@ -146,7 +141,7 @@ mrb_filetest_s_pipe_p(mrb_state *mrb, mrb_value klass)
* Returns <code>true</code> if the named file is a symbolic link.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass)
{
#if defined(_WIN32) || defined(_WIN64)
@@ -168,9 +163,7 @@ mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass)
#ifdef S_ISLNK
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_lstat(mrb, obj, &st) == -1)
return mrb_false_value();
@@ -189,7 +182,7 @@ mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass)
* Returns <code>true</code> if the named file is a socket.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_socket_p(mrb_state *mrb, mrb_value klass)
{
#if defined(_WIN32) || defined(_WIN64)
@@ -211,9 +204,7 @@ mrb_filetest_s_socket_p(mrb_state *mrb, mrb_value klass)
#ifdef S_ISSOCK
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_stat(mrb, obj, &st) < 0)
return mrb_false_value();
@@ -233,13 +224,12 @@ mrb_filetest_s_socket_p(mrb_state *mrb, mrb_value klass)
* Return <code>true</code> if the named file exists.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_exist_p(mrb_state *mrb, mrb_value klass)
{
struct stat st;
- mrb_value obj;
+ mrb_value obj = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &obj);
if (mrb_stat(mrb, obj, &st) < 0)
return mrb_false_value();
@@ -254,7 +244,7 @@ mrb_filetest_s_exist_p(mrb_state *mrb, mrb_value klass)
* regular file.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_file_p(mrb_state *mrb, mrb_value klass)
{
#ifndef S_ISREG
@@ -262,9 +252,7 @@ mrb_filetest_s_file_p(mrb_state *mrb, mrb_value klass)
#endif
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_stat(mrb, obj, &st) < 0)
return mrb_false_value();
@@ -282,13 +270,11 @@ mrb_filetest_s_file_p(mrb_state *mrb, mrb_value klass)
* a zero size.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass)
{
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_stat(mrb, obj, &st) < 0)
return mrb_false_value();
@@ -307,13 +293,11 @@ mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass)
* _file_name_ can be an IO object.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_size(mrb_state *mrb, mrb_value klass)
{
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_stat(mrb, obj, &st) < 0)
mrb_sys_fail(mrb, "mrb_stat");
@@ -329,13 +313,11 @@ mrb_filetest_s_size(mrb_state *mrb, mrb_value klass)
* file otherwise.
*/
-mrb_value
+static mrb_value
mrb_filetest_s_size_p(mrb_state *mrb, mrb_value klass)
{
struct stat st;
- mrb_value obj;
-
- mrb_get_args(mrb, "o", &obj);
+ mrb_value obj = mrb_get_arg1(mrb);
if (mrb_stat(mrb, obj, &st) < 0)
return mrb_nil_value();
diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c
index a5fe22e46..2c9cba84a 100644
--- a/mrbgems/mruby-io/src/io.c
+++ b/mrbgems/mruby-io/src/io.c
@@ -18,6 +18,7 @@
#if defined(_WIN32) || defined(_WIN64)
#include <winsock.h>
#include <io.h>
+ #include <basetsd.h>
#define open _open
#define close _close
#define dup _dup
@@ -31,14 +32,27 @@
typedef long ftime_t;
typedef long fsuseconds_t;
typedef int fmode_t;
+ typedef int mrb_io_read_write_size;
+ #ifndef MRB_MINGW32_LEGACY
+ #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED) && \
+ !defined(__have_typedef_ssize_t)
+ typedef SSIZE_T ssize_t;
+ #endif
+ #endif
+
+ #ifndef O_TMPFILE
+ #define O_TMPFILE O_TEMPORARY
+ #endif
#else
#include <sys/wait.h>
+ #include <sys/time.h>
#include <unistd.h>
typedef size_t fsize_t;
typedef time_t ftime_t;
typedef suseconds_t fsuseconds_t;
typedef mode_t fmode_t;
+ typedef ssize_t mrb_io_read_write_size;
#endif
#ifdef _MSC_VER
@@ -48,9 +62,14 @@ typedef mrb_int pid_t;
#include <fcntl.h>
#include <errno.h>
-#include <stdio.h>
#include <string.h>
+#define OPEN_ACCESS_MODE_FLAGS (O_RDONLY | O_WRONLY | O_RDWR)
+#define OPEN_RDONLY_P(f) ((mrb_bool)(((f) & OPEN_ACCESS_MODE_FLAGS) == O_RDONLY))
+#define OPEN_WRONLY_P(f) ((mrb_bool)(((f) & OPEN_ACCESS_MODE_FLAGS) == O_WRONLY))
+#define OPEN_RDWR_P(f) ((mrb_bool)(((f) & OPEN_ACCESS_MODE_FLAGS) == O_RDWR))
+#define OPEN_READABLE_P(f) ((mrb_bool)(OPEN_RDONLY_P(f) || OPEN_RDWR_P(f)))
+#define OPEN_WRITABLE_P(f) ((mrb_bool)(OPEN_WRONLY_P(f) || OPEN_RDWR_P(f)))
static void mrb_io_free(mrb_state *mrb, void *ptr);
struct mrb_data_type mrb_io_type = { "IO", mrb_io_free };
@@ -58,7 +77,7 @@ struct mrb_data_type mrb_io_type = { "IO", mrb_io_free };
static struct mrb_io *io_get_open_fptr(mrb_state *mrb, mrb_value self);
static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr);
-static int mrb_io_flags_to_modenum(mrb_state *mrb, int flags);
+static int mrb_io_mode_to_flags(mrb_state *mrb, mrb_value mode);
static void fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet);
static struct mrb_io *
@@ -100,30 +119,33 @@ io_set_process_status(mrb_state *mrb, pid_t pid, int status)
static int
mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode)
{
- int flags = 0;
+ int flags;
const char *m = mode;
switch (*m++) {
case 'r':
- flags |= FMODE_READABLE;
+ flags = O_RDONLY;
break;
case 'w':
- flags |= FMODE_WRITABLE | FMODE_CREATE | FMODE_TRUNC;
+ flags = O_WRONLY | O_CREAT | O_TRUNC;
break;
case 'a':
- flags |= FMODE_WRITABLE | FMODE_APPEND | FMODE_CREATE;
+ flags = O_WRONLY | O_CREAT | O_APPEND;
break;
default:
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal access mode %s", mode);
+ flags = 0; /* not reached */
}
while (*m) {
switch (*m++) {
case 'b':
- flags |= FMODE_BINMODE;
+#ifdef O_BINARY
+ flags |= O_BINARY;
+#endif
break;
case '+':
- flags |= FMODE_READWRITE;
+ flags = (flags & ~OPEN_ACCESS_MODE_FLAGS) | O_RDWR;
break;
case ':':
/* XXX: PASSTHROUGH*/
@@ -136,38 +158,72 @@ mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode)
}
static int
-mrb_io_flags_to_modenum(mrb_state *mrb, int flags)
+mrb_io_mode_to_flags(mrb_state *mrb, mrb_value mode)
{
- int modenum = 0;
-
- switch(flags & (FMODE_READABLE|FMODE_WRITABLE|FMODE_READWRITE)) {
- case FMODE_READABLE:
- modenum = O_RDONLY;
- break;
- case FMODE_WRITABLE:
- modenum = O_WRONLY;
- break;
- case FMODE_READWRITE:
- modenum = O_RDWR;
- break;
- }
-
- if (flags & FMODE_APPEND) {
- modenum |= O_APPEND;
- }
- if (flags & FMODE_TRUNC) {
- modenum |= O_TRUNC;
+ if (mrb_nil_p(mode)) {
+ return mrb_io_modestr_to_flags(mrb, "r");
}
- if (flags & FMODE_CREATE) {
- modenum |= O_CREAT;
+ else if (mrb_string_p(mode)) {
+ return mrb_io_modestr_to_flags(mrb, RSTRING_CSTR(mrb, mode));
}
+ else {
+ int flags = 0;
+ mrb_int flags0 = mrb_int(mrb, mode);
+
+ switch (flags0 & MRB_O_ACCMODE) {
+ case MRB_O_RDONLY:
+ flags |= O_RDONLY;
+ break;
+ case MRB_O_WRONLY:
+ flags |= O_WRONLY;
+ break;
+ case MRB_O_RDWR:
+ flags |= O_RDWR;
+ break;
+ default:
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal access mode %v", mode);
+ }
+
+ if (flags0 & MRB_O_APPEND) flags |= O_APPEND;
+ if (flags0 & MRB_O_CREAT) flags |= O_CREAT;
+ if (flags0 & MRB_O_EXCL) flags |= O_EXCL;
+ if (flags0 & MRB_O_TRUNC) flags |= O_TRUNC;
+#ifdef O_NONBLOCK
+ if (flags0 & MRB_O_NONBLOCK) flags |= O_NONBLOCK;
+#endif
+#ifdef O_NOCTTY
+ if (flags0 & MRB_O_NOCTTY) flags |= O_NOCTTY;
+#endif
#ifdef O_BINARY
- if (flags & FMODE_BINMODE) {
- modenum |= O_BINARY;
- }
+ if (flags0 & MRB_O_BINARY) flags |= O_BINARY;
+#endif
+#ifdef O_SHARE_DELETE
+ if (flags0 & MRB_O_SHARE_DELETE) flags |= O_SHARE_DELETE;
+#endif
+#ifdef O_SYNC
+ if (flags0 & MRB_O_SYNC) flags |= O_SYNC;
+#endif
+#ifdef O_DSYNC
+ if (flags0 & MRB_O_DSYNC) flags |= O_DSYNC;
+#endif
+#ifdef O_RSYNC
+ if (flags0 & MRB_O_RSYNC) flags |= O_RSYNC;
+#endif
+#ifdef O_NOFOLLOW
+ if (flags0 & MRB_O_NOFOLLOW) flags |= O_NOFOLLOW;
+#endif
+#ifdef O_NOATIME
+ if (flags0 & MRB_O_NOATIME) flags |= O_NOATIME;
+#endif
+#ifdef O_DIRECT
+ if (flags0 & MRB_O_DIRECT) flags |= O_DIRECT;
+#endif
+#ifdef O_TMPFILE
+ if (flags0 & MRB_O_TMPFILE) flags |= O_TMPFILE;
#endif
- return modenum;
+ return flags;
+ }
}
static void
@@ -292,7 +348,7 @@ option_to_fd(mrb_state *mrb, mrb_value hash, const char *key)
}
#ifdef _WIN32
-mrb_value
+static mrb_value
mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
{
mrb_value cmd, io;
@@ -317,11 +373,11 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
ofd[0] = INVALID_HANDLE_VALUE;
ofd[1] = INVALID_HANDLE_VALUE;
- mrb_get_args(mrb, "S|SH", &cmd, &mode, &opt);
+ mrb_get_args(mrb, "S|oH", &cmd, &mode, &opt);
io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
pname = RSTRING_CSTR(mrb, cmd);
- flags = mrb_io_modestr_to_flags(mrb, RSTRING_CSTR(mrb, mode));
+ flags = mrb_io_mode_to_flags(mrb, mode);
doexec = (strcmp("-", pname) != 0);
opt_in = option_to_fd(mrb, opt, "in");
@@ -332,14 +388,14 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
- if (flags & FMODE_READABLE) {
+ if (OPEN_READABLE_P(flags)) {
if (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0)
|| !SetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)) {
mrb_sys_fail(mrb, "pipe");
}
}
- if (flags & FMODE_WRITABLE) {
+ if (OPEN_WRITABLE_P(flags)) {
if (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0)
|| !SetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)) {
mrb_sys_fail(mrb, "pipe");
@@ -353,11 +409,11 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
si.dwFlags |= STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.dwFlags |= STARTF_USESTDHANDLES;
- if (flags & FMODE_READABLE) {
+ if (OPEN_READABLE_P(flags)) {
si.hStdOutput = ofd[1];
si.hStdError = ofd[1];
}
- if (flags & FMODE_WRITABLE) {
+ if (OPEN_WRITABLE_P(flags)) {
si.hStdInput = ifd[0];
}
if (!CreateProcess(
@@ -381,8 +437,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
fptr->fd = _open_osfhandle((intptr_t)ofd[0], 0);
fptr->fd2 = _open_osfhandle((intptr_t)ifd[1], 0);
fptr->pid = pid;
- fptr->readable = ((flags & FMODE_READABLE) != 0);
- fptr->writable = ((flags & FMODE_WRITABLE) != 0);
+ fptr->readable = OPEN_READABLE_P(flags);
+ fptr->writable = OPEN_WRITABLE_P(flags);
fptr->sync = 0;
DATA_TYPE(io) = &mrb_io_type;
@@ -390,14 +446,14 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
return io;
}
#elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-mrb_value
+static mrb_value
mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
{
mrb_raise(mrb, E_NOTIMP_ERROR, "IO#popen is not supported on the platform");
return mrb_false_value();
}
#else
-mrb_value
+static mrb_value
mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
{
mrb_value cmd, io, result;
@@ -413,18 +469,18 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
int saved_errno;
int opt_in, opt_out, opt_err;
- mrb_get_args(mrb, "S|SH", &cmd, &mode, &opt);
+ mrb_get_args(mrb, "S|oH", &cmd, &mode, &opt);
io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
pname = RSTRING_CSTR(mrb, cmd);
- flags = mrb_io_modestr_to_flags(mrb, RSTRING_CSTR(mrb, mode));
+ flags = mrb_io_mode_to_flags(mrb, mode);
doexec = (strcmp("-", pname) != 0);
opt_in = option_to_fd(mrb, opt, "in");
opt_out = option_to_fd(mrb, opt, "out");
opt_err = option_to_fd(mrb, opt, "err");
- if (flags & FMODE_READABLE) {
+ if (OPEN_READABLE_P(flags)) {
if (pipe(pr) == -1) {
mrb_sys_fail(mrb, "pipe");
}
@@ -432,7 +488,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
mrb_fd_cloexec(mrb, pr[1]);
}
- if (flags & FMODE_WRITABLE) {
+ if (OPEN_WRITABLE_P(flags)) {
if (pipe(pw) == -1) {
if (pr[0] != -1) close(pr[0]);
if (pr[1] != -1) close(pr[1]);
@@ -461,14 +517,14 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
if (opt_err != -1) {
dup2(opt_err, 2);
}
- if (flags & FMODE_READABLE) {
+ if (OPEN_READABLE_P(flags)) {
close(pr[0]);
if (pr[1] != 1) {
dup2(pr[1], 1);
close(pr[1]);
}
}
- if (flags & FMODE_WRITABLE) {
+ if (OPEN_WRITABLE_P(flags)) {
close(pw[1]);
if (pw[0] != 0) {
dup2(pw[0], 0);
@@ -487,12 +543,12 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
break;
default: /* parent */
- if ((flags & FMODE_READABLE) && (flags & FMODE_WRITABLE)) {
+ if (OPEN_RDWR_P(flags)) {
close(pr[1]);
fd = pr[0];
close(pw[0]);
write_fd = pw[1];
- } else if (flags & FMODE_READABLE) {
+ } else if (OPEN_RDONLY_P(flags)) {
close(pr[1]);
fd = pr[0];
} else {
@@ -506,8 +562,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
fptr->fd = fd;
fptr->fd2 = write_fd;
fptr->pid = pid;
- fptr->readable = ((flags & FMODE_READABLE) != 0);
- fptr->writable = ((flags & FMODE_WRITABLE) != 0);
+ fptr->readable = OPEN_READABLE_P(flags);
+ fptr->writable = OPEN_WRITABLE_P(flags);
fptr->sync = 0;
DATA_TYPE(io) = &mrb_io_type;
@@ -517,11 +573,11 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
case -1: /* error */
saved_errno = errno;
- if (flags & FMODE_READABLE) {
+ if (OPEN_READABLE_P(flags)) {
close(pr[0]);
close(pr[1]);
}
- if (flags & FMODE_WRITABLE) {
+ if (OPEN_WRITABLE_P(flags)) {
close(pw[0]);
close(pw[1]);
}
@@ -547,16 +603,15 @@ mrb_dup(mrb_state *mrb, int fd, mrb_bool *failed)
return new_fd;
}
-mrb_value
+static mrb_value
mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy)
{
- mrb_value orig;
+ mrb_value orig = mrb_get_arg1(mrb);
mrb_value buf;
struct mrb_io *fptr_copy;
struct mrb_io *fptr_orig;
mrb_bool failed = TRUE;
- mrb_get_args(mrb, "o", &orig);
fptr_orig = io_get_open_fptr(mrb, orig);
fptr_copy = (struct mrb_io *)DATA_PTR(copy);
if (fptr_orig == fptr_copy) return copy;
@@ -596,7 +651,44 @@ mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy)
return copy;
}
-mrb_value
+static void
+check_file_descriptor(mrb_state *mrb, mrb_int fd)
+{
+ struct stat sb;
+ int fdi = (int)fd;
+
+#if MRB_INT_MIN < INT_MIN || MRB_INT_MAX > INT_MAX
+ if (fdi != fd) {
+ goto badfd;
+ }
+#endif
+
+#ifdef _WIN32
+ {
+ DWORD err;
+ int len = sizeof(err);
+
+ if (getsockopt(fdi, SOL_SOCKET, SO_ERROR, (char*)&err, &len) == 0) {
+ return;
+ }
+ }
+
+ if (fdi < 0 || fdi > _getmaxstdio()) {
+ goto badfd;
+ }
+#endif /* _WIN32 */
+
+ if (fstat(fdi, &sb) != 0) {
+ goto badfd;
+ }
+
+ return;
+
+badfd:
+ mrb_sys_fail(mrb, "bad file descriptor");
+}
+
+static mrb_value
mrb_io_initialize(mrb_state *mrb, mrb_value io)
{
struct mrb_io *fptr;
@@ -606,7 +698,8 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
mode = opt = mrb_nil_value();
- mrb_get_args(mrb, "i|So", &fd, &mode, &opt);
+ mrb_get_args(mrb, "i|oo", &fd, &mode, &opt);
+ check_file_descriptor(mrb, fd);
if (mrb_nil_p(mode)) {
mode = mrb_str_new_cstr(mrb, "r");
}
@@ -614,7 +707,7 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
opt = mrb_hash_new(mrb);
}
- flags = mrb_io_modestr_to_flags(mrb, RSTRING_CSTR(mrb, mode));
+ flags = mrb_io_mode_to_flags(mrb, mode);
mrb_iv_set(mrb, io, mrb_intern_cstr(mrb, "@buf"), mrb_str_new_cstr(mrb, ""));
@@ -629,8 +722,8 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
DATA_PTR(io) = fptr;
fptr->fd = (int)fd;
- fptr->readable = ((flags & FMODE_READABLE) != 0);
- fptr->writable = ((flags & FMODE_WRITABLE) != 0);
+ fptr->readable = OPEN_READABLE_P(flags);
+ fptr->writable = OPEN_WRITABLE_P(flags);
fptr->sync = 0;
return io;
}
@@ -698,7 +791,7 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet)
}
}
-mrb_value
+static mrb_value
mrb_io_check_readable(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr = io_get_open_fptr(mrb, self);
@@ -708,7 +801,7 @@ mrb_io_check_readable(mrb_state *mrb, mrb_value self)
return mrb_nil_value();
}
-mrb_value
+static mrb_value
mrb_io_isatty(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr;
@@ -719,7 +812,7 @@ mrb_io_isatty(mrb_state *mrb, mrb_value self)
return mrb_true_value();
}
-mrb_value
+static mrb_value
mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass)
{
struct RClass *c = mrb_class_ptr(klass);
@@ -732,7 +825,7 @@ mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass)
return mrb_io_initialize(mrb, obj);
}
-mrb_value
+static mrb_value
mrb_io_s_sysclose(mrb_state *mrb, mrb_value klass)
{
mrb_int fd;
@@ -743,7 +836,7 @@ mrb_io_s_sysclose(mrb_state *mrb, mrb_value klass)
return mrb_fixnum_value(0);
}
-int
+static int
mrb_cloexec_open(mrb_state *mrb, const char *pathname, mrb_int flags, mrb_int mode)
{
int fd, retry = FALSE;
@@ -778,39 +871,55 @@ reopen:
return fd;
}
-mrb_value
+static mrb_value
mrb_io_s_sysopen(mrb_state *mrb, mrb_value klass)
{
mrb_value path = mrb_nil_value();
mrb_value mode = mrb_nil_value();
mrb_int fd, perm = -1;
const char *pat;
- int flags, modenum;
+ int flags;
- mrb_get_args(mrb, "S|Si", &path, &mode, &perm);
- if (mrb_nil_p(mode)) {
- mode = mrb_str_new_cstr(mrb, "r");
- }
+ mrb_get_args(mrb, "S|oi", &path, &mode, &perm);
if (perm < 0) {
perm = 0666;
}
pat = RSTRING_CSTR(mrb, path);
- flags = mrb_io_modestr_to_flags(mrb, RSTRING_CSTR(mrb, mode));
- modenum = mrb_io_flags_to_modenum(mrb, flags);
- fd = mrb_cloexec_open(mrb, pat, modenum, perm);
+ flags = mrb_io_mode_to_flags(mrb, mode);
+ fd = mrb_cloexec_open(mrb, pat, flags, perm);
return mrb_fixnum_value(fd);
}
-mrb_value
+static mrb_value mrb_io_sysread_common(mrb_state *mrb,
+ mrb_io_read_write_size (*readfunc)(int, void *, fsize_t, off_t),
+ mrb_value io, mrb_value buf, mrb_int maxlen, off_t offset);
+
+static mrb_io_read_write_size
+mrb_sysread_dummy(int fd, void *buf, fsize_t nbytes, off_t offset)
+{
+ return (mrb_io_read_write_size)read(fd, buf, nbytes);
+}
+
+static mrb_value
mrb_io_sysread(mrb_state *mrb, mrb_value io)
{
- struct mrb_io *fptr;
mrb_value buf = mrb_nil_value();
mrb_int maxlen;
- int ret;
mrb_get_args(mrb, "i|S", &maxlen, &buf);
+
+ return mrb_io_sysread_common(mrb, mrb_sysread_dummy, io, buf, maxlen, 0);
+}
+
+static mrb_value
+mrb_io_sysread_common(mrb_state *mrb,
+ mrb_io_read_write_size (*readfunc)(int, void *, fsize_t, off_t),
+ mrb_value io, mrb_value buf, mrb_int maxlen, off_t offset)
+{
+ struct mrb_io *fptr;
+ int ret;
+
if (maxlen < 0) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "negative expanding string size");
}
@@ -824,7 +933,8 @@ mrb_io_sysread(mrb_state *mrb, mrb_value io)
if (RSTRING_LEN(buf) != maxlen) {
buf = mrb_str_resize(mrb, buf, maxlen);
- } else {
+ }
+ else {
mrb_str_modify(mrb, RSTRING(buf));
}
@@ -832,29 +942,20 @@ mrb_io_sysread(mrb_state *mrb, mrb_value io)
if (!fptr->readable) {
mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
}
- ret = read(fptr->fd, RSTRING_PTR(buf), (fsize_t)maxlen);
- switch (ret) {
- case 0: /* EOF */
- if (maxlen == 0) {
- buf = mrb_str_new_cstr(mrb, "");
- } else {
- mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File");
- }
- break;
- case -1: /* Error */
- mrb_sys_fail(mrb, "sysread failed");
- break;
- default:
- if (RSTRING_LEN(buf) != ret) {
- buf = mrb_str_resize(mrb, buf, ret);
- }
- break;
+ ret = readfunc(fptr->fd, RSTRING_PTR(buf), (fsize_t)maxlen, offset);
+ if (ret < 0) {
+ mrb_sys_fail(mrb, "sysread failed");
+ }
+ if (RSTRING_LEN(buf) != ret) {
+ buf = mrb_str_resize(mrb, buf, ret);
+ }
+ if (ret == 0 && maxlen > 0) {
+ mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File");
}
-
return buf;
}
-mrb_value
+static mrb_value
mrb_io_sysseek(mrb_state *mrb, mrb_value io)
{
struct mrb_io *fptr;
@@ -882,11 +983,12 @@ mrb_io_sysseek(mrb_state *mrb, mrb_value io)
}
}
-mrb_value
-mrb_io_syswrite(mrb_state *mrb, mrb_value io)
+static mrb_value
+mrb_io_syswrite_common(mrb_state *mrb,
+ mrb_io_read_write_size (*writefunc)(int, const void *, fsize_t, off_t),
+ mrb_value io, mrb_value buf, off_t offset)
{
struct mrb_io *fptr;
- mrb_value str, buf;
int fd, length;
fptr = io_get_open_fptr(mrb, io);
@@ -894,15 +996,12 @@ mrb_io_syswrite(mrb_state *mrb, mrb_value io)
mrb_raise(mrb, E_IO_ERROR, "not opened for writing");
}
- mrb_get_args(mrb, "S", &str);
- buf = str;
-
if (fptr->fd2 == -1) {
fd = fptr->fd;
} else {
fd = fptr->fd2;
}
- length = write(fd, RSTRING_PTR(buf), (fsize_t)RSTRING_LEN(buf));
+ length = writefunc(fd, RSTRING_PTR(buf), (fsize_t)RSTRING_LEN(buf), offset);
if (length == -1) {
mrb_sys_fail(mrb, 0);
}
@@ -910,7 +1009,23 @@ mrb_io_syswrite(mrb_state *mrb, mrb_value io)
return mrb_fixnum_value(length);
}
-mrb_value
+static mrb_io_read_write_size
+mrb_syswrite_dummy(int fd, const void *buf, fsize_t nbytes, off_t offset)
+{
+ return (mrb_io_read_write_size)write(fd, buf, nbytes);
+}
+
+static mrb_value
+mrb_io_syswrite(mrb_state *mrb, mrb_value io)
+{
+ mrb_value buf;
+
+ mrb_get_args(mrb, "S", &buf);
+
+ return mrb_io_syswrite_common(mrb, mrb_syswrite_dummy, io, buf, 0);
+}
+
+static mrb_value
mrb_io_close(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr;
@@ -919,7 +1034,7 @@ mrb_io_close(mrb_state *mrb, mrb_value self)
return mrb_nil_value();
}
-mrb_value
+static mrb_value
mrb_io_close_write(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr;
@@ -930,7 +1045,7 @@ mrb_io_close_write(mrb_state *mrb, mrb_value self)
return mrb_nil_value();
}
-mrb_value
+static mrb_value
mrb_io_closed(mrb_state *mrb, mrb_value io)
{
struct mrb_io *fptr;
@@ -942,7 +1057,7 @@ mrb_io_closed(mrb_state *mrb, mrb_value io)
return mrb_true_value();
}
-mrb_value
+static mrb_value
mrb_io_pid(mrb_state *mrb, mrb_value io)
{
struct mrb_io *fptr;
@@ -1076,6 +1191,7 @@ mrb_io_s_select(mrb_state *mrb, mrb_value klass)
for (i = 0; i < RARRAY_LEN(read); i++) {
read_io = RARRAY_PTR(read)[i];
fptr = io_get_open_fptr(mrb, read_io);
+ if (fptr->fd >= FD_SETSIZE) continue;
FD_SET(fptr->fd, rp);
if (mrb_io_read_data_pending(mrb, read_io)) {
pending++;
@@ -1098,6 +1214,7 @@ mrb_io_s_select(mrb_state *mrb, mrb_value klass)
FD_ZERO(wp);
for (i = 0; i < RARRAY_LEN(write); i++) {
fptr = io_get_open_fptr(mrb, RARRAY_PTR(write)[i]);
+ if (fptr->fd >= FD_SETSIZE) continue;
FD_SET(fptr->fd, wp);
if (max < fptr->fd)
max = fptr->fd;
@@ -1117,6 +1234,7 @@ mrb_io_s_select(mrb_state *mrb, mrb_value klass)
FD_ZERO(ep);
for (i = 0; i < RARRAY_LEN(except); i++) {
fptr = io_get_open_fptr(mrb, RARRAY_PTR(except)[i]);
+ if (fptr->fd >= FD_SETSIZE) continue;
FD_SET(fptr->fd, ep);
if (max < fptr->fd)
max = fptr->fd;
@@ -1205,7 +1323,7 @@ mrb_io_fileno_m(mrb_state *mrb, mrb_value io)
return mrb_fixnum_value(fd);
}
-mrb_value
+static mrb_value
mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self)
{
#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
@@ -1229,7 +1347,7 @@ mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self)
#endif
}
-mrb_value
+static mrb_value
mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self)
{
#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
@@ -1265,7 +1383,7 @@ mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self)
#endif
}
-mrb_value
+static mrb_value
mrb_io_set_sync(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr;
@@ -1277,7 +1395,7 @@ mrb_io_set_sync(mrb_state *mrb, mrb_value self)
return mrb_bool_value(b);
}
-mrb_value
+static mrb_value
mrb_io_sync(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr;
@@ -1285,15 +1403,55 @@ mrb_io_sync(mrb_state *mrb, mrb_value self)
return mrb_bool_value(fptr->sync);
}
+#ifndef MRB_WITH_IO_PREAD_PWRITE
+# define mrb_io_pread mrb_notimplement_m
+# define mrb_io_pwrite mrb_notimplement_m
+#else
+static off_t
+value2off(mrb_state *mrb, mrb_value offv)
+{
+ return (off_t)mrb_int(mrb, offv);
+}
+
+/*
+ * call-seq:
+ * pread(maxlen, offset, outbuf = "") -> outbuf
+ */
+static mrb_value
+mrb_io_pread(mrb_state *mrb, mrb_value io)
+{
+ mrb_value buf = mrb_nil_value();
+ mrb_value off;
+ mrb_int maxlen;
+
+ mrb_get_args(mrb, "io|S!", &maxlen, &off, &buf);
+
+ return mrb_io_sysread_common(mrb, pread, io, buf, maxlen, value2off(mrb, off));
+}
+
+/*
+ * call-seq:
+ * pwrite(buffer, offset) -> wrote_bytes
+ */
+static mrb_value
+mrb_io_pwrite(mrb_state *mrb, mrb_value io)
+{
+ mrb_value buf, off;
+
+ mrb_get_args(mrb, "So", &buf, &off);
+
+ return mrb_io_syswrite_common(mrb, pwrite, io, buf, value2off(mrb, off));
+}
+#endif /* MRB_WITH_IO_PREAD_PWRITE */
+
static mrb_value
-io_bufread(mrb_state *mrb, mrb_value self)
+io_bufread(mrb_state *mrb, mrb_value str, mrb_int len)
{
- mrb_value str, str2;
- mrb_int len, newlen;
+ mrb_value str2;
+ mrb_int newlen;
struct RString *s;
char *p;
- mrb_get_args(mrb, "Si", &str, &len);
s = RSTRING(str);
mrb_str_modify(mrb, s);
p = RSTR_PTR(s);
@@ -1306,6 +1464,54 @@ io_bufread(mrb_state *mrb, mrb_value self)
return str2;
}
+static mrb_value
+mrb_io_bufread(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+ mrb_int len;
+
+ mrb_get_args(mrb, "Si", &str, &len);
+ return io_bufread(mrb, str, len);
+}
+
+static mrb_value
+mrb_io_readchar(mrb_state *mrb, mrb_value self)
+{
+ mrb_value buf;
+ mrb_int len = 1;
+#ifdef MRB_UTF8_STRING
+ unsigned char c;
+#endif
+
+ mrb_get_args(mrb, "S", &buf);
+ mrb_assert(RSTRING_LEN(buf) > 0);
+ mrb_assert(RSTRING_PTR(buf) != NULL);
+ mrb_str_modify(mrb, RSTRING(buf));
+#ifdef MRB_UTF8_STRING
+ c = RSTRING_PTR(buf)[0];
+ if (c & 0x80) {
+ len = mrb_utf8len(RSTRING_PTR(buf), RSTRING_END(buf));
+ if (len == 1 && RSTRING_LEN(buf) < 4) { /* partial UTF-8 */
+ mrb_int blen = RSTRING_LEN(buf);
+ ssize_t n;
+
+ struct mrb_io *fptr = (struct mrb_io*)io_get_open_fptr(mrb, self);
+
+ if (!fptr->readable) {
+ mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
+ }
+ /* refill the buffer */
+ mrb_str_resize(mrb, buf, 4096);
+ n = read(fptr->fd, RSTRING_PTR(buf)+blen, 4096-blen);
+ if (n < 0) mrb_sys_fail(mrb, "sysread failed");
+ mrb_str_resize(mrb, buf, blen+n);
+ }
+ len = mrb_utf8len(RSTRING_PTR(buf), RSTRING_END(buf));
+ }
+#endif
+ return io_bufread(mrb, buf, len);
+}
+
void
mrb_init_io(mrb_state *mrb)
{
@@ -1340,6 +1546,9 @@ mrb_init_io(mrb_state *mrb)
mrb_define_method(mrb, io, "closed?", mrb_io_closed, MRB_ARGS_NONE()); /* 15.2.20.5.2 */
mrb_define_method(mrb, io, "pid", mrb_io_pid, MRB_ARGS_NONE()); /* 15.2.20.5.2 */
mrb_define_method(mrb, io, "fileno", mrb_io_fileno_m, MRB_ARGS_NONE());
+ mrb_define_method(mrb, io, "pread", mrb_io_pread, MRB_ARGS_ANY()); /* ruby 2.5 feature */
+ mrb_define_method(mrb, io, "pwrite", mrb_io_pwrite, MRB_ARGS_ANY()); /* ruby 2.5 feature */
- mrb_define_class_method(mrb, io, "_bufread", io_bufread, MRB_ARGS_REQ(2));
+ mrb_define_method(mrb, io, "_readchar", mrb_io_readchar, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, io, "_bufread", mrb_io_bufread, MRB_ARGS_REQ(2));
}
diff --git a/mrbgems/mruby-io/test/file.rb b/mrbgems/mruby-io/test/file.rb
index 03917ef09..ef4d7fcb1 100644
--- a/mrbgems/mruby-io/test/file.rb
+++ b/mrbgems/mruby-io/test/file.rb
@@ -110,18 +110,22 @@ assert('File.join') do
end
assert('File.realpath') do
- if File::ALT_SEPARATOR
- readme_path = File._getwd + File::ALT_SEPARATOR + "README.md"
- assert_equal readme_path, File.realpath("README.md")
- else
- dir = MRubyIOTestUtil.mkdtemp("mruby-io-test.XXXXXX")
- begin
- dir1 = File.realpath($mrbtest_io_rfname)
- dir2 = File.realpath("./#{dir}//./../#{$mrbtest_io_symlinkname}")
- assert_equal dir1, dir2
- ensure
- MRubyIOTestUtil.rmdir dir
+ dir = MRubyIOTestUtil.mkdtemp("mruby-io-test.XXXXXX")
+ begin
+ sep = File::ALT_SEPARATOR || File::SEPARATOR
+ relative_path = "#{File.basename(dir)}#{sep}realpath_test"
+ path = "#{File._getwd}#{sep}#{relative_path}"
+ File.open(path, "w"){}
+ assert_equal path, File.realpath(relative_path)
+
+ unless MRubyIOTestUtil.win?
+ path1 = File.realpath($mrbtest_io_rfname)
+ path2 = File.realpath($mrbtest_io_symlinkname)
+ assert_equal path1, path2
end
+ ensure
+ File.delete path rescue nil
+ MRubyIOTestUtil.rmdir dir
end
assert_raise(ArgumentError) { File.realpath("TO\0DO") }
@@ -129,7 +133,9 @@ end
assert("File.readlink") do
begin
- assert_equal $mrbtest_io_rfname, File.readlink($mrbtest_io_symlinkname)
+ exp = File.basename($mrbtest_io_rfname)
+ act = File.readlink($mrbtest_io_symlinkname)
+ assert_equal exp, act
rescue NotImplementedError => e
skip e.message
end
diff --git a/mrbgems/mruby-io/test/io.rb b/mrbgems/mruby-io/test/io.rb
index e3024cf9a..2088a61e3 100644
--- a/mrbgems/mruby-io/test/io.rb
+++ b/mrbgems/mruby-io/test/io.rb
@@ -24,6 +24,10 @@ def assert_io_open(meth)
end
end
io2.close unless meth == :open
+
+ assert_raise(RuntimeError) { IO.__send__(meth, 1023) } # For Windows
+ assert_raise(RuntimeError) { IO.__send__(meth, 1 << 26) }
+ assert_raise(RuntimeError) { IO.__send__(meth, 1 << 32) } if (1 << 32).kind_of?(Integer)
end
end
@@ -564,6 +568,34 @@ assert('IO#sysseek') do
end
end
+assert('IO#pread') do
+ skip "IO#pread is not implemented on this configuration" unless MRubyIOTestUtil::MRB_WITH_IO_PREAD_PWRITE
+
+ IO.open(IO.sysopen($mrbtest_io_rfname, 'r'), 'r') do |io|
+ assert_equal $mrbtest_io_msg.byteslice(5, 8), io.pread(8, 5)
+ assert_equal 0, io.pos
+ assert_equal $mrbtest_io_msg.byteslice(1, 5), io.pread(5, 1)
+ assert_equal 0, io.pos
+ assert_raise(RuntimeError) { io.pread(20, -9) }
+ end
+end
+
+assert('IO#pwrite') do
+ skip "IO#pwrite is not implemented on this configuration" unless MRubyIOTestUtil::MRB_WITH_IO_PREAD_PWRITE
+
+ IO.open(IO.sysopen($mrbtest_io_wfname, 'w+'), 'w+') do |io|
+ assert_equal 6, io.pwrite("Warld!", 7)
+ assert_equal 0, io.pos
+ assert_equal 7, io.pwrite("Hello, ", 0)
+ assert_equal 0, io.pos
+ assert_equal "Hello, Warld!", io.read
+ assert_equal 6, io.pwrite("world!", 7)
+ assert_equal 13, io.pos
+ io.pos = 0
+ assert_equal "Hello, world!", io.read
+ end
+end
+
assert('IO.pipe') do
begin
called = false
diff --git a/mrbgems/mruby-io/test/mruby_io_test.c b/mrbgems/mruby-io/test/mruby_io_test.c
index 3cf1c6111..8bc87a0d4 100644
--- a/mrbgems/mruby-io/test/mruby_io_test.c
+++ b/mrbgems/mruby-io/test/mruby_io_test.c
@@ -1,5 +1,7 @@
+#include <mruby/common.h>
#include <sys/types.h>
#include <errno.h>
+#include <string.h>
#if defined(_WIN32) || defined(_WIN64)
@@ -7,7 +9,6 @@
#include <io.h>
#include <fcntl.h>
#include <direct.h>
-#include <string.h>
#include <stdlib.h>
#include <malloc.h>
@@ -18,12 +19,6 @@ typedef int mode_t;
#define open _open
#define close _close
-#if defined(__MINGW64_VERSION_MAJOR)
-# define MRB_MINGW64_VERSION (__MINGW64_VERSION_MAJOR * 1000 + __MINGW64_VERSION_MINOR)
-#elif defined(__MINGW32_MAJOR_VERSION)
-# define MRB_MINGW32_VERSION (__MINGW32_MAJOR_VERSION * 1000 + __MINGW32_MINOR_VERSION)
-#endif
-
#if defined(_MSC_VER) || \
(defined(MRB_MINGW32_VERSION) && MRB_MINGW32_VERSION < 3021) || \
(defined(MRB_MINGW64_VERSION) && MRB_MINGW64_VERSION < 4000)
@@ -58,10 +53,11 @@ mkdtemp(char *temp)
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
+ #include <fcntl.h>
+ #include <libgen.h>
#endif
#include <sys/stat.h>
-#include <stdio.h>
#include <stdlib.h>
#include "mruby.h"
@@ -69,51 +65,55 @@ mkdtemp(char *temp)
#include "mruby/error.h"
#include "mruby/string.h"
#include "mruby/variable.h"
+#include <mruby/ext/io.h>
static mrb_value
mrb_io_test_io_setup(mrb_state *mrb, mrb_value self)
{
- char rfname[] = "tmp.mruby-io-test-r.XXXXXXXX";
- char wfname[] = "tmp.mruby-io-test-w.XXXXXXXX";
- char symlinkname[] = "tmp.mruby-io-test-l.XXXXXXXX";
- char socketname[] = "tmp.mruby-io-test-s.XXXXXXXX";
+#define GVNAME(n) "$mrbtest_io_" #n "name"
+ enum {IDX_READ, IDX_WRITE, IDX_LINK, IDX_SOCKET, IDX_COUNT};
+ const char *gvnames[] = {GVNAME(rf), GVNAME(wf), GVNAME(symlink), GVNAME(socket)};
+ char *fnames[IDX_COUNT];
+ int fds[IDX_COUNT];
char msg[] = "mruby io test\n";
mode_t mask;
- int fd0, fd1;
FILE *fp;
-
+ int i;
#if !defined(_WIN32) && !defined(_WIN64)
- int fd2, fd3;
struct sockaddr_un sun0;
#endif
- mask = umask(077);
- fd0 = mkstemp(rfname);
- fd1 = mkstemp(wfname);
- if (fd0 == -1 || fd1 == -1) {
- mrb_raise(mrb, E_RUNTIME_ERROR, "can't create temporary file");
- return mrb_nil_value();
- }
- close(fd0);
- close(fd1);
+ mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb, msg));
+ mask = umask(077);
+ for (i = 0; i < IDX_COUNT; i++) {
+ mrb_value fname = mrb_str_new_capa(mrb, 0);
#if !defined(_WIN32) && !defined(_WIN64)
- fd2 = mkstemp(symlinkname);
- fd3 = mkstemp(socketname);
- if (fd2 == -1 || fd3 == -1) {
- mrb_raise(mrb, E_RUNTIME_ERROR, "can't create temporary file");
- return mrb_nil_value();
- }
+ /*
+ * Workaround for not being able to bind a socket to some file systems
+ * (e.g. vboxsf, NFS). [#4981]
+ */
+ char *tmpdir = getenv("TMPDIR");
+ if (tmpdir && strlen(tmpdir) > 0) {
+ mrb_str_cat_cstr(mrb, fname, tmpdir);
+ if (*(RSTRING_END(fname)-1) != '/') mrb_str_cat_lit(mrb, fname, "/");
+ } else {
+ mrb_str_cat_lit(mrb, fname, "/tmp/");
+ }
#endif
+ mrb_str_cat_cstr(mrb, fname, gvnames[i]+1);
+ mrb_str_cat_cstr(mrb, fname, ".XXXXXXXX");
+ fnames[i] = RSTRING_PTR(fname);
+ fds[i] = mkstemp(fnames[i]);
+ if (fds[i] == -1) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "can't create temporary file");
+ }
+ close(fds[i]);
+ mrb_gv_set(mrb, mrb_intern_cstr(mrb, gvnames[i]), fname);
+ }
umask(mask);
- mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_rfname"), mrb_str_new_cstr(mrb, rfname));
- mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_wfname"), mrb_str_new_cstr(mrb, wfname));
- mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_symlinkname"), mrb_str_new_cstr(mrb, symlinkname));
- mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_socketname"), mrb_str_new_cstr(mrb, socketname));
- mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb, msg));
-
- fp = fopen(rfname, "wb");
+ fp = fopen(fnames[IDX_READ], "wb");
if (fp == NULL) {
mrb_raise(mrb, E_RUNTIME_ERROR, "can't open temporary file");
return mrb_nil_value();
@@ -121,7 +121,7 @@ mrb_io_test_io_setup(mrb_state *mrb, mrb_value self)
fputs(msg, fp);
fclose(fp);
- fp = fopen(wfname, "wb");
+ fp = fopen(fnames[IDX_WRITE], "wb");
if (fp == NULL) {
mrb_raise(mrb, E_RUNTIME_ERROR, "can't open temporary file");
return mrb_nil_value();
@@ -129,29 +129,29 @@ mrb_io_test_io_setup(mrb_state *mrb, mrb_value self)
fclose(fp);
#if !defined(_WIN32) && !defined(_WIN64)
- unlink(symlinkname);
- close(fd2);
- if (symlink(rfname, symlinkname) == -1) {
+ unlink(fnames[IDX_LINK]);
+ if (symlink(basename(fnames[IDX_READ]), fnames[IDX_LINK]) == -1) {
mrb_raise(mrb, E_RUNTIME_ERROR, "can't make a symbolic link");
}
- unlink(socketname);
- close(fd3);
- fd3 = socket(AF_UNIX, SOCK_STREAM, 0);
- if (fd3 == -1) {
+ unlink(fnames[IDX_SOCKET]);
+ fds[IDX_SOCKET] = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fds[IDX_SOCKET] == -1) {
mrb_raise(mrb, E_RUNTIME_ERROR, "can't make a socket");
}
sun0.sun_family = AF_UNIX;
- snprintf(sun0.sun_path, sizeof(sun0.sun_path), "%s", socketname);
- if (bind(fd3, (struct sockaddr *)&sun0, sizeof(sun0)) == -1) {
+ strncpy(sun0.sun_path, fnames[IDX_SOCKET], sizeof(sun0.sun_path)-1);
+ sun0.sun_path[sizeof(sun0.sun_path)-1] = 0;
+ if (bind(fds[IDX_SOCKET], (struct sockaddr *)&sun0, sizeof(sun0)) == -1) {
mrb_raisef(mrb, E_RUNTIME_ERROR, "can't bind AF_UNIX socket to %s: %d",
sun0.sun_path,
errno);
}
- close(fd3);
+ close(fds[IDX_SOCKET]);
#endif
return mrb_true_value();
+#undef GVNAME
}
static mrb_value
@@ -210,7 +210,7 @@ mrb_io_test_rmdir(mrb_state *mrb, mrb_value klass)
return mrb_true_value();
}
-mrb_value
+static mrb_value
mrb_io_win_p(mrb_state *mrb, mrb_value klass)
{
#if defined(_WIN32) || defined(_WIN64)
@@ -224,6 +224,12 @@ mrb_io_win_p(mrb_state *mrb, mrb_value klass)
#endif
}
+#ifdef MRB_WITH_IO_PREAD_PWRITE
+# define MRB_WITH_IO_PREAD_PWRITE_ENABLED TRUE
+#else
+# define MRB_WITH_IO_PREAD_PWRITE_ENABLED FALSE
+#endif
+
void
mrb_mruby_io_gem_test(mrb_state* mrb)
{
@@ -234,4 +240,6 @@ mrb_mruby_io_gem_test(mrb_state* mrb)
mrb_define_class_method(mrb, io_test, "mkdtemp", mrb_io_test_mkdtemp, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, io_test, "rmdir", mrb_io_test_rmdir, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, io_test, "win?", mrb_io_win_p, MRB_ARGS_NONE());
+
+ mrb_define_const(mrb, io_test, "MRB_WITH_IO_PREAD_PWRITE", mrb_bool_value(MRB_WITH_IO_PREAD_PWRITE_ENABLED));
}
diff --git a/mrbgems/mruby-kernel-ext/src/kernel.c b/mrbgems/mruby-kernel-ext/src/kernel.c
index 427740c1c..1d183aecd 100644
--- a/mrbgems/mruby-kernel-ext/src/kernel.c
+++ b/mrbgems/mruby-kernel-ext/src/kernel.c
@@ -128,9 +128,8 @@ mrb_f_integer(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_float(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ mrb_value arg = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &arg);
return mrb_Float(mrb, arg);
}
#endif
@@ -149,9 +148,9 @@ mrb_f_float(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_string(mrb_state *mrb, mrb_value self)
{
- mrb_value arg, tmp;
+ mrb_value arg = mrb_get_arg1(mrb);
+ mrb_value tmp;
- mrb_get_args(mrb, "o", &arg);
tmp = mrb_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_s");
return tmp;
}
@@ -168,9 +167,9 @@ mrb_f_string(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_array(mrb_state *mrb, mrb_value self)
{
- mrb_value arg, tmp;
+ mrb_value arg = mrb_get_arg1(mrb);
+ mrb_value tmp;
- mrb_get_args(mrb, "o", &arg);
tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_a");
if (mrb_nil_p(tmp)) {
return mrb_ary_new_from_values(mrb, 1, &arg);
@@ -196,9 +195,8 @@ mrb_f_array(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_hash(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ mrb_value arg = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &arg);
if (mrb_nil_p(arg) || (mrb_array_p(arg) && RARRAY_LEN(arg) == 0)) {
return mrb_hash_new(mrb);
}
diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c
index f00c4493b..6c0dc5ad3 100644
--- a/mrbgems/mruby-metaprog/src/metaprog.c
+++ b/mrbgems/mruby-metaprog/src/metaprog.c
@@ -139,31 +139,30 @@ mrb_local_variables(mrb_state *mrb, mrb_value self)
proc = mrb->c->ci[-1].proc;
- if (MRB_PROC_CFUNC_P(proc)) {
+ if (proc == NULL || MRB_PROC_CFUNC_P(proc)) {
return mrb_ary_new(mrb);
}
vars = mrb_hash_new(mrb);
while (proc) {
if (MRB_PROC_CFUNC_P(proc)) break;
irep = proc->body.irep;
- if (!irep->lv) break;
- for (i = 0; i + 1 < irep->nlocals; ++i) {
- if (irep->lv[i].name) {
- mrb_sym sym = irep->lv[i].name;
- const char *name = mrb_sym_name(mrb, sym);
- switch (name[0]) {
- case '*': case '&':
- break;
- default:
- mrb_hash_set(mrb, vars, mrb_symbol_value(sym), mrb_true_value());
- break;
+ if (irep->lv) {
+ for (i = 0; i + 1 < irep->nlocals; ++i) {
+ if (irep->lv[i].name) {
+ mrb_sym sym = irep->lv[i].name;
+ const char *name = mrb_sym_name(mrb, sym);
+ switch (name[0]) {
+ case '*': case '&':
+ break;
+ default:
+ mrb_hash_set(mrb, vars, mrb_symbol_value(sym), mrb_true_value());
+ break;
+ }
}
}
}
- if (!MRB_PROC_ENV_P(proc)) break;
+ if (MRB_PROC_SCOPE_P(proc)) break;
proc = proc->upper;
- //if (MRB_PROC_SCOPE_P(proc)) break;
- if (!proc->c) break;
}
return mrb_hash_keys(mrb, vars);
@@ -671,8 +670,7 @@ mrb_mod_s_nesting(mrb_state *mrb, mrb_value mod)
ary = mrb_ary_new(mrb);
proc = mrb->c->ci[-1].proc; /* callee proc */
- mrb_assert(!MRB_PROC_CFUNC_P(proc));
- while (proc) {
+ while (proc && !MRB_PROC_CFUNC_P(proc)) {
if (MRB_PROC_SCOPE_P(proc)) {
struct RClass *c2 = MRB_PROC_TARGET_CLASS(proc);
diff --git a/mrbgems/mruby-metaprog/test/metaprog.rb b/mrbgems/mruby-metaprog/test/metaprog.rb
index 30b75bd60..82ba0a3a5 100644
--- a/mrbgems/mruby-metaprog/test/metaprog.rb
+++ b/mrbgems/mruby-metaprog/test/metaprog.rb
@@ -114,6 +114,15 @@ assert('Kernel.local_variables', '15.3.1.2.7') do
# Kernel#local_variables: 15.3.1.3.28
local_variables.sort
}.call(-1, -2)
+
+ a = Object.new
+ def a.hoge(vars, *, **)
+ Proc.new {
+ x, y = 1, 2
+ local_variables.sort
+ }
+ end
+ assert_equal([:vars, :x, :y]) { a.hoge(0).call }
end
assert('Kernel#define_singleton_method') do
diff --git a/mrbgems/mruby-method/src/method.c b/mrbgems/mruby-method/src/method.c
index f8dd66481..111b031b9 100644
--- a/mrbgems/mruby-method/src/method.c
+++ b/mrbgems/mruby-method/src/method.c
@@ -33,9 +33,8 @@ unbound_method_bind(mrb_state *mrb, mrb_value self)
mrb_value name = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "_name"));
mrb_value proc = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "_proc"));
mrb_value klass = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "_klass"));
- mrb_value recv;
+ mrb_value recv = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &recv);
bind_check(mrb, recv, owner);
me = method_object_alloc(mrb, mrb_class_get(mrb, "Method"));
mrb_obj_iv_set(mrb, me, mrb_intern_lit(mrb, "_owner"), owner);
@@ -51,11 +50,11 @@ unbound_method_bind(mrb_state *mrb, mrb_value self)
static mrb_value
method_eql(mrb_state *mrb, mrb_value self)
{
- mrb_value other, receiver, orig_proc, other_proc;
+ mrb_value other = mrb_get_arg1(mrb);
+ mrb_value receiver, orig_proc, other_proc;
struct RClass *owner, *klass;
struct RProc *orig_rproc, *other_rproc;
- mrb_get_args(mrb, "o", &other);
if (!mrb_obj_is_instance_of(mrb, other, mrb_class(mrb, self)))
return mrb_false_value();
@@ -110,7 +109,7 @@ method_eql(mrb_state *mrb, mrb_value self)
static mrb_value
mcall(mrb_state *mrb, mrb_value recv, mrb_value proc, mrb_value name, struct RClass *owner,
- int argc, mrb_value *argv, mrb_value block)
+ mrb_int argc, mrb_value *argv, mrb_value block)
{
mrb_value ret;
mrb_sym orig_mid = mrb->c->ci->mid;
diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c
index 8d5604cad..31bb689f6 100644
--- a/mrbgems/mruby-object-ext/src/object.c
+++ b/mrbgems/mruby-object-ext/src/object.c
@@ -101,18 +101,9 @@ mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
struct RClass *c;
mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
-
- switch (mrb_type(self)) {
- case MRB_TT_SYMBOL:
- case MRB_TT_FIXNUM:
-#ifndef MRB_WITHOUT_FLOAT
- case MRB_TT_FLOAT:
-#endif
- c = NULL;
- break;
- default:
- c = mrb_class_ptr(mrb_singleton_class(mrb, self));
- break;
+ c = mrb_singleton_class_ptr(mrb, self);
+ if (mrb->c->ci->acc < 0) {
+ return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
}
mrb->c->ci->target_class = c;
return mrb_yield_cont(mrb, blk, self, argc, argv);
diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
index 651c04d92..bded3afa8 100644
--- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c
+++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c
@@ -2,6 +2,14 @@
#include <mruby/gc.h>
#include <mruby/hash.h>
#include <mruby/class.h>
+#include <mruby/object.h>
+#include <mruby/numeric.h>
+#include <mruby/string.h>
+#include <mruby/array.h>
+#include <mruby/variable.h>
+#include <mruby/proc.h>
+#include <mruby/value.h>
+#include <mruby/range.h>
struct os_count_struct {
mrb_int total;
@@ -89,10 +97,10 @@ os_count_objects(mrb_state *mrb, mrb_value self)
COUNT_TYPE(T_STRING);
COUNT_TYPE(T_RANGE);
COUNT_TYPE(T_EXCEPTION);
- COUNT_TYPE(T_FILE);
COUNT_TYPE(T_ENV);
COUNT_TYPE(T_DATA);
COUNT_TYPE(T_FIBER);
+ COUNT_TYPE(T_ISTRUCT);
#undef COUNT_TYPE
default:
type = mrb_fixnum_value(i); break;
@@ -105,9 +113,9 @@ os_count_objects(mrb_state *mrb, mrb_value self)
}
struct os_each_object_data {
- mrb_value block;
struct RClass *target_module;
mrb_int count;
+ mrb_value block;
};
static int
@@ -122,8 +130,8 @@ os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
/* filter internal objects */
switch (obj->tt) {
- case MRB_TT_ENV:
- case MRB_TT_ICLASS:
+ case MRB_TT_FREE: case MRB_TT_ENV:
+ case MRB_TT_BREAK: case MRB_TT_ICLASS:
return MRB_EACH_OBJ_OK;
default:
break;
@@ -159,12 +167,8 @@ os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
static mrb_value
os_each_object(mrb_state *mrb, mrb_value self)
{
- mrb_value cls = mrb_nil_value();
- struct os_each_object_data d;
- mrb_get_args(mrb, "&!|C", &d.block, &cls);
-
- d.target_module = mrb_nil_p(cls) ? NULL : mrb_class_ptr(cls);
- d.count = 0;
+ struct os_each_object_data d = {0};
+ mrb_get_args(mrb, "&!|c", &d.block, &d.target_module);
mrb_objspace_each_objects(mrb, os_each_object_cb, &d);
return mrb_fixnum_value(d.count);
}
diff --git a/mrbgems/mruby-os-memsize/mrbgem.rake b/mrbgems/mruby-os-memsize/mrbgem.rake
new file mode 100644
index 000000000..b5c163bba
--- /dev/null
+++ b/mrbgems/mruby-os-memsize/mrbgem.rake
@@ -0,0 +1,10 @@
+MRuby::Gem::Specification.new('mruby-os-memsize') do |spec|
+ spec.license = 'MIT'
+ spec.author = 'mruby developers'
+ spec.summary = 'ObjectSpace memsize_of method'
+
+ spec.add_dependency('mruby-objectspace')
+ spec.add_test_dependency('mruby-metaprog')
+ spec.add_test_dependency('mruby-method')
+ spec.add_test_dependency('mruby-fiber')
+end
diff --git a/mrbgems/mruby-os-memsize/src/memsize.c b/mrbgems/mruby-os-memsize/src/memsize.c
new file mode 100644
index 000000000..191ab062d
--- /dev/null
+++ b/mrbgems/mruby-os-memsize/src/memsize.c
@@ -0,0 +1,244 @@
+#include <mruby.h>
+#include <mruby/gc.h>
+#include <mruby/hash.h>
+#include <mruby/class.h>
+#include <mruby/object.h>
+#include <mruby/numeric.h>
+#include <mruby/string.h>
+#include <mruby/array.h>
+#include <mruby/variable.h>
+#include <mruby/proc.h>
+#include <mruby/value.h>
+#include <mruby/range.h>
+
+static size_t
+os_memsize_of_ivars(mrb_state* mrb, mrb_value obj)
+{
+ return mrb_obj_iv_tbl_memsize(mrb, obj);
+}
+
+static size_t
+os_memsize_of_irep(mrb_state* state, const struct mrb_irep *irep)
+{
+ size_t size;
+ int i;
+
+ size = (irep->slen * sizeof(mrb_sym)) +
+ (irep->plen * sizeof(mrb_code)) +
+ (irep->ilen * sizeof(mrb_code));
+
+ for(i = 0; i < irep->rlen; i++) {
+ size += os_memsize_of_irep(state, irep->reps[i]);
+ }
+ return size;
+}
+
+static size_t
+os_memsize_of_method(mrb_state* mrb, mrb_value method_obj)
+{
+ size_t size;
+ mrb_value proc_value = mrb_obj_iv_get(mrb, mrb_obj_ptr(method_obj),
+ mrb_intern_lit(mrb, "_proc"));
+ struct RProc *proc = mrb_proc_ptr(proc_value);
+
+ size = sizeof(struct RProc);
+ if (!MRB_PROC_CFUNC_P(proc)) size += os_memsize_of_irep(mrb, proc->body.irep);
+ return size;
+}
+
+static mrb_bool
+obj_is_kind_of_checked(mrb_state *mrb, mrb_value obj, const char *classname)
+{
+ mrb_value objclass = mrb_obj_value(mrb->object_class);
+
+ if (mrb_const_defined(mrb, objclass, mrb_intern_cstr(mrb, classname))) {
+ struct RClass *klass = mrb_class_get(mrb, classname);
+ return mrb_obj_is_kind_of(mrb, obj, klass);
+ }
+
+ return FALSE;
+}
+
+static size_t
+os_memsize_of_object(mrb_state* mrb, mrb_value obj)
+{
+ size_t size = 0;
+
+ switch(mrb_type(obj)) {
+ case MRB_TT_STRING:
+ size += mrb_objspace_page_slot_size();
+ if (!RSTR_EMBED_P(RSTRING(obj)) && !RSTR_SHARED_P(RSTRING(obj))) {
+ size += RSTRING_CAPA(obj);
+ size++; /* NUL terminator */
+ }
+ break;
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ case MRB_TT_ICLASS:
+ size += mrb_gc_mark_mt_size(mrb, mrb_class_ptr(obj)) * sizeof(mrb_method_t);
+ /* fall through */
+ case MRB_TT_EXCEPTION:
+ case MRB_TT_OBJECT: {
+ size += mrb_objspace_page_slot_size();
+ size += os_memsize_of_ivars(mrb, obj);
+ if (obj_is_kind_of_checked(mrb, obj, "UnboundMethod") ||
+ obj_is_kind_of_checked(mrb, obj, "Method")) {
+ size += os_memsize_of_method(mrb, obj);
+ }
+ break;
+ }
+ case MRB_TT_HASH: {
+ size += mrb_objspace_page_slot_size() +
+ mrb_os_memsize_of_hash_table(obj);
+ break;
+ }
+ case MRB_TT_ARRAY: {
+ mrb_int len = RARRAY_LEN(obj);
+ /* Arrays that do not fit within an RArray perform a heap allocation
+ * storing an array of pointers to the original objects*/
+ size += mrb_objspace_page_slot_size();
+ if(len > MRB_ARY_EMBED_LEN_MAX) size += sizeof(mrb_value *) * len;
+ break;
+ }
+ case MRB_TT_PROC: {
+ struct RProc* proc = mrb_proc_ptr(obj);
+ size += mrb_objspace_page_slot_size();
+ size += MRB_ENV_LEN(proc->e.env) * sizeof(mrb_value);
+ if(!MRB_PROC_CFUNC_P(proc)) size += os_memsize_of_irep(mrb, proc->body.irep);
+ break;
+ }
+ case MRB_TT_DATA:
+ size += mrb_objspace_page_slot_size();
+ break;
+#ifndef MRB_WITHOUT_FLOAT
+ case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+ size += mrb_objspace_page_slot_size() +
+ sizeof(struct RFloat);
+#endif
+ break;
+#endif
+ case MRB_TT_RANGE:
+#ifndef MRB_RANGE_EMBED
+ size += mrb_objspace_page_slot_size() +
+ sizeof(struct mrb_range_edges);
+#endif
+ break;
+ case MRB_TT_FIBER: {
+ struct RFiber* f = (struct RFiber *)mrb_ptr(obj);
+ ptrdiff_t stack_size = f->cxt->stend - f->cxt->stbase;
+ ptrdiff_t ci_size = f->cxt->ciend - f->cxt->cibase;
+
+ size += mrb_objspace_page_slot_size() +
+ sizeof(struct RFiber) +
+ sizeof(struct mrb_context) +
+ sizeof(struct RProc *) * f->cxt->esize +
+ sizeof(uint16_t *) * f->cxt->rsize +
+ sizeof(mrb_value) * stack_size +
+ sizeof(mrb_callinfo) * ci_size;
+ break;
+ }
+ case MRB_TT_ISTRUCT:
+ size += mrb_objspace_page_slot_size();
+ break;
+ /* zero heap size types.
+ * immediate VM stack values, contained within mrb_state, or on C stack */
+ case MRB_TT_TRUE:
+ case MRB_TT_FALSE:
+ case MRB_TT_FIXNUM:
+ case MRB_TT_BREAK:
+ case MRB_TT_CPTR:
+ case MRB_TT_SYMBOL:
+ case MRB_TT_FREE:
+ case MRB_TT_UNDEF:
+ case MRB_TT_ENV:
+ /* never used, silences compiler warning
+ * not having a default: clause lets the compiler tell us when there is a new
+ * TT not accounted for */
+ case MRB_TT_MAXDEFINE:
+ break;
+ }
+ return size;
+}
+
+/*
+ * call-seq:
+ * ObjectSpace.memsize_of(obj) -> Numeric
+ *
+ * Returns the amount of heap memory allocated for object in size_t units.
+ *
+ * The return value depends on the definition of size_t on that platform,
+ * therefore the value is not comparable across platform types.
+ *
+ * Immediate values such as integers, booleans, symbols and unboxed float numbers
+ * return 0. Additionally special objects which are small enough to fit inside an
+ * object pointer, termed embedded objects, will return the size of the object pointer.
+ * Strings and arrays below a compile-time defined size may be embedded.
+ */
+
+static mrb_value
+os_memsize_of(mrb_state *mrb, mrb_value self)
+{
+ size_t total;
+ mrb_value obj;
+
+ mrb_get_args(mrb, "o", &obj);
+
+ total = os_memsize_of_object(mrb, obj);
+ return mrb_fixnum_value((mrb_int)total);
+}
+
+struct os_memsize_of_all_cb_data {
+ size_t t;
+ struct RClass *type;
+};
+
+static int
+os_memsize_of_all_cb(mrb_state *mrb, struct RBasic *obj, void *d)
+{
+ struct os_memsize_of_all_cb_data *data = (struct os_memsize_of_all_cb_data *)d;
+ switch (obj->tt) {
+ case MRB_TT_FREE: case MRB_TT_ENV:
+ case MRB_TT_BREAK: case MRB_TT_ICLASS:
+ /* internal objects that should not be counted */
+ return MRB_EACH_OBJ_OK;
+ default:
+ break;
+ }
+ /* skip Proc objects for methods */
+ if (obj->c == NULL) return 0;
+ if (data->type == NULL || mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), data->type))
+ data->t += os_memsize_of_object(mrb, mrb_obj_value(obj));
+ return MRB_EACH_OBJ_OK;
+}
+
+/*
+ * call-seq:
+ * ObjectSpace.memsize_of_all([klass]) -> Numeric
+ *
+ * Return consuming memory size of all living objects of type klass.
+ *
+ */
+
+static mrb_value
+os_memsize_of_all(mrb_state *mrb, mrb_value self)
+{
+ struct os_memsize_of_all_cb_data data = { 0 };
+ mrb_get_args(mrb, "|c", &data.type);
+ mrb_objspace_each_objects(mrb, os_memsize_of_all_cb, &data);
+ return mrb_fixnum_value((mrb_int)data.t);
+}
+
+void
+mrb_mruby_os_memsize_gem_init(mrb_state *mrb)
+{
+ struct RClass *os = mrb_module_get(mrb, "ObjectSpace");
+ mrb_define_class_method(mrb, os, "memsize_of", os_memsize_of, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, os, "memsize_of_all", os_memsize_of_all, MRB_ARGS_OPT(1));
+}
+
+void
+mrb_mruby_os_memsize_gem_final(mrb_state *mrb)
+{
+}
diff --git a/mrbgems/mruby-os-memsize/test/memsize.rb b/mrbgems/mruby-os-memsize/test/memsize.rb
new file mode 100644
index 000000000..6be8f1b06
--- /dev/null
+++ b/mrbgems/mruby-os-memsize/test/memsize.rb
@@ -0,0 +1,63 @@
+assert 'ObjectSpace.memsize_of' do
+ # immediate literals
+ int_size = ObjectSpace.memsize_of 1
+ assert_equal int_size, 0, 'int zero'
+
+ sym_size = ObjectSpace.memsize_of :foo
+ assert_equal sym_size, 0, 'sym zero'
+
+ assert_equal ObjectSpace.memsize_of(true), int_size
+ assert_equal ObjectSpace.memsize_of(false), int_size
+
+ assert_not_equal ObjectSpace.memsize_of('a'), 0, 'memsize of str'
+
+ if __ENCODING__ == "UTF-8"
+ assert_not_equal ObjectSpace.memsize_of("こんにちは世界"), 0, 'memsize of utf8 str'
+ end
+
+ # class defs
+ class_obj_size = ObjectSpace.memsize_of Class
+ assert_not_equal class_obj_size, 0, 'Class obj not zero'
+
+ empty_class_def_size = ObjectSpace.memsize_of Class.new
+ assert_not_equal empty_class_def_size, 0, 'Class def not zero'
+
+ proc_size = ObjectSpace.memsize_of Proc.new { x = 1; x }
+ assert_not_equal proc_size, 0
+
+ class_with_methods = Class.new do
+ def foo
+ a = 0
+ a + 1
+ end
+ end
+
+ m_size = ObjectSpace.memsize_of class_with_methods.instance_method(:foo)
+ assert_not_equal m_size, 0, 'method size not zero'
+
+ # collections
+ empty_array_size = ObjectSpace.memsize_of []
+ assert_not_equal empty_array_size, 0, 'empty array size not zero'
+ assert_operator empty_array_size, :<, ObjectSpace.memsize_of(Array.new(16)), 'large array size greater than embed'
+
+ # fiber
+ empty_fiber_size = ObjectSpace.memsize_of(Fiber.new {})
+ assert_not_equal empty_fiber_size, 0, 'empty fiber not zero'
+
+ #hash
+ assert_not_equal ObjectSpace.memsize_of({}), 0, 'empty hash size not zero'
+end
+
+assert 'ObjectSpace.memsize_of_all' do
+ foo_class = Class.new do
+ def initialize
+ @a = 'a'
+ @b = 'b'
+ end
+ end
+
+ foos = Array.new(10) { foo_class.new }
+ foo_size = ObjectSpace.memsize_of(foos.first)
+
+ assert_equal ObjectSpace.memsize_of_all(foo_class), foo_size * foos.size, 'Memsize of all instance'
+end
diff --git a/mrbgems/mruby-pack/src/pack.c b/mrbgems/mruby-pack/src/pack.c
index 73b6ce635..e222cd946 100644
--- a/mrbgems/mruby-pack/src/pack.c
+++ b/mrbgems/mruby-pack/src/pack.c
@@ -2,7 +2,7 @@
** pack.c - Array#pack, String#unpack
*/
-#include "mruby.h"
+#include <mruby.h>
#include "mruby/error.h"
#include "mruby/array.h"
#include "mruby/class.h"
@@ -13,7 +13,6 @@
#include <ctype.h>
#include <errno.h>
#include <limits.h>
-#include <stdio.h>
#include <string.h>
struct tmpl {
@@ -213,6 +212,59 @@ pack_l(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int fl
return 4;
}
+#ifndef MRB_INT64
+static void
+u32tostr(char *buf, size_t len, uint32_t n)
+{
+#ifdef MRB_DISABLE_STDIO
+ char *bufend = buf + len;
+ char *p = bufend - 1;
+
+ if (len < 1) {
+ return;
+ }
+
+ *p -- = '\0';
+ len --;
+
+ if (n > 0) {
+ for (; len > 0 && n > 0; len --, n /= 10) {
+ *p -- = '0' + (n % 10);
+ }
+ p ++;
+ }
+ else if (len > 0) {
+ *p = '0';
+ len --;
+ }
+
+ memmove(buf, p, bufend - p);
+#else
+ snprintf(buf, len, "%" PRIu32, n);
+#endif /* MRB_DISABLE_STDIO */
+}
+
+static void
+i32tostr(char *buf, size_t len, int32_t n)
+{
+#ifdef MRB_DISABLE_STDIO
+ if (len < 1) {
+ return;
+ }
+
+ if (n < 0) {
+ *buf ++ = '-';
+ len --;
+ n = -n;
+ }
+
+ u32tostr(buf, len, (uint32_t)n);
+#else
+ snprintf(buf, len, "%" PRId32, n);
+#endif /* MRB_DISABLE_STDIO */
+}
+#endif /* MRB_INT64 */
+
static int
unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
{
@@ -237,16 +289,16 @@ unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un
int32_t sl = ul;
#ifndef MRB_INT64
if (!FIXABLE(sl)) {
- snprintf(msg, sizeof(msg), "cannot unpack to Fixnum: %" PRId32, sl);
- mrb_raise(mrb, E_RANGE_ERROR, msg);
+ i32tostr(msg, sizeof(msg), sl);
+ mrb_raisef(mrb, E_RANGE_ERROR, "cannot unpack to Fixnum: %s", msg);
}
#endif
n = sl;
} else {
#ifndef MRB_INT64
if (!POSFIXABLE(ul)) {
- snprintf(msg, sizeof(msg), "cannot unpack to Fixnum: %" PRIu32, ul);
- mrb_raise(mrb, E_RANGE_ERROR, msg);
+ u32tostr(msg, sizeof(msg), ul);
+ mrb_raisef(mrb, E_RANGE_ERROR, "cannot unpack to Fixnum: %s", msg);
}
#endif
n = ul;
@@ -284,6 +336,57 @@ pack_q(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int fl
return 8;
}
+static void
+u64tostr(char *buf, size_t len, uint64_t n)
+{
+#ifdef MRB_DISABLE_STDIO
+ char *bufend = buf + len;
+ char *p = bufend - 1;
+
+ if (len < 1) {
+ return;
+ }
+
+ *p -- = '\0';
+ len --;
+
+ if (n > 0) {
+ for (; len > 0 && n > 0; len --, n /= 10) {
+ *p -- = '0' + (n % 10);
+ }
+ p ++;
+ }
+ else if (len > 0) {
+ *p = '0';
+ len --;
+ }
+
+ memmove(buf, p, bufend - p);
+#else
+ snprintf(buf, len, "%" PRIu64, n);
+#endif /* MRB_DISABLE_STDIO */
+}
+
+static void
+i64tostr(char *buf, size_t len, int64_t n)
+{
+#ifdef MRB_DISABLE_STDIO
+ if (len < 1) {
+ return;
+ }
+
+ if (n < 0) {
+ *buf ++ = '-';
+ len --;
+ n = -n;
+ }
+
+ u64tostr(buf, len, (uint64_t)n);
+#else
+ snprintf(buf, len, "%" PRId64, n);
+#endif /* MRB_DISABLE_STDIO */
+}
+
static int
unpack_q(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
{
@@ -307,16 +410,16 @@ unpack_q(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un
if (flags & PACK_FLAG_SIGNED) {
int64_t sll = ull;
if (!FIXABLE(sll)) {
- snprintf(msg, sizeof(msg), "cannot unpack to Fixnum: %" PRId64, sll);
- mrb_raise(mrb, E_RANGE_ERROR, msg);
+ i64tostr(msg, sizeof(msg), sll);
+ mrb_raisef(mrb, E_RANGE_ERROR, "cannot unpack to Fixnum: %s", msg);
}
- n = sll;
+ n = (mrb_int)sll;
} else {
if (!POSFIXABLE(ull)) {
- snprintf(msg, sizeof(msg), "cannot unpack to Fixnum: %" PRIu64, ull);
- mrb_raise(mrb, E_RANGE_ERROR, msg);
+ u64tostr(msg, sizeof(msg), ull);
+ mrb_raisef(mrb, E_RANGE_ERROR, "cannot unpack to Fixnum: %s", msg);
}
- n = ull;
+ n = (mrb_int)ull;
}
mrb_ary_push(mrb, ary, mrb_fixnum_value(n));
return 8;
@@ -725,7 +828,7 @@ unpack_h(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, un
}
}
- dst = mrb_str_resize(mrb, dst, dptr - dptr0);
+ dst = mrb_str_resize(mrb, dst, (mrb_int)(dptr - dptr0));
mrb_ary_push(mrb, ary, dst);
return (int)(sptr - sptr0);
}
@@ -848,7 +951,7 @@ unpack_m(mrb_state *mrb, const void *src, int slen, mrb_value ary, unsigned int
}
done:
- dst = mrb_str_resize(mrb, dst, dptr - dptr0);
+ dst = mrb_str_resize(mrb, dst, (mrb_int)(dptr - dptr0));
mrb_ary_push(mrb, ary, dst);
return (int)(sptr - sptr0);
}
@@ -1195,7 +1298,8 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary)
default:
break;
}
- if (dir == PACK_DIR_STR || dir == PACK_DIR_BASE64) { /* always consumes 1 entry */
+ if (dir == PACK_DIR_STR || dir == PACK_DIR_BASE64 || dir == PACK_DIR_HEX) {
+ /* always consumes 1 entry */
aidx++;
break;
}
diff --git a/mrbgems/mruby-print/mrblib/print.rb b/mrbgems/mruby-print/mrblib/print.rb
index cfe14a5e1..6383901ee 100644
--- a/mrbgems/mruby-print/mrblib/print.rb
+++ b/mrbgems/mruby-print/mrblib/print.rb
@@ -4,38 +4,9 @@
# ISO 15.3.1
module Kernel
##
- # Invoke method +print+ on STDOUT and passing +*args+
- #
- # ISO 15.3.1.2.10
- def print(*args)
- i = 0
- len = args.size
- while i < len
- __printstr__ args[i].to_s
- i += 1
- end
- end
-
- ##
- # Invoke method +puts+ on STDOUT and passing +*args*+
- #
- # ISO 15.3.1.2.11
- def puts(*args)
- i = 0
- len = args.size
- while i < len
- s = args[i].to_s
- __printstr__ s
- __printstr__ "\n" if (s[-1] != "\n")
- i += 1
- end
- __printstr__ "\n" if len == 0
- nil
- end
-
- ##
# Print human readable object description
#
+ # ISO 15.3.1.2.9
# ISO 15.3.1.3.34
def p(*args)
i = 0
diff --git a/mrbgems/mruby-print/src/print.c b/mrbgems/mruby-print/src/print.c
index f7f99fc77..df153d920 100644
--- a/mrbgems/mruby-print/src/print.c
+++ b/mrbgems/mruby-print/src/print.c
@@ -1,6 +1,10 @@
#include <mruby.h>
+
+#ifdef MRB_DISABLE_STDIO
+# error print conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
+#endif
+
#include <mruby/string.h>
-#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#if defined(_WIN32)
@@ -13,40 +17,73 @@
#endif
static void
-printstr(mrb_state *mrb, mrb_value obj)
+printstr(mrb_state *mrb, const char *p, size_t len)
{
- if (mrb_string_p(obj)) {
#if defined(_WIN32)
- if (isatty(fileno(stdout))) {
- DWORD written;
- int mlen = (int)RSTRING_LEN(obj);
- char* utf8 = RSTRING_PTR(obj);
- int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, NULL, 0);
- wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
- if (MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, utf16, wlen) > 0) {
- utf16[wlen] = 0;
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
- utf16, wlen, &written, NULL);
- }
- mrb_free(mrb, utf16);
- } else
+ if (isatty(fileno(stdout))) {
+ DWORD written;
+ int wlen = MultiByteToWideChar(CP_UTF8, 0, p, len, NULL, 0);
+ wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
+ if (MultiByteToWideChar(CP_UTF8, 0, p, len, utf16, wlen) > 0) {
+ utf16[wlen] = 0;
+ WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
+ utf16, wlen, &written, NULL);
+ }
+ mrb_free(mrb, utf16);
+ } else
#endif
- fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
- fflush(stdout);
- }
+ fwrite(p, len, 1, stdout);
+ fflush(stdout);
}
-/* 15.3.1.2.9 */
-/* 15.3.1.3.34 */
-mrb_value
+static mrb_value
mrb_printstr(mrb_state *mrb, mrb_value self)
{
- mrb_value argv;
+ mrb_value s = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &argv);
- printstr(mrb, argv);
+ if (mrb_string_p(s)) {
+ printstr(mrb, RSTRING_PTR(s), RSTRING_LEN(s));
+ }
+ return s;
+}
+
+/* 15.3.1.2.10 */
+/* 15.3.1.3.35 */
+static mrb_value
+mrb_print(mrb_state *mrb, mrb_value self)
+{
+ mrb_int argc, i;
+ mrb_value *argv;
- return argv;
+ mrb_get_args(mrb, "*", &argv, &argc);
+ for (i=0; i<argc; i++) {
+ mrb_value s = mrb_str_to_str(mrb, argv[i]);
+ printstr(mrb, RSTRING_PTR(s), RSTRING_LEN(s));
+ }
+ return mrb_nil_value();
+}
+
+/* 15.3.1.2.11 */
+/* 15.3.1.3.39 */
+static mrb_value
+mrb_puts(mrb_state *mrb, mrb_value self)
+{
+ mrb_int argc, i;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ for (i=0; i<argc; i++) {
+ mrb_value s = mrb_str_to_str(mrb, argv[i]);
+ mrb_int len = RSTRING_LEN(s);
+ printstr(mrb, RSTRING_PTR(s), len);
+ if (len == 0 || RSTRING_PTR(s)[len-1] != '\n') {
+ printstr(mrb, "\n", 1);
+ }
+ }
+ if (argc == 0) {
+ printstr(mrb, "\n", 1);
+ }
+ return mrb_nil_value();
}
void
@@ -55,6 +92,8 @@ mrb_mruby_print_gem_init(mrb_state* mrb)
struct RClass *krn;
krn = mrb->kernel_module;
mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, krn, "print", mrb_print, MRB_ARGS_ANY());
+ mrb_define_method(mrb, krn, "puts", mrb_puts, MRB_ARGS_ANY());
}
void
diff --git a/mrbgems/mruby-proc-ext/src/proc.c b/mrbgems/mruby-proc-ext/src/proc.c
index 424906c00..5343c478f 100644
--- a/mrbgems/mruby-proc-ext/src/proc.c
+++ b/mrbgems/mruby-proc-ext/src/proc.c
@@ -6,7 +6,7 @@
#include <mruby/debug.h>
static mrb_value
-mrb_proc_lambda(mrb_state *mrb, mrb_value self)
+mrb_proc_lambda_p(mrb_state *mrb, mrb_value self)
{
struct RProc *p = mrb_proc_ptr(self);
return mrb_bool_value(MRB_PROC_STRICT_P(p));
@@ -169,7 +169,7 @@ void
mrb_mruby_proc_ext_gem_init(mrb_state* mrb)
{
struct RClass *p = mrb->proc_class;
- mrb_define_method(mrb, p, "lambda?", mrb_proc_lambda, MRB_ARGS_NONE());
+ mrb_define_method(mrb, p, "lambda?", mrb_proc_lambda_p, MRB_ARGS_NONE());
mrb_define_method(mrb, p, "source_location", mrb_proc_source_location, MRB_ARGS_NONE());
mrb_define_method(mrb, p, "to_s", mrb_proc_inspect, MRB_ARGS_NONE());
mrb_define_method(mrb, p, "inspect", mrb_proc_inspect, MRB_ARGS_NONE());
diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c
index 515c0707a..10c81b946 100644
--- a/mrbgems/mruby-random/src/random.c
+++ b/mrbgems/mruby-random/src/random.c
@@ -218,6 +218,34 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
mrb_value r = mrb_nil_value();
rand_state *random;
+ /*
+ * MSC compiler bug generating invalid instructions with optimization
+ * enabled. MSC errantly uses a hardcoded value with optimizations on
+ * when using a fixed value from a union.
+ * Creating a temp volatile variable and reassigning back to the original
+ * value tricks the compiler to not perform this optimization;
+ */
+#if defined _MSC_VER && _MSC_VER >= 1923
+ /* C++ will not cast away volatile easily, so we cannot do something like
+ * volatile mrb_value rr = r; r = (mrb_value)rr; with C++.
+ * That cast does work with C.
+ * We also have to trick the compiler to not optimize away the const_cast entirely
+ * by creating and manipulating an intermediate volatile pointer.
+ */
+ volatile mrb_value *v_r;
+ volatile mrb_int ii;
+ mrb_value *p_r;
+ v_r = &r;
+ ii = 2;
+ v_r = v_r + 2;
+#if defined __cplusplus
+ p_r = const_cast<mrb_value*>(v_r - ii);
+#else
+ p_r = (mrb_value*)v_r - ii;
+#endif
+ r = *p_r;
+#endif
+
if (RARRAY_LEN(ary) > 1) {
mrb_get_args(mrb, "|o", &r);
diff --git a/mrbgems/mruby-range-ext/src/range.c b/mrbgems/mruby-range-ext/src/range.c
index 36b684fad..2a0b4e97d 100644
--- a/mrbgems/mruby-range-ext/src/range.c
+++ b/mrbgems/mruby-range-ext/src/range.c
@@ -34,12 +34,10 @@ r_lt(mrb_state *mrb, mrb_value a, mrb_value b)
static mrb_value
range_cover(mrb_state *mrb, mrb_value range)
{
- mrb_value val;
struct RRange *r = mrb_range_ptr(mrb, range);
+ mrb_value val = mrb_get_arg1(mrb);
mrb_value beg, end;
- mrb_get_args(mrb, "o", &val);
-
beg = RANGE_BEG(r);
end = RANGE_END(r);
diff --git a/mrbgems/mruby-rational/mrblib/rational.rb b/mrbgems/mruby-rational/mrblib/rational.rb
index c0b16a6ae..b65f77e2f 100644
--- a/mrbgems/mruby-rational/mrblib/rational.rb
+++ b/mrbgems/mruby-rational/mrblib/rational.rb
@@ -91,8 +91,8 @@ module Kernel
end
[:+, :-, :*, :/, :<=>, :==, :<, :<=, :>, :>=].each do |op|
+ original_operator_name = :"__original_operator_#{op}_rational"
Fixnum.instance_eval do
- original_operator_name = "__original_operator_#{op}_rational"
alias_method original_operator_name, op
define_method op do |rhs|
if rhs.is_a? Rational
@@ -103,7 +103,6 @@ module Kernel
end
end
Float.instance_eval do
- original_operator_name = "__original_operator_#{op}_rational"
alias_method original_operator_name, op
define_method op do |rhs|
if rhs.is_a? Rational
@@ -114,4 +113,3 @@ module Kernel
end if Object.const_defined?(:Float)
end
end
-
diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c
index 09bd68003..676a1dc82 100644
--- a/mrbgems/mruby-rational/src/rational.c
+++ b/mrbgems/mruby-rational/src/rational.c
@@ -91,9 +91,9 @@ rational_s_new(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "ii", &numerator, &denominator);
#else
-#define DROP_PRECISION(cond, num, denom) \
+#define DROP_PRECISION(f, num, denom) \
do { \
- while (cond) { \
+ while (f < (mrb_float)MRB_INT_MIN || f > (mrb_float)MRB_INT_MAX) { \
num /= 2; \
denom /= 2; \
} \
@@ -111,8 +111,8 @@ rational_s_new(mrb_state *mrb, mrb_value self)
else {
mrb_float denomf = mrb_to_flo(mrb, denomv);
- DROP_PRECISION(denomf < MRB_INT_MIN || denomf > MRB_INT_MAX, numerator, denomf);
- denominator = denomf;
+ DROP_PRECISION(denomf, numerator, denomf);
+ denominator = (mrb_int)denomf;
}
}
else {
@@ -124,12 +124,12 @@ rational_s_new(mrb_state *mrb, mrb_value self)
else {
mrb_float denomf = mrb_to_flo(mrb, denomv);
- DROP_PRECISION(denomf < MRB_INT_MIN || denomf > MRB_INT_MAX, numf, denomf);
- denominator = denomf;
+ DROP_PRECISION(denomf, numf, denomf);
+ denominator = (mrb_int)denomf;
}
- DROP_PRECISION(numf < MRB_INT_MIN || numf > MRB_INT_MAX, numf, denominator);
- numerator = numf;
+ DROP_PRECISION(numf, numf, denominator);
+ numerator = (mrb_int)numf;
}
#endif
@@ -152,7 +152,7 @@ rational_to_i(mrb_state *mrb, mrb_value self)
{
struct mrb_rational *p = rational_ptr(mrb, self);
if (p->denominator == 0) {
- mrb_raise(mrb, mrb_exc_get(mrb, "StandardError"), "divided by 0");
+ mrb_raise(mrb, mrb->eStandardError_class, "divided by 0");
}
return mrb_fixnum_value(p->numerator / p->denominator);
}
diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c
index ac9b07e85..a653242d1 100644
--- a/mrbgems/mruby-sleep/src/mrb_sleep.c
+++ b/mrbgems/mruby-sleep/src/mrb_sleep.c
@@ -30,7 +30,7 @@
#ifdef _WIN32
#include <windows.h>
#define sleep(x) Sleep(x * 1000)
- #define usleep(x) Sleep((DWORD)((x)<1000) ? 1 : ((x)/1000))
+ #define usleep(x) Sleep((DWORD)(((x)<1000) ? 1 : ((x)/1000)))
#else
#include <unistd.h>
#include <sys/time.h>
@@ -66,7 +66,7 @@ mrb_f_sleep(mrb_state *mrb, mrb_value self)
#endif
end = time(0) - beg;
- return mrb_fixnum_value(end);
+ return mrb_fixnum_value((mrb_int)end);
}
/* mruby special; needed for mruby without float numbers */
@@ -120,7 +120,7 @@ mrb_f_usleep(mrb_state *mrb, mrb_value self)
}
#endif
- return mrb_fixnum_value(slp_tm);
+ return mrb_fixnum_value((mrb_int)slp_tm);
}
void
diff --git a/mrbgems/mruby-socket/mrbgem.rake b/mrbgems/mruby-socket/mrbgem.rake
index 24d6f953d..6271c4559 100644
--- a/mrbgems/mruby-socket/mrbgem.rake
+++ b/mrbgems/mruby-socket/mrbgem.rake
@@ -7,7 +7,7 @@ MRuby::Gem::Specification.new('mruby-socket') do |spec|
#spec.cc.defines << "HAVE_SA_LEN=0"
# If Windows, use winsock
- if ( /mswin|mingw|win32/ =~ RUBY_PLATFORM ) then
+ if for_windows?
spec.linker.libraries << "wsock32"
spec.linker.libraries << "ws2_32"
end
diff --git a/mrbgems/mruby-socket/src/socket.c b/mrbgems/mruby-socket/src/socket.c
index 8a0d9df6b..916309bcf 100644
--- a/mrbgems/mruby-socket/src/socket.c
+++ b/mrbgems/mruby-socket/src/socket.c
@@ -778,7 +778,6 @@ mrb_win32_basicsocket_close(mrb_state *mrb, mrb_value self)
return mrb_nil_value();
}
-#define E_EOF_ERROR (mrb_class_get(mrb, "EOFError"))
static mrb_value
mrb_win32_basicsocket_sysread(mrb_state *mrb, mrb_value self)
{
diff --git a/mrbgems/mruby-socket/test/sockettest.c b/mrbgems/mruby-socket/test/sockettest.c
index 3017c7cc1..02eb1e1a8 100644
--- a/mrbgems/mruby-socket/test/sockettest.c
+++ b/mrbgems/mruby-socket/test/sockettest.c
@@ -1,4 +1,3 @@
-#include <stdio.h>
#include <stdlib.h>
#include "mruby.h"
@@ -8,7 +7,9 @@
#include <io.h>
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || \
+ (defined(MRB_MINGW32_VERSION) && MRB_MINGW32_VERSION < 3021) || \
+ (defined(MRB_MINGW64_VERSION) && MRB_MINGW64_VERSION < 4000)
#include <fcntl.h>
#include <sys/stat.h>
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c
index 6e4d8fd7e..bf7a4d725 100644
--- a/mrbgems/mruby-sprintf/src/sprintf.c
+++ b/mrbgems/mruby-sprintf/src/sprintf.c
@@ -5,9 +5,7 @@
*/
#include <mruby.h>
-
#include <limits.h>
-#include <stdio.h>
#include <string.h>
#include <mruby/string.h>
#include <mruby/hash.h>
@@ -518,6 +516,50 @@ mrb_f_sprintf(mrb_state *mrb, mrb_value obj)
}
}
+static int
+mrb_int2str(char *buf, size_t len, mrb_int n)
+{
+#ifdef MRB_DISABLE_STDIO
+ char *bufend = buf + len;
+ char *p = bufend - 1;
+
+ if (len < 1) return -1;
+
+ *p -- = '\0';
+ len --;
+
+ if (n < 0) {
+ if (len < 1) return -1;
+
+ *p -- = '-';
+ len --;
+ n = -n;
+ }
+
+ if (n > 0) {
+ for (; n > 0; len --, n /= 10) {
+ if (len < 1) return -1;
+
+ *p -- = '0' + (n % 10);
+ }
+ p ++;
+ }
+ else if (len > 0) {
+ *p = '0';
+ len --;
+ }
+ else {
+ return -1;
+ }
+
+ memmove(buf, p, bufend - p);
+
+ return bufend - p - 1;
+#else
+ return snprintf(buf, len, "%" MRB_PRId, n);
+#endif /* MRB_DISABLE_STDIO */
+}
+
mrb_value
mrb_str_format(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value fmt)
{
@@ -708,7 +750,12 @@ retry:
}
else if (mrb_fixnum_p(val)) {
mrb_int n = mrb_fixnum(val);
+#ifndef MRB_UTF8_STRING
+ char buf[1];
+ buf[0] = (char)n&0xff;
+ tmp = mrb_str_new(mrb, buf, 1);
+#else
if (n < 0x80) {
char buf[1];
@@ -719,6 +766,7 @@ retry:
tmp = mrb_funcall(mrb, val, "chr", 0);
mrb_check_type(mrb, tmp, MRB_TT_STRING);
}
+#endif
}
else {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character");
@@ -794,7 +842,7 @@ retry:
case 'B':
case 'u': {
mrb_value val = GETARG();
- char nbuf[68], *s;
+ char nbuf[69], *s;
const char *prefix = NULL;
int sign = 0, dots = 0;
char sc = 0;
@@ -866,7 +914,7 @@ retry:
width--;
}
mrb_assert(base == 10);
- snprintf(nbuf, sizeof(nbuf), "%" MRB_PRId, v);
+ mrb_int2str(nbuf, sizeof(nbuf)-1, v);
s = nbuf;
if (v < 0) s++; /* skip minus sign */
}
@@ -874,24 +922,12 @@ retry:
s = nbuf;
if (v < 0) {
dots = 1;
+ val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);
}
- switch (base) {
- case 2:
- if (v < 0) {
- val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);
- }
- else {
- val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
- }
- strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-1);
- break;
- case 8:
- snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRIo, v);
- break;
- case 16:
- snprintf(++s, sizeof(nbuf)-1, "%" MRB_PRIx, v);
- break;
+ else {
+ val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
}
+ strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-2);
if (v < 0) {
char d;
@@ -1005,7 +1041,7 @@ retry:
mrb_value val = GETARG();
double fval;
mrb_int need = 6;
- char fbuf[32];
+ char fbuf[64];
fval = mrb_float(mrb_Float(mrb, val));
if (!isfinite(fval)) {
@@ -1046,7 +1082,6 @@ retry:
break;
}
- fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec);
need = 0;
if (*p != 'e' && *p != 'E') {
int i;
@@ -1068,7 +1103,8 @@ retry:
need += 20;
CHECK(need);
- n = snprintf(&buf[blen], need, fbuf, fval);
+ fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec);
+ n = mrb_float_to_cstr(mrb, &buf[blen], need, fbuf, fval);
if (n < 0 || n >= need) {
mrb_raise(mrb, E_RUNTIME_ERROR, "formatting error");
}
@@ -1110,12 +1146,13 @@ fmt_setup(char *buf, size_t size, int c, int flags, mrb_int width, mrb_int prec)
if (flags & FSPACE) *buf++ = ' ';
if (flags & FWIDTH) {
- n = snprintf(buf, end - buf, "%d", (int)width);
+ n = mrb_int2str(buf, end - buf, width);
buf += n;
}
if (flags & FPREC) {
- n = snprintf(buf, end - buf, ".%d", (int)prec);
+ *buf ++ = '.';
+ n = mrb_int2str(buf, end - buf, prec);
buf += n;
}
diff --git a/mrbgems/mruby-sprintf/test/sprintf.rb b/mrbgems/mruby-sprintf/test/sprintf.rb
index 137812ae7..0eb51f557 100644
--- a/mrbgems/mruby-sprintf/test/sprintf.rb
+++ b/mrbgems/mruby-sprintf/test/sprintf.rb
@@ -8,6 +8,11 @@ assert('String#%') do
assert_equal 15, ("%b" % (1<<14)).size
skip unless Object.const_defined?(:Float)
assert_equal "1.0", "%3.1f" % 1.01
+ assert_equal " 123456789.12", "% 4.2f" % 123456789.123456789
+ assert_equal "123456789.12", "%-4.2f" % 123456789.123456789
+ assert_equal "+123456789.12", "%+4.2f" % 123456789.123456789
+ assert_equal "123456789.12", "%04.2f" % 123456789.123456789
+ assert_equal "00000000123456789.12", "%020.2f" % 123456789.123456789
end
assert('String#% with inf') do
@@ -68,29 +73,6 @@ assert('String#% with nan') do
assert_equal " NaN", "% 5f" % nan
end
-assert("String#% with invalid chr") do
- begin
- class Fixnum
- alias_method :chr_, :chr if method_defined?(:chr)
-
- def chr
- nil
- end
- end
-
- assert_raise TypeError do
- "%c" % 0x80
- end
- ensure
- class Fixnum
- if method_defined?(:chr_)
- alias_method :chr, :chr_
- remove_method :chr_
- end
- end
- end
-end
-
assert("String#% %b") do
assert_equal("..10115", "%0b5" % -5)
end
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c
index ffad0f527..7cf146ec8 100644
--- a/mrbgems/mruby-string-ext/src/string.c
+++ b/mrbgems/mruby-string-ext/src/string.c
@@ -164,9 +164,8 @@ mrb_str_swapcase(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_str_concat_m(mrb_state *mrb, mrb_value self)
{
- mrb_value str;
+ mrb_value str = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &str);
if (mrb_fixnum_p(str) || mrb_float_p(str))
#ifdef MRB_UTF8_STRING
str = int_chr_utf8(mrb, str);
@@ -335,7 +334,7 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte
len = i - start_pos;
if (len > UINT16_MAX) {
- mrb_raise(mrb, E_ARGUMENT_ERROR, "tr pattern too long (max 65536)");
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "tr pattern too long (max 65535)");
}
if (pat1 == NULL && ret) {
goto nomem;
@@ -343,9 +342,9 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte
pat1->type = TR_IN_ORDER;
pat1->flag_reverse = flag_reverse;
pat1->flag_on_heap = !ret_uninit;
- pat1->n = len;
+ pat1->n = (uint16_t)len;
pat1->next = NULL;
- pat1->val.start_pos = start_pos;
+ pat1->val.start_pos = (uint16_t)start_pos;
}
if (ret == NULL || ret_uninit) {
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index f42a5f1ea..7fbf9225f 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -154,9 +154,8 @@ mrb_struct_set_m(mrb_state *mrb, mrb_value obj)
{
mrb_int i = mrb_fixnum(mrb_proc_cfunc_env_get(mrb, 0));
mrb_value *ptr;
- mrb_value val;
+ mrb_value val = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &val);
mrb_struct_modify(mrb, obj);
ptr = RSTRUCT_PTR(obj);
if (ptr == NULL || i >= RSTRUCT_LEN(obj)) {
@@ -356,9 +355,7 @@ mrb_struct_initialize(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_struct_init_copy(mrb_state *mrb, mrb_value copy)
{
- mrb_value s;
-
- mrb_get_args(mrb, "o", &s);
+ mrb_value s = mrb_get_arg1(mrb);
if (mrb_obj_equal(mrb, copy, s)) return copy;
if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) {
@@ -428,9 +425,8 @@ struct_aref_int(mrb_state *mrb, mrb_value s, mrb_int i)
static mrb_value
mrb_struct_aref(mrb_state *mrb, mrb_value s)
{
- mrb_value idx;
+ mrb_value idx = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &idx);
if (mrb_string_p(idx)) {
mrb_value sym = mrb_check_intern_str(mrb, idx);
@@ -545,11 +541,10 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s)
static mrb_value
mrb_struct_equal(mrb_state *mrb, mrb_value s)
{
- mrb_value s2;
+ mrb_value s2 = mrb_get_arg1(mrb);
mrb_value *ptr, *ptr2;
mrb_int i, len;
- mrb_get_args(mrb, "o", &s2);
if (mrb_obj_equal(mrb, s, s2)) {
return mrb_true_value();
}
@@ -582,11 +577,10 @@ mrb_struct_equal(mrb_state *mrb, mrb_value s)
static mrb_value
mrb_struct_eql(mrb_state *mrb, mrb_value s)
{
- mrb_value s2;
+ mrb_value s2 = mrb_get_arg1(mrb);
mrb_value *ptr, *ptr2;
mrb_int i, len;
- mrb_get_args(mrb, "o", &s2);
if (mrb_obj_equal(mrb, s, s2)) {
return mrb_true_value();
}
diff --git a/mrbgems/mruby-symbol-ext/src/symbol.c b/mrbgems/mruby-symbol-ext/src/symbol.c
index 87f8381b1..ad922ad2f 100644
--- a/mrbgems/mruby-symbol-ext/src/symbol.c
+++ b/mrbgems/mruby-symbol-ext/src/symbol.c
@@ -47,7 +47,7 @@ mrb_sym_length(mrb_state *mrb, mrb_value self)
#ifdef MRB_UTF8_STRING
mrb_int byte_len;
const char *name = mrb_sym_name_len(mrb, mrb_symbol(self), &byte_len);
- len = mrb_utf8_len(name, byte_len);
+ len = mrb_utf8_strlen(name, byte_len);
#else
mrb_sym_name_len(mrb, mrb_symbol(self), &len);
#endif
diff --git a/mrbgems/mruby-test/mrbgem.rake b/mrbgems/mruby-test/mrbgem.rake
index 6ce24bc94..ced252ae6 100644
--- a/mrbgems/mruby-test/mrbgem.rake
+++ b/mrbgems/mruby-test/mrbgem.rake
@@ -26,6 +26,7 @@ MRuby::Gem::Specification.new('mruby-test') do |spec|
file assert_lib => assert_c
file assert_c => [assert_rb, build.mrbcfile] do |t|
+ mkdir_p File.dirname(t.name)
open(t.name, 'w') do |f|
mrbc.run f, assert_rb, 'mrbtest_assert_irep'
end
@@ -145,20 +146,8 @@ MRuby::Gem::Specification.new('mruby-test') do |spec|
end
end
- # store the last gem selection and make the re-build
- # of the test gem depending on a change to the gem
- # selection
- active_gems_path = "#{build_dir}/active_gems_path.lst"
- active_gem_list = File.read active_gems_path if File.exist? active_gems_path
- current_gem_list = build.gems.map(&:name).join("\n")
- task active_gems_path do |_t|
- mkdir_p File.dirname(active_gems_path)
- File.write active_gems_path, current_gem_list
- end
- file clib => active_gems_path if active_gem_list != current_gem_list
-
file mlib => clib
- file clib => [build.mrbcfile, __FILE__] do |_t|
+ file clib => ["#{build.build_dir}/mrbgems/active_gems.txt", build.mrbcfile, __FILE__] do |_t|
_pp "GEN", "*.rb", "#{clib.relative_path}"
mkdir_p File.dirname(clib)
open(clib, 'w') do |f|
diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c
index 7197b634c..5fa700848 100644
--- a/mrbgems/mruby-time/src/time.c
+++ b/mrbgems/mruby-time/src/time.c
@@ -13,10 +13,9 @@
#include <mruby/data.h>
#include <mruby/numeric.h>
#include <mruby/time.h>
+#include <mruby/string.h>
-#ifndef MRB_DISABLE_STDIO
-#include <stdio.h>
-#else
+#ifdef MRB_DISABLE_STDIO
#include <string.h>
#endif
@@ -238,7 +237,7 @@ mrb_to_time_t(mrb_state *mrb, mrb_value obj, time_t *usec)
mrb_float f = mrb_float(obj);
mrb_check_num_exact(mrb, f);
- if (f > (mrb_float)MRB_TIME_MAX || (mrb_float)MRB_TIME_MIN > f) {
+ if (f >= ((mrb_float)MRB_TIME_MAX-1.0) || f < ((mrb_float)MRB_TIME_MIN+1.0)) {
goto out_of_range;
}
@@ -516,11 +515,10 @@ time_get_ptr(mrb_state *mrb, mrb_value time)
static mrb_value
mrb_time_eq(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
struct mrb_time *tm1, *tm2;
mrb_bool eq_p;
- mrb_get_args(mrb, "o", &other);
tm1 = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
eq_p = tm1 && tm2 && tm1->sec == tm2->sec && tm1->usec == tm2->usec;
@@ -531,10 +529,9 @@ mrb_time_eq(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_time_cmp(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
struct mrb_time *tm1, *tm2;
- mrb_get_args(mrb, "o", &other);
tm1 = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
if (!tm1 || !tm2) return mrb_nil_value();
@@ -557,11 +554,10 @@ mrb_time_cmp(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_time_plus(mrb_state *mrb, mrb_value self)
{
- mrb_value o;
+ mrb_value o = mrb_get_arg1(mrb);
struct mrb_time *tm;
time_t sec, usec;
- mrb_get_args(mrb, "o", &o);
tm = time_get_ptr(mrb, self);
sec = mrb_to_time_t(mrb, o, &usec);
return mrb_time_make_time(mrb, mrb_obj_class(mrb, self), tm->sec+sec, tm->usec+usec, tm->timezone);
@@ -570,10 +566,9 @@ mrb_time_plus(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_time_minus(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
struct mrb_time *tm, *tm2;
- mrb_get_args(mrb, "o", &other);
tm = time_get_ptr(mrb, self);
tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
if (tm2) {
@@ -771,10 +766,9 @@ mrb_time_initialize(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_time_initialize_copy(mrb_state *mrb, mrb_value copy)
{
- mrb_value src;
+ mrb_value src = mrb_get_arg1(mrb);
struct mrb_time *t1, *t2;
- mrb_get_args(mrb, "o", &src);
if (mrb_obj_equal(mrb, copy, src)) return copy;
if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) {
mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
@@ -956,7 +950,9 @@ mrb_time_to_s(mrb_state *mrb, mrb_value self)
struct mrb_time *tm = time_get_ptr(mrb, self);
mrb_bool utc = tm->timezone == MRB_TIMEZONE_UTC;
size_t len = (utc ? time_to_s_utc : time_to_s_local)(mrb, tm, buf, sizeof(buf));
- return mrb_str_new(mrb, buf, len);
+ mrb_value str = mrb_str_new(mrb, buf, len);
+ RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
+ return str;
}
void
diff --git a/mrblib/00class.rb b/mrblib/00class.rb
index 1811236f0..cbcca8610 100644
--- a/mrblib/00class.rb
+++ b/mrblib/00class.rb
@@ -1,3 +1,13 @@
+class BasicObject
+ def !=(other)
+ if self == other
+ false
+ else
+ true
+ end
+ end
+end
+
class Module
# 15.2.2.4.12
def attr_accessor(*names)
diff --git a/mrblib/array.rb b/mrblib/array.rb
index 6535d6d83..8586fbc39 100644
--- a/mrblib/array.rb
+++ b/mrblib/array.rb
@@ -12,7 +12,7 @@ class Array
# ISO 15.2.12.5.10
# def each(&block)
# return to_enum :each unless block
-
+ #
# idx = 0
# while idx < length
# block.call(self[idx])
@@ -268,4 +268,8 @@ class Array
def sort(&block)
self.dup.sort!(&block)
end
+
+ def to_a
+ self
+ end
end
diff --git a/mrblib/hash.rb b/mrblib/hash.rb
index b49e987c7..7d64addd7 100644
--- a/mrblib/hash.rb
+++ b/mrblib/hash.rb
@@ -140,7 +140,7 @@ class Hash
def each_value(&block)
return to_enum :each_value unless block
- self.keys.each{|k| block.call(self[k])}
+ self.values.each{|v| block.call(v)}
self
end
@@ -192,11 +192,11 @@ class Hash
recur_list[self.object_id] = true
ary=[]
keys=self.keys
+ vals=self.values
size=keys.size
i=0
while i<size
- k=keys[i]
- ary<<(k._inspect(recur_list) + "=>" + self[k]._inspect(recur_list))
+ ary<<(keys[i]._inspect(recur_list) + "=>" + vals[i]._inspect(recur_list))
i+=1
end
"{"+ary.join(", ")+"}"
diff --git a/src/array.c b/src/array.c
index 8547cfff4..c33641264 100644
--- a/src/array.c
+++ b/src/array.c
@@ -522,8 +522,10 @@ mrb_ary_push_m(mrb_state *mrb, mrb_value self)
}
array_copy(ARY_PTR(a)+len, argv, alen);
ARY_SET_LEN(a, len2);
- mrb_write_barrier(mrb, (struct RBasic*)a);
-
+ while (alen--) {
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)a, *argv);
+ argv++;
+ }
return self;
}
@@ -732,6 +734,10 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
argv = ARY_PTR(r);
}
}
+ else if (mrb_undef_p(rpl)) {
+ argc = 0;
+ argv = NULL;
+ }
else {
argc = 1;
argv = &rpl;
@@ -804,6 +810,13 @@ ary_subseq(mrb_state *mrb, struct RArray *a, mrb_int beg, mrb_int len)
return mrb_obj_value(b);
}
+mrb_value
+mrb_ary_subseq(mrb_state *mrb, mrb_value ary, mrb_int beg, mrb_int len)
+{
+ struct RArray *a = mrb_ary_ptr(ary);
+ return ary_subseq(mrb, a, beg, len);
+}
+
static mrb_int
aget_index(mrb_state *mrb, mrb_value index)
{
@@ -855,10 +868,12 @@ static mrb_value
mrb_ary_aget(mrb_state *mrb, mrb_value self)
{
struct RArray *a = mrb_ary_ptr(self);
- mrb_int i, len, alen;
+ mrb_int i;
+ mrb_int len, alen;
mrb_value index;
- if (mrb_get_args(mrb, "o|i", &index, &len) == 1) {
+ if (mrb_get_argc(mrb) == 1) {
+ index = mrb_get_arg1(mrb);
switch (mrb_type(index)) {
/* a[n..m] */
case MRB_TT_RANGE:
@@ -875,6 +890,7 @@ mrb_ary_aget(mrb_state *mrb, mrb_value self)
}
}
+ mrb_get_args(mrb, "oi", &index, &len);
i = aget_index(mrb, index);
alen = ARY_LEN(a);
if (i < 0) i += alen;
@@ -927,8 +943,11 @@ mrb_ary_aset(mrb_state *mrb, mrb_value self)
mrb_value v1, v2, v3;
mrb_int i, len;
- mrb_ary_modify(mrb, mrb_ary_ptr(self));
- if (mrb_get_args(mrb, "oo|o", &v1, &v2, &v3) == 2) {
+ ary_modify(mrb, mrb_ary_ptr(self));
+ if (mrb_get_argc(mrb) == 2) {
+ mrb_value *vs = mrb_get_argv(mrb);
+ v1 = vs[0]; v2 = vs[1];
+
/* a[n..m] = v */
switch (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self), FALSE)) {
case MRB_RANGE_TYPE_MISMATCH:
@@ -944,6 +963,7 @@ mrb_ary_aset(mrb_state *mrb, mrb_value self)
return v2;
}
+ mrb_get_args(mrb, "ooo", &v1, &v2, &v3);
/* a[n,m] = v */
mrb_ary_splice(mrb, self, aget_index(mrb, v1), aget_index(mrb, v2), v3);
return v3;
@@ -1027,10 +1047,9 @@ mrb_ary_last(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_ary_index_m(mrb_state *mrb, mrb_value self)
{
- mrb_value obj;
+ mrb_value obj = mrb_get_arg1(mrb);
mrb_int i;
- mrb_get_args(mrb, "o", &obj);
for (i = 0; i < RARRAY_LEN(self); i++) {
if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
return mrb_fixnum_value(i);
@@ -1042,10 +1061,9 @@ mrb_ary_index_m(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_ary_rindex_m(mrb_state *mrb, mrb_value self)
{
- mrb_value obj;
+ mrb_value obj = mrb_get_arg1(mrb);
mrb_int i, len;
- mrb_get_args(mrb, "o", &obj);
for (i = RARRAY_LEN(self) - 1; i >= 0; i--) {
if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
return mrb_fixnum_value(i);
@@ -1060,22 +1078,26 @@ mrb_ary_rindex_m(mrb_state *mrb, mrb_value self)
MRB_API mrb_value
mrb_ary_splat(mrb_state *mrb, mrb_value v)
{
- mrb_value a;
+ mrb_value ary;
+ struct RArray *a;
if (mrb_array_p(v)) {
- return v;
+ a = ary_dup(mrb, mrb_ary_ptr(v));
+ return mrb_obj_value(a);
}
if (!mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
return mrb_ary_new_from_values(mrb, 1, &v);
}
- a = mrb_funcall(mrb, v, "to_a", 0);
- if (mrb_nil_p(a)) {
+ ary = mrb_funcall(mrb, v, "to_a", 0);
+ if (mrb_nil_p(ary)) {
return mrb_ary_new_from_values(mrb, 1, &v);
}
- mrb_ensure_array_type(mrb, a);
- return a;
+ mrb_ensure_array_type(mrb, ary);
+ a = mrb_ary_ptr(ary);
+ a = ary_dup(mrb, a);
+ return mrb_obj_value(a);
}
static mrb_value
@@ -1219,9 +1241,8 @@ mrb_ary_join_m(mrb_state *mrb, mrb_value ary)
static mrb_value
mrb_ary_eq(mrb_state *mrb, mrb_value ary1)
{
- mrb_value ary2;
+ mrb_value ary2 = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &ary2);
if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value();
if (!mrb_array_p(ary2)) {
return mrb_false_value();
@@ -1234,9 +1255,8 @@ mrb_ary_eq(mrb_state *mrb, mrb_value ary1)
static mrb_value
mrb_ary_cmp(mrb_state *mrb, mrb_value ary1)
{
- mrb_value ary2;
+ mrb_value ary2 = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &ary2);
if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_fixnum_value(0);
if (!mrb_array_p(ary2)) {
return mrb_nil_value();
diff --git a/src/backtrace.c b/src/backtrace.c
index 186009523..591f4ea4b 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -79,7 +79,7 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, const mrb_code *pc0, each_backtr
static void
print_backtrace(mrb_state *mrb, struct RObject *exc, mrb_value backtrace)
{
- int i;
+ mrb_int i;
mrb_int n = RARRAY_LEN(backtrace);
mrb_value *loc, mesg;
FILE *stream = stderr;
@@ -89,7 +89,7 @@ print_backtrace(mrb_state *mrb, struct RObject *exc, mrb_value backtrace)
for (i=n-1,loc=&RARRAY_PTR(backtrace)[i]; i>0; i--,loc--) {
if (mrb_string_p(*loc)) {
fprintf(stream, "\t[%d] %.*s\n",
- i, (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc));
+ (int)i, (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc));
}
}
if (mrb_string_p(*loc)) {
diff --git a/src/class.c b/src/class.c
index c49f0f474..fc8a38ff9 100644
--- a/src/class.c
+++ b/src/class.c
@@ -549,6 +549,23 @@ mrb_get_argv(mrb_state *mrb)
return array_argv;
}
+MRB_API mrb_value
+mrb_get_arg1(mrb_state *mrb)
+{
+ mrb_int argc = mrb->c->ci->argc;
+ mrb_value *array_argv = mrb->c->stack + 1;
+ if (argc < 0) {
+ struct RArray *a = mrb_ary_ptr(*array_argv);
+
+ argc = ARY_LEN(a);
+ array_argv = ARY_PTR(a);
+ }
+ if (argc != 1) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+ }
+ return array_argv[0];
+}
+
void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
/*
@@ -570,6 +587,7 @@ void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
s: String [char*,mrb_int] Receive two arguments; s! gives (NULL,0) for nil
z: String [char*] NUL terminated string; z! gives NULL for nil
a: Array [mrb_value*,mrb_int] Receive two arguments; a! gives (NULL,0) for nil
+ c: Class/Module [strcut RClass*]
f: Fixnum/Float [mrb_float]
i: Fixnum/Float [mrb_int]
b: boolean [mrb_bool]
@@ -696,6 +714,22 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
}
}
break;
+ case 'c':
+ {
+ struct RClass **p;
+
+ p = va_arg(ap, struct RClass**);
+ if (i < argc) {
+ mrb_value ss;
+
+ ss = argv[i++];
+ if (!class_ptr_p(ss)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "%v is not class/module", ss);
+ }
+ *p = mrb_class_ptr(ss);
+ }
+ }
+ break;
case 'S':
{
mrb_value *p;
@@ -1134,22 +1168,22 @@ mrb_prepend_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
static mrb_value
mrb_mod_prepend_features(mrb_state *mrb, mrb_value mod)
{
- mrb_value klass;
+ struct RClass *c;
mrb_check_type(mrb, mod, MRB_TT_MODULE);
- mrb_get_args(mrb, "C", &klass);
- mrb_prepend_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
+ mrb_get_args(mrb, "c", &c);
+ mrb_prepend_module(mrb, c, mrb_class_ptr(mod));
return mod;
}
static mrb_value
mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
{
- mrb_value klass;
+ struct RClass *c;
mrb_check_type(mrb, mod, MRB_TT_MODULE);
- mrb_get_args(mrb, "C", &klass);
- mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
+ mrb_get_args(mrb, "c", &c);
+ mrb_include_module(mrb, c, mrb_class_ptr(mod));
return mod;
}
@@ -1212,10 +1246,9 @@ mrb_mod_ancestors(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_mod_extend_object(mrb_state *mrb, mrb_value mod)
{
- mrb_value obj;
+ mrb_value obj = mrb_get_arg1(mrb);
mrb_check_type(mrb, mod, MRB_TT_MODULE);
- mrb_get_args(mrb, "o", &obj);
mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod));
return mod;
}
@@ -1242,33 +1275,45 @@ mrb_mod_dummy_visibility(mrb_state *mrb, mrb_value mod)
return mod;
}
-MRB_API mrb_value
-mrb_singleton_class(mrb_state *mrb, mrb_value v)
+/* returns mrb_class_ptr(mrb_singleton_class()) */
+/* except that it return NULL for immediate values */
+MRB_API struct RClass*
+mrb_singleton_class_ptr(mrb_state *mrb, mrb_value v)
{
struct RBasic *obj;
switch (mrb_type(v)) {
case MRB_TT_FALSE:
if (mrb_nil_p(v))
- return mrb_obj_value(mrb->nil_class);
- return mrb_obj_value(mrb->false_class);
+ return mrb->nil_class;
+ return mrb->false_class;
case MRB_TT_TRUE:
- return mrb_obj_value(mrb->true_class);
+ return mrb->true_class;
case MRB_TT_CPTR:
- return mrb_obj_value(mrb->object_class);
+ return mrb->object_class;
case MRB_TT_SYMBOL:
case MRB_TT_FIXNUM:
#ifndef MRB_WITHOUT_FLOAT
case MRB_TT_FLOAT:
#endif
- mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
- return mrb_nil_value(); /* not reached */
+ return NULL;
default:
break;
}
obj = mrb_basic_ptr(v);
prepare_singleton_class(mrb, obj);
- return mrb_obj_value(obj->c);
+ return obj->c;
+}
+
+MRB_API mrb_value
+mrb_singleton_class(mrb_state *mrb, mrb_value v)
+{
+ struct RClass *c = mrb_singleton_class_ptr(mrb, v);
+
+ if (c == NULL) {
+ mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
+ }
+ return mrb_obj_value(c);
}
MRB_API void
@@ -1481,9 +1526,8 @@ static mrb_value
attr_writer(mrb_state *mrb, mrb_value obj)
{
mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
- mrb_value val;
+ mrb_value val = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &val);
mrb_iv_set(mrb, obj, to_sym(mrb, name), val);
return val;
}
@@ -1651,21 +1695,11 @@ mrb_bob_not(mrb_state *mrb, mrb_value cv)
mrb_value
mrb_obj_equal_m(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ mrb_value arg = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &arg);
return mrb_bool_value(mrb_obj_equal(mrb, self, arg));
}
-static mrb_value
-mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self)
-{
- mrb_value arg;
-
- mrb_get_args(mrb, "o", &arg);
- return mrb_bool_value(!mrb_equal(mrb, self, arg));
-}
-
MRB_API mrb_bool
mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid)
{
@@ -1716,7 +1750,10 @@ mrb_class_real(struct RClass* cl)
MRB_API const char*
mrb_class_name(mrb_state *mrb, struct RClass* c)
{
- mrb_value name = class_name_str(mrb, c);
+ mrb_value name;
+
+ if (c == NULL) return NULL;
+ name = class_name_str(mrb, c);
return RSTRING_PTR(name);
}
@@ -1960,13 +1997,11 @@ mrb_const_get_sym(mrb_state *mrb, mrb_value mod, mrb_sym id)
static mrb_value
mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
{
- mrb_value path;
+ mrb_value path = mrb_get_arg1(mrb);
mrb_sym id;
char *ptr;
mrb_int off, end, len;
- mrb_get_args(mrb, "o", &path);
-
if (mrb_symbol_p(path)) {
/* const get with symbol */
id = mrb_symbol(path);
@@ -2119,10 +2154,9 @@ top_define_method(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_mod_eqq(mrb_state *mrb, mrb_value mod)
{
- mrb_value obj;
+ mrb_value obj = mrb_get_arg1(mrb);
mrb_bool eqq;
- mrb_get_args(mrb, "o", &obj);
eqq = mrb_obj_is_kind_of(mrb, obj, mrb_class_ptr(mod));
return mrb_bool_value(eqq);
@@ -2257,7 +2291,6 @@ mrb_init_class(mrb_state *mrb)
mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE());
mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE());
mrb_define_method(mrb, bob, "==", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */
- mrb_define_method(mrb, bob, "!=", mrb_obj_not_equal_m, MRB_ARGS_REQ(1));
mrb_define_method(mrb, bob, "__id__", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.4 */
mrb_define_method(mrb, bob, "__send__", mrb_f_send, MRB_ARGS_REQ(1)|MRB_ARGS_REST()|MRB_ARGS_BLOCK()); /* 15.3.1.3.5 */
mrb_define_method(mrb, bob, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */
diff --git a/src/codedump.c b/src/codedump.c
index 7faa39360..649be176b 100644
--- a/src/codedump.c
+++ b/src/codedump.c
@@ -130,6 +130,10 @@ codedump(mrb_state *mrb, mrb_irep *irep)
printf("OP_LOADI\tR%d\t-%d\t", a, b);
print_lv_a(mrb, irep, a);
break;
+ CASE(OP_LOADI16, BS):
+ printf("OP_LOADI16\tR%d\t%d\t", a, (int)(int16_t)b);
+ print_lv_a(mrb, irep, a);
+ break;
CASE(OP_LOADI__1, B):
printf("OP_LOADI__1\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
diff --git a/src/debug.c b/src/debug.c
index b44c7d10e..32add68ae 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -64,7 +64,7 @@ mrb_debug_get_filename(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc)
}
MRB_API int32_t
-mrb_debug_get_line(mrb_state *mrb, mrb_irep *irep, ptrdiff_t pc)
+mrb_debug_get_line(mrb_state *mrb, const mrb_irep *irep, size_t pc)
{
if (irep && pc >= 0 && pc < irep->ilen) {
mrb_irep_debug_info_file* f = NULL;
@@ -204,11 +204,14 @@ mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d)
if (!d) { return; }
- for (i = 0; i < d->flen; ++i) {
- mrb_assert(d->files[i]);
- mrb_free(mrb, d->files[i]->lines.ptr);
- mrb_free(mrb, d->files[i]);
+ if (d->files) {
+ for (i = 0; i < d->flen; ++i) {
+ if (d->files[i]) {
+ mrb_free(mrb, d->files[i]->lines.ptr);
+ mrb_free(mrb, d->files[i]);
+ }
+ }
+ mrb_free(mrb, d->files);
}
- mrb_free(mrb, d->files);
mrb_free(mrb, d);
}
diff --git a/src/dump.c b/src/dump.c
index 183f3b67d..a6bbe68f3 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -13,9 +13,6 @@
#include <mruby/numeric.h>
#include <mruby/debug.h>
-#define FLAG_BYTEORDER_NATIVE 2
-#define FLAG_BYTEORDER_NONATIVE 0
-
#ifndef MRB_WITHOUT_FLOAT
#ifdef MRB_USE_FLOAT
#define MRB_FLOAT_FMT "%.9g"
@@ -709,22 +706,7 @@ write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t *bin, uint8
uint16_t crc;
uint32_t offset;
- switch (flags & DUMP_ENDIAN_NAT) {
- endian_big:
- case DUMP_ENDIAN_BIG:
- memcpy(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident));
- break;
- endian_little:
- case DUMP_ENDIAN_LIL:
- memcpy(header->binary_ident, RITE_BINARY_IDENT_LIL, sizeof(header->binary_ident));
- break;
-
- case DUMP_ENDIAN_NAT:
- if (bigendian_p()) goto endian_big;
- goto endian_little;
- break;
- }
-
+ memcpy(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident));
memcpy(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version));
memcpy(header->compiler_name, RITE_COMPILER_NAME, sizeof(header->compiler_name));
memcpy(header->compiler_version, RITE_COMPILER_VERSION, sizeof(header->compiler_version));
@@ -764,21 +746,6 @@ lv_defined_p(mrb_irep *irep)
return FALSE;
}
-static uint8_t
-dump_flags(uint8_t flags, uint8_t native)
-{
- if (native == FLAG_BYTEORDER_NATIVE) {
- if ((flags & DUMP_ENDIAN_NAT) == 0) {
- return (flags & DUMP_DEBUG_INFO) | DUMP_ENDIAN_NAT;
- }
- return flags;
- }
- if ((flags & DUMP_ENDIAN_NAT) == 0) {
- return (flags & DUMP_DEBUG_INFO) | DUMP_ENDIAN_BIG;
- }
- return flags;
-}
-
static int
dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size)
{
@@ -870,7 +837,7 @@ error_exit:
int
mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size)
{
- return dump_irep(mrb, irep, dump_flags(flags, FLAG_BYTEORDER_NONATIVE), bin, bin_size);
+ return dump_irep(mrb, irep, flags, bin, bin_size);
}
#ifndef MRB_DISABLE_STDIO
@@ -886,7 +853,7 @@ mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE* fp)
return MRB_DUMP_INVALID_ARGUMENT;
}
- result = dump_irep(mrb, irep, dump_flags(flags, FLAG_BYTEORDER_NONATIVE), &bin, &bin_size);
+ result = dump_irep(mrb, irep, flags, &bin, &bin_size);
if (result == MRB_DUMP_OK) {
if (fwrite(bin, sizeof(bin[0]), bin_size, fp) != bin_size) {
result = MRB_DUMP_WRITE_FAULT;
@@ -897,20 +864,6 @@ mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE* fp)
return result;
}
-static mrb_bool
-dump_bigendian_p(uint8_t flags)
-{
- switch (flags & DUMP_ENDIAN_NAT) {
- case DUMP_ENDIAN_BIG:
- return TRUE;
- case DUMP_ENDIAN_LIL:
- return FALSE;
- default:
- case DUMP_ENDIAN_NAT:
- return bigendian_p();
- }
-}
-
int
mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE *fp, const char *initname)
{
@@ -921,23 +874,8 @@ mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, uint8_t flags, FILE *fp, con
if (fp == NULL || initname == NULL || initname[0] == '\0') {
return MRB_DUMP_INVALID_ARGUMENT;
}
- flags = dump_flags(flags, FLAG_BYTEORDER_NATIVE);
result = dump_irep(mrb, irep, flags, &bin, &bin_size);
if (result == MRB_DUMP_OK) {
- if (!dump_bigendian_p(flags)) {
- if (fprintf(fp, "/* dumped in little endian order.\n"
- " use `mrbc -E` option for big endian CPU. */\n") < 0) {
- mrb_free(mrb, bin);
- return MRB_DUMP_WRITE_FAULT;
- }
- }
- else {
- if (fprintf(fp, "/* dumped in big endian order.\n"
- " use `mrbc -e` option for better performance on little endian CPU. */\n") < 0) {
- mrb_free(mrb, bin);
- return MRB_DUMP_WRITE_FAULT;
- }
- }
if (fprintf(fp, "#include <stdint.h>\n") < 0) { /* for uint8_t under at least Darwin */
mrb_free(mrb, bin);
return MRB_DUMP_WRITE_FAULT;
diff --git a/src/error.c b/src/error.c
index 260ca7a3d..5d17209e5 100644
--- a/src/error.c
+++ b/src/error.c
@@ -160,9 +160,8 @@ set_backtrace(mrb_state *mrb, mrb_value exc, mrb_value backtrace)
static mrb_value
exc_set_backtrace(mrb_state *mrb, mrb_value exc)
{
- mrb_value backtrace;
+ mrb_value backtrace = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &backtrace);
set_backtrace(mrb, exc, backtrace);
return backtrace;
}
@@ -185,6 +184,16 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc)
}
}
+static mrb_noreturn void
+exc_throw(mrb_state *mrb, mrb_value exc)
+{
+ if (!mrb->jmp) {
+ mrb_p(mrb, exc);
+ abort();
+ }
+ MRB_THROW(mrb->jmp);
+}
+
MRB_API mrb_noreturn void
mrb_exc_raise(mrb_state *mrb, mrb_value exc)
{
@@ -197,11 +206,7 @@ mrb_exc_raise(mrb_state *mrb, mrb_value exc)
}
mrb_exc_set(mrb, exc);
}
- if (!mrb->jmp) {
- mrb_p(mrb, exc);
- abort();
- }
- MRB_THROW(mrb->jmp);
+ exc_throw(mrb, exc);
}
MRB_API mrb_noreturn void
@@ -550,6 +555,52 @@ mrb_argnum_error(mrb_state *mrb, mrb_int argc, int min, int max)
#undef FMT
}
+void mrb_core_init_printabort(void);
+
+int
+mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state *, void *), void *opaque)
+{
+ struct mrb_jmpbuf *prev_jmp = mrb->jmp;
+ struct mrb_jmpbuf c_jmp;
+ int err = 1;
+
+ MRB_TRY(&c_jmp) {
+ mrb->jmp = &c_jmp;
+ body(mrb, opaque);
+ err = 0;
+ } MRB_CATCH(&c_jmp) {
+ if (mrb->exc) {
+ mrb_p(mrb, mrb_obj_value(mrb->exc));
+ mrb->exc = NULL;
+ }
+ else {
+ mrb_core_init_printabort();
+ }
+ } MRB_END_EXC(&c_jmp);
+
+ mrb->jmp = prev_jmp;
+
+ return err;
+}
+
+mrb_noreturn void
+mrb_core_init_abort(mrb_state *mrb)
+{
+ mrb->exc = NULL;
+ exc_throw(mrb, mrb_nil_value());
+}
+
+mrb_noreturn void
+mrb_raise_nomemory(mrb_state *mrb)
+{
+ if (mrb->nomem_err) {
+ mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
+ }
+ else {
+ mrb_core_init_abort(mrb);
+ }
+}
+
void
mrb_init_exception(mrb_state *mrb)
{
diff --git a/src/etc.c b/src/etc.c
index 607e82ca1..74b9ab03b 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -107,10 +107,11 @@ mrb_obj_id(mrb_value obj)
return MakeID(0); /* not define */
case MRB_TT_FALSE:
if (mrb_nil_p(obj))
- return MakeID(1);
- return MakeID(0);
+ return MakeID(4);
+ else
+ return MakeID(0);
case MRB_TT_TRUE:
- return MakeID(1);
+ return MakeID(2);
case MRB_TT_SYMBOL:
return MakeID(mrb_symbol(obj));
case MRB_TT_FIXNUM:
@@ -132,7 +133,6 @@ mrb_obj_id(mrb_value obj)
case MRB_TT_HASH:
case MRB_TT_RANGE:
case MRB_TT_EXCEPTION:
- case MRB_TT_FILE:
case MRB_TT_DATA:
case MRB_TT_ISTRUCT:
default:
@@ -140,7 +140,13 @@ mrb_obj_id(mrb_value obj)
}
}
+#if defined(MRB_NAN_BOXING) && defined(MRB_64BIT)
+#define mrb_xxx_boxing_cptr_value mrb_nan_boxing_cptr_value
+#endif
+
#ifdef MRB_WORD_BOXING
+#define mrb_xxx_boxing_cptr_value mrb_word_boxing_cptr_value
+
#ifndef MRB_WITHOUT_FLOAT
MRB_API mrb_value
mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
@@ -164,17 +170,20 @@ mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
return mrb_obj_value(nf);
}
#endif /* MRB_WITHOUT_FLOAT */
+#endif /* MRB_WORD_BOXING */
+#if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT))
MRB_API mrb_value
-mrb_word_boxing_cptr_value(mrb_state *mrb, void *p)
+mrb_xxx_boxing_cptr_value(mrb_state *mrb, void *p)
{
mrb_value v;
+ struct RCptr *cptr = (struct RCptr*)mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
- v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
- v.value.vp->p = p;
+ SET_OBJ_VALUE(v, cptr);
+ cptr->p = p;
return v;
}
-#endif /* MRB_WORD_BOXING */
+#endif
#if defined _MSC_VER && _MSC_VER < 1900
diff --git a/src/fmt_fp.c b/src/fmt_fp.c
index b77abe7b5..81ace6ec8 100644
--- a/src/fmt_fp.c
+++ b/src/fmt_fp.c
@@ -37,9 +37,19 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <mruby.h>
#include <mruby/string.h>
+struct fmt_args;
+
+typedef void output_func(struct fmt_args *f, const char *s, size_t l);
+
struct fmt_args {
mrb_state *mrb;
- mrb_value str;
+ output_func *output;
+ void *opaque;
+};
+
+struct mrb_cstr {
+ char *buf;
+ size_t len;
};
#define MAX(a,b) ((a)>(b) ? (a) : (b))
@@ -54,15 +64,44 @@ struct fmt_args {
#define PAD_POS (1U<<(' '-' '))
#define MARK_POS (1U<<('+'-' '))
+#define FLAGMASK (ALT_FORM|ZERO_PAD|LEFT_ADJ|PAD_POS|MARK_POS)
+
+static output_func strcat_value;
+static output_func strcat_cstr;
+
+static void
+strcat_value(struct fmt_args *f, const char *s, size_t l)
+{
+ mrb_value str = *(mrb_value*)f->opaque;
+ mrb_str_cat(f->mrb, str, s, l);
+}
+
+static void
+strcat_cstr(struct fmt_args *f, const char *s, size_t l)
+{
+ struct mrb_cstr *cstr = (struct mrb_cstr*)f->opaque;
+
+ if (l > cstr->len) {
+ mrb_state *mrb = f->mrb;
+
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string buffer too small");
+ }
+
+ memcpy(cstr->buf, s, l);
+
+ cstr->buf += l;
+ cstr->len -= l;
+}
+
static void
out(struct fmt_args *f, const char *s, size_t l)
{
- mrb_str_cat(f->mrb, f->str, s, l);
+ f->output(f, s, l);
}
#define PAD_SIZE 256
static void
-pad(struct fmt_args *f, char c, ptrdiff_t w, ptrdiff_t l, uint8_t fl)
+pad(struct fmt_args *f, char c, ptrdiff_t w, ptrdiff_t l, uint32_t fl)
{
char pad[PAD_SIZE];
if (fl & (LEFT_ADJ | ZERO_PAD) || l >= w) return;
@@ -92,7 +131,7 @@ typedef char compiler_defines_long_double_incorrectly[9-(int)sizeof(long double)
#endif
static int
-fmt_fp(struct fmt_args *f, long double y, ptrdiff_t p, uint8_t fl, int t)
+fmt_fp(struct fmt_args *f, long double y, ptrdiff_t w, ptrdiff_t p, uint32_t fl, int t)
{
uint32_t big[(LDBL_MANT_DIG+28)/29 + 1 // mantissa expansion
+ (LDBL_MAX_EXP+LDBL_MANT_DIG+28+8)/9]; // exponent expansion
@@ -117,11 +156,11 @@ fmt_fp(struct fmt_args *f, long double y, ptrdiff_t p, uint8_t fl, int t)
if (!isfinite(y)) {
const char *ss = (t&32)?"inf":"INF";
if (y!=y) ss=(t&32)?"nan":"NAN";
- pad(f, ' ', 0, 3+pl, fl&~ZERO_PAD);
+ pad(f, ' ', w, 3+pl, fl&~ZERO_PAD);
out(f, prefix, pl);
out(f, ss, 3);
- pad(f, ' ', 0, 3+pl, fl^LEFT_ADJ);
- return 3+(int)pl;
+ pad(f, ' ', w, 3+pl, fl^LEFT_ADJ);
+ return (int)MAX(w, 3+pl);
}
y = frexp((double)y, &e2) * 2;
@@ -169,14 +208,14 @@ fmt_fp(struct fmt_args *f, long double y, ptrdiff_t p, uint8_t fl, int t)
else
l = (s-buf) + (ebuf-estr);
- pad(f, ' ', 0, pl+l, fl);
+ pad(f, ' ', w, pl+l, fl);
out(f, prefix, pl);
- pad(f, '0', 0, pl+l, fl^ZERO_PAD);
+ pad(f, '0', w, pl+l, fl^ZERO_PAD);
out(f, buf, s-buf);
pad(f, '0', l-(ebuf-estr)-(s-buf), 0, 0);
out(f, estr, ebuf-estr);
- pad(f, ' ', 0, pl+l, fl^LEFT_ADJ);
- return (int)pl+(int)l;
+ pad(f, ' ', w, pl+l, fl^LEFT_ADJ);
+ return (int)MAX(w, pl+l);
}
if (p<0) p=6;
@@ -288,9 +327,9 @@ fmt_fp(struct fmt_args *f, long double y, ptrdiff_t p, uint8_t fl, int t)
l += ebuf-estr;
}
- pad(f, ' ', 0, pl+l, fl);
+ pad(f, ' ', w, pl+l, fl);
out(f, prefix, pl);
- pad(f, '0', 0, pl+l, fl^ZERO_PAD);
+ pad(f, '0', w, pl+l, fl^ZERO_PAD);
if ((t|32)=='f') {
if (a>r) a=r;
@@ -325,21 +364,33 @@ fmt_fp(struct fmt_args *f, long double y, ptrdiff_t p, uint8_t fl, int t)
out(f, estr, ebuf-estr);
}
- pad(f, ' ', 0, pl+l, fl^LEFT_ADJ);
+ pad(f, ' ', w, pl+l, fl^LEFT_ADJ);
- return (int)pl+(int)l;
+ return (int)MAX(w, pl+l);
}
static int
fmt_core(struct fmt_args *f, const char *fmt, mrb_float flo)
{
- ptrdiff_t p;
+ ptrdiff_t w, p;
+ uint32_t fl;
if (*fmt != '%') {
return -1;
}
++fmt;
+ /* Read modifier flags */
+ for (fl=0; (unsigned)*fmt-' '<32 && (FLAGMASK&(1U<<(*fmt-' '))); fmt++)
+ fl |= 1U<<(*fmt-' ');
+
+ /* - and 0 flags are mutually exclusive */
+ if (fl & LEFT_ADJ) fl &= ~ZERO_PAD;
+
+ for (w = 0; ISDIGIT(*fmt); ++fmt) {
+ w = 10 * w + (*fmt - '0');
+ }
+
if (*fmt == '.') {
++fmt;
for (p = 0; ISDIGIT(*fmt); ++fmt) {
@@ -353,29 +404,49 @@ fmt_core(struct fmt_args *f, const char *fmt, mrb_float flo)
switch (*fmt) {
case 'e': case 'f': case 'g': case 'a':
case 'E': case 'F': case 'G': case 'A':
- return fmt_fp(f, flo, p, 0, *fmt);
+ return fmt_fp(f, flo, w, p, fl, *fmt);
default:
return -1;
}
}
-mrb_value
+MRB_API mrb_value
mrb_float_to_str(mrb_state *mrb, mrb_value flo, const char *fmt)
{
struct fmt_args f;
+ mrb_value str = mrb_str_new_capa(mrb, 24);
f.mrb = mrb;
- f.str = mrb_str_new_capa(mrb, 24);
+ f.output = strcat_value;
+ f.opaque = (void*)&str;
if (fmt_core(&f, fmt, mrb_float(flo)) < 0) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid format string");
}
- return f.str;
+ return str;
+}
+
+MRB_API int
+mrb_float_to_cstr(mrb_state *mrb, char *buf, size_t len, const char *fmt, mrb_float fval)
+{
+ struct fmt_args f;
+ struct mrb_cstr cstr;
+
+ cstr.buf = buf;
+ cstr.len = len - 1; /* reserve NUL terminator */
+ f.mrb = mrb;
+ f.output = strcat_cstr;
+ f.opaque = (void*)&cstr;
+ if (fmt_core(&f, fmt, fval) < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid format string");
+ }
+ *cstr.buf = '\0';
+ return (int)(cstr.buf - buf);
}
#else /* MRB_DISABLE_STDIO || _WIN32 || _WIN64 */
#include <mruby.h>
#include <stdio.h>
-mrb_value
+MRB_API mrb_value
mrb_float_to_str(mrb_state *mrb, mrb_value flo, const char *fmt)
{
char buf[25];
@@ -383,5 +454,11 @@ mrb_float_to_str(mrb_state *mrb, mrb_value flo, const char *fmt)
snprintf(buf, sizeof(buf), fmt, mrb_float(flo));
return mrb_str_new_cstr(mrb, buf);
}
+
+MRB_API int
+mrb_float_to_cstr(mrb_state *mrb, char *buf, size_t len, const char *fmt, mrb_float fval)
+{
+ return snprintf(buf, len, fmt, fval);
+}
#endif /* MRB_DISABLE_STDIO || _WIN32 || _WIN64 */
#endif
diff --git a/src/gc.c b/src/gc.c
index 8d9a1806c..5531207db 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -201,6 +201,8 @@ gettimeofday_time(void)
#define objects(p) ((RVALUE *)p->objects)
+mrb_noreturn void mrb_raise_nomemory(mrb_state *mrb);
+
MRB_API void*
mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
{
@@ -223,14 +225,8 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len)
p2 = mrb_realloc_simple(mrb, p, len);
if (len == 0) return p2;
if (p2 == NULL) {
- if (mrb->gc.out_of_memory) {
- mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
- /* mrb_panic(mrb); */
- }
- else {
- mrb->gc.out_of_memory = TRUE;
- mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
- }
+ mrb->gc.out_of_memory = TRUE;
+ mrb_raise_nomemory(mrb);
}
else {
mrb->gc.out_of_memory = FALSE;
@@ -671,7 +667,6 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
{
mrb_assert(is_gray(obj));
paint_black(obj);
- gc->gray_list = obj->gcnext;
mrb_gc_mark(mrb, (struct RBasic*)obj->c);
switch (obj->tt) {
case MRB_TT_ICLASS:
@@ -714,10 +709,10 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
struct REnv *e = (struct REnv*)obj;
mrb_int i, len;
- if (MRB_ENV_STACK_SHARED_P(e) && e->cxt && e->cxt->fib) {
+ if (MRB_ENV_ONSTACK_P(e) && e->cxt && e->cxt->fib) {
mrb_gc_mark(mrb, (struct RBasic*)e->cxt->fib);
}
- len = MRB_ENV_STACK_LEN(e);
+ len = MRB_ENV_LEN(e);
for (i=0; i<len; i++) {
mrb_gc_mark_value(mrb, e->stack[i]);
}
@@ -735,10 +730,11 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
case MRB_TT_ARRAY:
{
struct RArray *a = (struct RArray*)obj;
- size_t i, e;
+ size_t i, e=ARY_LEN(a);
+ mrb_value *p = ARY_PTR(a);
- for (i=0,e=ARY_LEN(a); i<e; i++) {
- mrb_gc_mark_value(mrb, ARY_PTR(a)[i]);
+ for (i=0; i<e; i++) {
+ mrb_gc_mark_value(mrb, p[i]);
}
}
break;
@@ -818,7 +814,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end)
{
struct REnv *e = (struct REnv*)obj;
- if (MRB_ENV_STACK_SHARED_P(e)) {
+ if (MRB_ENV_ONSTACK_P(e)) {
/* cannot be freed */
e->stack = NULL;
break;
@@ -840,7 +836,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end)
while (ce <= ci) {
struct REnv *e = ci->env;
if (e && !mrb_object_dead_p(mrb, (struct RBasic*)e) &&
- e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) {
+ e->tt == MRB_TT_ENV && MRB_ENV_ONSTACK_P(e)) {
mrb_env_unshare(mrb, e);
}
ci--;
@@ -958,13 +954,12 @@ root_scan_phase(mrb_state *mrb, mrb_gc *gc)
}
}
+/* rough estimation of number of GC marks (non recursive) */
static size_t
-gc_gray_mark(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
+gc_gray_counts(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
{
size_t children = 0;
- gc_mark_children(mrb, gc, obj);
-
switch (obj->tt) {
case MRB_TT_ICLASS:
children++;
@@ -989,7 +984,7 @@ gc_gray_mark(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
break;
case MRB_TT_ENV:
- children += MRB_ENV_STACK_LEN(obj);
+ children += MRB_ENV_LEN(obj);
break;
case MRB_TT_FIBER:
@@ -1048,10 +1043,9 @@ gc_gray_mark(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
static void
gc_mark_gray_list(mrb_state *mrb, mrb_gc *gc) {
while (gc->gray_list) {
- if (is_gray(gc->gray_list))
- gc_mark_children(mrb, gc, gc->gray_list);
- else
- gc->gray_list = gc->gray_list->gcnext;
+ struct RBasic *obj = gc->gray_list;
+ gc->gray_list = obj->gcnext;
+ gc_mark_children(mrb, gc, obj);
}
}
@@ -1062,7 +1056,10 @@ incremental_marking_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
size_t tried_marks = 0;
while (gc->gray_list && tried_marks < limit) {
- tried_marks += gc_gray_mark(mrb, gc, gc->gray_list);
+ struct RBasic *obj = gc->gray_list;
+ gc->gray_list = obj->gcnext;
+ gc_mark_children(mrb, gc, obj);
+ tried_marks += gc_gray_counts(mrb, gc, obj);
}
return tried_marks;
@@ -1079,7 +1076,9 @@ final_marking_phase(mrb_state *mrb, mrb_gc *gc)
}
mrb_gc_mark_gv(mrb);
mark_context(mrb, mrb->c);
- mark_context(mrb, mrb->root_c);
+ if (mrb->c != mrb->root_c) {
+ mark_context(mrb, mrb->root_c);
+ }
mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
gc_mark_gray_list(mrb, gc);
mrb_assert(gc->gray_list == NULL);
@@ -1294,6 +1293,7 @@ mrb_full_gc(mrb_state *mrb)
{
mrb_gc *gc = &mrb->gc;
+ if (!mrb->c) return;
if (gc->disabled || gc->iterating) return;
GC_INVOKE_TIME_REPORT("mrb_full_gc()");
@@ -1601,6 +1601,12 @@ mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, vo
}
}
+size_t
+mrb_objspace_page_slot_size(void)
+{
+ return sizeof(RVALUE);
+}
+
#ifdef GC_TEST
#ifdef GC_DEBUG
static mrb_value gc_test(mrb_state *, mrb_value);
@@ -1632,272 +1638,3 @@ mrb_init_gc(mrb_state *mrb)
#endif
#endif
}
-
-#ifdef GC_TEST
-#ifdef GC_DEBUG
-void
-test_mrb_field_write_barrier(void)
-{
- mrb_state *mrb = mrb_open();
- struct RBasic *obj, *value;
- mrb_gc *gc = &mrb->gc;
-
- puts("test_mrb_field_write_barrier");
- gc->generational = FALSE;
- obj = mrb_basic_ptr(mrb_ary_new(mrb));
- value = mrb_basic_ptr(mrb_str_new_lit(mrb, "value"));
- paint_black(obj);
- paint_partial_white(gc, value);
-
-
- puts(" in MRB_GC_STATE_MARK");
- gc->state = MRB_GC_STATE_MARK;
- mrb_field_write_barrier(mrb, obj, value);
-
- mrb_assert(is_gray(value));
-
-
- puts(" in MRB_GC_STATE_SWEEP");
- paint_partial_white(gc, value);
- gc->state = MRB_GC_STATE_SWEEP;
- mrb_field_write_barrier(mrb, obj, value);
-
- mrb_assert(obj->color & gc->current_white_part);
- mrb_assert(value->color & gc->current_white_part);
-
-
- puts(" fail with black");
- gc->state = MRB_GC_STATE_MARK;
- paint_white(obj);
- paint_partial_white(gc, value);
- mrb_field_write_barrier(mrb, obj, value);
-
- mrb_assert(obj->color & gc->current_white_part);
-
-
- puts(" fail with gray");
- gc->state = MRB_GC_STATE_MARK;
- paint_black(obj);
- paint_gray(value);
- mrb_field_write_barrier(mrb, obj, value);
-
- mrb_assert(is_gray(value));
-
-
- {
- puts("test_mrb_field_write_barrier_value");
- obj = mrb_basic_ptr(mrb_ary_new(mrb));
- mrb_value value = mrb_str_new_lit(mrb, "value");
- paint_black(obj);
- paint_partial_white(gc, mrb_basic_ptr(value));
-
- gc->state = MRB_GC_STATE_MARK;
- mrb_field_write_barrier_value(mrb, obj, value);
-
- mrb_assert(is_gray(mrb_basic_ptr(value)));
- }
-
- mrb_close(mrb);
-}
-
-void
-test_mrb_write_barrier(void)
-{
- mrb_state *mrb = mrb_open();
- struct RBasic *obj;
- mrb_gc *gc = &mrb->gc;
-
- puts("test_mrb_write_barrier");
- obj = mrb_basic_ptr(mrb_ary_new(mrb));
- paint_black(obj);
-
- puts(" in MRB_GC_STATE_MARK");
- gc->state = MRB_GC_STATE_MARK;
- mrb_write_barrier(mrb, obj);
-
- mrb_assert(is_gray(obj));
- mrb_assert(gc->atomic_gray_list == obj);
-
-
- puts(" fail with gray");
- paint_gray(obj);
- mrb_write_barrier(mrb, obj);
-
- mrb_assert(is_gray(obj));
-
- mrb_close(mrb);
-}
-
-void
-test_add_gray_list(void)
-{
- mrb_state *mrb = mrb_open();
- struct RBasic *obj1, *obj2;
- mrb_gc *gc = &mrb->gc;
-
- puts("test_add_gray_list");
- change_gen_gc_mode(mrb, gc, FALSE);
- mrb_assert(gc->gray_list == NULL);
- obj1 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
- add_gray_list(mrb, gc, obj1);
- mrb_assert(gc->gray_list == obj1);
- mrb_assert(is_gray(obj1));
-
- obj2 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
- add_gray_list(mrb, gc, obj2);
- mrb_assert(gc->gray_list == obj2);
- mrb_assert(gc->gray_list->gcnext == obj1);
- mrb_assert(is_gray(obj2));
-
- mrb_close(mrb);
-}
-
-void
-test_gc_gray_mark(void)
-{
- mrb_state *mrb = mrb_open();
- mrb_value obj_v, value_v;
- struct RBasic *obj;
- size_t gray_num = 0;
- mrb_gc *gc = &mrb->gc;
-
- puts("test_gc_gray_mark");
-
- puts(" in MRB_TT_CLASS");
- obj = (struct RBasic*)mrb->object_class;
- paint_gray(obj);
- gray_num = gc_gray_mark(mrb, gc, obj);
- mrb_assert(is_black(obj));
- mrb_assert(gray_num > 1);
-
- puts(" in MRB_TT_ARRAY");
- obj_v = mrb_ary_new(mrb);
- value_v = mrb_str_new_lit(mrb, "test");
- paint_gray(mrb_basic_ptr(obj_v));
- paint_partial_white(gc, mrb_basic_ptr(value_v));
- mrb_ary_push(mrb, obj_v, value_v);
- gray_num = gc_gray_mark(mrb, gc, mrb_basic_ptr(obj_v));
- mrb_assert(is_black(mrb_basic_ptr(obj_v)));
- mrb_assert(is_gray(mrb_basic_ptr(value_v)));
- mrb_assert(gray_num == 1);
-
- mrb_close(mrb);
-}
-
-void
-test_incremental_gc(void)
-{
- mrb_state *mrb = mrb_open();
- size_t max = ~0, live = 0, total = 0, freed = 0;
- RVALUE *free;
- mrb_heap_page *page;
- mrb_gc *gc = &mrb->gc;
-
- puts("test_incremental_gc");
- change_gen_gc_mode(mrb, gc, FALSE);
-
- puts(" in mrb_full_gc");
- mrb_full_gc(mrb);
-
- mrb_assert(gc->state == MRB_GC_STATE_ROOT);
- puts(" in MRB_GC_STATE_ROOT");
- incremental_gc(mrb, gc, max);
- mrb_assert(gc->state == MRB_GC_STATE_MARK);
- puts(" in MRB_GC_STATE_MARK");
- incremental_gc_until(mrb, gc, MRB_GC_STATE_SWEEP);
- mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
-
- puts(" in MRB_GC_STATE_SWEEP");
- page = gc->heaps;
- while (page) {
- RVALUE *p = objects(page);
- RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
- while (p<e) {
- if (is_black(&p->as.basic)) {
- live++;
- }
- if (is_gray(&p->as.basic) && !is_dead(gc, &p->as.basic)) {
- printf("%p\n", &p->as.basic);
- }
- p++;
- }
- page = page->next;
- total += MRB_HEAP_PAGE_SIZE;
- }
-
- mrb_assert(gc->gray_list == NULL);
-
- incremental_gc(mrb, gc, max);
- mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
-
- incremental_gc(mrb, gc, max);
- mrb_assert(gc->state == MRB_GC_STATE_ROOT);
-
- free = (RVALUE*)gc->heaps->freelist;
- while (free) {
- freed++;
- free = (RVALUE*)free->as.free.next;
- }
-
- mrb_assert(gc->live == live);
- mrb_assert(gc->live == total-freed);
-
- puts("test_incremental_gc(gen)");
- incremental_gc_until(mrb, gc, MRB_GC_STATE_SWEEP);
- change_gen_gc_mode(mrb, gc, TRUE);
-
- mrb_assert(gc->full == FALSE);
- mrb_assert(gc->state == MRB_GC_STATE_ROOT);
-
- puts(" in minor");
- mrb_assert(is_minor_gc(gc));
- mrb_assert(gc->majorgc_old_threshold > 0);
- gc->majorgc_old_threshold = 0;
- mrb_incremental_gc(mrb);
- mrb_assert(gc->full == TRUE);
- mrb_assert(gc->state == MRB_GC_STATE_ROOT);
-
- puts(" in major");
- mrb_assert(is_major_gc(gc));
- do {
- mrb_incremental_gc(mrb);
- } while (gc->state != MRB_GC_STATE_ROOT);
- mrb_assert(gc->full == FALSE);
-
- mrb_close(mrb);
-}
-
-void
-test_incremental_sweep_phase(void)
-{
- mrb_state *mrb = mrb_open();
- mrb_gc *gc = &mrb->gc;
-
- puts("test_incremental_sweep_phase");
-
- add_heap(mrb, gc);
- gc->sweeps = gc->heaps;
-
- mrb_assert(gc->heaps->next->next == NULL);
- mrb_assert(gc->free_heaps->next->next == NULL);
- incremental_sweep_phase(mrb, gc, MRB_HEAP_PAGE_SIZE * 3);
-
- mrb_assert(gc->heaps->next == NULL);
- mrb_assert(gc->heaps == gc->free_heaps);
-
- mrb_close(mrb);
-}
-
-static mrb_value
-gc_test(mrb_state *mrb, mrb_value self)
-{
- test_mrb_field_write_barrier();
- test_mrb_write_barrier();
- test_add_gray_list();
- test_gc_gray_mark();
- test_incremental_gc();
- test_incremental_sweep_phase();
- return mrb_nil_value();
-}
-#endif /* GC_DEBUG */
-#endif /* GC_TEST */
diff --git a/src/hash.c b/src/hash.c
index 70f437358..c891e1b22 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -73,7 +73,7 @@ ht_hash_func(mrb_state *mrb, htable *t, mrb_value key)
default:
hv = mrb_funcall(mrb, key, "hash", 0);
- h = (size_t)t ^ (size_t)mrb_fixnum(hv);
+ h = (size_t)tt ^ (size_t)mrb_fixnum(hv);
break;
}
if (index && (index != t->index || capa != index->capa)) {
@@ -174,6 +174,11 @@ ht_index(mrb_state *mrb, htable *t)
segment *seg;
size_t i;
+ if (size == 0) {
+ t->index = NULL;
+ mrb_free(mrb, index);
+ return;
+ }
/* allocate index table */
if (index && index->size >= UPPER_BOUND(index->capa)) {
size = index->capa+1;
@@ -194,7 +199,7 @@ ht_index(mrb_state *mrb, htable *t)
index->table[i] = NULL;
}
- /* rebuld index */
+ /* rebuild index */
mask = HT_MASK(index);
seg = t->rootseg;
while (seg) {
@@ -222,9 +227,8 @@ static void
ht_compact(mrb_state *mrb, htable *t)
{
segment *seg;
- mrb_int i;
+ uint16_t i, i2;
segment *seg2 = NULL;
- mrb_int i2;
mrb_int size = 0;
if (t == NULL) return;
@@ -366,7 +370,7 @@ ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
if (!seg->next && i >= t->last_len) {
seg->e[i].key = key;
seg->e[i].val = val;
- t->last_len = i+1;
+ t->last_len = (uint16_t)i+1;
t->size++;
return;
}
@@ -374,7 +378,7 @@ ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
deleted++;
continue;
}
- if (ht_hash_equal(mrb, t, k, key)) {
+ if (ht_hash_equal(mrb, t, key, k)) {
seg->e[i].val = val;
return;
}
@@ -408,7 +412,7 @@ ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
}
seg->e[i].key = key;
seg->e[i].val = val;
- t->last_len = i+1;
+ t->last_len = (uint16_t)i+1;
if (t->index == NULL && t->size > MRB_HT_INIT_SIZE*4) {
ht_index(mrb, t);
}
@@ -455,7 +459,7 @@ ht_get(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp)
return FALSE;
}
if (mrb_undef_p(k)) continue;
- if (ht_hash_equal(mrb, t, k, key)) {
+ if (ht_hash_equal(mrb, t, key, k)) {
if (vp) *vp = seg->e[i].val;
return TRUE;
}
@@ -519,6 +523,20 @@ ht_foreach(mrb_state *mrb, htable *t, mrb_hash_foreach_func *func, void *p)
}
}
+size_t
+mrb_os_memsize_of_hash_table(mrb_value obj)
+{
+ struct htable *h = mrb_hash_ptr(obj)->ht;
+ size_t segkv_size = 0;
+
+ if (h->index) segkv_size = (sizeof(struct segkv) * h->index->capa);
+
+ return sizeof(htable) +
+ sizeof(segindex) +
+ (sizeof(segment) * h->size) +
+ segkv_size;
+}
+
/* Iterates over the hash table. */
MRB_API void
mrb_hash_foreach(mrb_state *mrb, struct RHash *hash, mrb_hash_foreach_func *func, void *p)
@@ -642,12 +660,11 @@ static mrb_value hash_default(mrb_state *mrb, mrb_value hash, mrb_value key);
static mrb_value
mrb_hash_init_copy(mrb_state *mrb, mrb_value self)
{
- mrb_value orig;
+ mrb_value orig = mrb_get_arg1(mrb);
struct RHash* copy;
htable *orig_h;
mrb_value ifnone, vret;
- mrb_get_args(mrb, "o", &orig);
if (mrb_obj_equal(mrb, self, orig)) return self;
if ((mrb_type(self) != mrb_type(orig)) || (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig))) {
mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
@@ -829,9 +846,8 @@ mrb_hash_init(mrb_state *mrb, mrb_value hash)
static mrb_value
mrb_hash_aget(mrb_state *mrb, mrb_value self)
{
- mrb_value key;
+ mrb_value key = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &key);
return mrb_hash_get(mrb, self, key);
}
@@ -914,9 +930,8 @@ mrb_hash_default(mrb_state *mrb, mrb_value hash)
static mrb_value
mrb_hash_set_default(mrb_state *mrb, mrb_value hash)
{
- mrb_value ifnone;
+ mrb_value ifnone = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &ifnone);
mrb_hash_modify(mrb, hash);
mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
RHASH(hash)->flags &= ~MRB_HASH_PROC_DEFAULT;
@@ -970,9 +985,8 @@ mrb_hash_default_proc(mrb_state *mrb, mrb_value hash)
static mrb_value
mrb_hash_set_default_proc(mrb_state *mrb, mrb_value hash)
{
- mrb_value ifnone;
+ mrb_value ifnone = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &ifnone);
mrb_hash_modify(mrb, hash);
mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
if (!mrb_nil_p(ifnone)) {
@@ -1004,9 +1018,8 @@ mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key)
static mrb_value
mrb_hash_delete(mrb_state *mrb, mrb_value self)
{
- mrb_value key;
+ mrb_value key = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &key);
mrb_hash_modify(mrb, self);
return mrb_hash_delete_key(mrb, self, key);
}
@@ -1059,7 +1072,8 @@ mrb_hash_shift(mrb_state *mrb, mrb_value hash)
mrb_hash_modify(mrb, hash);
if (t && t->size > 0) {
- mrb_value del_key, del_val;
+ mrb_value del_key = mrb_nil_value();
+ mrb_value del_val = mrb_nil_value();
ht_shift(mrb, t, &del_key, &del_val);
mrb_gc_protect(mrb, del_key);
@@ -1289,10 +1303,9 @@ mrb_hash_key_p(mrb_state *mrb, mrb_value hash, mrb_value key)
static mrb_value
mrb_hash_has_key(mrb_state *mrb, mrb_value hash)
{
- mrb_value key;
+ mrb_value key = mrb_get_arg1(mrb);
mrb_bool key_p;
- mrb_get_args(mrb, "o", &key);
key_p = mrb_hash_key_p(mrb, hash, key);
return mrb_bool_value(key_p);
}
@@ -1332,10 +1345,9 @@ hash_has_value_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
static mrb_value
mrb_hash_has_value(mrb_state *mrb, mrb_value hash)
{
- mrb_value val;
+ mrb_value val = mrb_get_arg1(mrb);
struct has_v_arg arg;
- mrb_get_args(mrb, "o", &val);
arg.found = FALSE;
arg.val = val;
ht_foreach(mrb, RHASH_TBL(hash), hash_has_value_i, &arg);
diff --git a/src/kernel.c b/src/kernel.c
index 8bb837eca..10ed9f88e 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -71,9 +71,8 @@ mrb_obj_inspect(mrb_state *mrb, mrb_value obj)
static mrb_value
mrb_equal_m(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ mrb_value arg = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &arg);
return mrb_bool_value(mrb_equal(mrb, self, arg));
}
@@ -100,6 +99,18 @@ mrb_obj_id_m(mrb_state *mrb, mrb_value self)
return mrb_fixnum_value(mrb_obj_id(self));
}
+static int
+env_bidx(struct REnv *e)
+{
+ int bidx;
+
+ /* use saved block arg position */
+ bidx = MRB_ENV_BIDX(e);
+ /* bidx may be useless (e.g. define_method) */
+ if (bidx >= MRB_ENV_LEN(e)) return -1;
+ return bidx;
+}
+
/* 15.3.1.2.2 */
/* 15.3.1.2.5 */
/* 15.3.1.3.6 */
@@ -130,6 +141,8 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
mrb_callinfo *ci = &mrb->c->ci[-1];
mrb_callinfo *cibase = mrb->c->cibase;
mrb_value *bp;
+ int bidx;
+ struct REnv *e = NULL;
struct RProc *p;
if (ci <= cibase) {
@@ -140,29 +153,36 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
/* search method/class/module proc */
while (p) {
if (MRB_PROC_SCOPE_P(p)) break;
+ e = MRB_PROC_ENV(p);
p = p->upper;
}
if (p == NULL) return mrb_false_value();
+ if (e) {
+ bidx = env_bidx(e);
+ if (bidx < 0) return mrb_false_value();
+ bp = &e->stack[bidx];
+ goto block_given;
+ }
/* search ci corresponding to proc */
while (cibase < ci) {
if (ci->proc == p) break;
ci--;
}
if (ci == cibase) {
- return mrb_false_value();
+ /* proc is closure */
+ if (!MRB_PROC_ENV_P(p)) return mrb_false_value();
+ e = MRB_PROC_ENV(p);
+ bidx = env_bidx(e);
+ if (bidx < 0) return mrb_false_value();
+ bp = &e->stack[bidx];
}
else if (ci->env) {
- struct REnv *e = ci->env;
- int bidx;
-
+ e = ci->env;
/* top-level does not have block slot (always false) */
- if (e->stack == mrb->c->stbase)
- return mrb_false_value();
- /* use saved block arg position */
- bidx = MRB_ENV_BIDX(e);
+ if (e->stack == mrb->c->stbase) return mrb_false_value();
+ bidx = env_bidx(e);
/* bidx may be useless (e.g. define_method) */
- if (bidx >= MRB_ENV_STACK_LEN(e))
- return mrb_false_value();
+ if (bidx < 0) return mrb_false_value();
bp = &e->stack[bidx];
}
else {
@@ -174,6 +194,7 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
bp++;
}
}
+ block_given:
if (mrb_nil_p(*bp))
return mrb_false_value();
return mrb_true_value();
@@ -325,7 +346,7 @@ mrb_obj_clone(mrb_state *mrb, mrb_value self)
mrb_value clone;
if (mrb_immediate_p(self)) {
- mrb_raisef(mrb, E_TYPE_ERROR, "can't clone %v", self);
+ return self;
}
if (mrb_sclass_p(self)) {
mrb_raise(mrb, E_TYPE_ERROR, "can't clone singleton class");
@@ -366,7 +387,7 @@ mrb_obj_dup(mrb_state *mrb, mrb_value obj)
mrb_value dup;
if (mrb_immediate_p(obj)) {
- mrb_raisef(mrb, E_TYPE_ERROR, "can't dup %v", obj);
+ return obj;
}
if (mrb_sclass_p(obj)) {
mrb_raise(mrb, E_TYPE_ERROR, "can't dup singleton class");
@@ -471,9 +492,8 @@ mrb_obj_hash(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_obj_init_copy(mrb_state *mrb, mrb_value self)
{
- mrb_value orig;
+ mrb_value orig = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &orig);
if (mrb_obj_equal(mrb, self, orig)) return self;
if ((mrb_type(self) != mrb_type(orig)) || (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig))) {
mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
@@ -500,11 +520,11 @@ mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c)
static mrb_value
obj_is_instance_of(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ struct RClass *c;
- mrb_get_args(mrb, "C", &arg);
+ mrb_get_args(mrb, "c", &c);
- return mrb_bool_value(mrb_obj_is_instance_of(mrb, self, mrb_class_ptr(arg)));
+ return mrb_bool_value(mrb_obj_is_instance_of(mrb, self, c));
}
/* 15.3.1.3.24 */
@@ -537,11 +557,11 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_obj_is_kind_of_m(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ struct RClass *c;
- mrb_get_args(mrb, "C", &arg);
+ mrb_get_args(mrb, "c", &c);
- return mrb_bool_value(mrb_obj_is_kind_of(mrb, self, mrb_class_ptr(arg)));
+ return mrb_bool_value(mrb_obj_is_kind_of(mrb, self, c));
}
KHASH_DECLARE(st, mrb_sym, char, FALSE)
@@ -744,12 +764,29 @@ obj_respond_to(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
{
- mrb_value v;
+ mrb_value v = mrb_get_arg1(mrb);
mrb_int i, len;
mrb_sym eqq = mrb_intern_lit(mrb, "===");
- mrb_value ary = mrb_ary_splat(mrb, self);
+ mrb_value ary;
- mrb_get_args(mrb, "o", &v);
+ if (mrb_array_p(self)) {
+ ary = self;
+ }
+ else if (mrb_nil_p(self)) {
+ return mrb_false_value();
+ }
+ else if (!mrb_respond_to(mrb, self, mrb_intern_lit(mrb, "to_a"))) {
+ mrb_value c = mrb_funcall_argv(mrb, self, eqq, 1, &v);
+ if (mrb_test(c)) return mrb_true_value();
+ return mrb_false_value();
+ }
+ else {
+ ary = mrb_funcall(mrb, self, "to_a", 0);
+ if (mrb_nil_p(ary)) {
+ return mrb_funcall_argv(mrb, self, eqq, 1, &v);
+ }
+ mrb_ensure_array_type(mrb, ary);
+ }
len = RARRAY_LEN(ary);
for (i=0; i<len; i++) {
mrb_value c = mrb_funcall_argv(mrb, mrb_ary_entry(ary, i), eqq, 1, &v);
diff --git a/src/load.c b/src/load.c
index e624c52d5..247d511df 100644
--- a/src/load.c
+++ b/src/load.c
@@ -14,14 +14,12 @@
#include <mruby/string.h>
#include <mruby/debug.h>
#include <mruby/error.h>
+#include <mruby/data.h>
#if SIZE_MAX < UINT32_MAX
# error size_t must be at least 32 bits wide
#endif
-#define FLAG_BYTEORDER_BIG 2
-#define FLAG_BYTEORDER_LIL 4
-#define FLAG_BYTEORDER_NATIVE 8
#define FLAG_SRC_MALLOC 1
#define FLAG_SRC_STATIC 0
@@ -56,7 +54,15 @@ str_to_double(mrb_state *mrb, const char *p, size_t len)
}
#endif
-mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base, int badcheck);
+mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, int badcheck);
+
+static void
+tempirep_free(mrb_state *mrb, void *p)
+{
+ if (p) mrb_irep_decref(mrb, (mrb_irep *)p);
+}
+
+static const mrb_data_type tempirep_type = { "temporary irep", tempirep_free };
static mrb_irep*
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
@@ -66,8 +72,11 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
ptrdiff_t diff;
uint16_t tt, pool_data_len, snl;
int plen;
- int ai = mrb_gc_arena_save(mrb);
+ struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
mrb_irep *irep = mrb_add_irep(mrb);
+ int ai = mrb_gc_arena_save(mrb);
+
+ irep_obj->data = irep;
/* skip record size */
src += sizeof(uint32_t);
@@ -94,8 +103,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
if (SIZE_ERROR_MUL(irep->ilen, sizeof(mrb_code))) {
return NULL;
}
- if ((flags & FLAG_SRC_MALLOC) == 0 &&
- (flags & FLAG_BYTEORDER_NATIVE)) {
+ if ((flags & FLAG_SRC_MALLOC) == 0) {
irep->iseq = (mrb_code*)src;
src += sizeof(mrb_code) * irep->ilen;
irep->flags |= MRB_ISEQ_NO_FREE;
@@ -188,36 +196,47 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
}
}
- irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*irep->rlen);
+ irep->reps = (mrb_irep**)mrb_calloc(mrb, irep->rlen, sizeof(mrb_irep*));
diff = src - bin;
mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
*len = (size_t)diff;
+ irep_obj->data = NULL;
+
return irep;
}
static mrb_irep*
read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
{
+ struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
+ int ai = mrb_gc_arena_save(mrb);
mrb_irep *irep = read_irep_record_1(mrb, bin, len, flags);
int i;
+ mrb_gc_arena_restore(mrb, ai);
if (irep == NULL) {
return NULL;
}
+ irep_obj->data = irep;
+
bin += *len;
for (i=0; i<irep->rlen; i++) {
size_t rlen;
irep->reps[i] = read_irep_record(mrb, bin, &rlen, flags);
+ mrb_gc_arena_restore(mrb, ai);
if (irep->reps[i] == NULL) {
return NULL;
}
bin += rlen;
*len += rlen;
}
+
+ irep_obj->data = NULL;
+
return irep;
}
@@ -241,21 +260,21 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *
if (irep->debug_info) { return MRB_DUMP_INVALID_IREP; }
- irep->debug_info = (mrb_irep_debug_info*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info));
+ irep->debug_info = (mrb_irep_debug_info*)mrb_calloc(mrb, 1, sizeof(mrb_irep_debug_info));
irep->debug_info->pc_count = (uint32_t)irep->ilen;
record_size = (size_t)bin_to_uint32(bin);
bin += sizeof(uint32_t);
irep->debug_info->flen = bin_to_uint16(bin);
- irep->debug_info->files = (mrb_irep_debug_info_file**)mrb_malloc(mrb, sizeof(mrb_irep_debug_info*) * irep->debug_info->flen);
+ irep->debug_info->files = (mrb_irep_debug_info_file**)mrb_calloc(mrb, irep->debug_info->flen, sizeof(mrb_irep_debug_info*));
bin += sizeof(uint16_t);
for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
mrb_irep_debug_info_file *file;
uint16_t filename_idx;
- file = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*file));
+ file = (mrb_irep_debug_info_file *)mrb_calloc(mrb, 1, sizeof(*file));
irep->debug_info->files[f_idx] = file;
file->start_pos = bin_to_uint32(bin);
@@ -285,8 +304,8 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *
case mrb_debug_line_flat_map: {
uint32_t l;
- file->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(
- mrb, sizeof(mrb_irep_debug_info_line) * (size_t)(file->line_entry_count));
+ file->lines.flat_map = (mrb_irep_debug_info_line*)mrb_calloc(
+ mrb, (size_t)(file->line_entry_count), sizeof(mrb_irep_debug_info_line));
for (l = 0; l < file->line_entry_count; ++l) {
file->lines.flat_map[l].start_pos = bin_to_uint32(bin);
bin += sizeof(uint32_t);
@@ -333,6 +352,7 @@ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t
int result;
uint16_t filenames_len;
mrb_sym *filenames;
+ mrb_value filenames_obj;
bin = start;
header = (struct rite_section_debug_header *)bin;
@@ -340,7 +360,8 @@ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t
filenames_len = bin_to_uint16(bin);
bin += sizeof(uint16_t);
- filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * (size_t)filenames_len);
+ filenames_obj = mrb_str_new(mrb, NULL, sizeof(mrb_sym) * (size_t)filenames_len);
+ filenames = (mrb_sym*)RSTRING_PTR(filenames_obj);
for (i = 0; i < filenames_len; ++i) {
uint16_t f_len = bin_to_uint16(bin);
bin += sizeof(uint16_t);
@@ -364,7 +385,7 @@ read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t
}
debug_exit:
- mrb_free(mrb, filenames);
+ mrb_str_resize(mrb, filenames_obj, 0);
return result;
}
@@ -422,6 +443,7 @@ read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t fl
int result;
uint32_t syms_len;
mrb_sym *syms;
+ mrb_value syms_obj;
mrb_sym (*intern_func)(mrb_state*, const char*, size_t) =
(flags & FLAG_SRC_MALLOC)? mrb_intern : mrb_intern_static;
@@ -431,7 +453,8 @@ read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t fl
syms_len = bin_to_uint32(bin);
bin += sizeof(uint32_t);
- syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * (size_t)syms_len);
+ syms_obj = mrb_str_new(mrb, NULL, sizeof(mrb_sym) * (size_t)syms_len);
+ syms = (mrb_sym*)RSTRING_PTR(syms_obj);
for (i = 0; i < syms_len; ++i) {
uint16_t const str_len = bin_to_uint16(bin);
bin += sizeof(uint16_t);
@@ -451,7 +474,7 @@ read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t fl
}
lv_exit:
- mrb_free(mrb, syms);
+ mrb_str_resize(mrb, syms_obj, 0);
return result;
}
@@ -464,19 +487,7 @@ read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint16_
return MRB_DUMP_READ_FAULT;
}
- if (memcmp(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident)) == 0) {
- if (bigendian_p())
- *flags |= FLAG_BYTEORDER_NATIVE;
- else
- *flags |= FLAG_BYTEORDER_BIG;
- }
- else if (memcmp(header->binary_ident, RITE_BINARY_IDENT_LIL, sizeof(header->binary_ident)) == 0) {
- if (bigendian_p())
- *flags |= FLAG_BYTEORDER_LIL;
- else
- *flags |= FLAG_BYTEORDER_NATIVE;
- }
- else {
+ if (memcmp(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident)) != 0) {
return MRB_DUMP_INVALID_FILE_HEADER;
}
@@ -500,6 +511,7 @@ static mrb_irep*
read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
{
int result;
+ struct RData *irep_obj = NULL;
mrb_irep *irep = NULL;
const struct rite_section_header *section_header;
uint16_t crc;
@@ -520,12 +532,15 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
return NULL;
}
+ irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
+
bin += sizeof(struct rite_binary_header);
do {
section_header = (const struct rite_section_header *)bin;
if (memcmp(section_header->section_ident, RITE_SECTION_IREP_IDENT, sizeof(section_header->section_ident)) == 0) {
irep = read_section_irep(mrb, bin, flags);
if (!irep) return NULL;
+ irep_obj->data = irep;
}
else if (memcmp(section_header->section_ident, RITE_SECTION_DEBUG_IDENT, sizeof(section_header->section_ident)) == 0) {
if (!irep) return NULL; /* corrupted data */
@@ -544,6 +559,8 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
bin += bin_to_uint32(section_header->section_size);
} while (memcmp(section_header->section_ident, RITE_BINARY_EOF, sizeof(section_header->section_ident)) != 0);
+ irep_obj->data = NULL;
+
return irep;
}
@@ -595,7 +612,16 @@ load_irep(mrb_state *mrb, mrb_irep *irep, mrbc_context *c)
MRB_API mrb_value
mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
{
- return load_irep(mrb, mrb_read_irep(mrb, bin), c);
+ struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
+ mrb_irep *irep = mrb_read_irep(mrb, bin);
+ mrb_value ret;
+
+ irep_obj->data = irep;
+ mrb_irep_incref(mrb, irep);
+ ret = load_irep(mrb, irep, c);
+ irep_obj->data = NULL;
+ mrb_irep_decref(mrb, irep);
+ return ret;
}
MRB_API mrb_value
diff --git a/src/numeric.c b/src/numeric.c
index 6cfd64280..83a4ef716 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -67,12 +67,11 @@ mrb_int_value(mrb_state *mrb, mrb_float f)
static mrb_value
integral_pow(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
#ifndef MRB_WITHOUT_FLOAT
mrb_float d;
#endif
- mrb_get_args(mrb, "o", &y);
if (mrb_fixnum_p(x) && mrb_fixnum_p(y)) {
/* try ipow() */
mrb_int base = mrb_fixnum(x);
@@ -116,9 +115,8 @@ static mrb_value
integral_idiv(mrb_state *mrb, mrb_value x)
{
#ifdef MRB_WITHOUT_FLOAT
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
if (!mrb_fixnum_p(y)) {
mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
}
@@ -151,21 +149,31 @@ integral_idiv(mrb_state *mrb, mrb_value x)
*/
static mrb_value
-integral_div(mrb_state *mrb, mrb_value x)
+integral_div(mrb_state *mrb, mrb_value xv)
{
#ifdef MRB_WITHOUT_FLOAT
- mrb_value y;
+ mrb_int y;
- mrb_get_args(mrb, "o", &y);
- if (!mrb_fixnum_p(y)) {
- mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
+ mrb_get_args(mrb, "i", &y);
+ if (y == 0) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "devided by zero");
}
- return mrb_fixnum_value(mrb_fixnum(x) / mrb_fixnum(y));
+ return mrb_fixnum_value(mrb, mrb_fixnum(xv) / y);
#else
- mrb_float y;
+ mrb_float x, y;
mrb_get_args(mrb, "f", &y);
- return mrb_float_value(mrb, mrb_to_flo(mrb, x) / y);
+ x = mrb_to_flo(mrb, xv);
+ if (y == 0) {
+ if (x < 0)
+ y = -INFINITY;
+ else if (x > 0)
+ y = INFINITY;
+ else /* if (x == 0) */
+ y = NAN;
+ return mrb_float_value(mrb, y);
+ }
+ return mrb_float_value(mrb, x / y);
#endif
}
@@ -210,26 +218,30 @@ static mrb_value
flo_to_s(mrb_state *mrb, mrb_value flt)
{
mrb_float f = mrb_float(flt);
+ mrb_value str;
if (isinf(f)) {
- return f < 0 ? mrb_str_new_lit(mrb, "-Infinity")
- : mrb_str_new_lit(mrb, "Infinity");
+ str = f < 0 ? mrb_str_new_lit(mrb, "-Infinity")
+ : mrb_str_new_lit(mrb, "Infinity");
+ goto exit;
}
else if (isnan(f)) {
- return mrb_str_new_lit(mrb, "NaN");
+ str = mrb_str_new_lit(mrb, "NaN");
+ goto exit;
}
else {
char fmt[] = "%." MRB_STRINGIZE(FLO_TO_STR_PREC) "g";
- mrb_value str = mrb_float_to_str(mrb, flt, fmt);
mrb_int len;
char *begp, *p, *endp;
+ str = mrb_float_to_str(mrb, flt, fmt);
+
insert_dot_zero:
begp = RSTRING_PTR(str);
len = RSTRING_LEN(str);
for (p = begp, endp = p + len; p < endp; ++p) {
if (*p == '.') {
- return str;
+ goto exit;
}
else if (*p == 'e') {
ptrdiff_t e_pos = p - begp;
@@ -237,7 +249,7 @@ flo_to_s(mrb_state *mrb, mrb_value flt)
p = RSTRING_PTR(str) + e_pos;
memmove(p + 2, p, len - e_pos);
memcpy(p, ".0", 2);
- return str;
+ goto exit;
}
}
@@ -247,8 +259,12 @@ flo_to_s(mrb_state *mrb, mrb_value flt)
goto insert_dot_zero;
}
- return str;
+ goto exit;
}
+
+ exit:
+ RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
+ return str;
}
/* 15.2.9.3.2 */
@@ -263,9 +279,8 @@ flo_to_s(mrb_state *mrb, mrb_value flt)
static mrb_value
flo_minus(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
return mrb_float_value(mrb, mrb_float(x) - mrb_to_flo(mrb, y));
}
@@ -281,9 +296,8 @@ flo_minus(mrb_state *mrb, mrb_value x)
static mrb_value
flo_mul(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
return mrb_float_value(mrb, mrb_float(x) * mrb_to_flo(mrb, y));
}
@@ -343,11 +357,9 @@ flodivmod(mrb_state *mrb, double x, double y, mrb_float *divp, mrb_float *modp)
static mrb_value
flo_mod(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
mrb_float mod;
- mrb_get_args(mrb, "o", &y);
-
flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), 0, &mod);
return mrb_float_value(mrb, mod);
}
@@ -368,9 +380,8 @@ flo_mod(mrb_state *mrb, mrb_value x)
static mrb_value
fix_eql(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
if (!mrb_fixnum_p(y)) return mrb_false_value();
return mrb_bool_value(mrb_fixnum(x) == mrb_fixnum(y));
}
@@ -379,9 +390,8 @@ fix_eql(mrb_state *mrb, mrb_value x)
static mrb_value
flo_eql(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
if (!mrb_float_p(y)) return mrb_false_value();
return mrb_bool_value(mrb_float(x) == mrb_float(y));
}
@@ -402,8 +412,7 @@ flo_eql(mrb_state *mrb, mrb_value x)
static mrb_value
flo_eq(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
- mrb_get_args(mrb, "o", &y);
+ mrb_value y = mrb_get_arg1(mrb);
switch (mrb_type(y)) {
case MRB_TT_FIXNUM:
@@ -421,7 +430,6 @@ value_int64(mrb_state *mrb, mrb_value x)
switch (mrb_type(x)) {
case MRB_TT_FIXNUM:
return (int64_t)mrb_fixnum(x);
- break;
case MRB_TT_FLOAT:
return (int64_t)mrb_float(x);
default:
@@ -452,9 +460,8 @@ flo_rev(mrb_state *mrb, mrb_value x)
static mrb_value
flo_and(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
int64_t v1, v2;
- mrb_get_args(mrb, "o", &y);
v1 = (int64_t)mrb_float(x);
v2 = value_int64(mrb, y);
@@ -464,9 +471,8 @@ flo_and(mrb_state *mrb, mrb_value x)
static mrb_value
flo_or(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
int64_t v1, v2;
- mrb_get_args(mrb, "o", &y);
v1 = (int64_t)mrb_float(x);
v2 = value_int64(mrb, y);
@@ -476,9 +482,8 @@ flo_or(mrb_state *mrb, mrb_value x)
static mrb_value
flo_xor(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
int64_t v1, v2;
- mrb_get_args(mrb, "o", &y);
v1 = (int64_t)mrb_float(x);
v2 = value_int64(mrb, y);
@@ -839,9 +844,8 @@ mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y)
static mrb_value
fix_mul(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
return fixnum_mul(mrb, x, y);
}
@@ -886,12 +890,11 @@ fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
static mrb_value
fix_mod(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
mrb_int a, b;
- mrb_get_args(mrb, "o", &y);
a = mrb_fixnum(x);
- if (mrb_fixnum_p(y) && a != MRB_INT_MIN && (b=mrb_fixnum(y)) != MRB_INT_MIN) {
+ if (mrb_fixnum_p(y) && a != MRB_INT_MIN && (b=mrb_fixnum(y)) != MRB_INT_MIN) {
mrb_int mod;
if (b == 0) {
@@ -928,9 +931,7 @@ fix_mod(mrb_state *mrb, mrb_value x)
static mrb_value
fix_divmod(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
-
- mrb_get_args(mrb, "o", &y);
+ mrb_value y = mrb_get_arg1(mrb);
if (mrb_fixnum_p(y)) {
mrb_int div, mod;
@@ -967,12 +968,10 @@ fix_divmod(mrb_state *mrb, mrb_value x)
static mrb_value
flo_divmod(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
mrb_float div, mod;
mrb_value a, b;
- mrb_get_args(mrb, "o", &y);
-
flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod);
a = mrb_int_value(mrb, div);
b = mrb_float_value(mrb, mod);
@@ -995,9 +994,8 @@ flo_divmod(mrb_state *mrb, mrb_value x)
static mrb_value
fix_equal(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
switch (mrb_type(y)) {
case MRB_TT_FIXNUM:
return mrb_bool_value(mrb_fixnum(x) == mrb_fixnum(y));
@@ -1054,9 +1052,8 @@ static mrb_value flo_xor(mrb_state *mrb, mrb_value x);
static mrb_value
fix_and(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
bit_op(x, y, and, &);
}
@@ -1071,9 +1068,8 @@ fix_and(mrb_state *mrb, mrb_value x)
static mrb_value
fix_or(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
bit_op(x, y, or, |);
}
@@ -1088,9 +1084,8 @@ fix_or(mrb_state *mrb, mrb_value x)
static mrb_value
fix_xor(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
bit_op(x, y, or, ^);
}
@@ -1312,9 +1307,8 @@ mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y)
static mrb_value
fix_plus(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &other);
return fixnum_plus(mrb, self, other);
}
@@ -1370,9 +1364,8 @@ mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y)
static mrb_value
fix_minus(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &other);
return fixnum_minus(mrb, self, other);
}
@@ -1383,6 +1376,7 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base)
char buf[MRB_INT_BIT+1];
char *b = buf + sizeof buf;
mrb_int val = mrb_fixnum(x);
+ mrb_value str;
if (base < 2 || 36 < base) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %i", base);
@@ -1403,7 +1397,9 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base)
} while (val /= base);
}
- return mrb_str_new(mrb, b, buf + sizeof(buf) - b);
+ str = mrb_str_new(mrb, b, buf + sizeof(buf) - b);
+ RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
+ return str;
}
/* 15.2.8.3.25 */
@@ -1474,21 +1470,21 @@ cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2)
/* 15.2.9.3.6 */
/*
* call-seq:
- * self.f <=> other.f => -1, 0, +1
+ * self.f <=> other.f => -1, 0, +1, or nil
* < => -1
* = => 0
* > => +1
* Comparison---Returns -1, 0, or +1 depending on whether <i>fix</i> is
* less than, equal to, or greater than <i>numeric</i>. This is the
- * basis for the tests in <code>Comparable</code>.
+ * basis for the tests in <code>Comparable</code>. When the operands are
+ * not comparable, it returns nil instead of raising an exception.
*/
static mrb_value
integral_cmp(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
mrb_int n;
- mrb_get_args(mrb, "o", &other);
n = cmpnum(mrb, self, other);
if (n == -2) return mrb_nil_value();
return mrb_fixnum_value(n);
@@ -1503,10 +1499,9 @@ cmperr(mrb_state *mrb, mrb_value v1, mrb_value v2)
static mrb_value
integral_lt(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
mrb_int n;
- mrb_get_args(mrb, "o", &other);
n = cmpnum(mrb, self, other);
if (n == -2) cmperr(mrb, self, other);
if (n < 0) return mrb_true_value();
@@ -1516,10 +1511,9 @@ integral_lt(mrb_state *mrb, mrb_value self)
static mrb_value
integral_le(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
mrb_int n;
- mrb_get_args(mrb, "o", &other);
n = cmpnum(mrb, self, other);
if (n == -2) cmperr(mrb, self, other);
if (n <= 0) return mrb_true_value();
@@ -1529,10 +1523,9 @@ integral_le(mrb_state *mrb, mrb_value self)
static mrb_value
integral_gt(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
mrb_int n;
- mrb_get_args(mrb, "o", &other);
n = cmpnum(mrb, self, other);
if (n == -2) cmperr(mrb, self, other);
if (n > 0) return mrb_true_value();
@@ -1542,10 +1535,9 @@ integral_gt(mrb_state *mrb, mrb_value self)
static mrb_value
integral_ge(mrb_state *mrb, mrb_value self)
{
- mrb_value other;
+ mrb_value other = mrb_get_arg1(mrb);
mrb_int n;
- mrb_get_args(mrb, "o", &other);
n = cmpnum(mrb, self, other);
if (n == -2) cmperr(mrb, self, other);
if (n >= 0) return mrb_true_value();
@@ -1597,9 +1589,8 @@ num_infinite_p(mrb_state *mrb, mrb_value self)
static mrb_value
flo_plus(mrb_state *mrb, mrb_value x)
{
- mrb_value y;
+ mrb_value y = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &y);
return mrb_float_value(mrb, mrb_float(x) + mrb_to_flo(mrb, y));
}
#endif
diff --git a/src/object.c b/src/object.c
index 33d570331..7257f402d 100644
--- a/src/object.c
+++ b/src/object.c
@@ -47,6 +47,17 @@ mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
mrb_value result;
if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE;
+#ifndef MRB_WITHOUT_FLOAT
+ /* value mixing with integer and float */
+ if (mrb_fixnum_p(obj1)) {
+ if (mrb_float_p(obj2) && (mrb_float)mrb_fixnum(obj1) == mrb_float(obj2))
+ return TRUE;
+ }
+ else if (mrb_float_p(obj1)) {
+ if (mrb_fixnum_p(obj2) && mrb_float(obj1) == (mrb_float)mrb_fixnum(obj2))
+ return TRUE;
+ }
+#endif
result = mrb_funcall(mrb, obj1, "==", 1, obj2);
if (mrb_test(result)) return TRUE;
return FALSE;
@@ -83,13 +94,17 @@ mrb_true(mrb_state *mrb, mrb_value obj)
static mrb_value
nil_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new_frozen(mrb, 0, 0);
+ mrb_value str = mrb_str_new_frozen(mrb, 0, 0);
+ RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
+ return str;
}
static mrb_value
nil_inspect(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new_lit_frozen(mrb, "nil");
+ mrb_value str = mrb_str_new_lit_frozen(mrb, "nil");
+ RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
+ return str;
}
/***********************************************************************
@@ -150,7 +165,9 @@ true_xor(mrb_state *mrb, mrb_value obj)
static mrb_value
true_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new_lit_frozen(mrb, "true");
+ mrb_value str = mrb_str_new_lit_frozen(mrb, "true");
+ RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
+ return str;
}
/* 15.2.5.3.4 */
@@ -257,7 +274,9 @@ false_or(mrb_state *mrb, mrb_value obj)
static mrb_value
false_to_s(mrb_state *mrb, mrb_value obj)
{
- return mrb_str_new_lit_frozen(mrb, "false");
+ mrb_value str = mrb_str_new_lit_frozen(mrb, "false");
+ RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
+ return str;
}
void
@@ -319,6 +338,7 @@ mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char
if (mrb_type(val) == type) return val;
v = convert_type(mrb, val, tname, method, TRUE);
if (mrb_type(v) != type) {
+ if (type == MRB_TT_STRING) return mrb_any_to_s(mrb, val);
mrb_raisef(mrb, E_TYPE_ERROR, "%v cannot be converted to %s by #%s", val, tname, method);
}
return v;
@@ -358,7 +378,6 @@ static const struct types {
{MRB_TT_STRING, "String"},
{MRB_TT_RANGE, "Range"},
/* {MRB_TT_BIGNUM, "Bignum"}, */
- {MRB_TT_FILE, "File"},
{MRB_TT_DATA, "Data"}, /* internal use: wrapped C pointers */
/* {MRB_TT_VARMAP, "Varmap"}, */ /* internal use: dynamic variables */
/* {MRB_TT_NODE, "Node"}, */ /* internal use: syntax tree node */
diff --git a/src/print.c b/src/print.c
index 7d2d16086..a75814d81 100644
--- a/src/print.c
+++ b/src/print.c
@@ -7,24 +7,48 @@
#include <mruby.h>
#include <mruby/string.h>
#include <mruby/variable.h>
+#include <mruby/error.h>
+#include <string.h>
#ifndef MRB_DISABLE_STDIO
static void
+printcstr(const char *str, size_t len, FILE *stream)
+{
+ if (str) {
+ fwrite(str, len, 1, stream);
+ putc('\n', stream);
+ }
+}
+
+static void
printstr(mrb_value obj, FILE *stream)
{
if (mrb_string_p(obj)) {
- fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stream);
- putc('\n', stream);
+ printcstr(RSTRING_PTR(obj), RSTRING_LEN(obj), stream);
}
}
#else
+# define printcstr(str, len, stream) (void)0
# define printstr(obj, stream) (void)0
#endif
+void
+mrb_core_init_printabort(void)
+{
+ static const char *str = "Failed mruby core initialization";
+ printcstr(str, strlen(str), stdout);
+}
+
MRB_API void
mrb_p(mrb_state *mrb, mrb_value obj)
{
- printstr(mrb_inspect(mrb, obj), stdout);
+ if (mrb_type(obj) == MRB_TT_EXCEPTION && mrb_obj_ptr(obj) == mrb->nomem_err) {
+ static const char *str = "Out of memory";
+ printcstr(str, strlen(str), stdout);
+ }
+ else {
+ printstr(mrb_inspect(mrb, obj), stdout);
+ }
}
MRB_API void
diff --git a/src/proc.c b/src/proc.c
index 0bc313eb9..c00b09acf 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -8,6 +8,7 @@
#include <mruby/class.h>
#include <mruby/proc.h>
#include <mruby/opcode.h>
+#include <mruby/data.h>
static const mrb_code call_iseq[] = {
OP_CALL,
@@ -46,7 +47,7 @@ env_new(mrb_state *mrb, mrb_int nlocals)
int bidx;
e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL);
- MRB_ENV_SET_STACK_LEN(e, nlocals);
+ MRB_ENV_SET_LEN(e, nlocals);
bidx = ci->argc;
if (ci->argc < 0) bidx = 2;
else bidx += 1;
@@ -121,8 +122,15 @@ mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const
p->e.env = e = env_new(mrb, argc);
p->flags |= MRB_PROC_ENVSET;
mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)e);
- MRB_ENV_UNSHARE_STACK(e);
+ MRB_ENV_CLOSE(e);
+
+ /* NOTE: Prevents keeping invalid addresses when NoMemoryError is raised from `mrb_malloc()`. */
+ e->stack = NULL;
+ MRB_ENV_SET_LEN(e, 0);
+
e->stack = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * argc);
+ MRB_ENV_SET_LEN(e, argc);
+
if (argv) {
for (i = 0; i < argc; ++i) {
e->stack[i] = argv[i];
@@ -155,9 +163,9 @@ mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx)
if (!e) {
mrb_raise(mrb, E_TYPE_ERROR, "Can't get cfunc env from cfunc Proc without REnv.");
}
- if (idx < 0 || MRB_ENV_STACK_LEN(e) <= idx) {
+ if (idx < 0 || MRB_ENV_LEN(e) <= idx) {
mrb_raisef(mrb, E_INDEX_ERROR, "Env index out of range: %i (expected: 0 <= index < %i)",
- idx, MRB_ENV_STACK_LEN(e));
+ idx, MRB_ENV_LEN(e));
}
return e->stack[idx];
@@ -203,9 +211,8 @@ mrb_proc_s_new(mrb_state *mrb, mrb_value proc_class)
static mrb_value
mrb_proc_init_copy(mrb_state *mrb, mrb_value self)
{
- mrb_value proc;
+ mrb_value proc = mrb_get_arg1(mrb);
- mrb_get_args(mrb, "o", &proc);
if (!mrb_proc_p(proc)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc");
}
@@ -286,14 +293,25 @@ mrb_proc_arity(const struct RProc *p)
return arity;
}
+static void
+tempirep_free(mrb_state *mrb, void *p)
+{
+ if (p) mrb_irep_free(mrb, (mrb_irep *)p);
+}
+
+static const mrb_data_type tempirep_type = { "temporary irep", tempirep_free };
+
void
mrb_init_proc(mrb_state *mrb)
{
struct RProc *p;
mrb_method_t m;
- mrb_irep *call_irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
+ struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
+ mrb_irep *call_irep;
static const mrb_irep mrb_irep_zero = { 0 };
+ call_irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
+ irep_obj->data = call_irep;
*call_irep = mrb_irep_zero;
call_irep->flags = MRB_ISEQ_NO_FREE;
call_irep->iseq = call_iseq;
@@ -305,6 +323,7 @@ mrb_init_proc(mrb_state *mrb)
mrb_define_method(mrb, mrb->proc_class, "arity", proc_arity, MRB_ARGS_NONE());
p = mrb_proc_new(mrb, call_irep);
+ irep_obj->data = NULL;
MRB_METHOD_FROM_PROC(m, p);
mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "call"), m);
mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "[]"), m);
diff --git a/src/range.c b/src/range.c
index 6df5d13a3..0b4e6dbca 100644
--- a/src/range.c
+++ b/src/range.c
@@ -182,11 +182,9 @@ range_eq(mrb_state *mrb, mrb_value range)
{
struct RRange *rr;
struct RRange *ro;
- mrb_value obj;
+ mrb_value obj = mrb_get_arg1(mrb);
mrb_bool v1, v2;
- mrb_get_args(mrb, "o", &obj);
-
if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value();
if (!mrb_obj_is_instance_of(mrb, obj, mrb_obj_class(mrb, range))) { /* same class? */
return mrb_false_value();
@@ -211,13 +209,11 @@ range_eq(mrb_state *mrb, mrb_value range)
static mrb_value
range_include(mrb_state *mrb, mrb_value range)
{
- mrb_value val;
+ mrb_value val = mrb_get_arg1(mrb);
struct RRange *r = mrb_range_ptr(mrb, range);
mrb_value beg, end;
mrb_bool include_p;
- mrb_get_args(mrb, "o", &val);
-
beg = RANGE_BEG(r);
end = RANGE_END(r);
include_p = r_le(mrb, beg, val) && /* beg <= val */
@@ -289,11 +285,9 @@ range_inspect(mrb_state *mrb, mrb_value range)
static mrb_value
range_eql(mrb_state *mrb, mrb_value range)
{
- mrb_value obj;
+ mrb_value obj = mrb_get_arg1(mrb);
struct RRange *r, *o;
- mrb_get_args(mrb, "o", &obj);
-
if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value();
if (!mrb_obj_is_kind_of(mrb, obj, mrb->range_class)) return mrb_false_value();
if (!mrb_range_p(obj)) return mrb_false_value();
@@ -312,11 +306,9 @@ range_eql(mrb_state *mrb, mrb_value range)
static mrb_value
range_initialize_copy(mrb_state *mrb, mrb_value copy)
{
- mrb_value src;
+ mrb_value src = mrb_get_arg1(mrb);
struct RRange *r;
- mrb_get_args(mrb, "o", &src);
-
if (mrb_obj_equal(mrb, copy, src)) return copy;
if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) {
mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
diff --git a/src/state.c b/src/state.c
index 3e5ebb483..790f7ca13 100644
--- a/src/state.c
+++ b/src/state.c
@@ -19,11 +19,25 @@ void mrb_init_mrbgems(mrb_state*);
void mrb_gc_init(mrb_state*, mrb_gc *gc);
void mrb_gc_destroy(mrb_state*, mrb_gc *gc);
+int mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state *, void *), void *opaque);
+
+static void
+init_gc_and_core(mrb_state *mrb, void *opaque)
+{
+ static const struct mrb_context mrb_context_zero = { 0 };
+
+ mrb_gc_init(mrb, &mrb->gc);
+ mrb->c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
+ *mrb->c = mrb_context_zero;
+ mrb->root_c = mrb->c;
+
+ mrb_init_core(mrb);
+}
+
MRB_API mrb_state*
mrb_open_core(mrb_allocf f, void *ud)
{
static const mrb_state mrb_state_zero = { 0 };
- static const struct mrb_context mrb_context_zero = { 0 };
mrb_state *mrb;
if (f == NULL) f = mrb_default_allocf;
@@ -35,12 +49,10 @@ mrb_open_core(mrb_allocf f, void *ud)
mrb->allocf = f;
mrb->atexit_stack_len = 0;
- mrb_gc_init(mrb, &mrb->gc);
- mrb->c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
- *mrb->c = mrb_context_zero;
- mrb->root_c = mrb->c;
-
- mrb_init_core(mrb);
+ if (mrb_core_init_protect(mrb, init_gc_and_core, NULL)) {
+ mrb_close(mrb);
+ return NULL;
+ }
return mrb;
}
@@ -65,6 +77,12 @@ mrb_open(void)
return mrb;
}
+static void
+init_mrbgems(mrb_state *mrb, void *opaque)
+{
+ mrb_init_mrbgems(mrb);
+}
+
MRB_API mrb_state*
mrb_open_allocf(mrb_allocf f, void *ud)
{
@@ -75,7 +93,10 @@ mrb_open_allocf(mrb_allocf f, void *ud)
}
#ifndef DISABLE_GEMS
- mrb_init_mrbgems(mrb);
+ if (mrb_core_init_protect(mrb, init_mrbgems, NULL)) {
+ mrb_close(mrb);
+ return NULL;
+ }
mrb_gc_arena_restore(mrb, 0);
#endif
return mrb;
@@ -131,9 +152,11 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
}
mrb_free(mrb, irep->pool);
mrb_free(mrb, irep->syms);
- for (i=0; i<irep->rlen; i++) {
- if (irep->reps[i])
- mrb_irep_decref(mrb, irep->reps[i]);
+ if (irep->reps) {
+ for (i=0; i<irep->rlen; i++) {
+ if (irep->reps[i])
+ mrb_irep_decref(mrb, irep->reps[i]);
+ }
}
mrb_free(mrb, irep->reps);
mrb_free(mrb, irep->lv);
@@ -141,8 +164,6 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
mrb_free(mrb, irep);
}
-void mrb_free_backtrace(mrb_state *mrb);
-
MRB_API void
mrb_free_context(mrb_state *mrb, struct mrb_context *c)
{
diff --git a/src/string.c b/src/string.c
index c7b9db17a..f2c52404e 100644
--- a/src/string.c
+++ b/src/string.c
@@ -301,8 +301,8 @@ static const char utf8len_codepage[256] =
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,
};
-static mrb_int
-utf8len(const char* p, const char* e)
+mrb_int
+mrb_utf8len(const char* p, const char* e)
{
mrb_int len;
mrb_int i;
@@ -318,14 +318,14 @@ utf8len(const char* p, const char* e)
}
mrb_int
-mrb_utf8_len(const char *str, mrb_int byte_len)
+mrb_utf8_strlen(const char *str, mrb_int byte_len)
{
mrb_int total = 0;
const char *p = str;
const char *e = p + byte_len;
while (p < e) {
- p += utf8len(p, e);
+ p += mrb_utf8len(p, e);
total++;
}
return total;
@@ -341,7 +341,7 @@ utf8_strlen(mrb_value str)
return byte_len;
}
else {
- mrb_int utf8_len = mrb_utf8_len(RSTR_PTR(s), byte_len);
+ mrb_int utf8_len = mrb_utf8_strlen(RSTR_PTR(s), byte_len);
if (byte_len == utf8_len) RSTR_SET_ASCII_FLAG(s);
return utf8_len;
}
@@ -362,7 +362,7 @@ chars2bytes(mrb_value s, mrb_int off, mrb_int idx)
const char *e = RSTRING_END(s);
for (b=i=0; p<e && i<idx; i++) {
- n = utf8len(p, e);
+ n = mrb_utf8len(p, e);
b += n;
p += n;
}
@@ -379,7 +379,7 @@ bytes2chars(char *p, mrb_int len, mrb_int bi)
mrb_int i;
for (i = 0; p < pivot; i ++) {
- p += utf8len(p, e);
+ p += mrb_utf8len(p, e);
}
if (p != pivot) return -1;
return i;
@@ -400,7 +400,7 @@ char_adjust(const char *beg, const char *end, const char *ptr)
while (p > beg) {
p --;
if ((*p & 0xc0) != 0x80) {
- int clen = utf8len(p, end);
+ int clen = mrb_utf8len(p, end);
if (clen > ptr - p) return p;
break;
}
@@ -463,10 +463,10 @@ str_index_str_by_char_search(mrb_state *mrb, const char *p, const char *pend, co
}
pivot = p + qstable[(unsigned char)p[slen - 1]];
- if (pivot > pend || pivot < p /* overflowed */) { return -1; }
+ if (pivot >= pend || pivot < p /* overflowed */) { return -1; }
do {
- p += utf8len(p, pend);
+ p += mrb_utf8len(p, pend);
off ++;
} while (p < pivot);
}
@@ -485,7 +485,7 @@ str_index_str_by_char(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
for (; pos > 0; pos --) {
if (pend - p < 1) { return -1; }
- p += utf8len(p, pend);
+ p += mrb_utf8len(p, pend);
}
if (slen < 1) { return off; }
@@ -504,25 +504,45 @@ str_index_str_by_char(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
#define str_index_str_by_char(mrb, str, sub, pos) str_index_str(mrb, str, sub, pos)
#endif
+#ifndef MRB_QS_SHORT_STRING_LENGTH
+#define MRB_QS_SHORT_STRING_LENGTH 2048
+#endif
+
static inline mrb_int
mrb_memsearch_qs(const unsigned char *xs, mrb_int m, const unsigned char *ys, mrb_int n)
{
- const unsigned char *x = xs, *xe = xs + m;
- const unsigned char *y = ys;
- int i;
- ptrdiff_t qstable[256];
+ if (n + m < MRB_QS_SHORT_STRING_LENGTH) {
+ const unsigned char *y = ys;
+ const unsigned char *ye = ys+n-m+1;
- /* Preprocessing */
- for (i = 0; i < 256; ++i)
- qstable[i] = m + 1;
- for (; x < xe; ++x)
- qstable[*x] = xe - x;
- /* Searching */
- for (; y + m <= ys + n; y += *(qstable + y[m])) {
- if (*xs == *y && memcmp(xs, y, m) == 0)
- return (mrb_int)(y - ys);
+ for (;;) {
+ y = (const unsigned char*)memchr(y, xs[0], (size_t)(ye-y));
+ if (y == NULL) return -1;
+ if (memcmp(xs, y, m) == 0) {
+ return (mrb_int)(y - ys);
+ }
+ y++;
+ }
+ return -1;
+ }
+ else {
+ const unsigned char *x = xs, *xe = xs + m;
+ const unsigned char *y = ys;
+ int i;
+ ptrdiff_t qstable[256];
+
+ /* Preprocessing */
+ for (i = 0; i < 256; ++i)
+ qstable[i] = m + 1;
+ for (; x < xe; ++x)
+ qstable[*x] = xe - x;
+ /* Searching */
+ for (; y + m <= ys + n; y += *(qstable + y[m])) {
+ if (*xs == *y && memcmp(xs, y, m) == 0)
+ return (mrb_int)(y - ys);
+ }
+ return -1;
}
- return -1;
}
static mrb_int
@@ -1041,10 +1061,9 @@ mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2)
static mrb_value
mrb_str_cmp_m(mrb_state *mrb, mrb_value str1)
{
- mrb_value str2;
+ mrb_value str2 = mrb_get_arg1(mrb);
mrb_int result;
- mrb_get_args(mrb, "o", &str2);
if (!mrb_string_p(str2)) {
return mrb_nil_value();
}
@@ -1086,9 +1105,7 @@ mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2)
static mrb_value
mrb_str_equal_m(mrb_state *mrb, mrb_value str1)
{
- mrb_value str2;
-
- mrb_get_args(mrb, "o", &str2);
+ mrb_value str2 = mrb_get_arg1(mrb);
return mrb_bool_value(mrb_str_equal(mrb, str1, str2));
}
@@ -1104,6 +1121,7 @@ mrb_str_to_str(mrb_state *mrb, mrb_value str)
return mrb_sym_str(mrb, mrb_symbol(str));
case MRB_TT_FIXNUM:
return mrb_fixnum_to_str(mrb, str, 10);
+ case MRB_TT_SCLASS:
case MRB_TT_CLASS:
case MRB_TT_MODULE:
return mrb_mod_to_s(mrb, str);
@@ -1342,7 +1360,7 @@ str_escape(mrb_state *mrb, mrb_value str, mrb_bool inspect)
unsigned char c, cc;
#ifdef MRB_UTF8_STRING
if (inspect) {
- mrb_int clen = utf8len(p, pend);
+ mrb_int clen = mrb_utf8len(p, pend);
if (clen > 1) {
mrb_int i;
@@ -1645,7 +1663,7 @@ mrb_str_chop_bang(mrb_state *mrb, mrb_value str)
const char* t = RSTR_PTR(s), *p = t;
const char* e = p + RSTR_LEN(s);
while (p<e) {
- mrb_int clen = utf8len(p, e);
+ mrb_int clen = mrb_utf8len(p, e);
if (p + clen>=e) break;
p += clen;
}
@@ -1771,10 +1789,9 @@ mrb_str_empty_p(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_str_eql(mrb_state *mrb, mrb_value self)
{
- mrb_value str2;
+ mrb_value str2 = mrb_get_arg1(mrb);
mrb_bool eql_p;
- mrb_get_args(mrb, "o", &str2);
eql_p = (mrb_string_p(str2)) && str_eql(mrb, self, str2);
return mrb_bool_value(eql_p);
@@ -2017,7 +2034,7 @@ mrb_str_reverse_bang(mrb_state *mrb, mrb_value str)
p = RSTR_PTR(s);
e = p + RSTR_LEN(s);
while (p<e) {
- mrb_int clen = utf8len(p, e);
+ mrb_int clen = mrb_utf8len(p, e);
str_reverse(p, p + clen - 1);
p += clen;
}
@@ -2241,7 +2258,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
}
mrb_value
-mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base, int badcheck)
+mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, int badcheck)
{
const char *p = str;
const char *pend = str + len;
@@ -2739,7 +2756,7 @@ mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)
MRB_API mrb_value
mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr)
{
- return mrb_str_cat(mrb, str, ptr, strlen(ptr));
+ return mrb_str_cat(mrb, str, ptr, ptr ? strlen(ptr) : 0);
}
MRB_API mrb_value
@@ -2869,25 +2886,32 @@ mrb_str_setbyte(mrb_state *mrb, mrb_value str)
static mrb_value
mrb_str_byteslice(mrb_state *mrb, mrb_value str)
{
- mrb_value a1, a2;
+ mrb_value a1;
mrb_int str_len = RSTRING_LEN(str), beg, len;
mrb_bool empty = TRUE;
- if (mrb_get_args(mrb, "o|o", &a1, &a2) == 2) {
- beg = mrb_fixnum(mrb_to_int(mrb, a1));
- len = mrb_fixnum(mrb_to_int(mrb, a2));
- }
- else if (mrb_range_p(a1)) {
- if (mrb_range_beg_len(mrb, a1, &beg, &len, str_len, TRUE) != MRB_RANGE_OK) {
- return mrb_nil_value();
+ len = mrb_get_argc(mrb);
+ switch (len) {
+ case 2:
+ mrb_get_args(mrb, "ii", &beg, &len);
+ break;
+ case 1:
+ a1 = mrb_get_arg1(mrb);
+ if (mrb_range_p(a1)) {
+ if (mrb_range_beg_len(mrb, a1, &beg, &len, str_len, TRUE) != MRB_RANGE_OK) {
+ return mrb_nil_value();
+ }
}
+ else {
+ beg = mrb_fixnum(mrb_to_int(mrb, a1));
+ len = 1;
+ empty = FALSE;
+ }
+ break;
+ default:
+ mrb_argnum_error(mrb, len, 1, 2);
+ break;
}
- else {
- beg = mrb_fixnum(mrb_to_int(mrb, a1));
- len = 1;
- empty = FALSE;
- }
-
if (mrb_str_beg_len(str_len, &beg, &len) && (empty || len != 0)) {
return mrb_str_byte_subseq(mrb, str, beg, len);
}
diff --git a/src/symbol.c b/src/symbol.c
index b8d0ea1e7..992848797 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -48,14 +48,14 @@ sym_validate_len(mrb_state *mrb, size_t len)
static const char pack_table[] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
static mrb_sym
-sym_inline_pack(const char *name, uint16_t len)
+sym_inline_pack(const char *name, size_t len)
{
- const int lower_length_max = (MRB_SYMBOL_BIT - 2) / 5;
- const int mix_length_max = (MRB_SYMBOL_BIT - 2) / 6;
+ const size_t lower_length_max = (MRB_SYMBOL_BIT - 2) / 5;
+ const size_t mix_length_max = (MRB_SYMBOL_BIT - 2) / 6;
char c;
const char *p;
- int i;
+ size_t i;
mrb_sym sym = 0;
mrb_bool lower = TRUE;
@@ -124,7 +124,7 @@ symhash(const char *key, size_t len)
}
static mrb_sym
-find_symbol(mrb_state *mrb, const char *name, uint16_t len, uint8_t *hashp)
+find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp)
{
mrb_sym i;
symbol_name *sname;
@@ -172,11 +172,13 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit)
if (sym > 0) return sym;
/* registering a new symbol */
- sym = ++mrb->symidx;
+ sym = mrb->symidx + 1;
if (mrb->symcapa < sym) {
- if (mrb->symcapa == 0) mrb->symcapa = 100;
- else mrb->symcapa = (size_t)(mrb->symcapa * 6 / 5);
- mrb->symtbl = (symbol_name*)mrb_realloc(mrb, mrb->symtbl, sizeof(symbol_name)*(mrb->symcapa+1));
+ size_t symcapa = mrb->symcapa;
+ if (symcapa == 0) symcapa = 100;
+ else symcapa = (size_t)(symcapa * 6 / 5);
+ mrb->symtbl = (symbol_name*)mrb_realloc(mrb, mrb->symtbl, sizeof(symbol_name)*(symcapa+1));
+ mrb->symcapa = symcapa;
}
sname = &mrb->symtbl[sym];
sname->len = (uint16_t)len;
@@ -201,7 +203,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit)
else {
sname->prev = 0;
}
- mrb->symhash[hash] = sym;
+ mrb->symhash[hash] = mrb->symidx = sym;
return sym<<SYMBOL_NORMAL_SHIFT;
}
@@ -562,10 +564,9 @@ mrb_sym_dump(mrb_state *mrb, mrb_sym sym)
static mrb_value
sym_cmp(mrb_state *mrb, mrb_value s1)
{
- mrb_value s2;
+ mrb_value s2 = mrb_get_arg1(mrb);
mrb_sym sym1, sym2;
- mrb_get_args(mrb, "o", &s2);
if (!mrb_symbol_p(s2)) return mrb_nil_value();
sym1 = mrb_symbol(s1);
sym2 = mrb_symbol(s2);
diff --git a/src/variable.c b/src/variable.c
index 030aa7b00..c36fea6e3 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -349,7 +349,7 @@ mrb_obj_iv_set_force(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value
obj->iv = iv_new(mrb);
}
iv_put(mrb, obj->iv, sym, v);
- mrb_write_barrier(mrb, (struct RBasic*)obj);
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)obj, v);
}
MRB_API void
@@ -679,7 +679,7 @@ mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
if (iv_get(mrb, t, sym, NULL)) {
mrb_check_frozen(mrb, c);
iv_put(mrb, t, sym, v);
- mrb_write_barrier(mrb, (struct RBasic*)c);
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)c, v);
return;
}
c = c->super;
@@ -711,7 +711,7 @@ mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
}
iv_put(mrb, c->iv, sym, v);
- mrb_write_barrier(mrb, (struct RBasic*)c);
+ mrb_field_write_barrier_value(mrb, (struct RBasic*)c, v);
}
MRB_API void
@@ -1128,6 +1128,21 @@ mrb_class_find_path(mrb_state *mrb, struct RClass *c)
return path;
}
+size_t
+mrb_obj_iv_tbl_memsize(mrb_state* mrb, mrb_value obj)
+{
+ size_t nseg = 0;
+ segment *seg;
+
+ if (mrb_obj_ptr(obj)->iv == NULL) return 0;
+ seg = mrb_obj_ptr(obj)->iv->rootseg;
+ while (seg) {
+ nseg++;
+ seg = seg->next;
+ }
+ return sizeof(iv_tbl) + sizeof(segment)*nseg;
+}
+
#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
mrb_bool
diff --git a/src/vm.c b/src/vm.c
index 2ccc03e30..cc9a187b7 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -102,26 +102,20 @@ void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value
static inline void
stack_clear(mrb_value *from, size_t count)
{
-#ifndef MRB_NAN_BOXING
- const mrb_value mrb_value_zero = { { 0 } };
-
- while (count-- > 0) {
- *from++ = mrb_value_zero;
- }
-#else
+#ifdef MRB_NAN_BOXING
while (count-- > 0) {
SET_NIL_VALUE(*from);
from++;
}
+#else
+ memset(from, 0, sizeof(mrb_value)*count);
#endif
}
static inline void
stack_copy(mrb_value *dst, const mrb_value *src, size_t size)
{
- while (size-- > 0) {
- *dst++ = *src++;
- }
+ memcpy(dst, src, sizeof(mrb_value)*size);
}
static void
@@ -152,7 +146,7 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize
struct REnv *e = ci->env;
mrb_value *st;
- if (e && MRB_ENV_STACK_SHARED_P(e) &&
+ if (e && MRB_ENV_ONSTACK_P(e) &&
(st = e->stack) && oldbase <= st && st < oldbase+oldsize) {
ptrdiff_t off = e->stack - oldbase;
@@ -162,7 +156,7 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize
if (ci->proc && MRB_PROC_ENV_P(ci->proc) && ci->env != MRB_PROC_ENV(ci->proc)) {
e = MRB_PROC_ENV(ci->proc);
- if (e && MRB_ENV_STACK_SHARED_P(e) &&
+ if (e && MRB_ENV_ONSTACK_P(e) &&
(st = e->stack) && oldbase <= st && st < oldbase+oldsize) {
ptrdiff_t off = e->stack - oldbase;
@@ -269,14 +263,12 @@ top_proc(mrb_state *mrb, struct RProc *proc)
#define CI_ACC_RESUMED -3
static inline mrb_callinfo*
-cipush(mrb_state *mrb)
+cipush(mrb_state *mrb, const mrb_code *pc, int push_stacks, int acc,
+ struct RClass *target_class, struct RProc *proc, mrb_sym mid, int argc)
{
struct mrb_context *c = mrb->c;
- static const mrb_callinfo ci_zero = { 0 };
mrb_callinfo *ci = c->ci;
- int ridx = ci->ridx;
-
if (ci + 1 == c->ciend) {
ptrdiff_t size = ci - c->cibase;
@@ -285,9 +277,18 @@ cipush(mrb_state *mrb)
c->ciend = c->cibase + size * 2;
}
ci = ++c->ci;
- *ci = ci_zero;
- ci->epos = mrb->c->eidx;
- ci->ridx = ridx;
+ ci->mid = mid;
+ ci->proc = proc;
+ ci->stackent = c->stack;
+ ci->epos = c->eidx;
+ ci->ridx = ci[-1].ridx;
+ ci->pc = pc;
+ ci->argc = argc;
+ ci->acc = acc;
+ ci->target_class = target_class;
+ ci->err = 0;
+ ci->env = 0;
+ c->stack += push_stacks;
return ci;
}
@@ -297,10 +298,10 @@ mrb_env_unshare(mrb_state *mrb, struct REnv *e)
{
if (e == NULL) return;
else {
- size_t len = (size_t)MRB_ENV_STACK_LEN(e);
+ size_t len = (size_t)MRB_ENV_LEN(e);
mrb_value *p;
- if (!MRB_ENV_STACK_SHARED_P(e)) return;
+ if (!MRB_ENV_ONSTACK_P(e)) return;
if (e->cxt != mrb->c) return;
if (e == mrb->c->cibase->env) return; /* for mirb */
p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
@@ -308,22 +309,25 @@ mrb_env_unshare(mrb_state *mrb, struct REnv *e)
stack_copy(p, e->stack, len);
}
e->stack = p;
- MRB_ENV_UNSHARE_STACK(e);
+ MRB_ENV_CLOSE(e);
mrb_write_barrier(mrb, (struct RBasic *)e);
}
}
-static inline void
+static inline mrb_callinfo*
cipop(mrb_state *mrb)
{
struct mrb_context *c = mrb->c;
struct REnv *env = c->ci->env;
+ mrb->c->stack = c->ci->stackent;
c->ci--;
if (env) mrb_env_unshare(mrb, env);
+ return c->ci;
}
void mrb_exc_set(mrb_state *mrb, mrb_value exc);
+static mrb_value mrb_run(mrb_state *mrb, struct RProc* proc, mrb_value self);
static void
ecall(mrb_state *mrb)
@@ -335,10 +339,12 @@ ecall(mrb_state *mrb)
struct REnv *env;
ptrdiff_t cioff;
int ai = mrb_gc_arena_save(mrb);
- uint16_t i = --c->eidx;
+ uint16_t i;
int nregs;
- if (i<0) return;
+ if (c->eidx == 0) return;
+ i = --c->eidx;
+
/* restrict total call depth of ecall() */
if (++mrb->ecall_nest > MRB_ECALL_DEPTH_MAX) {
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
@@ -353,16 +359,9 @@ ecall(mrb_state *mrb)
nregs = ci->proc->body.irep->nregs;
}
cioff = ci - c->cibase;
- ci = cipush(mrb);
- ci->stackent = mrb->c->stack;
- ci->mid = ci[-1].mid;
- ci->acc = CI_ACC_SKIP;
- ci->argc = 0;
- ci->proc = p;
- ci->target_class = MRB_PROC_TARGET_CLASS(p);
+ ci = cipush(mrb, NULL, nregs, CI_ACC_SKIP, MRB_PROC_TARGET_CLASS(p), p, ci->mid, 0);
env = MRB_PROC_ENV(p);
mrb_assert(env);
- c->stack += nregs;
exc = mrb->exc; mrb->exc = 0;
if (exc) {
mrb_gc_protect(mrb, mrb_obj_value(exc));
@@ -430,6 +429,7 @@ MRB_API mrb_value
mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, const mrb_value *argv, mrb_value blk)
{
mrb_value val;
+ int ai = mrb_gc_arena_save(mrb);
if (!mrb->jmp) {
struct mrb_jmpbuf c_jmp;
@@ -443,7 +443,6 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
}
MRB_CATCH(&c_jmp) { /* error */
while (nth_ci < (mrb->c->ci - mrb->c->cibase)) {
- mrb->c->stack = mrb->c->ci->stackent;
cipop(mrb);
}
mrb->jmp = 0;
@@ -482,12 +481,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) {
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
}
- ci = cipush(mrb);
- ci->mid = mid;
- ci->stackent = mrb->c->stack;
- ci->argc = (int)argc;
- ci->target_class = c;
- mrb->c->stack = mrb->c->stack + n;
+ ci = cipush(mrb, NULL, n, 0, c, NULL, mid, argc);
if (argc < 0) argc = 1;
if (mrb->c->stbase <= argv && argv < mrb->c->stend) {
voff = argv - mrb->c->stbase;
@@ -518,19 +512,16 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
mrb->c->stack[argc+1] = blk;
if (MRB_METHOD_CFUNC_P(m)) {
- int ai = mrb_gc_arena_save(mrb);
-
ci->acc = CI_ACC_DIRECT;
val = MRB_METHOD_CFUNC(m)(mrb, self);
- mrb->c->stack = mrb->c->ci->stackent;
cipop(mrb);
- mrb_gc_arena_restore(mrb, ai);
}
else {
ci->acc = CI_ACC_SKIP;
val = mrb_run(mrb, MRB_METHOD_PROC(m), self);
}
}
+ mrb_gc_arena_restore(mrb, ai);
mrb_gc_protect(mrb, val);
return val;
}
@@ -563,11 +554,7 @@ mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
stack_clear(mrb->c->stack+keep, nregs-keep);
}
- ci = cipush(mrb);
- ci->target_class = 0;
- ci->pc = p->body.irep->iseq;
- ci->stackent = mrb->c->stack;
- ci->acc = 0;
+ cipush(mrb, p->body.irep->iseq, 0, 0, NULL, NULL, 0, 0);
return self;
}
@@ -625,7 +612,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
ci->argc--;
}
else { /* variable length arguments */
- mrb_ary_shift(mrb, regs[0]);
+ regs[0] = mrb_ary_subseq(mrb, regs[0], 1, RARRAY_LEN(regs[0]) - 1);
}
if (MRB_METHOD_CFUNC_P(m)) {
@@ -649,8 +636,7 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
}
ci = mrb->c->ci;
if (ci->acc == CI_ACC_DIRECT) {
- ci->target_class = c;
- return mrb_yield_cont(mrb, blk, self, 1, &self);
+ return mrb_yield_with_class(mrb, blk, 1, &self, self, c);
}
ci->target_class = c;
p = mrb_proc_ptr(blk);
@@ -670,11 +656,7 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
mrb->c->stack[0] = self;
mrb->c->stack[1] = self;
stack_clear(mrb->c->stack+2, nregs-2);
- ci = cipush(mrb);
- ci->target_class = 0;
- ci->pc = p->body.irep->iseq;
- ci->stackent = mrb->c->stack;
- ci->acc = 0;
+ ci = cipush(mrb, p->body.irep->iseq, 0, 0, NULL, NULL, 0, 0);
return self;
}
@@ -725,26 +707,11 @@ mrb_value
mrb_obj_instance_eval(mrb_state *mrb, mrb_value self)
{
mrb_value a, b;
- mrb_value cv;
- struct RClass *c;
if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented");
}
- switch (mrb_type(self)) {
- case MRB_TT_SYMBOL:
- case MRB_TT_FIXNUM:
-#ifndef MRB_WITHOUT_FLOAT
- case MRB_TT_FLOAT:
-#endif
- c = 0;
- break;
- default:
- cv = mrb_singleton_class(mrb, self);
- c = mrb_class_ptr(cv);
- break;
- }
- return eval_under(mrb, self, b, c);
+ return eval_under(mrb, self, b, mrb_singleton_class_ptr(mrb, self));
}
MRB_API mrb_value
@@ -765,26 +732,28 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
}
p = mrb_proc_ptr(b);
- ci = cipush(mrb);
- ci->mid = mid;
- ci->proc = p;
- ci->stackent = mrb->c->stack;
- ci->argc = (int)argc;
- ci->target_class = c;
- ci->acc = CI_ACC_SKIP;
- n = MRB_PROC_CFUNC_P(p) ? (int)(argc+2) : p->body.irep->nregs;
- mrb->c->stack = mrb->c->stack + n;
+ ci = cipush(mrb, NULL, n, CI_ACC_SKIP, c, p, mid, 0 /* dummy */);
+ if (argc >= CALL_MAXARGS) {
+ ci->argc = -1;
+ n = 3;
+ }
+ else {
+ ci->argc = (int)argc;
+ n = argc + 2;
+ }
mrb_stack_extend(mrb, n);
-
mrb->c->stack[0] = self;
- if (argc > 0) {
+ if (ci->argc < 0) {
+ mrb->c->stack[1] = mrb_ary_new_from_values(mrb, argc, argv);
+ argc = 1;
+ }
+ else if (argc > 0) {
stack_copy(mrb->c->stack+1, argv, argc);
}
mrb->c->stack[argc+1] = mrb_nil_value();
if (MRB_PROC_CFUNC_P(p)) {
val = MRB_PROC_CFUNC(p)(mrb, self);
- mrb->c->stack = mrb->c->ci->stackent;
cipop(mrb);
}
else {
@@ -1063,6 +1032,11 @@ RETRY_TRY_BLOCK:
NEXT;
}
+ CASE(OP_LOADI16, BS) {
+ SET_INT_VALUE(regs[a], (mrb_int)(int16_t)b);
+ NEXT;
+ }
+
CASE(OP_LOADSYM, BB) {
SET_SYM_VALUE(regs[a], syms[b]);
NEXT;
@@ -1100,13 +1074,13 @@ RETRY_TRY_BLOCK:
}
CASE(OP_GETSV, BB) {
- mrb_value val = mrb_vm_special_get(mrb, b);
+ mrb_value val = mrb_vm_special_get(mrb, syms[b]);
regs[a] = val;
NEXT;
}
CASE(OP_SETSV, BB) {
- mrb_vm_special_set(mrb, b, regs[a]);
+ mrb_vm_special_set(mrb, syms[b], regs[a]);
NEXT;
}
@@ -1169,7 +1143,7 @@ RETRY_TRY_BLOCK:
mrb_value *regs_a = regs + a;
struct REnv *e = uvenv(mrb, c);
- if (e && b < MRB_ENV_STACK_LEN(e)) {
+ if (e && b < MRB_ENV_LEN(e)) {
*regs_a = e->stack[b];
}
else {
@@ -1184,7 +1158,7 @@ RETRY_TRY_BLOCK:
if (e) {
mrb_value *regs_a = regs + a;
- if (b < MRB_ENV_STACK_LEN(e)) {
+ if (b < MRB_ENV_LEN(e)) {
e->stack[b] = *regs_a;
mrb_write_barrier(mrb, (struct RBasic*)e);
}
@@ -1328,15 +1302,7 @@ RETRY_TRY_BLOCK:
mrb->c->ensure[epos+n] = NULL;
if (proc == NULL) continue;
irep = proc->body.irep;
- ci = cipush(mrb);
- ci->mid = ci[-1].mid;
- ci->argc = 0;
- ci->proc = proc;
- ci->stackent = mrb->c->stack;
- ci->target_class = target_class;
- ci->pc = pc;
- ci->acc = nregs;
- mrb->c->stack += ci->acc;
+ ci = cipush(mrb, pc, nregs, nregs, target_class, proc, ci->mid, 0);
mrb_stack_extend(mrb, irep->nregs);
regs[0] = self;
pc = irep->iseq;
@@ -1418,17 +1384,7 @@ RETRY_TRY_BLOCK:
}
/* push callinfo */
- ci = cipush(mrb);
- ci->mid = mid;
- ci->stackent = mrb->c->stack;
- ci->target_class = cls;
- ci->argc = argc;
-
- ci->pc = pc;
- ci->acc = a;
-
- /* prepare stack */
- mrb->c->stack += a;
+ ci = cipush(mrb, pc, a, a, cls, NULL, mid, argc);
if (MRB_METHOD_CFUNC_P(m)) {
if (MRB_METHOD_PROC_P(m)) {
@@ -1470,7 +1426,6 @@ RETRY_TRY_BLOCK:
}
mrb->c->stack[0] = recv;
/* pop stackpos */
- mrb->c->stack = ci->stackent;
pc = ci->pc;
cipop(mrb);
JUMP;
@@ -1497,14 +1452,7 @@ RETRY_TRY_BLOCK:
ci->target_class = MRB_PROC_TARGET_CLASS(m);
ci->proc = m;
if (MRB_PROC_ENV_P(m)) {
- mrb_sym mid;
- struct REnv *e = MRB_PROC_ENV(m);
-
- mid = e->mid;
- if (mid) ci->mid = mid;
- if (!e->stack) {
- e->stack = mrb->c->stack;
- }
+ ci->mid = MRB_PROC_ENV(m)->mid;
}
/* prepare stack */
@@ -1515,10 +1463,9 @@ RETRY_TRY_BLOCK:
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
ci = mrb->c->ci;
- mrb->c->stack = ci->stackent;
- regs[ci->acc] = recv;
pc = ci->pc;
cipop(mrb);
+ regs[ci->acc] = recv;
irep = mrb->c->ci->proc->body.irep;
pool = irep->pool;
syms = irep->syms;
@@ -1624,15 +1571,9 @@ RETRY_TRY_BLOCK:
}
/* push callinfo */
- ci = cipush(mrb);
- ci->mid = mid;
- ci->stackent = mrb->c->stack;
- ci->target_class = cls;
- ci->pc = pc;
- ci->argc = argc;
+ ci = cipush(mrb, pc, a, 0, cls, NULL, mid, argc);
/* prepare stack */
- mrb->c->stack += a;
mrb->c->stack[0] = recv;
if (MRB_METHOD_CFUNC_P(m)) {
@@ -1659,8 +1600,6 @@ RETRY_TRY_BLOCK:
}
}
mrb->c->stack[0] = v;
- /* pop stackpos */
- mrb->c->stack = ci->stackent;
pc = ci->pc;
cipop(mrb);
JUMP;
@@ -1700,7 +1639,7 @@ RETRY_TRY_BLOCK:
else {
struct REnv *e = uvenv(mrb, lv-1);
if (!e) goto L_NOSUPER;
- if (MRB_ENV_STACK_LEN(e) <= m1+r+m2+kd+1)
+ if (MRB_ENV_LEN(e) <= m1+r+m2+kd+1)
goto L_NOSUPER;
stack = e->stack + 1;
}
@@ -1961,13 +1900,11 @@ RETRY_TRY_BLOCK:
goto L_RESCUE;
}
while (ci[0].ridx == ci[-1].ridx) {
- cipop(mrb);
- mrb->c->stack = ci->stackent;
- if (ci->acc == CI_ACC_SKIP && prev_jmp) {
+ ci = cipop(mrb);
+ if (ci[1].acc == CI_ACC_SKIP && prev_jmp) {
mrb->jmp = prev_jmp;
MRB_THROW(prev_jmp);
}
- ci = mrb->c->ci;
if (ci == mrb->c->cibase) {
if (ci->ridx == 0) {
L_FTOP: /* fiber top */
@@ -2026,7 +1963,7 @@ RETRY_TRY_BLOCK:
if (MRB_PROC_ENV_P(dst)) {
struct REnv *e = MRB_PROC_ENV(dst);
- if (!MRB_ENV_STACK_SHARED_P(e) || (e->cxt && e->cxt != mrb->c)) {
+ if (!MRB_ENV_ONSTACK_P(e) || (e->cxt && e->cxt != mrb->c)) {
localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
goto L_RAISE;
}
@@ -2081,7 +2018,7 @@ RETRY_TRY_BLOCK:
mrb_exc_set(mrb, exc);
goto L_RAISE;
}
- if (!MRB_PROC_ENV_P(proc) || !MRB_ENV_STACK_SHARED_P(MRB_PROC_ENV(proc))) {
+ if (!MRB_PROC_ENV_P(proc) || !MRB_ENV_ONSTACK_P(MRB_PROC_ENV(proc))) {
goto L_BREAK_ERROR;
}
else {
@@ -2149,15 +2086,13 @@ RETRY_TRY_BLOCK:
return v;
}
acc = ci->acc;
- mrb->c->stack = ci->stackent;
- cipop(mrb);
+ ci = cipop(mrb);
if (acc == CI_ACC_SKIP || acc == CI_ACC_DIRECT) {
mrb_gc_arena_restore(mrb, ai);
mrb->jmp = prev_jmp;
return v;
}
- pc = ci->pc;
- ci = mrb->c->ci;
+ pc = ci[1].pc;
DEBUG(fprintf(stderr, "from :%s\n", mrb_sym_name(mrb, ci->mid)));
proc = mrb->c->ci->proc;
irep = proc->body.irep;
@@ -2181,8 +2116,8 @@ RETRY_TRY_BLOCK:
if (lv == 0) stack = regs + 1;
else {
struct REnv *e = uvenv(mrb, lv-1);
- if (!e || (!MRB_ENV_STACK_SHARED_P(e) && e->mid == 0) ||
- MRB_ENV_STACK_LEN(e) <= m1+r+m2+1) {
+ if (!e || (!MRB_ENV_ONSTACK_P(e) && e->mid == 0) ||
+ MRB_ENV_LEN(e) <= m1+r+m2+1) {
localjump_error(mrb, LOCALJUMP_ERROR_YIELD);
goto L_RAISE;
}
@@ -2671,7 +2606,6 @@ RETRY_TRY_BLOCK:
}
CASE(OP_EXEC, BB) {
- mrb_callinfo *ci;
mrb_value recv = regs[a];
struct RProc *p;
mrb_irep *nirep = irep->reps[b];
@@ -2684,19 +2618,7 @@ RETRY_TRY_BLOCK:
p->flags |= MRB_PROC_SCOPE;
/* prepare call stack */
- ci = cipush(mrb);
- ci->pc = pc;
- ci->acc = a;
- ci->mid = 0;
- ci->stackent = mrb->c->stack;
- ci->argc = 0;
- ci->target_class = mrb_class_ptr(recv);
-
- /* prepare stack */
- mrb->c->stack += a;
-
- /* setup block to call */
- ci->proc = p;
+ cipush(mrb, pc, a, a, mrb_class_ptr(recv), p, 0, 0);
irep = p->body.irep;
pool = irep->pool;
@@ -2827,7 +2749,7 @@ RETRY_TRY_BLOCK:
MRB_END_EXC(&c_jmp);
}
-MRB_API mrb_value
+static mrb_value
mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
{
if (mrb->c->ci->argc < 0) {
@@ -2841,7 +2763,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
MRB_API mrb_value
mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep)
{
- mrb_callinfo *ci;
mrb_value v;
if (!mrb->c->cibase) {
@@ -2851,11 +2772,7 @@ mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int sta
mrb->c->ci->env = NULL;
return mrb_vm_run(mrb, proc, self, stack_keep);
}
- ci = cipush(mrb);
- ci->stackent = mrb->c->stack;
- ci->mid = 0;
- ci->acc = CI_ACC_SKIP;
- ci->target_class = mrb->object_class;
+ cipush(mrb, NULL, 0, CI_ACC_SKIP, mrb->object_class, NULL, 0, 0);
v = mrb_vm_run(mrb, proc, self, stack_keep);
return v;
diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake
index 84e69ebee..6352f5c17 100644
--- a/tasks/benchmark.rake
+++ b/tasks/benchmark.rake
@@ -5,7 +5,7 @@ end
$dat_files = []
def bm_files
- Dir.glob("#{MRUBY_ROOT}/benchmark/bm_*.rb")
+ Dir.glob("#{MRUBY_ROOT}/benchmark/bm_*.rb").sort
end
def build_config_name
@@ -67,8 +67,8 @@ MRuby.each_target do |target|
puts "..."
data = (0...MRuby::BENCHMARK_REPEAT).map do |n|
- str = %x{(time -f "%e %S %U" #{mruby_bin} #{bm_file}) 2>&1 >/dev/null}
- str.split(' ').map(&:to_f)
+ str = %x{(time -p #{mruby_bin} #{bm_file}) 2>&1 >/dev/null}
+ str.scan(/\d+\.\d+$/).map(&:to_f) # [real, user, sys]
end
File.open(task.name, "w") do |f|
diff --git a/tasks/mrbgems.rake b/tasks/mrbgems.rake
index 8168e4fab..0a3ae652d 100644
--- a/tasks/mrbgems.rake
+++ b/tasks/mrbgems.rake
@@ -5,9 +5,10 @@ MRuby.each_target do
gems.check self
# loader all gems
+ active_gems_txt = "#{build_dir}/mrbgems/active_gems.txt"
self.libmruby_objs << objfile("#{build_dir}/mrbgems/gem_init")
file objfile("#{build_dir}/mrbgems/gem_init") => ["#{build_dir}/mrbgems/gem_init.c", "#{build_dir}/LEGAL"]
- file "#{build_dir}/mrbgems/gem_init.c" => [MRUBY_CONFIG, __FILE__] do |t|
+ file "#{build_dir}/mrbgems/gem_init.c" => [active_gems_txt, MRUBY_CONFIG, __FILE__] do |t|
mkdir_p "#{build_dir}/mrbgems"
open(t.name, 'w') do |f|
gem_func_gems = gems.select { |g| g.generate_functions }
@@ -49,6 +50,15 @@ MRuby.each_target do
f.puts %Q[}]
end
end
+ file active_gems_txt => :generate_active_gems_txt
+ task :generate_active_gems_txt do |t|
+ def t.timestamp; Time.at(0) end
+ active_gems = gems.sort_by(&:name).inject(""){|s, g| s << "#{g.name}\n"}
+ if !File.exist?(active_gems_txt) || File.read(active_gems_txt) != active_gems
+ mkdir_p File.dirname(active_gems_txt)
+ File.write(active_gems_txt, active_gems)
+ end
+ end
end
# legal documents
diff --git a/tasks/toolchains/android.rake b/tasks/toolchains/android.rake
index 0ac4d000c..2368b93b5 100644
--- a/tasks/toolchains/android.rake
+++ b/tasks/toolchains/android.rake
@@ -10,6 +10,7 @@ class MRuby::Toolchain::Android
~/Android/Sdk/ndk-bundle
%LOCALAPPDATA%/Android/android-sdk/ndk-bundle
%LOCALAPPDATA%/Android/android-ndk
+ %LOCALAPPDATA%/Android/Sdk/ndk/*
~/Library/Android/sdk/ndk-bundle
~/Library/Android/ndk
}
@@ -40,6 +41,19 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
end
end
+ class SysrootNotReady < StandardError
+ def message
+ <<-EOM
+Couldn't find standard header files
+Please Move/Copy important file inside
+ <NDK_HOME>/sysroot/usr/include/
+to
+ <NDK_HOME>/platforms/<ANDROID_VERSION>/<ARCH>/usr/include/
+Higher NDK version will be use.
+ EOM
+ end
+ end
+
attr_reader :params
def initialize(params)
@@ -74,6 +88,25 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
path.gsub! '%LOCALAPPDATA%', ENV['LOCALAPPDATA'] || '%LOCALAPPDATA%'
path.gsub! '\\', '/'
path.gsub! '~', Dir.home || '~'
+ path.gsub!('*') do
+ next nil unless path[-1] == "*"
+ dirs = Dir.glob(path).collect do |d|
+ m = d.match(/(\d+)\.(\d+)\.(\d+)$/)
+ m ? [m[1], m[2], m[3]].collect { |v| v.to_i } : nil
+ end
+ dirs.compact!
+ dirs.sort! do |before, after|
+ f = 0
+ if (f = (after.first <=> before.first)) != 0
+ next f
+ elsif (f = (after[1] <=> before[1])) != 0
+ next f
+ else
+ next after.last <=> before.last
+ end
+ end
+ dirs.empty? ? nil.to_s : dirs.first.join(".")
+ end
File.directory?(path)
} || raise(AndroidNDKHomeNotFound)
)
@@ -146,7 +179,8 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
end
def sysroot
- @sysroot ||= home_path.join('platforms', platform,
+ return @sysroot if @sysroot
+ sysroot_path = home_path.join('platforms', platform,
case arch
when /armeabi/ then 'arch-arm'
when /arm64-v8a/ then 'arch-arm64'
@@ -156,6 +190,11 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
when /mips/ then 'arch-mips'
end
).to_s
+ if Dir.exist?(File.join(sysroot_path, "usr", "include"))
+ return @sysroot = sysroot_path
+ else
+ raise(SysrootNotReady)
+ end
end
def platform
@@ -259,6 +298,12 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter
def cflags
flags = []
+ case RUBY_PLATFORM
+ when /mswin|mingw|win32/
+ # Build for Android dont need window flag
+ flags += %W(-U_WIN32 -U_WIN64)
+ end
+
flags += %W(-MMD -MP -D__android__ -DANDROID --sysroot="#{sysroot}")
flags += ctarget
case toolchain
diff --git a/tasks/toolchains/gcc.rake b/tasks/toolchains/gcc.rake
index e9ea2550c..810f23b7a 100644
--- a/tasks/toolchains/gcc.rake
+++ b/tasks/toolchains/gcc.rake
@@ -12,9 +12,9 @@ MRuby::Toolchain.new(:gcc) do |conf, params|
compiler.command = ENV['CC'] || default_command
compiler.flags = [c_mandatory_flags, ENV['CFLAGS'] || [compiler_flags, cxx_invalid_flags, %w(-Wwrite-strings)]]
end
- compiler.option_include_path = '-I%s'
+ compiler.option_include_path = %q[-I"%s"]
compiler.option_define = '-D%s'
- compiler.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'
+ compiler.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"]
compiler.cxx_compile_flag = '-x c++ -std=gnu++03'
compiler.cxx_exception_flag = '-fexceptions'
compiler.cxx_invalid_flags = c_mandatory_flags + cxx_invalid_flags
@@ -27,7 +27,7 @@ MRuby::Toolchain.new(:gcc) do |conf, params|
linker.library_paths = []
linker.option_library = '-l%s'
linker.option_library_path = '-L%s'
- linker.link_options = '%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'
+ linker.link_options = '%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'
end
[[conf.cc, 'c'], [conf.cxx, 'c++']].each do |cc, lang|
diff --git a/tasks/toolchains/openwrt.rake b/tasks/toolchains/openwrt.rake
index aeb6dbcbc..c376d96ec 100644
--- a/tasks/toolchains/openwrt.rake
+++ b/tasks/toolchains/openwrt.rake
@@ -5,18 +5,18 @@ MRuby::Toolchain.new(:openwrt) do |conf|
cc.command = ENV['TARGET_CC']
cc.flags = ENV['TARGET_CFLAGS']
cc.include_paths = ["#{MRUBY_ROOT}/include"]
- cc.option_include_path = '-I%s'
+ cc.option_include_path = %q[-I"%s"]
cc.option_define = '-D%s'
- cc.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'
+ cc.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"]
end
[conf.cxx].each do |cxx|
cxx.command = ENV['TARGET_CXX']
cxx.flags = ENV['TARGET_CXXFLAGS']
cxx.include_paths = ["#{MRUBY_ROOT}/include"]
- cxx.option_include_path = '-I%s'
+ cxx.option_include_path = %q[-I"%s"]
cxx.option_define = '-D%s'
- cxx.compile_options = '%{flags} -MMD -o %{outfile} -c %{infile}'
+ cxx.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"]
end
conf.linker do |linker|
@@ -26,11 +26,11 @@ MRuby::Toolchain.new(:openwrt) do |conf|
linker.library_paths = []
linker.option_library = '-l%s'
linker.option_library_path = '-L%s'
- linker.link_options = '%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'
+ linker.link_options = '%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'
end
conf.archiver do |archiver|
archiver.command = ENV['TARGET_AR']
- archiver.archive_options = 'rs %{outfile} %{objs}'
+ archiver.archive_options = 'rs "%{outfile}" %{objs}'
end
end
diff --git a/tasks/toolchains/visualcpp.rake b/tasks/toolchains/visualcpp.rake
index c5f295130..5094495e3 100644
--- a/tasks/toolchains/visualcpp.rake
+++ b/tasks/toolchains/visualcpp.rake
@@ -4,9 +4,9 @@ MRuby::Toolchain.new(:visualcpp) do |conf, _params|
# C4013: implicit function declaration
cc.flags = [ENV['CFLAGS'] || %w(/c /nologo /W3 /we4013 /Zi /MD /O2 /D_CRT_SECURE_NO_WARNINGS)]
cc.defines = %w(MRB_STACK_EXTEND_DOUBLING)
- cc.option_include_path = '/I%s'
+ cc.option_include_path = %q[/I"%s"]
cc.option_define = '/D%s'
- cc.compile_options = "%{flags} /Fo%{outfile} %{infile}"
+ cc.compile_options = %Q[%{flags} /Fo"%{outfile}" "%{infile}"]
cc.cxx_compile_flag = '/TP'
cc.cxx_exception_flag = '/EHs'
end
@@ -15,9 +15,9 @@ MRuby::Toolchain.new(:visualcpp) do |conf, _params|
cxx.command = ENV['CXX'] || 'cl.exe'
cxx.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || %w(/c /nologo /W3 /Zi /MD /O2 /EHs /D_CRT_SECURE_NO_WARNINGS)]
cxx.defines = %w(MRB_STACK_EXTEND_DOUBLING)
- cxx.option_include_path = '/I%s'
+ cxx.option_include_path = %q[/I"%s"]
cxx.option_define = '/D%s'
- cxx.compile_options = "%{flags} /Fo%{outfile} %{infile}"
+ cxx.compile_options = %Q[%{flags} /Fo"%{outfile}" "%{infile}"]
cxx.cxx_compile_flag = '/TP'
cxx.cxx_exception_flag = '/EHs'
end
@@ -29,22 +29,22 @@ MRuby::Toolchain.new(:visualcpp) do |conf, _params|
linker.library_paths = %w()
linker.option_library = '%s.lib'
linker.option_library_path = '/LIBPATH:%s'
- linker.link_options = "%{flags} /OUT:%{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}"
+ linker.link_options = %Q[%{flags} /OUT:"%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}]
end
conf.archiver do |archiver|
archiver.command = ENV['AR'] || 'lib.exe'
- archiver.archive_options = '/nologo /OUT:%{outfile} %{objs}'
+ archiver.archive_options = '/nologo /OUT:"%{outfile}" %{objs}'
end
conf.yacc do |yacc|
yacc.command = ENV['YACC'] || 'bison.exe'
- yacc.compile_options = '-o %{outfile} %{infile}'
+ yacc.compile_options = %q[-o "%{outfile}" "%{infile}"]
end
conf.gperf do |gperf|
gperf.command = 'gperf.exe'
- gperf.compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'
+ gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"]
end
conf.exts do |exts|
diff --git a/test/assert.rb b/test/assert.rb
index 9b04f5b48..73382fb1c 100644
--- a/test/assert.rb
+++ b/test/assert.rb
@@ -56,7 +56,9 @@ def assertion_string(err, str, iso=nil, e=nil, bt=nil)
msg = "#{err}#{str}"
msg += " [#{iso}]" if iso && !iso.empty?
msg += " => #{e}" if e && !e.to_s.empty?
- msg += " (#{GEMNAME == 'mruby-test' ? 'core' : "mrbgems: #{GEMNAME}"})"
+ if Object.const_defined?(:GEMNAME)
+ msg += " (#{GEMNAME == 'mruby-test' ? 'core' : "mrbgems: #{GEMNAME}"})"
+ end
if $mrbtest_assert
$mrbtest_assert.each do |idx, assert_msg, diff|
msg += "\n - Assertion[#{idx}]"
@@ -64,7 +66,7 @@ def assertion_string(err, str, iso=nil, e=nil, bt=nil)
msg += "\n#{diff}" if diff && !diff.empty?
end
end
- msg += "\nbacktrace:\n #{bt.join("\n ")}" if bt
+ msg += "\nbacktrace:\n #{bt.join("\n ")}" if bt && !bt.empty?
msg
end
@@ -122,8 +124,7 @@ def assert(str = 'assert', iso = '')
$mrbtest_child_noassert[-2] += 1
t_print('?')
rescue Exception => e
- bt = e.backtrace if $mrbtest_verbose
- $asserts.push(assertion_string("#{e.class}: ", str, iso, e, bt))
+ $asserts.push(assertion_string("#{e.class}: ", str, iso, e, e.backtrace))
$kill_test += 1
t_print('X')
ensure
diff --git a/test/t/ensure.rb b/test/t/ensure.rb
index bef397059..bdb5bffc4 100644
--- a/test/t/ensure.rb
+++ b/test/t/ensure.rb
@@ -1,16 +1,16 @@
##
# ensure Test
-assert('ensure - context - yield') do
- class EnsureYieldBreak
- attr_reader :ensure_context
- def try
- yield
- ensure
- @ensure_context = self
- end
+class EnsureYieldBreak
+ attr_reader :ensure_context
+ def try
+ yield
+ ensure
+ @ensure_context = self
end
+end
+assert('ensure - context - yield') do
yielder = EnsureYieldBreak.new
yielder.try do
end
@@ -18,15 +18,6 @@ assert('ensure - context - yield') do
end
assert('ensure - context - yield and break') do
- class EnsureYieldBreak
- attr_reader :ensure_context
- def try
- yield
- ensure
- @ensure_context = self
- end
- end
-
yielder = EnsureYieldBreak.new
yielder.try do
break
@@ -35,15 +26,6 @@ assert('ensure - context - yield and break') do
end
assert('ensure - context - yield and return') do
- class EnsureYieldBreak
- attr_reader :ensure_context
- def try
- yield
- ensure
- @ensure_context = self
- end
- end
-
yielder = EnsureYieldBreak.new
lambda do
yielder.try do
diff --git a/test/t/exception.rb b/test/t/exception.rb
index a6f69eef6..c9afeb61a 100644
--- a/test/t/exception.rb
+++ b/test/t/exception.rb
@@ -400,7 +400,7 @@ assert('GC in rescue') do
end
rescue => exception
GC.start
- assert_equal("#{__FILE__}:#{line}:in call",
+ assert_equal("#{__FILE__}:#{line}",
exception.backtrace.first)
end
end
@@ -418,7 +418,7 @@ assert('Method call in rescue') do
rescue => exception
[3].each do
end
- assert_equal("#{__FILE__}:#{line}:in call",
+ assert_equal("#{__FILE__}:#{line}",
exception.backtrace.first)
end
end
diff --git a/test/t/kernel.rb b/test/t/kernel.rb
index c2eeee1a5..606150147 100644
--- a/test/t/kernel.rb
+++ b/test/t/kernel.rb
@@ -29,7 +29,7 @@ assert('Kernel.block_given?', '15.3.1.2.2') do
end
end
-# Kernel.eval is provided by the mruby-gem mrbgem. '15.3.1.2.3'
+# Kernel.eval is provided by the mruby-eval mrbgem. '15.3.1.2.3'
assert('Kernel.iterator?', '15.3.1.2.5') do
assert_false Kernel.iterator?
@@ -59,20 +59,11 @@ assert('Kernel.loop', '15.3.1.2.8') do
assert_equal 100, i
end
-assert('Kernel.p', '15.3.1.2.9') do
- # TODO search for a way to test p to stdio
- assert_true true
-end
+# Kernel.p is provided by the mruby-print mrbgem. '15.3.1.2.9'
-assert('Kernel.print', '15.3.1.2.10') do
- # TODO search for a way to test print to stdio
- assert_true true
-end
+# Kernel.print is provided by the mruby-print mrbgem. '15.3.1.2.10'
-assert('Kernel.puts', '15.3.1.2.11') do
- # TODO search for a way to test puts to stdio
- assert_true true
-end
+# Kernel.puts is provided by the mruby-print mrbgem. '15.3.1.2.11'
assert('Kernel.raise', '15.3.1.2.12') do
assert_raise RuntimeError do
@@ -100,6 +91,10 @@ assert('Kernel#__send__', '15.3.1.3.4') do
assert_true __send__(:respond_to?, :nil?)
# test without argument and without block
assert_equal String, __send__(:to_s).class
+
+ args = [:respond_to?, :nil?]
+ assert_true __send__(*args)
+ assert_equal [:respond_to?, :nil?], args
end
assert('Kernel#block_given?', '15.3.1.3.6') do
@@ -121,6 +116,13 @@ assert('Kernel#block_given?', '15.3.1.3.6') do
"block"
end
end
+
+ def bg_try_in_block
+ -> { block_given? }[]
+ end
+
+ assert_false bg_try_in_block
+ assert_true bg_try_in_block{}
end
assert('Kernel#class', '15.3.1.3.7') do
@@ -197,17 +199,6 @@ assert('Kernel#dup', '15.3.1.3.9') do
a.set(2)
c = a.dup
- immutables = [ 1, :foo, true, false, nil ]
- error_count = 0
- immutables.each do |i|
- begin
- i.dup
- rescue TypeError
- error_count += 1
- end
- end
-
- assert_equal immutables.size, error_count
assert_equal 2, a.get
assert_equal 1, b.get
assert_equal 2, c.get