summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.editorconfig18
-rw-r--r--.git-blame-ignore-revs4
-rw-r--r--.github/linters/.markdown-lint.yml23
-rw-r--r--.github/linters/.yaml-lint.yml3
-rw-r--r--.github/workflows/build.yml18
-rw-r--r--.github/workflows/codeql-analysis.yml2
-rw-r--r--.github/workflows/lint.yml34
-rw-r--r--.github/workflows/oss-fuzz.yml2
-rw-r--r--.github/workflows/super-linter.yml (renamed from .github/workflows/linter.yml)8
-rw-r--r--.pre-commit-config.yaml26
-rw-r--r--AUTHORS37
-rw-r--r--CONTRIBUTING.md44
-rw-r--r--SECURITY.md18
-rw-r--r--TODO.md11
-rw-r--r--benchmark/build_config_cc.rb13
-rw-r--r--build_config/IntelGalileo.rb2
-rw-r--r--build_config/android_arm64_v8a.rb (renamed from build_config/android_arm64-v8a.rb)0
-rw-r--r--build_config/ci/gcc-clang.rb8
-rw-r--r--build_config/dreamcast_shelf.rb2
-rw-r--r--build_config/host-nofloat.rb (renamed from build_config/no-float.rb)0
-rw-r--r--build_config/serenity.rb26
-rw-r--r--codespell.txt17
-rw-r--r--doc/guides/compile.md100
-rw-r--r--doc/guides/mrbconf.md15
-rw-r--r--doc/guides/mrbgems.md158
-rw-r--r--doc/guides/symbol.md16
-rw-r--r--doc/limitations.md26
-rw-r--r--doc/mruby3.md17
-rw-r--r--doc/opcode.md218
-rw-r--r--examples/mrbgems/c_and_ruby_extension_example/src/example.c5
-rw-r--r--examples/mrbgems/c_extension_example/src/example.c5
-rw-r--r--include/mrbconf.h28
-rw-r--r--include/mruby.h63
-rw-r--r--include/mruby/array.h25
-rw-r--r--include/mruby/boxing_nan.h38
-rw-r--r--include/mruby/boxing_word.h177
-rw-r--r--include/mruby/compile.h3
-rw-r--r--include/mruby/debug.h6
-rw-r--r--include/mruby/hash.h2
-rw-r--r--include/mruby/irep.h3
-rw-r--r--include/mruby/numeric.h35
-rw-r--r--include/mruby/opcode.h30
-rw-r--r--include/mruby/ops.h29
-rw-r--r--include/mruby/string.h27
-rw-r--r--include/mruby/value.h120
-rw-r--r--lib/mruby/gem.rb2
-rw-r--r--lib/mruby/presym.rb2
-rw-r--r--lib/mruby/source.rb2
-rwxr-xr-xminirake2
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb94
-rw-r--r--mrbgems/mruby-array-ext/src/array.c177
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c50
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c16
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c34
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h14
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c9
-rw-r--r--mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c10
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c2
-rw-r--r--mrbgems/mruby-binding-core/src/binding-core.c31
-rw-r--r--mrbgems/mruby-binding/mrblib/binding.rb5
-rw-r--r--mrbgems/mruby-binding/src/binding.c173
-rw-r--r--mrbgems/mruby-binding/test/binding.rb14
-rw-r--r--mrbgems/mruby-catch/src/catch.c2
-rw-r--r--mrbgems/mruby-class-ext/src/class.c2
-rw-r--r--mrbgems/mruby-cmath/src/cmath.c1
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c1204
-rw-r--r--mrbgems/mruby-compiler/core/parse.y224
-rw-r--r--mrbgems/mruby-compiler/core/y.tab.c7164
-rw-r--r--mrbgems/mruby-complex/src/complex.c35
-rw-r--r--mrbgems/mruby-enumerator/mrblib/enumerator.rb2
-rw-r--r--mrbgems/mruby-error/src/exception.c2
-rw-r--r--mrbgems/mruby-eval/src/eval.c99
-rw-r--r--mrbgems/mruby-eval/test/eval.rb11
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c17
-rw-r--r--mrbgems/mruby-hash-ext/mrblib/hash.rb2
-rw-r--r--mrbgems/mruby-io/README.md3
-rw-r--r--mrbgems/mruby-io/mrblib/io.rb4
-rw-r--r--mrbgems/mruby-io/src/file.c9
-rw-r--r--mrbgems/mruby-io/src/io.c4
-rw-r--r--mrbgems/mruby-kernel-ext/src/kernel.c144
-rw-r--r--mrbgems/mruby-kernel-ext/test/kernel.rb26
-rw-r--r--mrbgems/mruby-math/src/math.c3
-rw-r--r--mrbgems/mruby-metaprog/test/metaprog.rb11
-rw-r--r--mrbgems/mruby-method/README.md3
-rw-r--r--mrbgems/mruby-method/src/method.c6
-rw-r--r--mrbgems/mruby-numeric-ext/src/numeric_ext.c79
-rw-r--r--mrbgems/mruby-object-ext/src/object.c2
-rw-r--r--mrbgems/mruby-os-memsize/src/memsize.c1
-rw-r--r--mrbgems/mruby-pack/README.md61
-rw-r--r--mrbgems/mruby-pack/src/pack.c394
-rw-r--r--mrbgems/mruby-pack/test/pack.rb55
-rw-r--r--mrbgems/mruby-print/src/print.c1
-rw-r--r--mrbgems/mruby-proc-binding/src/proc-binding.c2
-rw-r--r--mrbgems/mruby-random/src/random.c62
-rw-r--r--mrbgems/mruby-range-ext/src/range.c7
-rw-r--r--mrbgems/mruby-rational/src/rational.c53
-rw-r--r--mrbgems/mruby-sleep/mrbgem.rake2
-rw-r--r--mrbgems/mruby-socket/README.md3
-rw-r--r--mrbgems/mruby-socket/src/socket.c86
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c257
-rw-r--r--mrbgems/mruby-sprintf/test/sprintf.rb10
-rw-r--r--mrbgems/mruby-string-ext/mrblib/string.rb36
-rw-r--r--mrbgems/mruby-string-ext/src/string.c85
-rw-r--r--mrbgems/mruby-struct/src/struct.c25
-rw-r--r--mrbgems/mruby-test-inline-struct/test/inline.c3
-rw-r--r--mrbgems/mruby-test/driver.c8
-rw-r--r--mrbgems/mruby-time/src/time.c106
-rw-r--r--mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb2
-rw-r--r--mrblib/10error.rb4
-rw-r--r--mrblib/array.rb14
-rw-r--r--mrblib/hash.rb14
-rw-r--r--mrblib/range.rb30
-rw-r--r--mrblib/string.rb44
-rw-r--r--src/array.c64
-rw-r--r--src/backtrace.c70
-rw-r--r--src/cdump.c468
-rw-r--r--src/class.c326
-rw-r--r--src/codedump.c307
-rw-r--r--src/debug.c125
-rw-r--r--src/dump.c441
-rw-r--r--src/error.c84
-rw-r--r--src/etc.c28
-rw-r--r--src/fmt_fp.c708
-rw-r--r--src/gc.c28
-rw-r--r--src/hash.c3
-rw-r--r--src/kernel.c27
-rw-r--r--src/load.c24
-rw-r--r--src/numeric.c465
-rw-r--r--src/object.c106
-rw-r--r--src/proc.c27
-rw-r--r--src/range.c71
-rw-r--r--src/readflt.c119
-rw-r--r--src/readint.c30
-rw-r--r--src/string.c416
-rw-r--r--src/symbol.c157
-rw-r--r--src/variable.c16
-rw-r--r--src/vm.c346
-rw-r--r--tasks/doc.rake3
-rw-r--r--tasks/libmruby.rake3
-rw-r--r--test/t/bs_block.rb12
-rw-r--r--test/t/class.rb14
-rw-r--r--test/t/float.rb14
-rw-r--r--test/t/hash.rb6
-rw-r--r--test/t/methods.rb29
-rw-r--r--test/t/superclass.rb3
-rw-r--r--test/t/symbol.rb4
-rw-r--r--test/t/syntax.rb76
-rw-r--r--test/t/unicode.rb14
148 files changed, 9358 insertions, 7799 deletions
diff --git a/.editorconfig b/.editorconfig
index 705b1f022..70cc78f0b 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -6,38 +6,38 @@
root = true
[*]
-indent_style = tab
-indent_size = 8
-tab_width = 8
-end_of_line = lf
charset = utf-8
+end_of_line = lf
+indent_size = 8
+indent_style = tab
insert_final_newline = true
+tab_width = 8
[{Makefile,Makefile.*,makefile,*.mk}]
trim_trailing_whitespace = true
#max_line_length = 80
[*.{c,cc,C,cxx,cpp,h,hh,H,hxx,hpp,inc,y}]
-indent_style = space
indent_size = 2
+indent_style = space
trim_trailing_whitespace = true
#max_line_length = 120
[{*.rb,Rakefile,rakefile,*.rake,*.gemspec,*.gembox}]
-indent_style = space
indent_size = 2
+indent_style = space
trim_trailing_whitespace = true
#max_line_length = 120
[*.bat]
-end_of_line = crlf
charset = latin1
+end_of_line = crlf
#max_line_length = 80
[*.{yaml,yml}]
-indent_style = space
indent_size = 2
+indent_style = space
[*.md]
-indent_style = space
indent_size = 2
+indent_style = space
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 000000000..3dab080a9
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,4 @@
+# Extend the tab with 8 whitespace
+6fc5dc986a5ffc1a74c63ad0617ea1dcc10d3cdd
+# reformatted doc/opcode.md
+61e8a540869c57ebddac53cf9d243db407d57fff
diff --git a/.github/linters/.markdown-lint.yml b/.github/linters/.markdown-lint.yml
index 671046203..a1023acbd 100644
--- a/.github/linters/.markdown-lint.yml
+++ b/.github/linters/.markdown-lint.yml
@@ -1,13 +1,26 @@
+# https://github.com/DavidAnson/markdownlint#rules--aliases
+# markdownlint -c .github/linters/.markdown-lint.yml .
+
+# MD001 heading-increment/header-increment - Heading levels should only increment by one level at a time
MD001: false
-MD003: false
-MD005: false
-MD007: false
+
+# MD010 no-hard-tabs - Hard tabs
MD010: false
-MD011: false
+
+# MD013 line-length - Line length
MD013: false
+
+# MD014 commands-show-output - Dollar signs used before commands without showing output
MD014: false
+
+# MD024 no-duplicate-heading/no-duplicate-header - Multiple headings with the same content
MD024: false
+
+# MD025 single-title/single-h1 - Multiple top-level headings in the same document
MD025: false
+
+# MD026 no-trailing-punctuation - Trailing punctuation in heading
MD026: false
+
+# MD040 fenced-code-language - Fenced code blocks should have a language specified
MD040: false
-MD046: false
diff --git a/.github/linters/.yaml-lint.yml b/.github/linters/.yaml-lint.yml
index 88f3b4eb9..be4c88798 100644
--- a/.github/linters/.yaml-lint.yml
+++ b/.github/linters/.yaml-lint.yml
@@ -1,5 +1,6 @@
---
-
+# https://yamllint.readthedocs.io/en/stable/
+# yamllint --strict -c .github/linters/.yaml-lint.yml .
extends: default
rules:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 93e759c3e..6ee80eefd 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -10,7 +10,7 @@ jobs:
MRUBY_CONFIG: ci/gcc-clang
CC: gcc
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Ruby version
run: ruby -v
- name: Compiler version
@@ -25,7 +25,7 @@ jobs:
MRUBY_CONFIG: ci/gcc-clang
CC: clang
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Ruby version
run: ruby -v
- name: Compiler version
@@ -40,7 +40,7 @@ jobs:
MRUBY_CONFIG: ci/gcc-clang
CC: gcc
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Ruby version
run: ruby -v
- name: Compiler version
@@ -55,7 +55,7 @@ jobs:
MRUBY_CONFIG: ci/gcc-clang
CC: clang
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Ruby version
run: ruby -v
- name: Compiler version
@@ -70,7 +70,7 @@ jobs:
MRUBY_CONFIG: ci/gcc-clang
CC: clang
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Ruby version
run: ruby -v
- name: Compiler version
@@ -85,7 +85,7 @@ jobs:
MRUBY_CONFIG: ci/gcc-clang
CC: gcc
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Ruby version
run: ruby -v
- name: Compiler version
@@ -105,8 +105,8 @@ jobs:
package-dir: C:\cygwin-package
cache-version: v1
steps:
- - uses: actions/checkout@v2
- - uses: actions/[email protected]
+ - uses: actions/[email protected]
+ - uses: actions/[email protected]
with:
path: ${{ env.package-dir }}
key: ${{ runner.os }}-cygwin-${{ env.cache-version }}
@@ -145,7 +145,7 @@ jobs:
env:
MRUBY_CONFIG: ci/msvc
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Ruby version
run: ruby -v
- name: Build and test
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 75f80a558..4b0be0ed0 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -13,7 +13,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/[email protected]
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index f949c5bbc..3e89c0328 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -4,29 +4,29 @@ on: [pull_request]
jobs:
misspell:
- name: Check Spelling
+ name: Check spelling with misspell
runs-on: ubuntu-latest
steps:
- name: Check Out
- uses: actions/checkout@v2
+ uses: actions/[email protected]
- name: Install
- run: |
- wget -O - -q https://git.io/misspell | sh -s -- -b .
+ run: wget -O - -q https://git.io/misspell | sh -s -- -b .
- name: Misspell
- run: |
- git ls-files --empty-directory | xargs ./misspell -error
- merge-conflict:
- name: Merge Conflict
+ run: git ls-files --empty-directory | xargs ./misspell -error
+ pre-commit:
+ name: Run pre-commit
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/[email protected]
- name: Check merge conflict
run: |
- grep "^<<<<<<< HEAD" $(git ls-files | xargs) && exit 1 || true
- trailing-whitespace:
- name: Trailing whitespace
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - name: Check for trailing whitespace
- run: "! git grep -EIn $'[ \t]+$'"
+ python -m pip install --upgrade pip
+ pip install pre-commit
+ - name: Set PY
+ run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
+ - uses: actions/cache@v1
+ with:
+ path: ~/.cache/pre-commit
+ key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
+ - name: Run pre-commit
+ run: pre-commit run --all-files
diff --git a/.github/workflows/oss-fuzz.yml b/.github/workflows/oss-fuzz.yml
index e693b913d..739e4afad 100644
--- a/.github/workflows/oss-fuzz.yml
+++ b/.github/workflows/oss-fuzz.yml
@@ -16,7 +16,7 @@ jobs:
fuzz-seconds: 600
dry-run: false
- name: Upload Crash
- uses: actions/[email protected]
+ uses: actions/[email protected]
if: failure()
with:
name: artifacts
diff --git a/.github/workflows/linter.yml b/.github/workflows/super-linter.yml
index 306060c3f..7265d6270 100644
--- a/.github/workflows/linter.yml
+++ b/.github/workflows/super-linter.yml
@@ -1,4 +1,4 @@
-name: Lint Code Base
+name: Super Linter
on:
push:
@@ -12,14 +12,12 @@ jobs:
name: Lint Code Base
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: github/super-linter@v3
+ - uses: actions/[email protected]
+ - uses: github/[email protected]
env:
ERROR_ON_MISSING_EXEC_BIT: true
VALIDATE_BASH: true
# VALIDATE_BASH_EXEC: true
# VALIDATE_EDITORCONFIG: true
- VALIDATE_MARKDOWN: true
# VALIDATE_SHELL_SHFMT: true
- VALIDATE_YAML: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 46abd0675..6aaf2a261 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -10,15 +10,19 @@ repos:
- id: identity
- id: check-hooks-apply
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v3.4.0
+ rev: v4.0.1
hooks:
- id: check-added-large-files
- id: check-case-conflict
- id: check-executables-have-shebangs
exclude: ^test/t/lang\.rb$
- id: check-merge-conflict
+ - id: check-vcs-permalinks
- id: check-yaml
+ - id: detect-private-key
- id: end-of-file-fixer
+ - id: file-contents-sorter
+ files: ^codespell\.txt$
- id: fix-byte-order-marker
- id: mixed-line-ending
- id: trailing-whitespace
@@ -27,16 +31,28 @@ repos:
# hooks:
# - id: forbid-tabs
# - id: remove-tabs
+ - repo: https://github.com/codespell-project/codespell
+ rev: v2.1.0
+ hooks:
+ - id: codespell
+ name: Run codespell
+ description: Check spelling with codespell
+ entry: codespell --ignore-words=codespell.txt
- repo: https://github.com/igorshubovych/markdownlint-cli
- rev: v0.27.1
+ rev: v0.28.1
hooks:
- id: markdownlint
name: Run markdownlint
+ description: Checks the style of Markdown files
entry: markdownlint -c .github/linters/.markdown-lint.yml .
+ types: [markdown]
+ files: \.(md|mdown|markdown)$
- repo: https://github.com/adrienverge/yamllint
- rev: v1.26.1
+ rev: v1.26.3
hooks:
- id: yamllint
- name: Check YAML files with yamllint
- entry: yamllint --strict -c .github/linters/.yaml-lint.yml .
+ name: Run yamllint
+ description: Check YAML files with yamllint
+ entry: yamllint --strict -c .github/linters/.yaml-lint.yml
types: [yaml]
+ files: \.(yaml|yml)$
diff --git a/AUTHORS b/AUTHORS
index 9a4366f07..3a3356d03 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,16 +1,16 @@
# Authors of mruby (mruby developers)
-## The List of Contributors sorted by number of commits (as of 2021-04-12 ff2ffe3)
+## The List of Contributors sorted by number of commits (as of 2021-09-16 8619ba6)
- 7340 Yukihiro "Matz" Matsumoto (@matz)*
- 576 KOBAYASHI Shuji (@shuujii)
+ 7663 Yukihiro "Matz" Matsumoto (@matz)*
+ 586 KOBAYASHI Shuji (@shuujii)
376 Daniel Bovensiepen (@bovi)
344 Takeshi Watanabe (@take-cheeze)*
334 Masaki Muranaka (@monaka)
+ 308 dearblue (@dearblue)*
298 Tomoyuki Sahara (@tsahara)*
- 276 dearblue (@dearblue)*
234 Jun Hiroe (@suzukaze)
- 217 Cremno (@cremno)*
+ 219 Cremno (@cremno)*
208 Yuki Kurihara (@ksss)+
148 Yasuhiro Matsumoto (@mattn)*
113 Carson McDonald (@carsonmcdonald)
@@ -25,6 +25,7 @@
59 Kurebayashi, Takahiro (@crimsonwoods)*
56 h2so5 (@h2so5)
52 Ralph Desir (@Mav7)*
+ 45 John Bampton (@jbampton)
45 Rory O'Connell (@RoryO)*
43 Yuichiro Kaneko (@yui-knk)+
42 fleuria (@flaneur2020)
@@ -35,22 +36,21 @@
31 MATSUMOTO Ryosuke (@matsumotory)*
30 Nobuyoshi Nakada (@nobu)
28 Masayoshi Takahashi (@takahashim)+
- 26 John Bampton (@jbampton)
24 Julian Aron Prenner (@furunkel)*
24 Ryan Scott (@ryan-scott-dev)*
22 Clayton Smith (@clayton-shopify)
22 Zachary Scott (@zzak)*
+ 22 mirichi (@mirichi)
21 Jared Breeden (@jbreeden)*
- 20 mirichi (@mirichi)
+ 20 Uchio Kondo (@udzura)*
19 Bouke van der Bijl (@bouk)
19 Felix Jones (@felixjones)*
19 Hidetaka Takano (@TJ-Hidetaka-Takano)
- 19 Uchio Kondo (@udzura)*
19 go kikuta (@gkta)*
18 Corey Powell (@IceDragon200)
18 Jon Maken (@jonforums)+
18 Mitchell Blank Jr (@mitchblank)*
- 16 Ryan Lopopolo (@lopopolo)
+ 17 Ryan Lopopolo (@lopopolo)
16 bggd (@bggd)
16 kano4 (@kano4)
14 Blaž Hrastnik (@archseer)*
@@ -107,6 +107,7 @@
5 Yurie Yamane (@yurie)+
5 dreamedge (@dreamedge)
5 nkshigeru (@nkshigeru)
+ 4 Dante Catalfamo (@dantecatalfamo)
4 Goro Kikuchi (@gorogit)
4 Herwin Weststrate (@herwinw)
4 Jon Moss (@maclover7)
@@ -122,7 +123,7 @@
4 kurodash (@kurodash)*
4 masahino (@masahino)
4 wanabe (@wanabe)*
- 4 xuejianqing (@zhihuikeji)
+ 4 xuejianqing (@joans321)
3 Anton Davydov (@davydovanton)
3 Carlo Prelz (@asfluido)*
3 David Turnbull (@AE9RB)
@@ -131,8 +132,8 @@
3 J. Mutua (@katmutua)+
3 Jan Berdajs (@mrbrdo)
3 Joseph McCullough (@joequery)
+ 3 Mark McCurry (@fundamental)
3 Nobuhiro Iwamatsu (@iwamatsu)
- 3 Mark McCurry (@fundamental)
3 Per Lundberg (@perlun)*
3 Rob Fors (@robfors)*
3 Rodrigo Malizia (@rmalizia44)+
@@ -238,6 +239,7 @@
1 Megumi Tomita (@tomykaira)+
1 Mitchell Hashimoto (@mitchellh)
1 Mitsutaka Mimura (@takkanm)
+ 1 Nathan Ladd (@ntl)
1 Nicholas (@knf)
1 Nozomi SATO (@nozomiS)
1 Okumura Takahiro (@hfm)
@@ -255,6 +257,7 @@
1 Sayed Abdelhaleem (@visualsayed)
1 Shugo Maeda (@shugo)
1 Sorah Fukumori (@sorah)
+ 1 Stuart Hinson (@stuarth)
1 Takuma Kume (@takumakume)+
1 Thomas Schmidt (@digitaltom)
1 Timo Schilling (@timoschilling)
@@ -286,6 +289,12 @@
`*` - Entries unified according to names and addresses
`+` - Entries with names different from commits
+## Contributors without named commits
+
+ Yuichi Osawa (Mitsubishi Electric Micro-Computer Application Software)
+ Shota Nakano (Manycolors)
+ Bjorn De Meyer
+
## Corporate contributors
Ministry of Economy, Trade and Industry, Japan
@@ -297,9 +306,3 @@
Specified non-profit organization mruby Forum
Mitsubishi Electric Micro-Computer Application Software Co.,Ltd.
Manycolors, Inc.
-
-## Contributors without named commits
-
- Yuichi Osawa (Mitsubishi Electric Micro-Computer Application Software)
- Shota Nakano (Manycolors)
- Bjorn De Meyer
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ebc9c2239..516be1e3c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,7 +10,7 @@ things in mind before submitting your pull request:
* Work on the latest possible state of **mruby/master**
* Create a branch which is dedicated to your change
-* Test your changes before creating a pull request (```rake test```)
+* Test your changes before creating a pull request (`rake test`)
* If possible write a test case which confirms your change
* Don't mix several features or bug-fixes in one pull request
* Create a meaningful commit message
@@ -18,15 +18,15 @@ things in mind before submitting your pull request:
* Use mrbgem to provide non ISO features (classes, modules and methods) unless
you have a special reason to implement them in the core
-## Pre-commit
+## pre-commit
-A framework for managing and maintaining multi-language pre-commit hooks.
-Pre-commit can be [installed](https://pre-commit.com/#installation) with `pip`, `curl`, `brew` or `conda`.
+A framework for managing and maintaining multi-language `pre-commit` hooks.
+`pre-commit` can be [installed](https://pre-commit.com/#installation) with `pip`, `curl`, `brew` or `conda`.
-You need to first install pre-commit and then install the pre-commit hooks with `pre-commit install`.
-Now pre-commit will run automatically on git commit!
+You need to first install `pre-commit` and then install the `pre-commit` hooks with `pre-commit install`.
+Now `pre-commit` will run automatically on git commit!
-It's usually a good idea to run the hooks against all the files when adding new hooks (usually pre-commit will only run on the changed files during git hooks).
+It's usually a good idea to run the hooks against all the files when adding new hooks (usually `pre-commit` will only run on the changed files during git hooks).
Use `pre-commit run --all-files` to check all files.
To run a single hook use `pre-commit run --all-files <hook_id>`
@@ -37,6 +37,22 @@ To update use `pre-commit autoupdate`
* [Usage](https://pre-commit.com/#usage)
* [pre-commit-autoupdate](https://pre-commit.com/#pre-commit-autoupdate)
+## Spell Checking
+
+We are running [misspell](https://github.com/client9/misspell) which is mainly written in
+[Golang](https://golang.org/) to check spelling with [GitHub Actions](.github/workflows/lint.yml).
+Correct commonly misspelled English words quickly with `misspell`. You can run `misspell` locally
+against all files with:
+
+```bash
+find . -type f | xargs ./misspell -error
+```
+
+Notable `misspell` help options or flags are:
+
+* `-i` string: ignore the following corrections, comma separated
+* `-w`: Overwrite file with corrections (default is just to display)
+
## Coding conventions
How to style your C and Ruby code which you want to submit.
@@ -67,13 +83,13 @@ on-demand.
#### Insert a break after the function return value:
- ```C
- int
- main(void)
- {
- ...
- }
- ```
+```c
+int
+main(void)
+{
+ ...
+}
+```
### Ruby code
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..2f0ae5b28
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,18 @@
+# Security Policy
+
+## Reporting a Vulnerability
+
+If you have any security concern, contact <[email protected]>.
+
+## Scope
+
+We consider following issues as vulnerabilities:
+
+* Remote code execution
+* Crash caused by a valid Ruby script
+
+We *don't* consider following issues as vulnerabilities:
+
+* Runtime C undefined behavior (including integer overflow)
+* Crash caused by misused API
+* Crash caused by tweaked compiled binary
diff --git a/TODO.md b/TODO.md
index 760d5911f..52685ed1a 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,17 +1,14 @@
-Thing to Do in the future
-===
+# Thing to Do in the future
# After mruby 3.0
-* replace `fp_fmt.c` by `float_format` (<https://github.com/dhylands/format-float.git>)
* multi-precision integer
-* WORD_BOXING: Pack some floats in `mrb_value`
* NAN_BOXING: Allow `MRB_INT64` along with NaN boxing
-* keyword arguments à la Ruby3.0 (using `OP_SENDVK`)
-* parser and code generator independent from `mrb_state` (mmruby?)
+* keyword arguments à la Ruby3.0 (update `OP_SEND`)
+* parser and code generator independent from `mrb_state` (picoruby?)
+* variable sized AST node
# Things to do (Things that are not done yet)
* `begin ... end while cond` to behave as CRuby
* special variables ($1,$2..)
-* super in aliased methods
diff --git a/benchmark/build_config_cc.rb b/benchmark/build_config_cc.rb
deleted file mode 100644
index 56d725bc7..000000000
--- a/benchmark/build_config_cc.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-MRuby::Build.new do |conf|
- toolchain :gcc
-end
-
-MRuby::Build.new('gcc') do |conf|
- toolchain :gcc
- conf.gembox 'default'
-end
-
-MRuby::Build.new('clang') do |conf|
- toolchain :clang
- conf.gembox 'default'
-end
diff --git a/build_config/IntelGalileo.rb b/build_config/IntelGalileo.rb
index d28986e36..f1f39e5dc 100644
--- a/build_config/IntelGalileo.rb
+++ b/build_config/IntelGalileo.rb
@@ -74,7 +74,7 @@ MRuby::CrossBuild.new("Galileo") do |conf|
conf.gem :core => "mruby-fiber"
conf.gem :core => "mruby-toplevel-ext"
- #lightweigh regular expression
+ #lightweight regular expression
conf.gem :github => "masamitsu-murase/mruby-hs-regexp", :branch => "master"
#Arduino API
diff --git a/build_config/android_arm64-v8a.rb b/build_config/android_arm64_v8a.rb
index 7fab2f063..7fab2f063 100644
--- a/build_config/android_arm64-v8a.rb
+++ b/build_config/android_arm64_v8a.rb
diff --git a/build_config/ci/gcc-clang.rb b/build_config/ci/gcc-clang.rb
index aa4a1a87d..eeaab5d0f 100644
--- a/build_config/ci/gcc-clang.rb
+++ b/build_config/ci/gcc-clang.rb
@@ -6,7 +6,7 @@ MRuby::Build.new('full-debug') do |conf|
# include all core GEMs
conf.gembox 'full-core'
- conf.cc.defines += %w(MRB_GC_STRESS MRB_USE_DEBUG_HOOK)
+ conf.cc.defines += %w(MRB_GC_STRESS MRB_USE_DEBUG_HOOK MRB_UTF8_STRING)
conf.enable_test
end
@@ -18,7 +18,7 @@ MRuby::Build.new do |conf|
conf.gembox 'full-core'
conf.gem :core => 'mruby-bin-debugger'
conf.compilers.each do |c|
- c.defines += %w(MRB_GC_FIXED_ARENA)
+ c.defines += %w(MRB_GC_FIXED_ARENA MRB_UTF8_STRING)
end
conf.enable_bintest
conf.enable_test
@@ -28,9 +28,9 @@ MRuby::Build.new('cxx_abi') do |conf|
conf.toolchain
conf.gembox 'full-core'
- conf.cc.flags += %w(-fpermissive)
+ conf.cc.flags += %w(-fpermissive -std=gnu++03)
conf.compilers.each do |c|
- c.defines += %w(MRB_GC_FIXED_ARENA)
+ c.defines += %w(MRB_GC_FIXED_ARENA MRB_UTF8_STRING)
end
conf.enable_test
diff --git a/build_config/dreamcast_shelf.rb b/build_config/dreamcast_shelf.rb
index ee9b260a5..092fde0d0 100644
--- a/build_config/dreamcast_shelf.rb
+++ b/build_config/dreamcast_shelf.rb
@@ -74,7 +74,6 @@ MRuby::CrossBuild.new("dreamcast") do |conf|
conf.gem :core => "mruby-array-ext"
conf.gem :core => "mruby-binding"
- conf.gem :core => "mruby-binding-core"
conf.gem :core => "mruby-catch"
conf.gem :core => "mruby-class-ext"
conf.gem :core => "mruby-cmath"
@@ -90,7 +89,6 @@ MRuby::CrossBuild.new("dreamcast") do |conf|
conf.gem :core => "mruby-exit"
conf.gem :core => "mruby-fiber"
conf.gem :core => "mruby-hash-ext"
- conf.gem :core => "mruby-inline-struct"
# conf.gem :core => "mruby-io"
conf.gem :core => "mruby-kernel-ext"
conf.gem :core => "mruby-math"
diff --git a/build_config/no-float.rb b/build_config/host-nofloat.rb
index 977bf4e12..977bf4e12 100644
--- a/build_config/no-float.rb
+++ b/build_config/host-nofloat.rb
diff --git a/build_config/serenity.rb b/build_config/serenity.rb
new file mode 100644
index 000000000..6704d2673
--- /dev/null
+++ b/build_config/serenity.rb
@@ -0,0 +1,26 @@
+# Cross compiling configuration for SerenityOS
+# Graphical Unix-like operating system for x86 computers.
+# https://github.com/SerenityOS/serenity
+#
+# Should be built using the SerenityOS Ports system
+# https://github.com/SerenityOS/serenity/tree/master/Ports
+#
+# As of 2021/08/20, SERENITY_ARCH is defined in the SerenityOS Ports
+# build script to always be either "i686" or "x86_64"
+
+MRuby::CrossBuild.new('serenity') do |conf|
+ conf.toolchain :gcc
+
+ conf.archiver.command = "#{ENV['SERENITY_ARCH']}-pc-serenity-ar"
+ conf.linker.command = "#{ENV['SERENITY_ARCH']}-pc-serenity-g++"
+
+ conf.cxx.command = "#{ENV['SERENITY_ARCH']}-pc-serenity-g++"
+ conf.cxx.defines << (ENV['SERENITY_ARCH'].include?('64') ? 'MRB_64BIT' : 'MRB_32BIT')
+
+ conf.cc.command = "#{ENV['SERENITY_ARCH']}-pc-serenity-gcc"
+ conf.cc.defines << (ENV['SERENITY_ARCH'].include?('64') ? 'MRB_64BIT' : 'MRB_32BIT')
+
+ conf.gembox 'full-core'
+
+ conf.test_runner.command = 'env'
+end
diff --git a/codespell.txt b/codespell.txt
new file mode 100644
index 000000000..dcc0ddb43
--- /dev/null
+++ b/codespell.txt
@@ -0,0 +1,17 @@
+ans
+ba
+creat
+delet
+disabl
+filetest
+fo
+hel
+hist
+ist
+methid
+nd
+quitt
+remore
+runn
+sting
+upto
diff --git a/doc/guides/compile.md b/doc/guides/compile.md
index 7156b2b68..2923a2676 100644
--- a/doc/guides/compile.md
+++ b/doc/guides/compile.md
@@ -138,18 +138,18 @@ C Compiler has header searcher to detect installed library.
If you need an include path of header file use `search_header_path`:
```ruby
-# Searches ```iconv.h```.
+# Searches `iconv.h`.
# If found it will return include path of the header file.
-# Otherwise it will return nil .
+# Otherwise it will return nil.
fail 'iconv.h not found' unless conf.cc.search_header_path 'iconv.h'
```
If you need a full file name of header file use `search_header`:
```ruby
-# Searches ```iconv.h```.
+# Searches `iconv.h`.
# If found it will return full path of the header file.
-# Otherwise it will return nil .
+# Otherwise it will return nil.
iconv_h = conf.cc.search_header 'iconv.h'
print "iconv.h found: #{iconv_h}\n"
```
@@ -333,9 +333,9 @@ conf.enable_debug
When debugging mode is enabled
* Macro `MRB_DEBUG` would be defined.
- * Which means `mrb_assert()` macro is enabled.
+ * Which means `mrb_assert()` macro is enabled.
* Debug information of irep would be generated by `mrbc`.
- * Because `-g` flag would be added to `mrbc` runner.
+ * Because `-g` flag would be added to `mrbc` runner.
* You can have better backtrace of mruby scripts with this.
## Cross-Compilation
@@ -379,23 +379,25 @@ end
During the build process the directory `build` will be created in the
root directory. The structure of this directory will look like this:
- +- build
- |
- +- host
- |
- +- LEGAL <- License description
- |
- +- bin <- Binaries (mirb, mrbc and mruby)
- |
- +- lib <- Libraries (libmruby.a and libmruby_core.a)
- |
- +- mrbc <- Minimal mrbc place
- |
- +- mrbgems <- Compilation result from mrbgems
- |
- +- mrblib <- Compilation result from mrblib
- |
- +- src <- Compilation result from C sources
+```
++- build
+ |
+ +- host
+ |
+ +- LEGAL <- License description
+ |
+ +- bin <- Binaries (mirb, mrbc and mruby)
+ |
+ +- lib <- Libraries (libmruby.a and libmruby_core.a)
+ |
+ +- mrbc <- Minimal mrbc place
+ |
+ +- mrbgems <- Compilation result from mrbgems
+ |
+ +- mrblib <- Compilation result from mrblib
+ |
+ +- src <- Compilation result from C sources
+```
The compilation workflow will look like this:
@@ -425,31 +427,33 @@ The compilation workflow will look like this:
In case of a cross-compilation to `i386` the `build` directory structure looks
like this:
- +- build
- |
- +- host
- | |
- | +- bin <- Native Binaries
- | |
- | +- lib <- Native Libraries
- | |
- | +- mrbgems
- | |
- | +- src
- |
- +- i386
- |
- +- bin <- Cross-compiled Binaries
- |
- +- include <- Header Directory
- |
- +- lib <- Cross-compiled Libraries
- |
- +- mrbgems
- |
- +- mrblib
- |
- +- src
+```
++- build
+ |
+ +- host
+ | |
+ | +- bin <- Native Binaries
+ | |
+ | +- lib <- Native Libraries
+ | |
+ | +- mrbgems
+ | |
+ | +- src
+ |
+ +- i386
+ |
+ +- bin <- Cross-compiled Binaries
+ |
+ +- include <- Header Directory
+ |
+ +- lib <- Cross-compiled Libraries
+ |
+ +- mrbgems
+ |
+ +- mrblib
+ |
+ +- src
+```
An extra directory is created for the target platform. In case you
compile for `i386` a directory called `i386` is created under the
diff --git a/doc/guides/mrbconf.md b/doc/guides/mrbconf.md
index b5bc8c85c..e71346ae6 100644
--- a/doc/guides/mrbconf.md
+++ b/doc/guides/mrbconf.md
@@ -151,17 +151,18 @@ largest value of required alignment.
## Reduce heap memory configuration
-`MRB_USE_LINK_TIME_RO_DATA_P`
+`MRB_USE_ETEXT_RO_DATA_P`
-* Only available on ELF platforms.
-* If you specify the address of a read-only section when creating a symbol or string, that string will be used as it is.
-* Heap memory can be saved.
-* Uses `__ehdr_start` and `__init_array_start`.
-* It must be `__ehdr_start < data_addr < __init_array_start`.
+* Use `etext` and `edata` section addresses defined by the linker to detect read-only data.
+* Those addresses are widely available, but not portable, nor standardized.
+* This macro is defined by default on User-mode Linux.
+
+`MRB_NO_DEFAULT_RO_DATA_P`
+
+* Define this macro when the default `mrb_ro_data_p()` does not work for any reason.
`MRB_USE_CUSTOM_RO_DATA_P`
-* Takes precedence over `MRB_USE_LINK_TIME_RO_DATA_P`.
* Please try if `MRB_USE_LINK_TIME_RO_DATA_P` is not available.
* The `mrb_ro_data_p()` function is implemented by the user in an arbitrary file.
* The prototype declaration is `mrb_bool mrb_ro_data_p(const char *ptr)`.
diff --git a/doc/guides/mrbgems.md b/doc/guides/mrbgems.md
index d4160ebc8..c08a09f4e 100644
--- a/doc/guides/mrbgems.md
+++ b/doc/guides/mrbgems.md
@@ -55,8 +55,8 @@ conf.gem mgem: 'mruby-redis', checksum_hash: '3446d19fc4a3f9697b5ddbf2a904f301c4
If there are missing dependencies, mrbgem dependencies solver will reference
mrbgem from the core or mgem-list.
-To pull all gems from remote GIT repository on build, call ```rake -p```,
-or ```rake --pull-gems```.
+To pull all gems from remote GIT repository on build, call `rake -p`,
+or `rake --pull-gems`.
NOTE: `:bitbucket` option supports only git. Hg is unsupported in this version.
@@ -111,21 +111,21 @@ contains every gem found in the `mrbgems` directory.
The maximal GEM structure looks like this:
```
-+- GEM_NAME <- Name of GEM
- |
- +- README.md <- Readme for GEM
- |
- +- mrbgem.rake <- GEM Specification
- |
- +- include/ <- Header for Ruby extension (will exported)
- |
- +- mrblib/ <- Source for Ruby extension
- |
- +- src/ <- Source for C extension
- |
- +- tools/ <- Source for Executable (in C)
- |
- +- test/ <- Test code (Ruby)
++- GEM_NAME <- Name of GEM
+ |
+ +- README.md <- Readme for GEM
+ |
+ +- mrbgem.rake <- GEM Specification
+ |
+ +- include/ <- Header for Ruby extension (will exported)
+ |
+ +- mrblib/ <- Source for Ruby extension
+ |
+ +- src/ <- Source for C extension
+ |
+ +- tools/ <- Source for Executable (in C)
+ |
+ +- test/ <- Test code (Ruby)
```
The folder `mrblib` contains pure Ruby files to extend mruby. The folder `src`
@@ -200,8 +200,8 @@ Version requirement supports following operators:
* '>=': is equal or greater
* '<=': is equal or lesser
* '~>': is equal or greater and is lesser than the next major version
- * example 1: '~> 2.2.2' means '>= 2.2.2' and '< 2.3.0'
- * example 2: '~> 2.2' means '>= 2.2.0' and '< 3.0.0'
+ * example 1: '~> 2.2.2' means '>= 2.2.2' and '< 2.3.0'
+ * example 2: '~> 2.2' means '>= 2.2.0' and '< 3.0.0'
When more than one version requirements is passed, the dependency must satisfy all of it.
@@ -215,7 +215,7 @@ use `MRuby::Build#gem` in the build configuration to override default gem.
If you have conflicting GEMs use the following method:
* `spec.add_conflict(gem, *requirements)`
- * The `requirements` argument is same as in `add_dependency` method.
+ * The `requirements` argument is same as in `add_dependency` method.
like following code:
@@ -273,7 +273,7 @@ mrbgems expects that you have implemented a C method called
by the name of your GEM. If you call your GEM `c_extension_example`, your
initialisation method could look like this:
-```C
+```c
void
mrb_c_extension_example_gem_init(mrb_state* mrb) {
struct RClass *class_cextension = mrb_define_module(mrb, "CExtension");
@@ -288,7 +288,7 @@ mrbgems expects that you have implemented a C method called
by the name of your GEM. If you call your GEM `c_extension_example`, your
finalizer method could look like this:
-```C
+```c
void
mrb_c_extension_example_gem_final(mrb_state* mrb) {
free(someone);
@@ -297,19 +297,21 @@ mrb_c_extension_example_gem_final(mrb_state* mrb) {
### Example
- +- c_extension_example/
- |
- +- README.md (Optional)
- |
- +- src/
- | |
- | +- example.c <- C extension source
- |
- +- test/
- | |
- | +- example.rb <- Test code for C extension
- |
- +- mrbgem.rake <- GEM specification
+```
++- c_extension_example/
+ |
+ +- README.md (Optional)
+ |
+ +- src/
+ | |
+ | +- example.c <- C extension source
+ |
+ +- test/
+ | |
+ | +- example.rb <- Test code for C extension
+ |
+ +- mrbgem.rake <- GEM specification
+```
## Ruby Extension
@@ -323,19 +325,21 @@ none
### Example
- +- ruby_extension_example/
- |
- +- README.md (Optional)
- |
- +- mrblib/
- | |
- | +- example.rb <- Ruby extension source
- |
- +- test/
- | |
- | +- example.rb <- Test code for Ruby extension
- |
- +- mrbgem.rake <- GEM specification
+```
++- ruby_extension_example/
+ |
+ +- README.md (Optional)
+ |
+ +- mrblib/
+ | |
+ | +- example.rb <- Ruby extension source
+ |
+ +- test/
+ | |
+ | +- example.rb <- Test code for Ruby extension
+ |
+ +- mrbgem.rake <- GEM specification
+```
## C and Ruby Extension
@@ -353,23 +357,25 @@ See C and Ruby example.
### Example
- +- c_and_ruby_extension_example/
- |
- +- README.md (Optional)
- |
- +- mrblib/
- | |
- | +- example.rb <- Ruby extension source
- |
- +- src/
- | |
- | +- example.c <- C extension source
- |
- +- test/
- | |
- | +- example.rb <- Test code for C and Ruby extension
- |
- +- mrbgem.rake <- GEM specification
+```
++- c_and_ruby_extension_example/
+ |
+ +- README.md (Optional)
+ |
+ +- mrblib/
+ | |
+ | +- example.rb <- Ruby extension source
+ |
+ +- src/
+ | |
+ | +- example.c <- C extension source
+ |
+ +- test/
+ | |
+ | +- example.rb <- Test code for C and Ruby extension
+ |
+ +- mrbgem.rake <- GEM specification
+```
## Binary gems
@@ -389,23 +395,23 @@ binary gems, to separate normal gems and binary gems.
### Example
```
- +- mruby-bin-example/
++- mruby-bin-example/
|
- +- README.md (Optional)
+ +- README.md (Optional)
|
+- bintest/
- | |
- | +- example.rb <- Test code for binary gem
+ | |
+ | +- example.rb <- Test code for binary gem
|
- +- mrbgem.rake <- Gem specification
+ +- mrbgem.rake <- Gem specification
|
- +- mrblib/ <- Source for Ruby extension (Optional)
+ +- mrblib/ <- Source for Ruby extension (Optional)
|
- +- src/ <- Source for C extension (Optional)
+ +- src/ <- Source for C extension (Optional)
|
+- tools/
- |
- +- example/ <- Executable name directory
- |
- +- example.c <- Source for Executable (includes main)
+ |
+ +- example/ <- Executable name directory
+ |
+ +- example.c <- Source for Executable (includes main)
```
diff --git a/doc/guides/symbol.md b/doc/guides/symbol.md
index e9e72a6d3..8f90ce59f 100644
--- a/doc/guides/symbol.md
+++ b/doc/guides/symbol.md
@@ -4,7 +4,7 @@ Symbols in `mruby` C source code is represented by `mrb_sym` which is alias of
`uint32_t`. Lower 30 bits are used for symbols so that higher 2 bits can be
used as flags, e.g. `struct mt_elem` in `class.c`.
-```C
+```c
struct mt_elem {
union mt_ptr ptr;
size_t func_p:1;
@@ -57,13 +57,13 @@ To save RAM, `mruby` can use compile-time allocation of some symbols. You can
use following macros to get preallocated symbols by including `mruby/presym.h`
header.
- * `MRB_SYM(xor)` //=> xor (Word characters)
- * `MRB_SYM_B(xor)` //=> xor! (Method with Bang)
- * `MRB_SYM_Q(xor)` //=> xor? (Method with Question mark)
- * `MRB_SYM_E(xor)` //=> xor= (Method with Equal)
- * `MRB_CVSYM(xor)` //=> @@xor (Class Variable)
- * `MRB_IVSYM(xor)` //=> @xor (Instance Variable)
- * `MRB_OPSYM(xor)` //=> ^ (Operator)
+* `MRB_SYM(xor)` //=> xor (Word characters)
+* `MRB_SYM_B(xor)` //=> xor! (Method with Bang)
+* `MRB_SYM_Q(xor)` //=> xor? (Method with Question mark)
+* `MRB_SYM_E(xor)` //=> xor= (Method with Equal)
+* `MRB_CVSYM(xor)` //=> @@xor (Class Variable)
+* `MRB_IVSYM(xor)` //=> @xor (Instance Variable)
+* `MRB_OPSYM(xor)` //=> ^ (Operator)
For `MRB_OPSYM()`, specify the names corresponding to operators (see
`MRuby::Presym::OPERATORS` in `lib/mruby/presym.rb` for the names that
diff --git a/doc/limitations.md b/doc/limitations.md
index d903d528c..265e4a2d4 100644
--- a/doc/limitations.md
+++ b/doc/limitations.md
@@ -13,28 +13,6 @@ This document is collecting these limitations.
This document does not contain a complete list of limitations.
Please help to improve it by submitting your findings.
-## `Array` passed to `puts`
-
-Passing an Array to `puts` results in different output.
-
-```ruby
-puts [1,2,3]
-```
-
-#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
-
-```
-1
-2
-3
-```
-
-#### mruby [3.0.0 (2021-03-05)]
-
-```
-[1, 2, 3]
-```
-
## `Kernel.raise` in rescue clause
`Kernel.raise` without arguments does not raise the current exception within
@@ -54,7 +32,7 @@ end
#### mruby [3.0.0 (2021-03-05)]
-No exception is raised. Instead, you have to do:
+`RuntimeError` is raised instead of `ZeroDivisionError`. To re-raise the exception, you have to do:
```ruby
begin
@@ -77,7 +55,7 @@ To reduce memory consumption `Array` does not support instance variables.
```ruby
class Liste < Array
def initialize(str = nil)
- @feld = str
+ @field = str
end
end
diff --git a/doc/mruby3.md b/doc/mruby3.md
index d5218428e..a64e3c73e 100644
--- a/doc/mruby3.md
+++ b/doc/mruby3.md
@@ -1,5 +1,4 @@
-User visible changes in `mruby3`
-===
+# User visible changes in `mruby3`
# Build System
@@ -77,8 +76,9 @@ to be default `mrb_value` representation. Now the default is
Pack `mrb_value` in an `intptr_t` integer. Consumes less
memory compared to `MRB_NO_BOXING` especially on 32-bit
-platforms. `Fixnum` size is 31 bits, so some integer values
-does not fit in `Fixnum` integers.
+platforms. Inlined integer size is 31 bits, so some `mrb_int`
+values does not fit in `mrb_value`. Those integers are allocated
+in the object heap as `struct RInteger`.
## `MRB_NAN_BOXING`
@@ -111,14 +111,9 @@ $ bin/mruby -r lib1.rb -r lib2.rb < app.mrb
`mruby3` introduces a few new instructions.
-Instructions that access pool[i]/syms[i] where i>255.
-
-* `OP_LOADL16`
-* `OP_STRING16`
-* `OP_LOADSYM16`
-
-Instructions that load a 32-bit integer.
+Instructions that load a 16/32-bit integer.
+* `OP_LOADI16`
* `OP_LOADI32`
Instruction that unwinds jump table for rescue/ensure.
diff --git a/doc/opcode.md b/doc/opcode.md
index 3ad09919c..953e9aeae 100644
--- a/doc/opcode.md
+++ b/doc/opcode.md
@@ -22,114 +22,110 @@ sign) of operands.
## table.1 Instruction Table
-| Instruction Name | Operand type | Semantics |
-|------------------|--------------|--------------------------------------------------------|
-| OP_NOP | - | no operation |
-| OP_MOVE | BB | R(a) = R(b) |
-| OP_LOADL | BB | R(a) = Pool(b) |
-| OP_LOADL16 | BS | 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 | BS | R(a) = mrb_int(b) |
-| OP_LOADI32 | BSS | R(a) = mrb_int((b<<16)+c) |
-| OP_LOADSYM | BB | R(a) = Syms(b) |
-| OP_LOADSYM16 | BS | 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_JMPUW | S | unwind_and_jump_to(a) |
-| OP_EXCEPT | B | R(a) = exc |
-| OP_RESCUE | BB | R(b) = R(a).isa?(R(b)) |
-| OP_RAISEIF | B | raise(R(a)) if R(a) |
-| 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_SENDVK | BB | R(a) = call(R(a),Syms(b),*R(a+1),**(a+2),&R(a+3)) |
-| 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_STRING16 | BS | 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*2-1)) |
-| OP_HASHADD | BB | R(a) = hash_push(R(a),R(a+1)..R(a+b*2)) |
-| OP_HASHCAT | B | R(a) = hash_cat(R(a),R(a+1)) |
-| OP_LAMBDA | BB | R(a) = lambda(SEQ[b],OP_L_LAMBDA) |
-| OP_LAMBDA16 | BS | R(a) = lambda(SEQ[b],OP_L_LAMBDA) |
-| OP_BLOCK | BB | R(a) = lambda(SEQ[b],OP_L_BLOCK) |
-| OP_BLOCK16 | BS | R(a) = lambda(SEQ[b],OP_L_BLOCK) |
-| OP_METHOD | BB | R(a) = lambda(SEQ[b],OP_L_METHOD) |
-| OP_METHOD16 | BS | 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_EXEC16 | BS | 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_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` | `BS` | `R(a) = mrb_int(b)` |
+| `OP_LOADI32` | `BSS` | `R(a) = mrb_int((b<<16)+c)` |
+| `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_JMPUW` | `S` | `unwind_and_jump_to(a)` |
+| `OP_EXCEPT` | `B` | `R(a) = exc` |
+| `OP_RESCUE` | `BB` | `R(b) = R(a).isa?(R(b))` |
+| `OP_RAISEIF` | `B` | `raise(R(a)) if R(a)` |
+| `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_SENDVK` | `BB` | `R(a) = call(R(a),Syms(b),*R(a+1),**(a+2),&R(a+3))` |
+| `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=m5:r1:m5:d1:lv4)` |
+| `OP_ENTER` | `W` | `arg setup according to flags (23=m5:o5:r1:m5:k5:d1:b1)` |
+| `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=m5:r1:m5:d1:lv4)` |
+| `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` | `BB` | `ary_push(R(a),R(a+1)..R(a+b))` |
+| `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(Pool(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*2-1))` |
+| `OP_HASHADD` | `BB` | `hash_push(R(a),R(a+1)..R(a+b*2))` |
+| `OP_HASHCAT` | `B` | `R(a) = hash_cat(R(a),R(a+1))` |
+| `OP_LAMBDA` | `BB` | `R(a) = lambda(Irep(b),OP_L_LAMBDA)` |
+| `OP_BLOCK` | `BB` | `R(a) = lambda(Irep(b),OP_L_BLOCK)` |
+| `OP_METHOD` | `BB` | `R(a) = lambda(Irep(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),Irep[b])` |
+| `OP_DEF` | `BB` | `R(a).newmethod(Syms(b),R(a+1)); R(a) = Syms(b)` |
+| `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, Pool(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/mrbgems/c_and_ruby_extension_example/src/example.c b/examples/mrbgems/c_and_ruby_extension_example/src/example.c
index 1fdb1078d..f1d7971c2 100644
--- a/examples/mrbgems/c_and_ruby_extension_example/src/example.c
+++ b/examples/mrbgems/c_and_ruby_extension_example/src/example.c
@@ -5,9 +5,8 @@
static mrb_value
mrb_c_method(mrb_state *mrb, mrb_value self)
{
- mrb_value self_str = mrb_str_to_str(mrb, self);
-
- printf("%s: A C Extension\n", mrb_str_to_cstr(mrb, self_str));
+ mrb_ensure_string_type(mrb, self);
+ printf("%s: A C Extension\n", mrb_str_to_cstr(mrb, self));
return self;
}
diff --git a/examples/mrbgems/c_extension_example/src/example.c b/examples/mrbgems/c_extension_example/src/example.c
index 727c7c698..fe872c933 100644
--- a/examples/mrbgems/c_extension_example/src/example.c
+++ b/examples/mrbgems/c_extension_example/src/example.c
@@ -5,9 +5,8 @@
static mrb_value
mrb_c_method(mrb_state *mrb, mrb_value self)
{
- mrb_value self_str = mrb_str_to_str(mrb, self);
-
- printf("%s: A C Extension\n", mrb_str_to_cstr(mrb, self_str));
+ mrb_ensure_string_type(mrb, self);
+ printf("%s: A C Extension\n", mrb_str_to_cstr(mrb, self));
return self;
}
diff --git a/include/mrbconf.h b/include/mrbconf.h
index d4da81bfc..e11a55e8c 100644
--- a/include/mrbconf.h
+++ b/include/mrbconf.h
@@ -7,9 +7,6 @@
#ifndef MRUBYCONF_H
#define MRUBYCONF_H
-#include <limits.h>
-#include <stdint.h>
-
/* architecture selection: */
/* specify -DMRB_32BIT or -DMRB_64BIT to override */
#if !defined(MRB_32BIT) && !defined(MRB_64BIT)
@@ -82,6 +79,9 @@
# define MRB_WORD_BOXING
#endif
+/* if defined mruby allocates Float objects in the heap to keep full precision if needed */
+//#define MRB_WORDBOX_NO_FLOAT_TRUNCATE
+
/* add -DMRB_INT32 to use 32bit integer for mrb_int; conflict with MRB_INT64;
Default for 32-bit CPU mode. */
//#define MRB_INT32
@@ -113,11 +113,17 @@
/* number of object per heap page */
//#define MRB_HEAP_PAGE_SIZE 1024
-/* if __ehdr_start is available, mruby can reduce memory used by symbols */
-//#define MRB_USE_LINK_TIME_RO_DATA_P
+/* define if your platform does not support etext, edata */
+//#define MRB_NO_DEFAULT_RO_DATA_P
+
+/* define if your platform supports etext, edata */
+//#define MRB_USE_RO_DATA_P_ETEXT
+/* use MRB_USE_ETEXT_RO_DATA_P by default on Linux */
+#if (defined(__linux__) && !defined(__KERNEL__))
+#define MRB_USE_ETEXT_RO_DATA_P
+#endif
-/* if MRB_USE_LINK_TIME_RO_DATA_P does not work,
- you can try mrb_ro_data_p() that you have implemented yourself in any file;
+/* you can provide and use mrb_ro_data_p() for your platform.
prototype is `mrb_bool mrb_ro_data_p(const char *ptr)` */
//#define MRB_USE_CUSTOM_RO_DATA_P
@@ -181,14 +187,6 @@
# include <stdio.h>
#endif
-#ifndef FALSE
-# define FALSE 0
-#endif
-
-#ifndef TRUE
-# define TRUE 1
-#endif
-
/*
** mruby tuning profiles
**/
diff --git a/include/mruby.h b/include/mruby.h
index d421dc58c..d82cff581 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -44,6 +44,9 @@
#include <limits.h>
#ifdef __cplusplus
+#ifndef UINTPTR_MAX
+#error Must be placed `#include <mruby.h>` before `#include <stdint.h>`
+#endif
#ifndef SIZE_MAX
#ifdef __SIZE_MAX__
#define SIZE_MAX __SIZE_MAX__
@@ -96,6 +99,7 @@
#include <mruby/version.h>
#ifndef MRB_NO_FLOAT
+#include <math.h>
#include <float.h>
#ifndef FLT_EPSILON
#define FLT_EPSILON (1.19209290e-07f)
@@ -150,8 +154,8 @@ typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud);
typedef struct {
mrb_sym mid;
+ uint8_t cci; /* called from C function */
int16_t argc;
- int16_t acc;
const struct RProc *proc;
mrb_value *stack;
const mrb_code *pc; /* current address on iseq of this proc */
@@ -265,7 +269,9 @@ typedef struct mrb_state {
#endif
mrb_sym symidx;
- struct symbol_name *symtbl; /* symbol table */
+ const char **symtbl;
+ uint8_t *symlink;
+ uint8_t *symflags;
mrb_sym symhash[256];
size_t symcapa;
#ifndef MRB_USE_ALL_SYMBOLS
@@ -886,19 +892,20 @@ MRB_API struct RClass* mrb_define_module_under_id(mrb_state *mrb, struct RClass
* | char | Ruby type | C types | Notes |
* |:----:|----------------|-------------------|----------------------------------------------------|
* | `o` | {Object} | {mrb_value} | Could be used to retrieve any type of argument |
- * | `C` | {Class}/{Module} | {mrb_value} | |
+ * | `C` | {Class}/{Module} | {mrb_value} | when `!` follows, the value may be `nil` |
* | `S` | {String} | {mrb_value} | when `!` follows, the value may be `nil` |
* | `A` | {Array} | {mrb_value} | when `!` follows, the value may be `nil` |
* | `H` | {Hash} | {mrb_value} | when `!` follows, the value may be `nil` |
* | `s` | {String} | const char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` |
* | `z` | {String} | const char * | `NULL` terminated string; `z!` gives `NULL` for `nil` |
* | `a` | {Array} | const {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` |
+ * | `c` | {Class}/{Module} | strcut RClass * | `c!` gives `NULL` for `nil` |
* | `f` | {Integer}/{Float} | {mrb_float} | |
* | `i` | {Integer}/{Float} | {mrb_int} | |
* | `b` | boolean | {mrb_bool} | |
* | `n` | {String}/{Symbol} | {mrb_sym} | |
* | `d` | data | void *, {mrb_data_type} const | 2nd argument will be used to check data type so it won't be modified; when `!` follows, the value may be `nil` |
- * | `I` | inline struct | void * | |
+ * | `I` | inline struct | void *, struct RClass | `I!` gives `NULL` for `nil` |
* | `&` | block | {mrb_value} | &! raises exception if no block given. |
* | `*` | rest arguments | const {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; `*!` avoid copy of the stack. |
* | <code>\|</code> | optional | | After this spec following specs would be optional. |
@@ -906,6 +913,13 @@ MRB_API struct RClass* mrb_define_module_under_id(mrb_state *mrb, struct RClass
* | `:` | keyword args | {mrb_kwargs} const | Get keyword arguments. @see mrb_kwargs |
*
* @see mrb_get_args
+ *
+ * Immediately after format specifiers it can add format modifiers:
+ *
+ * | char | Notes |
+ * |:----:|-----------------------------------------------------------------------------------------|
+ * | `!` | Switch to the alternate mode; The behaviour changes depending on the format specifier |
+ * | `+` | Request a not frozen object; However, except nil value |
*/
typedef const char *mrb_args_format;
@@ -1004,6 +1018,11 @@ MRB_API const mrb_value *mrb_get_argv(mrb_state *mrb);
*/
MRB_API mrb_value mrb_get_arg1(mrb_state *mrb);
+/**
+ * Check if a block argument is given from mrb_state.
+ */
+MRB_API mrb_bool mrb_block_given_p(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:
@@ -1126,6 +1145,17 @@ MRB_API void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memor
MRB_API struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*);
MRB_API void mrb_free(mrb_state*, void*);
+/**
+ * Allocates a Ruby object that matches the constant literal defined in
+ * `enum mrb_vtype` and returns a pointer to the corresponding C type.
+ *
+ * @param mrb The current mruby state
+ * @param tt The constant literal of `enum mrb_vtype`
+ * @param klass A Class object
+ * @return Reference to the newly created object
+ */
+#define MRB_OBJ_ALLOC(mrb, tt, klass) ((MRB_VTYPE_TYPEOF(tt)*)mrb_obj_alloc(mrb, tt, klass))
+
MRB_API mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
/**
@@ -1219,10 +1249,8 @@ MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name);
MRB_API mrb_bool mrb_obj_eq(mrb_state *mrb, mrb_value a, mrb_value b);
MRB_API mrb_bool mrb_obj_equal(mrb_state *mrb, mrb_value a, mrb_value b);
MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
-MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base);
-MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val);
#ifndef MRB_NO_FLOAT
-MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val);
+MRB_API mrb_value mrb_to_float(mrb_state *mrb, mrb_value val);
#endif
MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj);
MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
@@ -1339,10 +1367,23 @@ MRB_API void mrb_gc_register(mrb_state *mrb, mrb_value obj);
/* mrb_gc_unregister() removes the object from GC root. */
MRB_API void mrb_gc_unregister(mrb_state *mrb, mrb_value obj);
-MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val);
-#define mrb_int(mrb, val) mrb_integer(mrb_to_int(mrb, val))
+/* type conversion/check functions */
+MRB_API mrb_value mrb_ensure_array_type(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self);
+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);
+MRB_API mrb_value mrb_ensure_string_type(mrb_state *mrb, mrb_value str);
+MRB_API mrb_value mrb_check_string_type(mrb_state *mrb, mrb_value str);
+/* obsolete: use mrb_ensure_string_type() instead */
+#define mrb_string_type(mrb, str) mrb_ensure_string_type(mrb,str)
+#define mrb_to_str(mrb, str) mrb_ensure_string_type(mrb,str)
+/* obsolete: use mrb_obj_as_string() instead */
+#define mrb_str_to_str(mrb, str) mrb_obj_as_string(mrb, str)
+MRB_API mrb_value mrb_to_integer(mrb_state *mrb, mrb_value val);
+#define mrb_to_int(mrb, val) mrb_to_integer(mrb, val)
+#define mrb_as_int(mrb, val) mrb_integer(mrb_to_integer(mrb, val))
+
/* string type checking (contrary to the name, it doesn't convert) */
-MRB_API mrb_value mrb_to_str(mrb_state *mrb, mrb_value val);
MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
MRB_INLINE void mrb_check_frozen(mrb_state *mrb, void *o)
@@ -1361,6 +1402,8 @@ MRB_API mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid);
MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c);
MRB_API mrb_bool mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func);
+/* obsolete function(s); will be removed */
+#define mrb_int(mrb, val) mrb_as_int(mrb, val)
/**
* Resume a Fiber
diff --git a/include/mruby/array.h b/include/mruby/array.h
index 16f78f773..8bb652472 100644
--- a/include/mruby/array.h
+++ b/include/mruby/array.h
@@ -14,15 +14,17 @@
*/
MRB_BEGIN_DECL
-
typedef struct mrb_shared_array {
int refcnt;
mrb_ssize len;
mrb_value *ptr;
} mrb_shared_array;
-#if defined(MRB_32BIT) && defined(MRB_NO_BOXING) && !defined(MRB_USE_FLOAT32)
+#if defined(MRB_32BIT) && defined(MRB_NO_BOXING) && !defined(MRB_USE_FLOAT32) && !defined(MRB_ARY_NO_EMBED)
# define MRB_ARY_NO_EMBED
+#endif
+
+#ifdef MRB_ARY_NO_EMBED
# define MRB_ARY_EMBED_LEN_MAX 0
#else
# define MRB_ARY_EMBED_LEN_MAX ((mrb_int)(sizeof(void*)*3/sizeof(mrb_value)))
@@ -177,20 +179,6 @@ MRB_API void mrb_ary_push(mrb_state *mrb, mrb_value array, mrb_value value);
MRB_API mrb_value mrb_ary_pop(mrb_state *mrb, mrb_value ary);
/*
- * Returns a reference to an element of the array on the given index.
- *
- * Equivalent to:
- *
- * ary[n]
- *
- * @param mrb The mruby state reference.
- * @param ary The target array.
- * @param n The array index being referenced
- * @return The referenced value.
- */
-MRB_API mrb_value mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n);
-
-/*
* Sets a value on an array at the given index
*
* Equivalent to:
@@ -200,7 +188,7 @@ MRB_API mrb_value mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n);
* @param mrb The mruby state reference.
* @param ary The target array.
* @param n The array index being referenced.
- * @param val The value being setted.
+ * @param val The value being set.
*/
MRB_API void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val);
@@ -216,8 +204,6 @@ MRB_API void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val
* @param other The array to replace it with.
*/
MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other);
-MRB_API mrb_value mrb_ensure_array_type(mrb_state *mrb, mrb_value self);
-MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self);
/*
* Unshift an element into the array
@@ -243,6 +229,7 @@ MRB_API mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item
* @param offset The element position (negative counts from the tail).
*/
MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
+#define mrb_ary_ref(mrb, ary, n) mrb_ary_entry(ary, n)
/*
* Replace subsequence of an array.
diff --git a/include/mruby/boxing_nan.h b/include/mruby/boxing_nan.h
index 05f1d953c..90866ab55 100644
--- a/include/mruby/boxing_nan.h
+++ b/include/mruby/boxing_nan.h
@@ -41,14 +41,14 @@ union mrb_value_ {
uint64_t u;
#ifdef MRB_64BIT
void *p;
-# define BOXNAN_IMMEDIATE_VALUE uint32_t i
+# define NANBOX_IMMEDIATE_VALUE uint32_t i
#else
-# define BOXNAN_IMMEDIATE_VALUE union { uint32_t i; void *p; }
+# define NANBOX_IMMEDIATE_VALUE union { uint32_t i; void *p; }
#endif
struct {
MRB_ENDIAN_LOHI(
uint32_t ttt;
- ,BOXNAN_IMMEDIATE_VALUE;
+ ,NANBOX_IMMEDIATE_VALUE;
)
};
mrb_value value;
@@ -74,14 +74,14 @@ mrb_val_union(mrb_value v)
#ifdef MRB_64BIT
#define mrb_ptr(o) ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)(mrb_val_union(o).p)))<<2))
#define mrb_cptr(o) (((struct RCptr*)mrb_ptr(o))->p)
-#define BOXNAN_SHIFT_LONG_POINTER(v) (((uintptr_t)(v)>>34)&0x3fff)
+#define NANBOX_SHIFT_LONG_POINTER(v) (((uintptr_t)(v)>>34)&0x3fff)
#else
#define mrb_ptr(o) ((void*)mrb_val_union(o).i)
#define mrb_cptr(o) mrb_ptr(o)
-#define BOXNAN_SHIFT_LONG_POINTER(v) 0
+#define NANBOX_SHIFT_LONG_POINTER(v) 0
#endif
-#define BOXNAN_SET_VALUE(o, tt, attr, v) do { \
+#define NANBOX_SET_VALUE(o, tt, attr, v) do { \
union mrb_value_ mrb_value_union_variable; \
mrb_value_union_variable.attr = (v);\
mrb_value_union_variable.ttt = 0xfff00000 | (((tt)+1)<<14);\
@@ -89,14 +89,14 @@ mrb_val_union(mrb_value v)
} while (0)
#ifdef MRB_64BIT
-#define BOXNAN_SET_OBJ_VALUE(o, tt, v) do {\
+#define NANBOX_SET_OBJ_VALUE(o, tt, v) do {\
union mrb_value_ mrb_value_union_variable;\
mrb_value_union_variable.p = (void*)((uintptr_t)(v)>>2);\
- mrb_value_union_variable.ttt = (0xfff00000|(((tt)+1)<<14)|BOXNAN_SHIFT_LONG_POINTER(v));\
+ mrb_value_union_variable.ttt = (0xfff00000|(((tt)+1)<<14)|NANBOX_SHIFT_LONG_POINTER(v));\
o = mrb_value_union_variable.value;\
} while (0)
#else
-#define BOXNAN_SET_OBJ_VALUE(o, tt, v) BOXNAN_SET_VALUE(o, tt, i, (uint32_t)v)
+#define NANBOX_SET_OBJ_VALUE(o, tt, v) NANBOX_SET_VALUE(o, tt, i, (uint32_t)v)
#endif
#define SET_FLOAT_VALUE(mrb,r,v) do { \
@@ -111,20 +111,20 @@ mrb_val_union(mrb_value v)
r = mrb_value_union_variable.value; \
} while(0)
-#define SET_NIL_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_FALSE, i, 0)
-#define SET_FALSE_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_FALSE, i, 1)
-#define SET_TRUE_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_TRUE, i, 1)
-#define SET_BOOL_VALUE(r,b) BOXNAN_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, i, 1)
-#define SET_INT_VALUE(mrb, r,n) BOXNAN_SET_VALUE(r, MRB_TT_INTEGER, i, (uint32_t)(n))
-#define SET_FIXNUM_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_INTEGER, i, (uint32_t)(n))
-#define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, i, (uint32_t)(v))
-#define SET_OBJ_VALUE(r,v) BOXNAN_SET_OBJ_VALUE(r, (((struct RObject*)(v))->tt), (v))
+#define SET_NIL_VALUE(r) NANBOX_SET_VALUE(r, MRB_TT_FALSE, i, 0)
+#define SET_FALSE_VALUE(r) NANBOX_SET_VALUE(r, MRB_TT_FALSE, i, 1)
+#define SET_TRUE_VALUE(r) NANBOX_SET_VALUE(r, MRB_TT_TRUE, i, 1)
+#define SET_BOOL_VALUE(r,b) NANBOX_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, i, 1)
+#define SET_INT_VALUE(mrb, r,n) NANBOX_SET_VALUE(r, MRB_TT_INTEGER, i, (uint32_t)(n))
+#define SET_FIXNUM_VALUE(r,n) NANBOX_SET_VALUE(r, MRB_TT_INTEGER, i, (uint32_t)(n))
+#define SET_SYM_VALUE(r,v) NANBOX_SET_VALUE(r, MRB_TT_SYMBOL, i, (uint32_t)(v))
+#define SET_OBJ_VALUE(r,v) NANBOX_SET_OBJ_VALUE(r, (((struct RObject*)(v))->tt), (v))
#ifdef MRB_64BIT
MRB_API mrb_value mrb_nan_boxing_cptr_value(struct mrb_state*, void*);
#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, p, v)
+#define SET_CPTR_VALUE(mrb,r,v) NANBOX_SET_VALUE(r, MRB_TT_CPTR, p, v)
#endif
-#define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, i, 0)
+#define SET_UNDEF_VALUE(r) NANBOX_SET_VALUE(r, MRB_TT_UNDEF, i, 0)
#endif /* MRUBY_BOXING_NAN_H */
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h
index beab8681e..89c6f6f2d 100644
--- a/include/mruby/boxing_word.h
+++ b/include/mruby/boxing_word.h
@@ -7,7 +7,11 @@
#ifndef MRUBY_BOXING_WORD_H
#define MRUBY_BOXING_WORD_H
-#ifndef MRB_NO_FLOAT
+#if defined(MRB_32BIT) && !defined(MRB_USE_FLOAT32)
+# define MRB_WORDBOX_NO_FLOAT_TRUNCATE
+#endif
+
+#if !defined(MRB_NO_FLOAT) && defined(MRB_WORDBOX_NO_FLOAT_TRUNCATE)
struct RFloat {
MRB_OBJECT_HEADER;
mrb_float f;
@@ -29,9 +33,9 @@ enum mrb_special_consts {
#if defined(MRB_64BIT) && defined(MRB_INT32)
#define MRB_FIXNUM_SHIFT 0
#else
-#define MRB_FIXNUM_SHIFT BOXWORD_FIXNUM_SHIFT
+#define MRB_FIXNUM_SHIFT WORDBOX_FIXNUM_SHIFT
#endif
-#define MRB_SYMBOL_SHIFT BOXWORD_SYMBOL_SHIFT
+#define MRB_SYMBOL_SHIFT WORDBOX_SYMBOL_SHIFT
#if defined(MRB_64BIT) && defined(MRB_INT64)
# define MRB_FIXNUM_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
@@ -41,36 +45,69 @@ enum mrb_special_consts {
# define MRB_FIXNUM_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
#endif
-#define BOXWORD_FIXNUM_BIT_POS 1
-#define BOXWORD_SYMBOL_BIT_POS 2
-#define BOXWORD_FIXNUM_SHIFT BOXWORD_FIXNUM_BIT_POS
-#ifdef MRB_64BIT
-#define BOXWORD_SYMBOL_SHIFT 0
+#define WORDBOX_FIXNUM_BIT_POS 1
+#define WORDBOX_FIXNUM_SHIFT WORDBOX_FIXNUM_BIT_POS
+#define WORDBOX_FIXNUM_FLAG (1 << (WORDBOX_FIXNUM_BIT_POS - 1))
+#define WORDBOX_FIXNUM_MASK ((1 << WORDBOX_FIXNUM_BIT_POS) - 1)
+
+#if defined(MRB_WORDBOX_NO_FLOAT_TRUNCATE)
+/* floats are allocated in heaps */
+#define WORDBOX_SYMBOL_BIT_POS 2
+#define WORDBOX_SYMBOL_SHIFT WORDBOX_SYMBOL_BIT_POS
+#define WORDBOX_SYMBOL_FLAG (1 << (WORDBOX_SYMBOL_BIT_POS - 1))
+#define WORDBOX_SYMBOL_MASK ((1 << WORDBOX_SYMBOL_BIT_POS) - 1)
#else
-#define BOXWORD_SYMBOL_SHIFT BOXWORD_SYMBOL_BIT_POS
+#define WORDBOX_FLOAT_FLAG 2
+#define WORDBOX_FLOAT_MASK 3
+#if defined(MRB_64BIT)
+#define WORDBOX_SYMBOL_SHIFT 32
+#else /* MRB_32BIT */
+#define WORDBOX_SYMBOL_SHIFT 5
#endif
-#define BOXWORD_FIXNUM_FLAG (1 << (BOXWORD_FIXNUM_BIT_POS - 1))
-#define BOXWORD_SYMBOL_FLAG (1 << (BOXWORD_SYMBOL_BIT_POS - 1))
-#define BOXWORD_FIXNUM_MASK ((1 << BOXWORD_FIXNUM_BIT_POS) - 1)
-#define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1)
-#define BOXWORD_IMMEDIATE_MASK 0x07
-
-#define BOXWORD_SET_SHIFT_VALUE(o,n,v) \
- ((o).w = (((uintptr_t)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG)
-#define BOXWORD_SHIFT_VALUE_P(o,n) \
- (((o).w & BOXWORD_##n##_MASK) == BOXWORD_##n##_FLAG)
-#define BOXWORD_OBJ_TYPE_P(o,n) \
+#define WORDBOX_SYMBOL_FLAG 0x1c
+#define WORDBOX_SYMBOL_MASK 0x1f
+#endif
+
+#define WORDBOX_IMMEDIATE_MASK 0x07
+
+#define WORDBOX_SET_SHIFT_VALUE(o,n,v) \
+ ((o).w = (((uintptr_t)(v)) << WORDBOX_##n##_SHIFT) | WORDBOX_##n##_FLAG)
+#define WORDBOX_SHIFT_VALUE_P(o,n) \
+ (((o).w & WORDBOX_##n##_MASK) == WORDBOX_##n##_FLAG)
+#define WORDBOX_OBJ_TYPE_P(o,n) \
(!mrb_immediate_p(o) && mrb_val_union(o).bp->tt == MRB_TT_##n)
/*
* mrb_value representation:
*
+ * 64bit word with inline float:
+ * nil : ...0000 0000 (all bits are 0)
+ * false : ...0000 0100 (mrb_fixnum(v) != 0)
+ * true : ...0000 1100
+ * undef : ...0001 0100
+ * symbol: ...0001 1100 (use only upper 32-bit as symbol value with MRB_64BIT)
+ * fixnum: ...IIII III1
+ * float : ...FFFF FF10 (51 bit significands; require MRB_64BIT)
+ * object: ...PPPP P000
+ *
+ * 32bit word with inline float:
+ * nil : ...0000 0000 (all bits are 0)
+ * false : ...0000 0100 (mrb_fixnum(v) != 0)
+ * true : ...0000 1100
+ * undef : ...0001 0100
+ * symbol: ...SSS1 1100 (use only upper 32-bit as symbol value with MRB_64BIT)
+ * symbol: ...SSS1 0100 (symbol occupies 20bits)
+ * fixnum: ...IIII III1
+ * float : ...FFFF FF10 (22 bit significands; require MRB_64BIT)
+ * object: ...PPPP P000
+ *
+ * and word boxing without inline float:
* nil : ...0000 0000 (all bits are 0)
* false : ...0000 0100 (mrb_fixnum(v) != 0)
* true : ...0000 1100
* undef : ...0001 0100
* fixnum: ...IIII III1
- * symbol: ...SSSS SS10 (use only upper 32-bit as symbol value on 64-bit CPU)
+ * symbol: ...SSSS SS10
* object: ...PPPP P000 (any bits are 1)
*/
typedef struct mrb_value {
@@ -79,19 +116,14 @@ typedef struct mrb_value {
union mrb_value_ {
void *p;
-#ifdef MRB_64BIT
- /* use struct to avoid bit shift. */
- struct {
- MRB_ENDIAN_LOHI(
- mrb_sym sym;
- ,uint32_t flag;
- )
- } sym;
-#endif
struct RBasic *bp;
#ifndef MRB_NO_FLOAT
+#ifndef MRB_WORDBOX_NO_FLOAT_TRUNCATE
+ mrb_float f;
+#else
struct RFloat *fp;
#endif
+#endif
struct RInteger *ip;
struct RCptr *vp;
uintptr_t w;
@@ -114,59 +146,60 @@ MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float);
#endif
MRB_API mrb_value mrb_word_boxing_int_value(struct mrb_state*, mrb_int);
-#define mrb_immediate_p(o) ((o).w & BOXWORD_IMMEDIATE_MASK || (o).w == MRB_Qnil)
+#define mrb_immediate_p(o) ((o).w & WORDBOX_IMMEDIATE_MASK || (o).w == MRB_Qnil)
#define mrb_ptr(o) mrb_val_union(o).p
#define mrb_cptr(o) mrb_val_union(o).vp->p
#ifndef MRB_NO_FLOAT
-#define mrb_float(o) mrb_val_union(o).fp->f
+#ifndef MRB_WORDBOX_NO_FLOAT_TRUNCATE
+MRB_API mrb_float mrb_word_boxing_value_float(mrb_value v);
+#define mrb_float(o) mrb_word_boxing_value_float(o)
+#else
+#define mrb_float(o) mrb_val_union(o).fp->f
+#endif
#endif
-#define mrb_fixnum(o) (mrb_int)(((intptr_t)(o).w) >> BOXWORD_FIXNUM_SHIFT)
+#define mrb_fixnum(o) (mrb_int)(((intptr_t)(o).w) >> WORDBOX_FIXNUM_SHIFT)
MRB_INLINE mrb_int
mrb_integer_func(mrb_value o) {
if (mrb_immediate_p(o)) return mrb_fixnum(o);
return mrb_val_union(o).ip->i;
}
#define mrb_integer(o) mrb_integer_func(o)
-#ifdef MRB_64BIT
-#define mrb_symbol(o) mrb_val_union(o).sym.sym
-#else
-#define mrb_symbol(o) (mrb_sym)(((o).w) >> BOXWORD_SYMBOL_SHIFT)
-#endif
+#define mrb_symbol(o) (mrb_sym)(((o).w) >> WORDBOX_SYMBOL_SHIFT)
#define mrb_bool(o) (((o).w & ~(uintptr_t)MRB_Qfalse) != 0)
-#define mrb_fixnum_p(o) BOXWORD_SHIFT_VALUE_P(o, FIXNUM)
-#define mrb_integer_p(o) (BOXWORD_SHIFT_VALUE_P(o, FIXNUM)||BOXWORD_OBJ_TYPE_P(o, INTEGER))
-#ifdef MRB_64BIT
-#define mrb_symbol_p(o) (mrb_val_union(o).sym.flag == BOXWORD_SYMBOL_FLAG)
-#else
-#define mrb_symbol_p(o) BOXWORD_SHIFT_VALUE_P(o, SYMBOL)
-#endif
+#define mrb_fixnum_p(o) WORDBOX_SHIFT_VALUE_P(o, FIXNUM)
+#define mrb_integer_p(o) (WORDBOX_SHIFT_VALUE_P(o, FIXNUM)||WORDBOX_OBJ_TYPE_P(o, INTEGER))
+#define mrb_symbol_p(o) WORDBOX_SHIFT_VALUE_P(o, SYMBOL)
#define mrb_undef_p(o) ((o).w == MRB_Qundef)
#define mrb_nil_p(o) ((o).w == MRB_Qnil)
#define mrb_false_p(o) ((o).w == MRB_Qfalse)
#define mrb_true_p(o) ((o).w == MRB_Qtrue)
#ifndef MRB_NO_FLOAT
-#define mrb_float_p(o) BOXWORD_OBJ_TYPE_P(o, FLOAT)
+#ifndef MRB_WORDBOX_NO_FLOAT_TRUNCATE
+#define mrb_float_p(o) WORDBOX_SHIFT_VALUE_P(o, FLOAT)
+#else
+#define mrb_float_p(o) WORDBOX_OBJ_TYPE_P(o, FLOAT)
+#endif
#endif
-#define mrb_array_p(o) BOXWORD_OBJ_TYPE_P(o, ARRAY)
-#define mrb_string_p(o) BOXWORD_OBJ_TYPE_P(o, STRING)
-#define mrb_hash_p(o) BOXWORD_OBJ_TYPE_P(o, HASH)
-#define mrb_cptr_p(o) BOXWORD_OBJ_TYPE_P(o, CPTR)
-#define mrb_exception_p(o) BOXWORD_OBJ_TYPE_P(o, EXCEPTION)
-#define mrb_free_p(o) BOXWORD_OBJ_TYPE_P(o, FREE)
-#define mrb_object_p(o) BOXWORD_OBJ_TYPE_P(o, OBJECT)
-#define mrb_class_p(o) BOXWORD_OBJ_TYPE_P(o, CLASS)
-#define mrb_module_p(o) BOXWORD_OBJ_TYPE_P(o, MODULE)
-#define mrb_iclass_p(o) BOXWORD_OBJ_TYPE_P(o, ICLASS)
-#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_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)
-#define mrb_istruct_p(o) BOXWORD_OBJ_TYPE_P(o, ISTRUCT)
-#define mrb_break_p(o) BOXWORD_OBJ_TYPE_P(o, BREAK)
+#define mrb_array_p(o) WORDBOX_OBJ_TYPE_P(o, ARRAY)
+#define mrb_string_p(o) WORDBOX_OBJ_TYPE_P(o, STRING)
+#define mrb_hash_p(o) WORDBOX_OBJ_TYPE_P(o, HASH)
+#define mrb_cptr_p(o) WORDBOX_OBJ_TYPE_P(o, CPTR)
+#define mrb_exception_p(o) WORDBOX_OBJ_TYPE_P(o, EXCEPTION)
+#define mrb_free_p(o) WORDBOX_OBJ_TYPE_P(o, FREE)
+#define mrb_object_p(o) WORDBOX_OBJ_TYPE_P(o, OBJECT)
+#define mrb_class_p(o) WORDBOX_OBJ_TYPE_P(o, CLASS)
+#define mrb_module_p(o) WORDBOX_OBJ_TYPE_P(o, MODULE)
+#define mrb_iclass_p(o) WORDBOX_OBJ_TYPE_P(o, ICLASS)
+#define mrb_sclass_p(o) WORDBOX_OBJ_TYPE_P(o, SCLASS)
+#define mrb_proc_p(o) WORDBOX_OBJ_TYPE_P(o, PROC)
+#define mrb_range_p(o) WORDBOX_OBJ_TYPE_P(o, RANGE)
+#define mrb_env_p(o) WORDBOX_OBJ_TYPE_P(o, ENV)
+#define mrb_data_p(o) WORDBOX_OBJ_TYPE_P(o, DATA)
+#define mrb_fiber_p(o) WORDBOX_OBJ_TYPE_P(o, FIBER)
+#define mrb_istruct_p(o) WORDBOX_OBJ_TYPE_P(o, ISTRUCT)
+#define mrb_break_p(o) WORDBOX_OBJ_TYPE_P(o, BREAK)
#ifndef MRB_NO_FLOAT
#define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v))
@@ -178,17 +211,8 @@ mrb_integer_func(mrb_value o) {
#define SET_TRUE_VALUE(r) ((r).w = MRB_Qtrue)
#define SET_BOOL_VALUE(r,b) ((b) ? SET_TRUE_VALUE(r) : SET_FALSE_VALUE(r))
#define SET_INT_VALUE(mrb,r,n) ((r) = mrb_word_boxing_int_value(mrb, n))
-#define SET_FIXNUM_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, FIXNUM, n)
-#ifdef MRB_64BIT
-#define SET_SYM_VALUE(r,v) do {\
- union mrb_value_ mrb_value_union_variable;\
- mrb_value_union_variable.sym.sym = v;\
- mrb_value_union_variable.sym.flag = BOXWORD_SYMBOL_FLAG;\
- (r) = mrb_value_union_variable.value;\
-} while (0)
-#else
-#define SET_SYM_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, SYMBOL, n)
-#endif
+#define SET_FIXNUM_VALUE(r,n) WORDBOX_SET_SHIFT_VALUE(r, FIXNUM, n)
+#define SET_SYM_VALUE(r,n) WORDBOX_SET_SHIFT_VALUE(r, SYMBOL, n)
#define SET_OBJ_VALUE(r,v) ((r).w = (uintptr_t)(v))
MRB_INLINE enum mrb_vtype
@@ -199,6 +223,9 @@ mrb_type(mrb_value o)
mrb_fixnum_p(o) ? MRB_TT_INTEGER :
mrb_symbol_p(o) ? MRB_TT_SYMBOL :
mrb_undef_p(o) ? MRB_TT_UNDEF :
+#ifndef MRB_NO_FLOAT
+ mrb_float_p(o) ? MRB_TT_FLOAT :
+#endif
mrb_val_union(o).bp->tt;
}
diff --git a/include/mruby/compile.h b/include/mruby/compile.h
index 8159cd696..6732625c1 100644
--- a/include/mruby/compile.h
+++ b/include/mruby/compile.h
@@ -16,8 +16,6 @@ MRB_BEGIN_DECL
#include <mruby.h>
-struct mrb_jmpbuf;
-
struct mrb_parser_state;
/* load context */
typedef struct mrbc_context {
@@ -165,7 +163,6 @@ struct mrb_parser_state {
uint16_t filename_table_length;
uint16_t current_filename_index;
- struct mrb_jmpbuf* jmp;
mrb_ast_node *nvars;
};
diff --git a/include/mruby/debug.h b/include/mruby/debug.h
index 2062a9308..7319ccb3f 100644
--- a/include/mruby/debug.h
+++ b/include/mruby/debug.h
@@ -16,7 +16,8 @@ MRB_BEGIN_DECL
typedef enum mrb_debug_line_type {
mrb_debug_line_ary = 0,
- mrb_debug_line_flat_map = 1
+ mrb_debug_line_flat_map,
+ mrb_debug_line_packed_map
} mrb_debug_line_type;
typedef struct mrb_irep_debug_info_line {
@@ -31,8 +32,9 @@ typedef struct mrb_irep_debug_info_file {
mrb_debug_line_type line_type;
union {
void *ptr;
- mrb_irep_debug_info_line *flat_map;
uint16_t *ary;
+ mrb_irep_debug_info_line *flat_map;
+ uint8_t *packed_map;
} lines;
} mrb_irep_debug_info_file;
diff --git a/include/mruby/hash.h b/include/mruby/hash.h
index 749ea3869..1b37a12d4 100644
--- a/include/mruby/hash.h
+++ b/include/mruby/hash.h
@@ -37,8 +37,6 @@ struct RHash {
size_t mrb_hash_memsize(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);
/*
* Initializes a new hash.
diff --git a/include/mruby/irep.h b/include/mruby/irep.h
index 6a3b4bd10..2a0e261d1 100644
--- a/include/mruby/irep.h
+++ b/include/mruby/irep.h
@@ -122,7 +122,8 @@ struct mrb_insn_data {
uint8_t insn;
uint16_t a;
uint16_t b;
- uint16_t c;
+ uint8_t c;
+ const mrb_code *addr;
};
struct mrb_insn_data mrb_decode_insn(const mrb_code *pc);
diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h
index fc6cacfda..4b14588ac 100644
--- a/include/mruby/numeric.h
+++ b/include/mruby/numeric.h
@@ -30,21 +30,19 @@ MRB_BEGIN_DECL
#endif
#endif
-#ifndef MRB_NO_FLOAT
-MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
-#endif
-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_NO_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);
-#endif
-
MRB_API mrb_value mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y);
MRB_API mrb_value mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y);
MRB_API mrb_value mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y);
+MRB_API mrb_value mrb_integer_to_str(mrb_state *mrb, mrb_value x, mrb_int base);
+MRB_API char *mrb_int_to_cstr(char *buf, size_t len, mrb_int n, mrb_int base);
+
+/* internal function(s) */
+mrb_int mrb_div_int(mrb_state *mrb, mrb_int x, mrb_int y);
+
+/* obsolete function(s); will be removed */
+#define mrb_fixnum_to_str(mrb, x, base) mrb_integer_to_str(mrb, x, base)
+
#ifndef __has_builtin
#define __has_builtin(x) 0
#endif
@@ -135,8 +133,6 @@ mrb_int_mul_overflow(mrb_int a, mrb_int b, mrb_int *c)
#endif
#ifndef MRB_NO_FLOAT
-# include <stdint.h>
-# include <float.h>
# define MRB_FLT_RADIX FLT_RADIX
@@ -162,6 +158,19 @@ mrb_int_mul_overflow(mrb_int a, mrb_int b, mrb_int *c)
# define MRB_FLT_MAX DBL_MAX
# define MRB_FLT_MAX_10_EXP DBL_MAX_10_EXP
# endif /* MRB_USE_FLOAT32 */
+
+MRB_API mrb_value mrb_float_to_integer(mrb_state *mrb, mrb_value val);
+MRB_API mrb_float mrb_as_float(mrb_state *mrb, mrb_value x);
+
+/* internal functions */
+mrb_float mrb_div_float(mrb_float x, mrb_float y);
+mrb_value mrb_float_to_str(mrb_state *mrb, mrb_value x, const char *fmt);
+int mrb_format_float(mrb_float f, char *buf, size_t buf_size, char fmt, int prec, char sign);
+
+/* obsolete functions; will be removed */
+#define mrb_flo_to_fixnum(mrb, val) mrb_float_to_integer(mrb, val)
+#define mrb_to_flo(mrb, x) mrb_as_float(mrb, x)
+
#endif /* MRB_NO_FLOAT */
MRB_END_DECL
diff --git a/include/mruby/opcode.h b/include/mruby/opcode.h
index 987c5ad8f..249598161 100644
--- a/include/mruby/opcode.h
+++ b/include/mruby/opcode.h
@@ -40,4 +40,34 @@ enum mrb_insn {
#define FETCH_S() do {a=READ_S();} while (0)
#define FETCH_W() do {a=READ_W();} while (0)
+/* with OP_EXT1 (1st 16bit) */
+#define FETCH_Z_1() FETCH_Z()
+#define FETCH_B_1() FETCH_S()
+#define FETCH_BB_1() do {a=READ_S(); b=READ_B();} while (0)
+#define FETCH_BBB_1() do {a=READ_S(); b=READ_B(); c=READ_B();} while (0)
+#define FETCH_BS_1() do {a=READ_S(); b=READ_S();} while (0)
+#define FETCH_BSS_1() do {a=READ_S(); b=READ_S();c=READ_S();} while (0)
+#define FETCH_S_1() FETCH_S()
+#define FETCH_W_1() FETCH_W()
+
+/* with OP_EXT2 (2nd 16bit) */
+#define FETCH_Z_2() FETCH_Z()
+#define FETCH_B_2() FETCH_B()
+#define FETCH_BB_2() do {a=READ_B(); b=READ_S();} while (0)
+#define FETCH_BBB_2() do {a=READ_B(); b=READ_S(); c=READ_B();} while (0)
+#define FETCH_BS_2() FETCH_BS()
+#define FETCH_BSS_2() FETCH_BSS()
+#define FETCH_S_2() FETCH_S()
+#define FETCH_W_2() FETCH_W()
+
+/* with OP_EXT3 (1st & 2nd 16bit) */
+#define FETCH_Z_3() FETCH_Z()
+#define FETCH_B_3() FETCH_B()
+#define FETCH_BB_3() do {a=READ_S(); b=READ_S();} while (0)
+#define FETCH_BBB_3() do {a=READ_S(); b=READ_S(); c=READ_B();} while (0)
+#define FETCH_BS_3() do {a=READ_S(); b=READ_S();} while (0)
+#define FETCH_BSS_3() FETCH_BSS_1()
+#define FETCH_S_3() FETCH_S()
+#define FETCH_W_3() FETCH_W()
+
#endif /* MRUBY_OPCODE_H */
diff --git a/include/mruby/ops.h b/include/mruby/ops.h
index d5d8fb077..9b9fefeb0 100644
--- a/include/mruby/ops.h
+++ b/include/mruby/ops.h
@@ -15,7 +15,6 @@ operation code operands semantics
OPCODE(NOP, Z) /* no operation */
OPCODE(MOVE, BB) /* R(a) = R(b) */
OPCODE(LOADL, BB) /* R(a) = Pool(b) */
-OPCODE(LOADL16, BS) /* R(a) = Pool(b) */
OPCODE(LOADI, BB) /* R(a) = mrb_int(b) */
OPCODE(LOADINEG, BB) /* R(a) = mrb_int(-b) */
OPCODE(LOADI__1, B) /* R(a) = mrb_int(-1) */
@@ -30,7 +29,6 @@ OPCODE(LOADI_7, B) /* R(a) = mrb_int(7) */
OPCODE(LOADI16, BS) /* R(a) = mrb_int(b) */
OPCODE(LOADI32, BSS) /* R(a) = mrb_int((b<<16)+c) */
OPCODE(LOADSYM, BB) /* R(a) = Syms(b) */
-OPCODE(LOADSYM16, BS) /* R(a) = Syms(b) */
OPCODE(LOADNIL, B) /* R(a) = nil */
OPCODE(LOADSELF, B) /* R(a) = self */
OPCODE(LOADT, B) /* R(a) = true */
@@ -87,36 +85,35 @@ OPCODE(GE, B) /* R(a) = R(a)>=R(a+1) */
OPCODE(ARRAY, BB) /* R(a) = ary_new(R(a),R(a+1)..R(a+b)) */
OPCODE(ARRAY2, BBB) /* R(a) = ary_new(R(b),R(b+1)..R(b+c)) */
OPCODE(ARYCAT, B) /* ary_cat(R(a),R(a+1)) */
-OPCODE(ARYPUSH, B) /* ary_push(R(a),R(a+1)) */
+OPCODE(ARYPUSH, BB) /* ary_push(R(a),R(a+1)..R(a+b)) */
OPCODE(ARYDUP, B) /* R(a) = ary_dup(R(a)) */
OPCODE(AREF, BBB) /* R(a) = R(b)[c] */
OPCODE(ASET, BBB) /* R(a)[c] = R(b) */
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(STRING16, BS) /* R(a) = str_dup(Lit(b)) */
+OPCODE(SYMBOL, BB) /* R(a) = intern(Pool(b)) */
+OPCODE(STRING, BB) /* R(a) = str_dup(Pool(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*2-1)) */
-OPCODE(HASHADD, BB) /* R(a) = hash_push(R(a),R(a+1)..R(a+b*2)) */
+OPCODE(HASHADD, BB) /* 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(LAMBDA16, BS) /* R(a) = lambda(SEQ[b],L_LAMBDA) */
-OPCODE(BLOCK, BB) /* R(a) = lambda(SEQ[b],L_BLOCK) */
-OPCODE(BLOCK16, BS) /* R(a) = lambda(SEQ[b],L_BLOCK) */
-OPCODE(METHOD, BB) /* R(a) = lambda(SEQ[b],L_METHOD) */
-OPCODE(METHOD16, BS) /* R(a) = lambda(SEQ[b],L_METHOD) */
+OPCODE(LAMBDA, BB) /* R(a) = lambda(Irep(b),L_LAMBDA) */
+OPCODE(BLOCK, BB) /* R(a) = lambda(Irep(b),L_BLOCK) */
+OPCODE(METHOD, BB) /* R(a) = lambda(Irep(b),L_METHOD) */
OPCODE(RANGE_INC, B) /* R(a) = range_new(R(a),R(a+1),FALSE) */
OPCODE(RANGE_EXC, B) /* R(a) = range_new(R(a),R(a+1),TRUE) */
OPCODE(OCLASS, B) /* R(a) = ::Object */
OPCODE(CLASS, BB) /* R(a) = newclass(R(a),Syms(b),R(a+1)) */
OPCODE(MODULE, BB) /* R(a) = newmodule(R(a),Syms(b)) */
-OPCODE(EXEC, BB) /* R(a) = blockexec(R(a),SEQ[b]) */
-OPCODE(EXEC16, BS) /* R(a) = blockexec(R(a),SEQ[b]) */
-OPCODE(DEF, BB) /* R(a).newmethod(Syms(b),R(a+1)) */
+OPCODE(EXEC, BB) /* R(a) = blockexec(R(a),Irep(b)) */
+OPCODE(DEF, BB) /* R(a).newmethod(Syms(b),R(a+1)); R(a) = Syms(b) */
OPCODE(ALIAS, BB) /* alias_method(target_class,Syms(a),Syms(b)) */
OPCODE(UNDEF, B) /* undef_method(target_class,Syms(a)) */
OPCODE(SCLASS, B) /* R(a) = R(a).singleton_class */
OPCODE(TCLASS, B) /* R(a) = target_class */
OPCODE(DEBUG, BBB) /* print a,b,c */
-OPCODE(ERR, B) /* raise(LocalJumpError, Lit(a)) */
+OPCODE(ERR, B) /* raise(LocalJumpError, Pool(a)) */
+OPCODE(EXT1, Z) /* make 1st operand (a) 16bit */
+OPCODE(EXT2, Z) /* make 2nd operand (b) 16bit */
+OPCODE(EXT3, Z) /* make 1st and 2nd operands 16bit */
OPCODE(STOP, Z) /* stop VM */
diff --git a/include/mruby/string.h b/include/mruby/string.h
index 4410accd5..b296832af 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -324,20 +324,6 @@ MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len);
*/
MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
-/**
- * Returns a Ruby string type.
- *
- *
- * @param mrb The current mruby state.
- * @param str Ruby string.
- * @return [mrb_value] A Ruby string.
- */
-MRB_API mrb_value mrb_ensure_string_type(mrb_state *mrb, mrb_value str);
-MRB_API mrb_value mrb_check_string_type(mrb_state *mrb, mrb_value str);
-/* obsolete: use mrb_ensure_string_type() instead */
-MRB_API mrb_value mrb_string_type(mrb_state *mrb, mrb_value str);
-
-
MRB_API mrb_value mrb_str_new_capa(mrb_state *mrb, size_t capa);
#define mrb_str_buf_new(mrb, capa) mrb_str_new_capa(mrb, (capa))
@@ -369,17 +355,10 @@ MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str);
*/
MRB_API mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self);
-MRB_API mrb_value mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck);
-MRB_API mrb_value mrb_cstr_to_inum(mrb_state *mrb, const char *s, mrb_int base, mrb_bool badcheck);
+MRB_API mrb_value mrb_str_to_integer(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck);
+/* obsolete: use mrb_str_to_integer() */
+#define mrb_str_to_inum(mrb, str, base, badcheck) mrb_str_to_integer(mrb, str, base, badcheck)
MRB_API double mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck);
-MRB_API double mrb_cstr_to_dbl(mrb_state *mrb, const char *s, mrb_bool badcheck);
-
-/**
- * Returns a converted string type.
- * For type checking, non converting `mrb_to_str` is recommended.
- * obsolete: use `mrb_obj_as_string()` instead.
- */
-#define mrb_str_to_str(mrb, str) mrb_obj_as_string(mrb, str)
/**
* Returns true if the strings match and false if the strings don't match.
diff --git a/include/mruby/value.h b/include/mruby/value.h
index 39c01509d..ad439334b 100644
--- a/include/mruby/value.h
+++ b/include/mruby/value.h
@@ -31,7 +31,30 @@ typedef uint32_t mrb_sym;
* Not to be confused with Ruby's boolean classes, which can be
* obtained using mrb_false_value() and mrb_true_value()
*/
+#if defined(__cplusplus) || (defined(__bool_true_false_are_defined) && __bool_true_false_are_defined)
+typedef bool mrb_bool;
+
+# ifndef FALSE
+# define FALSE false
+# endif
+# ifndef TRUE
+# define TRUE true
+# endif
+#else
+# if __STDC_VERSION__ >= 199901L
+typedef _Bool mrb_bool;
+# else
typedef uint8_t mrb_bool;
+# endif
+
+# ifndef FALSE
+# define FALSE 0
+# endif
+# ifndef TRUE
+# define TRUE 1
+# endif
+#endif
+
struct mrb_state;
#if defined _MSC_VER && _MSC_VER < 1800
@@ -77,6 +100,7 @@ struct mrb_state;
# define MRB_ENDIAN_LOHI(a,b) b a
#endif
+MRB_API mrb_int mrb_int_read(const char *p, const char *e, char **endp);
#ifndef MRB_NO_FLOAT
MRB_API double mrb_float_read(const char*, char**);
#ifdef MRB_USE_FLOAT32
@@ -87,13 +111,11 @@ MRB_API double mrb_float_read(const char*, char**);
#endif
#if defined _MSC_VER && _MSC_VER < 1900
-# include <stdarg.h>
MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
# define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
# define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
# if _MSC_VER < 1800 && !defined MRB_NO_FLOAT
-# include <float.h>
# define isfinite(n) _finite(n)
# define isnan _isnan
# define isinf(n) (!_finite(n) && !_isnan(n))
@@ -104,36 +126,49 @@ static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
# endif
#endif
+#define MRB_VTYPE_FOREACH(f) \
+ /* mrb_vtype */ /* c type */ /* ruby class */ \
+ f(MRB_TT_FALSE, void, "false") \
+ f(MRB_TT_TRUE, void, "true") \
+ f(MRB_TT_SYMBOL, void, "Symbol") \
+ f(MRB_TT_UNDEF, void, "undefined") \
+ f(MRB_TT_FREE, void, "free") \
+ f(MRB_TT_FLOAT, struct RFloat, "Float") \
+ f(MRB_TT_INTEGER, struct RInteger, "Integer") \
+ f(MRB_TT_CPTR, struct RCptr, "cptr") \
+ f(MRB_TT_OBJECT, struct RObject, "Object") \
+ f(MRB_TT_CLASS, struct RClass, "Class") \
+ f(MRB_TT_MODULE, struct RClass, "Module") \
+ f(MRB_TT_ICLASS, struct RClass, "iClass") \
+ f(MRB_TT_SCLASS, struct RClass, "SClass") \
+ f(MRB_TT_PROC, struct RProc, "Proc") \
+ f(MRB_TT_ARRAY, struct RArray, "Array") \
+ f(MRB_TT_HASH, struct RHash, "Hash") \
+ f(MRB_TT_STRING, struct RString, "String") \
+ f(MRB_TT_RANGE, struct RRange, "Range") \
+ f(MRB_TT_EXCEPTION, struct RException, "Exception") \
+ f(MRB_TT_ENV, struct REnv, "env") \
+ f(MRB_TT_DATA, struct RData, "Data") \
+ f(MRB_TT_FIBER, struct RFiber, "Fiber") \
+ f(MRB_TT_STRUCT, struct RArray, "Struct") \
+ f(MRB_TT_ISTRUCT, struct RIStruct, "istruct") \
+ f(MRB_TT_BREAK, struct RBreak, "break") \
+ f(MRB_TT_COMPLEX, struct RComplex, "Complex") \
+ f(MRB_TT_RATIONAL, struct RRational, "Rational")
+
enum mrb_vtype {
- MRB_TT_FALSE = 0,
- MRB_TT_TRUE,
- MRB_TT_SYMBOL,
- MRB_TT_UNDEF,
- MRB_TT_FREE,
- MRB_TT_FLOAT,
- MRB_TT_INTEGER,
- MRB_TT_CPTR,
- 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_COMPLEX,
- MRB_TT_RATIONAL,
+#define MRB_VTYPE_DEFINE(tt, type, name) tt,
+ MRB_VTYPE_FOREACH(MRB_VTYPE_DEFINE)
+#undef MRB_VTYPE_DEFINE
MRB_TT_MAXDEFINE
};
+#define MRB_VTYPE_TYPEOF(tt) MRB_TYPEOF_##tt
+
+#define MRB_VTYPE_TYPEDEF(tt, type, name) typedef type MRB_VTYPE_TYPEOF(tt);
+MRB_VTYPE_FOREACH(MRB_VTYPE_TYPEDEF)
+#undef MRB_VTYPE_TYPEDEF
+
/* for compatibility */
#define MRB_TT_FIXNUM MRB_TT_INTEGER
@@ -374,26 +409,29 @@ mrb_undef_value(void)
return v;
}
-#if defined(MRB_USE_ETEXT_EDATA) && !defined(MRB_USE_LINK_TIME_RO_DATA_P)
-# ifdef __GNUC__
-# warning MRB_USE_ETEXT_EDATA is deprecated. Define MRB_USE_LINK_TIME_RO_DATA_P instead.
-# endif
-# define MRB_USE_LINK_TIME_RO_DATA_P
-#endif
-
#if defined(MRB_USE_CUSTOM_RO_DATA_P)
/* If you define `MRB_USE_CUSTOM_RO_DATA_P`, you must implement `mrb_ro_data_p()`. */
mrb_bool mrb_ro_data_p(const char *p);
-#elif defined(MRB_USE_LINK_TIME_RO_DATA_P)
-extern char __ehdr_start[];
-extern char __init_array_start[];
-
+#elif !defined(MRB_NO_DEFAULT_RO_DATA_P)
+#if defined(MRB_USE_ETEXT_RO_DATA_P)
+#define MRB_LINK_TIME_RO_DATA_P
+extern char etext, edata;
static inline mrb_bool
mrb_ro_data_p(const char *p)
{
- return __ehdr_start < p && p < __init_array_start;
+ return &etext < p && p < &edata;
}
-#else
+#elif defined(__APPLE__)
+#define MRB_LINK_TIME_RO_DATA_P
+#include <mach-o/getsect.h>
+static inline mrb_bool
+mrb_ro_data_p(const char *p)
+{
+ return (char*)get_etext() < p && p < (char*)get_edata();
+}
+#endif /* Linux or macOS */
+#endif /* MRB_NO_DEFAULT_RO_DATA_P */
+#ifndef MRB_LINK_TIME_RO_DATA_P
# define mrb_ro_data_p(p) FALSE
#endif
diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb
index 716f21286..fa0bb3a49 100644
--- a/lib/mruby/gem.rb
+++ b/lib/mruby/gem.rb
@@ -253,7 +253,7 @@ module MRuby
f.puts %Q[#include <mruby.h>]
else
f.puts %Q[#include <stdlib.h>]
- unless build.presym_enabled?
+ unless cdump?
f.puts %Q[#include <mruby.h>]
f.puts %Q[#include <mruby/proc.h>]
end
diff --git a/lib/mruby/presym.rb b/lib/mruby/presym.rb
index 6a68cf65c..016c2b20e 100644
--- a/lib/mruby/presym.rb
+++ b/lib/mruby/presym.rb
@@ -99,7 +99,7 @@ module MRuby
end
def list_path
- @list_pat ||= "#{@build.build_dir}/presym".freeze
+ @list_path ||= "#{@build.build_dir}/presym".freeze
end
def header_dir;
diff --git a/lib/mruby/source.rb b/lib/mruby/source.rb
index a305c7b04..ce9e558dc 100644
--- a/lib/mruby/source.rb
+++ b/lib/mruby/source.rb
@@ -2,7 +2,7 @@ require "pathname"
module MRuby
module Source
- # MRuby's source root directory
+ # mruby's source root directory
ROOT = Pathname.new(File.expand_path('../../../',__FILE__))
# Reads a constant defined at version.h
diff --git a/minirake b/minirake
index 3a9d2f8cb..643e5baec 100755
--- a/minirake
+++ b/minirake
@@ -1,2 +1,2 @@
-#! /usr/bin/env ruby
+#!/usr/bin/env ruby
exec "rake", *ARGV
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index ecd09aa6e..7520b932f 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -150,7 +150,7 @@ class Array
# [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
#
def &(elem)
- raise TypeError, "can't convert #{elem.class} into Array" unless elem.class == Array
+ raise TypeError, "cannot convert #{elem.class} into Array" unless elem.class == Array
hash = {}
array = []
@@ -204,7 +204,7 @@ class Array
# a.intersect?(b) #=> true
# a.intersect?(c) #=> false
def intersect?(ary)
- raise TypeError, "can't convert #{ary.class} into Array" unless ary.class == Array
+ raise TypeError, "cannot convert #{ary.class} into Array" unless ary.class == Array
hash = {}
if self.length > ary.length
@@ -294,41 +294,6 @@ class Array
end
end
- ##
- # call-seq:
- # ary.compact -> new_ary
- #
- # Returns a copy of +self+ with all +nil+ elements removed.
- #
- # [ "a", nil, "b", nil, "c", nil ].compact
- # #=> [ "a", "b", "c" ]
- #
- def compact
- result = self.dup
- result.compact!
- result
- end
-
- ##
- # call-seq:
- # ary.compact! -> ary or nil
- #
- # Removes +nil+ elements from the array.
- # Returns +nil+ if no changes were made, otherwise returns
- # <i>ary</i>.
- #
- # [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ]
- # [ "a", "b", "c" ].compact! #=> nil
- #
- def compact!
- result = self.select { |e| !e.nil? }
- if result.size == self.size
- nil
- else
- self.replace(result)
- end
- end
-
# for efficiency
def reverse_each(&block)
return to_enum :reverse_each unless block
@@ -421,7 +386,6 @@ class Array
end
beg = len = 0
- ary = []
if block
if arg0.nil? && arg1.nil? && arg2.nil?
# ary.fill { |index| block } -> ary
@@ -485,57 +449,6 @@ class Array
##
# call-seq:
- # ary.rotate(count=1) -> new_ary
- #
- # Returns a new array by rotating +self+ so that the element at +count+ is
- # the first element of the new array.
- #
- # If +count+ is negative then it rotates in the opposite direction, starting
- # from the end of +self+ where +-1+ is the last element.
- #
- # a = [ "a", "b", "c", "d" ]
- # a.rotate #=> ["b", "c", "d", "a"]
- # a #=> ["a", "b", "c", "d"]
- # a.rotate(2) #=> ["c", "d", "a", "b"]
- # a.rotate(-3) #=> ["b", "c", "d", "a"]
-
- def rotate(count=1)
- ary = []
- len = self.length
-
- if len > 0
- idx = (count < 0) ? (len - (~count % len) - 1) : (count % len) # rotate count
- len.times do
- ary << self[idx]
- idx += 1
- idx = 0 if idx > len-1
- end
- end
- ary
- end
-
- ##
- # call-seq:
- # ary.rotate!(count=1) -> ary
- #
- # Rotates +self+ in place so that the element at +count+ comes first, and
- # returns +self+.
- #
- # If +count+ is negative then it rotates in the opposite direction, starting
- # from the end of the array where +-1+ is the last element.
- #
- # a = [ "a", "b", "c", "d" ]
- # a.rotate! #=> ["b", "c", "d", "a"]
- # a #=> ["b", "c", "d", "a"]
- # a.rotate!(2) #=> ["d", "a", "b", "c"]
- # a.rotate!(-3) #=> ["a", "b", "c", "d"]
-
- def rotate!(count=1)
- self.replace(self.rotate(count))
- end
-
- ##
- # call-seq:
# ary.delete_if { |item| block } -> ary
# ary.delete_if -> Enumerator
#
@@ -746,7 +659,6 @@ class Array
return to_enum :keep_if unless block
idx = 0
- len = self.size
while idx < self.size do
if block.call(self[idx])
idx += 1
@@ -961,7 +873,7 @@ class Array
# ary.to_h -> Hash
# ary.to_h{|item| ... } -> Hash
#
- # Returns the result of interpreting <i>aray</i> as an array of
+ # Returns the result of interpreting <i>array</i> as an array of
# <tt>[key, value]</tt> pairs. If a block is given, it should
# return <tt>[key, value]</tt> pairs to construct a hash.
#
diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c
index 8df9d7f30..d97778642 100644
--- a/mrbgems/mruby-array-ext/src/array.c
+++ b/mrbgems/mruby-array-ext/src/array.c
@@ -95,6 +95,12 @@ mrb_ary_at(mrb_state *mrb, mrb_value ary)
}
static mrb_value
+ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n)
+{
+ return mrb_ary_entry(ary, n);
+}
+
+static mrb_value
mrb_ary_values_at(mrb_state *mrb, mrb_value self)
{
mrb_int argc;
@@ -102,10 +108,9 @@ mrb_ary_values_at(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "*", &argv, &argc);
- return mrb_get_values_at(mrb, self, RARRAY_LEN(self), argc, argv, mrb_ary_ref);
+ return mrb_get_values_at(mrb, self, RARRAY_LEN(self), argc, argv, ary_ref);
}
-
/*
* call-seq:
* ary.slice!(index) -> obj or nil
@@ -183,6 +188,168 @@ mrb_ary_slice_bang(mrb_state *mrb, mrb_value self)
return ary;
}
+/*
+ * call-seq:
+ * ary.compact -> new_ary
+ *
+ * Returns a copy of +self+ with all +nil+ elements removed.
+ *
+ * [ "a", nil, "b", nil, "c", nil ].compact
+ * #=> [ "a", "b", "c" ]
+ */
+
+static mrb_value
+mrb_ary_compact(mrb_state *mrb, mrb_value self)
+{
+ mrb_value ary = mrb_ary_new(mrb);
+ mrb_int len = RARRAY_LEN(self);
+ mrb_value *p = RARRAY_PTR(self);
+
+ for (mrb_int i = 0; i < len; ++i) {
+ if (!mrb_nil_p(p[i])) {
+ mrb_ary_push(mrb, ary, p[i]);
+ }
+ }
+ return ary;
+}
+
+/*
+ * call-seq:
+ * ary.compact! -> ary or nil
+ *
+ * Removes +nil+ elements from the array.
+ * Returns +nil+ if no changes were made, otherwise returns
+ * <i>ary</i>.
+ *
+ * [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ]
+ * [ "a", "b", "c" ].compact! #=> nil
+ */
+static mrb_value
+mrb_ary_compact_bang(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_int i, j = 0;
+ mrb_int len = ARY_LEN(a);
+ mrb_value *p = ARY_PTR(a);
+
+ mrb_ary_modify(mrb, a);
+ for (i = 0; i < len; ++i) {
+ if (!mrb_nil_p(p[i])) {
+ if (i != j) p[j] = p[i];
+ j++;
+ }
+ }
+ if (i == j) return mrb_nil_value();
+ if (j < len) ARY_SET_LEN(RARRAY(self), j);
+ return self;
+}
+
+
+/*
+ * call-seq:
+ * ary.rotate(count=1) -> new_ary
+ *
+ * Returns a new array by rotating +self+ so that the element at +count+ is
+ * the first element of the new array.
+ *
+ * If +count+ is negative then it rotates in the opposite direction, starting
+ * from the end of +self+ where +-1+ is the last element.
+ *
+ * a = [ "a", "b", "c", "d" ]
+ * a.rotate #=> ["b", "c", "d", "a"]
+ * a #=> ["a", "b", "c", "d"]
+ * a.rotate(2) #=> ["c", "d", "a", "b"]
+ * a.rotate(-3) #=> ["b", "c", "d", "a"]
+ */
+static mrb_value
+mrb_ary_rotate(mrb_state *mrb, mrb_value self)
+{
+ mrb_value ary = mrb_ary_new(mrb);
+ mrb_int len = RARRAY_LEN(self);
+ mrb_value *p = RARRAY_PTR(self);
+ mrb_int count=1, idx;
+
+ mrb_get_args(mrb, "|i", &count);
+ if (len <= 0) return ary;
+ if (count < 0) {
+ idx = len - (~count % len) - 1;
+ }
+ else {
+ idx = count % len;
+ }
+ for (mrb_int i = 0; i<len; i++) {
+ mrb_ary_push(mrb, ary, p[idx++]);
+ if (idx == len) idx = 0;
+ }
+ return ary;
+}
+
+static void
+rev(mrb_value *p, mrb_int beg, mrb_int end)
+{
+ for (mrb_int i=beg,j=end-1; i<j; i++,j--) {
+ mrb_value v = p[i];
+ p[i] = p[j];
+ p[j] = v;
+ }
+}
+
+/*
+ * call-seq:
+ * ary.rotate!(count=1) -> ary
+ *
+ * Rotates +self+ in place so that the element at +count+ comes first, and
+ * returns +self+.
+ *
+ * If +count+ is negative then it rotates in the opposite direction, starting
+ * from the end of the array where +-1+ is the last element.
+ *
+ * a = [ "a", "b", "c", "d" ]
+ * a.rotate! #=> ["b", "c", "d", "a"]
+ * a #=> ["b", "c", "d", "a"]
+ * a.rotate!(2) #=> ["d", "a", "b", "c"]
+ * a.rotate!(-3) #=> ["a", "b", "c", "d"]
+ */
+static mrb_value
+mrb_ary_rotate_bang(mrb_state *mrb, mrb_value self)
+{
+ struct RArray *a = mrb_ary_ptr(self);
+ mrb_int len = ARY_LEN(a);
+ mrb_value *p = ARY_PTR(a);
+ mrb_int count=1, idx;
+
+ mrb_get_args(mrb, "|i", &count);
+ mrb_ary_modify(mrb, a);
+ if (len == 0 || count == 0) return self;
+ if (count == 1) {
+ mrb_value v = p[0];
+ for (mrb_int i=1; i<len; i++) {
+ p[i-1] = p[i];
+ }
+ p[len-1] = v;
+ return self;
+ }
+ if (count < 0) {
+ idx = len - (~count % len) - 1;
+ }
+ else {
+ idx = count % len;
+ }
+ /* e.g. [1,2,3,4,5].rotate!(2) -> [3,4,5,1,2] */
+ /* first, reverse the whole array */
+ /* [1,2,3,4,5] -> [5,4,3,2,1] */
+ rev(p, 0, len);
+ /* then, re-reverse part before idx */
+ /* [5,4,3,2,1] -> [3,4,5,2,1] */
+ /* ^idx ~~~~~ */
+ rev(p, 0, len-idx);
+ /* finally, re-reverse part after idx */
+ /* [3,4,5,2,1] -> [3,4,5,1,2] */
+ /* ^idx ~~~ */
+ rev(p, len-idx, len);
+ return self;
+}
+
void
mrb_mruby_array_ext_gem_init(mrb_state* mrb)
{
@@ -192,7 +359,11 @@ mrb_mruby_array_ext_gem_init(mrb_state* mrb)
mrb_define_method(mrb, a, "at", mrb_ary_at, MRB_ARGS_REQ(1));
mrb_define_method(mrb, a, "rassoc", mrb_ary_rassoc, MRB_ARGS_REQ(1));
mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY());
- mrb_define_method(mrb, a, "slice!", mrb_ary_slice_bang, MRB_ARGS_ARG(1,1));
+ mrb_define_method(mrb, a, "slice!", mrb_ary_slice_bang, MRB_ARGS_ARG(1,1));
+ mrb_define_method(mrb, a, "compact", mrb_ary_compact, MRB_ARGS_NONE());
+ mrb_define_method(mrb, a, "compact!", mrb_ary_compact_bang, MRB_ARGS_NONE());
+ mrb_define_method(mrb, a, "rotate", mrb_ary_rotate, MRB_ARGS_OPT(1));
+ mrb_define_method(mrb, a, "rotate!", mrb_ary_rotate_bang, MRB_ARGS_OPT(1));
}
void
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c b/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c
index 4d139aa76..55c6cd125 100644
--- a/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c
@@ -14,30 +14,49 @@
#include <mruby/variable.h>
#include "mrdberror.h"
#include "apibreak.h"
+#include "apistring.h"
#define MAX_BREAKPOINTNO (MAX_BREAKPOINT * 1024)
#define MRB_DEBUG_BP_FILE_OK (0x0001)
#define MRB_DEBUG_BP_LINENO_OK (0x0002)
+uint32_t mrb_packed_int_decode(uint8_t *p, uint8_t **newpos);
+
static uint16_t
check_lineno(mrb_irep_debug_info_file *info_file, uint16_t lineno)
{
uint32_t count = info_file->line_entry_count;
uint16_t l_idx;
- if (info_file->line_type == mrb_debug_line_ary) {
+ switch (info_file->line_type) {
+ case mrb_debug_line_ary:
for (l_idx = 0; l_idx < count; ++l_idx) {
if (lineno == info_file->lines.ary[l_idx]) {
return lineno;
}
}
- }
- else {
+ break;
+
+ case mrb_debug_line_flat_map:
for (l_idx = 0; l_idx < count; ++l_idx) {
if (lineno == info_file->lines.flat_map[l_idx].line) {
return lineno;
}
}
+ break;
+
+ case mrb_debug_line_packed_map:
+ {
+ uint8_t *p = info_file->lines.packed_map;
+ uint8_t *pend = p + count;
+ uint32_t line = 0;
+ while (p < pend) {
+ mrb_packed_int_decode(p, &p);
+ line += mrb_packed_int_decode(p, &p);
+ if (line == lineno) return lineno;
+ }
+ }
+ break;
}
return 0;
@@ -173,7 +192,6 @@ mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *fil
int32_t index;
char* set_file;
uint16_t result;
- size_t len;
if ((mrb == NULL)||(dbg == NULL)||(file == NULL)) {
return MRB_DEBUG_INVALID_ARGUMENT;
@@ -187,7 +205,7 @@ mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *fil
return MRB_DEBUG_BREAK_NO_OVER;
}
- /* file and lineno check (line type mrb_debug_line_ary only.) */
+ /* file and lineno check. */
result = check_file_lineno(mrb, dbg->root_irep, file, lineno);
if (result == 0) {
return MRB_DEBUG_BREAK_INVALID_FILE;
@@ -196,8 +214,7 @@ mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *fil
return MRB_DEBUG_BREAK_INVALID_LINENO;
}
- len = strlen(file) + 1;
- set_file = (char*)mrb_malloc(mrb, len);
+ set_file = mrdb_strdup(mrb, file);
index = dbg->bpnum;
dbg->bp[index].bpno = dbg->next_bpno;
@@ -207,8 +224,6 @@ mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *fil
dbg->bp[index].point.linepoint.lineno = lineno;
dbg->bpnum++;
- strncpy(set_file, file, len);
-
dbg->bp[index].point.linepoint.file = set_file;
return dbg->bp[index].bpno;
@@ -220,7 +235,6 @@ mrb_debug_set_break_method(mrb_state *mrb, mrb_debug_context *dbg, const char *c
int32_t index;
char* set_class;
char* set_method;
- size_t len;
if ((mrb == NULL) || (dbg == NULL) || (method_name == NULL)) {
return MRB_DEBUG_INVALID_ARGUMENT;
@@ -235,18 +249,16 @@ mrb_debug_set_break_method(mrb_state *mrb, mrb_debug_context *dbg, const char *c
}
if (class_name != NULL) {
- len = strlen(class_name) + 1;
- set_class = (char*)mrb_malloc(mrb, len);
- strncpy(set_class, class_name, len);
+ set_class = mrdb_strdup(mrb, class_name);
}
else {
set_class = NULL;
}
- len = strlen(method_name) + 1;
- set_method = (char*)mrb_malloc(mrb, len);
-
- strncpy(set_method, method_name, len);
+ set_method = mrdb_strdup(mrb, method_name);
+ if (set_method == NULL) {
+ mrb_free(mrb, set_class);
+ }
index = dbg->bpnum;
dbg->bp[index].bpno = dbg->next_bpno;
@@ -332,10 +344,10 @@ mrb_debug_delete_break(mrb_state *mrb, mrb_debug_context *dbg, uint32_t bpno)
for(i = index ; i < dbg->bpnum; i++) {
if ((i + 1) == dbg->bpnum) {
- memset(&dbg->bp[i], 0, sizeof(mrb_debug_breakpoint));
+ dbg->bp[i] = (mrb_debug_breakpoint){0};
}
else {
- memcpy(&dbg->bp[i], &dbg->bp[i + 1], sizeof(mrb_debug_breakpoint));
+ dbg->bp[i] = dbg->bp[i + 1];
}
}
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c b/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c
index 66ddfa783..27db02b48 100644
--- a/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c
@@ -3,12 +3,12 @@
*/
#include <ctype.h>
-#include <stdlib.h>
#include <string.h>
#include "mrdb.h"
#include "mrdberror.h"
#include "apilist.h"
+#include "apistring.h"
#include <mruby/compile.h>
#include <mruby/irep.h>
#include <mruby/debug.h>
@@ -65,7 +65,6 @@ dirname(mrb_state *mrb, const char *path)
{
size_t len;
const char *p;
- char *dir;
if (path == NULL) {
return NULL;
@@ -74,11 +73,7 @@ dirname(mrb_state *mrb, const char *path)
p = strrchr(path, '/');
len = p != NULL ? (size_t)(p - path) : strlen(path);
- dir = (char*)mrb_malloc(mrb, len + 1);
- strncpy(dir, path, len);
- dir[len] = '\0';
-
- return dir;
+ return mrdb_strndup(mrb, path, len);
}
static source_file*
@@ -97,8 +92,11 @@ source_file_new(mrb_state *mrb, mrb_debug_context *dbg, char *filename)
}
file->lineno = 1;
- file->path = (char*)mrb_malloc(mrb, strlen(filename) + 1);
- strcpy(file->path, filename);
+ file->path = mrdb_strdup(mrb, filename);
+ if (file->path == NULL) {
+ source_file_free(mrb, file);
+ return NULL;
+ }
return file;
}
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c
new file mode 100644
index 000000000..a7b320ade
--- /dev/null
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c
@@ -0,0 +1,34 @@
+/*
+** apistring.c
+**
+*/
+
+#include <string.h>
+#include "apistring.h"
+
+static size_t
+mrb_debug_strnlen(const char *s, size_t maxlen)
+{
+ const char *p = (const char*)memchr(s, '\0', maxlen);
+ return p != NULL ? (size_t)(p - s) : maxlen;
+}
+
+char*
+mrdb_strndup(mrb_state *mrb, const char *s, size_t size)
+{
+ size_t l = mrb_debug_strnlen(s, size);
+ char *d = (char*)mrb_malloc_simple(mrb, l + 1);
+ if (d != NULL) {
+ memcpy(d, s, l);
+ d[l] = '\0';
+ }
+ return d;
+}
+
+char*
+mrdb_strdup(mrb_state *mrb, const char *s)
+{
+ size_t z = strlen(s) + 1;
+ char *d = (char*)mrb_malloc_simple(mrb, z);
+ return d != NULL ? (char*)memcpy(d, s, z) : NULL;
+}
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h
new file mode 100644
index 000000000..33737e7fd
--- /dev/null
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h
@@ -0,0 +1,14 @@
+/*
+ * apistring.h
+ */
+
+#ifndef APISTRING_H_
+#define APISTRING_H_
+
+#include "mruby.h"
+
+/* both functions return a null pointer on failure */
+char *mrdb_strndup(mrb_state *mrb, const char *s, size_t size);
+char *mrdb_strdup(mrb_state *mrb, const char *s);
+
+#endif /* APISTRING_H_ */
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c b/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
index a05ff9415..0714f3f21 100644
--- a/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c
@@ -8,6 +8,7 @@
#include <string.h>
#include "apilist.h"
+#include "apistring.h"
#include <mruby/compile.h>
typedef struct help_msg {
@@ -140,7 +141,8 @@ static listcmd_parser_state*
listcmd_parser_state_new(mrb_state *mrb)
{
listcmd_parser_state *st = (listcmd_parser_state*)mrb_malloc(mrb, sizeof(listcmd_parser_state));
- memset(st, 0, sizeof(listcmd_parser_state));
+ static const listcmd_parser_state st_zero = {0};
+ *st = st_zero;
return st;
}
@@ -232,10 +234,7 @@ parse_filename(mrb_state *mrb, char **sp, listcmd_parser_state *st)
len = strlen(*sp);
}
- if (len > 0) {
- st->filename = (char*)mrb_malloc(mrb, len + 1);
- strncpy(st->filename, *sp, len);
- st->filename[len] = '\0';
+ if (len > 0 && (st->filename = mrdb_strndup(mrb, *sp, len)) != NULL) {
*sp += len;
return TRUE;
}
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c
index 009cd955c..ee2ae0aca 100644
--- a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c
+++ b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c
@@ -186,9 +186,9 @@ static mrb_debug_context*
mrb_debug_context_new(mrb_state *mrb)
{
mrb_debug_context *dbg = (mrb_debug_context*)mrb_malloc(mrb, sizeof(mrb_debug_context));
+ static const mrb_debug_context dbg_zero = {0};
- memset(dbg, 0, sizeof(mrb_debug_context));
-
+ *dbg = dbg_zero;
dbg->xm = DBG_INIT;
dbg->xphase = DBG_PHASE_BEFORE_RUN;
dbg->next_bpno = 1;
@@ -225,9 +225,9 @@ static mrdb_state*
mrdb_state_new(mrb_state *mrb)
{
mrdb_state *mrdb = (mrdb_state*)mrb_malloc(mrb, sizeof(mrdb_state));
+ static const mrdb_state mrdb_zero = {0};
- memset(mrdb, 0, sizeof(mrdb_state));
-
+ *mrdb = mrdb_zero;
mrdb->dbg = mrb_debug_context_get(mrb);
mrdb->command = (char*)mrb_malloc(mrb, MAX_COMMAND_LINE+1);
mrdb->print_no = 1;
@@ -574,7 +574,7 @@ mrb_code_fetch_hook(mrb_state *mrb, const mrb_irep *irep, const mrb_code *pc, mr
switch (dbg->xm) {
case DBG_STEP:
- if (!file || (dbg->prvfile == file && dbg->prvline == line)) {
+ if (*pc != OP_JMP && (!file || (dbg->prvfile == file && dbg->prvline == line))) {
return;
}
dbg->method_bpno = 0;
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
index 464df1c24..db92d7266 100644
--- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
+++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
@@ -134,7 +134,7 @@ p(mrb_state *mrb, mrb_value obj, int prompt)
}
/* Guess if the user might want to enter more
- * or if he wants an evaluation of his code now */
+ * or if they wants an evaluation of their code now */
static mrb_bool
is_code_block_open(struct mrb_parser_state *parser)
{
diff --git a/mrbgems/mruby-binding-core/src/binding-core.c b/mrbgems/mruby-binding-core/src/binding-core.c
index 1454f5945..5e104e720 100644
--- a/mrbgems/mruby-binding-core/src/binding-core.c
+++ b/mrbgems/mruby-binding-core/src/binding-core.c
@@ -24,16 +24,16 @@ binding_extract_pc(mrb_state *mrb, mrb_value binding)
}
}
-static const struct RProc *
-binding_extract_proc(mrb_state *mrb, mrb_value binding)
+const struct RProc *
+mrb_binding_extract_proc(mrb_state *mrb, mrb_value binding)
{
mrb_value obj = mrb_iv_get(mrb, binding, MRB_SYM(proc));
mrb_check_type(mrb, obj, MRB_TT_PROC);
return mrb_proc_ptr(obj);
}
-static struct REnv *
-binding_extract_env(mrb_state *mrb, mrb_value binding)
+struct REnv *
+mrb_binding_extract_env(mrb_state *mrb, mrb_value binding)
{
mrb_value obj = mrb_iv_get(mrb, binding, MRB_SYM(env));
if (mrb_nil_p(obj)) {
@@ -108,8 +108,8 @@ binding_local_variable_defined_p(mrb_state *mrb, mrb_value self)
mrb_sym varname;
mrb_get_args(mrb, "n", &varname);
- const struct RProc *proc = binding_extract_proc(mrb, self);
- struct REnv *env = binding_extract_env(mrb, self);
+ const struct RProc *proc = mrb_binding_extract_proc(mrb, self);
+ struct REnv *env = mrb_binding_extract_env(mrb, self);
mrb_value *e = binding_local_variable_search(mrb, proc, env, varname);
if (e) {
return mrb_true_value();
@@ -129,8 +129,8 @@ binding_local_variable_get(mrb_state *mrb, mrb_value self)
mrb_sym varname;
mrb_get_args(mrb, "n", &varname);
- const struct RProc *proc = binding_extract_proc(mrb, self);
- struct REnv *env = binding_extract_env(mrb, self);
+ const struct RProc *proc = mrb_binding_extract_proc(mrb, self);
+ struct REnv *env = mrb_binding_extract_env(mrb, self);
mrb_value *e = binding_local_variable_search(mrb, proc, env, varname);
if (!e) {
mrb_raisef(mrb, E_NAME_ERROR, "local variable %!n is not defined", varname);
@@ -146,11 +146,14 @@ binding_local_variable_set(mrb_state *mrb, mrb_value self)
mrb_value obj;
mrb_get_args(mrb, "no", &varname, &obj);
- const struct RProc *proc = binding_extract_proc(mrb, self);
- struct REnv *env = binding_extract_env(mrb, self);
+ const struct RProc *proc = mrb_binding_extract_proc(mrb, self);
+ struct REnv *env = mrb_binding_extract_env(mrb, self);
mrb_value *e = binding_local_variable_search(mrb, proc, env, varname);
if (e) {
*e = obj;
+ if (!mrb_immediate_p(obj)) {
+ mrb_field_write_barrier(mrb, (struct RBasic*)env, (struct RBasic*)mrb_obj_ptr(obj));
+ }
}
else {
mrb_proc_merge_lvar(mrb, (mrb_irep*)proc->body.irep, env, 1, &varname, &obj);
@@ -184,7 +187,7 @@ binding_source_location(mrb_state *mrb, mrb_value self)
}
mrb_value srcloc;
- const struct RProc *proc = binding_extract_proc(mrb, self);
+ const struct RProc *proc = mrb_binding_extract_proc(mrb, self);
if (!proc || MRB_PROC_CFUNC_P(proc) ||
!proc->upper || MRB_PROC_CFUNC_P(proc->upper)) {
srcloc = mrb_nil_value();
@@ -217,7 +220,7 @@ binding_source_location(mrb_state *mrb, mrb_value self)
mrb_value
mrb_binding_alloc(mrb_state *mrb)
{
- struct RObject *obj = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb_class_get_id(mrb, MRB_SYM(Binding)));
+ struct RObject *obj = MRB_OBJ_ALLOC(mrb, MRB_TT_OBJECT, mrb_class_get_id(mrb, MRB_SYM(Binding)));
return mrb_obj_value(obj);
}
@@ -231,7 +234,7 @@ mrb_binding_wrap_lvspace(mrb_state *mrb, const struct RProc *proc, struct REnv *
static const mrb_code iseq_dummy[] = { OP_RETURN, 0 };
- struct RProc *lvspace = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ struct RProc *lvspace = MRB_OBJ_ALLOC(mrb, MRB_TT_PROC, mrb->proc_class);
mrb_irep *irep = mrb_add_irep(mrb);
irep->flags = MRB_ISEQ_NO_FREE;
irep->iseq = iseq_dummy;
@@ -246,7 +249,7 @@ mrb_binding_wrap_lvspace(mrb_state *mrb, const struct RProc *proc, struct REnv *
lvspace->flags |= MRB_PROC_ENVSET;
}
- *envp = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL);
+ *envp = MRB_OBJ_ALLOC(mrb, MRB_TT_ENV, NULL);
(*envp)->stack = (mrb_value*)mrb_calloc(mrb, 1, sizeof(mrb_value));
(*envp)->stack[0] = lvspace->e.env ? lvspace->e.env->stack[0] : mrb_nil_value();
(*envp)->cxt = lvspace->e.env ? lvspace->e.env->cxt : mrb->c;
diff --git a/mrbgems/mruby-binding/mrblib/binding.rb b/mrbgems/mruby-binding/mrblib/binding.rb
deleted file mode 100644
index b07480db1..000000000
--- a/mrbgems/mruby-binding/mrblib/binding.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class Binding
- def eval(expr, *args)
- Kernel.eval(expr, self, *args)
- end
-end
diff --git a/mrbgems/mruby-binding/src/binding.c b/mrbgems/mruby-binding/src/binding.c
new file mode 100644
index 000000000..67692e2b9
--- /dev/null
+++ b/mrbgems/mruby-binding/src/binding.c
@@ -0,0 +1,173 @@
+#include <mruby.h>
+#include <mruby/array.h>
+#include <mruby/class.h>
+#include <mruby/compile.h>
+#include <mruby/error.h>
+#include <mruby/proc.h>
+#include <mruby/presym.h>
+#include <mruby/string.h>
+
+mrb_noreturn void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args);
+void mrb_proc_merge_lvar(mrb_state *mrb, mrb_irep *irep, struct REnv *env, int num, const mrb_sym *lv, const mrb_value *stack);
+mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p);
+const struct RProc *mrb_binding_extract_proc(mrb_state *mrb, mrb_value binding);
+struct REnv *mrb_binding_extract_env(mrb_state *mrb, mrb_value binding);
+typedef mrb_bool mrb_parser_foreach_top_variable_func(mrb_state *mrb, mrb_sym sym, void *user);
+void mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user);
+
+static void
+insert_args(mrb_state *mrb, size_t offset, mrb_value obj)
+{
+ mrb_callinfo *ci = mrb->c->ci;
+ mrb_value *argp = ci->stack + 1 /* recv */;
+
+ if (ci->argc < 0) {
+ mrb_ary_splice(mrb, *argp, offset, 0, obj);
+ }
+ else {
+ argp += offset;
+ mrb_stack_extend(mrb, ci->argc + offset + 2 /* recv + block */);
+ memmove(argp + 1 /* obj */, argp, sizeof(mrb_value) * (ci->argc - offset + 1 /* block */));
+ *argp = obj;
+ ci->argc++;
+ }
+}
+
+static void
+binding_eval_error_check(mrb_state *mrb, struct mrb_parser_state *p, const char *file)
+{
+ if (!p) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state (out of memory)");
+ }
+
+ if (0 < p->nerr) {
+ mrb_value str;
+
+ if (file) {
+ str = mrb_format(mrb, "file %s line %d: %s",
+ file,
+ p->error_buffer[0].lineno,
+ p->error_buffer[0].message);
+ }
+ else {
+ str = mrb_format(mrb, "line %d: %s",
+ p->error_buffer[0].lineno,
+ p->error_buffer[0].message);
+ }
+ mrb_exc_raise(mrb, mrb_exc_new_str(mrb, E_SYNTAX_ERROR, str));
+ }
+}
+
+#define LV_BUFFERS 8
+
+struct expand_lvspace {
+ mrb_irep *irep;
+ struct REnv *env;
+ size_t numvar;
+ mrb_sym syms[LV_BUFFERS];
+};
+
+static mrb_bool
+expand_lvspace(mrb_state *mrb, mrb_sym sym, void *user)
+{
+ struct expand_lvspace *p = (struct expand_lvspace*)user;
+ mrb_int symlen;
+ const char *symname = mrb_sym_name_len(mrb, sym, &symlen);
+
+ if (symname && symlen > 0) {
+ if (symname[0] != '&' && symname[0] != '*') {
+ p->syms[p->numvar++] = sym;
+ if (p->numvar >= LV_BUFFERS) {
+ mrb_proc_merge_lvar(mrb, p->irep, p->env, p->numvar, p->syms, NULL);
+ p->numvar = 0;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+struct binding_eval_prepare_body {
+ mrb_value binding;
+ const char *file;
+ const char *expr;
+ mrb_int exprlen;
+ mrbc_context *mrbc;
+ struct mrb_parser_state *pstate;
+};
+
+static mrb_value
+binding_eval_prepare_body(mrb_state *mrb, void *opaque)
+{
+ struct binding_eval_prepare_body *p = (struct binding_eval_prepare_body*)opaque;
+
+ const struct RProc *proc = mrb_binding_extract_proc(mrb, p->binding);
+ mrb_assert(!MRB_PROC_CFUNC_P(proc));
+
+ p->mrbc = mrbc_context_new(mrb);
+ mrbc_filename(mrb, p->mrbc, p->file ? p->file : "(eval)");
+ p->mrbc->upper = proc;
+ p->mrbc->capture_errors = TRUE;
+ p->pstate = mrb_parse_nstring(mrb, p->expr, p->exprlen, p->mrbc);
+ binding_eval_error_check(mrb, p->pstate, p->file);
+
+ struct expand_lvspace args = {
+ (mrb_irep*)proc->body.irep,
+ mrb_binding_extract_env(mrb, p->binding),
+ 0,
+ { 0 }
+ };
+ mrb_parser_foreach_top_variable(mrb, p->pstate, expand_lvspace, &args);
+ if (args.numvar > 0) {
+ mrb_proc_merge_lvar(mrb, args.irep, args.env, args.numvar, args.syms, NULL);
+ }
+
+ return mrb_nil_value();
+}
+
+static void
+binding_eval_prepare(mrb_state *mrb, mrb_value binding)
+{
+ struct binding_eval_prepare_body d = { binding, NULL, NULL, 0, NULL, NULL };
+ mrb_int argc;
+ mrb_value *argv;
+ mrb_get_args(mrb, "s|z*!", &d.expr, &d.exprlen, &d.file, &argv, &argc);
+
+ mrb_bool error;
+ mrb_value ret = mrb_protect_error(mrb, binding_eval_prepare_body, &d, &error);
+ if (d.pstate) mrb_parser_free(d.pstate);
+ if (d.mrbc) mrbc_context_free(mrb, d.mrbc);
+ if (error) mrb_exc_raise(mrb, ret);
+}
+
+static mrb_value
+mrb_binding_eval(mrb_state *mrb, mrb_value binding)
+{
+ binding_eval_prepare(mrb, binding);
+
+ struct RClass *c = mrb->kernel_module;
+ mrb_method_t m = mrb_method_search_vm(mrb, &c, MRB_SYM(eval));
+ if (MRB_METHOD_UNDEF_P(m)) {
+ int argc = mrb->c->ci->argc;
+ mrb_value *argv = mrb->c->ci->stack + 1;
+ mrb_value args = (argc < 0) ? argv[0] : mrb_ary_new_from_values(mrb, argc, argv);
+ mrb_method_missing(mrb, MRB_SYM(eval), binding, args);
+ }
+
+ insert_args(mrb, 1, binding);
+ struct RProc *proc = MRB_METHOD_PROC_P(m) ? MRB_METHOD_PROC(m) : mrb_proc_new_cfunc(mrb, MRB_METHOD_FUNC(m));
+ mrb->c->ci->u.target_class = c;
+ return mrb_exec_irep(mrb, binding, proc);
+}
+
+void
+mrb_mruby_binding_gem_init(mrb_state *mrb)
+{
+ struct RClass *binding = mrb_class_get_id(mrb, MRB_SYM(Binding));
+ mrb_define_method(mrb, binding, "eval", mrb_binding_eval, MRB_ARGS_ANY());
+}
+
+void
+mrb_mruby_binding_gem_final(mrb_state *mrb)
+{
+}
diff --git a/mrbgems/mruby-binding/test/binding.rb b/mrbgems/mruby-binding/test/binding.rb
index 7dd3fd1dd..bfae84c59 100644
--- a/mrbgems/mruby-binding/test/binding.rb
+++ b/mrbgems/mruby-binding/test/binding.rb
@@ -43,13 +43,6 @@ assert("Binding#local_variable_get") do
}
end
-assert("Binding#source_location") do
- skip unless -> {}.source_location
-
- bind, source_location = binding, [__FILE__, __LINE__]
- assert_equal source_location, bind.source_location
-end
-
assert "Kernel#binding and .eval from C" do
bind = binding_in_c
assert_equal 5, bind.eval("2 + 3")
@@ -68,3 +61,10 @@ assert "Binding#eval with Binding.new via Method" do
assert_true true
end
+
+assert "access local variables into procs" do
+ bx = binding
+ block = bx.eval("a = 1; proc { a }")
+ bx.eval("a = 2")
+ assert_equal 2, block.call
+end
diff --git a/mrbgems/mruby-catch/src/catch.c b/mrbgems/mruby-catch/src/catch.c
index d54c49dfe..048a44738 100644
--- a/mrbgems/mruby-catch/src/catch.c
+++ b/mrbgems/mruby-catch/src/catch.c
@@ -92,7 +92,7 @@ mrb_f_throw(mrb_state *mrb, mrb_value self)
const mrb_callinfo *ci = find_catcher(mrb, tag);
if (ci) {
- struct RBreak *b = (struct RBreak *)mrb_obj_alloc(mrb, MRB_TT_BREAK, NULL);
+ struct RBreak *b = MRB_OBJ_ALLOC(mrb, MRB_TT_BREAK, NULL);
mrb_break_value_set(b, obj);
mrb_break_proc_set(b, ci[2].proc); /* Back to the closure in `catch` method */
mrb_exc_raise(mrb, mrb_obj_value(b));
diff --git a/mrbgems/mruby-class-ext/src/class.c b/mrbgems/mruby-class-ext/src/class.c
index 39c16fc48..290ddf4b3 100644
--- a/mrbgems/mruby-class-ext/src/class.c
+++ b/mrbgems/mruby-class-ext/src/class.c
@@ -49,7 +49,7 @@ mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
c = mrb_class_ptr(self);
- if (mrb->c->ci->acc < 0) {
+ if (mrb->c->ci->cci > 0) {
return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
}
mrb_vm_ci_target_class_set(mrb->c->ci, c);
diff --git a/mrbgems/mruby-cmath/src/cmath.c b/mrbgems/mruby-cmath/src/cmath.c
index 03b181840..8b0c4d04a 100644
--- a/mrbgems/mruby-cmath/src/cmath.c
+++ b/mrbgems/mruby-cmath/src/cmath.c
@@ -15,7 +15,6 @@
# error CMath conflicts with 'MRB_NO_FLOAT' configuration
#endif
-#include <math.h>
#include <complex.h>
mrb_value mrb_complex_new(mrb_state *mrb, mrb_float real, mrb_float imag);
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 12f7c3b3f..42c93debf 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -4,10 +4,6 @@
** See Copyright Notice in mruby.h
*/
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
#include <mruby.h>
#include <mruby/compile.h>
#include <mruby/proc.h>
@@ -20,6 +16,8 @@
#include <mruby/opcode.h>
#include <mruby/re.h>
#include <mruby/throw.h>
+#include <ctype.h>
+#include <string.h>
#ifndef MRB_CODEGEN_LEVEL_MAX
#define MRB_CODEGEN_LEVEL_MAX 1024
@@ -40,15 +38,16 @@ enum looptype {
struct loopinfo {
enum looptype type;
- uint32_t pc0, pc1, pc2, pc3;
- int acc;
+ uint32_t pc0; /* `next` destination */
+ uint32_t pc1; /* `redo` destination */
+ uint32_t pc2; /* `break` destination */
+ int reg; /* destination register */
struct loopinfo *prev;
};
typedef struct scope {
mrb_state *mrb;
mrb_pool *mpool;
- struct mrb_jmpbuf jmp;
struct scope *prev;
@@ -147,7 +146,7 @@ codegen_error(codegen_scope *s, const char *message)
fprintf(stderr, "%s\n", message);
}
#endif
- MRB_THROW(&s->jmp);
+ MRB_THROW(s->mrb->jmp);
}
static void*
@@ -237,7 +236,9 @@ genop_1(codegen_scope *s, mrb_code i, uint16_t a)
{
s->lastpc = s->pc;
if (a > 0xff) {
- codegen_error(s, "too big operand");
+ gen_B(s, OP_EXT1);
+ gen_B(s, i);
+ gen_S(s, a);
}
else {
gen_B(s, i);
@@ -249,30 +250,24 @@ static void
genop_2(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b)
{
s->lastpc = s->pc;
- if (a > 0xff || b > 0xff) {
- codegen_error(s, "too big operand");
- }
- else {
+ if (a > 0xff && b > 0xff) {
+ gen_B(s, OP_EXT3);
gen_B(s, i);
- gen_B(s, (uint8_t)a);
- gen_B(s, (uint8_t)b);
- }
-}
-
-/* similar to `genop_2` but generate `genop_2S` with `i+1` */
-/* works for OP_LOADL, OP_LOADSYM, OP_STRING */
-static void
-genop_bs(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b)
-{
- s->lastpc = s->pc;
- if (a > 0xff || b > 0xffff) {
- codegen_error(s, "too big operand");
+ gen_S(s, a);
+ gen_S(s, b);
}
- if (b > 0xff) {
- gen_B(s, i+1);
+ else if (b > 0xff) {
+ gen_B(s, OP_EXT2);
+ gen_B(s, i);
gen_B(s, (uint8_t)a);
gen_S(s, b);
}
+ else if (a > 0xff) {
+ gen_B(s, OP_EXT1);
+ gen_B(s, i);
+ gen_S(s, a);
+ gen_B(s, (uint8_t)b);
+ }
else {
gen_B(s, i);
gen_B(s, (uint8_t)a);
@@ -331,6 +326,8 @@ struct mrb_insn_data
mrb_decode_insn(const mrb_code *pc)
{
struct mrb_insn_data data = { 0 };
+ if (pc == 0) return data;
+ data.addr = pc;
mrb_code insn = READ_B();
uint16_t a = 0;
uint16_t b = 0;
@@ -341,6 +338,32 @@ mrb_decode_insn(const mrb_code *pc)
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x (); break;
#include "mruby/ops.h"
#undef OPCODE
+ }
+ switch (insn) {
+ case OP_EXT1:
+ insn = READ_B();
+ switch (insn) {
+#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _1 (); break;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ break;
+ case OP_EXT2:
+ insn = READ_B();
+ switch (insn) {
+#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _2 (); break;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ break;
+ case OP_EXT3:
+ insn = READ_B();
+ switch (insn) {
+#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _3 (); break;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ break;
default:
break;
}
@@ -351,13 +374,101 @@ mrb_decode_insn(const mrb_code *pc)
return data;
}
+#undef OPCODE
+#define Z 1
+#define S 3
+#define W 4
+#define OPCODE(_,x) x,
+/* instruction sizes */
+static uint8_t mrb_insn_size[] = {
+#define B 2
+#define BB 3
+#define BBB 4
+#define BS 4
+#define BSS 6
+#include "mruby/ops.h"
+#undef B
+#undef BB
+#undef BBB
+#undef BS
+#undef BSS
+};
+/* EXT1 instruction sizes */
+static uint8_t mrb_insn_size1[] = {
+#define B 3
+#define BB 4
+#define BBB 5
+#define BS 5
+#define BSS 7
+#include "mruby/ops.h"
+#undef B
+#undef BS
+#undef BSS
+};
+/* EXT2 instruction sizes */
+static uint8_t mrb_insn_size2[] = {
+#define B 2
+#define BS 4
+#define BSS 6
+#include "mruby/ops.h"
+#undef B
+#undef BB
+#undef BBB
+#undef BS
+#undef BSS
+};
+/* EXT3 instruction sizes */
+#define B 3
+#define BB 5
+#define BBB 6
+#define BS 5
+#define BSS 7
+static uint8_t mrb_insn_size3[] = {
+#include "mruby/ops.h"
+};
+#undef B
+#undef BB
+#undef BBB
+#undef BS
+#undef BSS
+#undef OPCODE
+
+static const mrb_code*
+mrb_prev_pc(codegen_scope *s, const mrb_code *pc)
+{
+ const mrb_code *prev_pc = NULL;
+ const mrb_code *i = s->iseq;
+
+ while (i<pc) {
+ uint8_t insn = i[0];
+ prev_pc = i;
+ switch (insn) {
+ case OP_EXT1:
+ i += mrb_insn_size1[i[1]] + 1;
+ break;
+ case OP_EXT2:
+ i += mrb_insn_size2[i[1]] + 1;
+ break;
+ case OP_EXT3:
+ i += mrb_insn_size3[i[1]] + 1;
+ break;
+ default:
+ i += mrb_insn_size[insn];
+ break;
+ }
+ }
+ return prev_pc;
+}
+
+#define pc_addr(s) &((s)->iseq[(s)->pc])
+#define addr_pc(s, addr) (uint32_t)((addr) - s->iseq)
+#define rewind_pc(s) s->pc = s->lastpc
+
static struct mrb_insn_data
mrb_last_insn(codegen_scope *s)
{
- if (s->pc == s->lastpc) {
- struct mrb_insn_data data;
-
- data.insn = OP_NOP;
+ if (s->pc == 0) {
+ struct mrb_insn_data data = { OP_NOP, 0 };
return data;
}
return mrb_decode_insn(&s->iseq[s->lastpc]);
@@ -376,17 +487,15 @@ gen_jmpdst(codegen_scope *s, uint32_t pc)
{
if (pc == JMPLINK_START) {
- gen_S(s, 0);
+ pc = 0;
}
- else {
- uint32_t pos2 = s->pc+2;
- int32_t off = pc - pos2;
+ uint32_t pos2 = s->pc+2;
+ int32_t off = pc - pos2;
- if (off > INT16_MAX || INT16_MIN > off) {
- codegen_error(s, "too big jump offset");
- }
- gen_S(s, (uint16_t)off);
+ if (off > INT16_MAX || INT16_MIN > off) {
+ codegen_error(s, "too big jump offset");
}
+ gen_S(s, (uint16_t)off);
}
static uint32_t
@@ -394,8 +503,7 @@ genjmp(codegen_scope *s, mrb_code i, uint32_t pc)
{
uint32_t pos;
- s->lastpc = s->pc;
- gen_B(s, i);
+ genop_0(s, i);
pos = s->pc;
gen_jmpdst(s, pc);
return pos;
@@ -411,36 +519,64 @@ genjmp2(codegen_scope *s, mrb_code i, uint16_t a, uint32_t pc, int val)
if (!no_peephole(s) && !val) {
struct mrb_insn_data data = mrb_last_insn(s);
- if (data.insn == OP_MOVE && data.a == a) {
- s->pc = s->lastpc;
- a = data.b;
+ switch (data.insn) {
+ case OP_MOVE:
+ if (data.a == a && data.a > s->nlocals) {
+ rewind_pc(s);
+ a = data.b;
+ }
+ break;
+ case OP_LOADNIL:
+ case OP_LOADF:
+ if (data.a == a || data.a > s->nlocals) {
+ s->pc = addr_pc(s, data.addr);
+ if (i == OP_JMPNOT || (i == OP_JMPNIL && data.insn == OP_LOADNIL)) {
+ return genjmp(s, OP_JMP, pc);
+ }
+ else { /* OP_JMPIF */
+ return JMPLINK_START;
+ }
+ }
+ break;
+ case OP_LOADT: case OP_LOADI: case OP_LOADINEG: case OP_LOADI__1:
+ case OP_LOADI_0: case OP_LOADI_1: case OP_LOADI_2: case OP_LOADI_3:
+ case OP_LOADI_4: case OP_LOADI_5: case OP_LOADI_6: case OP_LOADI_7:
+ if (data.a == a || data.a > s->nlocals) {
+ s->pc = addr_pc(s, data.addr);
+ if (i == OP_JMPIF) {
+ return genjmp(s, OP_JMP, pc);
+ }
+ else { /* OP_JMPNOT and OP_JMPNIL */
+ return JMPLINK_START;
+ }
+ }
+ break;
}
}
- s->lastpc = s->pc;
if (a > 0xff) {
- codegen_error(s, "too big operand");
- pos = 0;
+ gen_B(s, OP_EXT1);
+ genop_0(s, i);
+ gen_S(s, a);
}
else {
- gen_B(s, i);
+ genop_0(s, i);
gen_B(s, (uint8_t)a);
- pos = s->pc;
- gen_jmpdst(s, pc);
}
+ pos = s->pc;
+ gen_jmpdst(s, pc);
return pos;
}
#define genjmp2_0(s,i,a,val) genjmp2(s,i,a,JMPLINK_START,val)
+static mrb_bool get_int_operand(codegen_scope *s, struct mrb_insn_data *data, mrb_int *ns);
+static void gen_int(codegen_scope *s, uint16_t dst, mrb_int i);
+
static void
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);
- return;
- }
+ if (nopeep || no_peephole(s)) goto normal;
else {
struct mrb_insn_data data = mrb_last_insn(s);
@@ -454,25 +590,100 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep)
case OP_LOADI__1:
case OP_LOADI_0: case OP_LOADI_1: case OP_LOADI_2: case OP_LOADI_3:
case OP_LOADI_4: case OP_LOADI_5: case OP_LOADI_6: case OP_LOADI_7:
- if (nopeep || data.a != src || data.a < s->nlocals) goto normal;
- s->pc = s->lastpc;
+ if (data.a != src || data.a < s->nlocals) goto normal;
+ rewind_pc(s);
genop_1(s, data.insn, dst);
- break;
+ return;
case OP_LOADI: case OP_LOADINEG:
case OP_LOADL: case OP_LOADSYM:
- case OP_LOADL16: case OP_LOADSYM16:
case OP_GETGV: case OP_GETSV: case OP_GETIV: case OP_GETCV:
- case OP_GETCONST: case OP_STRING: case OP_STRING16:
+ case OP_GETCONST: case OP_STRING:
case OP_LAMBDA: case OP_BLOCK: case OP_METHOD: case OP_BLKPUSH:
- case OP_LAMBDA16: case OP_BLOCK16: case OP_METHOD16:
- if (nopeep || data.a != src || data.a < s->nlocals) goto normal;
- s->pc = s->lastpc;
+ if (data.a != src || data.a < s->nlocals) goto normal;
+ rewind_pc(s);
genop_2(s, data.insn, dst, data.b);
- break;
+ return;
+ case OP_LOADI16:
+ if (data.a != src || data.a < s->nlocals) goto normal;
+ rewind_pc(s);
+ genop_2S(s, data.insn, dst, data.b);
+ return;
+ case OP_LOADI32:
+ if (data.a != src || data.a < s->nlocals) goto normal;
+ else {
+ uint32_t i = (uint32_t)data.b<<16|data.c;
+ rewind_pc(s);
+ genop_2SS(s, data.insn, dst, i);
+ }
+ return;
+ case OP_GETUPVAR:
+ if (data.a != src || data.a < s->nlocals) goto normal;
+ rewind_pc(s);
+ genop_3(s, data.insn, dst, data.b, data.c);
+ return;
+ case OP_ADDI: case OP_SUBI:
+ if (addr_pc(s, data.addr) == s->lastlabel || data.a != src || data.a < s->nlocals) goto normal;
+ else {
+ struct mrb_insn_data data0 = mrb_decode_insn(mrb_prev_pc(s, data.addr));
+ if (data0.insn != OP_MOVE || data0.a != data.a || data0.b != dst) goto normal;
+ s->pc = addr_pc(s, data0.addr);
+ if (addr_pc(s, data0.addr) != s->lastlabel) {
+ /* constant folding */
+ data0 = mrb_decode_insn(mrb_prev_pc(s, data0.addr));
+ mrb_int n;
+ if (data0.a == dst && get_int_operand(s, &data0, &n)) {
+ if ((data.insn == OP_ADDI && !mrb_int_add_overflow(n, data.b, &n)) ||
+ (data.insn == OP_SUBI && !mrb_int_sub_overflow(n, data.b, &n))) {
+ s->pc = addr_pc(s, data0.addr);
+ gen_int(s, dst, n);
+ return;
+ }
+ }
+ }
+ }
+ genop_2(s, data.insn, dst, data.b);
+ return;
default:
- goto normal;
+ break;
+ }
+ }
+ normal:
+ genop_2(s, OP_MOVE, dst, src);
+ return;
+}
+
+static int search_upvar(codegen_scope *s, mrb_sym id, int *idx);
+
+static void
+gen_getupvar(codegen_scope *s, uint16_t dst, mrb_sym id)
+{
+ int idx;
+ int lv = search_upvar(s, id, &idx);
+
+ if (!no_peephole(s)) {
+ struct mrb_insn_data data = mrb_last_insn(s);
+ if (data.insn == OP_SETUPVAR && data.a == dst && data.b == idx && data.c == lv) {
+ /* skip GETUPVAR right after SETUPVAR */
+ return;
+ }
+ }
+ genop_3(s, OP_GETUPVAR, dst, idx, lv);
+}
+
+static void
+gen_setupvar(codegen_scope *s, uint16_t dst, mrb_sym id)
+{
+ int idx;
+ int lv = search_upvar(s, id, &idx);
+
+ if (!no_peephole(s)) {
+ struct mrb_insn_data data = mrb_last_insn(s);
+ if (data.insn == OP_MOVE && data.a == dst) {
+ dst = data.b;
+ rewind_pc(s);
}
}
+ genop_3(s, OP_SETUPVAR, dst, idx, lv);
}
static void
@@ -485,7 +696,7 @@ gen_return(codegen_scope *s, uint8_t op, uint16_t src)
struct mrb_insn_data data = mrb_last_insn(s);
if (data.insn == OP_MOVE && src == data.a) {
- s->pc = s->lastpc;
+ rewind_pc(s);
genop_1(s, op, data.b);
}
else if (data.insn != OP_RETURN) {
@@ -494,6 +705,55 @@ gen_return(codegen_scope *s, uint8_t op, uint16_t src)
}
}
+static mrb_bool
+get_int_operand(codegen_scope *s, struct mrb_insn_data *data, mrb_int *n)
+{
+ switch (data->insn) {
+ case OP_LOADI__1:
+ *n = -1;
+ return TRUE;
+
+ case OP_LOADINEG:
+ *n = -data->b;
+ return TRUE;
+
+ case OP_LOADI_0: case OP_LOADI_1: case OP_LOADI_2: case OP_LOADI_3:
+ case OP_LOADI_4: case OP_LOADI_5: case OP_LOADI_6: case OP_LOADI_7:
+ *n = data->insn - OP_LOADI_0;
+ return TRUE;
+
+ case OP_LOADI:
+ case OP_LOADI16:
+ *n = data->b;
+ return TRUE;
+
+ case OP_LOADI32:
+ *n = (mrb_int)((uint32_t)data->b<<16)+data->c;
+ return TRUE;
+
+ case OP_LOADL:
+ {
+ mrb_pool_value *pv = &s->pool[data->b];
+
+ if (pv->tt == IREP_TT_INT32) {
+ *n = (mrb_int)pv->u.i32;
+ }
+#ifdef MRB_INT64
+ else if (pv->tt == IREP_TT_INT64) {
+ *n = (mrb_int)pv->u.i64;
+ }
+#endif
+ else {
+ return FALSE;
+ }
+ }
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+}
+
static void
gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst)
{
@@ -504,31 +764,119 @@ gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst)
}
else {
struct mrb_insn_data data = mrb_last_insn(s);
+ mrb_int n;
- switch (data.insn) {
- case OP_LOADI__1:
- if (op == OP_ADD) op = OP_SUB;
- else op = OP_ADD;
- data.b = 1;
- goto replace;
- case OP_LOADI_0: case OP_LOADI_1: case OP_LOADI_2: case OP_LOADI_3:
- case OP_LOADI_4: case OP_LOADI_5: case OP_LOADI_6: case OP_LOADI_7:
- data.b = data.insn - OP_LOADI_0;
- /* fall through */
- case OP_LOADI:
- replace:
- if (data.b >= 128) goto normal;
- s->pc = s->lastpc;
+ if (!get_int_operand(s, &data, &n)) {
+ /* not integer immediate */
+ goto normal;
+ }
+ struct mrb_insn_data data0 = mrb_decode_insn(mrb_prev_pc(s, data.addr));
+ mrb_int n0;
+ if (addr_pc(s, data.addr) == s->lastlabel || !get_int_operand(s, &data0, &n0)) {
+ /* OP_ADDI/OP_SUBI takes upto 16bits */
+ if (n > INT16_MAX) goto normal;
+ rewind_pc(s);
if (op == OP_ADD) {
- genop_2(s, OP_ADDI, dst, (uint8_t)data.b);
+ genop_2(s, OP_ADDI, dst, (uint16_t)n);
}
else {
- genop_2(s, OP_SUBI, dst, (uint8_t)data.b);
+ genop_2(s, OP_SUBI, dst, (uint16_t)n);
}
- break;
- default:
+ return;
+ }
+ if (op == OP_ADD) {
+ if (mrb_int_add_overflow(n0, n, &n)) goto normal;
+ }
+ else { /* OP_SUB */
+ if (mrb_int_sub_overflow(n0, n, &n)) goto normal;
+ }
+ s->pc = addr_pc(s, data0.addr);
+ gen_int(s, dst, n);
+ }
+}
+
+static void
+gen_muldiv(codegen_scope *s, uint8_t op, uint16_t dst)
+{
+ if (no_peephole(s)) {
+ normal:
+ genop_1(s, op, dst);
+ return;
+ }
+ else {
+ struct mrb_insn_data data = mrb_last_insn(s);
+ mrb_int n, n0;
+ if (addr_pc(s, data.addr) == s->lastlabel || !get_int_operand(s, &data, &n)) {
+ /* not integer immediate */
goto normal;
}
+ struct mrb_insn_data data0 = mrb_decode_insn(mrb_prev_pc(s, data.addr));
+ if (!get_int_operand(s, &data0, &n0) || n == 0) {
+ goto normal;
+ }
+ if (op == OP_MUL) {
+ if (mrb_int_mul_overflow(n0, n, &n)) goto normal;
+ }
+ else { /* OP_DIV */
+ if (n0 == MRB_INT_MIN && n == -1) goto normal;
+ n = n0 / n;
+ }
+ s->pc = addr_pc(s, data0.addr);
+ gen_int(s, dst, n);
+ }
+}
+
+mrb_bool mrb_num_shift(mrb_state *mrb, mrb_int val, mrb_int width, mrb_int *num);
+
+static mrb_bool
+gen_binop(codegen_scope *s, mrb_sym op, uint16_t dst)
+{
+ if (no_peephole(s)) return FALSE;
+ else {
+ struct mrb_insn_data data = mrb_last_insn(s);
+ mrb_int n, n0;
+ if (addr_pc(s, data.addr) == s->lastlabel || !get_int_operand(s, &data, &n)) {
+ /* not integer immediate */
+ return FALSE;
+ }
+ struct mrb_insn_data data0 = mrb_decode_insn(mrb_prev_pc(s, data.addr));
+ if (!get_int_operand(s, &data0, &n0)) {
+ return FALSE;
+ }
+ if (op == MRB_OPSYM_2(s->mrb, lshift)) {
+ if (!mrb_num_shift(s->mrb, n0, n, &n)) return FALSE;
+ }
+ else if (op == MRB_OPSYM_2(s->mrb, rshift)) {
+ if (n == MRB_INT_MIN) return FALSE;
+ if (!mrb_num_shift(s->mrb, n0, -n, &n)) return FALSE;
+ }
+ else if (op == MRB_OPSYM_2(s->mrb, mod) && n != 0) {
+ if (n0 == MRB_INT_MIN && n == -1) {
+ n = 0;
+ }
+ else {
+ mrb_int n1 = n0 % n;
+ if ((n0 < 0) != (n < 0) && n1 != 0) {
+ n1 += n;
+ }
+ n = n1;
+ }
+ }
+ else if (op == MRB_OPSYM_2(s->mrb, and)) {
+ n = n0 & n;
+ }
+ else if (op == MRB_OPSYM_2(s->mrb, or)) {
+ n = n0 | n;
+ }
+ else if (op == MRB_OPSYM_2(s->mrb, xor)) {
+ n = n0 ^ n;
+ }
+ else {
+ return FALSE;
+ }
+ s->pc = addr_pc(s, data0.addr);
+ gen_int(s, dst, n);
+ return TRUE;
}
}
@@ -751,6 +1099,66 @@ new_sym(codegen_scope *s, mrb_sym sym)
return s->irep->slen++;
}
+static void
+gen_setxv(codegen_scope *s, uint8_t op, uint16_t dst, mrb_sym sym, int val)
+{
+ int idx = new_sym(s, sym);
+ if (!val && !no_peephole(s)) {
+ struct mrb_insn_data data = mrb_last_insn(s);
+ if (data.insn == OP_MOVE && data.a == dst) {
+ dst = data.b;
+ rewind_pc(s);
+ }
+ }
+ genop_2(s, op, dst, idx);
+}
+
+static void
+gen_int(codegen_scope *s, uint16_t dst, mrb_int i)
+{
+ if (i < 0) {
+ if (i == -1) genop_1(s, OP_LOADI__1, dst);
+ else if (i >= -0xff) genop_2(s, OP_LOADINEG, dst, (uint16_t)-i);
+ else if (i >= INT16_MIN) genop_2S(s, OP_LOADI16, dst, (uint16_t)i);
+ else if (i >= INT32_MIN) genop_2SS(s, OP_LOADI32, dst, (uint32_t)i);
+ else goto int_lit;
+ }
+ else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, dst);
+ else if (i <= 0xff) genop_2(s, OP_LOADI, dst, (uint16_t)i);
+ else if (i <= INT16_MAX) genop_2S(s, OP_LOADI16, dst, (uint16_t)i);
+ else if (i <= INT32_MAX) genop_2SS(s, OP_LOADI32, dst, (uint32_t)i);
+ else {
+ int_lit:
+ genop_2(s, OP_LOADL, dst, new_lit(s, mrb_int_value(s->mrb, i)));
+ }
+}
+
+static mrb_bool
+gen_uniop(codegen_scope *s, mrb_sym sym, uint16_t dst)
+{
+ if (no_peephole(s)) return FALSE;
+ struct mrb_insn_data data = mrb_last_insn(s);
+ mrb_int n;
+
+ if (!get_int_operand(s, &data, &n)) return FALSE;
+ if (sym == MRB_OPSYM_2(s->mrb, plus)) {
+ /* unary plus does nothing */
+ }
+ else if (sym == MRB_OPSYM_2(s->mrb, minus)) {
+ if (n == MRB_INT_MIN) return FALSE;
+ n = -n;
+ }
+ else if (sym == MRB_OPSYM_2(s->mrb, neg)) {
+ n = ~n;
+ }
+ else {
+ return FALSE;
+ }
+ s->pc = addr_pc(s, data.addr);
+ gen_int(s, dst, n);
+ return TRUE;
+}
+
static int
node_len(node *tree)
{
@@ -807,10 +1215,12 @@ search_upvar(codegen_scope *s, mrb_sym id, int *idx)
int i;
const mrb_sym *v = ir->lv;
- for (i=1; n > 1; n--, v++, i++) {
- if (*v == id) {
- *idx = i;
- return lv - 1;
+ if (v) {
+ for (i=1; n > 1; n--, v++, i++) {
+ if (*v == id) {
+ *idx = i;
+ return lv - 1;
+ }
}
}
if (MRB_PROC_SCOPE_P(u)) break;
@@ -848,7 +1258,7 @@ for_body(codegen_scope *s, node *tree)
}
/* construct loop */
lp = loop_push(s, LOOP_FOR);
- lp->pc2 = new_label(s);
+ lp->pc1 = new_label(s);
/* loop body */
codegen(s, tree->cdr->cdr->car, VAL);
@@ -883,8 +1293,8 @@ lambda_body(codegen_scope *s, node *tree, int blk)
}
else {
mrb_aspec a;
- int ma, oa, ra, pa, ka, kd, ba;
- int pos, i;
+ int ma, oa, ra, pa, ka, kd, ba, i;
+ uint32_t pos;
node *opt;
node *margs, *pargs;
node *tail;
@@ -945,8 +1355,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
gen_move(s, idx, cursp(), 0);
}
else {
- int lv = search_upvar(s, id, &idx);
- genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
+ gen_getupvar(s, cursp(), id);
}
i++;
opt = opt->cdr;
@@ -984,8 +1393,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
gen_move(s, idx, cursp(), 0);
}
else {
- int lv = search_upvar(s, kwd_sym, &idx);
- genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
+ gen_getupvar(s, cursp(), kwd_sym);
}
jmp_def_set = genjmp_0(s, OP_JMP);
dispatch(s, jmpif_key_p);
@@ -1092,68 +1500,70 @@ attrsym(codegen_scope *s, mrb_sym a)
}
#define CALL_MAXARGS 127
+#define GEN_LIT_ARY_MAX 64
+#define GEN_VAL_STACK_MAX 99
static int
-gen_values(codegen_scope *s, node *t, int val, int extra)
+gen_values(codegen_scope *s, node *t, int val, int extra, int limit)
{
int n = 0;
- int is_splat;
+ int first = 1;
+ int slimit = GEN_VAL_STACK_MAX;
+
+ if (limit == 0) limit = GEN_LIT_ARY_MAX;
+ if (cursp() >= slimit) slimit = INT16_MAX;
+
+ if (!val) {
+ while (t) {
+ codegen(s, t->car, NOVAL);
+ n++;
+ t = t->cdr;
+ }
+ return n;
+ }
while (t) {
- is_splat = nint(t->car->car) == NODE_SPLAT; /* splat mode */
- if (
- n+extra >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */
- || is_splat) {
- if (val) {
- if (is_splat && n == 0 && nint(t->car->cdr->car) == NODE_ARRAY) {
- codegen(s, t->car->cdr, VAL);
- pop();
+ int is_splat = nint(t->car->car) == NODE_SPLAT;
+
+ if (is_splat || n+extra >= limit-1 || cursp() >= slimit) { /* flush stack */
+ pop_n(n);
+ if (first) {
+ if (n == 0) {
+ genop_1(s, OP_LOADNIL, cursp());
}
else {
- pop_n(n);
- if (n == 0 && is_splat) {
- genop_1(s, OP_LOADNIL, cursp());
- }
- else {
- genop_2(s, OP_ARRAY, cursp(), n);
- }
- push();
- codegen(s, t->car, VAL);
- pop(); pop();
- if (is_splat) {
- genop_1(s, OP_ARYCAT, cursp());
- }
- else {
- genop_1(s, OP_ARYPUSH, cursp());
- }
- }
- t = t->cdr;
- while (t) {
- push();
- codegen(s, t->car, VAL);
- pop(); pop();
- if (nint(t->car->car) == NODE_SPLAT) {
- genop_1(s, OP_ARYCAT, cursp());
- }
- else {
- genop_1(s, OP_ARYPUSH, cursp());
- }
- t = t->cdr;
+ genop_2(s, OP_ARRAY, cursp(), n);
}
+ push();
+ first = 0;
+ limit = GEN_LIT_ARY_MAX;
}
- else {
- while (t) {
- codegen(s, t->car, NOVAL);
- t = t->cdr;
- }
+ else if (n > 0) {
+ pop();
+ genop_2(s, OP_ARYPUSH, cursp(), n);
+ push();
}
- return -1;
+ n = 0;
}
- /* normal (no splat) mode */
codegen(s, t->car, val);
- n++;
+ if (is_splat) {
+ pop(); pop();
+ genop_1(s, OP_ARYCAT, cursp());
+ push();
+ }
+ else {
+ n++;
+ }
t = t->cdr;
}
+ if (!first) {
+ pop();
+ if (n > 0) {
+ pop_n(n);
+ genop_2(s, OP_ARYPUSH, cursp(), n);
+ }
+ return -1; /* variable length */
+ }
return n;
}
@@ -1172,7 +1582,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
}
tree = tree->cdr->cdr->car;
if (tree) {
- n = gen_values(s, tree->car, VAL, sp?1:0);
+ n = gen_values(s, tree->car, VAL, sp?1:0, 14);
if (n < 0) {
n = noop = sendv = 1;
push();
@@ -1182,7 +1592,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
if (sendv) {
gen_move(s, cursp(), sp, 0);
pop();
- genop_1(s, OP_ARYPUSH, cursp());
+ genop_2(s, OP_ARYPUSH, cursp(), 1);
push();
}
else {
@@ -1199,46 +1609,47 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
}
push();pop();
pop_n(n+1);
- {
- mrb_int symlen;
- const char *symname = mrb_sym_name_len(s->mrb, sym, &symlen);
+ if (!noop && sym == MRB_OPSYM_2(s->mrb, add) && n == 1) {
+ gen_addsub(s, OP_ADD, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, sub) && n == 1) {
+ gen_addsub(s, OP_SUB, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, mul) && n == 1) {
+ gen_muldiv(s, OP_MUL, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, div) && n == 1) {
+ gen_muldiv(s, OP_DIV, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, lt) && n == 1) {
+ genop_1(s, OP_LT, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, le) && n == 1) {
+ genop_1(s, OP_LE, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, gt) && n == 1) {
+ genop_1(s, OP_GT, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, ge) && n == 1) {
+ genop_1(s, OP_GE, cursp());
+ }
+ else if (!noop && sym == MRB_OPSYM_2(s->mrb, eq) && n == 1) {
+ genop_1(s, OP_EQ, cursp());
+ }
+ else if (!noop && n == 0 && gen_uniop(s, sym, cursp())) {
+ /* constant folding succeeded */
+ }
+ else if (!noop && n == 1 && gen_binop(s, sym, cursp())) {
+ /* constant folding succeeded */
+ }
+ else {
+ int idx = new_sym(s, sym);
- if (!noop && symlen == 1 && symname[0] == '+' && n == 1) {
- gen_addsub(s, OP_ADD, cursp());
- }
- else if (!noop && symlen == 1 && symname[0] == '-' && n == 1) {
- gen_addsub(s, OP_SUB, cursp());
- }
- else if (!noop && symlen == 1 && symname[0] == '*' && n == 1) {
- genop_1(s, OP_MUL, cursp());
- }
- else if (!noop && symlen == 1 && symname[0] == '/' && n == 1) {
- genop_1(s, OP_DIV, cursp());
- }
- else if (!noop && symlen == 1 && symname[0] == '<' && n == 1) {
- genop_1(s, OP_LT, cursp());
- }
- else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' && n == 1) {
- genop_1(s, OP_LE, cursp());
- }
- else if (!noop && symlen == 1 && symname[0] == '>' && n == 1) {
- genop_1(s, OP_GT, cursp());
- }
- else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' && n == 1) {
- genop_1(s, OP_GE, cursp());
- }
- else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' && n == 1) {
- genop_1(s, OP_EQ, cursp());
+ if (sendv) {
+ genop_2(s, blk ? OP_SENDVB : OP_SENDV, cursp(), idx);
}
else {
- int idx = new_sym(s, sym);
-
- if (sendv) {
- genop_2(s, blk ? OP_SENDVB : OP_SENDV, cursp(), idx);
- }
- else {
- genop_3(s, blk ? OP_SENDB : OP_SEND, cursp(), idx, n);
- }
+ genop_3(s, blk ? OP_SENDB : OP_SEND, cursp(), idx, n);
}
}
if (safe) {
@@ -1258,8 +1669,7 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
tree = tree->cdr;
switch (type) {
case NODE_GVAR:
- idx = new_sym(s, nsym(tree));
- genop_2(s, OP_SETGV, sp, idx);
+ gen_setxv(s, OP_SETGV, sp, nsym(tree), val);
break;
case NODE_ARG:
case NODE_LVAR:
@@ -1271,8 +1681,7 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
break;
}
else { /* upvar */
- int lv = search_upvar(s, nsym(tree), &idx);
- genop_3(s, OP_SETUPVAR, sp, idx, lv);
+ gen_setupvar(s, sp, nsym(tree));
}
break;
case NODE_NVAR:
@@ -1280,16 +1689,13 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
codegen_error(s, "Can't assign to numbered parameter");
break;
case NODE_IVAR:
- idx = new_sym(s, nsym(tree));
- genop_2(s, OP_SETIV, sp, idx);
+ gen_setxv(s, OP_SETIV, sp, nsym(tree), val);
break;
case NODE_CVAR:
- idx = new_sym(s, nsym(tree));
- genop_2(s, OP_SETCV, sp, idx);
+ gen_setxv(s, OP_SETCV, sp, nsym(tree), val);
break;
case NODE_CONST:
- idx = new_sym(s, nsym(tree));
- genop_2(s, OP_SETCONST, sp, idx);
+ gen_setxv(s, OP_SETCONST, sp, nsym(tree), val);
break;
case NODE_COLON2:
gen_move(s, cursp(), sp, 0);
@@ -1320,9 +1726,7 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
break;
default:
-#ifndef MRB_NO_STDIO
- fprintf(stderr, "unknown lhs %d\n", type);
-#endif
+ codegen_error(s, "unknown lhs");
break;
}
if (val) push();
@@ -1383,6 +1787,16 @@ static void
gen_intern(codegen_scope *s)
{
pop();
+ if (!no_peephole(s)) {
+ struct mrb_insn_data data = mrb_last_insn(s);
+
+ if (data.insn == OP_STRING && data.a == cursp()) {
+ rewind_pc(s);
+ genop_2(s, OP_SYMBOL, data.a, data.b);
+ push();
+ return;
+ }
+ }
genop_1(s, OP_INTERN, cursp());
push();
}
@@ -1391,7 +1805,7 @@ static void
gen_literal_array(codegen_scope *s, node *tree, mrb_bool sym, int val)
{
if (val) {
- int i = 0, j = 0;
+ int i = 0, j = 0, gen = 0;
while (tree) {
switch (nint(tree->car->car)) {
@@ -1419,6 +1833,19 @@ gen_literal_array(codegen_scope *s, node *tree, mrb_bool sym, int val)
push();
j--;
}
+ if (i > GEN_LIT_ARY_MAX) {
+ pop_n(i);
+ if (gen) {
+ pop();
+ genop_2(s, OP_ARYPUSH, cursp(), i);
+ }
+ else {
+ genop_2(s, OP_ARRAY, cursp(), i);
+ gen = 1;
+ }
+ push();
+ i = 0;
+ }
tree = tree->cdr;
}
if (j > 0) {
@@ -1427,7 +1854,13 @@ gen_literal_array(codegen_scope *s, node *tree, mrb_bool sym, int val)
gen_intern(s);
}
pop_n(i);
- genop_2(s, OP_ARRAY, cursp(), i);
+ if (gen) {
+ pop();
+ genop_2(s, OP_ARYPUSH, cursp(), i);
+ }
+ else {
+ genop_2(s, OP_ARRAY, cursp(), i);
+ }
push();
}
else {
@@ -1450,45 +1883,48 @@ raise_error(codegen_scope *s, const char *msg)
}
static mrb_int
-readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_bool *overflow)
+readint(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_bool *overflow)
{
const char *e = p + strlen(p);
mrb_int result = 0;
- int n;
- mrb_assert(base >= 2 && base <= 36);
+ mrb_assert(base >= 2 && base <= 16);
if (*p == '+') p++;
while (p < e) {
+ int n;
char c = *p;
- c = tolower((unsigned char)c);
- for (n=0; n<base; n++) {
- if (mrb_digitmap[n] == c) {
- break;
- }
- }
- if (n == base) {
+ switch (c) {
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ n = c - '0'; break;
+ case '8': case '9':
+ n = c - '0'; break;
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ n = c - 'a' + 10; break;
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ n = c - 'A' + 10; break;
+ default:
codegen_error(s, "malformed readint input");
- }
-
- if (neg) {
- if ((MRB_INT_MIN + n)/base > result) {
- *overflow = TRUE;
- return 0;
- }
- result *= base;
- result -= n;
- }
- else {
- if ((MRB_INT_MAX - n)/base < result) {
- *overflow = TRUE;
- return 0;
- }
- result *= base;
- result += n;
- }
+ *overflow = TRUE;
+ /* not reached */
+ return result;
+ }
+ if (mrb_int_mul_overflow(result, base, &result)) {
+ overflow:
+ *overflow = TRUE;
+ return 0;
+ }
+ mrb_uint tmp = ((mrb_uint)result)+n;
+ if (neg && tmp == (mrb_uint)MRB_INT_MAX+1) {
+ *overflow = FALSE;
+ return MRB_INT_MIN;
+ }
+ if (tmp > MRB_INT_MAX) goto overflow;
+ result = (mrb_int)tmp;
p++;
}
*overflow = FALSE;
+ if (neg) return -result;
return result;
}
@@ -1506,6 +1942,32 @@ gen_retval(codegen_scope *s, node *tree)
}
}
+static mrb_bool
+true_always(node *tree)
+{
+ switch (nint(tree->car)) {
+ case NODE_TRUE:
+ case NODE_INT:
+ case NODE_STR:
+ case NODE_SYM:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+static mrb_bool
+false_always(node *tree)
+{
+ switch (nint(tree->car)) {
+ case NODE_FALSE:
+ case NODE_NIL:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
static void
codegen(codegen_scope *s, node *tree, int val)
{
@@ -1673,7 +2135,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (val) {
int idx = lambda_body(s, tree, 1);
- genop_bs(s, OP_LAMBDA, cursp(), idx);
+ genop_2(s, OP_LAMBDA, cursp(), idx);
push();
}
break;
@@ -1682,41 +2144,37 @@ codegen(codegen_scope *s, node *tree, int val)
if (val) {
int idx = lambda_body(s, tree, 1);
- genop_bs(s, OP_BLOCK, cursp(), idx);
+ genop_2(s, OP_BLOCK, cursp(), idx);
push();
}
break;
case NODE_IF:
{
- int pos1, pos2, nil_p = FALSE;
+ uint32_t pos1, pos2;
+ mrb_bool nil_p = FALSE;
node *elsepart = tree->cdr->cdr->car;
if (!tree->car) {
codegen(s, elsepart, val);
goto exit;
}
- switch (nint(tree->car->car)) {
- case NODE_TRUE:
- case NODE_INT:
- case NODE_STR:
+ if (true_always(tree->car)) {
codegen(s, tree->cdr->car, val);
goto exit;
- case NODE_FALSE:
- case NODE_NIL:
+ }
+ if (false_always(tree->car)) {
codegen(s, elsepart, val);
goto exit;
- case NODE_CALL:
- {
- node *n = tree->car->cdr;
- mrb_sym mid = nsym(n->cdr->car);
- mrb_sym mnil = MRB_SYM_Q_2(s->mrb, nil);
- if (mid == mnil && n->cdr->cdr->car == NULL) {
- nil_p = TRUE;
- codegen(s, n->car, VAL);
- }
+ }
+ if (nint(tree->car->car) == NODE_CALL) {
+ node *n = tree->car->cdr;
+ mrb_sym mid = nsym(n->cdr->car);
+ mrb_sym sym_nil_p = MRB_SYM_Q_2(s->mrb, nil);
+ if (mid == sym_nil_p && n->cdr->cdr->car == NULL) {
+ nil_p = TRUE;
+ codegen(s, n->car, VAL);
}
- break;
}
if (!nil_p) {
codegen(s, tree->car, VAL);
@@ -1764,8 +2222,16 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_AND:
{
- int pos;
+ uint32_t pos;
+ if (true_always(tree->car)) {
+ codegen(s, tree->cdr, val);
+ goto exit;
+ }
+ if (false_always(tree->car)) {
+ codegen(s, tree->car, val);
+ goto exit;
+ }
codegen(s, tree->car, VAL);
pop();
pos = genjmp2_0(s, OP_JMPNOT, cursp(), val);
@@ -1776,8 +2242,16 @@ codegen(codegen_scope *s, node *tree, int val)
case NODE_OR:
{
- int pos;
+ uint32_t pos;
+ if (true_always(tree->car)) {
+ codegen(s, tree->car, val);
+ goto exit;
+ }
+ if (false_always(tree->car)) {
+ codegen(s, tree->cdr, val);
+ goto exit;
+ }
codegen(s, tree->car, VAL);
pop();
pos = genjmp2_0(s, OP_JMPIF, cursp(), val);
@@ -1787,35 +2261,44 @@ codegen(codegen_scope *s, node *tree, int val)
break;
case NODE_WHILE:
- {
- struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
-
- lp->pc0 = new_label(s);
- lp->pc1 = genjmp_0(s, OP_JMP);
- lp->pc2 = new_label(s);
- codegen(s, tree->cdr, NOVAL);
- dispatch(s, lp->pc1);
- codegen(s, tree->car, VAL);
- pop();
- genjmp2(s, OP_JMPIF, cursp(), lp->pc2, NOVAL);
-
- loop_pop(s, val);
- }
- break;
-
case NODE_UNTIL:
{
+ if (true_always(tree->car)) {
+ if (nt == NODE_UNTIL) {
+ if (val) {
+ genop_1(s, OP_LOADNIL, cursp());
+ push();
+ }
+ goto exit;
+ }
+ }
+ else if (false_always(tree->car)) {
+ if (nt == NODE_WHILE) {
+ if (val) {
+ genop_1(s, OP_LOADNIL, cursp());
+ push();
+ }
+ goto exit;
+ }
+ }
+
+ uint32_t pos = JMPLINK_START;
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
+ if (!val) lp->reg = -1;
lp->pc0 = new_label(s);
- lp->pc1 = genjmp_0(s, OP_JMP);
- lp->pc2 = new_label(s);
- codegen(s, tree->cdr, NOVAL);
- dispatch(s, lp->pc1);
codegen(s, tree->car, VAL);
pop();
- genjmp2(s, OP_JMPNOT, cursp(), lp->pc2, NOVAL);
-
+ if (nt == NODE_WHILE) {
+ pos = genjmp2_0(s, OP_JMPNOT, cursp(), NOVAL);
+ }
+ else {
+ pos = genjmp2_0(s, OP_JMPIF, cursp(), NOVAL);
+ }
+ lp->pc1 = new_label(s);
+ codegen(s, tree->cdr, NOVAL);
+ genjmp(s, OP_JMP, lp->pc0);
+ dispatch(s, pos);
loop_pop(s, val);
}
break;
@@ -1948,15 +2431,12 @@ codegen(codegen_scope *s, node *tree, int val)
{
int n;
- n = gen_values(s, tree, val, 0);
- if (n >= 0) {
- if (val) {
+ n = gen_values(s, tree, val, 0, 0);
+ if (val) {
+ if (n >= 0) {
pop_n(n);
genop_2(s, OP_ARRAY, cursp(), n);
- push();
}
- }
- else if (val) {
push();
}
}
@@ -1967,7 +2447,9 @@ codegen(codegen_scope *s, node *tree, int val)
{
int len = 0;
mrb_bool update = FALSE;
+ int slimit = GEN_VAL_STACK_MAX;
+ if (cursp() >= GEN_LIT_ARY_MAX) slimit = INT16_MAX;
while (tree) {
if (nint(tree->car->car->car) == NODE_KW_REST_ARGS) {
if (len > 0) {
@@ -1996,7 +2478,7 @@ codegen(codegen_scope *s, node *tree, int val)
len++;
}
tree = tree->cdr;
- if (val && cursp() > 127) {
+ if (val && cursp() >= slimit) {
pop_n(len*2);
if (!update) {
genop_2(s, OP_HASH, cursp(), len);
@@ -2156,7 +2638,7 @@ codegen(codegen_scope *s, node *tree, int val)
idx = new_sym(s, nsym(n->cdr->car));
base = cursp()-1;
if (n->cdr->cdr->car) {
- nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1);
+ nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1, 14);
if (nargs >= 0) {
callargs = nargs;
}
@@ -2181,7 +2663,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (len == 2 &&
((name[0] == '|' && name[1] == '|') ||
(name[0] == '&' && name[1] == '&'))) {
- int pos;
+ uint32_t pos;
pop();
if (val) {
@@ -2201,7 +2683,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (nint(tree->car->car) == NODE_CALL) {
if (callargs == CALL_MAXARGS) {
pop();
- genop_1(s, OP_ARYPUSH, cursp());
+ genop_2(s, OP_ARYPUSH, cursp(), 1);
}
else {
pop_n(callargs);
@@ -2258,7 +2740,7 @@ codegen(codegen_scope *s, node *tree, int val)
}
if (callargs == CALL_MAXARGS) {
pop();
- genop_1(s, OP_ARYPUSH, cursp());
+ genop_2(s, OP_ARYPUSH, cursp(), 1);
}
else {
pop_n(callargs);
@@ -2289,7 +2771,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (tree) {
node *args = tree->car;
if (args) {
- n = gen_values(s, args, VAL, 0);
+ n = gen_values(s, args, VAL, 0, 14);
if (n < 0) {
n = noop = sendv = 1;
push();
@@ -2370,7 +2852,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (ainfo < 0) codegen_error(s, "invalid yield (SyntaxError)");
push();
if (tree) {
- n = gen_values(s, tree, VAL, 0);
+ n = gen_values(s, tree, VAL, 0, 14);
if (n < 0) {
n = sendv = 1;
push();
@@ -2416,7 +2898,7 @@ codegen(codegen_scope *s, node *tree, int val)
raise_error(s, "unexpected redo");
}
else {
- genjmp(s, OP_JMPUW, s->loop->pc2);
+ genjmp(s, OP_JMPUW, s->loop->pc1);
}
if (val) push();
break;
@@ -2447,8 +2929,7 @@ codegen(codegen_scope *s, node *tree, int val)
gen_move(s, cursp(), idx, val);
}
else {
- int lv = search_upvar(s, nsym(tree), &idx);
- genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
+ gen_getupvar(s, cursp(), nsym(tree));
}
push();
}
@@ -2538,29 +3019,13 @@ codegen(codegen_scope *s, node *tree, int val)
mrb_int i;
mrb_bool overflow;
- i = readint_mrb_int(s, p, base, FALSE, &overflow);
+ i = readint(s, p, base, FALSE, &overflow);
if (overflow) {
int off = new_litbn(s, p, base, FALSE);
- genop_bs(s, OP_LOADL, cursp(), off);
+ genop_2(s, OP_LOADL, cursp(), off);
}
else {
- 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 >= INT16_MIN) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
- else if (i >= INT32_MIN) genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
- else goto lit_int;
- }
- else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp());
- else if (i <= 0xff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i);
- else if (i <= INT16_MAX) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
- else if (i <= INT32_MAX) genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
- else {
- int off;
- lit_int:
- off = new_lit(s, mrb_int_value(s->mrb, i));
- genop_bs(s, OP_LOADL, cursp(), off);
- }
+ gen_int(s, cursp(), i);
}
push();
}
@@ -2573,7 +3038,7 @@ codegen(codegen_scope *s, node *tree, int val)
mrb_float f = mrb_float_read(p, NULL);
int off = new_lit(s, mrb_float_value(s->mrb, f));
- genop_bs(s, OP_LOADL, cursp(), off);
+ genop_2(s, OP_LOADL, cursp(), off);
push();
}
break;
@@ -2590,7 +3055,7 @@ codegen(codegen_scope *s, node *tree, int val)
mrb_float f = mrb_float_read(p, NULL);
int off = new_lit(s, mrb_float_value(s->mrb, -f));
- genop_bs(s, OP_LOADL, cursp(), off);
+ genop_2(s, OP_LOADL, cursp(), off);
push();
}
break;
@@ -2603,26 +3068,13 @@ codegen(codegen_scope *s, node *tree, int val)
mrb_int i;
mrb_bool overflow;
- i = readint_mrb_int(s, p, base, TRUE, &overflow);
+ i = readint(s, p, base, TRUE, &overflow);
if (overflow) {
int off = new_litbn(s, p, base, TRUE);
- genop_bs(s, OP_LOADL, cursp(), off);
+ genop_2(s, OP_LOADL, cursp(), off);
}
else {
- 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 >= INT16_MIN) {
- genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
- }
- else if (i >= INT32_MIN) {
- genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
- }
- else {
- int off = new_lit(s, mrb_int_value(s->mrb, i));
- genop_bs(s, OP_LOADL, cursp(), off);
- }
+ gen_int(s, cursp(), i);
}
push();
}
@@ -2630,10 +3082,13 @@ codegen(codegen_scope *s, node *tree, int val)
default:
if (val) {
- int sym = new_sym(s, MRB_OPSYM_2(s->mrb, minus));
codegen(s, tree, VAL);
pop();
- genop_3(s, OP_SEND, cursp(), sym, 0);
+ push_n(2);pop_n(2); /* space for receiver&block */
+ mrb_sym minus = MRB_OPSYM_2(s->mrb, minus);
+ if (!gen_uniop(s, minus, cursp())) {
+ genop_3(s, OP_SEND, cursp(), new_sym(s, minus), 0);
+ }
push();
}
else {
@@ -2652,7 +3107,7 @@ codegen(codegen_scope *s, node *tree, int val)
int off = new_lit(s, mrb_str_new(s->mrb, p, len));
mrb_gc_arena_restore(s->mrb, ai);
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
push();
}
break;
@@ -2739,7 +3194,7 @@ codegen(codegen_scope *s, node *tree, int val)
genop_1(s, OP_LOADSELF, cursp());
push();
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
push(); push();
pop_n(3);
sym = new_sym(s, MRB_OPSYM_2(s->mrb, tick)); /* ` */
@@ -2762,12 +3217,12 @@ codegen(codegen_scope *s, node *tree, int val)
genop_1(s, OP_OCLASS, cursp());
genop_2(s, OP_GETMCNST, cursp(), sym);
push();
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
push();
if (p2 || p3) {
if (p2) { /* opt */
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
}
else {
genop_1(s, OP_LOADNIL, cursp());
@@ -2776,7 +3231,7 @@ codegen(codegen_scope *s, node *tree, int val)
argc++;
if (p3) { /* enc */
off = new_lit(s, mrb_str_new(s->mrb, p3, 1));
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
push();
argc++;
}
@@ -2816,7 +3271,7 @@ codegen(codegen_scope *s, node *tree, int val)
p = (char*)n->car;
off = new_lit(s, mrb_str_new_cstr(s->mrb, p));
codegen(s, tree->car, VAL);
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
pop();
genop_1(s, OP_STRCAT, cursp());
push();
@@ -2824,14 +3279,14 @@ codegen(codegen_scope *s, node *tree, int val)
if (n->cdr->car) { /* opt */
char *p2 = (char*)n->cdr->car;
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
push();
argc++;
}
if (n->cdr->cdr) { /* enc */
char *p2 = (char*)n->cdr->cdr;
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
- genop_bs(s, OP_STRING, cursp(), off);
+ genop_2(s, OP_STRING, cursp(), off);
push();
argc++;
}
@@ -2858,7 +3313,7 @@ codegen(codegen_scope *s, node *tree, int val)
if (val) {
int sym = new_sym(s, nsym(tree));
- genop_bs(s, OP_LOADSYM, cursp(), sym);
+ genop_2(s, OP_LOADSYM, cursp(), sym);
push();
}
break;
@@ -2959,7 +3414,7 @@ codegen(codegen_scope *s, node *tree, int val)
}
else {
idx = scope_body(s, body, val);
- genop_bs(s, OP_EXEC, cursp(), idx);
+ genop_2(s, OP_EXEC, cursp(), idx);
}
if (val) {
push();
@@ -2991,7 +3446,7 @@ codegen(codegen_scope *s, node *tree, int val)
}
else {
idx = scope_body(s, tree->cdr->car, val);
- genop_bs(s, OP_EXEC, cursp(), idx);
+ genop_2(s, OP_EXEC, cursp(), idx);
}
if (val) {
push();
@@ -3012,7 +3467,7 @@ codegen(codegen_scope *s, node *tree, int val)
}
else {
idx = scope_body(s, tree->cdr->car, val);
- genop_bs(s, OP_EXEC, cursp(), idx);
+ genop_2(s, OP_EXEC, cursp(), idx);
}
if (val) {
push();
@@ -3027,14 +3482,11 @@ codegen(codegen_scope *s, node *tree, int val)
genop_1(s, OP_TCLASS, cursp());
push();
- genop_bs(s, OP_METHOD, cursp(), idx);
+ genop_2(s, OP_METHOD, cursp(), idx);
push(); pop();
pop();
genop_2(s, OP_DEF, cursp(), sym);
- if (val) {
- genop_bs(s, OP_LOADSYM, cursp(), sym);
- push();
- }
+ if (val) push();
}
break;
@@ -3048,13 +3500,10 @@ codegen(codegen_scope *s, node *tree, int val)
pop();
genop_1(s, OP_SCLASS, cursp());
push();
- genop_bs(s, OP_METHOD, cursp(), idx);
+ genop_2(s, OP_METHOD, cursp(), idx);
pop();
genop_2(s, OP_DEF, cursp(), sym);
- if (val) {
- genop_bs(s, OP_LOADSYM, cursp(), sym);
- push();
- }
+ if (val) push();
}
break;
@@ -3214,9 +3663,9 @@ loop_push(codegen_scope *s, enum looptype t)
struct loopinfo *p = (struct loopinfo *)codegen_palloc(s, sizeof(struct loopinfo));
p->type = t;
- p->pc0 = p->pc1 = p->pc2 = p->pc3 = JMPLINK_START;
+ p->pc0 = p->pc1 = p->pc2 = JMPLINK_START;
p->prev = s->loop;
- p->acc = cursp();
+ p->reg = cursp();
s->loop = p;
return p;
@@ -3232,11 +3681,16 @@ loop_break(codegen_scope *s, node *tree)
else {
struct loopinfo *loop;
- if (tree) {
- gen_retval(s, tree);
- }
loop = s->loop;
+ if (tree) {
+ if (loop->reg < 0) {
+ codegen(s, tree, NOVAL);
+ }
+ else {
+ gen_retval(s, tree);
+ }
+ }
while (loop) {
if (loop->type == LOOP_BEGIN) {
loop = loop->prev;
@@ -3256,11 +3710,16 @@ loop_break(codegen_scope *s, node *tree)
if (loop->type == LOOP_NORMAL) {
int tmp;
- if (tree) {
- gen_move(s, loop->acc, cursp(), 0);
+ if (loop->reg >= 0) {
+ if (tree) {
+ gen_move(s, loop->reg, cursp(), 0);
+ }
+ else {
+ genop_1(s, OP_LOADNIL, loop->reg);
+ }
}
- tmp = genjmp(s, OP_JMPUW, loop->pc3);
- loop->pc3 = tmp;
+ tmp = genjmp(s, OP_JMPUW, loop->pc2);
+ loop->pc2 = tmp;
}
else {
if (!tree) {
@@ -3277,7 +3736,7 @@ loop_pop(codegen_scope *s, int val)
if (val) {
genop_1(s, OP_LOADNIL, cursp());
}
- dispatch_linked(s, s->loop->pc3);
+ dispatch_linked(s, s->loop->pc2);
s->loop = s->loop->prev;
if (val) push();
}
@@ -3308,16 +3767,18 @@ static struct RProc*
generate_code(mrb_state *mrb, parser_state *p, int val)
{
codegen_scope *scope = scope_new(mrb, 0, 0);
- struct RProc *proc;
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
+ struct mrb_jmpbuf jmpbuf;
+ struct RProc *proc;
+
+ mrb->jmp = &jmpbuf;
scope->mrb = mrb;
scope->parser = p;
scope->filename_sym = p->filename_sym;
scope->filename_index = p->current_filename_index;
- MRB_TRY(&scope->jmp) {
- mrb->jmp = &scope->jmp;
+ MRB_TRY(mrb->jmp) {
/* prepare irep */
codegen(scope, p->tree, val);
proc = mrb_proc_new(mrb, scope->irep);
@@ -3330,13 +3791,13 @@ generate_code(mrb_state *mrb, parser_state *p, int val)
mrb->jmp = prev_jmp;
return proc;
}
- MRB_CATCH(&scope->jmp) {
+ MRB_CATCH(mrb->jmp) {
mrb_irep_decref(mrb, scope->irep);
mrb_pool_close(scope->mpool);
mrb->jmp = prev_jmp;
return NULL;
}
- MRB_END_EXC(&scope->jmp);
+ MRB_END_EXC(mrb->jmp);
}
MRB_API struct RProc*
@@ -3360,26 +3821,3 @@ mrb_irep_remove_lv(mrb_state *mrb, mrb_irep *irep)
mrb_irep_remove_lv(mrb, (mrb_irep*)irep->reps[i]);
}
}
-
-#undef OPCODE
-#define Z 1
-#define S 3
-#define W 4
-/* instruction sizes */
-uint8_t mrb_insn_size[] = {
-#define B 2
-#define BB 3
-#define BBB 4
-#define BS 4
-#define BSS 6
-#define SB 4
-#define OPCODE(_,x) x,
-#include "mruby/ops.h"
-#undef OPCODE
-#undef B
-#undef BB
-#undef BS
-#undef BSS
-#undef SB
-#undef BBB
-};
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index 2c2bff714..60cfeadae 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -13,7 +13,6 @@
#include <ctype.h>
#include <errno.h>
-#include <stdlib.h>
#include <string.h>
#include <mruby.h>
#include <mruby/compile.h>
@@ -34,7 +33,6 @@ 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);
@@ -106,7 +104,7 @@ parser_palloc(parser_state *p, size_t size)
void *m = mrb_pool_alloc(p->pool, size);
if (!m) {
- MRB_THROW(p->jmp);
+ MRB_THROW(p->mrb->jmp);
}
return m;
}
@@ -286,9 +284,10 @@ local_var_p(parser_state *p, mrb_sym sym)
const mrb_sym *v = ir->lv;
int i;
- if (!v) break;
- for (i=0; i+1 < ir->nlocals; i++) {
- if (v[i] == sym) return TRUE;
+ if (v) {
+ for (i=0; i+1 < ir->nlocals; i++) {
+ if (v[i] == sym) return TRUE;
+ }
}
if (MRB_PROC_SCOPE_P(u)) break;
u = u->upper;
@@ -1247,7 +1246,7 @@ call_with_block(parser_state *p, node *a, node *b)
}
static node*
-negate_lit(parser_state *p, node *n)
+new_negate(parser_state *p, node *n)
{
return cons((node*)NODE_NEGATE, n);
}
@@ -1293,6 +1292,24 @@ var_reference(parser_state *p, node *lhs)
return lhs;
}
+static node*
+label_reference(parser_state *p, mrb_sym sym)
+{
+ const char *name = mrb_sym_name(p->mrb, sym);
+ node *n;
+
+ if (local_var_p(p, sym)) {
+ n = new_lvar(p, sym);
+ }
+ else if (ISUPPER(name[0])) {
+ n = new_const(p, sym);
+ }
+ else {
+ n = new_fcall(p, sym, 0);
+ }
+ return n;
+}
+
typedef enum mrb_string_type string_type;
static node*
@@ -1623,7 +1640,7 @@ bodystmt : compstmt
NODE_LINENO($$, $1);
}
else if ($3) {
- yywarn(p, "else without rescue is useless");
+ yywarning(p, "else without rescue is useless");
$$ = push($1, $3);
}
else {
@@ -1754,6 +1771,44 @@ command_asgn : lhs '=' command_rhs
{
$$ = new_op_asgn(p, new_call(p, $1, $3, 0, tCOLON2), $4, $5);
}
+ | defn_head f_opt_arglist_paren '=' command
+ {
+ $$ = $1;
+ endless_method_name(p, $1);
+ void_expr_error(p, $4);
+ defn_setup(p, $$, $2, $4);
+ nvars_unnest(p);
+ p->in_def--;
+ }
+ | defn_head f_opt_arglist_paren '=' command modifier_rescue arg
+ {
+ $$ = $1;
+ endless_method_name(p, $1);
+ void_expr_error(p, $4);
+ void_expr_error(p, $6);
+ defn_setup(p, $$, $2, new_mod_rescue(p, $4, $6));
+ nvars_unnest(p);
+ p->in_def--;
+ }
+ | defs_head f_opt_arglist_paren '=' command
+ {
+ $$ = $1;
+ void_expr_error(p, $4);
+ defs_setup(p, $$, $2, $4);
+ nvars_unnest(p);
+ p->in_def--;
+ p->in_single--;
+ }
+ | defs_head f_opt_arglist_paren '=' command modifier_rescue arg
+ {
+ $$ = $1;
+ void_expr_error(p, $4);
+ void_expr_error(p, $6);
+ defs_setup(p, $$, $2, new_mod_rescue(p, $4, $6));
+ nvars_unnest(p);
+ p->in_def--;
+ p->in_single--;
+ }
| backref tOP_ASGN command_rhs
{
backref_error(p, $1);
@@ -2253,11 +2308,11 @@ arg : lhs '=' arg_rhs
}
| tUMINUS_NUM tINTEGER tPOW arg
{
- $$ = call_uni_op(p, call_bin_op(p, $2, "**", $4), "-@");
+ $$ = new_negate(p, call_bin_op(p, $2, "**", $4));
}
| tUMINUS_NUM tFLOAT tPOW arg
{
- $$ = call_uni_op(p, call_bin_op(p, $2, "**", $4), "-@");
+ $$ = new_negate(p, call_bin_op(p, $2, "**", $4));
}
| tUPLUS arg
{
@@ -2265,7 +2320,7 @@ arg : lhs '=' arg_rhs
}
| tUMINUS arg
{
- $$ = call_uni_op(p, $2, "-@");
+ $$ = new_negate(p, $2);
}
| arg '|' arg
{
@@ -2370,7 +2425,7 @@ arg : lhs '=' arg_rhs
nvars_unnest(p);
p->in_def--;
}
- | defs_head f_arglist_paren '=' arg
+ | defs_head f_opt_arglist_paren '=' arg
{
$$ = $1;
void_expr_error(p, $4);
@@ -2379,7 +2434,7 @@ arg : lhs '=' arg_rhs
p->in_def--;
p->in_single--;
}
- | defs_head f_arglist_paren '=' arg modifier_rescue arg
+ | defs_head f_opt_arglist_paren '=' arg modifier_rescue arg
{
$$ = $1;
void_expr_error(p, $4);
@@ -2548,8 +2603,7 @@ opt_block_arg : comma block_arg
}
;
-comma : ','
- | ',' opt_nl heredoc_bodies
+comma : ',' opt_nl
;
args : arg
@@ -3268,7 +3322,14 @@ string_fragment : tCHAR
}
| tSTRING_BEG string_rep tSTRING
{
- $$ = new_dstr(p, push($2, $3));
+ node *n = $2;
+ if (intn($3->cdr->cdr) > 0) {
+ n = push(n, $3);
+ }
+ else {
+ cons_free($3);
+ }
+ $$ = new_dstr(p, n);
}
;
@@ -3310,7 +3371,14 @@ xstring : tXSTRING_BEG tXSTRING
}
| tXSTRING_BEG string_rep tXSTRING
{
- $$ = new_dxstr(p, push($2, $3));
+ node *n = $2;
+ if (intn($3->cdr->cdr) > 0) {
+ n = push(n, $3);
+ }
+ else {
+ cons_free($3);
+ }
+ $$ = new_dxstr(p, n);
}
;
@@ -3373,7 +3441,14 @@ words : tWORDS_BEG tSTRING
}
| tWORDS_BEG string_rep tSTRING
{
- $$ = new_words(p, push($2, $3));
+ node *n = $2;
+ if (intn($3->cdr->cdr) > 0) {
+ n = push(n, $3);
+ }
+ else {
+ cons_free($3);
+ }
+ $$ = new_words(p, n);
}
;
@@ -3385,8 +3460,15 @@ symbol : basic_symbol
}
| tSYMBEG tSTRING_BEG string_rep tSTRING
{
+ node *n = $3;
p->lstate = EXPR_ENDARG;
- $$ = new_dsym(p, new_dstr(p, push($3, $4)));
+ if (intn($4->cdr->cdr) > 0) {
+ n = push(n, $4);
+ }
+ else {
+ cons_free($4);
+ }
+ $$ = new_dsym(p, new_dstr(p, n));
}
;
@@ -3416,7 +3498,11 @@ symbols : tSYMBOLS_BEG tSTRING
}
| tSYMBOLS_BEG string_rep tSTRING
{
- $$ = new_symbols(p, push($2, $3));
+ node *n = $2;
+ if (intn($3->cdr->cdr) > 0) {
+ n = push(n, $3);
+ }
+ $$ = new_symbols(p, n);
}
;
@@ -3424,11 +3510,11 @@ numeric : tINTEGER
| tFLOAT
| tUMINUS_NUM tINTEGER %prec tLOWEST
{
- $$ = negate_lit(p, $2);
+ $$ = new_negate(p, $2);
}
| tUMINUS_NUM tFLOAT %prec tLOWEST
{
- $$ = negate_lit(p, $2);
+ $$ = new_negate(p, $2);
}
;
@@ -3501,12 +3587,7 @@ var_ref : variable
}
| keyword__ENCODING__
{
-#ifdef MRB_UTF8_STRING
- const char *enc = "UTF-8";
-#else
- const char *enc = "ASCII-8BIT";
-#endif
- $$ = new_str(p, enc, strlen(enc));
+ $$ = new_fcall(p, MRB_SYM_2(p->mrb, __ENCODING__), 0);
}
;
@@ -3938,22 +4019,22 @@ assocs : assoc
}
;
-label_tag : tLABEL_TAG
- | tLABEL_TAG heredoc_bodies
- ;
-
assoc : arg tASSOC arg
{
void_expr_error(p, $1);
void_expr_error(p, $3);
$$ = cons($1, $3);
}
- | tIDENTIFIER label_tag arg
+ | tIDENTIFIER tLABEL_TAG arg
{
void_expr_error(p, $3);
$$ = cons(new_sym(p, $1), $3);
}
- | string_fragment label_tag arg
+ | tIDENTIFIER tLABEL_TAG
+ {
+ $$ = cons(new_sym(p, $1), label_reference(p, $1));
+ }
+ | string_fragment tLABEL_TAG arg
{
void_expr_error(p, $3);
if (typen($1->car) == NODE_DSTR) {
@@ -4012,7 +4093,7 @@ opt_terms : /* none */
;
opt_nl : /* none */
- | nl
+ | opt_nl nl
;
rparen : opt_terms ')'
@@ -4025,7 +4106,6 @@ trailer : /* none */
term : ';' {yyerrok;}
| nl
- | heredoc_body
;
nl : '\n'
@@ -4033,6 +4113,7 @@ nl : '\n'
p->lineno += $<num>1;
p->column = 0;
}
+ | heredoc_body
;
terms : term
@@ -4087,7 +4168,7 @@ yyerror_c(parser_state *p, const char *msg, char c)
}
static void
-yywarn(parser_state *p, const char *s)
+yywarning(parser_state *p, const char *s)
{
char* c;
size_t n;
@@ -4115,12 +4196,6 @@ yywarn(parser_state *p, const char *s)
}
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];
@@ -6225,10 +6300,10 @@ parser_yylex(parser_state *p)
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;
+ mrb_int n = mrb_int_read(tok(p), NULL, NULL);
+ if (n > INT32_MAX) {
+ yywarning(p, "capture group index too big; always nil");
+ return keyword_nil;
}
pylval.nd = new_nth_ref(p, (int)n);
}
@@ -6513,6 +6588,7 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt)
int i = 0;
if (!cxt) return;
+ if (!p->tree) return;
if (intn(p->tree->car) != NODE_SCOPE) return;
n0 = n = p->tree->cdr->car;
while (n) {
@@ -6533,53 +6609,39 @@ MRB_API void
mrb_parser_parse(parser_state *p, mrbc_context *c)
{
struct mrb_jmpbuf buf1;
- p->jmp = &buf1;
+ struct mrb_jmpbuf *prev = p->mrb->jmp;
+ p->mrb->jmp = &buf1;
- MRB_TRY(p->jmp) {
+ MRB_TRY(p->mrb->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;
- }
+ n = yyparse(p);
if (n != 0 || p->nerr > 0) {
p->tree = 0;
+ p->mrb->jmp = prev;
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");
+ MRB_CATCH(p->mrb->jmp) {
p->nerr++;
- p->tree = 0;
- return;
+ if (p->mrb->exc == NULL) {
+ yyerror(p, "memory allocation error");
+ p->nerr++;
+ p->tree = 0;
+ }
}
MRB_END_EXC(p->jmp);
+ p->mrb->jmp = prev;
}
MRB_API parser_state*
@@ -7720,3 +7782,19 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
}
#endif
}
+
+typedef mrb_bool mrb_parser_foreach_top_variable_func(mrb_state *mrb, mrb_sym sym, void *user);
+void mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user);
+
+void
+mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user)
+{
+ const mrb_ast_node *n = p->tree;
+ if ((intptr_t)n->car == NODE_SCOPE) {
+ n = n->cdr->car;
+ for (; n; n = n->cdr) {
+ mrb_sym sym = sym(n->car);
+ if (sym && !func(mrb, sym, user)) break;
+ }
+ }
+}
diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c
index 137e4d4cf..4fa1b4678 100644
--- a/mrbgems/mruby-compiler/core/y.tab.c
+++ b/mrbgems/mruby-compiler/core/y.tab.c
@@ -76,7 +76,6 @@
#include <ctype.h>
#include <errno.h>
-#include <stdlib.h>
#include <string.h>
#include <mruby.h>
#include <mruby/compile.h>
@@ -97,7 +96,6 @@ 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);
@@ -169,7 +167,7 @@ parser_palloc(parser_state *p, size_t size)
void *m = mrb_pool_alloc(p->pool, size);
if (!m) {
- MRB_THROW(p->jmp);
+ MRB_THROW(p->mrb->jmp);
}
return m;
}
@@ -349,9 +347,10 @@ local_var_p(parser_state *p, mrb_sym sym)
const mrb_sym *v = ir->lv;
int i;
- if (!v) break;
- for (i=0; i+1 < ir->nlocals; i++) {
- if (v[i] == sym) return TRUE;
+ if (v) {
+ for (i=0; i+1 < ir->nlocals; i++) {
+ if (v[i] == sym) return TRUE;
+ }
}
if (MRB_PROC_SCOPE_P(u)) break;
u = u->upper;
@@ -1310,7 +1309,7 @@ call_with_block(parser_state *p, node *a, node *b)
}
static node*
-negate_lit(parser_state *p, node *n)
+new_negate(parser_state *p, node *n)
{
return cons((node*)NODE_NEGATE, n);
}
@@ -1356,6 +1355,24 @@ var_reference(parser_state *p, node *lhs)
return lhs;
}
+static node*
+label_reference(parser_state *p, mrb_sym sym)
+{
+ const char *name = mrb_sym_name(p->mrb, sym);
+ node *n;
+
+ if (local_var_p(p, sym)) {
+ n = new_lvar(p, sym);
+ }
+ else if (ISUPPER(name[0])) {
+ n = new_const(p, sym);
+ }
+ else {
+ n = new_fcall(p, sym, 0);
+ }
+ return n;
+}
+
typedef enum mrb_string_type string_type;
static node*
@@ -1448,7 +1465,7 @@ heredoc_end(parser_state *p)
/* xxx ----------------------------- */
-#line 1452 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 1469 "mrbgems/mruby-compiler/core/y.tab.c"
# ifndef YY_CAST
# ifdef __cplusplus
@@ -1620,7 +1637,7 @@ extern int yydebug;
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE
{
-#line 1394 "mrbgems/mruby-compiler/core/parse.y"
+#line 1411 "mrbgems/mruby-compiler/core/parse.y"
node *nd;
mrb_sym id;
@@ -1628,7 +1645,7 @@ union YYSTYPE
stack_type stack;
const struct vtable *vars;
-#line 1632 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 1649 "mrbgems/mruby-compiler/core/y.tab.c"
};
typedef union YYSTYPE YYSTYPE;
@@ -1946,16 +1963,16 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 3
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 12611
+#define YYLAST 12926
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 149
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 177
+#define YYNNTS 176
/* YYNRULES -- Number of rules. */
-#define YYNRULES 607
+#define YYNRULES 609
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 1063
+#define YYNSTATES 1072
#define YYUNDEFTOK 2
#define YYMAXUTOK 377
@@ -2014,67 +2031,67 @@ static const yytype_uint8 yytranslate[] =
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_int16 yyrline[] =
{
- 0, 1565, 1565, 1565, 1576, 1582, 1586, 1591, 1595, 1601,
- 1603, 1602, 1616, 1643, 1649, 1653, 1658, 1662, 1668, 1668,
- 1672, 1676, 1680, 1684, 1688, 1692, 1696, 1701, 1702, 1706,
- 1710, 1714, 1718, 1725, 1728, 1732, 1736, 1740, 1744, 1748,
- 1753, 1757, 1764, 1765, 1769, 1773, 1774, 1778, 1782, 1786,
- 1790, 1794, 1804, 1803, 1818, 1827, 1828, 1831, 1832, 1839,
- 1838, 1853, 1857, 1862, 1866, 1871, 1875, 1880, 1884, 1888,
- 1892, 1896, 1902, 1906, 1912, 1913, 1919, 1923, 1927, 1931,
- 1935, 1939, 1943, 1947, 1951, 1955, 1961, 1962, 1968, 1972,
- 1978, 1982, 1988, 1992, 1996, 2000, 2004, 2008, 2014, 2020,
- 2027, 2031, 2035, 2039, 2043, 2047, 2053, 2059, 2064, 2070,
- 2074, 2077, 2081, 2085, 2092, 2093, 2094, 2095, 2100, 2107,
- 2108, 2111, 2115, 2115, 2121, 2122, 2123, 2124, 2125, 2126,
- 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136,
- 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146,
- 2147, 2148, 2149, 2150, 2153, 2153, 2153, 2154, 2154, 2155,
- 2155, 2155, 2156, 2156, 2156, 2156, 2157, 2157, 2157, 2158,
- 2158, 2158, 2159, 2159, 2159, 2159, 2160, 2160, 2160, 2160,
- 2161, 2161, 2161, 2161, 2162, 2162, 2162, 2162, 2163, 2163,
- 2163, 2163, 2164, 2164, 2167, 2171, 2175, 2179, 2183, 2187,
- 2191, 2196, 2201, 2206, 2210, 2214, 2218, 2222, 2226, 2230,
- 2234, 2238, 2242, 2246, 2250, 2254, 2258, 2262, 2266, 2270,
- 2274, 2278, 2282, 2286, 2290, 2294, 2298, 2302, 2306, 2310,
- 2314, 2318, 2322, 2326, 2330, 2334, 2338, 2342, 2346, 2350,
- 2354, 2363, 2373, 2382, 2392, 2398, 2399, 2404, 2408, 2415,
- 2419, 2427, 2431, 2447, 2473, 2474, 2477, 2478, 2479, 2484,
- 2489, 2496, 2502, 2507, 2512, 2517, 2524, 2524, 2535, 2541,
- 2545, 2551, 2552, 2555, 2561, 2567, 2572, 2579, 2584, 2589,
- 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2607, 2612,
- 2611, 2623, 2627, 2622, 2632, 2632, 2636, 2640, 2644, 2648,
- 2653, 2658, 2662, 2666, 2670, 2674, 2678, 2679, 2685, 2691,
- 2684, 2703, 2711, 2719, 2719, 2719, 2726, 2726, 2726, 2733,
- 2739, 2744, 2746, 2743, 2755, 2753, 2771, 2776, 2769, 2793,
- 2791, 2807, 2817, 2828, 2832, 2836, 2840, 2846, 2853, 2854,
- 2855, 2858, 2859, 2862, 2863, 2871, 2872, 2878, 2882, 2885,
- 2889, 2893, 2897, 2902, 2906, 2910, 2914, 2920, 2919, 2929,
- 2933, 2937, 2941, 2947, 2952, 2957, 2961, 2965, 2969, 2973,
- 2977, 2981, 2985, 2989, 2993, 2997, 3001, 3005, 3009, 3013,
- 3019, 3024, 3031, 3031, 3035, 3040, 3047, 3051, 3057, 3058,
- 3061, 3066, 3069, 3073, 3079, 3083, 3090, 3089, 3104, 3114,
- 3118, 3123, 3130, 3134, 3138, 3142, 3146, 3150, 3154, 3158,
- 3162, 3169, 3168, 3183, 3182, 3198, 3206, 3215, 3218, 3225,
- 3228, 3232, 3233, 3236, 3240, 3243, 3247, 3250, 3251, 3252,
- 3253, 3256, 3257, 3263, 3264, 3265, 3269, 3275, 3276, 3282,
- 3287, 3286, 3297, 3301, 3307, 3311, 3317, 3321, 3327, 3330,
- 3331, 3334, 3340, 3346, 3347, 3350, 3357, 3356, 3370, 3374,
- 3381, 3386, 3393, 3399, 3400, 3401, 3402, 3403, 3407, 3413,
- 3417, 3423, 3424, 3425, 3429, 3435, 3439, 3443, 3447, 3451,
- 3457, 3461, 3467, 3471, 3475, 3479, 3483, 3487, 3495, 3502,
- 3513, 3514, 3518, 3522, 3521, 3538, 3539, 3542, 3548, 3566,
- 3586, 3587, 3593, 3599, 3605, 3612, 3617, 3624, 3628, 3634,
- 3638, 3644, 3645, 3648, 3652, 3658, 3662, 3666, 3670, 3676,
- 3681, 3686, 3690, 3694, 3698, 3702, 3706, 3710, 3714, 3718,
- 3722, 3726, 3730, 3734, 3738, 3743, 3749, 3754, 3759, 3764,
- 3769, 3776, 3780, 3787, 3792, 3791, 3803, 3807, 3813, 3821,
- 3829, 3837, 3841, 3847, 3851, 3857, 3858, 3861, 3866, 3873,
- 3874, 3877, 3883, 3887, 3893, 3898, 3898, 3923, 3924, 3930,
- 3935, 3941, 3942, 3945, 3951, 3956, 3966, 3973, 3974, 3975,
- 3978, 3979, 3980, 3981, 3984, 3985, 3986, 3989, 3990, 3993,
- 3997, 4003, 4004, 4010, 4011, 4014, 4015, 4018, 4021, 4022,
- 4023, 4026, 4027, 4028, 4031, 4038, 4039, 4043
+ 0, 1582, 1582, 1582, 1593, 1599, 1603, 1608, 1612, 1618,
+ 1620, 1619, 1633, 1660, 1666, 1670, 1675, 1679, 1685, 1685,
+ 1689, 1693, 1697, 1701, 1705, 1709, 1713, 1718, 1719, 1723,
+ 1727, 1731, 1735, 1742, 1745, 1749, 1753, 1757, 1761, 1765,
+ 1770, 1774, 1783, 1793, 1802, 1812, 1819, 1820, 1824, 1828,
+ 1829, 1833, 1837, 1841, 1845, 1849, 1859, 1858, 1873, 1882,
+ 1883, 1886, 1887, 1894, 1893, 1908, 1912, 1917, 1921, 1926,
+ 1930, 1935, 1939, 1943, 1947, 1951, 1957, 1961, 1967, 1968,
+ 1974, 1978, 1982, 1986, 1990, 1994, 1998, 2002, 2006, 2010,
+ 2016, 2017, 2023, 2027, 2033, 2037, 2043, 2047, 2051, 2055,
+ 2059, 2063, 2069, 2075, 2082, 2086, 2090, 2094, 2098, 2102,
+ 2108, 2114, 2119, 2125, 2129, 2132, 2136, 2140, 2147, 2148,
+ 2149, 2150, 2155, 2162, 2163, 2166, 2170, 2170, 2176, 2177,
+ 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187,
+ 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197,
+ 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2208, 2208,
+ 2208, 2209, 2209, 2210, 2210, 2210, 2211, 2211, 2211, 2211,
+ 2212, 2212, 2212, 2213, 2213, 2213, 2214, 2214, 2214, 2214,
+ 2215, 2215, 2215, 2215, 2216, 2216, 2216, 2216, 2217, 2217,
+ 2217, 2217, 2218, 2218, 2218, 2218, 2219, 2219, 2222, 2226,
+ 2230, 2234, 2238, 2242, 2246, 2251, 2256, 2261, 2265, 2269,
+ 2273, 2277, 2281, 2285, 2289, 2293, 2297, 2301, 2305, 2309,
+ 2313, 2317, 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349,
+ 2353, 2357, 2361, 2365, 2369, 2373, 2377, 2381, 2385, 2389,
+ 2393, 2397, 2401, 2405, 2409, 2418, 2428, 2437, 2447, 2453,
+ 2454, 2459, 2463, 2470, 2474, 2482, 2486, 2502, 2528, 2529,
+ 2532, 2533, 2534, 2539, 2544, 2551, 2557, 2562, 2567, 2572,
+ 2579, 2579, 2590, 2596, 2600, 2606, 2609, 2615, 2621, 2626,
+ 2633, 2638, 2643, 2650, 2651, 2652, 2653, 2654, 2655, 2656,
+ 2657, 2661, 2666, 2665, 2677, 2681, 2676, 2686, 2686, 2690,
+ 2694, 2698, 2702, 2707, 2712, 2716, 2720, 2724, 2728, 2732,
+ 2733, 2739, 2745, 2738, 2757, 2765, 2773, 2773, 2773, 2780,
+ 2780, 2780, 2787, 2793, 2798, 2800, 2797, 2809, 2807, 2825,
+ 2830, 2823, 2847, 2845, 2861, 2871, 2882, 2886, 2890, 2894,
+ 2900, 2907, 2908, 2909, 2912, 2913, 2916, 2917, 2925, 2926,
+ 2932, 2936, 2939, 2943, 2947, 2951, 2956, 2960, 2964, 2968,
+ 2974, 2973, 2983, 2987, 2991, 2995, 3001, 3006, 3011, 3015,
+ 3019, 3023, 3027, 3031, 3035, 3039, 3043, 3047, 3051, 3055,
+ 3059, 3063, 3067, 3073, 3078, 3085, 3085, 3089, 3094, 3101,
+ 3105, 3111, 3112, 3115, 3120, 3123, 3127, 3133, 3137, 3144,
+ 3143, 3158, 3168, 3172, 3177, 3184, 3188, 3192, 3196, 3200,
+ 3204, 3208, 3212, 3216, 3223, 3222, 3237, 3236, 3252, 3260,
+ 3269, 3272, 3279, 3282, 3286, 3287, 3290, 3294, 3297, 3301,
+ 3304, 3305, 3306, 3307, 3310, 3311, 3317, 3318, 3319, 3323,
+ 3336, 3337, 3343, 3348, 3347, 3358, 3362, 3368, 3372, 3385,
+ 3389, 3395, 3398, 3399, 3402, 3408, 3414, 3415, 3418, 3425,
+ 3424, 3438, 3442, 3456, 3461, 3475, 3481, 3482, 3483, 3484,
+ 3485, 3489, 3495, 3499, 3509, 3510, 3511, 3515, 3521, 3525,
+ 3529, 3533, 3537, 3543, 3547, 3553, 3557, 3561, 3565, 3569,
+ 3573, 3581, 3588, 3594, 3595, 3599, 3603, 3602, 3619, 3620,
+ 3623, 3629, 3647, 3667, 3668, 3674, 3680, 3686, 3693, 3698,
+ 3705, 3709, 3715, 3719, 3725, 3726, 3729, 3733, 3739, 3743,
+ 3747, 3751, 3757, 3762, 3767, 3771, 3775, 3779, 3783, 3787,
+ 3791, 3795, 3799, 3803, 3807, 3811, 3815, 3819, 3824, 3830,
+ 3835, 3840, 3845, 3850, 3857, 3861, 3868, 3873, 3872, 3884,
+ 3888, 3894, 3902, 3910, 3918, 3922, 3928, 3932, 3938, 3939,
+ 3942, 3947, 3954, 3955, 3958, 3964, 3968, 3974, 3979, 3979,
+ 4004, 4005, 4011, 4016, 4022, 4028, 4033, 4037, 4047, 4054,
+ 4055, 4056, 4059, 4060, 4061, 4062, 4065, 4066, 4067, 4070,
+ 4071, 4074, 4078, 4084, 4085, 4091, 4092, 4095, 4096, 4099,
+ 4102, 4103, 4104, 4107, 4108, 4111, 4116, 4119, 4120, 4124
};
#endif
@@ -2141,9 +2158,9 @@ static const char *const yytname[] =
"f_arg_item", "@32", "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", "$@33",
- "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
+ "assoc_list", "assocs", "assoc", "operation", "operation2", "operation3",
+ "dot_or_colon", "call_op", "call_op2", "opt_terms", "opt_nl", "rparen",
+ "trailer", "term", "nl", "terms", "none", YY_NULLPTR
};
#endif
@@ -2170,12 +2187,12 @@ static const yytype_int16 yytoknum[] =
};
# endif
-#define YYPACT_NINF (-848)
+#define YYPACT_NINF (-862)
#define yypact_value_is_default(Yyn) \
((Yyn) == YYPACT_NINF)
-#define YYTABLE_NINF (-608)
+#define YYTABLE_NINF (-610)
#define yytable_value_is_error(Yyn) \
((Yyn) == YYTABLE_NINF)
@@ -2184,113 +2201,114 @@ static const yytype_int16 yytoknum[] =
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- -848, 137, 2991, -848, 7860, 9984, 10326, 6168, -848, 9630,
- 9630, -848, -848, 10098, 7350, 5903, 8096, 8096, -848, -848,
- 8096, 3648, 3240, -848, -848, -848, -848, 97, 7350, -848,
- 49, -848, -848, -848, 6310, 3104, -848, -848, 6452, -848,
- -848, -848, -848, -848, -848, -848, 51, 9748, 9748, 9748,
- 9748, 168, 5162, 891, 8568, 8922, 7632, -848, 7068, 1196,
- 473, 810, 1387, 1396, -848, 273, 9866, 9748, -848, 1021,
- -848, 1343, -848, 279, 1637, 1722, -848, -848, 130, 112,
- -848, 121, 10212, -848, 152, 12292, 671, 677, 36, 82,
- -848, 321, -848, -848, -848, -848, -848, -848, -848, -848,
- -848, 46, 187, -848, 200, 71, -848, -848, -848, -848,
- -848, 181, 181, 207, 689, 917, -848, 9630, 283, 5281,
- 352, 1722, 1722, -848, 174, -848, 806, -848, -848, 71,
- -848, -848, -848, -848, -848, -848, -848, -848, -848, -848,
- -848, -848, -848, -848, -848, -848, -848, -848, -848, -848,
- -848, -848, -848, -848, -848, -848, -848, -848, 24, 103,
- 146, 166, -848, -848, -848, -848, -848, -848, 179, 182,
- 197, 225, -848, 228, -848, -848, -848, -848, -848, -848,
- -848, -848, -848, -848, -848, -848, -848, -848, -848, -848,
- -848, -848, -848, -848, -848, -848, -848, -848, -848, -848,
- -848, -848, -848, -848, -848, -848, -848, -848, -848, 233,
- 4340, 341, 279, 680, 277, 12416, 843, 52, 309, 76,
- 680, 9630, 9630, 883, 348, -848, -848, 1109, 381, 98,
- 107, -848, -848, -848, -848, -848, -848, -848, -848, -848,
- 7209, -848, -848, 278, -848, -848, -848, -848, -848, -848,
- 1021, -848, 338, -848, 402, -848, -848, 1021, 3376, 9748,
- 9748, 9748, 9748, -848, 12354, -848, -848, 292, 379, 292,
- -848, -848, -848, 8214, -848, -848, -848, 8096, -848, -848,
- -848, 5903, 9630, -848, -848, 317, 5400, -848, 1118, 368,
- 12478, 12478, 203, 7978, 5162, 343, 1021, 1343, 1021, 380,
- -848, 7978, 1021, 359, 1352, 1352, -848, 12354, 364, 1352,
- -848, 461, 10440, 383, 1158, 1213, 1216, 1732, -848, -848,
- -848, -848, 1421, -848, -848, -848, -848, -848, -848, 518,
- 1507, -848, -848, 499, -848, 880, -848, 1513, -848, 1528,
- 430, 441, -848, -848, -848, -848, 5665, 9630, 9630, 9630,
- 9630, 7978, 9630, 9630, 155, -848, -848, -848, -848, -848,
- -848, -848, -848, -848, -848, -848, -848, 1378, 431, 444,
- 4340, 9748, -848, 409, 524, 446, -848, 1021, -848, -848,
- -848, 475, 9748, -848, 480, 556, 481, 576, -848, -848,
- 511, 4340, -848, -848, 9040, -848, 5162, 7746, 492, 9040,
- 9748, 9748, 9748, 9748, 9748, 9748, 9748, 9748, 9748, 9748,
- 9748, 9748, 9748, 9748, 588, 9748, 9748, 9748, 9748, 9748,
- 9748, 9748, 9748, 9748, 9748, 9748, 9748, 1200, -848, 8096,
- -848, 2511, -848, -848, 11750, -848, -848, -848, -848, 9866,
- 9866, -848, 542, -848, 279, -848, 1218, -848, -848, -848,
- -848, -848, -848, 2629, 8096, 10718, 4340, 9630, -848, -848,
- -848, 627, 630, 218, -848, 4486, 629, 9748, 10804, 8096,
- 10890, 9748, 9748, 4778, 106, 106, 122, 10976, 8096, 11062,
- -848, 583, -848, 5400, 402, -848, -848, 9158, 645, -848,
- 518, 9748, 12416, 12416, 12416, 9748, 374, -848, 8332, -848,
- 9748, -848, 8686, 6022, 520, 1021, 292, 292, -848, -848,
- 1016, 526, -848, -848, 7350, 4897, 534, 10804, 10890, 9748,
- 1343, 1021, -848, -848, 5784, 541, 1343, -848, -848, 8804,
- -848, 1021, 8922, -848, -848, -848, 1218, 121, 10440, -848,
- 10440, 11148, 8096, 11234, 2150, -848, -848, -848, 1539, 5400,
- 518, -848, -848, -848, -848, -848, -848, -848, 9748, 9748,
- -848, -848, -848, -848, -848, -848, -848, -848, -848, -848,
- 1672, 1021, 1021, 545, 9748, 661, 12416, 78, -848, -848,
- -848, 47, -848, -848, 2150, -848, 12416, 2150, -848, -848,
- 1545, -848, -848, 9748, 673, 38, 9748, -848, 12008, 292,
- -848, 1021, 10440, 549, -848, -848, -848, 648, 572, 1998,
- -848, -848, 1267, 219, 2194, 2194, 2194, 2194, 2128, 2128,
- 2694, 2786, 2194, 2194, 12478, 12478, 465, 465, -848, 368,
- 11946, 2128, 2128, 1923, 1923, 1531, 674, 674, 368, 368,
- 368, 3784, 6808, 4056, 6926, -848, 181, -848, 554, 292,
- 258, -848, 507, -848, -848, 3512, -848, -848, 2370, 38,
- 38, -848, 2848, -848, -848, -848, -848, -848, 1021, 9630,
- 4340, 1033, 515, -848, 181, 557, 181, 685, 1016, 7491,
- -848, 9276, 683, -848, 425, -848, 6570, 6689, 563, 295,
- 296, 683, -848, -848, -848, -848, 66, 115, 567, 126,
- 128, 9630, 7350, 571, 706, 12416, 80, -848, 518, 12416,
- 12416, 518, 9748, 12354, -848, 292, 12416, -848, -848, -848,
- -848, 8450, 8686, -848, -848, -848, 585, -848, -848, 170,
- 1343, 1021, 1352, 492, -848, 1033, 515, 586, 1058, 1092,
- 581, 89, -848, 591, -848, 368, 368, -848, 1286, 1021,
- 592, -848, -848, 1886, 11822, -848, 676, -848, 446, -848,
- -848, -848, 593, 595, 596, -848, 612, 676, 596, 11884,
- -848, -848, 2150, 4340, -848, -848, 12079, 9394, -848, -848,
- 10440, 7978, 9866, 9748, 11320, 8096, 11406, 55, 9866, 9866,
- -848, 542, 509, 8332, 9866, 9866, -848, 542, 82, 130,
- 4340, 5400, 38, -848, 1021, 740, -848, -848, -848, -848,
- 12008, -848, 665, -848, 5043, 745, -848, 9630, 750, -848,
- 9748, 9748, 298, 9748, 9748, 753, 5546, 5546, 140, 106,
- -848, -848, -848, 9512, 4632, 518, 12416, -848, 6022, 292,
- -848, -848, -848, 1095, 615, 625, 4340, 5400, -848, -848,
- -848, 631, -848, 1803, 1021, 9748, -848, 2150, -848, 1545,
- -848, 1545, -848, 1545, -848, -848, 9748, -848, 581, 581,
- 10554, -848, 635, 446, 638, 10554, -848, 643, 649, -848,
- 757, 9748, 12150, -848, -848, 12416, 3920, 4192, 651, 305,
- 449, 9748, 9748, -848, -848, -848, -848, -848, 9866, -848,
- -848, -848, -848, -848, -848, -848, 789, 684, 5400, 4340,
- -848, -848, 10668, 680, -848, -848, 5546, -848, -848, 680,
- -848, 9748, -848, 797, 825, -848, 12416, 365, -848, 8686,
- -848, 1320, 826, 710, 1836, 1836, 1295, -848, 12416, 596,
- 704, 596, 596, 12416, 724, 727, 801, 1322, 78, -848,
- -848, 1742, -848, 1322, 2150, -848, 1545, -848, -848, 12221,
- 464, 12416, 12416, -848, -848, -848, -848, 718, 844, 805,
- -848, 1335, 1213, 1216, 4340, -848, 4486, -848, -848, 5546,
- -848, -848, -848, -848, 12, -848, -848, -848, -848, 721,
- 721, 1836, 726, -848, 1545, -848, -848, -848, -848, -848,
- -848, 11492, -848, 446, 78, -848, -848, 731, 735, 739,
- -848, 742, 739, -848, -848, 1218, 11578, 8096, 11664, 630,
- 425, 851, 1320, -848, 1836, 721, 1836, 596, 741, 744,
- -848, 2150, -848, 1545, -848, 1545, -848, 1545, -848, -848,
- 1033, 515, 748, 746, 804, -848, -848, -848, -848, 721,
- -848, 739, 751, 739, 739, 1095, -848, 1545, -848, -848,
- -848, 739, -848
+ -862, 113, 3344, -862, 8328, 10452, 10794, 6636, -862, 10098,
+ 10098, -862, -862, 10566, 7818, 6252, 8564, 8564, -862, -862,
+ 8564, 3997, 3582, -862, -862, -862, -862, 10, 7818, -862,
+ 20, -862, -862, -862, 6778, 3179, -862, -862, 6920, -862,
+ -862, -862, -862, -862, -862, -862, 292, 10216, 10216, 10216,
+ 10216, 114, 5511, 1275, 9036, 9390, 8100, -862, 7536, 628,
+ 100, 502, 965, 992, -862, 487, 10334, 10216, -862, 756,
+ -862, 1407, -862, 364, 1613, 1613, -862, -862, 155, 65,
+ -862, 67, 10680, -862, 115, 12651, 82, 154, 137, 88,
+ -862, 103, -862, -862, -862, -862, -862, -862, -862, -862,
+ -862, 81, 142, -862, 277, 97, -862, -862, -862, -862,
+ -862, 107, 107, 10, 618, 1033, -862, 10098, 148, 5630,
+ 567, 1261, 1261, -862, 145, -862, 206, -862, -862, 97,
+ -862, -862, -862, -862, -862, -862, -862, -862, -862, -862,
+ -862, -862, -862, -862, -862, -862, -862, -862, -862, -862,
+ -862, -862, -862, -862, -862, -862, -862, -862, 54, 106,
+ 110, 158, -862, -862, -862, -862, -862, -862, 173, 192,
+ 216, 219, -862, 238, -862, -862, -862, -862, -862, -862,
+ -862, -862, -862, -862, -862, -862, -862, -862, -862, -862,
+ -862, -862, -862, -862, -862, -862, -862, -862, -862, -862,
+ -862, -862, -862, -862, -862, -862, -862, -862, -862, 280,
+ 4689, 224, 364, 1613, 1613, 810, 160, 12775, 377, 320,
+ 193, 331, 810, 10098, 10098, 644, 235, -862, -862, 645,
+ 275, 86, 116, -862, -862, -862, -862, -862, -862, -862,
+ -862, -862, 7677, -862, -862, 162, -862, -862, -862, -862,
+ -862, -862, 756, -862, 557, -862, 287, -862, -862, 756,
+ 3725, 10216, 10216, 10216, 10216, -862, 12713, -862, -862, 180,
+ 258, 180, -862, -862, -862, 8682, -862, -862, -862, 8564,
+ -862, -862, -862, 6252, 6490, -862, 186, 5749, -862, 678,
+ 225, 2722, 2722, 288, 8446, 5511, 198, 756, 1407, 756,
+ 267, -862, 8446, 756, 251, 1367, 1367, -862, 12713, 256,
+ 1367, -862, 342, 10908, 257, 768, 926, 1070, 1707, -862,
+ -862, -862, -862, 1192, -862, -862, -862, -862, -862, -862,
+ 570, 1262, -862, -862, 326, -862, 663, -862, 1270, -862,
+ 1280, 313, 324, -862, -862, -862, -862, 6014, 10098, 10098,
+ 10098, 10098, 8446, 10098, 10098, 63, -862, -862, -862, -862,
+ -862, -862, -862, -862, -862, -862, -862, -862, 2066, 318,
+ 337, 4689, 10216, -862, 308, 409, 336, -862, 756, -862,
+ -862, -862, 339, 10216, -862, 341, 453, 367, 462, -862,
+ -862, 399, 4689, -862, -862, 9508, -862, 5511, 8214, 380,
+ 9508, 10216, 10216, 10216, 10216, 10216, 10216, 10216, 10216, 10216,
+ 10216, 10216, 10216, 10216, 10216, 479, 10216, 10216, 10216, 10216,
+ 10216, 10216, 10216, 10216, 10216, 10216, 10216, 10216, 11186, -862,
+ 8564, -862, 11272, -862, -862, 12476, -862, -862, -862, -862,
+ 10334, 10334, -862, 438, -862, 364, -862, 1071, -862, -862,
+ -862, -862, -862, -862, 11358, 8564, 11444, 4689, 10098, -862,
+ -862, -862, 532, 550, 382, 456, 460, -862, 4835, 578,
+ 10216, 11530, 8564, 11616, 10216, 10216, 5127, 73, 73, 124,
+ 11702, 8564, 11788, -862, 535, -862, 5749, 287, -862, -862,
+ 9626, 585, -862, 10216, 12775, 12775, 12775, 10216, -862, -862,
+ 8800, -862, 10216, -862, 9154, 6371, 470, 756, 180, 180,
+ -862, -862, 1006, 472, -862, -862, -862, 7818, 5246, 464,
+ 11530, 11616, 10216, 1407, 756, -862, -862, 6133, 489, 1407,
+ -862, -862, 9272, -862, 756, 9390, -862, -862, -862, 1071,
+ 67, 10908, -862, 10908, 11874, 8564, 11960, 1470, -862, -862,
+ -862, 1285, 5749, 570, -862, -862, -862, -862, -862, -862,
+ -862, 10216, 10216, -862, -862, -862, -862, -862, -862, -862,
+ -862, -862, -862, 1586, 756, 756, 500, 10334, 633, 12775,
+ 92, -862, -862, -862, 47, -862, -862, 1470, -862, 12775,
+ 1470, -862, -862, 1815, -862, -862, 10334, 638, 56, 10216,
+ -862, 2992, 180, -862, 756, 10908, 526, -862, -862, -862,
+ 626, 553, 1418, -862, -862, 1092, 407, 3503, 3503, 3503,
+ 3503, 1726, 1726, 12793, 2453, 3503, 3503, 2722, 2722, 918,
+ 918, -862, 225, 12775, 1726, 1726, 1345, 1345, 1622, 314,
+ 314, 225, 225, 225, 4133, 7276, 4405, 7394, -862, 107,
+ -862, 538, 180, 343, -862, 413, -862, -862, 3861, -862,
+ -862, 1934, 56, 56, -862, 2201, -862, -862, -862, -862,
+ -862, 756, 10098, 4689, 1091, 634, -862, 107, 543, 107,
+ 683, 1006, 7959, -862, 9744, 682, -862, 10216, 10216, 619,
+ -862, 7038, 7157, 562, 458, 465, 682, -862, -862, -862,
+ -862, 62, 112, 568, 130, 134, 10098, 7818, 576, 701,
+ 12775, 774, -862, 12775, 12775, 493, 10216, 12713, -862, 180,
+ 12775, -862, -862, -862, -862, 8918, 9154, -862, -862, -862,
+ 582, -862, -862, 55, 1407, 756, 1367, 380, -862, 1091,
+ 634, 581, 1159, 1160, -862, 72, -862, 593, -862, 225,
+ 225, -862, 1007, 756, 606, -862, -862, 2252, 708, 2789,
+ -862, 703, -862, 336, -862, -862, -862, 624, 625, 627,
+ -862, 635, 703, 627, 744, 2908, -862, -862, 1470, 4689,
+ -862, -862, 3393, 9862, -862, -862, 10908, 8446, 10334, 10216,
+ 12046, 8564, 12132, 217, 10334, 10334, -862, 438, 433, 8800,
+ 10334, 10334, -862, 438, 88, 155, 4689, 5749, 56, -862,
+ 756, 778, -862, -862, -862, -862, 2992, -862, 704, -862,
+ 5392, 787, -862, 10098, 789, -862, 10216, 10216, 476, 10216,
+ 10216, 795, 5895, 5895, 135, 73, -862, -862, -862, 9980,
+ 4981, 12775, -862, 6371, 180, -862, -862, -862, 1173, 667,
+ 1415, 4689, 5749, -862, -862, -862, 671, -862, 1596, 756,
+ 10216, 10216, -862, 1470, -862, 1815, -862, 1815, -862, 1815,
+ -862, -862, 10216, 10216, -862, -862, -862, 11022, -862, 681,
+ 336, 688, 11022, -862, 692, 696, -862, 828, 10216, 12509,
+ -862, -862, 12775, 4269, 4541, 705, 517, 528, 10216, 10216,
+ -862, -862, -862, -862, -862, 10334, -862, -862, -862, -862,
+ -862, -862, -862, 829, 711, 5749, 4689, -862, -862, 11136,
+ 810, -862, -862, 5895, -862, -862, 810, -862, 10216, -862,
+ 836, 840, -862, 12775, 244, -862, 9154, -862, 1385, 842,
+ 723, 1676, 1676, 1081, -862, 12775, 12775, 627, 721, 627,
+ 627, 12775, 12775, 740, 741, 821, 1093, 92, -862, -862,
+ 1793, -862, 1093, 1470, -862, 1815, -862, -862, 12580, 575,
+ 12775, 12775, -862, -862, -862, -862, 742, 864, 827, -862,
+ 1136, 926, 1070, 4689, -862, 4835, -862, -862, 5895, -862,
+ -862, -862, -862, 746, -862, -862, -862, -862, 752, 752,
+ 1676, 755, -862, 1815, -862, -862, -862, -862, -862, -862,
+ 12218, -862, 336, 92, -862, -862, 761, 763, 769, -862,
+ 779, 769, -862, -862, 1071, 12304, 8564, 12390, 550, 619,
+ 868, 1385, 493, 1676, 752, 1676, 627, 766, 782, -862,
+ 1470, -862, 1815, -862, 1815, -862, 1815, -862, -862, 1091,
+ 634, 745, 853, 995, -862, -862, -862, -862, 752, -862,
+ 769, 788, 769, 769, 1173, -862, 1815, -862, -862, -862,
+ 769, -862
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -2298,159 +2316,160 @@ static const yytype_int16 yypact[] =
means the default is an error. */
static const yytype_int16 yydefact[] =
{
- 2, 0, 0, 1, 0, 0, 0, 0, 289, 0,
- 0, 313, 316, 0, 0, 593, 333, 334, 335, 336,
- 301, 266, 266, 484, 483, 485, 486, 595, 0, 10,
- 0, 488, 487, 489, 475, 579, 477, 476, 479, 478,
- 471, 472, 433, 434, 490, 491, 287, 0, 0, 0,
- 0, 0, 0, 291, 607, 607, 84, 308, 0, 0,
- 0, 0, 0, 0, 448, 0, 0, 0, 3, 593,
- 6, 9, 27, 33, 535, 535, 45, 56, 55, 0,
- 72, 0, 76, 86, 0, 50, 244, 0, 57, 306,
- 280, 281, 431, 282, 283, 284, 429, 428, 460, 430,
- 427, 482, 0, 285, 286, 266, 5, 8, 333, 334,
- 301, 607, 409, 0, 109, 110, 287, 0, 0, 0,
- 0, 535, 535, 112, 492, 337, 0, 482, 286, 0,
- 329, 164, 174, 165, 161, 190, 191, 192, 193, 172,
- 187, 180, 170, 169, 185, 168, 167, 163, 188, 162,
- 175, 179, 181, 173, 166, 182, 189, 184, 183, 176,
- 186, 171, 160, 178, 177, 159, 157, 158, 154, 155,
- 156, 114, 116, 115, 149, 150, 127, 128, 129, 136,
- 133, 135, 130, 131, 151, 152, 137, 138, 142, 145,
- 146, 132, 134, 124, 125, 126, 139, 140, 141, 143,
- 144, 147, 148, 153, 565, 51, 117, 118, 564, 0,
- 0, 0, 54, 0, 0, 50, 0, 482, 0, 286,
- 0, 0, 0, 108, 0, 348, 347, 0, 0, 482,
- 286, 183, 176, 186, 171, 154, 155, 156, 114, 115,
- 0, 119, 121, 20, 120, 451, 456, 455, 601, 604,
- 593, 603, 0, 453, 0, 605, 602, 594, 577, 0,
- 0, 0, 0, 261, 273, 70, 265, 607, 431, 607,
- 569, 71, 69, 607, 255, 302, 68, 0, 254, 408,
- 67, 593, 0, 596, 18, 0, 0, 217, 0, 218,
- 205, 208, 298, 0, 0, 0, 593, 15, 593, 74,
- 14, 0, 593, 0, 598, 598, 245, 0, 0, 598,
- 567, 0, 0, 82, 0, 92, 99, 535, 465, 464,
- 466, 467, 0, 463, 462, 435, 440, 439, 442, 0,
- 0, 437, 444, 0, 446, 0, 458, 0, 469, 0,
- 473, 474, 49, 232, 233, 4, 594, 0, 0, 0,
- 0, 0, 0, 0, 542, 538, 537, 536, 539, 540,
- 544, 556, 511, 512, 560, 559, 555, 535, 0, 500,
- 0, 504, 509, 607, 514, 607, 534, 0, 541, 543,
- 546, 520, 0, 553, 520, 558, 520, 0, 518, 496,
- 500, 0, 396, 398, 0, 88, 0, 80, 77, 0,
+ 2, 0, 0, 1, 0, 0, 0, 0, 292, 0,
+ 0, 316, 319, 0, 0, 595, 336, 337, 338, 339,
+ 304, 270, 270, 487, 486, 488, 489, 597, 0, 10,
+ 0, 491, 490, 492, 478, 581, 480, 479, 482, 481,
+ 474, 475, 436, 437, 493, 494, 290, 0, 0, 0,
+ 0, 0, 0, 294, 609, 609, 88, 311, 0, 0,
+ 0, 0, 0, 0, 451, 0, 0, 0, 3, 595,
+ 6, 9, 27, 33, 538, 538, 49, 60, 59, 0,
+ 76, 0, 80, 90, 0, 54, 248, 0, 61, 309,
+ 283, 284, 434, 285, 286, 287, 432, 431, 463, 433,
+ 430, 485, 0, 288, 289, 270, 5, 8, 336, 337,
+ 304, 609, 412, 0, 113, 114, 290, 0, 0, 0,
+ 0, 538, 538, 116, 495, 340, 0, 485, 289, 0,
+ 332, 168, 178, 169, 165, 194, 195, 196, 197, 176,
+ 191, 184, 174, 173, 189, 172, 171, 167, 192, 166,
+ 179, 183, 185, 177, 170, 186, 193, 188, 187, 180,
+ 190, 175, 164, 182, 181, 163, 161, 162, 158, 159,
+ 160, 118, 120, 119, 153, 154, 131, 132, 133, 140,
+ 137, 139, 134, 135, 155, 156, 141, 142, 146, 149,
+ 150, 136, 138, 128, 129, 130, 143, 144, 145, 147,
+ 148, 151, 152, 157, 568, 55, 121, 122, 567, 0,
+ 0, 0, 58, 538, 538, 0, 0, 54, 0, 485,
+ 0, 289, 0, 0, 0, 112, 0, 351, 350, 0,
+ 0, 485, 289, 187, 180, 190, 175, 158, 159, 160,
+ 118, 119, 0, 123, 125, 20, 124, 454, 459, 458,
+ 603, 605, 595, 606, 0, 456, 0, 607, 604, 596,
+ 579, 0, 0, 0, 0, 265, 276, 74, 269, 609,
+ 434, 609, 572, 75, 73, 609, 259, 305, 72, 0,
+ 258, 411, 71, 595, 0, 18, 0, 0, 221, 0,
+ 222, 209, 212, 301, 0, 0, 0, 595, 15, 595,
+ 78, 14, 0, 595, 0, 600, 600, 249, 0, 0,
+ 600, 570, 0, 0, 86, 0, 96, 103, 538, 468,
+ 467, 469, 470, 0, 466, 465, 438, 443, 442, 445,
+ 0, 0, 440, 447, 0, 449, 0, 461, 0, 472,
+ 0, 476, 477, 53, 236, 237, 4, 596, 0, 0,
+ 0, 0, 0, 0, 0, 545, 541, 540, 539, 542,
+ 543, 547, 559, 514, 515, 563, 562, 558, 538, 0,
+ 503, 0, 507, 512, 609, 517, 609, 537, 0, 544,
+ 546, 549, 523, 0, 556, 523, 561, 523, 0, 521,
+ 499, 0, 0, 399, 401, 0, 92, 0, 84, 81,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 204, 207, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 590, 607,
- 589, 0, 592, 591, 0, 413, 411, 307, 432, 0,
- 0, 402, 61, 305, 326, 109, 110, 111, 473, 474,
- 500, 493, 324, 0, 607, 0, 0, 0, 588, 587,
- 52, 0, 607, 298, 339, 0, 338, 0, 0, 607,
- 0, 0, 0, 0, 0, 0, 298, 0, 607, 0,
- 321, 0, 122, 0, 0, 452, 454, 0, 0, 606,
- 571, 0, 274, 576, 268, 0, 271, 262, 0, 270,
- 0, 263, 0, 593, 0, 593, 607, 607, 256, 267,
- 593, 0, 304, 48, 0, 0, 0, 0, 0, 0,
- 17, 593, 296, 13, 594, 73, 292, 295, 299, 600,
- 246, 599, 600, 248, 300, 568, 98, 90, 0, 85,
- 0, 0, 607, 0, 535, 309, 393, 468, 0, 0,
- 443, 449, 436, 438, 445, 447, 459, 470, 0, 0,
- 7, 21, 22, 23, 24, 25, 46, 47, 502, 548,
- 0, 593, 593, 520, 0, 0, 503, 0, 516, 563,
- 513, 0, 517, 501, 0, 527, 549, 0, 530, 557,
- 0, 532, 561, 0, 0, 607, 0, 28, 30, 0,
- 31, 593, 0, 78, 89, 44, 34, 42, 0, 249,
- 194, 29, 0, 286, 222, 227, 228, 229, 224, 226,
- 236, 237, 230, 231, 203, 206, 234, 235, 32, 214,
- 595, 223, 225, 219, 220, 221, 209, 210, 211, 212,
- 213, 580, 585, 581, 586, 407, 266, 405, 0, 607,
- 580, 582, 581, 583, 406, 266, 580, 581, 266, 607,
- 607, 35, 249, 195, 41, 202, 59, 62, 0, 0,
- 0, 109, 110, 113, 0, 0, 607, 0, 593, 0,
- 290, 607, 607, 419, 607, 340, 584, 297, 0, 580,
- 581, 607, 342, 314, 341, 317, 584, 297, 0, 580,
- 581, 0, 0, 0, 0, 273, 0, 320, 572, 574,
- 573, 0, 0, 275, 269, 607, 575, 570, 253, 251,
- 257, 258, 260, 303, 597, 19, 0, 26, 201, 75,
- 16, 593, 598, 91, 83, 95, 97, 0, 94, 96,
- 595, 0, 461, 0, 450, 215, 216, 542, 356, 593,
- 349, 499, 497, 0, 240, 331, 0, 510, 607, 562,
- 519, 547, 520, 520, 520, 554, 520, 542, 520, 242,
- 332, 384, 382, 0, 381, 380, 279, 0, 87, 81,
- 0, 0, 0, 0, 0, 607, 0, 0, 0, 0,
- 404, 65, 410, 258, 0, 0, 403, 63, 399, 58,
- 0, 0, 607, 327, 0, 0, 410, 330, 566, 53,
- 420, 421, 607, 422, 0, 607, 345, 0, 0, 343,
- 0, 0, 410, 0, 0, 0, 0, 0, 410, 0,
- 123, 457, 319, 0, 0, 272, 276, 264, 593, 607,
- 11, 293, 247, 93, 0, 386, 0, 0, 310, 441,
- 357, 354, 545, 0, 593, 0, 515, 0, 523, 0,
- 525, 0, 531, 0, 528, 533, 0, 379, 595, 595,
- 506, 507, 607, 607, 364, 0, 551, 364, 364, 362,
- 0, 0, 277, 79, 43, 250, 580, 581, 0, 580,
- 581, 0, 0, 40, 199, 39, 200, 66, 0, 37,
- 197, 38, 198, 64, 400, 401, 0, 0, 0, 0,
- 494, 325, 0, 0, 424, 346, 0, 12, 426, 0,
- 311, 0, 312, 0, 0, 322, 275, 607, 252, 259,
- 392, 0, 0, 0, 0, 0, 352, 498, 241, 520,
- 520, 520, 520, 243, 0, 0, 0, 505, 0, 360,
- 361, 364, 372, 550, 0, 375, 0, 377, 397, 278,
- 410, 239, 238, 36, 196, 414, 412, 0, 0, 0,
- 423, 0, 100, 107, 0, 425, 0, 315, 318, 0,
- 416, 417, 415, 390, 595, 388, 391, 395, 394, 358,
- 355, 0, 350, 524, 0, 521, 526, 529, 385, 383,
- 298, 0, 508, 607, 0, 363, 370, 364, 364, 364,
- 552, 364, 364, 60, 328, 106, 0, 607, 0, 607,
- 607, 0, 0, 387, 0, 353, 0, 520, 584, 297,
- 359, 0, 367, 0, 369, 0, 376, 0, 373, 378,
- 103, 105, 0, 580, 581, 418, 344, 323, 389, 351,
- 522, 364, 364, 364, 364, 101, 368, 0, 365, 371,
- 374, 364, 366
+ 0, 208, 211, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 592,
+ 609, 591, 0, 594, 593, 0, 416, 414, 310, 435,
+ 0, 0, 405, 65, 308, 329, 113, 114, 115, 476,
+ 477, 503, 496, 327, 0, 609, 0, 0, 0, 590,
+ 589, 56, 0, 609, 301, 0, 0, 342, 0, 341,
+ 0, 0, 609, 0, 0, 0, 0, 0, 0, 301,
+ 0, 609, 0, 324, 0, 126, 0, 0, 455, 457,
+ 0, 0, 608, 576, 277, 578, 272, 0, 597, 266,
+ 0, 274, 0, 267, 0, 595, 0, 595, 609, 609,
+ 260, 271, 595, 0, 307, 52, 598, 0, 0, 0,
+ 0, 0, 0, 17, 595, 299, 13, 596, 77, 295,
+ 298, 302, 602, 250, 601, 602, 252, 303, 571, 102,
+ 94, 0, 89, 0, 0, 609, 0, 538, 312, 396,
+ 471, 0, 0, 446, 452, 439, 441, 448, 450, 462,
+ 473, 0, 0, 7, 21, 22, 23, 24, 25, 50,
+ 51, 505, 551, 0, 595, 595, 523, 0, 0, 506,
+ 0, 519, 566, 516, 0, 520, 504, 0, 530, 552,
+ 0, 533, 560, 0, 535, 564, 0, 0, 609, 0,
+ 28, 30, 0, 31, 595, 0, 82, 93, 48, 34,
+ 46, 0, 253, 198, 29, 0, 289, 226, 231, 232,
+ 233, 228, 230, 240, 241, 234, 235, 207, 210, 238,
+ 239, 32, 218, 597, 227, 229, 223, 224, 225, 213,
+ 214, 215, 216, 217, 582, 587, 583, 588, 410, 270,
+ 408, 0, 609, 582, 584, 583, 585, 409, 270, 582,
+ 583, 270, 609, 609, 35, 253, 199, 45, 206, 63,
+ 66, 0, 0, 0, 113, 114, 117, 0, 0, 609,
+ 0, 595, 0, 293, 609, 609, 422, 0, 0, 609,
+ 343, 586, 300, 0, 582, 583, 609, 345, 317, 344,
+ 320, 586, 300, 0, 582, 583, 0, 0, 0, 0,
+ 276, 0, 323, 575, 574, 275, 0, 278, 273, 609,
+ 577, 573, 257, 255, 261, 262, 264, 306, 599, 19,
+ 0, 26, 205, 79, 16, 595, 600, 95, 87, 99,
+ 101, 0, 98, 100, 597, 0, 464, 0, 453, 219,
+ 220, 545, 359, 595, 352, 502, 500, 0, 41, 244,
+ 334, 0, 513, 609, 565, 522, 550, 523, 523, 523,
+ 557, 523, 545, 523, 43, 246, 335, 387, 385, 0,
+ 384, 383, 282, 0, 91, 85, 0, 0, 0, 0,
+ 0, 609, 0, 0, 0, 0, 407, 69, 413, 262,
+ 0, 0, 406, 67, 402, 62, 0, 0, 609, 330,
+ 0, 0, 413, 333, 569, 57, 423, 424, 609, 425,
+ 0, 609, 348, 0, 0, 346, 0, 0, 413, 0,
+ 0, 0, 0, 0, 413, 0, 127, 460, 322, 0,
+ 0, 279, 268, 595, 609, 11, 296, 251, 97, 0,
+ 389, 0, 0, 313, 444, 360, 357, 548, 0, 595,
+ 0, 0, 518, 0, 526, 0, 528, 0, 534, 0,
+ 531, 536, 0, 0, 382, 597, 597, 509, 510, 609,
+ 609, 367, 0, 554, 367, 367, 365, 0, 0, 280,
+ 83, 47, 254, 582, 583, 0, 582, 583, 0, 0,
+ 40, 203, 39, 204, 70, 0, 37, 201, 38, 202,
+ 68, 403, 404, 0, 0, 0, 0, 497, 328, 0,
+ 0, 427, 349, 0, 12, 429, 0, 314, 0, 315,
+ 0, 0, 325, 278, 609, 256, 263, 395, 0, 0,
+ 0, 0, 0, 355, 501, 42, 245, 523, 523, 523,
+ 523, 44, 247, 0, 0, 0, 508, 0, 363, 364,
+ 367, 375, 553, 0, 378, 0, 380, 400, 281, 413,
+ 243, 242, 36, 200, 417, 415, 0, 0, 0, 426,
+ 0, 104, 111, 0, 428, 0, 318, 321, 0, 419,
+ 420, 418, 393, 597, 391, 394, 398, 397, 361, 358,
+ 0, 353, 527, 0, 524, 529, 532, 388, 386, 301,
+ 0, 511, 609, 0, 366, 373, 367, 367, 367, 555,
+ 367, 367, 64, 331, 110, 0, 609, 0, 609, 609,
+ 0, 0, 390, 0, 356, 0, 523, 586, 300, 362,
+ 0, 370, 0, 372, 0, 379, 0, 376, 381, 107,
+ 109, 0, 582, 583, 421, 347, 326, 392, 354, 525,
+ 367, 367, 367, 367, 105, 371, 0, 368, 374, 377,
+ 367, 369
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -848, -848, -848, 382, -848, 28, -848, -255, 267, -848,
- 120, -848, -31, -208, 229, 64, 100, -848, 83, -46,
- -848, -605, -848, 30, 886, -183, -19, -66, -274, -472,
- -45, 1894, -87, 898, 20, 14, -848, -848, 15, -848,
- 1140, -848, 707, 65, -55, -403, 72, 26, -848, -298,
- -233, 280, 375, -340, 129, -848, -848, -848, -848, -848,
- -848, -848, -848, -848, -848, -848, -848, -848, -848, -848,
- -848, 8, -216, -467, -115, -563, -848, -848, -848, 136,
- 91, -848, -565, -848, -848, -424, -848, -110, -848, -848,
- 114, -848, -848, -848, -86, -848, -848, -469, -848, -104,
- -848, -848, -848, -848, -848, -15, 21, -178, -848, -848,
- -848, -848, -405, -273, -848, 669, -848, -848, -848, 16,
- -848, -848, -848, 1698, 2055, 921, 1364, -848, -848, -848,
- 405, 74, -668, 354, -16, -848, -848, -848, 73, -20,
- -195, -246, -815, -685, -526, -848, 135, -735, -520, -847,
- -11, -505, -848, -439, -848, 262, -318, -848, -848, -848,
- 45, 667, -422, 609, -265, -848, -848, -53, -848, 34,
- -18, 366, -264, 601, -21, -62, -2
+ -862, -862, -862, 419, -862, 28, -862, -277, 32, -862,
+ 74, -862, -195, -390, 422, 1715, 1901, -862, 1, -58,
+ -862, -635, -862, 14, 927, -207, -30, -53, -275, -506,
+ -12, 985, -38, 933, 13, -21, -862, -862, 19, -862,
+ 1204, -862, 149, 41, -202, -374, 66, 5, -862, -392,
+ -262, -131, 161, -361, 35, -862, -862, -862, -862, -862,
+ -862, -862, -862, -862, -862, -862, -862, -862, -862, -862,
+ -862, 8, -179, -442, -88, -590, -862, -862, -862, 164,
+ 85, -862, -558, -862, -862, -218, -862, -86, -862, -862,
+ 141, -862, -862, -862, -85, -862, -862, -472, -862, -77,
+ -862, -862, -862, -862, -862, 38, 71, -210, -862, -862,
+ -862, -862, -862, -245, -862, 698, -862, -862, -862, 31,
+ -862, -862, -862, 2358, 2761, 946, 2172, -862, -862, 0,
+ 590, -6, 76, 397, 24, -862, -862, -862, 329, -445,
+ -14, -229, -842, -706, -60, -862, 227, -711, -525, -861,
+ -3, -517, -862, 75, -862, 202, -308, -862, -862, -862,
+ 102, -438, 612, -157, -862, -862, -82, -862, 34, -26,
+ 344, -249, -180, -281, -67, -2
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 2, 68, 69, 70, 285, 461, 462, 296,
- 297, 514, 72, 606, 73, 74, 75, 679, 213, 76,
- 77, 667, 802, 78, 79, 298, 80, 81, 82, 539,
- 83, 214, 123, 124, 241, 242, 243, 702, 644, 207,
- 85, 303, 610, 645, 275, 504, 505, 276, 277, 266,
- 497, 532, 649, 600, 86, 210, 301, 731, 302, 317,
- 741, 221, 826, 222, 827, 701, 979, 670, 668, 909,
- 456, 288, 465, 693, 818, 819, 228, 749, 934, 1005,
- 952, 868, 773, 774, 869, 844, 984, 985, 545, 848,
- 393, 595, 88, 89, 443, 660, 659, 488, 982, 682,
- 812, 913, 917, 90, 91, 92, 330, 331, 549, 93,
- 94, 95, 550, 251, 252, 253, 483, 96, 97, 98,
- 324, 99, 100, 217, 218, 103, 219, 452, 669, 368,
- 450, 370, 371, 372, 871, 872, 373, 374, 375, 760,
- 585, 377, 378, 379, 380, 570, 381, 382, 383, 876,
- 877, 384, 385, 386, 387, 388, 578, 209, 457, 308,
- 507, 491, 270, 129, 674, 647, 460, 455, 434, 511,
- 845, 512, 530, 255, 256, 257, 300
+ -1, 1, 2, 68, 69, 70, 286, 462, 463, 297,
+ 298, 517, 72, 609, 73, 213, 214, 682, 215, 76,
+ 77, 670, 808, 78, 79, 299, 80, 81, 82, 542,
+ 83, 216, 123, 124, 243, 244, 245, 707, 647, 207,
+ 85, 304, 613, 648, 277, 506, 507, 278, 279, 268,
+ 499, 535, 652, 603, 86, 210, 302, 735, 303, 318,
+ 745, 223, 832, 224, 833, 706, 988, 673, 671, 916,
+ 457, 289, 468, 698, 824, 825, 230, 753, 941, 1014,
+ 961, 875, 779, 780, 876, 849, 993, 994, 548, 853,
+ 394, 598, 88, 89, 444, 663, 662, 491, 991, 685,
+ 818, 920, 924, 90, 91, 92, 331, 332, 552, 93,
+ 94, 95, 553, 253, 254, 255, 486, 96, 97, 98,
+ 325, 99, 100, 219, 220, 103, 221, 453, 672, 369,
+ 370, 371, 372, 373, 878, 879, 374, 375, 376, 377,
+ 588, 378, 379, 380, 381, 573, 382, 383, 384, 883,
+ 884, 385, 386, 387, 388, 389, 581, 209, 458, 309,
+ 509, 272, 129, 677, 650, 461, 456, 435, 513, 850,
+ 514, 533, 257, 258, 259, 301
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -2458,549 +2477,572 @@ static const yytype_int16 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_int16 yytable[] =
{
- 106, 268, 268, 437, 473, 268, 283, 346, 695, 282,
- 87, 313, 87, 126, 126, 704, 398, 216, 216, 278,
- 342, 227, 206, 216, 216, 216, 648, 205, 216, 206,
- 244, 447, 107, 299, 431, 433, 501, 875, 538, 268,
- 268, 533, 284, 206, 244, 535, 263, 263, 280, 254,
- 263, 675, 306, 310, 376, 376, 551, 582, 761, 611,
- 87, 269, 269, 851, 314, 269, 688, 765, 734, 121,
- 121, 546, 389, 206, 216, 698, 438, 121, 323, 762,
- 717, 333, 335, 337, 339, 708, 274, 279, 265, 271,
- 314, -103, 272, 220, 800, 801, 464, 435, 250, 305,
- 309, 376, 376, 345, 870, 122, 122, 1010, 435, 278,
- 717, 521, 891, 122, -484, 575, 986, 771, 846, 815,
- 121, 572, 71, -100, 71, 216, 432, 87, 825, 756,
- 779, 442, -107, 692, 125, 125, 594, 3, -480, 737,
- -105, 428, 125, -481, -480, 763, 121, -106, 766, 391,
- 364, -102, 553, -104, 1022, 553, 122, 553, 392, 553,
- 249, 553, 646, 470, 772, -101, 655, -100, 472, 658,
- 441, -484, -108, -100, 479, 365, 274, 279, 892, 362,
- 363, 364, 122, 430, 1010, 125, 897, 286, -92, 588,
- 676, 591, 903, -483, 441, 245, 391, -107, 246, 247,
- 714, 677, 847, 646, 714, 655, 365, 986, -95, 436,
- -580, 125, 568, 601, 676, 273, 875, 551, 87, 875,
- 436, 245, 496, 292, 246, 247, 248, 761, 249, 216,
- 216, 661, 664, 394, 524, 518, -485, 908, 212, 212,
- -92, 281, 531, 531, 212, 249, 537, 531, 762, -99,
- -483, 992, 248, 676, 249, 206, -486, -97, 268, -581,
- 323, 543, 268, 395, -98, 499, 538, 499, -94, -488,
- -96, 508, -487, 399, 501, 299, 569, 744, 676, 439,
- 870, 216, -93, 870, 484, 216, 870, -489, 870, 216,
- 216, -73, 440, -485, 87, 519, 875, 376, 740, 451,
- 717, 87, 87, 263, 474, 475, 835, 263, 883, 87,
- 519, 440, -87, -486, 763, -475, 352, 353, -479, 295,
- 314, -107, 269, 458, -106, 273, -488, 761, 538, -487,
- 523, 340, 341, 878, 445, 761, 870, 765, 446, -106,
- -107, 811, -99, 548, -489, -98, 444, 376, 597, 509,
- 794, 281, 603, 607, 87, 216, 216, 216, 216, 87,
- 216, 216, 925, 870, 980, 870, 673, 870, 605, 870,
- 553, 579, -475, 579, 560, -479, 121, 299, 87, -102,
- 459, 42, 888, 814, 43, 487, 295, 823, 824, 870,
- 921, 267, 267, 607, 607, 267, 463, 794, 467, 87,
- -94, 471, 216, 476, 87, 314, 480, 612, 605, 605,
- 448, 449, 122, 520, 268, 805, -102, -104, 940, -101,
- 482, 526, 487, 714, 714, 761, -102, 508, 59, 304,
- 561, 562, 563, 564, 496, 744, 490, 216, 551, 268,
- 856, 125, 817, 814, 944, 945, 653, 612, 612, 653,
- 212, 212, 508, 485, 268, 515, 246, 247, 981, 263,
- 683, 121, 216, 268, 87, 216, 71, 508, 842, 415,
- 653, 565, 733, 87, 537, 283, 508, 216, 711, 369,
- 390, 87, 837, 268, 263, 653, 216, 268, 522, -595,
- 834, 87, -595, -595, 653, 714, 654, 122, 761, 263,
- 528, -72, 573, 534, 499, 499, 538, 717, 263, 761,
- 510, 513, 1008, 106, 268, 1011, 536, 268, 880, 646,
- 654, 655, 249, 87, 376, 540, 125, 268, 725, 206,
- 244, 558, 87, 653, 332, 654, 537, 326, 327, 720,
- 508, 795, 559, 715, 654, 906, 314, 498, 314, 502,
- 216, 577, 574, 516, 949, 950, 898, 87, 653, 786,
- 554, 295, 744, 326, 327, -495, 415, 858, 860, 862,
- -104, 864, 263, 865, 732, 580, 212, 212, 212, 212,
- 893, 566, 567, 654, 529, -101, 899, 901, 581, 328,
- 329, 932, 1052, 775, 422, 423, 424, 425, 426, 795,
- 796, 898, 121, 798, 121, -297, 837, 589, 654, 283,
- 314, 105, 787, 105, 1042, 328, 329, 584, 105, 105,
- -297, 796, 587, 590, 105, 105, 105, 592, -104, 105,
- -101, 714, 593, 245, 604, 71, 246, 247, 122, 628,
- 122, 666, 680, 681, 730, 685, 547, 499, 506, -96,
- 758, -93, 267, 278, 968, -297, 278, 775, 775, -581,
- 707, 105, -297, 295, 525, 719, 121, 125, 527, 125,
- 531, 724, 791, 727, 278, 105, 755, 216, 87, 813,
- 816, 797, 816, -87, 799, 1030, 678, 753, 770, 816,
- 963, 780, 781, 782, 206, 792, 464, 974, 806, 809,
- 807, 814, 122, 976, 822, 750, 268, 268, 828, 216,
- 831, 790, 904, 499, 537, -577, 830, 206, 244, 283,
- 274, 832, 764, 274, 840, 768, 105, 843, 105, 249,
- 849, 125, 684, 568, 853, 857, 607, 859, 861, 790,
- 691, 274, 607, 895, 993, 995, 996, 997, 607, 607,
- 703, 605, 804, 676, 863, 911, 579, 605, 912, 916,
- 930, -337, -102, 605, 605, 920, 839, 427, 922, 599,
- 268, 931, 958, 935, 599, 415, -337, 948, 268, -475,
- 951, 87, 428, 508, 829, 954, 721, 722, 314, 87,
- 612, 956, 960, 216, -475, 245, 612, 216, 246, 247,
- 775, 653, 612, 612, 965, 424, 425, 426, 87, 87,
- 914, -337, 977, 918, 466, 263, 743, 429, -337, 105,
- -104, 466, 87, 966, 430, 216, 248, -577, 249, -475,
- 105, 105, 1050, -577, 87, 87, -475, 499, 839, 759,
- 978, 987, 87, 759, 121, 873, 994, 283, 283, 988,
- 998, 654, 607, 999, 87, 87, 1000, 1013, 489, 1014,
- 1015, -102, 706, 1024, -102, -102, 1047, 605, 1026, 718,
- 579, 579, 334, 1031, 326, 327, 723, 1033, 947, 777,
- 122, 1035, 105, 953, 1037, -580, 105, 729, -581, 1055,
- 105, 105, -102, 1057, -102, 105, 453, 726, 212, 225,
- 919, 884, 105, 105, 130, 1046, 612, 874, 867, 125,
- 105, 428, 1048, 905, 268, 1045, 87, 87, 1018, -104,
- 971, 486, -104, -104, 87, 816, 328, 329, 208, 793,
- 212, 757, 1002, 468, 121, 500, 0, 751, 752, 121,
- 1007, 0, 555, -578, 326, 327, 454, 489, 428, 0,
- -104, 0, -104, 430, 0, 105, 105, 105, 105, 105,
- 105, 105, 105, 283, 0, 0, 1023, 778, 955, 957,
- 122, 0, 0, -287, 0, 122, 121, 0, 583, 105,
- 0, 0, 87, 469, 87, 0, 833, 87, -287, 0,
- 430, 0, 939, 0, 941, 502, 328, 329, 942, 125,
- 105, 579, 268, 105, 125, 105, -294, -479, 105, -294,
- -294, 0, 122, 0, 0, 508, 0, 683, 816, 0,
- 0, 1003, -479, -287, 873, 216, 0, 873, 0, 873,
- -287, 0, 0, 653, 879, 0, -294, -294, 105, -294,
- 0, 125, 1006, 0, 808, 0, 212, 263, 105, 105,
- 0, 0, 0, 352, 353, -578, 599, -479, 0, -584,
- 0, -578, 0, 105, -479, 105, 105, 0, 907, 989,
- 990, 0, 0, 0, 105, 694, 694, 873, 105, 0,
- 0, 915, 105, 654, -580, 0, 0, 105, 0, 1009,
- 0, 1012, 105, 923, 924, 0, 0, 841, 1032, 1034,
- 1036, 927, 1038, 1039, 873, 0, 873, 0, 873, 0,
- 873, 0, 0, 0, 933, 852, 0, 0, -581, 929,
- 0, -410, 0, -584, 105, 489, 1025, 0, 0, 1027,
- 873, 245, 489, 105, 246, 247, 245, 0, -584, 246,
- 247, 0, 1056, 1058, 1059, 1060, 663, 665, -580, 215,
- 215, 105, 1062, 0, 0, 215, 264, 264, 105, 0,
- 264, 1049, 248, -580, 249, 0, 1051, 248, 1053, 249,
- 0, -584, 1054, -584, 0, 967, 0, -580, 663, 665,
- -584, 0, -581, 975, 0, -410, 0, 287, 289, 290,
- 291, 0, 1061, 0, 264, 307, -580, -581, -580, 477,
- -410, 0, -580, 0, 928, -580, 343, 344, 517, 0,
- 759, 0, 0, 879, 428, 0, 879, 0, 879, 0,
- 937, 0, 0, 428, 0, 0, 728, 0, 0, 0,
- -581, 0, -581, -410, 0, -410, -581, 0, 0, -581,
- 0, 1019, -410, 1020, 0, 0, 1021, 0, 541, 478,
- 0, 641, 642, 0, 0, 643, 430, 215, 469, 325,
- 326, 327, 0, 428, 0, 430, 879, 0, 0, 803,
- 174, 175, 176, 177, 178, 179, 180, 181, 105, 105,
- 182, 183, 0, 0, 0, 0, 184, 185, 186, 187,
- 0, 0, 0, 879, 0, 879, 0, 879, 542, 879,
- 188, 189, 190, -482, 0, 430, -286, 466, -298, 0,
- 105, 0, 328, 329, 0, 0, 0, 0, -482, 879,
- 0, -286, 0, -298, 191, 192, 193, 194, 195, 196,
- 197, 198, 199, 200, 0, 201, 202, 747, 0, 355,
- 356, 357, 358, 203, 273, 0, 747, 0, 355, 356,
- 357, 358, 0, -482, 0, 359, -286, 784, -298, 0,
- -482, 215, 215, -286, 359, -298, 104, 0, 104, 128,
- 128, 983, 428, 355, 356, 357, 358, 230, 0, 0,
- 0, 0, 105, 347, 348, 349, 350, 351, 0, 359,
- 105, 105, 0, 0, 105, 0, 0, 105, 105, 492,
- 493, 494, 343, 105, 105, 910, 0, 785, 0, 105,
- 105, 0, 1001, 264, 430, 0, 104, 264, 0, 0,
- 316, 215, 215, 105, 0, 1016, 105, 428, 850, 354,
- 694, 355, 356, 357, 358, 105, 105, 991, 0, 0,
- 428, 0, 0, 105, 0, 0, 316, 359, 0, 0,
- 336, 326, 327, 0, 0, 105, 105, 0, 0, 338,
- 326, 327, 454, 571, 0, 0, 0, 245, 0, 430,
- 246, 247, 360, 0, 0, 1017, 0, 0, 361, 362,
- 363, 364, 430, 104, 547, 326, 327, 215, 215, 215,
- 215, 0, 215, 215, 496, 894, 896, 0, 248, 0,
- 249, 900, 902, 328, 329, 0, 365, 105, 0, 366,
- 0, 576, 328, 329, 466, 0, 0, 105, 105, 0,
- 466, 0, 586, 0, 0, 105, 0, 894, 896, 0,
- 900, 902, 0, 0, 598, 0, 0, 328, 329, 609,
- 614, 615, 616, 617, 618, 619, 620, 621, 622, 623,
- 624, 625, 626, 627, 0, 629, 630, 631, 632, 633,
- 634, 635, 636, 637, 638, 639, 640, 0, 0, 264,
- 552, 326, 327, 0, 104, 0, 556, 326, 327, 662,
- 662, 0, 0, 105, 0, 105, 0, 0, 105, 0,
- 0, 557, 326, 327, 264, 0, 767, 215, 355, 356,
- 357, 358, 742, 326, 327, 964, 0, 662, 0, 264,
- 0, 662, 662, 0, 359, 0, 0, 0, 264, 412,
- 413, 0, 0, 328, 329, 0, 105, 705, 964, 328,
- 329, 709, 415, 0, 0, 710, 0, 0, 713, 360,
- 716, 0, 307, 291, 328, 329, 362, 363, 364, 0,
- 104, 0, 0, 0, 0, 328, 329, 104, 104, 662,
- 422, 423, 424, 425, 426, 104, 0, 0, 0, 713,
- 0, 0, 307, 365, 0, 0, 316, 0, 0, 0,
- 0, 0, 264, 0, 0, 0, 0, 0, 354, 0,
- 355, 356, 357, 358, 0, 0, 0, 0, 745, 746,
- 101, 0, 101, 127, 127, 127, 359, 0, 0, 0,
- 104, 229, 0, 0, 754, 104, 0, 0, 0, 0,
- 0, 0, 0, 747, 0, 355, 356, 357, 358, 0,
- 0, 360, 0, 769, 104, 0, 776, 361, 362, 363,
- 364, 359, 0, 0, 0, 0, 0, 0, 0, 0,
- 101, 0, 0, 0, 315, 104, 0, 0, -607, 0,
- 104, 316, 0, 613, 0, 365, 360, 0, 366, 0,
- 0, 0, 748, 354, 0, 355, 356, 357, 358, 0,
- 315, 367, 0, 354, 0, 355, 356, 357, 358, 0,
- 0, 359, 0, 354, 0, 355, 356, 357, 358, 0,
- 0, 359, 0, 613, 613, 0, 0, 0, 0, 215,
- 0, 359, 0, 0, 0, 0, 360, 101, 0, 0,
- 104, 810, 361, 362, 363, 364, 360, 0, 0, 104,
- 0, 0, 361, 362, 363, 364, 360, 104, 0, 0,
- 0, 215, 361, 362, 363, 364, 0, 104, 0, 0,
- 365, 0, 836, 366, 747, 0, 355, 356, 357, 358,
- 365, 713, 307, 366, 0, 0, 367, 0, 0, 0,
- 365, 0, 359, 366, 0, 0, 544, 0, 0, 104,
- 0, 0, 0, 0, 1004, 0, 0, 747, 104, 355,
- 356, 357, 358, 0, 0, 0, 84, 360, 84, 0,
- 0, 0, 316, 936, 316, 359, 0, 226, 101, 0,
- 0, 0, 0, 104, 0, 0, 0, 882, 0, 0,
- 0, 0, 662, 885, 0, 264, 0, 0, 662, 662,
- 360, 0, 0, 713, 662, 662, 0, 354, 0, 355,
- 356, 357, 358, 0, 0, 0, 84, 0, 0, 0,
- 0, 0, 0, 0, 0, 359, 0, 215, 0, 0,
- 662, 662, 0, 662, 662, 0, 316, 0, 0, 0,
- 0, 854, 0, 926, 0, 0, 0, 0, 291, 0,
- 360, 0, 0, 0, 101, 0, 361, 362, 363, 364,
- 0, 101, 101, 0, 0, 938, 0, 0, 0, 101,
- 0, 0, 0, 0, 0, 0, 943, 0, 0, 0,
- 315, 412, 413, 84, 365, 0, 0, 366, 0, 0,
- 0, 959, 0, 0, 415, 0, 0, 0, 0, 0,
- 0, 961, 962, 0, 104, 0, 0, 0, 662, 0,
- 0, 0, 783, 0, 101, 0, 0, 0, 0, 101,
- 0, 421, 422, 423, 424, 425, 426, 102, 0, 102,
- 0, 662, 0, 0, 0, 0, 0, 0, 101, 307,
- 400, 401, 402, 403, 404, 405, 406, 407, 408, 409,
- 410, 411, 0, 0, 0, 0, 412, 413, 0, 101,
- 0, 0, 0, 0, 101, 315, 0, 0, 0, 415,
- 0, 0, 0, 0, 84, 0, 0, 102, 0, 0,
+ 106, 284, 347, 516, 438, 432, 434, 285, 343, 503,
+ 87, 222, 87, 126, 126, 709, 252, 218, 218, 280,
+ 205, 229, 300, 218, 218, 218, 206, 282, 218, 399,
+ 265, 265, 107, 206, 265, 469, 700, 738, 541, 614,
+ 125, 125, 469, 476, 314, 246, 856, 206, 125, 256,
+ 664, 667, 307, 311, 270, 270, 651, 536, 270, 246,
+ 87, 538, 276, 281, 315, 770, 721, 882, 585, 392,
+ 767, 324, 390, 390, 218, 391, 71, 206, 71, 492,
+ 448, 678, 267, 273, 296, 554, 274, -107, 524, 549,
+ 315, 125, 270, 270, 578, 821, 995, 721, 693, 785,
+ 697, 851, 1019, 346, 806, 807, 831, 703, 718, 280,
+ 443, -104, 718, 3, 436, 597, 392, 125, 271, 271,
+ 571, 556, 271, 436, 556, 218, 556, 87, 556, 439,
+ 556, 334, 336, 338, 340, 777, 473, -109, 500, 575,
+ 504, -111, 765, 761, -487, 765, 442, 482, 765, -110,
+ 365, 296, 276, 281, 283, -106, 306, 310, 287, -108,
+ -105, 333, 904, 42, 327, 328, 43, 492, 910, 293,
+ 442, 741, -340, -483, 532, 366, -77, 269, 269, 1019,
+ 680, 269, 778, 393, 572, 852, 395, -340, 247, 995,
+ 604, 248, 249, 363, 364, 365, -486, -91, 586, 446,
+ -488, -487, -104, 447, -99, 608, -582, 521, 392, 396,
+ 59, 390, 390, 465, 466, 305, 329, 330, 87, 250,
+ 366, 251, -340, -96, 477, 478, 437, 433, -96, -340,
+ 527, 218, 218, 546, 440, 437, 400, 1001, 534, 534,
+ 767, 275, 429, 534, 428, 608, 608, 503, -489, 882,
+ 915, 275, 882, -486, -101, 324, -583, -488, -103, 429,
+ 540, 206, 820, -491, 490, 300, -102, 501, 541, 501,
+ 452, 649, -98, 510, 898, 658, -100, -97, 661, 464,
+ 890, 470, -490, 218, 431, 474, 487, 218, 721, 265,
+ 479, 218, 218, 265, 430, 87, 454, 699, 699, 679,
+ 483, 431, 87, 87, 485, -489, -492, 490, 748, -478,
+ 87, 429, 765, 270, 649, 502, 658, 270, 744, 519,
+ -491, 315, 498, 817, 518, 679, 416, 296, -482, 882,
+ 541, 526, 247, 718, 718, 248, 249, 600, 770, -490,
+ 899, 556, 610, 525, 989, 511, 455, 492, 125, 564,
+ 565, 566, 567, 431, 492, 87, 218, 218, 218, 218,
+ 87, 218, 218, -492, 679, 251, -478, 300, 523, 441,
+ 459, 591, 582, 594, 582, 563, 529, 725, 726, 87,
+ 522, 271, 610, 610, -484, -482, 606, 557, -76, 679,
+ 327, 328, 531, 932, 551, 537, 811, 539, -111, 543,
+ 87, 353, 354, 218, 900, 87, 315, 718, 615, -110,
+ 906, 908, -483, -112, 561, 416, 676, 895, 765, -103,
+ 765, 71, 765, 475, 765, 562, 568, 460, 510, 296,
+ -102, 212, 212, 125, 516, 800, 508, 212, 218, 577,
+ 269, -104, 329, 330, 265, 425, 426, 427, 615, 615,
+ 580, 656, -111, 510, 656, 862, 802, 842, -498, 804,
+ 583, 686, 990, 218, -106, 87, 218, 471, 270, 265,
+ 510, 783, 715, 657, 522, 656, 87, 802, 584, 510,
+ 218, 587, 429, 590, 87, -98, 265, 847, 737, 218,
+ 540, 809, 656, 270, 87, 265, 729, 657, 721, 441,
+ 689, 656, 887, -110, 592, 801, 501, 501, 696, 593,
+ 270, 541, 516, 595, 657, 972, 106, 472, 708, 270,
+ 596, 799, 607, 657, 431, 905, 87, 766, -111, 913,
+ 631, 469, 840, 792, -108, 87, 206, 669, 270, 445,
+ 656, 724, 270, 510, 718, 341, 342, 683, 246, 315,
+ 829, 315, 540, 218, -105, -100, 602, 830, 765, 265,
+ 87, 602, 657, 684, 335, 656, 327, 328, 928, 516,
+ 270, 958, 959, 270, 939, -97, 125, 687, 125, -106,
+ 839, 688, 842, 270, 747, 218, -108, 657, 504, 666,
+ 668, 758, 71, 608, 690, 576, 781, -105, 550, 608,
+ 712, 734, 719, 731, 218, 608, 608, 793, 247, 800,
+ 774, 248, 249, 315, 105, 723, 105, 728, 329, 330,
+ 801, 105, 105, 666, 668, 449, 450, 105, 105, 105,
+ 917, -91, 105, 649, 736, 658, 823, 820, -106, 977,
+ 125, 251, 757, 528, -579, 212, 212, 530, 760, -108,
+ 501, 711, 1051, 776, 797, 699, 280, 953, 954, 280,
+ 781, 781, 768, 803, 105, 771, 805, 905, 786, 534,
+ 787, 732, 488, 810, 788, 248, 249, 280, 105, 798,
+ 218, 87, 819, 822, 812, 247, 836, 822, 248, 249,
+ 796, 326, 327, 328, 822, 815, -105, 766, 813, 276,
+ 820, 206, 276, 828, 1039, 512, 515, 835, -478, 834,
+ 608, 451, 451, 936, 218, 837, 838, 501, 796, 911,
+ 276, 845, 848, -478, -300, 558, 206, 327, 328, 105,
+ 610, 105, 854, 540, -290, 480, 610, 902, 246, -300,
+ 469, 983, 610, 610, 329, 330, 469, 985, 858, -290,
+ 429, 516, 860, 864, 866, 868, -579, 870, -478, 871,
+ 571, 582, -579, 270, 270, -478, 863, 865, 520, 867,
+ 212, 212, 212, 212, -300, 569, 570, 869, -583, 329,
+ 330, -300, 764, 429, -290, 481, 764, 87, 872, 510,
+ 467, -290, 431, 918, 315, 87, 615, 919, 766, 218,
+ 754, 923, 615, 218, 927, 265, 781, 766, 615, 615,
+ 929, 656, 937, 942, 87, 87, 921, 769, 472, 925,
+ 773, 125, 105, 957, 926, 431, 467, 844, 87, 270,
+ 960, 218, 768, 657, 963, 105, 105, 270, 965, 914,
+ 87, 87, 501, 967, 974, 602, 969, 610, 87, 722,
+ 975, 986, 922, 885, 877, 987, 727, 996, 544, 87,
+ 87, 891, 997, 1003, 930, 931, 1007, 1008, 733, -106,
+ 679, 247, 934, 429, 248, 249, 1009, 582, 582, 1023,
+ 681, 1022, 1024, 1056, 940, 956, 1064, 105, 1031, 247,
+ 962, 105, 248, 249, 1033, 105, 105, 1035, 1027, 105,
+ 766, 844, 250, 1040, 251, 1042, 105, 105, 545, 763,
+ -582, 1044, 125, 615, 105, 431, 498, 125, 755, 756,
+ 250, 1046, 251, 87, 87, 247, -583, 980, 248, 249,
+ 1066, 87, 822, 1002, 1004, 1005, 1006, 730, 948, 130,
+ 227, 1055, 874, 901, 903, 1057, 912, 976, 784, 907,
+ 909, 1054, 489, 208, 125, 984, 250, 1016, 251, 105,
+ 105, 105, 105, 105, 105, 105, 105, 1032, -106, 964,
+ 966, -106, -106, 766, 270, 901, 903, 762, 907, 909,
+ 886, 1011, 0, 105, 766, 0, 0, 84, 0, 84,
+ 0, 87, 0, 87, 0, 0, 87, 0, 228, -106,
+ 0, -106, 0, 0, 105, 881, 0, 105, 0, 105,
+ 582, -108, 105, 0, 0, 1028, -485, 1029, 0, 416,
+ 1030, 0, 1059, 0, 510, 814, 686, 822, 337, 327,
+ 328, -485, 0, 877, 218, 1017, 877, 84, 1020, 877,
+ 265, 877, 105, 353, 354, 1015, 656, 423, 424, 425,
+ 426, 427, 105, 105, 973, 339, 327, 328, 751, -580,
+ 356, 357, 358, 359, 270, 0, -485, 105, 657, 105,
+ 105, 0, 0, -485, 0, 0, 360, 973, 0, 846,
+ 105, 329, 330, 0, 105, 0, 0, 0, 105, 877,
+ 947, 0, 949, 105, 212, 0, 950, 857, 105, 0,
+ 0, 1041, 1043, 1045, 84, 1047, 1048, 880, 329, 330,
+ -108, 0, 0, -108, -108, 1061, 877, -586, 877, 0,
+ 877, 247, 877, -482, 248, 249, 0, 0, 212, 0,
+ 105, 0, 751, 0, 356, 357, 358, 359, -482, 105,
+ 0, -108, 877, -108, 0, 1065, 1067, 1068, 1069, 855,
+ 360, 0, 250, 0, 251, 1071, 0, 105, 0, 764,
+ -289, -301, 886, 0, 105, 886, 0, 886, 998, 999,
+ 0, -580, 0, -482, 0, -289, -301, -580, 0, 0,
+ -482, -586, 790, 1010, 0, -582, -583, 935, 0, 105,
+ 1018, 0, 1021, 0, 0, 84, -586, 429, 429, -413,
+ 0, 0, 0, 944, 0, 0, 0, 0, 105, 0,
+ -289, -301, 0, 217, 217, 886, 0, -289, -301, 217,
+ 266, 266, 0, 1000, 266, 0, 1025, 1034, 0, -586,
+ 1036, -586, 791, 455, 0, -582, 0, 0, -586, 431,
+ 431, 429, 886, 0, 886, 212, 886, 0, 886, -582,
+ -583, 288, 290, 291, 292, 550, 327, 328, 266, 308,
+ 0, 0, 1058, -413, -582, -583, 0, 1060, 886, 1062,
+ 344, 345, 84, 1063, 0, 0, 1026, 0, -413, 84,
+ 84, 0, 0, 431, 105, 105, 1012, 84, 0, 880,
+ 0, 0, 880, 1070, 880, 0, 0, -582, -583, -582,
+ -583, 0, 0, -582, -583, 0, -582, -583, 329, 330,
+ 0, -413, 355, -413, 356, 357, 358, 359, 105, 0,
+ -413, 217, 0, 0, 0, 555, 327, 328, 0, 0,
+ 360, 0, 84, 559, 327, 328, 0, 84, 0, 0,
+ 0, 0, 880, 560, 327, 328, 0, 0, 746, 327,
+ 328, 0, 0, 0, 0, 361, 84, 0, 0, 0,
+ 0, 362, 363, 364, 365, 0, 0, 0, 0, 880,
+ 0, 880, 0, 880, 0, 880, 0, 84, 329, 330,
+ 0, 0, 84, 0, 0, 611, 329, 330, 0, 366,
+ -297, 105, 367, -297, -297, 880, 329, 330, 0, 105,
+ 105, 329, 330, 105, 0, 368, 105, 105, 0, 0,
+ 0, 0, 105, 105, 0, 0, 0, 0, 105, 105,
+ -297, -297, 0, -297, 0, 611, 611, 217, 217, 0,
+ 0, 0, 105, 413, 414, 105, 992, 0, 356, 357,
+ 358, 359, 84, 0, 105, 105, 416, 348, 349, 350,
+ 351, 352, 105, 84, 360, 0, 0, 0, 0, 0,
+ 0, 84, 789, 105, 105, 494, 495, 496, 344, 0,
+ 0, 84, 0, 422, 423, 424, 425, 426, 427, 266,
+ 0, 0, 247, 266, 0, 248, 249, 217, 217, 0,
+ 401, 402, 403, 404, 405, 406, 407, 408, 409, 410,
+ 411, 412, 0, 84, 0, 0, 413, 414, 0, 498,
+ 0, 0, 84, 250, 0, 251, 0, 105, 0, 416,
+ 0, 355, 0, 356, 357, 358, 359, 105, 105, 0,
+ 247, 0, 0, 248, 249, 105, 0, 84, 0, 360,
+ 417, 0, 418, 419, 420, 421, 422, 423, 424, 425,
+ 426, 427, 217, 217, 217, 217, 0, 217, 217, 0,
+ -276, 938, 0, 251, 361, 0, 0, 0, 0, 0,
+ 362, 363, 364, 365, 0, 0, 579, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 589, 0, 0,
+ 0, 0, 0, 0, 0, 105, 0, 105, 366, 601,
+ 105, 367, 0, 0, 612, 617, 618, 619, 620, 621,
+ 622, 623, 624, 625, 626, 627, 628, 629, 630, 0,
+ 632, 633, 634, 635, 636, 637, 638, 639, 640, 641,
+ 642, 643, 0, 0, 266, 0, 0, 751, 105, 356,
+ 357, 358, 359, 0, 665, 665, 0, 751, 0, 356,
+ 357, 358, 359, 0, 0, 360, 0, 0, 84, 266,
+ 0, 0, 217, 0, 355, 360, 356, 357, 358, 359,
+ 0, 0, 0, 0, 665, 0, 266, 0, 665, 665,
+ 361, 0, 360, 0, 0, 266, 752, 0, 0, 0,
+ 361, 0, 0, 0, 710, 0, 943, 713, 0, 0,
+ 0, 714, 0, 0, 717, 0, 720, 361, 308, 292,
+ 413, 414, 0, 362, 363, 364, 365, 74, 0, 74,
+ 121, 121, 0, 416, 0, 0, 665, 751, 121, 356,
+ 357, 358, 359, 0, -609, 0, 717, 0, 0, 308,
+ 0, 366, 0, 0, 367, 360, 0, 0, 0, 266,
+ 0, 423, 424, 425, 426, 427, 0, 368, 355, 0,
+ 356, 357, 358, 359, 84, 749, 750, 74, 0, 0,
+ 361, 121, 84, 611, 0, 0, 360, 0, 0, 611,
+ 0, 759, 0, 0, 0, 611, 611, 0, 0, 0,
+ 0, 84, 84, 0, 0, 0, 0, 121, 0, 0,
+ 775, 361, 0, 782, 0, 84, 0, 362, 363, 364,
+ 365, 0, 0, 0, 413, 414, 0, 84, 84, 0,
+ 0, 0, 0, 0, 0, 84, 0, 416, 0, 0,
+ 0, 0, 0, 0, 74, 366, 84, 84, 367, 0,
+ 0, 0, 0, 0, 355, 0, 356, 357, 358, 359,
+ 0, 547, 420, 421, 422, 423, 424, 425, 426, 427,
+ 0, 0, 360, 0, 0, 0, 772, 0, 356, 357,
+ 358, 359, 0, 0, 0, 0, 217, 0, 0, 0,
+ 0, 0, 0, 0, 360, 0, 0, 361, 816, 0,
+ 611, 759, 775, 362, 363, 364, 365, 0, 0, 0,
+ 84, 84, 0, 75, 979, 75, 122, 122, 84, 361,
+ 217, 0, 0, 0, 122, 0, 363, 364, 365, 0,
+ 841, 366, 0, 0, 367, 74, 0, 0, 0, 717,
+ 308, 0, 0, 0, -609, 1013, 0, 0, 0, 0,
+ 0, 0, 0, 366, 0, 0, 0, -609, -609, -609,
+ -609, -609, -609, 75, -609, 0, 0, 122, 0, 0,
+ -609, -609, 0, 0, 0, 0, 0, 0, 84, 0,
+ 84, -609, -609, 84, -609, -609, -609, -609, -609, 0,
+ 0, 0, 0, 122, 0, 0, 0, 889, 0, 0,
+ 0, 0, 665, 892, 0, 266, 0, 0, 665, 665,
+ 0, 0, 74, 717, 665, 665, 0, 0, 0, 74,
+ 74, 0, 0, 0, 0, 0, 0, 74, 0, 0,
+ 75, 0, 0, 0, -609, 0, 0, 217, 121, 0,
+ 665, 665, 0, 665, 665, 0, 0, 0, 0, -609,
+ 0, 0, 0, 933, 0, 0, 0, 292, 0, -609,
+ 0, 0, -609, -609, 0, 0, 0, 0, 0, 0,
+ 0, 0, 74, 0, 945, 946, 0, 74, 0, 0,
+ 0, 0, -609, -609, 0, 0, 951, 952, 275, -609,
+ -609, -609, -609, 0, 0, 0, 74, 0, 0, 0,
+ 0, 0, 968, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 970, 971, 0, 0, 0, 74, 0, 665,
+ 0, 75, 74, 121, 0, 74, 0, 355, 0, 356,
+ 357, 358, 359, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 665, 0, 0, 360, 0, 0, 0, 0,
+ 308, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 574, 0, 0, 0, 74, 74, 0, 0, 0,
+ 361, 0, 0, 0, 0, 0, 362, 363, 364, 365,
+ 0, 0, 74, 0, 104, 0, 104, 128, 128, 0,
+ 0, 0, 0, 74, 0, 232, 0, 0, 75, 0,
+ 0, 74, 0, 0, 366, 75, 75, 367, 0, 0,
+ 0, 74, 0, 75, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 122, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 104, 0, 0, 0, 317, 0,
+ 266, 0, 0, 74, 0, 0, 0, 0, 0, 0,
+ 0, 0, 74, 0, 0, 789, 0, 0, 75, 0,
+ 0, 0, 0, 75, 317, 0, 121, 0, 121, 0,
+ 0, 0, 0, 0, 0, 0, 0, 74, 0, 0,
+ 0, 0, 75, 401, 402, 403, 404, 405, 406, 407,
+ 408, 409, 410, 411, 412, 0, 0, 0, 0, 413,
+ 414, 104, 0, 75, 0, 0, 0, 0, 75, 122,
+ 0, 75, 416, 355, 0, 356, 357, 358, 359, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 416, 0, 417, 418, 419, 420, 421, 422, 423, 424,
- 425, 426, 0, 0, 0, 0, 0, 104, 0, 0,
- -273, 0, 0, 0, 316, 104, 613, 0, 0, 0,
- 0, 0, 613, 0, 101, 0, 0, 264, 613, 613,
- 0, 0, 0, 101, 104, 104, 0, 0, 0, 0,
- 0, 101, 0, 0, 102, 0, 0, 0, 104, 0,
- 84, 101, 0, 0, 0, 0, 0, 84, 84, 0,
- 104, 104, 0, 0, 0, 84, 0, 0, 104, 0,
- 0, 354, 0, 355, 356, 357, 358, 0, 0, 0,
- 104, 104, 0, 101, 0, 0, 412, 413, 0, 359,
- 0, 0, 101, 0, 0, 0, 0, 0, 0, 415,
- 0, 0, 0, 0, 128, 0, 315, 0, 315, 128,
- 84, 0, 0, 0, 360, 84, 0, 101, 0, 0,
- 361, 362, 363, 364, 419, 420, 421, 422, 423, 424,
- 425, 426, 613, 0, 84, 102, -608, -608, -608, -608,
- 404, 405, 104, 104, -608, -608, 973, 0, 365, 0,
- 104, 366, 412, 413, 0, 84, 0, 0, 0, 0,
- 84, 0, 0, 608, 0, 415, 0, 0, 0, 0,
- 315, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 417, 418,
- 419, 420, 421, 422, 423, 424, 425, 426, 0, 0,
- 0, 0, 0, 608, 608, 0, 0, 0, 104, 0,
- 104, 102, 0, 104, 0, 0, 0, 0, 102, 102,
- 84, 0, 0, 0, 0, 0, 102, 0, 0, 84,
- 0, 0, 0, 0, 0, 0, 0, 84, 101, 0,
- -607, 0, 0, 0, 0, 0, 0, 84, 0, 0,
- 0, 0, 0, -607, -607, -607, -607, -607, -607, 0,
- -607, 0, 0, 0, 0, 0, -607, -607, 0, 0,
- 0, 102, 0, 0, 0, 0, 102, -607, -607, 84,
- -607, -607, -607, -607, -607, 0, 0, 0, 84, 0,
- 0, 0, 0, 0, 0, 102, 0, 0, 0, 0,
+ 121, 360, 0, 417, 0, 418, 419, 420, 421, 422,
+ 423, 424, 425, 426, 427, 0, 0, 859, 0, 0,
+ 0, 75, 75, 0, 0, 0, 361, 0, 0, 0,
+ 0, 0, 362, 363, 364, 365, 0, 0, 75, 0,
+ 101, 0, 101, 127, 127, 127, 0, 0, 0, 75,
+ 0, 231, 0, 0, 0, 0, 0, 75, 0, 0,
+ 366, 0, 104, 367, 0, 0, 0, 75, 74, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 84, 0, 0, 102, 0, 0, 0,
- 0, 102, 0, 0, 102, 0, 0, 0, 0, 0,
- -607, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 101, 0, 0, 0, -607, 0, 0, 315, 101,
- 0, 0, 0, 0, 0, -607, 0, 0, -607, -607,
- 0, 0, 0, 0, 102, 102, 0, 0, 101, 101,
- 0, 0, 0, 0, 0, 0, 0, 0, -607, -607,
- 0, 102, 101, 0, 273, -607, -607, -607, -607, 0,
- 102, 0, 0, 0, 101, 101, 0, 0, 102, 0,
- 0, 0, 101, 0, 0, 0, 0, 0, 102, 0,
- 0, 0, 0, 0, 101, 101, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 650, 651, 84, 0, 652, 0, 127, 0,
- 102, 0, 0, 127, 0, 0, 0, 0, 0, 102,
- 0, 174, 175, 176, 177, 178, 179, 180, 181, 0,
- 0, 182, 183, 0, 0, 0, 0, 184, 185, 186,
- 187, 0, 0, 0, 102, 0, 101, 101, 0, 0,
- 972, 188, 189, 190, 101, 0, 0, 0, 0, 0,
+ 101, 0, 0, 0, 316, 0, 0, 0, 0, 75,
+ 0, 0, 0, 0, 0, 0, 0, 0, 75, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 191, 192, 193, 194, 195,
- 196, 197, 198, 199, 200, 0, 201, 202, 0, 0,
- 0, 0, 0, 0, 203, 273, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 84, 0, 0,
- 0, 0, 101, 0, 101, 84, 608, 101, 0, 0,
- 671, 642, 608, 0, 672, 0, 0, 0, 608, 608,
- 0, 0, 0, 0, 84, 84, 0, 0, 0, 174,
- 175, 176, 177, 178, 179, 180, 181, 0, 84, 182,
- 183, 0, 0, 0, 0, 184, 185, 186, 187, 0,
- 84, 84, 0, 0, 0, 102, 0, 0, 84, 188,
- 189, 190, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 84, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 191, 192, 193, 194, 195, 196, 197,
- 198, 199, 200, 0, 201, 202, 400, 401, 402, 403,
- 404, 405, 203, 273, 408, 409, 0, 0, 0, 0,
- 0, 0, 412, 413, 0, 0, 0, 0, 0, 0,
- 0, 0, 608, 0, 0, 415, 0, 0, 0, 0,
- 0, 0, 84, 84, 0, 0, 970, 0, 0, 0,
- 84, 0, 0, 0, 0, 0, 0, 0, 417, 418,
- 419, 420, 421, 422, 423, 424, 425, 426, 102, 0,
- 0, 0, 0, 0, 0, 0, 102, 102, 0, 0,
- 0, 0, 0, 102, 0, 0, 0, 0, 0, 102,
- 102, 0, 0, 0, 0, 102, 102, 0, 400, 401,
- 402, 403, 404, 405, 406, 0, 408, 409, 84, 102,
- 84, 0, 0, 84, 412, 413, 0, 0, 0, 0,
- 0, 102, 102, 0, 0, 0, 0, 415, 0, 102,
- 0, 0, 783, 0, 0, 0, 0, 0, 0, 0,
- 0, 102, 102, 0, 0, 0, 0, 0, 0, 0,
- 417, 418, 419, 420, 421, 422, 423, 424, 425, 426,
- 400, 401, 402, 403, 404, 405, 406, 407, 408, 409,
- 410, 411, 0, 0, 0, 0, 412, 413, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 415,
- 0, 0, 0, 102, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 102, 102, 0, 0, 0, 0, 0,
- 416, 102, 417, 418, 419, 420, 421, 422, 423, 424,
- 425, 426, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, -607, 4, 0, 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, 102,
- 27, 102, 0, 0, 102, 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, 49, 50, 0, 0, 0,
- 0, 0, 51, 0, 0, 52, 53, 0, 54, 55,
- 0, 56, 0, 0, 0, 57, 0, 58, 59, 60,
- 0, 61, 62, 63, -288, 64, -607, 0, 0, -607,
- -607, 0, 0, 0, 0, 0, 0, -288, -288, -288,
- -288, -288, -288, 0, -288, 65, 66, 67, 0, 0,
- 0, -288, -288, -288, 0, 0, 0, -607, 0, -607,
- 0, -288, -288, 0, -288, -288, -288, -288, -288, 0,
+ 316, 0, 122, 0, 122, 0, 0, 0, 0, 0,
+ 0, 0, 0, 75, 0, 0, 0, 0, 0, 104,
+ 0, 0, 0, 0, 0, 0, 104, 104, 0, 0,
+ 0, 0, 0, 0, 104, 0, 0, 101, 0, 0,
+ 0, 0, 0, 0, 0, 317, 0, 0, 0, 0,
+ 0, 0, 0, 0, 74, 0, 0, 0, 0, 0,
+ 0, 121, 74, 74, 0, 0, 122, 0, 0, 74,
+ 0, 0, 0, 0, 0, 74, 74, 0, 0, 104,
+ 0, 74, 74, 0, 104, 401, 402, 403, 404, 405,
+ 406, 407, 0, 409, 410, 74, 0, 0, 0, 0,
+ 0, 413, 414, 104, 0, 0, 0, 74, 74, 0,
+ 0, 0, 0, 0, 416, 74, 0, 0, 0, 0,
+ 0, 0, 0, 0, 104, 0, 74, 74, 101, 104,
+ 317, 0, 616, 0, 75, 0, 0, 418, 419, 420,
+ 421, 422, 423, 424, 425, 426, 427, 0, 0, 0,
+ 0, 0, 121, 0, 0, 0, 0, 121, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, -288, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, -288, -288, -288, -288,
- -288, -288, -288, -288, -288, -288, -288, -288, 0, 0,
- 0, 0, -288, -288, -288, 0, 0, -288, 0, 0,
- 0, 0, 0, -288, 0, -288, 0, 0, 0, -288,
- 0, 0, 0, 0, 0, 0, 0, -288, 0, -288,
- 0, 0, -288, -288, 0, 0, -288, -288, -288, -288,
- -288, -288, -288, -288, -288, -288, -288, -288, 0, 0,
- -409, 0, 0, -288, -288, -288, -288, 0, 0, -288,
- -288, -288, -288, -409, -409, -409, -409, -409, -409, 0,
- -409, 0, 0, 0, 0, 0, -409, -409, -409, 0,
- 0, 0, 0, 0, 0, 0, 0, -409, -409, 0,
- -409, -409, -409, -409, -409, 0, 0, 0, 0, 0,
+ 0, 0, 616, 616, 0, 0, 0, 0, 0, 0,
+ 74, 0, 0, 0, 0, 0, 0, 0, 0, 104,
+ 74, 74, 0, 0, 121, 0, 0, 0, 74, 0,
+ 104, 0, 0, 0, 0, 101, 0, 0, 104, 0,
+ 0, 0, 101, 101, 0, 0, 0, 0, 104, 0,
+ 101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 316, 0, 0, 0, 0, 0, 0, 0, 0,
+ 75, 0, 0, 0, 0, 0, 0, 122, 75, 75,
+ 104, 0, 0, 0, 0, 75, 0, 0, 74, 104,
+ 74, 75, 75, 74, 0, 101, 0, 75, 75, 0,
+ 101, 0, 0, 317, 0, 317, 0, 0, 0, 0,
+ 0, 75, 0, 0, 104, 0, 0, 0, 0, 101,
+ 0, 0, 0, 75, 75, 0, 0, 0, 0, 0,
+ 0, 75, 0, 0, 0, 0, 0, 0, 0, 0,
+ 101, 0, 75, 75, 0, 101, 316, 0, 0, 0,
+ 0, 0, 0, 102, 0, 102, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 317, 122, 0,
+ 0, 0, 0, 122, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 401, 402, 403, 404, 405, 406,
+ 407, 408, 409, 410, -610, -610, 75, 0, 0, 0,
+ 413, 414, 0, 102, 0, 101, 75, 75, 0, 0,
+ 122, 0, 0, 416, 75, 0, 101, 0, 0, 0,
+ 0, 0, 0, 861, 101, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 101, 104, 418, 419, 420, 421,
+ 422, 423, 424, 425, 426, 427, 0, 0, 0, 0,
+ 0, 401, 402, 403, 404, 405, 406, 407, 408, 409,
+ 410, 411, 412, 0, 0, 0, 101, 413, 414, 0,
+ 102, 0, 0, 0, 75, 101, 75, 0, 0, 75,
+ 416, 0, 0, 0, 0, 0, 0, 0, 0, 316,
+ 0, 316, 0, 0, 0, 0, 0, 0, 0, 0,
+ 101, 417, 0, 418, 419, 420, 421, 422, 423, 424,
+ 425, 426, 427, 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, -409, -409, -409, -409, -409, -409, -409, -409,
- -409, -409, -409, -409, 0, 0, 0, 0, -409, -409,
- -409, 0, 0, -409, 0, 0, 0, 0, 0, -409,
- 0, -409, 0, 0, 0, -409, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, -409, 0, 0, -409, -409,
- 0, 0, -409, 0, -409, -409, -409, -409, -409, -409,
- -409, -409, -409, -409, 0, 0, -475, 0, -409, -409,
- -409, -409, -409, 0, 273, -409, -409, -409, -409, -475,
- -475, -475, -475, -475, -475, 0, -475, 0, 0, 0,
- 0, 0, 0, -475, -475, 0, 0, 0, 0, 0,
- 0, 0, 0, -475, -475, 0, -475, -475, -475, -475,
- -475, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 490, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, -475, -475,
- -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
- 0, 0, 0, 0, -475, -475, -475, 0, -475, -475,
- 0, 0, 0, 0, 0, -475, 0, -475, 0, 0,
- 0, -475, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, -475, 0, 0, -475, -475, 0, -475, -475, 0,
- -475, -475, -475, -475, -475, -475, -475, -475, -475, -475,
- 0, 0, -607, 0, 0, -475, -475, -475, -475, 0,
- 0, -475, -475, -475, -475, -607, -607, -607, -607, -607,
- -607, 0, -607, 0, 0, 0, 0, 0, -607, -607,
- -607, 0, 0, 0, 0, 0, 0, 0, 0, -607,
- -607, 0, -607, -607, -607, -607, -607, 0, 0, 0,
+ 0, 104, 873, 0, 0, 0, 0, 0, 317, 104,
+ 616, 0, 0, 316, 0, 0, 616, 0, 0, 0,
+ 0, 102, 616, 616, 0, 0, 0, 0, 104, 104,
+ 401, 402, 403, 404, 405, 406, 407, 408, 409, 410,
+ 411, 412, 104, 0, 0, 0, 413, 414, 0, 0,
+ 0, 0, 0, 0, 104, 104, 0, 0, 0, 416,
+ 0, 0, 104, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 104, 104, 0, 0, 0, 0, 0,
+ 417, 101, 418, 419, 420, 421, 422, 423, 424, 425,
+ 426, 427, 0, 0, 0, 0, 0, 0, 102, 128,
+ 0, 0, 0, 0, 128, 102, 102, 0, 0, 0,
+ 0, 0, 0, 102, 401, 402, 403, 404, 405, 406,
+ 407, 408, 409, 410, 411, 412, 0, 616, 0, 0,
+ 413, 414, 0, 0, 0, 0, 0, 104, 104, 0,
+ 0, 982, 0, 416, 0, 104, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 102, 0,
+ 0, 0, 0, 102, 417, 0, 418, 419, 420, 421,
+ 422, 423, 424, 425, 426, 427, 0, 0, 0, 0,
+ 0, 0, 102, 0, -276, 0, 0, 101, 0, 0,
+ 0, 0, 0, 0, 316, 101, 0, 0, 0, 0,
+ 0, 0, 0, 102, 0, 104, 0, 104, 102, 0,
+ 104, 102, 0, 0, 101, 101, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 101, -291,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 101, 101, -291, -291, -291, -291, -291, -291, 101, -291,
+ 0, 102, 102, 0, 0, 0, -291, -291, -291, 101,
+ 101, 0, 0, 0, 0, 0, -291, -291, 102, -291,
+ -291, -291, -291, -291, 0, 0, 0, 0, 0, 102,
+ 0, 0, 0, 0, 0, 127, -291, 102, 0, 0,
+ 127, 0, 0, 0, 0, 0, 0, 102, 0, 0,
+ 0, -291, -291, -291, -291, -291, -291, -291, -291, -291,
+ -291, -291, -291, 0, 0, 0, 0, -291, -291, -291,
+ 0, 0, -291, 101, 101, 0, 0, 981, -291, 102,
+ -291, 101, 0, 0, -291, 0, 0, 0, 102, 0,
+ 0, 0, -291, 0, -291, 0, 0, -291, -291, 0,
+ 0, -291, -291, -291, -291, -291, -291, -291, -291, -291,
+ -291, -291, -291, 102, 0, 0, 0, 0, -291, -291,
+ -291, -291, 0, 0, -291, -291, -291, -291, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, -607, -607, -607, -607, -607, -607,
- -607, -607, -607, -607, -607, -607, 0, 0, 0, 0,
- -607, -607, -607, 0, 0, -607, 0, 0, 0, 0,
- 0, -607, 0, -607, 0, 0, 0, -607, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, -607, 0, 0,
- -607, -607, 0, 0, -607, 0, -607, -607, -607, -607,
- -607, -607, -607, -607, -607, -607, 0, 0, -607, 0,
- -607, -607, -607, -607, -607, 0, 273, -607, -607, -607,
- -607, -607, -607, -607, -607, -607, -607, 0, -607, 0,
- 0, 0, 0, 0, 0, -607, -607, 0, 0, 0,
- 0, 0, 0, 0, 0, -607, -607, 0, -607, -607,
- -607, -607, -607, 0, 0, 0, 0, 0, 0, 0,
+ 0, 101, 0, 101, -609, 4, 101, 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, 49, 50,
+ 0, 0, 0, 0, 102, 51, 0, 0, 52, 53,
+ 0, 54, 55, 0, 56, 0, 0, 0, 57, 0,
+ 58, 59, 60, 0, 61, 62, 63, 0, 64, -609,
+ 0, 0, -609, -609, 0, 401, 402, 403, 404, 405,
+ 406, 407, 408, 409, 410, 411, 412, 0, 65, 66,
+ 67, 413, 414, 0, 0, 0, 0, 0, 0, 0,
+ -609, 0, -609, 0, 416, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 417, 0, 418, 419, 420,
+ 421, 422, 423, 424, 425, 426, 427, 0, 0, 0,
+ 0, 0, 0, 0, 0, -277, 0, 0, 0, 0,
+ 102, 0, 0, 0, 0, 0, 0, 0, 102, 102,
+ 0, 0, 0, 0, 0, 102, 0, 0, 0, 0,
+ 0, 102, 102, 0, 0, 0, 0, 102, 102, 0,
+ 0, 0, 0, 0, 0, -610, -610, -610, -610, 405,
+ 406, 102, -412, -610, -610, 0, 0, 0, 0, 0,
+ 0, 413, 414, 102, 102, -412, -412, -412, -412, -412,
+ -412, 102, -412, 0, 416, 0, 0, 0, -412, -412,
+ -412, 0, 102, 102, 0, 0, 0, 0, 0, -412,
+ -412, 0, -412, -412, -412, -412, -412, 418, 419, 420,
+ 421, 422, 423, 424, 425, 426, 427, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -607, -607, -607, -607, -607, -607, -607, -607, -607, -607,
- -607, -607, 0, 0, 0, 0, -607, -607, -607, 0,
- 0, -607, 0, 0, 0, 0, 0, -607, 0, -607,
- 0, 0, 0, -607, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, -607, 0, 0, -607, -607, 0, 0,
- -607, 0, -607, -607, -607, -607, -607, -607, -607, -607,
- -607, -607, 0, 0, -584, 0, 0, -607, -607, -607,
- -607, 0, 273, -607, -607, -607, -607, -584, -584, -584,
- 0, -584, -584, 0, -584, 0, 0, 0, 0, 0,
- -584, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, -584, -584, 0, -584, -584, -584, -584, -584, 0,
+ 0, 0, 0, 0, -412, -412, -412, -412, -412, -412,
+ -412, -412, -412, -412, -412, -412, 102, 0, 0, 0,
+ -412, -412, -412, 0, 0, -412, 102, 102, 0, 0,
+ 0, -412, 0, -412, 102, 0, 0, -412, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -412, 0, 0,
+ -412, -412, 0, 0, -412, 0, -412, -412, -412, -412,
+ -412, -412, -412, -412, -412, -412, 0, 0, 0, 0,
+ -412, -412, -412, -412, -412, -478, 275, -412, -412, -412,
+ -412, 0, 0, 0, 0, 0, 0, 0, -478, -478,
+ -478, -478, -478, -478, 102, -478, 102, 0, 0, 102,
+ 0, 0, -478, -478, 0, 0, 0, 0, 0, 0,
+ 0, 0, -478, -478, 0, -478, -478, -478, -478, -478,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 493, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -478, -478, -478,
+ -478, -478, -478, -478, -478, -478, -478, -478, -478, 0,
+ 0, 0, 0, -478, -478, -478, 0, -478, -478, 0,
+ 0, 0, 0, 0, -478, 0, -478, 0, 0, 0,
+ -478, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -478, 0, 0, -478, -478, 0, -478, -478, 0, -478,
+ -478, -478, -478, -478, -478, -478, -478, -478, -478, 0,
+ 0, -609, 0, 0, -478, -478, -478, -478, 0, 0,
+ -478, -478, -478, -478, -609, -609, -609, -609, -609, -609,
+ 0, -609, 0, 0, 0, 0, 0, -609, -609, -609,
+ 0, 0, 0, 0, 0, 0, 0, 0, -609, -609,
+ 0, -609, -609, -609, -609, -609, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, -584, -584, -584, -584,
- -584, -584, -584, -584, -584, -584, -584, -584, 0, 0,
- 0, 0, -584, -584, -584, 0, 788, -584, 0, 0,
- 0, 0, 0, 0, 0, -584, 0, 0, 0, -584,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, -584,
- 0, 0, -584, -584, 0, -103, -584, 0, -584, -584,
- -584, -584, -584, -584, -584, -584, -584, -584, 0, 0,
- -584, 0, -584, -584, -584, 0, -95, 0, 0, -584,
- -584, -584, -584, -584, -584, -584, 0, -584, -584, 0,
- -584, 0, 0, 0, 0, 0, -584, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, -584, -584, 0,
- -584, -584, -584, -584, -584, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -609, -609, -609, -609, -609, -609, -609,
+ -609, -609, -609, -609, -609, 0, 0, 0, 0, -609,
+ -609, -609, 0, 0, -609, 0, 0, 0, 0, 0,
+ -609, 0, -609, 0, 0, 0, -609, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -609, 0, 0, -609,
+ -609, 0, 0, -609, 0, -609, -609, -609, -609, -609,
+ -609, -609, -609, -609, -609, 0, 0, -609, 0, -609,
+ -609, -609, -609, -609, 0, 275, -609, -609, -609, -609,
+ -609, -609, -609, -609, -609, -609, 0, -609, 0, 0,
+ 0, 0, 0, 0, -609, -609, 0, 0, 0, 0,
+ 0, 0, 0, 0, -609, -609, 0, -609, -609, -609,
+ -609, -609, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, -584, -584, -584, -584, -584, -584, -584, -584,
- -584, -584, -584, -584, 0, 0, 0, 0, -584, -584,
- -584, 0, 788, -584, 0, 0, 0, 0, 0, 0,
- 0, -584, 0, 0, 0, -584, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, -584, 0, 0, -584, -584,
- 0, -103, -584, 0, -584, -584, -584, -584, -584, -584,
- -584, -584, -584, -584, 0, 0, -297, 0, -584, -584,
- -584, 0, -584, 0, 0, -584, -584, -584, -584, -297,
- -297, -297, 0, -297, -297, 0, -297, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, -609,
+ -609, -609, -609, -609, -609, -609, -609, -609, -609, -609,
+ -609, 0, 0, 0, 0, -609, -609, -609, 0, 0,
+ -609, 0, 0, 0, 0, 0, -609, 0, -609, 0,
+ 0, 0, -609, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -609, 0, 0, -609, -609, 0, 0, -609,
+ 0, -609, -609, -609, -609, -609, -609, -609, -609, -609,
+ -609, 0, 0, -586, 0, 0, -609, -609, -609, -609,
+ 0, 275, -609, -609, -609, -609, -586, -586, -586, 0,
+ -586, -586, 0, -586, 0, 0, 0, 0, 0, -586,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, -297, -297, 0, -297, -297, -297, -297,
- -297, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -586, -586, 0, -586, -586, -586, -586, -586, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, -297, -297,
- -297, -297, -297, -297, -297, -297, -297, -297, -297, -297,
- 0, 0, 0, 0, -297, -297, -297, 0, 789, -297,
- 0, 0, 0, 0, 0, 0, 0, -297, 0, 0,
- 0, -297, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, -297, 0, 0, -297, -297, 0, -105, -297, 0,
- -297, -297, -297, -297, -297, -297, -297, -297, -297, -297,
- 0, 0, -297, 0, 0, -297, -297, 0, -97, 0,
- 0, -297, -297, -297, -297, -297, -297, -297, 0, -297,
- -297, 0, -297, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, -297,
- -297, 0, -297, -297, -297, -297, -297, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -586, -586, -586, -586, -586,
+ -586, -586, -586, -586, -586, -586, -586, 0, 0, 0,
+ 0, -586, -586, -586, 0, 794, -586, 0, 0, 0,
+ 0, 0, 0, 0, -586, 0, 0, 0, -586, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -586, 0,
+ 0, -586, -586, 0, -107, -586, 0, -586, -586, -586,
+ -586, -586, -586, -586, -586, -586, -586, 0, 0, -586,
+ 0, -586, -586, -586, 0, -99, 0, 0, -586, -586,
+ -586, -586, -586, -586, -586, 0, -586, -586, 0, -586,
+ 0, 0, 0, 0, 0, -586, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -586, -586, 0, -586,
+ -586, -586, -586, -586, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, -297, -297, -297, -297, -297, -297,
- -297, -297, -297, -297, -297, -297, 0, 0, 0, 0,
- -297, -297, -297, 0, 789, -297, 0, 0, 0, 0,
- 0, 0, 0, -297, 0, 0, 0, -297, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, -297, 0, 0,
- -297, -297, 0, -105, -297, 0, -297, -297, -297, -297,
- -297, -297, -297, -297, -297, -297, 0, 0, 0, 0,
- 0, -297, -297, 0, -297, 0, 0, -297, -297, -297,
- -297, 293, 0, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, -607, -607, -607, 0, 0, -607, 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, 49, 50, 0, 0, 0, 0,
- 0, 51, 0, 0, 52, 53, 0, 54, 55, 0,
- 56, 0, 0, 0, 57, 0, 58, 59, 60, 0,
- 61, 62, 63, 0, 64, -607, 0, 0, -607, -607,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 66, 67, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, -607, 293, -607, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
- 0, -607, 0, -607, -607, 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, -586, -586, -586, -586, -586, -586, -586, -586, -586,
+ -586, -586, -586, 0, 0, 0, 0, -586, -586, -586,
+ 0, 794, -586, 0, 0, 0, 0, 0, 0, 0,
+ -586, 0, 0, 0, -586, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -586, 0, 0, -586, -586, 0,
+ -107, -586, 0, -586, -586, -586, -586, -586, -586, -586,
+ -586, -586, -586, 0, 0, -300, 0, -586, -586, -586,
+ 0, -586, 0, 0, -586, -586, -586, -586, -300, -300,
+ -300, 0, -300, -300, 0, -300, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 49, 50, 0, 0, 0, 0, 0, 51, 0, 0,
- 52, 53, 0, 54, 55, 0, 56, 0, 0, 0,
- 57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
- 64, -607, 0, 0, -607, -607, 0, 0, 0, 0,
+ 0, 0, -300, -300, 0, -300, -300, -300, -300, -300,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 66, 67, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, -607, 293, -607, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 0, 0, -607, 0, 0,
- -607, 15, -607, 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, 49, 50, 0, 0,
- 0, 0, 0, 51, 0, 0, 52, 53, 0, 54,
- 55, 0, 56, 0, 0, 0, 57, 0, 58, 59,
- 60, 0, 61, 62, 63, 0, 64, -607, 0, 0,
- -607, -607, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 65, 66, 67, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, -607, 293,
- -607, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 0, 0, -607, 0, 0, -607, 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, 49, 50, 0, 0, 0, 0, 0, 51,
- 0, 0, 52, 53, 0, 54, 55, 0, 56, 0,
- 0, 0, 57, 0, 58, 59, 60, 0, 61, 62,
- 63, 0, 64, -607, 0, 0, -607, -607, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, -300, -300, -300,
+ -300, -300, -300, -300, -300, -300, -300, -300, -300, 0,
+ 0, 0, 0, -300, -300, -300, 0, 795, -300, 0,
+ 0, 0, 0, 0, 0, 0, -300, 0, 0, 0,
+ -300, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -300, 0, 0, -300, -300, 0, -109, -300, 0, -300,
+ -300, -300, -300, -300, -300, -300, -300, -300, -300, 0,
+ 0, -300, 0, 0, -300, -300, 0, -101, 0, 0,
+ -300, -300, -300, -300, -300, -300, -300, 0, -300, -300,
+ 0, -300, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -300, -300,
+ 0, -300, -300, -300, -300, -300, 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, -300, -300, -300, -300, -300, -300, -300,
+ -300, -300, -300, -300, -300, 0, 0, 0, 0, -300,
+ -300, -300, 0, 795, -300, 0, 0, 0, 0, 0,
+ 0, 0, -300, 0, 0, 0, -300, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -300, 0, 0, -300,
+ -300, 0, -109, -300, 0, -300, -300, -300, -300, -300,
+ -300, -300, -300, -300, -300, 0, 0, 0, 0, 0,
+ -300, -300, 0, -300, 0, 0, -300, -300, -300, -300,
+ 294, 0, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, -609, -609, -609, 0, 0, -609, 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, 49, 50, 0, 0, 0, 0, 0,
+ 51, 0, 0, 52, 53, 0, 54, 55, 0, 56,
+ 0, 0, 0, 57, 0, 58, 59, 60, 0, 61,
+ 62, 63, 0, 64, -609, 0, 0, -609, -609, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 65, 66, 67, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -609, 294, -609, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 0, 0,
+ -609, 0, -609, -609, 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, 49,
+ 50, 0, 0, 0, 0, 0, 51, 0, 0, 52,
+ 53, 0, 54, 55, 0, 56, 0, 0, 0, 57,
+ 0, 58, 59, 60, 0, 61, 62, 63, 0, 64,
+ -609, 0, 0, -609, -609, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,
+ 66, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -609, 294, -609, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 0, 0, -609, 0, 0, -609,
+ 15, -609, 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, 49, 50, 0, 0, 0,
+ 0, 0, 51, 0, 0, 52, 53, 0, 54, 55,
+ 0, 56, 0, 0, 0, 57, 0, 58, 59, 60,
+ 0, 61, 62, 63, 0, 64, -609, 0, 0, -609,
+ -609, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 65, 66, 67, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -609, 294, -609,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 0, 0, 65, 66, 67, 0, 15, 0, 16, 17,
- 18, 19, 0, 0, -607, 0, -607, 20, 21, 22,
+ 0, 0, -609, 0, 0, -609, 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,
+ 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, 49, 50, 0, 0, 0, 0, 0, 51, 0,
0, 52, 53, 0, 54, 55, 0, 56, 0, 0,
0, 57, 0, 58, 59, 60, 0, 61, 62, 63,
- 0, 64, -607, 0, 0, -607, -607, 0, 0, 0,
+ 0, 64, -609, 0, 0, -609, -609, 4, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
+ 0, 65, 66, 67, 0, 15, 0, 16, 17, 18,
+ 19, 0, 0, -609, 0, -609, 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, 65, 66, 67, 0, 0, -607, 0, 0, 0,
- 0, 0, 0, -607, 293, -607, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 0, -607, -607, 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, 49, 50, 0,
- 0, 0, 0, 0, 51, 0, 0, 52, 53, 0,
- 54, 55, 0, 56, 0, 0, 0, 57, 0, 58,
- 59, 60, 0, 61, 62, 63, 0, 64, -607, 0,
- 0, -607, -607, 293, 0, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 0, 0, 65, 66, 67,
- 0, 15, 0, 16, 17, 18, 19, 0, 0, -607,
- 0, -607, 20, 21, 22, 23, 24, 25, 26, 0,
+ 49, 50, 0, 0, 0, 0, 0, 51, 0, 0,
+ 52, 53, 0, 54, 55, 0, 56, 0, 0, 0,
+ 57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
+ 64, -609, 0, 0, -609, -609, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 66, 67, 0, 0, -609, 0, 0, 0, 0,
+ 0, 0, -609, 294, -609, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 0, -609, -609, 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, 49, 50, 0, 0,
- 0, 0, 0, 51, 0, 0, 294, 53, 0, 54,
+ 0, 0, 0, 51, 0, 0, 52, 53, 0, 54,
55, 0, 56, 0, 0, 0, 57, 0, 58, 59,
- 60, 0, 61, 62, 63, 0, 64, -607, 0, 0,
- -607, -607, 293, 0, 5, 6, 7, 8, 9, 10,
+ 60, 0, 61, 62, 63, 0, 64, -609, 0, 0,
+ -609, -609, 294, 0, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 0, 0, 65, 66, 67, 0,
- 15, 0, 16, 17, 18, 19, 0, -607, -607, 0,
- -607, 20, 21, 22, 23, 24, 25, 26, 0, 0,
+ 15, 0, 16, 17, 18, 19, 0, 0, -609, 0,
+ -609, 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, 49, 50, 0, 0, 0,
- 0, 0, 51, 0, 0, 52, 53, 0, 54, 55,
+ 0, 0, 51, 0, 0, 295, 53, 0, 54, 55,
0, 56, 0, 0, 0, 57, 0, 58, 59, 60,
- 0, 61, 62, 63, 0, 64, -607, 0, 0, -607,
- -607, 293, 0, 5, 6, 7, 8, 9, 10, 11,
+ 0, 61, 62, 63, 0, 64, -609, 0, 0, -609,
+ -609, 294, 0, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 0, 0, 65, 66, 67, 0, 15,
- 0, 16, 17, 18, 19, 0, -607, -607, 0, -607,
+ 0, 16, 17, 18, 19, 0, -609, -609, 0, -609,
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,
@@ -3009,258 +3051,270 @@ static const yytype_int16 yytable[] =
0, 0, 0, 0, 49, 50, 0, 0, 0, 0,
0, 51, 0, 0, 52, 53, 0, 54, 55, 0,
56, 0, 0, 0, 57, 0, 58, 59, 60, 0,
- 61, 62, 63, 0, 64, -607, 0, 0, -607, -607,
+ 61, 62, 63, 0, 64, -609, 0, 0, -609, -609,
+ 294, 0, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 0, 0, 65, 66, 67, 0, 15, 0,
+ 16, 17, 18, 19, 0, -609, -609, 0, -609, 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, 49, 50, 0, 0, 0, 0, 0,
+ 51, 0, 0, 52, 53, 0, 54, 55, 0, 56,
+ 0, 0, 0, 57, 0, 58, 59, 60, 0, 61,
+ 62, 63, 0, 64, -609, 0, 0, -609, -609, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 66, 67, 0, 0, -607,
- 0, 0, 0, 0, 0, 0, -607, 293, -607, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
- 0, -607, 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,
- 49, 50, 0, 0, 0, 0, 0, 51, 0, 0,
- 52, 53, 0, 54, 55, 0, 56, 0, 0, 0,
- 57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
- 64, -607, 0, 0, -607, -607, 0, 0, 5, 6,
+ 0, 0, 0, 65, 66, 67, 0, 0, -609, 0,
+ 0, 0, 0, 0, 0, -609, 294, -609, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 0, 0,
- 65, 66, 67, 0, 15, 0, 16, 17, 18, 19,
- 0, 0, -607, 0, -607, 20, 21, 22, 23, 24,
+ -609, 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,
+ 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, 49,
50, 0, 0, 0, 0, 0, 51, 0, 0, 52,
53, 0, 54, 55, 0, 56, 0, 0, 0, 57,
0, 58, 59, 60, 0, 61, 62, 63, 0, 64,
- 245, 0, 0, 246, 247, 0, 0, 5, 6, 7,
+ -609, 0, 0, -609, -609, 0, 0, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 0, 0, 65,
66, 67, 0, 15, 0, 16, 17, 18, 19, 0,
- 0, 248, 0, 249, 20, 21, 22, 23, 24, 25,
+ 0, -609, 0, -609, 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,
+ 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, 49, 50,
0, 0, 0, 0, 0, 51, 0, 0, 52, 53,
0, 54, 55, 0, 56, 0, 0, 0, 57, 0,
- 58, 59, 60, 0, 61, 62, 63, 0, 64, 245,
- 0, 0, 246, 247, 0, 0, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 0, 0, 0, 65, 66,
+ 58, 59, 60, 0, 61, 62, 63, 0, 64, 247,
+ 0, 0, 248, 249, 0, 0, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 0, 0, 65, 66,
67, 0, 15, 0, 16, 17, 18, 19, 0, 0,
- 248, 0, 249, 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,
+ 250, 0, 251, 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, 49, 50, 0,
- 0, 0, 0, 0, 211, 0, 0, 119, 53, 0,
- 54, 55, 0, 0, 0, 0, 0, 57, 0, 58,
- 59, 60, 0, 61, 62, 63, 0, 64, 245, 0,
- 0, 246, 247, 0, 0, 5, 6, 7, 8, 9,
+ 0, 0, 0, 0, 51, 0, 0, 52, 53, 0,
+ 54, 55, 0, 56, 0, 0, 0, 57, 0, 58,
+ 59, 60, 0, 61, 62, 63, 0, 64, 247, 0,
+ 0, 248, 249, 0, 0, 5, 6, 7, 8, 9,
10, 11, 12, 13, 0, 0, 0, 65, 66, 67,
- 0, 15, 0, 108, 109, 18, 19, 0, 0, 248,
- 0, 249, 110, 111, 112, 23, 24, 25, 26, 0,
- 0, 113, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 15, 0, 16, 17, 18, 19, 0, 0, 250,
+ 0, 251, 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, 49, 50, 0, 0,
0, 0, 0, 211, 0, 0, 119, 53, 0, 54,
55, 0, 0, 0, 0, 0, 57, 0, 58, 59,
- 60, 0, 61, 62, 63, 0, 64, 245, 0, 0,
- 246, 247, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 65, 262, 67, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 248, 0,
- 249, 131, 132, 133, 134, 135, 136, 137, 138, 139,
- 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
- 150, 151, 152, 153, 154, 0, 0, 0, 155, 156,
- 157, 158, 159, 160, 161, 162, 163, 164, 0, 0,
- 0, 0, 0, 165, 166, 167, 168, 169, 170, 171,
- 172, 36, 37, 173, 39, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 174, 175,
- 176, 177, 178, 179, 180, 181, 0, 0, 182, 183,
- 0, 0, 0, 0, 184, 185, 186, 187, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 188, 189,
- 190, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 60, 0, 61, 62, 63, 0, 64, 247, 0, 0,
+ 248, 249, 0, 0, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 0, 0, 0, 65, 66, 67, 0,
+ 15, 0, 108, 109, 18, 19, 0, 0, 250, 0,
+ 251, 110, 111, 112, 23, 24, 25, 26, 0, 0,
+ 113, 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, 49, 50, 0, 0, 0,
+ 0, 0, 211, 0, 0, 119, 53, 0, 54, 55,
+ 0, 0, 0, 0, 0, 57, 0, 58, 59, 60,
+ 0, 61, 62, 63, 0, 64, 247, 0, 0, 248,
+ 249, 0, 0, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 65, 264, 67, 0, 15,
+ 0, 16, 17, 18, 19, 0, 0, 250, 0, 251,
+ 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, 49, 50, 0, 0, 0, 0,
+ 0, 211, 0, 0, 119, 53, 0, 54, 55, 0,
+ 0, 0, 0, 0, 57, 0, 58, 59, 60, 0,
+ 61, 62, 63, 0, 64, 247, 0, 0, 248, 249,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 191, 192, 193, 194, 195, 196, 197, 198,
- 199, 200, 0, 201, 202, 0, 0, 0, 0, 0,
- 0, 203, 204, -577, -577, -577, -577, -577, -577, -577,
- -577, -577, 0, 0, 0, 0, 0, 0, 0, -577,
- 0, -577, -577, -577, -577, 0, -577, 0, 0, 0,
- -577, -577, -577, -577, -577, -577, -577, 0, 0, -577,
- 0, 0, 0, 0, 0, 0, 0, 0, -577, -577,
- -577, -577, -577, -577, -577, -577, -577, 0, -577, -577,
- -577, 0, 0, -577, 0, 0, -577, -577, 0, -577,
- -577, -577, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, -577, -577, 0, 0, 0, 0,
- 0, -577, 0, 0, -577, -577, 0, -577, -577, 0,
- -577, 0, -577, -577, -577, 0, -577, -577, -577, 0,
- -577, -577, -577, 0, -577, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 65, 66, 67, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 251, 131,
+ 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
+ 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 0, 0, 0, 155, 156, 157, 158,
+ 159, 160, 161, 162, 163, 164, 0, 0, 0, 0,
+ 0, 165, 166, 167, 168, 169, 170, 171, 172, 36,
+ 37, 173, 39, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 174, 175, 176, 177,
+ 178, 179, 180, 181, 0, 0, 182, 183, 0, 0,
+ 0, 0, 184, 185, 186, 187, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 188, 189, 190, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+ 0, 201, 202, 0, 0, 0, 0, 0, 0, 203,
+ 204, -579, -579, -579, -579, -579, -579, -579, -579, -579,
+ 0, 0, 0, 0, 0, 0, 0, -579, 0, -579,
+ -579, -579, -579, 0, -579, 0, 0, 0, -579, -579,
+ -579, -579, -579, -579, -579, 0, 0, -579, 0, 0,
+ 0, 0, 0, 0, 0, 0, -579, -579, -579, -579,
+ -579, -579, -579, -579, -579, 0, -579, -579, -579, 0,
+ 0, -579, 0, 0, -579, -579, 0, -579, -579, -579,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, -577, -577, -577, 0, -577, 0,
- 0, 0, 0, 0, -577, -578, -578, -578, -578, -578,
- -578, -578, -578, -578, 0, 0, 0, 0, 0, 0,
- 0, -578, 0, -578, -578, -578, -578, 0, -578, 0,
- 0, 0, -578, -578, -578, -578, -578, -578, -578, 0,
- 0, -578, 0, 0, 0, 0, 0, 0, 0, 0,
- -578, -578, -578, -578, -578, -578, -578, -578, -578, 0,
- -578, -578, -578, 0, 0, -578, 0, 0, -578, -578,
- 0, -578, -578, -578, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, -578, -578, 0, 0,
- 0, 0, 0, -578, 0, 0, -578, -578, 0, -578,
- -578, 0, -578, 0, -578, -578, -578, 0, -578, -578,
- -578, 0, -578, -578, -578, 0, -578, 0, 0, 0,
- 0, 0, 0, -580, -580, -580, -580, -580, -580, -580,
- -580, -580, 0, 0, 0, 0, -578, -578, -578, -580,
- -578, -580, -580, -580, -580, 0, -578, 0, 0, 0,
+ 0, 0, -579, -579, 0, 0, 0, 0, 0, -579,
+ 0, 0, -579, -579, 0, -579, -579, 0, -579, 0,
+ -579, -579, -579, 0, -579, -579, -579, 0, -579, -579,
+ -579, 0, -579, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -579, -579, -579, 0, -579, 0, 0, 0,
+ 0, 0, -579, -580, -580, -580, -580, -580, -580, -580,
+ -580, -580, 0, 0, 0, 0, 0, 0, 0, -580,
+ 0, -580, -580, -580, -580, 0, -580, 0, 0, 0,
-580, -580, -580, -580, -580, -580, -580, 0, 0, -580,
0, 0, 0, 0, 0, 0, 0, 0, -580, -580,
-580, -580, -580, -580, -580, -580, -580, 0, -580, -580,
-580, 0, 0, -580, 0, 0, -580, -580, 0, -580,
-580, -580, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -580, -580, 0, 0, 0, 0,
- 0, -580, 820, 0, -580, -580, 0, -580, -580, 0,
+ 0, -580, 0, 0, -580, -580, 0, -580, -580, 0,
-580, 0, -580, -580, -580, 0, -580, -580, -580, 0,
-580, -580, -580, 0, -580, 0, 0, 0, 0, 0,
- 0, -103, -581, -581, -581, -581, -581, -581, -581, -581,
- -581, 0, 0, 0, -580, -580, -580, 0, -581, 0,
- -581, -581, -581, -581, -580, 0, 0, 0, 0, -581,
- -581, -581, -581, -581, -581, -581, 0, 0, -581, 0,
- 0, 0, 0, 0, 0, 0, 0, -581, -581, -581,
- -581, -581, -581, -581, -581, -581, 0, -581, -581, -581,
- 0, 0, -581, 0, 0, -581, -581, 0, -581, -581,
- -581, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, -581, -581, 0, 0, 0, 0, 0,
- -581, 821, 0, -581, -581, 0, -581, -581, 0, -581,
- 0, -581, -581, -581, 0, -581, -581, -581, 0, -581,
- -581, -581, 0, -581, 0, 0, 0, 0, 0, 0,
- -105, -582, -582, -582, -582, -582, -582, -582, -582, -582,
- 0, 0, 0, -581, -581, -581, 0, -582, 0, -582,
- -582, -582, -582, -581, 0, 0, 0, 0, -582, -582,
+ 0, -582, -582, -582, -582, -582, -582, -582, -582, -582,
+ 0, 0, 0, 0, -580, -580, -580, -582, -580, -582,
+ -582, -582, -582, 0, -580, 0, 0, 0, -582, -582,
-582, -582, -582, -582, -582, 0, 0, -582, 0, 0,
0, 0, 0, 0, 0, 0, -582, -582, -582, -582,
-582, -582, -582, -582, -582, 0, -582, -582, -582, 0,
0, -582, 0, 0, -582, -582, 0, -582, -582, -582,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, -582, -582, 0, 0, 0, 0, 0, -582,
- 0, 0, -582, -582, 0, -582, -582, 0, -582, 0,
+ 826, 0, -582, -582, 0, -582, -582, 0, -582, 0,
-582, -582, -582, 0, -582, -582, -582, 0, -582, -582,
- -582, 0, -582, 0, 0, 0, 0, 0, 0, -583,
- -583, -583, -583, -583, -583, -583, -583, -583, 0, 0,
- 0, 0, -582, -582, -582, -583, 0, -583, -583, -583,
- -583, 0, -582, 0, 0, 0, -583, -583, -583, -583,
- -583, -583, -583, 0, 0, -583, 0, 0, 0, 0,
- 0, 0, 0, 0, -583, -583, -583, -583, -583, -583,
- -583, -583, -583, 0, -583, -583, -583, 0, 0, -583,
- 0, 0, -583, -583, 0, -583, -583, -583, 0, 0,
+ -582, 0, -582, 0, 0, 0, 0, 0, 0, -107,
+ -583, -583, -583, -583, -583, -583, -583, -583, -583, 0,
+ 0, 0, -582, -582, -582, 0, -583, 0, -583, -583,
+ -583, -583, -582, 0, 0, 0, 0, -583, -583, -583,
+ -583, -583, -583, -583, 0, 0, -583, 0, 0, 0,
+ 0, 0, 0, 0, 0, -583, -583, -583, -583, -583,
+ -583, -583, -583, -583, 0, -583, -583, -583, 0, 0,
+ -583, 0, 0, -583, -583, 0, -583, -583, -583, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -583, -583, 0, 0, 0, 0, 0, -583, 827,
+ 0, -583, -583, 0, -583, -583, 0, -583, 0, -583,
+ -583, -583, 0, -583, -583, -583, 0, -583, -583, -583,
+ 0, -583, 0, 0, 0, 0, 0, 0, -109, -584,
+ -584, -584, -584, -584, -584, -584, -584, -584, 0, 0,
+ 0, -583, -583, -583, 0, -584, 0, -584, -584, -584,
+ -584, -583, 0, 0, 0, 0, -584, -584, -584, -584,
+ -584, -584, -584, 0, 0, -584, 0, 0, 0, 0,
+ 0, 0, 0, 0, -584, -584, -584, -584, -584, -584,
+ -584, -584, -584, 0, -584, -584, -584, 0, 0, -584,
+ 0, 0, -584, -584, 0, -584, -584, -584, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -583, -583, 0, 0, 0, 0, 0, -583, 0, 0,
- -583, -583, 0, -583, -583, 0, -583, 0, -583, -583,
- -583, 0, -583, -583, -583, 0, -583, -583, -583, 0,
- -583, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -584, -584, 0, 0, 0, 0, 0, -584, 0, 0,
+ -584, -584, 0, -584, -584, 0, -584, 0, -584, -584,
+ -584, 0, -584, -584, -584, 0, -584, -584, -584, 0,
+ -584, 0, 0, 0, 0, 0, 0, -585, -585, -585,
+ -585, -585, -585, -585, -585, -585, 0, 0, 0, 0,
+ -584, -584, -584, -585, 0, -585, -585, -585, -585, 0,
+ -584, 0, 0, 0, -585, -585, -585, -585, -585, -585,
+ -585, 0, 0, -585, 0, 0, 0, 0, 0, 0,
+ 0, 0, -585, -585, -585, -585, -585, -585, -585, -585,
+ -585, 0, -585, -585, -585, 0, 0, -585, 0, 0,
+ -585, -585, 0, -585, -585, -585, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -585, -585,
+ 0, 0, 0, 0, 0, -585, 0, 0, -585, -585,
+ 0, -585, -585, 0, -585, 0, -585, -585, -585, 0,
+ -585, -585, -585, 0, -585, -585, -585, 0, -585, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -583, -583, -583, 0, 0, 0, 0, 0, 0, 0,
- -583, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+ 0, 0, 0, 0, 0, 0, 0, 0, -585, -585,
+ -585, 0, 0, 0, 0, 0, 0, 0, -585, 131,
+ 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
+ 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 0, 0, 0, 155, 156, 157, 233,
+ 234, 235, 236, 162, 163, 164, 0, 0, 0, 0,
+ 0, 165, 166, 167, 237, 238, 239, 240, 172, 319,
+ 320, 241, 321, 0, 0, 0, 0, 0, 0, 322,
+ 0, 0, 0, 0, 0, 0, 174, 175, 176, 177,
+ 178, 179, 180, 181, 0, 0, 182, 183, 0, 0,
+ 0, 0, 184, 185, 186, 187, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 188, 189, 190, 0,
+ 0, 0, 0, 323, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+ 0, 201, 202, 0, 0, 0, 0, 0, 0, 203,
+ 131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
+ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
+ 151, 152, 153, 154, 0, 0, 0, 155, 156, 157,
+ 233, 234, 235, 236, 162, 163, 164, 0, 0, 0,
+ 0, 0, 165, 166, 167, 237, 238, 239, 240, 172,
+ 319, 320, 241, 321, 0, 0, 0, 0, 0, 0,
+ 322, 0, 0, 0, 0, 0, 0, 174, 175, 176,
+ 177, 178, 179, 180, 181, 0, 0, 182, 183, 0,
+ 0, 0, 0, 184, 185, 186, 187, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 188, 189, 190,
+ 0, 0, 0, 0, 484, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 0, 201, 202, 0, 0, 0, 0, 0, 0,
+ 203, 131, 132, 133, 134, 135, 136, 137, 138, 139,
140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
150, 151, 152, 153, 154, 0, 0, 0, 155, 156,
- 157, 231, 232, 233, 234, 162, 163, 164, 0, 0,
- 0, 0, 0, 165, 166, 167, 235, 236, 237, 238,
- 172, 318, 319, 239, 320, 0, 0, 0, 0, 0,
- 0, 321, 0, 0, 0, 0, 0, 0, 174, 175,
+ 157, 233, 234, 235, 236, 162, 163, 164, 0, 0,
+ 0, 0, 0, 165, 166, 167, 237, 238, 239, 240,
+ 172, 0, 0, 241, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 174, 175,
176, 177, 178, 179, 180, 181, 0, 0, 182, 183,
0, 0, 0, 0, 184, 185, 186, 187, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 188, 189,
- 190, 0, 0, 0, 0, 322, 0, 0, 0, 0,
+ 190, 0, 0, 0, 242, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 191, 192, 193, 194, 195, 196, 197, 198,
199, 200, 0, 201, 202, 0, 0, 0, 0, 0,
0, 203, 131, 132, 133, 134, 135, 136, 137, 138,
139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
149, 150, 151, 152, 153, 154, 0, 0, 0, 155,
- 156, 157, 231, 232, 233, 234, 162, 163, 164, 0,
- 0, 0, 0, 0, 165, 166, 167, 235, 236, 237,
- 238, 172, 318, 319, 239, 320, 0, 0, 0, 0,
- 0, 0, 321, 0, 0, 0, 0, 0, 0, 174,
+ 156, 157, 233, 234, 235, 236, 162, 163, 164, 0,
+ 0, 0, 0, 0, 165, 166, 167, 237, 238, 239,
+ 240, 172, 0, 0, 241, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 174,
175, 176, 177, 178, 179, 180, 181, 0, 0, 182,
183, 0, 0, 0, 0, 184, 185, 186, 187, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 188,
- 189, 190, 0, 0, 0, 0, 481, 0, 0, 0,
+ 189, 190, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 191, 192, 193, 194, 195, 196, 197,
198, 199, 200, 0, 201, 202, 0, 0, 0, 0,
- 0, 0, 203, 131, 132, 133, 134, 135, 136, 137,
- 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
- 148, 149, 150, 151, 152, 153, 154, 0, 0, 0,
- 155, 156, 157, 231, 232, 233, 234, 162, 163, 164,
- 0, 0, 0, 0, 0, 165, 166, 167, 235, 236,
- 237, 238, 172, 0, 0, 239, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 174, 175, 176, 177, 178, 179, 180, 181, 0, 0,
- 182, 183, 0, 0, 0, 0, 184, 185, 186, 187,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 188, 189, 190, 0, 0, 0, 240, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 191, 192, 193, 194, 195, 196,
- 197, 198, 199, 200, 0, 201, 202, 0, 0, 0,
- 0, 0, 0, 203, 131, 132, 133, 134, 135, 136,
- 137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
- 147, 148, 149, 150, 151, 152, 153, 154, 0, 0,
- 0, 155, 156, 157, 231, 232, 233, 234, 162, 163,
- 164, 0, 0, 0, 0, 0, 165, 166, 167, 235,
- 236, 237, 238, 172, 0, 0, 239, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 174, 175, 176, 177, 178, 179, 180, 181, 0,
- 0, 182, 183, 0, 0, 0, 0, 184, 185, 186,
- 187, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 188, 189, 190, 0, 0, 0, 0, 0, 0,
+ 0, 0, 203, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 0, 0, 0, 0, 0, 0, 0, 15,
+ 0, 108, 109, 18, 19, 0, 0, 0, 0, 0,
+ 110, 111, 112, 23, 24, 25, 26, 0, 0, 113,
+ 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, 116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 191, 192, 193, 194, 195,
- 196, 197, 198, 199, 200, 0, 201, 202, 0, 0,
- 0, 0, 0, 0, 203, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 0, 0, 0, 0, 0, 0,
- 0, 15, 0, 108, 109, 18, 19, 0, 0, 0,
- 0, 0, 110, 111, 112, 23, 24, 25, 26, 0,
- 0, 113, 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, 116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 311, 0, 0, 119, 53, 0, 54,
- 55, 0, 0, 0, 0, 0, 57, 0, 58, 59,
- 60, 0, 61, 62, 63, 0, 64, 0, 0, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
- 0, 0, 0, 0, 0, 15, 120, 108, 109, 18,
- 19, 0, 0, 0, 312, 0, 110, 111, 112, 23,
- 24, 25, 26, 0, 0, 113, 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, 116, 0, 0, 0, 0,
+ 0, 312, 0, 0, 119, 53, 0, 54, 55, 0,
+ 0, 0, 0, 0, 57, 0, 58, 59, 60, 0,
+ 61, 62, 63, 0, 64, 0, 0, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
+ 0, 0, 0, 15, 120, 108, 109, 18, 19, 0,
+ 0, 0, 313, 0, 110, 111, 112, 23, 24, 25,
+ 26, 0, 0, 113, 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, 116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 311, 0, 0,
- 119, 53, 0, 54, 55, 0, 0, 0, 0, 0,
- 57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
- 64, 0, 0, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 0, 0, 0, 0, 0, 0, 15,
- 120, 16, 17, 18, 19, 0, 0, 0, 602, 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, 49, 50, 0, 0, 0, 0,
- 0, 51, 0, 0, 52, 53, 0, 54, 55, 0,
- 56, 0, 0, 0, 57, 0, 58, 59, 60, 0,
- 61, 62, 63, 0, 64, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 312, 0, 0, 119, 53,
+ 0, 54, 55, 0, 0, 0, 0, 0, 57, 0,
+ 58, 59, 60, 0, 61, 62, 63, 0, 64, 0,
0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 0, 0, 0, 65, 66, 67, 15, 0, 16,
- 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 14, 0, 0, 0, 0, 0, 0, 15, 120, 16,
+ 17, 18, 19, 0, 0, 0, 605, 0, 20, 21,
22, 23, 24, 25, 26, 0, 0, 27, 0, 0,
- 0, 0, 0, 28, 0, 30, 31, 32, 33, 34,
+ 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,
@@ -3268,126 +3322,126 @@ static const yytype_int16 yytable[] =
0, 0, 52, 53, 0, 54, 55, 0, 56, 0,
0, 0, 57, 0, 58, 59, 60, 0, 61, 62,
63, 0, 64, 0, 0, 0, 0, 0, 0, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
0, 0, 65, 66, 67, 15, 0, 16, 17, 18,
19, 0, 0, 0, 0, 0, 20, 21, 22, 23,
- 24, 25, 26, 0, 0, 113, 0, 0, 0, 0,
- 0, 0, 0, 0, 31, 32, 33, 258, 35, 36,
+ 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,
- 49, 50, 0, 0, 0, 0, 0, 211, 0, 0,
- 119, 53, 0, 54, 55, 0, 259, 0, 260, 261,
+ 49, 50, 0, 0, 0, 0, 0, 51, 0, 0,
+ 52, 53, 0, 54, 55, 0, 56, 0, 0, 0,
57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
64, 0, 0, 0, 0, 0, 0, 5, 6, 7,
8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
- 65, 262, 67, 15, 0, 16, 17, 18, 19, 0,
+ 65, 66, 67, 15, 0, 16, 17, 18, 19, 0,
0, 0, 0, 0, 20, 21, 22, 23, 24, 25,
26, 0, 0, 113, 0, 0, 0, 0, 0, 0,
- 0, 0, 31, 32, 33, 258, 35, 36, 37, 38,
+ 0, 0, 31, 32, 33, 260, 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, 49, 503,
+ 0, 0, 0, 0, 0, 0, 0, 0, 49, 50,
0, 0, 0, 0, 0, 211, 0, 0, 119, 53,
- 0, 54, 55, 0, 259, 0, 260, 261, 57, 0,
+ 0, 54, 55, 0, 261, 0, 262, 263, 57, 0,
58, 59, 60, 0, 61, 62, 63, 0, 64, 0,
0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 0, 0, 0, 0, 65, 262,
- 67, 15, 0, 108, 109, 18, 19, 0, 0, 0,
- 0, 0, 110, 111, 112, 23, 24, 25, 26, 0,
+ 10, 11, 12, 13, 0, 0, 0, 0, 65, 264,
+ 67, 15, 0, 16, 17, 18, 19, 0, 0, 0,
+ 0, 0, 20, 21, 22, 23, 24, 25, 26, 0,
0, 113, 0, 0, 0, 0, 0, 0, 0, 0,
- 31, 32, 33, 258, 35, 36, 37, 38, 39, 0,
+ 31, 32, 33, 260, 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, 49, 50, 0, 0,
+ 0, 0, 0, 0, 0, 0, 49, 505, 0, 0,
0, 0, 0, 211, 0, 0, 119, 53, 0, 54,
- 55, 0, 712, 0, 260, 261, 57, 0, 58, 59,
+ 55, 0, 261, 0, 262, 263, 57, 0, 58, 59,
60, 0, 61, 62, 63, 0, 64, 0, 0, 0,
0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 0, 0, 0, 0, 65, 262, 67, 15,
+ 12, 13, 0, 0, 0, 0, 65, 264, 67, 15,
0, 108, 109, 18, 19, 0, 0, 0, 0, 0,
110, 111, 112, 23, 24, 25, 26, 0, 0, 113,
0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
- 33, 258, 35, 36, 37, 38, 39, 0, 40, 41,
+ 33, 260, 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, 49, 838, 0, 0, 0, 0,
+ 0, 0, 0, 0, 49, 50, 0, 0, 0, 0,
0, 211, 0, 0, 119, 53, 0, 54, 55, 0,
- 712, 0, 260, 261, 57, 0, 58, 59, 60, 0,
+ 716, 0, 262, 263, 57, 0, 58, 59, 60, 0,
61, 62, 63, 0, 64, 0, 0, 0, 0, 0,
0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 0, 0, 0, 0, 65, 262, 67, 15, 0, 108,
+ 0, 0, 0, 0, 65, 264, 67, 15, 0, 108,
109, 18, 19, 0, 0, 0, 0, 0, 110, 111,
112, 23, 24, 25, 26, 0, 0, 113, 0, 0,
- 0, 0, 0, 0, 0, 0, 31, 32, 33, 258,
+ 0, 0, 0, 0, 0, 0, 31, 32, 33, 260,
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, 49, 50, 0, 0, 0, 0, 0, 211,
- 0, 0, 119, 53, 0, 54, 55, 0, 259, 0,
- 260, 0, 57, 0, 58, 59, 60, 0, 61, 62,
+ 0, 0, 49, 843, 0, 0, 0, 0, 0, 211,
+ 0, 0, 119, 53, 0, 54, 55, 0, 716, 0,
+ 262, 263, 57, 0, 58, 59, 60, 0, 61, 62,
63, 0, 64, 0, 0, 0, 0, 0, 0, 5,
6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
- 0, 0, 65, 262, 67, 15, 0, 108, 109, 18,
+ 0, 0, 65, 264, 67, 15, 0, 108, 109, 18,
19, 0, 0, 0, 0, 0, 110, 111, 112, 23,
24, 25, 26, 0, 0, 113, 0, 0, 0, 0,
- 0, 0, 0, 0, 31, 32, 33, 258, 35, 36,
+ 0, 0, 0, 0, 31, 32, 33, 260, 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,
49, 50, 0, 0, 0, 0, 0, 211, 0, 0,
- 119, 53, 0, 54, 55, 0, 0, 0, 260, 261,
+ 119, 53, 0, 54, 55, 0, 261, 0, 262, 0,
57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
64, 0, 0, 0, 0, 0, 0, 5, 6, 7,
8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
- 65, 262, 67, 15, 0, 108, 109, 18, 19, 0,
+ 65, 264, 67, 15, 0, 108, 109, 18, 19, 0,
0, 0, 0, 0, 110, 111, 112, 23, 24, 25,
26, 0, 0, 113, 0, 0, 0, 0, 0, 0,
- 0, 0, 31, 32, 33, 258, 35, 36, 37, 38,
+ 0, 0, 31, 32, 33, 260, 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, 49, 50,
0, 0, 0, 0, 0, 211, 0, 0, 119, 53,
- 0, 54, 55, 0, 712, 0, 260, 0, 57, 0,
+ 0, 54, 55, 0, 0, 0, 262, 263, 57, 0,
58, 59, 60, 0, 61, 62, 63, 0, 64, 0,
0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 0, 0, 0, 0, 65, 262,
+ 10, 11, 12, 13, 0, 0, 0, 0, 65, 264,
67, 15, 0, 108, 109, 18, 19, 0, 0, 0,
0, 0, 110, 111, 112, 23, 24, 25, 26, 0,
0, 113, 0, 0, 0, 0, 0, 0, 0, 0,
- 31, 32, 33, 258, 35, 36, 37, 38, 39, 0,
+ 31, 32, 33, 260, 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, 49, 50, 0, 0,
0, 0, 0, 211, 0, 0, 119, 53, 0, 54,
- 55, 0, 0, 0, 260, 0, 57, 0, 58, 59,
+ 55, 0, 716, 0, 262, 0, 57, 0, 58, 59,
60, 0, 61, 62, 63, 0, 64, 0, 0, 0,
0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 0, 0, 0, 0, 65, 262, 67, 15,
- 0, 16, 17, 18, 19, 0, 0, 0, 0, 0,
- 20, 21, 22, 23, 24, 25, 26, 0, 0, 113,
+ 12, 13, 0, 0, 0, 0, 65, 264, 67, 15,
+ 0, 108, 109, 18, 19, 0, 0, 0, 0, 0,
+ 110, 111, 112, 23, 24, 25, 26, 0, 0, 113,
0, 0, 0, 0, 0, 0, 0, 0, 31, 32,
- 33, 34, 35, 36, 37, 38, 39, 0, 40, 41,
+ 33, 260, 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, 49, 50, 0, 0, 0, 0,
0, 211, 0, 0, 119, 53, 0, 54, 55, 0,
- 596, 0, 0, 0, 57, 0, 58, 59, 60, 0,
+ 0, 0, 262, 0, 57, 0, 58, 59, 60, 0,
61, 62, 63, 0, 64, 0, 0, 0, 0, 0,
0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 0, 0, 0, 0, 65, 262, 67, 15, 0, 108,
- 109, 18, 19, 0, 0, 0, 0, 0, 110, 111,
- 112, 23, 24, 25, 26, 0, 0, 113, 0, 0,
+ 0, 0, 0, 0, 65, 264, 67, 15, 0, 16,
+ 17, 18, 19, 0, 0, 0, 0, 0, 20, 21,
+ 22, 23, 24, 25, 26, 0, 0, 113, 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, 49, 50, 0, 0, 0, 0, 0, 211,
- 0, 0, 119, 53, 0, 54, 55, 0, 259, 0,
+ 0, 0, 119, 53, 0, 54, 55, 0, 599, 0,
0, 0, 57, 0, 58, 59, 60, 0, 61, 62,
63, 0, 64, 0, 0, 0, 0, 0, 0, 5,
6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
- 0, 0, 65, 262, 67, 15, 0, 108, 109, 18,
+ 0, 0, 65, 264, 67, 15, 0, 108, 109, 18,
19, 0, 0, 0, 0, 0, 110, 111, 112, 23,
24, 25, 26, 0, 0, 113, 0, 0, 0, 0,
0, 0, 0, 0, 31, 32, 33, 34, 35, 36,
@@ -3395,11 +3449,11 @@ static const yytype_int16 yytable[] =
0, 0, 44, 45, 0, 46, 47, 48, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49, 50, 0, 0, 0, 0, 0, 211, 0, 0,
- 119, 53, 0, 54, 55, 0, 596, 0, 0, 0,
+ 119, 53, 0, 54, 55, 0, 261, 0, 0, 0,
57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
64, 0, 0, 0, 0, 0, 0, 5, 6, 7,
8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
- 65, 262, 67, 15, 0, 108, 109, 18, 19, 0,
+ 65, 264, 67, 15, 0, 108, 109, 18, 19, 0,
0, 0, 0, 0, 110, 111, 112, 23, 24, 25,
26, 0, 0, 113, 0, 0, 0, 0, 0, 0,
0, 0, 31, 32, 33, 34, 35, 36, 37, 38,
@@ -3407,10 +3461,10 @@ static const yytype_int16 yytable[] =
44, 45, 0, 46, 47, 48, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 49, 50,
0, 0, 0, 0, 0, 211, 0, 0, 119, 53,
- 0, 54, 55, 0, 881, 0, 0, 0, 57, 0,
+ 0, 54, 55, 0, 599, 0, 0, 0, 57, 0,
58, 59, 60, 0, 61, 62, 63, 0, 64, 0,
0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 0, 0, 0, 0, 65, 262,
+ 10, 11, 12, 13, 0, 0, 0, 0, 65, 264,
67, 15, 0, 108, 109, 18, 19, 0, 0, 0,
0, 0, 110, 111, 112, 23, 24, 25, 26, 0,
0, 113, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3419,24 +3473,24 @@ static const yytype_int16 yytable[] =
0, 46, 47, 48, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 49, 50, 0, 0,
0, 0, 0, 211, 0, 0, 119, 53, 0, 54,
- 55, 0, 712, 0, 0, 0, 57, 0, 58, 59,
+ 55, 0, 888, 0, 0, 0, 57, 0, 58, 59,
60, 0, 61, 62, 63, 0, 64, 0, 0, 0,
0, 0, 0, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 0, 0, 0, 0, 65, 262, 67, 15,
- 0, 16, 17, 18, 19, 0, 0, 0, 0, 0,
- 20, 21, 22, 23, 24, 25, 26, 0, 0, 27,
+ 12, 13, 0, 0, 0, 0, 65, 264, 67, 15,
+ 0, 108, 109, 18, 19, 0, 0, 0, 0, 0,
+ 110, 111, 112, 23, 24, 25, 26, 0, 0, 113,
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, 49, 50, 0, 0, 0, 0,
0, 211, 0, 0, 119, 53, 0, 54, 55, 0,
- 0, 0, 0, 0, 57, 0, 58, 59, 60, 0,
+ 716, 0, 0, 0, 57, 0, 58, 59, 60, 0,
61, 62, 63, 0, 64, 0, 0, 0, 0, 0,
0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 0, 0, 0, 0, 65, 66, 67, 15, 0, 108,
- 109, 18, 19, 0, 0, 0, 0, 0, 110, 111,
- 112, 23, 24, 25, 26, 0, 0, 113, 0, 0,
+ 0, 0, 0, 0, 65, 264, 67, 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,
@@ -3446,8 +3500,8 @@ static const yytype_int16 yytable[] =
0, 0, 57, 0, 58, 59, 60, 0, 61, 62,
63, 0, 64, 0, 0, 0, 0, 0, 0, 5,
6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
- 0, 0, 65, 262, 67, 15, 0, 16, 17, 18,
- 19, 0, 0, 0, 0, 0, 20, 21, 22, 23,
+ 0, 0, 65, 66, 67, 15, 0, 108, 109, 18,
+ 19, 0, 0, 0, 0, 0, 110, 111, 112, 23,
24, 25, 26, 0, 0, 113, 0, 0, 0, 0,
0, 0, 0, 0, 31, 32, 33, 34, 35, 36,
37, 38, 39, 0, 40, 41, 42, 0, 0, 43,
@@ -3458,49 +3512,38 @@ static const yytype_int16 yytable[] =
57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
64, 0, 0, 0, 0, 0, 0, 5, 6, 7,
8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
- 65, 262, 67, 15, 0, 108, 109, 18, 19, 0,
- 0, 0, 0, 0, 110, 111, 112, 23, 24, 25,
+ 65, 264, 67, 15, 0, 16, 17, 18, 19, 0,
+ 0, 0, 0, 0, 20, 21, 22, 23, 24, 25,
26, 0, 0, 113, 0, 0, 0, 0, 0, 0,
- 0, 0, 31, 32, 33, 114, 35, 36, 37, 115,
+ 0, 0, 31, 32, 33, 34, 35, 36, 37, 38,
39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
- 44, 45, 0, 116, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 117, 0, 0, 118, 0, 0, 119, 53,
+ 44, 45, 0, 46, 47, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 49, 50,
+ 0, 0, 0, 0, 0, 211, 0, 0, 119, 53,
0, 54, 55, 0, 0, 0, 0, 0, 57, 0,
58, 59, 60, 0, 61, 62, 63, 0, 64, 0,
- 0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 0, 0, 0, 0, 0, 0, 0, 15, 120, 108,
- 109, 18, 19, 0, 0, 0, 0, 0, 110, 111,
- 112, 23, 24, 25, 26, 0, 0, 113, 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, 223, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 224,
- 0, 0, 52, 53, 0, 54, 55, 0, 56, 0,
- 0, 0, 57, 0, 58, 59, 60, 0, 61, 62,
- 63, 0, 64, 0, 0, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 0, 0, 0, 0, 0, 0,
- 0, 15, 120, 108, 109, 18, 19, 0, 0, 0,
+ 0, 0, 0, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 65, 264,
+ 67, 15, 0, 108, 109, 18, 19, 0, 0, 0,
0, 0, 110, 111, 112, 23, 24, 25, 26, 0,
0, 113, 0, 0, 0, 0, 0, 0, 0, 0,
- 31, 32, 33, 34, 35, 36, 37, 38, 39, 0,
+ 31, 32, 33, 114, 35, 36, 37, 115, 39, 0,
40, 41, 42, 0, 0, 43, 0, 0, 44, 45,
0, 116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 311, 0, 0, 396, 53, 0, 54,
- 55, 0, 397, 0, 0, 0, 57, 0, 58, 59,
+ 117, 0, 0, 118, 0, 0, 119, 53, 0, 54,
+ 55, 0, 0, 0, 0, 0, 57, 0, 58, 59,
60, 0, 61, 62, 63, 0, 64, 0, 0, 5,
6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
0, 0, 0, 0, 0, 15, 120, 108, 109, 18,
19, 0, 0, 0, 0, 0, 110, 111, 112, 23,
24, 25, 26, 0, 0, 113, 0, 0, 0, 0,
- 0, 0, 0, 0, 31, 32, 33, 114, 35, 36,
- 37, 115, 39, 0, 40, 41, 42, 0, 0, 43,
- 0, 0, 44, 45, 0, 116, 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, 225, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 118, 0, 0,
- 119, 53, 0, 54, 55, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 226, 0, 0,
+ 52, 53, 0, 54, 55, 0, 56, 0, 0, 0,
57, 0, 58, 59, 60, 0, 61, 62, 63, 0,
64, 0, 0, 5, 6, 7, 8, 9, 10, 11,
12, 13, 0, 0, 0, 0, 0, 0, 0, 15,
@@ -3511,18 +3554,18 @@ static const yytype_int16 yytable[] =
42, 0, 0, 43, 0, 0, 44, 45, 0, 116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 311, 0, 0, 396, 53, 0, 54, 55, 0,
- 0, 0, 0, 0, 57, 0, 58, 59, 60, 0,
+ 0, 312, 0, 0, 397, 53, 0, 54, 55, 0,
+ 398, 0, 0, 0, 57, 0, 58, 59, 60, 0,
61, 62, 63, 0, 64, 0, 0, 5, 6, 7,
8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
0, 0, 0, 15, 120, 108, 109, 18, 19, 0,
0, 0, 0, 0, 110, 111, 112, 23, 24, 25,
26, 0, 0, 113, 0, 0, 0, 0, 0, 0,
- 0, 0, 31, 32, 33, 34, 35, 36, 37, 38,
+ 0, 0, 31, 32, 33, 114, 35, 36, 37, 115,
39, 0, 40, 41, 42, 0, 0, 43, 0, 0,
44, 45, 0, 116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 946, 0, 0, 119, 53,
+ 0, 0, 0, 0, 0, 118, 0, 0, 119, 53,
0, 54, 55, 0, 0, 0, 0, 0, 57, 0,
58, 59, 60, 0, 61, 62, 63, 0, 64, 0,
0, 5, 6, 7, 8, 9, 10, 11, 12, 13,
@@ -3531,20 +3574,60 @@ static const yytype_int16 yytable[] =
112, 23, 24, 25, 26, 0, 0, 113, 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, 223, 0, 0,
+ 0, 43, 0, 0, 44, 45, 0, 116, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 312,
+ 0, 0, 397, 53, 0, 54, 55, 0, 0, 0,
+ 0, 0, 57, 0, 58, 59, 60, 0, 61, 62,
+ 63, 0, 64, 0, 0, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 0, 0, 0, 0, 0, 0,
+ 0, 15, 120, 108, 109, 18, 19, 0, 0, 0,
+ 0, 0, 110, 111, 112, 23, 24, 25, 26, 0,
+ 0, 113, 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, 116, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 955, 0, 0, 119, 53, 0, 54,
+ 55, 0, 0, 0, 0, 0, 57, 0, 58, 59,
+ 60, 0, 61, 62, 63, 0, 64, 0, 0, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 0, 0,
+ 0, 0, 0, 0, 0, 15, 120, 108, 109, 18,
+ 19, 0, 0, 0, 0, 0, 110, 111, 112, 23,
+ 24, 25, 26, 0, 0, 113, 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, 225, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 978, 0, 0,
+ 119, 53, 0, 54, 55, 0, 0, 644, 645, 0,
+ 57, 646, 58, 59, 60, 0, 61, 62, 63, 0,
+ 64, 0, 0, 0, 0, 0, 174, 175, 176, 177,
+ 178, 179, 180, 181, 0, 0, 182, 183, 0, 0,
+ 120, 0, 184, 185, 186, 187, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 188, 189, 190, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+ 0, 201, 202, 653, 654, 0, 0, 655, 0, 203,
+ 275, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 174, 175, 176, 177, 178, 179, 180, 181,
+ 0, 0, 182, 183, 0, 0, 0, 0, 184, 185,
+ 186, 187, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 188, 189, 190, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 969,
- 0, 0, 119, 53, 0, 54, 55, 0, 0, 656,
- 651, 0, 57, 657, 58, 59, 60, 0, 61, 62,
- 63, 0, 64, 0, 0, 0, 0, 0, 174, 175,
+ 0, 0, 0, 0, 0, 0, 191, 192, 193, 194,
+ 195, 196, 197, 198, 199, 200, 0, 201, 202, 674,
+ 645, 0, 0, 675, 0, 203, 275, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 174, 175,
176, 177, 178, 179, 180, 181, 0, 0, 182, 183,
- 0, 0, 120, 0, 184, 185, 186, 187, 0, 0,
+ 0, 0, 0, 0, 184, 185, 186, 187, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 188, 189,
190, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 191, 192, 193, 194, 195, 196, 197, 198,
- 199, 200, 0, 201, 202, 686, 642, 0, 0, 687,
- 0, 203, 273, 0, 0, 0, 0, 0, 0, 0,
+ 199, 200, 0, 201, 202, 659, 654, 0, 0, 660,
+ 0, 203, 275, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 174, 175, 176, 177, 178, 179,
180, 181, 0, 0, 182, 183, 0, 0, 0, 0,
184, 185, 186, 187, 0, 0, 0, 0, 0, 0,
@@ -3552,7 +3635,7 @@ static const yytype_int16 yytable[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 191, 192,
193, 194, 195, 196, 197, 198, 199, 200, 0, 201,
- 202, 689, 651, 0, 0, 690, 0, 203, 273, 0,
+ 202, 691, 645, 0, 0, 692, 0, 203, 275, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
174, 175, 176, 177, 178, 179, 180, 181, 0, 0,
182, 183, 0, 0, 0, 0, 184, 185, 186, 187,
@@ -3560,8 +3643,8 @@ static const yytype_int16 yytable[] =
188, 189, 190, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 191, 192, 193, 194, 195, 196,
- 197, 198, 199, 200, 0, 201, 202, 696, 642, 0,
- 0, 697, 0, 203, 273, 0, 0, 0, 0, 0,
+ 197, 198, 199, 200, 0, 201, 202, 694, 654, 0,
+ 0, 695, 0, 203, 275, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 174, 175, 176, 177,
178, 179, 180, 181, 0, 0, 182, 183, 0, 0,
0, 0, 184, 185, 186, 187, 0, 0, 0, 0,
@@ -3569,16 +3652,16 @@ static const yytype_int16 yytable[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
- 0, 201, 202, 699, 651, 0, 0, 700, 0, 203,
- 273, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 201, 202, 701, 645, 0, 0, 702, 0, 203,
+ 275, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 174, 175, 176, 177, 178, 179, 180, 181,
0, 0, 182, 183, 0, 0, 0, 0, 184, 185,
186, 187, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 188, 189, 190, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 191, 192, 193, 194,
- 195, 196, 197, 198, 199, 200, 0, 201, 202, 735,
- 642, 0, 0, 736, 0, 203, 273, 0, 0, 0,
+ 195, 196, 197, 198, 199, 200, 0, 201, 202, 704,
+ 654, 0, 0, 705, 0, 203, 275, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 174, 175,
176, 177, 178, 179, 180, 181, 0, 0, 182, 183,
0, 0, 0, 0, 184, 185, 186, 187, 0, 0,
@@ -3586,8 +3669,8 @@ static const yytype_int16 yytable[] =
190, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 191, 192, 193, 194, 195, 196, 197, 198,
- 199, 200, 0, 201, 202, 738, 651, 0, 0, 739,
- 0, 203, 273, 0, 0, 0, 0, 0, 0, 0,
+ 199, 200, 0, 201, 202, 739, 645, 0, 0, 740,
+ 0, 203, 275, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 174, 175, 176, 177, 178, 179,
180, 181, 0, 0, 182, 183, 0, 0, 0, 0,
184, 185, 186, 187, 0, 0, 0, 0, 0, 0,
@@ -3595,7 +3678,7 @@ static const yytype_int16 yytable[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 191, 192,
193, 194, 195, 196, 197, 198, 199, 200, 0, 201,
- 202, 886, 642, 0, 0, 887, 0, 203, 273, 0,
+ 202, 742, 654, 0, 0, 743, 0, 203, 275, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
174, 175, 176, 177, 178, 179, 180, 181, 0, 0,
182, 183, 0, 0, 0, 0, 184, 185, 186, 187,
@@ -3603,8 +3686,8 @@ static const yytype_int16 yytable[] =
188, 189, 190, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 191, 192, 193, 194, 195, 196,
- 197, 198, 199, 200, 0, 201, 202, 889, 651, 0,
- 0, 890, 0, 203, 273, 0, 0, 0, 0, 0,
+ 197, 198, 199, 200, 0, 201, 202, 893, 645, 0,
+ 0, 894, 0, 203, 275, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 174, 175, 176, 177,
178, 179, 180, 181, 0, 0, 182, 183, 0, 0,
0, 0, 184, 185, 186, 187, 0, 0, 0, 0,
@@ -3612,16 +3695,16 @@ static const yytype_int16 yytable[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
- 0, 201, 202, 1028, 642, 0, 0, 1029, 0, 203,
- 273, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 201, 202, 896, 654, 0, 0, 897, 0, 203,
+ 275, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 174, 175, 176, 177, 178, 179, 180, 181,
0, 0, 182, 183, 0, 0, 0, 0, 184, 185,
186, 187, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 188, 189, 190, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 191, 192, 193, 194,
- 195, 196, 197, 198, 199, 200, 0, 201, 202, 1040,
- 642, 0, 0, 1041, 0, 203, 273, 0, 0, 0,
+ 195, 196, 197, 198, 199, 200, 0, 201, 202, 1037,
+ 645, 0, 0, 1038, 0, 203, 275, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 174, 175,
176, 177, 178, 179, 180, 181, 0, 0, 182, 183,
0, 0, 0, 0, 184, 185, 186, 187, 0, 0,
@@ -3629,8 +3712,8 @@ static const yytype_int16 yytable[] =
190, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 191, 192, 193, 194, 195, 196, 197, 198,
- 199, 200, 0, 201, 202, 1043, 651, 0, 0, 1044,
- 0, 203, 273, 0, 0, 0, 0, 0, 0, 0,
+ 199, 200, 0, 201, 202, 1049, 645, 0, 0, 1050,
+ 0, 203, 275, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 174, 175, 176, 177, 178, 179,
180, 181, 0, 0, 182, 183, 0, 0, 0, 0,
184, 185, 186, 187, 0, 0, 0, 0, 0, 0,
@@ -3638,612 +3721,602 @@ static const yytype_int16 yytable[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 191, 192,
193, 194, 195, 196, 197, 198, 199, 200, 0, 201,
- 202, 656, 651, 0, 0, 657, 0, 203, 273, 0,
+ 202, 1052, 654, 0, 0, 1053, 0, 203, 275, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
174, 175, 176, 177, 178, 179, 180, 181, 0, 0,
182, 183, 0, 0, 0, 0, 184, 185, 186, 187,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
188, 189, 190, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 855, 0, 0, 0,
- 0, 0, 0, 0, 191, 192, 193, 194, 195, 196,
- 197, 198, 199, 200, 0, 201, 202, 0, 0, 0,
- 0, 0, 0, 203, 400, 401, 402, 403, 404, 405,
- 406, 407, 408, 409, 410, 411, 0, 0, 0, 0,
- 412, 413, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 415, 0, 0, 0, 0, 866, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 416, 0, 417, 418, 419, 420,
- 421, 422, 423, 424, 425, 426, 400, 401, 402, 403,
- 404, 405, 406, 407, 408, 409, 410, 411, 0, 0,
- 0, 0, 412, 413, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 415, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 416, 0, 417, 418,
- 419, 420, 421, 422, 423, 424, 425, 426, 400, 401,
- 402, 403, 404, 405, 406, 407, 408, 409, 410, 411,
- 0, 0, 0, 0, 412, 413, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 415, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 416, 0,
- 417, 418, 419, 420, 421, 422, 423, 424, 425, 426,
- 400, 401, 402, 403, 404, 405, 406, 407, 408, 409,
- 410, 411, 0, 0, 249, 0, 412, 413, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 415,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 416, 0, 417, 418, 419, 420, 421, 422, 423, 424,
- 425, 426, 0, 0, 0, 0, 0, 0, 0, 0,
- -273, 400, 401, 402, 403, 404, 405, 406, 407, 408,
- 409, 410, 411, 0, 0, 0, 0, 412, 413, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 415, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 416, 0, 417, 418, 419, 420, 421, 422, 423,
- 424, 425, 426, 0, 0, 0, 0, 0, 0, 0,
- 0, -274, 400, 401, 402, 403, 404, 405, 406, 407,
- 408, 409, 410, 411, 0, 0, 0, 0, 412, 413,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 415, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 416, 0, 417, 418, 419, 420, 421, 422,
- 423, 424, 425, 426, 0, 0, 0, 0, 0, 0,
- 0, 0, -275, 400, 401, 402, 403, 404, 405, 406,
- 407, 408, 409, 410, 411, 0, 0, 0, 0, 412,
- 413, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 415, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 416, 0, 417, 418, 419, 420, 421,
- 422, 423, 424, 425, 426, 0, 0, 0, 0, 0,
- 0, 0, 0, -276, 400, 401, 402, 403, 404, 405,
- 406, 407, 408, 409, 410, 411, 0, 0, 0, 0,
- 412, 413, 0, 0, 0, 414, 0, 0, 0, 0,
- 0, 0, 0, 415, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 191, 192, 193, 194, 195, 196,
+ 197, 198, 199, 200, 0, 201, 202, 659, 654, 0,
+ 0, 660, 0, 203, 275, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 174, 175, 176, 177,
+ 178, 179, 180, 181, 0, 0, 182, 183, 0, 0,
+ 0, 0, 184, 185, 186, 187, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 188, 189, 190, 0,
+ 0, 401, 402, 403, 404, 405, 406, 407, 408, 409,
+ 410, 411, 412, 0, 0, 0, 0, 413, 414, 0,
+ 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+ 416, 201, 202, 0, 0, 0, 0, 0, 0, 203,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 416, 0, 417, 418, 419, 420,
- 421, 422, 423, 424, 425, 426, 400, 401, 402, 403,
- 404, 405, 406, 407, 408, 409, 410, 411, 0, 0,
- 0, 0, 412, 413, 0, 0, 0, 495, 0, 0,
- 0, 0, 0, 0, 0, 415, 0, 0, 0, 0,
+ 0, 417, 0, 418, 419, 420, 421, 422, 423, 424,
+ 425, 426, 427, 0, 0, 0, 0, 0, 0, 0,
+ 0, -278, 401, 402, 403, 404, 405, 406, 407, 408,
+ 409, 410, 411, 412, 0, 0, 0, 0, 413, 414,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 416, 0, 417, 418,
- 419, 420, 421, 422, 423, 424, 425, 426, 400, 401,
- 402, 403, 404, 405, 406, 407, 408, 409, 410, 411,
- 0, 0, 0, 0, 412, 413, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 415, 0, 0,
+ 0, 416, 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, 416, 0,
- 417, 418, 419, 420, 421, 422, 423, 424, 425, 426,
- 400, 401, 402, 403, 404, 405, 406, 407, 408, 409,
- -608, -608, 0, 0, 0, 0, 412, 413, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 415,
+ 0, 0, 417, 0, 418, 419, 420, 421, 422, 423,
+ 424, 425, 426, 427, 0, 0, 0, 0, 0, 0,
+ 0, 0, -279, 401, 402, 403, 404, 405, 406, 407,
+ 408, 409, 410, 411, 412, 0, 0, 0, 0, 413,
+ 414, 0, 0, 0, 415, 0, 0, 0, 0, 0,
+ 0, 0, 416, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 417, 0, 418, 419, 420, 421, 422,
+ 423, 424, 425, 426, 427, 401, 402, 403, 404, 405,
+ 406, 407, 408, 409, 410, 411, 412, 0, 0, 0,
+ 0, 413, 414, 0, 0, 0, 497, 0, 0, 0,
+ 0, 0, 0, 0, 416, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 417, 418, 419, 420, 421, 422, 423, 424,
- 425, 426
+ 0, 0, 0, 0, 0, 417, 0, 418, 419, 420,
+ 421, 422, 423, 424, 425, 426, 427, 401, 402, 403,
+ 404, 405, 406, 407, 408, 409, 410, 411, 412, 0,
+ 0, 0, 0, 413, 414, 401, 402, 403, 404, 405,
+ 406, 0, 0, 409, 410, 0, 416, 0, 0, 0,
+ 0, 413, 414, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 416, 0, 0, 417, 0, 418,
+ 419, 420, 421, 422, 423, 424, 425, 426, 427, 0,
+ 0, 0, 0, 0, 0, 0, 0, 418, 419, 420,
+ 421, 422, 423, 424, 425, 426, 427
};
static const yytype_int16 yycheck[] =
{
- 2, 16, 17, 89, 220, 20, 27, 69, 475, 27,
- 2, 56, 4, 5, 6, 484, 82, 9, 10, 21,
- 66, 13, 7, 15, 16, 17, 429, 7, 20, 14,
- 14, 118, 4, 52, 87, 88, 269, 772, 312, 54,
- 55, 305, 28, 28, 28, 309, 16, 17, 22, 15,
- 20, 454, 54, 55, 74, 75, 329, 375, 584, 399,
- 52, 16, 17, 748, 56, 20, 469, 587, 540, 5,
- 6, 317, 74, 58, 66, 478, 91, 13, 58, 584,
- 502, 60, 61, 62, 63, 490, 21, 22, 16, 17,
- 82, 25, 20, 10, 659, 660, 16, 26, 15, 54,
- 55, 121, 122, 69, 772, 5, 6, 954, 26, 111,
- 532, 294, 57, 13, 90, 370, 931, 79, 29, 682,
- 56, 367, 2, 25, 4, 117, 90, 119, 691, 51,
- 602, 105, 25, 27, 5, 6, 391, 0, 92, 542,
- 25, 105, 13, 92, 92, 584, 82, 25, 587, 75,
- 103, 25, 330, 25, 142, 333, 56, 335, 28, 337,
- 148, 339, 427, 216, 126, 25, 431, 121, 92, 434,
- 105, 147, 121, 121, 227, 128, 111, 112, 123, 101,
- 102, 103, 82, 147, 1031, 56, 791, 138, 142, 384,
- 455, 386, 797, 90, 129, 115, 122, 121, 118, 119,
- 498, 456, 113, 468, 502, 470, 128, 1022, 142, 138,
- 144, 82, 57, 396, 479, 144, 951, 490, 210, 954,
- 138, 115, 142, 55, 118, 119, 146, 753, 148, 221,
- 222, 439, 440, 121, 296, 288, 90, 802, 9, 10,
- 142, 144, 304, 305, 15, 148, 312, 309, 753, 142,
- 147, 936, 146, 518, 148, 240, 90, 142, 273, 144,
- 240, 314, 277, 142, 142, 267, 540, 269, 142, 90,
- 142, 273, 90, 121, 507, 294, 121, 550, 543, 92,
- 948, 273, 142, 951, 250, 277, 954, 90, 956, 281,
- 282, 121, 92, 147, 286, 92, 1031, 317, 544, 125,
- 722, 293, 294, 273, 221, 222, 711, 277, 780, 301,
- 92, 92, 142, 147, 753, 90, 37, 38, 90, 52,
- 312, 121, 277, 90, 121, 144, 147, 853, 602, 147,
- 296, 58, 59, 772, 51, 861, 1004, 857, 55, 121,
- 121, 681, 142, 322, 147, 142, 117, 367, 394, 277,
- 92, 144, 397, 399, 346, 347, 348, 349, 350, 351,
- 352, 353, 829, 1031, 927, 1033, 453, 1035, 399, 1037,
- 548, 373, 147, 375, 346, 147, 312, 396, 370, 121,
- 147, 60, 785, 18, 63, 20, 119, 92, 92, 1057,
- 92, 16, 17, 439, 440, 20, 55, 92, 121, 391,
- 142, 92, 394, 55, 396, 397, 25, 399, 439, 440,
- 58, 59, 312, 293, 429, 670, 121, 121, 857, 121,
- 142, 301, 20, 721, 722, 951, 121, 429, 107, 54,
- 347, 348, 349, 350, 142, 708, 57, 429, 711, 454,
- 758, 312, 17, 18, 868, 869, 431, 439, 440, 434,
- 221, 222, 454, 115, 469, 138, 118, 119, 927, 429,
- 462, 397, 454, 478, 456, 457, 346, 469, 732, 101,
- 455, 351, 538, 465, 540, 496, 478, 469, 496, 74,
- 75, 473, 715, 498, 454, 470, 478, 502, 145, 115,
- 706, 483, 118, 119, 479, 793, 431, 397, 1024, 469,
- 141, 121, 367, 139, 506, 507, 780, 929, 478, 1035,
- 281, 282, 951, 515, 529, 954, 55, 532, 773, 784,
- 455, 786, 148, 515, 544, 142, 397, 542, 514, 514,
- 514, 101, 524, 518, 61, 470, 602, 64, 65, 505,
- 542, 92, 101, 498, 479, 800, 538, 267, 540, 269,
- 542, 142, 121, 286, 872, 873, 92, 549, 543, 612,
- 61, 294, 835, 64, 65, 121, 101, 762, 763, 764,
- 121, 766, 542, 768, 529, 51, 347, 348, 349, 350,
- 788, 352, 353, 518, 304, 121, 794, 795, 142, 116,
- 117, 846, 1031, 595, 129, 130, 131, 132, 133, 92,
- 655, 92, 538, 658, 540, 90, 839, 51, 543, 630,
- 602, 2, 630, 4, 1017, 116, 117, 142, 9, 10,
- 105, 676, 142, 142, 15, 16, 17, 51, 121, 20,
- 121, 929, 121, 115, 142, 515, 118, 119, 538, 51,
- 540, 99, 15, 13, 524, 16, 63, 649, 273, 142,
- 577, 142, 277, 655, 909, 140, 658, 659, 660, 144,
- 15, 52, 147, 396, 298, 145, 602, 538, 302, 540,
- 732, 145, 646, 139, 676, 66, 15, 669, 670, 681,
- 682, 655, 684, 142, 658, 1003, 457, 142, 15, 691,
- 898, 142, 44, 121, 679, 141, 16, 913, 141, 679,
- 15, 18, 602, 919, 141, 570, 721, 722, 141, 701,
- 139, 646, 798, 715, 780, 26, 702, 702, 702, 740,
- 655, 15, 587, 658, 139, 590, 117, 141, 119, 148,
- 139, 602, 465, 57, 142, 142, 782, 142, 142, 674,
- 473, 676, 788, 789, 939, 940, 941, 942, 794, 795,
- 483, 782, 669, 1018, 142, 15, 758, 788, 93, 14,
- 145, 90, 16, 794, 795, 15, 721, 90, 15, 394,
- 785, 146, 15, 142, 399, 101, 105, 142, 793, 90,
- 142, 773, 105, 785, 701, 142, 506, 507, 780, 781,
- 782, 142, 141, 785, 105, 115, 788, 789, 118, 119,
- 802, 786, 794, 795, 15, 131, 132, 133, 800, 801,
- 812, 140, 15, 815, 213, 785, 549, 140, 147, 210,
- 16, 220, 814, 139, 147, 817, 146, 138, 148, 140,
- 221, 222, 1027, 144, 826, 827, 147, 839, 793, 577,
- 15, 15, 834, 581, 780, 772, 142, 868, 869, 139,
- 126, 786, 898, 126, 846, 847, 55, 139, 257, 15,
- 55, 115, 487, 142, 118, 119, 15, 898, 142, 503,
- 872, 873, 62, 142, 64, 65, 510, 142, 870, 599,
- 780, 142, 273, 875, 142, 144, 277, 521, 144, 141,
- 281, 282, 146, 142, 148, 286, 90, 515, 669, 13,
- 817, 781, 293, 294, 6, 1020, 898, 772, 772, 780,
- 301, 105, 1022, 799, 929, 1019, 908, 909, 971, 115,
- 912, 252, 118, 119, 916, 927, 116, 117, 7, 649,
- 701, 577, 948, 90, 870, 268, -1, 571, 572, 875,
- 951, -1, 62, 26, 64, 65, 140, 346, 105, -1,
- 146, -1, 148, 147, -1, 346, 347, 348, 349, 350,
- 351, 352, 353, 984, -1, -1, 984, 601, 877, 878,
- 870, -1, -1, 90, -1, 875, 912, -1, 377, 370,
- -1, -1, 974, 140, 976, -1, 706, 979, 105, -1,
- 147, -1, 857, -1, 859, 715, 116, 117, 863, 870,
- 391, 1003, 1017, 394, 875, 396, 115, 90, 399, 118,
- 119, -1, 912, -1, -1, 1017, -1, 1019, 1020, -1,
- -1, 948, 105, 140, 951, 1017, -1, 954, -1, 956,
- 147, -1, -1, 1018, 772, -1, 145, 146, 429, 148,
- -1, 912, 951, -1, 678, -1, 817, 1017, 439, 440,
- -1, -1, -1, 37, 38, 138, 681, 140, -1, 26,
- -1, 144, -1, 454, 147, 456, 457, -1, 801, 934,
- 935, -1, -1, -1, 465, 474, 475, 1004, 469, -1,
- -1, 814, 473, 1018, 26, -1, -1, 478, -1, 954,
- -1, 956, 483, 826, 827, -1, -1, 731, 1007, 1008,
- 1009, 834, 1011, 1012, 1031, -1, 1033, -1, 1035, -1,
- 1037, -1, -1, -1, 847, 749, -1, -1, 26, 839,
- -1, 26, -1, 90, 515, 524, 991, -1, -1, 994,
- 1057, 115, 531, 524, 118, 119, 115, -1, 105, 118,
- 119, -1, 1051, 1052, 1053, 1054, 439, 440, 90, 9,
- 10, 542, 1061, -1, -1, 15, 16, 17, 549, -1,
- 20, 1026, 146, 105, 148, -1, 1031, 146, 1033, 148,
- -1, 138, 1037, 140, -1, 908, -1, 144, 471, 472,
- 147, -1, 90, 916, -1, 90, -1, 47, 48, 49,
- 50, -1, 1057, -1, 54, 55, 138, 105, 140, 90,
- 105, -1, 144, -1, 838, 147, 66, 67, 90, -1,
- 948, -1, -1, 951, 105, -1, 954, -1, 956, -1,
- 854, -1, -1, 105, -1, -1, 519, -1, -1, -1,
- 138, -1, 140, 138, -1, 140, 144, -1, -1, 147,
- -1, 974, 147, 976, -1, -1, 979, -1, 90, 140,
- -1, 51, 52, -1, -1, 55, 147, 117, 140, 63,
- 64, 65, -1, 105, -1, 147, 1004, -1, -1, 668,
- 70, 71, 72, 73, 74, 75, 76, 77, 669, 670,
- 80, 81, -1, -1, -1, -1, 86, 87, 88, 89,
- -1, -1, -1, 1031, -1, 1033, -1, 1035, 140, 1037,
- 100, 101, 102, 90, -1, 147, 90, 706, 90, -1,
- 701, -1, 116, 117, -1, -1, -1, -1, 105, 1057,
- -1, 105, -1, 105, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, -1, 135, 136, 51, -1, 53,
- 54, 55, 56, 143, 144, -1, 51, -1, 53, 54,
- 55, 56, -1, 140, -1, 69, 140, 90, 140, -1,
- 147, 221, 222, 147, 69, 147, 2, -1, 4, 5,
- 6, 51, 105, 53, 54, 55, 56, 13, -1, -1,
- -1, -1, 773, 40, 41, 42, 43, 44, -1, 69,
- 781, 782, -1, -1, 785, -1, -1, 788, 789, 259,
- 260, 261, 262, 794, 795, 804, -1, 140, -1, 800,
- 801, -1, 90, 273, 147, -1, 52, 277, -1, -1,
- 56, 281, 282, 814, -1, 90, 817, 105, 142, 51,
- 829, 53, 54, 55, 56, 826, 827, 142, -1, -1,
- 105, -1, -1, 834, -1, -1, 82, 69, -1, -1,
- 63, 64, 65, -1, -1, 846, 847, -1, -1, 63,
- 64, 65, 140, 85, -1, -1, -1, 115, -1, 147,
- 118, 119, 94, -1, -1, 140, -1, -1, 100, 101,
- 102, 103, 147, 119, 63, 64, 65, 347, 348, 349,
- 350, -1, 352, 353, 142, 788, 789, -1, 146, -1,
- 148, 794, 795, 116, 117, -1, 128, 898, -1, 131,
- -1, 371, 116, 117, 913, -1, -1, 908, 909, -1,
- 919, -1, 382, -1, -1, 916, -1, 820, 821, -1,
- 823, 824, -1, -1, 394, -1, -1, 116, 117, 399,
- 400, 401, 402, 403, 404, 405, 406, 407, 408, 409,
- 410, 411, 412, 413, -1, 415, 416, 417, 418, 419,
- 420, 421, 422, 423, 424, 425, 426, -1, -1, 429,
- 63, 64, 65, -1, 210, -1, 63, 64, 65, 439,
- 440, -1, -1, 974, -1, 976, -1, -1, 979, -1,
- -1, 63, 64, 65, 454, -1, 51, 457, 53, 54,
- 55, 56, 63, 64, 65, 898, -1, 467, -1, 469,
- -1, 471, 472, -1, 69, -1, -1, -1, 478, 88,
- 89, -1, -1, 116, 117, -1, 1017, 487, 921, 116,
- 117, 491, 101, -1, -1, 495, -1, -1, 498, 94,
- 500, -1, 502, 503, 116, 117, 101, 102, 103, -1,
- 286, -1, -1, -1, -1, 116, 117, 293, 294, 519,
- 129, 130, 131, 132, 133, 301, -1, -1, -1, 529,
- -1, -1, 532, 128, -1, -1, 312, -1, -1, -1,
- -1, -1, 542, -1, -1, -1, -1, -1, 51, -1,
- 53, 54, 55, 56, -1, -1, -1, -1, 558, 559,
- 2, -1, 4, 5, 6, 7, 69, -1, -1, -1,
- 346, 13, -1, -1, 574, 351, -1, -1, -1, -1,
- -1, -1, -1, 51, -1, 53, 54, 55, 56, -1,
- -1, 94, -1, 593, 370, -1, 596, 100, 101, 102,
- 103, 69, -1, -1, -1, -1, -1, -1, -1, -1,
- 52, -1, -1, -1, 56, 391, -1, -1, 121, -1,
- 396, 397, -1, 399, -1, 128, 94, -1, 131, -1,
- -1, -1, 100, 51, -1, 53, 54, 55, 56, -1,
- 82, 144, -1, 51, -1, 53, 54, 55, 56, -1,
- -1, 69, -1, 51, -1, 53, 54, 55, 56, -1,
- -1, 69, -1, 439, 440, -1, -1, -1, -1, 669,
- -1, 69, -1, -1, -1, -1, 94, 119, -1, -1,
- 456, 681, 100, 101, 102, 103, 94, -1, -1, 465,
- -1, -1, 100, 101, 102, 103, 94, 473, -1, -1,
- -1, 701, 100, 101, 102, 103, -1, 483, -1, -1,
- 128, -1, 712, 131, 51, -1, 53, 54, 55, 56,
- 128, 721, 722, 131, -1, -1, 144, -1, -1, -1,
- 128, -1, 69, 131, -1, -1, 144, -1, -1, 515,
- -1, -1, -1, -1, 142, -1, -1, 51, 524, 53,
- 54, 55, 56, -1, -1, -1, 2, 94, 4, -1,
- -1, -1, 538, 100, 540, 69, -1, 13, 210, -1,
- -1, -1, -1, 549, -1, -1, -1, 777, -1, -1,
- -1, -1, 782, 783, -1, 785, -1, -1, 788, 789,
- 94, -1, -1, 793, 794, 795, -1, 51, -1, 53,
- 54, 55, 56, -1, -1, -1, 52, -1, -1, -1,
- -1, -1, -1, -1, -1, 69, -1, 817, -1, -1,
- 820, 821, -1, 823, 824, -1, 602, -1, -1, -1,
- -1, 85, -1, 833, -1, -1, -1, -1, 838, -1,
- 94, -1, -1, -1, 286, -1, 100, 101, 102, 103,
- -1, 293, 294, -1, -1, 855, -1, -1, -1, 301,
- -1, -1, -1, -1, -1, -1, 866, -1, -1, -1,
- 312, 88, 89, 119, 128, -1, -1, 131, -1, -1,
- -1, 881, -1, -1, 101, -1, -1, -1, -1, -1,
- -1, 891, 892, -1, 670, -1, -1, -1, 898, -1,
- -1, -1, 44, -1, 346, -1, -1, -1, -1, 351,
- -1, 128, 129, 130, 131, 132, 133, 2, -1, 4,
- -1, 921, -1, -1, -1, -1, -1, -1, 370, 929,
+ 2, 27, 69, 284, 89, 87, 88, 28, 66, 271,
+ 2, 10, 4, 5, 6, 487, 15, 9, 10, 21,
+ 7, 13, 52, 15, 16, 17, 7, 22, 20, 82,
+ 16, 17, 4, 14, 20, 215, 478, 543, 313, 400,
+ 5, 6, 222, 222, 56, 14, 752, 28, 13, 15,
+ 440, 441, 54, 55, 16, 17, 430, 306, 20, 28,
+ 52, 310, 21, 22, 56, 590, 504, 778, 376, 75,
+ 587, 58, 74, 75, 66, 75, 2, 58, 4, 259,
+ 118, 455, 16, 17, 52, 330, 20, 25, 295, 318,
+ 82, 56, 54, 55, 371, 685, 938, 535, 472, 605,
+ 27, 29, 963, 69, 662, 663, 696, 481, 500, 111,
+ 105, 25, 504, 0, 26, 392, 122, 82, 16, 17,
+ 57, 331, 20, 26, 334, 117, 336, 119, 338, 91,
+ 340, 60, 61, 62, 63, 79, 218, 25, 269, 368,
+ 271, 25, 587, 51, 90, 590, 105, 229, 593, 25,
+ 103, 119, 111, 112, 144, 25, 54, 55, 138, 25,
+ 25, 61, 797, 60, 64, 65, 63, 347, 803, 55,
+ 129, 545, 90, 92, 305, 128, 121, 16, 17, 1040,
+ 457, 20, 126, 28, 121, 113, 121, 105, 115, 1031,
+ 397, 118, 119, 101, 102, 103, 90, 142, 378, 51,
+ 90, 147, 121, 55, 142, 400, 144, 289, 214, 142,
+ 107, 213, 214, 213, 214, 54, 116, 117, 210, 146,
+ 128, 148, 140, 142, 223, 224, 138, 90, 142, 147,
+ 297, 223, 224, 315, 92, 138, 121, 943, 305, 306,
+ 757, 144, 105, 310, 90, 440, 441, 509, 90, 960,
+ 808, 144, 963, 147, 142, 242, 144, 147, 142, 105,
+ 313, 242, 18, 90, 20, 295, 142, 269, 543, 271,
+ 125, 428, 142, 275, 57, 432, 142, 142, 435, 55,
+ 786, 121, 90, 275, 147, 92, 252, 279, 726, 275,
+ 55, 283, 284, 279, 140, 287, 90, 477, 478, 456,
+ 25, 147, 294, 295, 142, 147, 90, 20, 553, 90,
+ 302, 105, 757, 275, 471, 57, 473, 279, 547, 287,
+ 147, 313, 142, 684, 138, 482, 101, 295, 90, 1040,
+ 605, 297, 115, 725, 726, 118, 119, 395, 863, 147,
+ 123, 551, 400, 145, 934, 279, 140, 527, 313, 348,
+ 349, 350, 351, 147, 534, 347, 348, 349, 350, 351,
+ 352, 353, 354, 147, 521, 148, 147, 397, 294, 92,
+ 90, 385, 374, 387, 376, 347, 302, 508, 509, 371,
+ 92, 279, 440, 441, 92, 147, 398, 61, 121, 546,
+ 64, 65, 141, 835, 323, 139, 673, 55, 121, 142,
+ 392, 37, 38, 395, 794, 397, 398, 799, 400, 121,
+ 800, 801, 92, 121, 101, 101, 454, 791, 863, 142,
+ 865, 347, 867, 92, 869, 101, 352, 147, 430, 397,
+ 142, 9, 10, 398, 715, 92, 275, 15, 430, 121,
+ 279, 121, 116, 117, 430, 131, 132, 133, 440, 441,
+ 142, 432, 121, 455, 435, 763, 658, 719, 121, 661,
+ 51, 463, 934, 455, 121, 457, 458, 90, 430, 455,
+ 472, 602, 498, 432, 92, 456, 468, 679, 142, 481,
+ 472, 142, 105, 142, 476, 142, 472, 736, 541, 481,
+ 543, 671, 473, 455, 486, 481, 517, 456, 936, 92,
+ 468, 482, 779, 121, 51, 92, 508, 509, 476, 142,
+ 472, 786, 793, 51, 473, 905, 518, 140, 486, 481,
+ 121, 652, 142, 482, 147, 92, 518, 587, 121, 806,
+ 51, 711, 711, 615, 121, 527, 517, 99, 500, 117,
+ 521, 507, 504, 545, 936, 58, 59, 15, 517, 541,
+ 92, 543, 605, 545, 121, 142, 395, 92, 1003, 545,
+ 552, 400, 521, 13, 62, 546, 64, 65, 92, 850,
+ 532, 879, 880, 535, 851, 142, 541, 121, 543, 121,
+ 711, 121, 844, 545, 552, 577, 121, 546, 719, 440,
+ 441, 577, 518, 788, 16, 368, 598, 121, 63, 794,
+ 15, 527, 500, 139, 596, 800, 801, 633, 115, 92,
+ 596, 118, 119, 605, 2, 145, 4, 145, 116, 117,
+ 92, 9, 10, 474, 475, 58, 59, 15, 16, 17,
+ 810, 142, 20, 790, 532, 792, 17, 18, 121, 916,
+ 605, 148, 142, 299, 26, 223, 224, 303, 15, 121,
+ 652, 490, 1026, 15, 649, 835, 658, 875, 876, 661,
+ 662, 663, 587, 658, 52, 590, 661, 92, 142, 736,
+ 44, 522, 115, 672, 121, 118, 119, 679, 66, 141,
+ 672, 673, 684, 685, 141, 115, 707, 689, 118, 119,
+ 649, 63, 64, 65, 696, 682, 121, 757, 15, 658,
+ 18, 682, 661, 141, 1012, 283, 284, 706, 90, 141,
+ 905, 121, 122, 844, 706, 139, 15, 719, 677, 804,
+ 679, 139, 141, 105, 90, 62, 707, 64, 65, 117,
+ 788, 119, 139, 786, 90, 90, 794, 795, 707, 105,
+ 920, 920, 800, 801, 116, 117, 926, 926, 142, 105,
+ 105, 1032, 44, 767, 768, 769, 138, 771, 140, 773,
+ 57, 763, 144, 725, 726, 147, 142, 142, 90, 142,
+ 348, 349, 350, 351, 140, 353, 354, 142, 144, 116,
+ 117, 147, 580, 105, 140, 140, 584, 779, 44, 791,
+ 16, 147, 147, 15, 786, 787, 788, 93, 858, 791,
+ 573, 14, 794, 795, 15, 791, 808, 867, 800, 801,
+ 15, 792, 145, 142, 806, 807, 818, 590, 140, 821,
+ 593, 786, 210, 142, 823, 147, 16, 725, 820, 791,
+ 142, 823, 757, 792, 142, 223, 224, 799, 142, 807,
+ 832, 833, 844, 15, 15, 684, 141, 905, 840, 505,
+ 139, 15, 820, 778, 778, 15, 512, 15, 90, 851,
+ 852, 787, 139, 142, 832, 833, 126, 126, 524, 16,
+ 1027, 115, 840, 105, 118, 119, 55, 879, 880, 15,
+ 458, 139, 55, 15, 852, 877, 141, 275, 142, 115,
+ 882, 279, 118, 119, 142, 283, 284, 142, 980, 287,
+ 960, 799, 146, 142, 148, 142, 294, 295, 140, 580,
+ 144, 142, 877, 905, 302, 147, 142, 882, 574, 575,
+ 146, 142, 148, 915, 916, 115, 144, 919, 118, 119,
+ 142, 923, 934, 947, 948, 949, 950, 518, 863, 6,
+ 13, 1029, 778, 794, 795, 1031, 805, 915, 604, 800,
+ 801, 1028, 254, 7, 919, 923, 146, 960, 148, 347,
+ 348, 349, 350, 351, 352, 353, 354, 993, 115, 884,
+ 885, 118, 119, 1033, 936, 826, 827, 580, 829, 830,
+ 778, 957, -1, 371, 1044, -1, -1, 2, -1, 4,
+ -1, 983, -1, 985, -1, -1, 988, -1, 13, 146,
+ -1, 148, -1, -1, 392, 778, -1, 395, -1, 397,
+ 1012, 16, 400, -1, -1, 983, 90, 985, -1, 101,
+ 988, -1, 1036, -1, 1026, 681, 1028, 1029, 63, 64,
+ 65, 105, -1, 957, 1026, 960, 960, 52, 963, 963,
+ 1026, 965, 430, 37, 38, 960, 1027, 129, 130, 131,
+ 132, 133, 440, 441, 905, 63, 64, 65, 51, 26,
+ 53, 54, 55, 56, 1026, -1, 140, 455, 1027, 457,
+ 458, -1, -1, 147, -1, -1, 69, 928, -1, 735,
+ 468, 116, 117, -1, 472, -1, -1, -1, 476, 1013,
+ 863, -1, 865, 481, 672, -1, 869, 753, 486, -1,
+ -1, 1016, 1017, 1018, 119, 1020, 1021, 778, 116, 117,
+ 115, -1, -1, 118, 119, 1040, 1040, 26, 1042, -1,
+ 1044, 115, 1046, 90, 118, 119, -1, -1, 706, -1,
+ 518, -1, 51, -1, 53, 54, 55, 56, 105, 527,
+ -1, 146, 1066, 148, -1, 1060, 1061, 1062, 1063, 142,
+ 69, -1, 146, -1, 148, 1070, -1, 545, -1, 957,
+ 90, 90, 960, -1, 552, 963, -1, 965, 941, 942,
+ -1, 138, -1, 140, -1, 105, 105, 144, -1, -1,
+ 147, 90, 90, 90, -1, 26, 26, 843, -1, 577,
+ 963, -1, 965, -1, -1, 210, 105, 105, 105, 26,
+ -1, -1, -1, 859, -1, -1, -1, -1, 596, -1,
+ 140, 140, -1, 9, 10, 1013, -1, 147, 147, 15,
+ 16, 17, -1, 142, 20, -1, 90, 1000, -1, 138,
+ 1003, 140, 140, 140, -1, 144, -1, -1, 147, 147,
+ 147, 105, 1040, -1, 1042, 823, 1044, -1, 1046, 90,
+ 90, 47, 48, 49, 50, 63, 64, 65, 54, 55,
+ -1, -1, 1035, 90, 105, 105, -1, 1040, 1066, 1042,
+ 66, 67, 287, 1046, -1, -1, 140, -1, 105, 294,
+ 295, -1, -1, 147, 672, 673, 957, 302, -1, 960,
+ -1, -1, 963, 1066, 965, -1, -1, 138, 138, 140,
+ 140, -1, -1, 144, 144, -1, 147, 147, 116, 117,
+ -1, 138, 51, 140, 53, 54, 55, 56, 706, -1,
+ 147, 117, -1, -1, -1, 63, 64, 65, -1, -1,
+ 69, -1, 347, 63, 64, 65, -1, 352, -1, -1,
+ -1, -1, 1013, 63, 64, 65, -1, -1, 63, 64,
+ 65, -1, -1, -1, -1, 94, 371, -1, -1, -1,
+ -1, 100, 101, 102, 103, -1, -1, -1, -1, 1040,
+ -1, 1042, -1, 1044, -1, 1046, -1, 392, 116, 117,
+ -1, -1, 397, -1, -1, 400, 116, 117, -1, 128,
+ 115, 779, 131, 118, 119, 1066, 116, 117, -1, 787,
+ 788, 116, 117, 791, -1, 144, 794, 795, -1, -1,
+ -1, -1, 800, 801, -1, -1, -1, -1, 806, 807,
+ 145, 146, -1, 148, -1, 440, 441, 223, 224, -1,
+ -1, -1, 820, 88, 89, 823, 51, -1, 53, 54,
+ 55, 56, 457, -1, 832, 833, 101, 40, 41, 42,
+ 43, 44, 840, 468, 69, -1, -1, -1, -1, -1,
+ -1, 476, 44, 851, 852, 261, 262, 263, 264, -1,
+ -1, 486, -1, 128, 129, 130, 131, 132, 133, 275,
+ -1, -1, 115, 279, -1, 118, 119, 283, 284, -1,
72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, -1, -1, -1, -1, 88, 89, -1, 391,
- -1, -1, -1, -1, 396, 397, -1, -1, -1, 101,
- -1, -1, -1, -1, 210, -1, -1, 52, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 82, 83, -1, 518, -1, -1, 88, 89, -1, 142,
+ -1, -1, 527, 146, -1, 148, -1, 905, -1, 101,
+ -1, 51, -1, 53, 54, 55, 56, 915, 916, -1,
+ 115, -1, -1, 118, 119, 923, -1, 552, -1, 69,
122, -1, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133, -1, -1, -1, -1, -1, 773, -1, -1,
- 142, -1, -1, -1, 780, 781, 782, -1, -1, -1,
- -1, -1, 788, -1, 456, -1, -1, 1017, 794, 795,
- -1, -1, -1, 465, 800, 801, -1, -1, -1, -1,
- -1, 473, -1, -1, 119, -1, -1, -1, 814, -1,
- 286, 483, -1, -1, -1, -1, -1, 293, 294, -1,
- 826, 827, -1, -1, -1, 301, -1, -1, 834, -1,
- -1, 51, -1, 53, 54, 55, 56, -1, -1, -1,
- 846, 847, -1, 515, -1, -1, 88, 89, -1, 69,
- -1, -1, 524, -1, -1, -1, -1, -1, -1, 101,
- -1, -1, -1, -1, 870, -1, 538, -1, 540, 875,
- 346, -1, -1, -1, 94, 351, -1, 549, -1, -1,
- 100, 101, 102, 103, 126, 127, 128, 129, 130, 131,
- 132, 133, 898, -1, 370, 210, 72, 73, 74, 75,
- 76, 77, 908, 909, 80, 81, 912, -1, 128, -1,
- 916, 131, 88, 89, -1, 391, -1, -1, -1, -1,
- 396, -1, -1, 399, -1, 101, -1, -1, -1, -1,
- 602, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, -1, -1,
- -1, -1, -1, 439, 440, -1, -1, -1, 974, -1,
- 976, 286, -1, 979, -1, -1, -1, -1, 293, 294,
- 456, -1, -1, -1, -1, -1, 301, -1, -1, 465,
- -1, -1, -1, -1, -1, -1, -1, 473, 670, -1,
- 0, -1, -1, -1, -1, -1, -1, 483, -1, -1,
- -1, -1, -1, 13, 14, 15, 16, 17, 18, -1,
- 20, -1, -1, -1, -1, -1, 26, 27, -1, -1,
- -1, 346, -1, -1, -1, -1, 351, 37, 38, 515,
- 40, 41, 42, 43, 44, -1, -1, -1, 524, -1,
- -1, -1, -1, -1, -1, 370, -1, -1, -1, -1,
+ 132, 133, 348, 349, 350, 351, -1, 353, 354, -1,
+ 142, 146, -1, 148, 94, -1, -1, -1, -1, -1,
+ 100, 101, 102, 103, -1, -1, 372, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 383, -1, -1,
+ -1, -1, -1, -1, -1, 983, -1, 985, 128, 395,
+ 988, 131, -1, -1, 400, 401, 402, 403, 404, 405,
+ 406, 407, 408, 409, 410, 411, 412, 413, 414, -1,
+ 416, 417, 418, 419, 420, 421, 422, 423, 424, 425,
+ 426, 427, -1, -1, 430, -1, -1, 51, 1026, 53,
+ 54, 55, 56, -1, 440, 441, -1, 51, -1, 53,
+ 54, 55, 56, -1, -1, 69, -1, -1, 673, 455,
+ -1, -1, 458, -1, 51, 69, 53, 54, 55, 56,
+ -1, -1, -1, -1, 470, -1, 472, -1, 474, 475,
+ 94, -1, 69, -1, -1, 481, 100, -1, -1, -1,
+ 94, -1, -1, -1, 490, -1, 100, 493, -1, -1,
+ -1, 497, -1, -1, 500, -1, 502, 94, 504, 505,
+ 88, 89, -1, 100, 101, 102, 103, 2, -1, 4,
+ 5, 6, -1, 101, -1, -1, 522, 51, 13, 53,
+ 54, 55, 56, -1, 121, -1, 532, -1, -1, 535,
+ -1, 128, -1, -1, 131, 69, -1, -1, -1, 545,
+ -1, 129, 130, 131, 132, 133, -1, 144, 51, -1,
+ 53, 54, 55, 56, 779, 561, 562, 52, -1, -1,
+ 94, 56, 787, 788, -1, -1, 69, -1, -1, 794,
+ -1, 577, -1, -1, -1, 800, 801, -1, -1, -1,
+ -1, 806, 807, -1, -1, -1, -1, 82, -1, -1,
+ 596, 94, -1, 599, -1, 820, -1, 100, 101, 102,
+ 103, -1, -1, -1, 88, 89, -1, 832, 833, -1,
+ -1, -1, -1, -1, -1, 840, -1, 101, -1, -1,
+ -1, -1, -1, -1, 119, 128, 851, 852, 131, -1,
+ -1, -1, -1, -1, 51, -1, 53, 54, 55, 56,
+ -1, 144, 126, 127, 128, 129, 130, 131, 132, 133,
+ -1, -1, 69, -1, -1, -1, 51, -1, 53, 54,
+ 55, 56, -1, -1, -1, -1, 672, -1, -1, -1,
+ -1, -1, -1, -1, 69, -1, -1, 94, 684, -1,
+ 905, 687, 688, 100, 101, 102, 103, -1, -1, -1,
+ 915, 916, -1, 2, 919, 4, 5, 6, 923, 94,
+ 706, -1, -1, -1, 13, -1, 101, 102, 103, -1,
+ 716, 128, -1, -1, 131, 210, -1, -1, -1, 725,
+ 726, -1, -1, -1, 0, 142, -1, -1, -1, -1,
+ -1, -1, -1, 128, -1, -1, -1, 13, 14, 15,
+ 16, 17, 18, 52, 20, -1, -1, 56, -1, -1,
+ 26, 27, -1, -1, -1, -1, -1, -1, 983, -1,
+ 985, 37, 38, 988, 40, 41, 42, 43, 44, -1,
+ -1, -1, -1, 82, -1, -1, -1, 783, -1, -1,
+ -1, -1, 788, 789, -1, 791, -1, -1, 794, 795,
+ -1, -1, 287, 799, 800, 801, -1, -1, -1, 294,
+ 295, -1, -1, -1, -1, -1, -1, 302, -1, -1,
+ 119, -1, -1, -1, 90, -1, -1, 823, 313, -1,
+ 826, 827, -1, 829, 830, -1, -1, -1, -1, 105,
+ -1, -1, -1, 839, -1, -1, -1, 843, -1, 115,
+ -1, -1, 118, 119, -1, -1, -1, -1, -1, -1,
+ -1, -1, 347, -1, 860, 861, -1, 352, -1, -1,
+ -1, -1, 138, 139, -1, -1, 872, 873, 144, 145,
+ 146, 147, 148, -1, -1, -1, 371, -1, -1, -1,
+ -1, -1, 888, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 898, 899, -1, -1, -1, 392, -1, 905,
+ -1, 210, 397, 398, -1, 400, -1, 51, -1, 53,
+ 54, 55, 56, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 928, -1, -1, 69, -1, -1, -1, -1,
+ 936, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 85, -1, -1, -1, 440, 441, -1, -1, -1,
+ 94, -1, -1, -1, -1, -1, 100, 101, 102, 103,
+ -1, -1, 457, -1, 2, -1, 4, 5, 6, -1,
+ -1, -1, -1, 468, -1, 13, -1, -1, 287, -1,
+ -1, 476, -1, -1, 128, 294, 295, 131, -1, -1,
+ -1, 486, -1, 302, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 313, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 52, -1, -1, -1, 56, -1,
+ 1026, -1, -1, 518, -1, -1, -1, -1, -1, -1,
+ -1, -1, 527, -1, -1, 44, -1, -1, 347, -1,
+ -1, -1, -1, 352, 82, -1, 541, -1, 543, -1,
+ -1, -1, -1, -1, -1, -1, -1, 552, -1, -1,
+ -1, -1, 371, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, -1, -1, -1, -1, 88,
+ 89, 119, -1, 392, -1, -1, -1, -1, 397, 398,
+ -1, 400, 101, 51, -1, 53, 54, 55, 56, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 549, -1, -1, 391, -1, -1, -1,
- -1, 396, -1, -1, 399, -1, -1, -1, -1, -1,
- 90, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 773, -1, -1, -1, 105, -1, -1, 780, 781,
- -1, -1, -1, -1, -1, 115, -1, -1, 118, 119,
- -1, -1, -1, -1, 439, 440, -1, -1, 800, 801,
- -1, -1, -1, -1, -1, -1, -1, -1, 138, 139,
- -1, 456, 814, -1, 144, 145, 146, 147, 148, -1,
- 465, -1, -1, -1, 826, 827, -1, -1, 473, -1,
- -1, -1, 834, -1, -1, -1, -1, -1, 483, -1,
- -1, -1, -1, -1, 846, 847, -1, -1, -1, -1,
+ 605, 69, -1, 122, -1, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, -1, -1, 85, -1, -1,
+ -1, 440, 441, -1, -1, -1, 94, -1, -1, -1,
+ -1, -1, 100, 101, 102, 103, -1, -1, 457, -1,
+ 2, -1, 4, 5, 6, 7, -1, -1, -1, 468,
+ -1, 13, -1, -1, -1, -1, -1, 476, -1, -1,
+ 128, -1, 210, 131, -1, -1, -1, 486, 673, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 51, 52, 670, -1, 55, -1, 870, -1,
- 515, -1, -1, 875, -1, -1, -1, -1, -1, 524,
- -1, 70, 71, 72, 73, 74, 75, 76, 77, -1,
- -1, 80, 81, -1, -1, -1, -1, 86, 87, 88,
- 89, -1, -1, -1, 549, -1, 908, 909, -1, -1,
- 912, 100, 101, 102, 916, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, -1, 135, 136, -1, -1,
- -1, -1, -1, -1, 143, 144, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 773, -1, -1,
- -1, -1, 974, -1, 976, 781, 782, 979, -1, -1,
- 51, 52, 788, -1, 55, -1, -1, -1, 794, 795,
- -1, -1, -1, -1, 800, 801, -1, -1, -1, 70,
- 71, 72, 73, 74, 75, 76, 77, -1, 814, 80,
- 81, -1, -1, -1, -1, 86, 87, 88, 89, -1,
- 826, 827, -1, -1, -1, 670, -1, -1, 834, 100,
- 101, 102, -1, -1, -1, -1, -1, -1, -1, -1,
- 846, 847, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 124, 125, 126, 127, 128, 129, 130,
- 131, 132, 133, -1, 135, 136, 72, 73, 74, 75,
- 76, 77, 143, 144, 80, 81, -1, -1, -1, -1,
- -1, -1, 88, 89, -1, -1, -1, -1, -1, -1,
- -1, -1, 898, -1, -1, 101, -1, -1, -1, -1,
- -1, -1, 908, 909, -1, -1, 912, -1, -1, -1,
- 916, -1, -1, -1, -1, -1, -1, -1, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, 773, -1,
- -1, -1, -1, -1, -1, -1, 781, 782, -1, -1,
- -1, -1, -1, 788, -1, -1, -1, -1, -1, 794,
- 795, -1, -1, -1, -1, 800, 801, -1, 72, 73,
- 74, 75, 76, 77, 78, -1, 80, 81, 974, 814,
- 976, -1, -1, 979, 88, 89, -1, -1, -1, -1,
- -1, 826, 827, -1, -1, -1, -1, 101, -1, 834,
- -1, -1, 44, -1, -1, -1, -1, -1, -1, -1,
- -1, 846, 847, -1, -1, -1, -1, -1, -1, -1,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, -1, -1, -1, -1, 88, 89, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 101,
- -1, -1, -1, 898, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 908, 909, -1, -1, -1, -1, -1,
- 122, 916, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 0, 1, -1, 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, 974,
- 39, 976, -1, -1, 979, -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, 84, 85, -1, -1, -1,
- -1, -1, 91, -1, -1, 94, 95, -1, 97, 98,
- -1, 100, -1, -1, -1, 104, -1, 106, 107, 108,
- -1, 110, 111, 112, 0, 114, 115, -1, -1, 118,
- 119, -1, -1, -1, -1, -1, -1, 13, 14, 15,
- 16, 17, 18, -1, 20, 134, 135, 136, -1, -1,
- -1, 27, 28, 29, -1, -1, -1, 146, -1, 148,
- -1, 37, 38, -1, 40, 41, 42, 43, 44, -1,
+ 52, -1, -1, -1, 56, -1, -1, -1, -1, 518,
+ -1, -1, -1, -1, -1, -1, -1, -1, 527, -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, -1, -1,
- -1, -1, 88, 89, 90, -1, -1, 93, -1, -1,
- -1, -1, -1, 99, -1, 101, -1, -1, -1, 105,
- -1, -1, -1, -1, -1, -1, -1, 113, -1, 115,
- -1, -1, 118, 119, -1, -1, 122, 123, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, -1, -1,
- 0, -1, -1, 139, 140, 141, 142, -1, -1, 145,
- 146, 147, 148, 13, 14, 15, 16, 17, 18, -1,
- 20, -1, -1, -1, -1, -1, 26, 27, 28, -1,
- -1, -1, -1, -1, -1, -1, -1, 37, 38, -1,
- 40, 41, 42, 43, 44, -1, -1, -1, -1, -1,
+ 82, -1, 541, -1, 543, -1, -1, -1, -1, -1,
+ -1, -1, -1, 552, -1, -1, -1, -1, -1, 287,
+ -1, -1, -1, -1, -1, -1, 294, 295, -1, -1,
+ -1, -1, -1, -1, 302, -1, -1, 119, -1, -1,
+ -1, -1, -1, -1, -1, 313, -1, -1, -1, -1,
+ -1, -1, -1, -1, 779, -1, -1, -1, -1, -1,
+ -1, 786, 787, 788, -1, -1, 605, -1, -1, 794,
+ -1, -1, -1, -1, -1, 800, 801, -1, -1, 347,
+ -1, 806, 807, -1, 352, 72, 73, 74, 75, 76,
+ 77, 78, -1, 80, 81, 820, -1, -1, -1, -1,
+ -1, 88, 89, 371, -1, -1, -1, 832, 833, -1,
+ -1, -1, -1, -1, 101, 840, -1, -1, -1, -1,
+ -1, -1, -1, -1, 392, -1, 851, 852, 210, 397,
+ 398, -1, 400, -1, 673, -1, -1, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, -1, -1, -1,
+ -1, -1, 877, -1, -1, -1, -1, 882, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 440, 441, -1, -1, -1, -1, -1, -1,
+ 905, -1, -1, -1, -1, -1, -1, -1, -1, 457,
+ 915, 916, -1, -1, 919, -1, -1, -1, 923, -1,
+ 468, -1, -1, -1, -1, 287, -1, -1, 476, -1,
+ -1, -1, 294, 295, -1, -1, -1, -1, 486, -1,
+ 302, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 313, -1, -1, -1, -1, -1, -1, -1, -1,
+ 779, -1, -1, -1, -1, -1, -1, 786, 787, 788,
+ 518, -1, -1, -1, -1, 794, -1, -1, 983, 527,
+ 985, 800, 801, 988, -1, 347, -1, 806, 807, -1,
+ 352, -1, -1, 541, -1, 543, -1, -1, -1, -1,
+ -1, 820, -1, -1, 552, -1, -1, -1, -1, 371,
+ -1, -1, -1, 832, 833, -1, -1, -1, -1, -1,
+ -1, 840, -1, -1, -1, -1, -1, -1, -1, -1,
+ 392, -1, 851, 852, -1, 397, 398, -1, -1, -1,
+ -1, -1, -1, 2, -1, 4, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 605, 877, -1,
+ -1, -1, -1, 882, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 905, -1, -1, -1,
+ 88, 89, -1, 52, -1, 457, 915, 916, -1, -1,
+ 919, -1, -1, 101, 923, -1, 468, -1, -1, -1,
+ -1, -1, -1, 44, 476, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 486, 673, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, -1, -1, -1, -1,
+ -1, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, -1, -1, -1, 518, 88, 89, -1,
+ 119, -1, -1, -1, 983, 527, 985, -1, -1, 988,
+ 101, -1, -1, -1, -1, -1, -1, -1, -1, 541,
+ -1, 543, -1, -1, -1, -1, -1, -1, -1, -1,
+ 552, 122, -1, 124, 125, 126, 127, 128, 129, 130,
+ 131, 132, 133, -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, -1, -1, -1, -1, 88, 89,
- 90, -1, -1, 93, -1, -1, -1, -1, -1, 99,
- -1, 101, -1, -1, -1, 105, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 115, -1, -1, 118, 119,
- -1, -1, 122, -1, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, -1, -1, 0, -1, 138, 139,
- 140, 141, 142, -1, 144, 145, 146, 147, 148, 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, 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,
- -1, -1, -1, -1, 88, 89, 90, -1, 92, 93,
- -1, -1, -1, -1, -1, 99, -1, 101, -1, -1,
- -1, 105, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 115, -1, -1, 118, 119, -1, 121, 122, -1,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
- -1, -1, 0, -1, -1, 139, 140, 141, 142, -1,
- -1, 145, 146, 147, 148, 13, 14, 15, 16, 17,
- 18, -1, 20, -1, -1, -1, -1, -1, 26, 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, 779, 44, -1, -1, -1, -1, -1, 786, 787,
+ 788, -1, -1, 605, -1, -1, 794, -1, -1, -1,
+ -1, 210, 800, 801, -1, -1, -1, -1, 806, 807,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, 820, -1, -1, -1, 88, 89, -1, -1,
+ -1, -1, -1, -1, 832, 833, -1, -1, -1, 101,
+ -1, -1, 840, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 851, 852, -1, -1, -1, -1, -1,
+ 122, 673, 124, 125, 126, 127, 128, 129, 130, 131,
+ 132, 133, -1, -1, -1, -1, -1, -1, 287, 877,
+ -1, -1, -1, -1, 882, 294, 295, -1, -1, -1,
+ -1, -1, -1, 302, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, -1, 905, -1, -1,
+ 88, 89, -1, -1, -1, -1, -1, 915, 916, -1,
+ -1, 919, -1, 101, -1, 923, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 347, -1,
+ -1, -1, -1, 352, 122, -1, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, -1, -1, -1, -1,
+ -1, -1, 371, -1, 142, -1, -1, 779, -1, -1,
+ -1, -1, -1, -1, 786, 787, -1, -1, -1, -1,
+ -1, -1, -1, 392, -1, 983, -1, 985, 397, -1,
+ 988, 400, -1, -1, 806, 807, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 820, 0,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 832, 833, 13, 14, 15, 16, 17, 18, 840, 20,
+ -1, 440, 441, -1, -1, -1, 27, 28, 29, 851,
+ 852, -1, -1, -1, -1, -1, 37, 38, 457, 40,
+ 41, 42, 43, 44, -1, -1, -1, -1, -1, 468,
+ -1, -1, -1, -1, -1, 877, 57, 476, -1, -1,
+ 882, -1, -1, -1, -1, -1, -1, 486, -1, -1,
+ -1, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, -1, -1, -1, -1, 88, 89, 90,
+ -1, -1, 93, 915, 916, -1, -1, 919, 99, 518,
+ 101, 923, -1, -1, 105, -1, -1, -1, 527, -1,
+ -1, -1, 113, -1, 115, -1, -1, 118, 119, -1,
+ -1, 122, 123, 124, 125, 126, 127, 128, 129, 130,
+ 131, 132, 133, 552, -1, -1, -1, -1, 139, 140,
+ 141, 142, -1, -1, 145, 146, 147, 148, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 983, -1, 985, 0, 1, 988, 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, 84, 85,
+ -1, -1, -1, -1, 673, 91, -1, -1, 94, 95,
+ -1, 97, 98, -1, 100, -1, -1, -1, 104, -1,
+ 106, 107, 108, -1, 110, 111, 112, -1, 114, 115,
+ -1, -1, 118, 119, -1, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, -1, 134, 135,
+ 136, 88, 89, -1, -1, -1, -1, -1, -1, -1,
+ 146, -1, 148, -1, 101, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 122, -1, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, -1, -1, -1,
+ -1, -1, -1, -1, -1, 142, -1, -1, -1, -1,
+ 779, -1, -1, -1, -1, -1, -1, -1, 787, 788,
+ -1, -1, -1, -1, -1, 794, -1, -1, -1, -1,
+ -1, 800, 801, -1, -1, -1, -1, 806, 807, -1,
+ -1, -1, -1, -1, -1, 72, 73, 74, 75, 76,
+ 77, 820, 0, 80, 81, -1, -1, -1, -1, -1,
+ -1, 88, 89, 832, 833, 13, 14, 15, 16, 17,
+ 18, 840, 20, -1, 101, -1, -1, -1, 26, 27,
+ 28, -1, 851, 852, -1, -1, -1, -1, -1, 37,
+ 38, -1, 40, 41, 42, 43, 44, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, -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, -1, -1, -1, -1,
- 88, 89, 90, -1, -1, 93, -1, -1, -1, -1,
- -1, 99, -1, 101, -1, -1, -1, 105, -1, -1,
+ 78, 79, 80, 81, 82, 83, 905, -1, -1, -1,
+ 88, 89, 90, -1, -1, 93, 915, 916, -1, -1,
+ -1, 99, -1, 101, 923, -1, -1, 105, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 115, -1, -1,
118, 119, -1, -1, 122, -1, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 133, -1, -1, 0, -1,
- 138, 139, 140, 141, 142, -1, 144, 145, 146, 147,
- 148, 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,
+ 128, 129, 130, 131, 132, 133, -1, -1, -1, -1,
+ 138, 139, 140, 141, 142, 0, 144, 145, 146, 147,
+ 148, -1, -1, -1, -1, -1, -1, -1, 13, 14,
+ 15, 16, 17, 18, 983, 20, 985, -1, -1, 988,
+ -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, 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, -1,
+ -1, -1, -1, 88, 89, 90, -1, 92, 93, -1,
+ -1, -1, -1, -1, 99, -1, 101, -1, -1, -1,
+ 105, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 115, -1, -1, 118, 119, -1, 121, 122, -1, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132, 133, -1,
+ -1, 0, -1, -1, 139, 140, 141, 142, -1, -1,
+ 145, 146, 147, 148, 13, 14, 15, 16, 17, 18,
+ -1, 20, -1, -1, -1, -1, -1, 26, 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,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, -1, -1, -1, -1, 88, 89, 90, -1,
- -1, 93, -1, -1, -1, -1, -1, 99, -1, 101,
- -1, -1, -1, 105, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 115, -1, -1, 118, 119, -1, -1,
- 122, -1, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133, -1, -1, 0, -1, -1, 139, 140, 141,
- 142, -1, 144, 145, 146, 147, 148, 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, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, -1, -1, -1, -1, 88,
+ 89, 90, -1, -1, 93, -1, -1, -1, -1, -1,
+ 99, -1, 101, -1, -1, -1, 105, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 115, -1, -1, 118,
+ 119, -1, -1, 122, -1, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, -1, -1, 0, -1, 138,
+ 139, 140, 141, 142, -1, 144, 145, 146, 147, 148,
+ 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, 72, 73, 74, 75,
- 76, 77, 78, 79, 80, 81, 82, 83, -1, -1,
- -1, -1, 88, 89, 90, -1, 92, 93, -1, -1,
- -1, -1, -1, -1, -1, 101, -1, -1, -1, 105,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 115,
- -1, -1, 118, 119, -1, 121, 122, -1, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, -1, -1,
- 0, -1, 138, 139, 140, -1, 142, -1, -1, 145,
- 146, 147, 148, 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, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, -1, -1, -1, -1, 88, 89, 90, -1, -1,
+ 93, -1, -1, -1, -1, -1, 99, -1, 101, -1,
+ -1, -1, 105, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 115, -1, -1, 118, 119, -1, -1, 122,
+ -1, 124, 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, -1, -1, 0, -1, -1, 139, 140, 141, 142,
+ -1, 144, 145, 146, 147, 148, 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, 72, 73, 74, 75, 76, 77, 78, 79,
- 80, 81, 82, 83, -1, -1, -1, -1, 88, 89,
- 90, -1, 92, 93, -1, -1, -1, -1, -1, -1,
- -1, 101, -1, -1, -1, 105, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 115, -1, -1, 118, 119,
- -1, 121, 122, -1, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, -1, -1, 0, -1, 138, 139,
- 140, -1, 142, -1, -1, 145, 146, 147, 148, 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, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, -1, -1, -1,
+ -1, 88, 89, 90, -1, 92, 93, -1, -1, -1,
+ -1, -1, -1, -1, 101, -1, -1, -1, 105, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 115, -1,
+ -1, 118, 119, -1, 121, 122, -1, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, -1, -1, 0,
+ -1, 138, 139, 140, -1, 142, -1, -1, 145, 146,
+ 147, 148, 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, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- -1, -1, -1, -1, 88, 89, 90, -1, 92, 93,
- -1, -1, -1, -1, -1, -1, -1, 101, -1, -1,
- -1, 105, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 115, -1, -1, 118, 119, -1, 121, 122, -1,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
- -1, -1, 0, -1, -1, 139, 140, -1, 142, -1,
- -1, 145, 146, 147, 148, 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, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, -1, -1, -1, -1, 88, 89, 90,
+ -1, 92, 93, -1, -1, -1, -1, -1, -1, -1,
+ 101, -1, -1, -1, 105, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 115, -1, -1, 118, 119, -1,
+ 121, 122, -1, 124, 125, 126, 127, 128, 129, 130,
+ 131, 132, 133, -1, -1, 0, -1, 138, 139, 140,
+ -1, 142, -1, -1, 145, 146, 147, 148, 13, 14,
+ 15, -1, 17, 18, -1, 20, -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, -1, -1, -1, -1,
- 88, 89, 90, -1, 92, 93, -1, -1, -1, -1,
- -1, -1, -1, 101, -1, -1, -1, 105, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 115, -1, -1,
- 118, 119, -1, 121, 122, -1, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 133, -1, -1, -1, -1,
- -1, 139, 140, -1, 142, -1, -1, 145, 146, 147,
- 148, 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, 84, 85, -1, -1, -1, -1,
- -1, 91, -1, -1, 94, 95, -1, 97, 98, -1,
- 100, -1, -1, -1, 104, -1, 106, 107, 108, -1,
- 110, 111, 112, -1, 114, 115, -1, -1, 118, 119,
+ -1, -1, 37, 38, -1, 40, 41, 42, 43, 44,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 134, 135, 136, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 146, 1, 148, 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,
- 84, 85, -1, -1, -1, -1, -1, 91, -1, -1,
- 94, 95, -1, 97, 98, -1, 100, -1, -1, -1,
- 104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
- 114, 115, -1, -1, 118, 119, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1,
+ -1, -1, -1, 88, 89, 90, -1, 92, 93, -1,
+ -1, -1, -1, -1, -1, -1, 101, -1, -1, -1,
+ 105, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 115, -1, -1, 118, 119, -1, 121, 122, -1, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132, 133, -1,
+ -1, 0, -1, -1, 139, 140, -1, 142, -1, -1,
+ 145, 146, 147, 148, 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,
- 134, 135, 136, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 146, 1, 148, 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, 84, 85, -1, -1,
- -1, -1, -1, 91, -1, -1, 94, 95, -1, 97,
- 98, -1, 100, -1, -1, -1, 104, -1, 106, 107,
- 108, -1, 110, 111, 112, -1, 114, 115, -1, -1,
- 118, 119, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 134, 135, 136, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 146, 1,
- 148, 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, 84, 85, -1, -1, -1, -1, -1, 91,
- -1, -1, 94, 95, -1, 97, 98, -1, 100, -1,
- -1, -1, 104, -1, 106, 107, 108, -1, 110, 111,
- 112, -1, 114, 115, -1, -1, 118, 119, 1, -1,
+ -1, -1, -1, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, -1, -1, -1, -1, 88,
+ 89, 90, -1, 92, 93, -1, -1, -1, -1, -1,
+ -1, -1, 101, -1, -1, -1, 105, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 115, -1, -1, 118,
+ 119, -1, 121, 122, -1, 124, 125, 126, 127, 128,
+ 129, 130, 131, 132, 133, -1, -1, -1, -1, -1,
+ 139, 140, -1, 142, -1, -1, 145, 146, 147, 148,
+ 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, 84, 85, -1, -1, -1, -1, -1,
+ 91, -1, -1, 94, 95, -1, 97, 98, -1, 100,
+ -1, -1, -1, 104, -1, 106, 107, 108, -1, 110,
+ 111, 112, -1, 114, 115, -1, -1, 118, 119, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 134, 135, 136, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 146, 1, 148, 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, 84,
+ 85, -1, -1, -1, -1, -1, 91, -1, -1, 94,
+ 95, -1, 97, 98, -1, 100, -1, -1, -1, 104,
+ -1, 106, 107, 108, -1, 110, 111, 112, -1, 114,
+ 115, -1, -1, 118, 119, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 134,
+ 135, 136, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 146, 1, 148, 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, 84, 85, -1, -1, -1,
+ -1, -1, 91, -1, -1, 94, 95, -1, 97, 98,
+ -1, 100, -1, -1, -1, 104, -1, 106, 107, 108,
+ -1, 110, 111, 112, -1, 114, 115, -1, -1, 118,
+ 119, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 134, 135, 136, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 146, 1, 148,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
- -1, -1, 134, 135, 136, -1, 19, -1, 21, 22,
- 23, 24, -1, -1, 146, -1, 148, 30, 31, 32,
+ -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, 46, 47, 48, 49, 50, 51, 52,
+ -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, 84, 85, -1, -1, -1, -1, -1, 91, -1,
-1, 94, 95, -1, 97, 98, -1, 100, -1, -1,
-1, 104, -1, 106, 107, 108, -1, 110, 111, 112,
- -1, 114, 115, -1, -1, 118, 119, -1, -1, -1,
+ -1, 114, 115, -1, -1, 118, 119, 1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, -1,
+ -1, 134, 135, 136, -1, 19, -1, 21, 22, 23,
+ 24, -1, -1, 146, -1, 148, 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, 134, 135, 136, -1, -1, 139, -1, -1, -1,
- -1, -1, -1, 146, 1, 148, 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, 84, 85, -1,
- -1, -1, -1, -1, 91, -1, -1, 94, 95, -1,
- 97, 98, -1, 100, -1, -1, -1, 104, -1, 106,
- 107, 108, -1, 110, 111, 112, -1, 114, 115, -1,
- -1, 118, 119, 1, -1, 3, 4, 5, 6, 7,
- 8, 9, 10, 11, 12, -1, -1, 134, 135, 136,
- -1, 19, -1, 21, 22, 23, 24, -1, -1, 146,
- -1, 148, 30, 31, 32, 33, 34, 35, 36, -1,
+ 84, 85, -1, -1, -1, -1, -1, 91, -1, -1,
+ 94, 95, -1, 97, 98, -1, 100, -1, -1, -1,
+ 104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
+ 114, 115, -1, -1, 118, 119, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 134, 135, 136, -1, -1, 139, -1, -1, -1, -1,
+ -1, -1, 146, 1, 148, 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,
@@ -4254,7 +4327,7 @@ static const yytype_int16 yycheck[] =
108, -1, 110, 111, 112, -1, 114, 115, -1, -1,
118, 119, 1, -1, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, -1, -1, 134, 135, 136, -1,
- 19, -1, 21, 22, 23, 24, -1, 145, 146, -1,
+ 19, -1, 21, 22, 23, 24, -1, -1, 146, -1,
148, 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,
@@ -4276,26 +4349,26 @@ static const yytype_int16 yycheck[] =
-1, 91, -1, -1, 94, 95, -1, 97, 98, -1,
100, -1, -1, -1, 104, -1, 106, 107, 108, -1,
110, 111, 112, -1, 114, 115, -1, -1, 118, 119,
+ 1, -1, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, -1, -1, 134, 135, 136, -1, 19, -1,
+ 21, 22, 23, 24, -1, 145, 146, -1, 148, 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, 84, 85, -1, -1, -1, -1, -1,
+ 91, -1, -1, 94, 95, -1, 97, 98, -1, 100,
+ -1, -1, -1, 104, -1, 106, 107, 108, -1, 110,
+ 111, 112, -1, 114, 115, -1, -1, 118, 119, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 134, 135, 136, -1, -1, 139,
- -1, -1, -1, -1, -1, -1, 146, 1, 148, 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,
- 84, 85, -1, -1, -1, -1, -1, 91, -1, -1,
- 94, 95, -1, 97, 98, -1, 100, -1, -1, -1,
- 104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
- 114, 115, -1, -1, 118, 119, -1, -1, 3, 4,
+ -1, -1, -1, 134, 135, 136, -1, -1, 139, -1,
+ -1, -1, -1, -1, -1, 146, 1, 148, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, -1, -1,
- 134, 135, 136, -1, 19, -1, 21, 22, 23, 24,
- -1, -1, 146, -1, 148, 30, 31, 32, 33, 34,
+ 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, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 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, 84,
@@ -4307,7 +4380,7 @@ static const yytype_int16 yycheck[] =
135, 136, -1, 19, -1, 21, 22, 23, 24, -1,
-1, 146, -1, 148, 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,
+ 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, 84, 85,
@@ -4315,16 +4388,16 @@ static const yytype_int16 yycheck[] =
-1, 97, 98, -1, 100, -1, -1, -1, 104, -1,
106, 107, 108, -1, 110, 111, 112, -1, 114, 115,
-1, -1, 118, 119, -1, -1, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, -1, -1, -1, 134, 135,
+ 7, 8, 9, 10, 11, 12, -1, -1, 134, 135,
136, -1, 19, -1, 21, 22, 23, 24, -1, -1,
146, -1, 148, 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, -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, 84, 85, -1,
-1, -1, -1, -1, 91, -1, -1, 94, 95, -1,
- 97, 98, -1, -1, -1, -1, -1, 104, -1, 106,
+ 97, 98, -1, 100, -1, -1, -1, 104, -1, 106,
107, 108, -1, 110, 111, 112, -1, 114, 115, -1,
-1, 118, 119, -1, -1, 3, 4, 5, 6, 7,
8, 9, 10, 11, -1, -1, -1, 134, 135, 136,
@@ -4338,26 +4411,21 @@ static const yytype_int16 yycheck[] =
-1, -1, -1, 91, -1, -1, 94, 95, -1, 97,
98, -1, -1, -1, -1, -1, 104, -1, 106, 107,
108, -1, 110, 111, 112, -1, 114, 115, -1, -1,
- 118, 119, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 134, 135, 136, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 146, -1,
- 148, 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, -1, -1, 80, 81,
- -1, -1, -1, -1, 86, 87, 88, 89, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 100, 101,
- 102, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133, -1, 135, 136, -1, -1, -1, -1, -1,
- -1, 143, 144, 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,
+ 118, 119, -1, -1, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, -1, -1, -1, 134, 135, 136, -1,
+ 19, -1, 21, 22, 23, 24, -1, -1, 146, -1,
+ 148, 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, 85, -1, -1, -1,
+ -1, -1, 91, -1, -1, 94, 95, -1, 97, 98,
+ -1, -1, -1, -1, -1, 104, -1, 106, 107, 108,
+ -1, 110, 111, 112, -1, 114, 115, -1, -1, 118,
+ 119, -1, -1, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, -1, -1, -1, 134, 135, 136, -1, 19,
+ -1, 21, 22, 23, 24, -1, -1, 146, -1, 148,
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,
@@ -4365,61 +4433,78 @@ static const yytype_int16 yycheck[] =
70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 84, 85, -1, -1, -1, -1,
-1, 91, -1, -1, 94, 95, -1, 97, 98, -1,
- 100, -1, 102, 103, 104, -1, 106, 107, 108, -1,
- 110, 111, 112, -1, 114, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 104, -1, 106, 107, 108, -1,
+ 110, 111, 112, -1, 114, 115, -1, -1, 118, 119,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 134, 135, 136, -1, 138, -1,
- -1, -1, -1, -1, 144, 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, 84, 85, -1, -1,
- -1, -1, -1, 91, -1, -1, 94, 95, -1, 97,
- 98, -1, 100, -1, 102, 103, 104, -1, 106, 107,
- 108, -1, 110, 111, 112, -1, 114, -1, -1, -1,
- -1, -1, -1, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, -1, -1, -1, -1, 134, 135, 136, 19,
- 138, 21, 22, 23, 24, -1, 144, -1, -1, -1,
+ -1, -1, -1, -1, 134, 135, 136, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 148, 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, -1, -1, 80, 81, -1, -1,
+ -1, -1, 86, 87, 88, 89, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 100, 101, 102, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ -1, 135, 136, -1, -1, -1, -1, -1, -1, 143,
+ 144, 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, 84, 85, -1, -1, -1, -1, -1, 91,
+ -1, -1, 94, 95, -1, 97, 98, -1, 100, -1,
+ 102, 103, 104, -1, 106, 107, 108, -1, 110, 111,
+ 112, -1, 114, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 134, 135, 136, -1, 138, -1, -1, -1,
+ -1, -1, 144, 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, 84, 85, -1, -1, -1, -1,
- -1, 91, 92, -1, 94, 95, -1, 97, 98, -1,
+ -1, 91, -1, -1, 94, 95, -1, 97, 98, -1,
100, -1, 102, 103, 104, -1, 106, 107, 108, -1,
110, 111, 112, -1, 114, -1, -1, -1, -1, -1,
- -1, 121, 3, 4, 5, 6, 7, 8, 9, 10,
- 11, -1, -1, -1, 134, 135, 136, -1, 19, -1,
- 21, 22, 23, 24, 144, -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, 85, -1, -1, -1, -1, -1,
- 91, 92, -1, 94, 95, -1, 97, 98, -1, 100,
- -1, 102, 103, 104, -1, 106, 107, 108, -1, 110,
- 111, 112, -1, 114, -1, -1, -1, -1, -1, -1,
- 121, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- -1, -1, -1, 134, 135, 136, -1, 19, -1, 21,
- 22, 23, 24, 144, -1, -1, -1, -1, 30, 31,
+ -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, 134, 135, 136, 19, 138, 21,
+ 22, 23, 24, -1, 144, -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, 85, -1, -1, -1, -1, -1, 91,
- -1, -1, 94, 95, -1, 97, 98, -1, 100, -1,
+ 92, -1, 94, 95, -1, 97, 98, -1, 100, -1,
102, 103, 104, -1, 106, 107, 108, -1, 110, 111,
- 112, -1, 114, -1, -1, -1, -1, -1, -1, 3,
+ 112, -1, 114, -1, -1, -1, -1, -1, -1, 121,
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, -1,
+ -1, -1, 134, 135, 136, -1, 19, -1, 21, 22,
+ 23, 24, 144, -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, 85, -1, -1, -1, -1, -1, 91, 92,
+ -1, 94, 95, -1, 97, 98, -1, 100, -1, 102,
+ 103, 104, -1, 106, 107, 108, -1, 110, 111, 112,
+ -1, 114, -1, -1, -1, -1, -1, -1, 121, 3,
4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
- -1, -1, 134, 135, 136, 19, -1, 21, 22, 23,
- 24, -1, 144, -1, -1, -1, 30, 31, 32, 33,
+ -1, 134, 135, 136, -1, 19, -1, 21, 22, 23,
+ 24, 144, -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,
@@ -4428,20 +4513,60 @@ static const yytype_int16 yycheck[] =
84, 85, -1, -1, -1, -1, -1, 91, -1, -1,
94, 95, -1, 97, 98, -1, 100, -1, 102, 103,
104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
- 114, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 114, -1, -1, -1, -1, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ 134, 135, 136, 19, -1, 21, 22, 23, 24, -1,
+ 144, -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, 85,
+ -1, -1, -1, -1, -1, 91, -1, -1, 94, 95,
+ -1, 97, 98, -1, 100, -1, 102, 103, 104, -1,
+ 106, 107, 108, -1, 110, 111, 112, -1, 114, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 134, 135, 136, -1, -1, -1, -1, -1, -1, -1,
- 144, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ -1, -1, -1, -1, -1, -1, -1, -1, 134, 135,
+ 136, -1, -1, -1, -1, -1, -1, -1, 144, 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, -1, -1, 80, 81, -1, -1,
+ -1, -1, 86, 87, 88, 89, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 100, 101, 102, -1,
+ -1, -1, -1, 107, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ -1, 135, 136, -1, -1, -1, -1, -1, -1, 143,
+ 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, -1, -1, 80, 81, -1,
+ -1, -1, -1, 86, 87, 88, 89, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 100, 101, 102,
+ -1, -1, -1, -1, 107, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 124, 125, 126, 127, 128, 129, 130, 131, 132,
+ 133, -1, 135, 136, -1, -1, -1, -1, -1, -1,
+ 143, 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,
+ 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, -1, -1, 80, 81,
-1, -1, -1, -1, 86, 87, 88, 89, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 100, 101,
- 102, -1, -1, -1, -1, 107, -1, -1, -1, -1,
+ 102, -1, -1, -1, 106, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 124, 125, 126, 127, 128, 129, 130, 131,
132, 133, -1, 135, 136, -1, -1, -1, -1, -1,
@@ -4450,83 +4575,43 @@ static const yytype_int16 yycheck[] =
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,
+ 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, -1, -1, 80,
81, -1, -1, -1, -1, 86, 87, 88, 89, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 100,
- 101, 102, -1, -1, -1, -1, 107, -1, -1, -1,
+ 101, 102, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, -1, 135, 136, -1, -1, -1, -1,
-1, -1, 143, 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, -1, -1,
- 80, 81, -1, -1, -1, -1, 86, 87, 88, 89,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 100, 101, 102, -1, -1, -1, 106, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, -1, 135, 136, -1, -1, -1,
- -1, -1, -1, 143, 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, -1,
- -1, 80, 81, -1, -1, -1, -1, 86, 87, 88,
- 89, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 100, 101, 102, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, -1, 135, 136, -1, -1,
- -1, -1, -1, -1, 143, 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, -1, 91, -1, -1, 94, 95, -1, 97,
- 98, -1, -1, -1, -1, -1, 104, -1, 106, 107,
- 108, -1, 110, 111, 112, -1, 114, -1, -1, 3,
- 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
- -1, -1, -1, -1, -1, 19, 134, 21, 22, 23,
- 24, -1, -1, -1, 142, -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, -1, 91, -1, -1,
- 94, 95, -1, 97, 98, -1, -1, -1, -1, -1,
- 104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
- 114, -1, -1, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, -1, -1, -1, -1, -1, -1, 19,
- 134, 21, 22, 23, 24, -1, -1, -1, 142, -1,
+ 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, 45, 46, 47, 48, 49,
+ -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, 85, -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, 91, -1, -1, 94, 95, -1, 97, 98, -1,
- 100, -1, -1, -1, 104, -1, 106, 107, 108, -1,
- 110, 111, 112, -1, 114, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 104, -1, 106, 107, 108, -1,
+ 110, 111, 112, -1, 114, -1, -1, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
+ -1, -1, -1, 19, 134, 21, 22, 23, 24, -1,
+ -1, -1, 142, -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, -1, 91, -1, -1, 94, 95,
+ -1, 97, 98, -1, -1, -1, -1, -1, 104, -1,
+ 106, 107, 108, -1, 110, 111, 112, -1, 114, -1,
-1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, -1, -1, -1, 134, 135, 136, 19, -1, 21,
- 22, 23, 24, -1, -1, -1, -1, -1, 30, 31,
+ 12, -1, -1, -1, -1, -1, -1, 19, 134, 21,
+ 22, 23, 24, -1, -1, -1, 142, -1, 30, 31,
32, 33, 34, 35, 36, -1, -1, 39, -1, -1,
- -1, -1, -1, 45, -1, 47, 48, 49, 50, 51,
+ -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,
@@ -4534,16 +4619,16 @@ static const yytype_int16 yycheck[] =
-1, -1, 94, 95, -1, 97, 98, -1, 100, -1,
-1, -1, 104, -1, 106, 107, 108, -1, 110, 111,
112, -1, 114, -1, -1, -1, -1, -1, -1, 3,
- 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, -1,
-1, -1, 134, 135, 136, 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,
+ -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,
84, 85, -1, -1, -1, -1, -1, 91, -1, -1,
- 94, 95, -1, 97, 98, -1, 100, -1, 102, 103,
+ 94, 95, -1, 97, 98, -1, 100, -1, -1, -1,
104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
114, -1, -1, -1, -1, -1, -1, 3, 4, 5,
6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
@@ -4591,7 +4676,7 @@ static const yytype_int16 yycheck[] =
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 84, 85, -1, -1, -1, -1, -1, 91,
-1, -1, 94, 95, -1, 97, 98, -1, 100, -1,
- 102, -1, 104, -1, 106, 107, 108, -1, 110, 111,
+ 102, 103, 104, -1, 106, 107, 108, -1, 110, 111,
112, -1, 114, -1, -1, -1, -1, -1, -1, 3,
4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
-1, -1, 134, 135, 136, 19, -1, 21, 22, 23,
@@ -4602,7 +4687,7 @@ static const yytype_int16 yycheck[] =
-1, -1, 66, 67, -1, 69, 70, 71, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
84, 85, -1, -1, -1, -1, -1, 91, -1, -1,
- 94, 95, -1, 97, 98, -1, -1, -1, 102, 103,
+ 94, 95, -1, 97, 98, -1, 100, -1, 102, -1,
104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
114, -1, -1, -1, -1, -1, -1, 3, 4, 5,
6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
@@ -4614,7 +4699,7 @@ static const yytype_int16 yycheck[] =
66, 67, -1, 69, 70, 71, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 84, 85,
-1, -1, -1, -1, -1, 91, -1, -1, 94, 95,
- -1, 97, 98, -1, 100, -1, 102, -1, 104, -1,
+ -1, 97, 98, -1, -1, -1, 102, 103, 104, -1,
106, 107, 108, -1, 110, 111, 112, -1, 114, -1,
-1, -1, -1, -1, -1, 3, 4, 5, 6, 7,
8, 9, 10, 11, -1, -1, -1, -1, 134, 135,
@@ -4626,7 +4711,7 @@ static const yytype_int16 yycheck[] =
-1, 69, 70, 71, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 84, 85, -1, -1,
-1, -1, -1, 91, -1, -1, 94, 95, -1, 97,
- 98, -1, -1, -1, 102, -1, 104, -1, 106, 107,
+ 98, -1, 100, -1, 102, -1, 104, -1, 106, 107,
108, -1, 110, 111, 112, -1, 114, -1, -1, -1,
-1, -1, -1, 3, 4, 5, 6, 7, 8, 9,
10, 11, -1, -1, -1, -1, 134, 135, 136, 19,
@@ -4638,7 +4723,7 @@ static const yytype_int16 yycheck[] =
70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 84, 85, -1, -1, -1, -1,
-1, 91, -1, -1, 94, 95, -1, 97, 98, -1,
- 100, -1, -1, -1, 104, -1, 106, 107, 108, -1,
+ -1, -1, 102, -1, 104, -1, 106, 107, 108, -1,
110, 111, 112, -1, 114, -1, -1, -1, -1, -1,
-1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
-1, -1, -1, -1, 134, 135, 136, 19, -1, 21,
@@ -4697,7 +4782,7 @@ static const yytype_int16 yycheck[] =
70, 71, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 84, 85, -1, -1, -1, -1,
-1, 91, -1, -1, 94, 95, -1, 97, 98, -1,
- -1, -1, -1, -1, 104, -1, 106, 107, 108, -1,
+ 100, -1, -1, -1, 104, -1, 106, 107, 108, -1,
110, 111, 112, -1, 114, -1, -1, -1, -1, -1,
-1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
-1, -1, -1, -1, 134, 135, 136, 19, -1, 21,
@@ -4729,33 +4814,22 @@ static const yytype_int16 yycheck[] =
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, 88, -1, -1, 91, -1, -1, 94, 95,
+ 66, 67, -1, 69, 70, 71, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 84, 85,
+ -1, -1, -1, -1, -1, 91, -1, -1, 94, 95,
-1, 97, 98, -1, -1, -1, -1, -1, 104, -1,
106, 107, 108, -1, 110, 111, 112, -1, 114, -1,
- -1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- -1, -1, -1, -1, -1, -1, -1, 19, 134, 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, -1, 91,
- -1, -1, 94, 95, -1, 97, 98, -1, 100, -1,
- -1, -1, 104, -1, 106, 107, 108, -1, 110, 111,
- 112, -1, 114, -1, -1, 3, 4, 5, 6, 7,
- 8, 9, 10, 11, -1, -1, -1, -1, -1, -1,
- -1, 19, 134, 21, 22, 23, 24, -1, -1, -1,
+ -1, -1, -1, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, 134, 135,
+ 136, 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, -1, 91, -1, -1, 94, 95, -1, 97,
- 98, -1, 100, -1, -1, -1, 104, -1, 106, 107,
+ 88, -1, -1, 91, -1, -1, 94, 95, -1, 97,
+ 98, -1, -1, -1, -1, -1, 104, -1, 106, 107,
108, -1, 110, 111, 112, -1, 114, -1, -1, 3,
4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
-1, -1, -1, -1, -1, 19, 134, 21, 22, 23,
@@ -4766,7 +4840,7 @@ static const yytype_int16 yycheck[] =
-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, -1, 91, -1, -1,
- 94, 95, -1, 97, 98, -1, -1, -1, -1, -1,
+ 94, 95, -1, 97, 98, -1, 100, -1, -1, -1,
104, -1, 106, 107, 108, -1, 110, 111, 112, -1,
114, -1, -1, 3, 4, 5, 6, 7, 8, 9,
10, 11, -1, -1, -1, -1, -1, -1, -1, 19,
@@ -4778,7 +4852,7 @@ static const yytype_int16 yycheck[] =
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 91, -1, -1, 94, 95, -1, 97, 98, -1,
- -1, -1, -1, -1, 104, -1, 106, 107, 108, -1,
+ 100, -1, -1, -1, 104, -1, 106, 107, 108, -1,
110, 111, 112, -1, 114, -1, -1, 3, 4, 5,
6, 7, 8, 9, 10, 11, -1, -1, -1, -1,
-1, -1, -1, 19, 134, 21, 22, 23, 24, -1,
@@ -4800,11 +4874,51 @@ static const yytype_int16 yycheck[] =
-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, -1, 91,
- -1, -1, 94, 95, -1, 97, 98, -1, -1, 51,
- 52, -1, 104, 55, 106, 107, 108, -1, 110, 111,
- 112, -1, 114, -1, -1, -1, -1, -1, 70, 71,
+ -1, -1, 94, 95, -1, 97, 98, -1, -1, -1,
+ -1, -1, 104, -1, 106, 107, 108, -1, 110, 111,
+ 112, -1, 114, -1, -1, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, -1, -1, -1, -1, -1, -1,
+ -1, 19, 134, 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, -1, 91, -1, -1, 94, 95, -1, 97,
+ 98, -1, -1, -1, -1, -1, 104, -1, 106, 107,
+ 108, -1, 110, 111, 112, -1, 114, -1, -1, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, -1, -1,
+ -1, -1, -1, -1, -1, 19, 134, 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, -1, 91, -1, -1,
+ 94, 95, -1, 97, 98, -1, -1, 51, 52, -1,
+ 104, 55, 106, 107, 108, -1, 110, 111, 112, -1,
+ 114, -1, -1, -1, -1, -1, 70, 71, 72, 73,
+ 74, 75, 76, 77, -1, -1, 80, 81, -1, -1,
+ 134, -1, 86, 87, 88, 89, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 100, 101, 102, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ -1, 135, 136, 51, 52, -1, -1, 55, -1, 143,
+ 144, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 70, 71, 72, 73, 74, 75, 76, 77,
+ -1, -1, 80, 81, -1, -1, -1, -1, 86, 87,
+ 88, 89, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 100, 101, 102, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, -1, 135, 136, 51,
+ 52, -1, -1, 55, -1, 143, 144, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 70, 71,
72, 73, 74, 75, 76, 77, -1, -1, 80, 81,
- -1, -1, 134, -1, 86, 87, 88, 89, -1, -1,
+ -1, -1, -1, -1, 86, 87, 88, 89, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 100, 101,
102, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -4910,39 +5024,18 @@ static const yytype_int16 yycheck[] =
80, 81, -1, -1, -1, -1, 86, 87, 88, 89,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
100, 101, 102, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 44, -1, -1, -1,
- -1, -1, -1, -1, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, -1, 135, 136, -1, -1, -1,
- -1, -1, -1, 143, 72, 73, 74, 75, 76, 77,
- 78, 79, 80, 81, 82, 83, -1, -1, -1, -1,
- 88, 89, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 101, -1, -1, -1, -1, 44, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 122, -1, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 133, 72, 73, 74, 75,
- 76, 77, 78, 79, 80, 81, 82, 83, -1, -1,
- -1, -1, 88, 89, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 101, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 122, -1, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- -1, -1, -1, -1, 88, 89, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 101, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 122, -1,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, -1, -1, 148, -1, 88, 89, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 101,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 122, -1, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133, -1, -1, -1, -1, -1, -1, -1, -1,
- 142, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ -1, -1, -1, -1, 124, 125, 126, 127, 128, 129,
+ 130, 131, 132, 133, -1, 135, 136, 51, 52, -1,
+ -1, 55, -1, 143, 144, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 70, 71, 72, 73,
+ 74, 75, 76, 77, -1, -1, 80, 81, -1, -1,
+ -1, -1, 86, 87, 88, 89, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 100, 101, 102, -1,
+ -1, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, -1, -1, -1, -1, 88, 89, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 101, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ 101, 135, 136, -1, -1, -1, -1, -1, -1, 143,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 122, -1, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, -1, -1, -1, -1, -1, -1, -1,
@@ -4955,37 +5048,25 @@ static const yytype_int16 yycheck[] =
130, 131, 132, 133, -1, -1, -1, -1, -1, -1,
-1, -1, 142, 72, 73, 74, 75, 76, 77, 78,
79, 80, 81, 82, 83, -1, -1, -1, -1, 88,
- 89, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 89, -1, -1, -1, 93, -1, -1, -1, -1, -1,
-1, -1, 101, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 122, -1, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 133, -1, -1, -1, -1, -1,
- -1, -1, -1, 142, 72, 73, 74, 75, 76, 77,
- 78, 79, 80, 81, 82, 83, -1, -1, -1, -1,
- 88, 89, -1, -1, -1, 93, -1, -1, -1, -1,
- -1, -1, -1, 101, -1, -1, -1, -1, -1, -1,
+ 129, 130, 131, 132, 133, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, -1, -1, -1,
+ -1, 88, 89, -1, -1, -1, 93, -1, -1, -1,
+ -1, -1, -1, -1, 101, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 122, -1, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 133, 72, 73, 74, 75,
- 76, 77, 78, 79, 80, 81, 82, 83, -1, -1,
- -1, -1, 88, 89, -1, -1, -1, 93, -1, -1,
- -1, -1, -1, -1, -1, 101, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 122, -1, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- -1, -1, -1, -1, 88, 89, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 101, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 122, -1,
- 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, -1, -1, -1, -1, 88, 89, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 101,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133
+ -1, -1, -1, -1, -1, 122, -1, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, -1,
+ -1, -1, -1, 88, 89, 72, 73, 74, 75, 76,
+ 77, -1, -1, 80, 81, -1, 101, -1, -1, -1,
+ -1, 88, 89, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 101, -1, -1, 122, -1, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132, 133, -1,
+ -1, -1, -1, -1, -1, -1, -1, 124, 125, 126,
+ 127, 128, 129, 130, 131, 132, 133
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -5002,9 +5083,9 @@ static const yytype_int16 yystos[] =
154, 159, 161, 163, 164, 165, 168, 169, 172, 173,
175, 176, 177, 179, 180, 189, 203, 220, 241, 242,
252, 253, 254, 258, 259, 260, 266, 267, 268, 270,
- 271, 272, 273, 274, 275, 312, 325, 154, 21, 22,
+ 271, 272, 273, 274, 275, 311, 324, 154, 21, 22,
30, 31, 32, 39, 51, 55, 69, 88, 91, 94,
- 134, 164, 165, 181, 182, 203, 220, 272, 275, 312,
+ 134, 164, 165, 181, 182, 203, 220, 272, 275, 311,
182, 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,
@@ -5013,92 +5094,93 @@ static const yytype_int16 yystos[] =
76, 77, 80, 81, 86, 87, 88, 89, 100, 101,
102, 124, 125, 126, 127, 128, 129, 130, 131, 132,
133, 135, 136, 143, 144, 183, 187, 188, 274, 306,
- 204, 91, 163, 167, 180, 189, 220, 272, 273, 275,
- 167, 210, 212, 69, 91, 173, 180, 220, 225, 272,
- 275, 33, 34, 35, 36, 48, 49, 50, 51, 55,
- 106, 183, 184, 185, 268, 115, 118, 119, 146, 148,
- 167, 262, 263, 264, 318, 322, 323, 324, 51, 100,
- 102, 103, 135, 172, 189, 195, 198, 201, 254, 309,
- 311, 195, 195, 144, 192, 193, 196, 197, 325, 192,
- 196, 144, 319, 323, 184, 155, 138, 189, 220, 189,
- 189, 189, 55, 1, 94, 157, 158, 159, 174, 175,
- 325, 205, 207, 190, 201, 309, 325, 189, 308, 309,
- 325, 91, 142, 179, 220, 272, 275, 208, 53, 54,
- 56, 63, 107, 183, 269, 63, 64, 65, 116, 117,
- 255, 256, 61, 255, 62, 255, 63, 255, 63, 255,
- 58, 59, 168, 189, 189, 318, 324, 40, 41, 42,
- 43, 44, 37, 38, 51, 53, 54, 55, 56, 69,
- 94, 100, 101, 102, 103, 128, 131, 144, 278, 279,
- 280, 281, 282, 285, 286, 287, 288, 290, 291, 292,
- 293, 295, 296, 297, 300, 301, 302, 303, 304, 325,
- 279, 280, 28, 239, 121, 142, 94, 100, 176, 121,
- 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
- 82, 83, 88, 89, 93, 101, 122, 124, 125, 126,
- 127, 128, 129, 130, 131, 132, 133, 90, 105, 140,
- 147, 316, 90, 316, 317, 26, 138, 243, 254, 92,
- 92, 192, 196, 243, 163, 51, 55, 181, 58, 59,
- 279, 125, 276, 90, 140, 316, 219, 307, 90, 147,
- 315, 156, 157, 55, 16, 221, 322, 121, 90, 140,
- 316, 92, 92, 221, 167, 167, 55, 90, 140, 316,
- 25, 107, 142, 265, 318, 115, 264, 20, 246, 322,
- 57, 310, 189, 189, 189, 93, 142, 199, 200, 325,
- 310, 199, 200, 85, 194, 195, 201, 309, 325, 195,
- 163, 318, 320, 163, 160, 138, 157, 90, 316, 92,
- 159, 174, 145, 318, 324, 320, 159, 320, 141, 200,
- 321, 324, 200, 321, 139, 321, 55, 176, 177, 178,
- 142, 90, 140, 316, 144, 237, 290, 63, 255, 257,
- 261, 262, 63, 256, 61, 62, 63, 63, 101, 101,
- 154, 167, 167, 167, 167, 159, 163, 163, 57, 121,
- 294, 85, 290, 295, 121, 156, 189, 142, 305, 325,
- 51, 142, 305, 322, 142, 289, 189, 142, 289, 51,
- 142, 289, 51, 121, 156, 240, 100, 168, 189, 201,
- 202, 174, 142, 179, 142, 161, 162, 168, 180, 189,
- 191, 202, 220, 275, 189, 189, 189, 189, 189, 189,
- 189, 189, 189, 189, 189, 189, 189, 189, 51, 189,
+ 204, 91, 163, 164, 165, 167, 180, 189, 220, 272,
+ 273, 275, 167, 210, 212, 69, 91, 173, 180, 220,
+ 225, 272, 275, 33, 34, 35, 36, 48, 49, 50,
+ 51, 55, 106, 183, 184, 185, 268, 115, 118, 119,
+ 146, 148, 167, 262, 263, 264, 317, 321, 322, 323,
+ 51, 100, 102, 103, 135, 172, 189, 195, 198, 201,
+ 254, 309, 310, 195, 195, 144, 192, 193, 196, 197,
+ 324, 192, 196, 144, 318, 184, 155, 138, 189, 220,
+ 189, 189, 189, 55, 1, 94, 157, 158, 159, 174,
+ 175, 324, 205, 207, 190, 201, 309, 324, 189, 308,
+ 309, 324, 91, 142, 179, 220, 272, 275, 208, 53,
+ 54, 56, 63, 107, 183, 269, 63, 64, 65, 116,
+ 117, 255, 256, 61, 255, 62, 255, 63, 255, 63,
+ 255, 58, 59, 168, 189, 189, 317, 323, 40, 41,
+ 42, 43, 44, 37, 38, 51, 53, 54, 55, 56,
+ 69, 94, 100, 101, 102, 103, 128, 131, 144, 278,
+ 279, 280, 281, 282, 285, 286, 287, 288, 290, 291,
+ 292, 293, 295, 296, 297, 300, 301, 302, 303, 304,
+ 324, 278, 280, 28, 239, 121, 142, 94, 100, 176,
+ 121, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 88, 89, 93, 101, 122, 124, 125,
+ 126, 127, 128, 129, 130, 131, 132, 133, 90, 105,
+ 140, 147, 315, 90, 315, 316, 26, 138, 243, 254,
+ 92, 92, 192, 196, 243, 163, 51, 55, 181, 58,
+ 59, 279, 125, 276, 90, 140, 315, 219, 307, 90,
+ 147, 314, 156, 157, 55, 278, 278, 16, 221, 321,
+ 121, 90, 140, 315, 92, 92, 221, 167, 167, 55,
+ 90, 140, 315, 25, 107, 142, 265, 317, 115, 264,
+ 20, 246, 321, 57, 189, 189, 189, 93, 142, 199,
+ 200, 324, 57, 199, 200, 85, 194, 195, 201, 309,
+ 324, 195, 163, 317, 319, 163, 322, 160, 138, 157,
+ 90, 315, 92, 159, 174, 145, 317, 323, 319, 159,
+ 319, 141, 200, 320, 323, 200, 320, 139, 320, 55,
+ 176, 177, 178, 142, 90, 140, 315, 144, 237, 290,
+ 63, 255, 257, 261, 262, 63, 256, 61, 62, 63,
+ 63, 101, 101, 154, 167, 167, 167, 167, 159, 163,
+ 163, 57, 121, 294, 85, 290, 295, 121, 156, 189,
+ 142, 305, 324, 51, 142, 305, 321, 142, 289, 189,
+ 142, 289, 51, 142, 289, 51, 121, 156, 240, 100,
+ 168, 189, 201, 202, 174, 142, 179, 142, 161, 162,
+ 168, 180, 189, 191, 202, 220, 275, 189, 189, 189,
189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
- 189, 51, 52, 55, 187, 192, 313, 314, 194, 201,
- 51, 52, 55, 187, 192, 313, 51, 55, 313, 245,
- 244, 162, 189, 191, 162, 191, 99, 170, 217, 277,
- 216, 51, 55, 181, 313, 194, 313, 156, 163, 166,
- 15, 13, 248, 325, 157, 16, 51, 55, 194, 51,
- 55, 157, 27, 222, 322, 222, 51, 55, 194, 51,
- 55, 214, 186, 157, 246, 189, 201, 15, 261, 189,
- 189, 319, 100, 189, 198, 309, 189, 311, 320, 145,
- 318, 200, 200, 320, 145, 184, 152, 139, 191, 320,
- 159, 206, 309, 176, 178, 51, 55, 194, 51, 55,
- 290, 209, 63, 157, 262, 189, 189, 51, 100, 226,
- 295, 320, 320, 142, 189, 15, 51, 282, 287, 304,
- 288, 293, 300, 302, 295, 297, 302, 51, 295, 189,
- 15, 79, 126, 231, 232, 325, 189, 200, 320, 178,
- 142, 44, 121, 44, 90, 140, 316, 319, 92, 92,
- 192, 196, 141, 200, 92, 92, 193, 196, 193, 196,
- 231, 231, 171, 322, 167, 156, 141, 15, 320, 183,
- 189, 202, 249, 325, 18, 224, 325, 17, 223, 224,
- 92, 92, 141, 92, 92, 224, 211, 213, 141, 167,
- 184, 139, 15, 200, 221, 261, 189, 199, 85, 309,
- 139, 320, 321, 141, 234, 319, 29, 113, 238, 139,
- 142, 292, 320, 142, 85, 44, 305, 142, 289, 142,
- 289, 142, 289, 142, 289, 289, 44, 228, 230, 233,
- 281, 283, 284, 287, 295, 296, 298, 299, 302, 304,
- 156, 100, 189, 178, 159, 189, 51, 55, 194, 51,
- 55, 57, 123, 162, 191, 168, 191, 170, 92, 162,
- 191, 162, 191, 170, 243, 239, 156, 157, 231, 218,
- 322, 15, 93, 250, 325, 157, 14, 251, 325, 167,
- 15, 92, 15, 157, 157, 222, 189, 157, 320, 200,
- 145, 146, 156, 157, 227, 142, 100, 320, 189, 295,
- 302, 295, 295, 189, 234, 234, 91, 220, 142, 305,
- 305, 142, 229, 220, 142, 229, 142, 229, 15, 189,
- 141, 189, 189, 162, 191, 15, 139, 157, 156, 91,
- 180, 220, 272, 275, 221, 157, 221, 15, 15, 215,
- 224, 246, 247, 51, 235, 236, 291, 15, 139, 295,
- 295, 142, 292, 289, 142, 289, 289, 289, 126, 126,
- 55, 90, 283, 287, 142, 228, 229, 299, 302, 295,
- 298, 302, 295, 139, 15, 55, 90, 140, 316, 157,
- 157, 157, 142, 319, 142, 295, 142, 295, 51, 55,
- 305, 142, 229, 142, 229, 142, 229, 142, 229, 229,
- 51, 55, 194, 51, 55, 248, 223, 15, 236, 295,
- 289, 295, 302, 295, 295, 141, 229, 142, 229, 229,
- 229, 295, 229
+ 189, 51, 189, 189, 189, 189, 189, 189, 189, 189,
+ 189, 189, 189, 189, 51, 52, 55, 187, 192, 312,
+ 313, 194, 201, 51, 52, 55, 187, 192, 312, 51,
+ 55, 312, 245, 244, 162, 189, 191, 162, 191, 99,
+ 170, 217, 277, 216, 51, 55, 181, 312, 194, 312,
+ 156, 163, 166, 15, 13, 248, 324, 121, 121, 157,
+ 16, 51, 55, 194, 51, 55, 157, 27, 222, 321,
+ 222, 51, 55, 194, 51, 55, 214, 186, 157, 246,
+ 189, 201, 15, 189, 189, 318, 100, 189, 198, 309,
+ 189, 310, 319, 145, 317, 200, 200, 319, 145, 184,
+ 152, 139, 191, 319, 159, 206, 309, 176, 178, 51,
+ 55, 194, 51, 55, 290, 209, 63, 157, 262, 189,
+ 189, 51, 100, 226, 295, 319, 319, 142, 172, 189,
+ 15, 51, 282, 287, 304, 288, 293, 300, 302, 295,
+ 297, 302, 51, 295, 172, 189, 15, 79, 126, 231,
+ 232, 324, 189, 200, 319, 178, 142, 44, 121, 44,
+ 90, 140, 315, 318, 92, 92, 192, 196, 141, 200,
+ 92, 92, 193, 196, 193, 196, 231, 231, 171, 321,
+ 167, 156, 141, 15, 319, 183, 189, 202, 249, 324,
+ 18, 224, 324, 17, 223, 224, 92, 92, 141, 92,
+ 92, 224, 211, 213, 141, 167, 184, 139, 15, 200,
+ 221, 189, 199, 85, 309, 139, 319, 320, 141, 234,
+ 318, 29, 113, 238, 139, 142, 292, 319, 142, 85,
+ 44, 44, 305, 142, 289, 142, 289, 142, 289, 142,
+ 289, 289, 44, 44, 228, 230, 233, 281, 283, 284,
+ 287, 295, 296, 298, 299, 302, 304, 156, 100, 189,
+ 178, 159, 189, 51, 55, 194, 51, 55, 57, 123,
+ 162, 191, 168, 191, 170, 92, 162, 191, 162, 191,
+ 170, 243, 239, 156, 157, 231, 218, 321, 15, 93,
+ 250, 324, 157, 14, 251, 324, 167, 15, 92, 15,
+ 157, 157, 222, 189, 157, 319, 200, 145, 146, 156,
+ 157, 227, 142, 100, 319, 189, 189, 295, 302, 295,
+ 295, 189, 189, 234, 234, 91, 220, 142, 305, 305,
+ 142, 229, 220, 142, 229, 142, 229, 15, 189, 141,
+ 189, 189, 162, 191, 15, 139, 157, 156, 91, 180,
+ 220, 272, 275, 221, 157, 221, 15, 15, 215, 224,
+ 246, 247, 51, 235, 236, 291, 15, 139, 295, 295,
+ 142, 292, 289, 142, 289, 289, 289, 126, 126, 55,
+ 90, 283, 287, 142, 228, 229, 299, 302, 295, 298,
+ 302, 295, 139, 15, 55, 90, 140, 315, 157, 157,
+ 157, 142, 318, 142, 295, 142, 295, 51, 55, 305,
+ 142, 229, 142, 229, 142, 229, 142, 229, 229, 51,
+ 55, 194, 51, 55, 248, 223, 15, 236, 295, 289,
+ 295, 302, 295, 295, 141, 229, 142, 229, 229, 229,
+ 295, 229
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
@@ -5108,63 +5190,63 @@ static const yytype_int16 yyr1[] =
155, 154, 156, 157, 158, 158, 158, 158, 160, 159,
159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
159, 159, 159, 159, 161, 161, 161, 161, 161, 161,
- 161, 161, 162, 162, 162, 163, 163, 163, 163, 163,
- 163, 164, 166, 165, 167, 168, 168, 169, 169, 171,
- 170, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 173, 173, 174, 174, 175, 175, 175, 175,
- 175, 175, 175, 175, 175, 175, 176, 176, 177, 177,
- 178, 178, 179, 179, 179, 179, 179, 179, 179, 179,
- 180, 180, 180, 180, 180, 180, 180, 180, 180, 181,
- 181, 182, 182, 182, 183, 183, 183, 183, 183, 184,
- 184, 185, 186, 185, 187, 187, 187, 187, 187, 187,
+ 161, 161, 161, 161, 161, 161, 162, 162, 162, 163,
+ 163, 163, 163, 163, 163, 164, 166, 165, 167, 168,
+ 168, 169, 169, 171, 170, 172, 172, 172, 172, 172,
+ 172, 172, 172, 172, 172, 172, 173, 173, 174, 174,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 176, 176, 177, 177, 178, 178, 179, 179, 179, 179,
+ 179, 179, 179, 179, 180, 180, 180, 180, 180, 180,
+ 180, 180, 180, 181, 181, 182, 182, 182, 183, 183,
+ 183, 183, 183, 184, 184, 185, 186, 185, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 188, 188, 188, 188, 188, 188,
+ 187, 187, 187, 187, 187, 187, 187, 187, 188, 188,
188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
- 188, 188, 188, 188, 189, 189, 189, 189, 189, 189,
+ 188, 188, 188, 188, 188, 188, 188, 188, 189, 189,
189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
- 189, 189, 189, 189, 189, 190, 190, 190, 190, 191,
- 191, 192, 192, 192, 193, 193, 194, 194, 194, 194,
- 194, 195, 195, 195, 195, 195, 197, 196, 198, 199,
- 199, 200, 200, 201, 201, 201, 201, 202, 202, 202,
- 203, 203, 203, 203, 203, 203, 203, 203, 203, 204,
- 203, 205, 206, 203, 207, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203, 208, 209,
- 203, 203, 203, 210, 211, 203, 212, 213, 203, 203,
- 203, 214, 215, 203, 216, 203, 217, 218, 203, 219,
- 203, 203, 203, 203, 203, 203, 203, 220, 221, 221,
- 221, 222, 222, 223, 223, 224, 224, 225, 225, 226,
- 226, 226, 226, 226, 226, 226, 226, 227, 226, 228,
- 228, 228, 228, 229, 229, 230, 230, 230, 230, 230,
+ 189, 189, 189, 189, 189, 189, 189, 189, 189, 190,
+ 190, 190, 190, 191, 191, 192, 192, 192, 193, 193,
+ 194, 194, 194, 194, 194, 195, 195, 195, 195, 195,
+ 197, 196, 198, 199, 199, 200, 201, 201, 201, 201,
+ 202, 202, 202, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 204, 203, 205, 206, 203, 207, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 208, 209, 203, 203, 203, 210, 211, 203, 212,
+ 213, 203, 203, 203, 214, 215, 203, 216, 203, 217,
+ 218, 203, 219, 203, 203, 203, 203, 203, 203, 203,
+ 220, 221, 221, 221, 222, 222, 223, 223, 224, 224,
+ 225, 225, 226, 226, 226, 226, 226, 226, 226, 226,
+ 227, 226, 228, 228, 228, 228, 229, 229, 230, 230,
230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
- 231, 231, 233, 232, 232, 232, 234, 234, 235, 235,
- 236, 236, 237, 237, 238, 238, 240, 239, 241, 241,
- 241, 241, 242, 242, 242, 242, 242, 242, 242, 242,
- 242, 244, 243, 245, 243, 246, 247, 247, 248, 248,
- 249, 249, 249, 250, 250, 251, 251, 252, 252, 252,
- 252, 253, 253, 254, 254, 254, 254, 255, 255, 256,
- 257, 256, 256, 256, 258, 258, 259, 259, 260, 261,
- 261, 262, 262, 263, 263, 264, 265, 264, 266, 266,
- 267, 267, 268, 269, 269, 269, 269, 269, 269, 270,
- 270, 271, 271, 271, 271, 272, 272, 272, 272, 272,
- 273, 273, 274, 274, 274, 274, 274, 274, 274, 274,
- 275, 275, 276, 277, 276, 278, 278, 279, 279, 279,
- 280, 280, 281, 282, 282, 283, 283, 284, 284, 285,
- 285, 286, 286, 287, 287, 288, 288, 288, 288, 289,
- 289, 290, 290, 290, 290, 290, 290, 290, 290, 290,
- 290, 290, 290, 290, 290, 290, 291, 291, 291, 291,
- 291, 292, 292, 293, 294, 293, 295, 295, 296, 297,
- 298, 299, 299, 300, 300, 301, 301, 302, 302, 303,
- 303, 304, 305, 305, 306, 307, 306, 308, 308, 309,
- 309, 310, 310, 311, 311, 311, 311, 312, 312, 312,
- 313, 313, 313, 313, 314, 314, 314, 315, 315, 316,
- 316, 317, 317, 318, 318, 319, 319, 320, 321, 321,
- 321, 322, 322, 322, 323, 324, 324, 325
+ 230, 230, 230, 231, 231, 233, 232, 232, 232, 234,
+ 234, 235, 235, 236, 236, 237, 237, 238, 238, 240,
+ 239, 241, 241, 241, 241, 242, 242, 242, 242, 242,
+ 242, 242, 242, 242, 244, 243, 245, 243, 246, 247,
+ 247, 248, 248, 249, 249, 249, 250, 250, 251, 251,
+ 252, 252, 252, 252, 253, 253, 254, 254, 254, 254,
+ 255, 255, 256, 257, 256, 256, 256, 258, 258, 259,
+ 259, 260, 261, 261, 262, 262, 263, 263, 264, 265,
+ 264, 266, 266, 267, 267, 268, 269, 269, 269, 269,
+ 269, 269, 270, 270, 271, 271, 271, 271, 272, 272,
+ 272, 272, 272, 273, 273, 274, 274, 274, 274, 274,
+ 274, 274, 274, 275, 275, 276, 277, 276, 278, 278,
+ 279, 279, 279, 280, 280, 281, 282, 282, 283, 283,
+ 284, 284, 285, 285, 286, 286, 287, 287, 288, 288,
+ 288, 288, 289, 289, 290, 290, 290, 290, 290, 290,
+ 290, 290, 290, 290, 290, 290, 290, 290, 290, 291,
+ 291, 291, 291, 291, 292, 292, 293, 294, 293, 295,
+ 295, 296, 297, 298, 299, 299, 300, 300, 301, 301,
+ 302, 302, 303, 303, 304, 305, 305, 306, 307, 306,
+ 308, 308, 309, 309, 310, 310, 310, 310, 310, 311,
+ 311, 311, 312, 312, 312, 312, 313, 313, 313, 314,
+ 314, 315, 315, 316, 316, 317, 317, 318, 318, 319,
+ 320, 320, 320, 321, 321, 322, 322, 323, 323, 324
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -5174,63 +5256,63 @@ static const yytype_int8 yyr2[] =
0, 5, 4, 2, 1, 1, 3, 2, 0, 4,
2, 3, 3, 3, 3, 3, 4, 1, 3, 3,
3, 3, 3, 1, 3, 3, 6, 5, 5, 5,
- 5, 3, 1, 3, 1, 1, 3, 3, 3, 2,
- 1, 2, 0, 5, 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,
+ 5, 4, 6, 4, 6, 3, 1, 3, 1, 1,
+ 3, 3, 3, 2, 1, 2, 0, 5, 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, 3, 3, 6, 5, 5, 5,
- 5, 4, 3, 3, 2, 2, 3, 2, 2, 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,
- 4, 6, 4, 6, 1, 1, 2, 4, 2, 1,
- 3, 3, 5, 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, 4, 4, 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, 3, 3,
+ 6, 5, 5, 5, 5, 4, 3, 3, 2, 2,
+ 3, 2, 2, 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, 4, 6, 4, 6, 1, 1,
+ 2, 4, 2, 1, 3, 3, 5, 3, 1, 1,
+ 1, 2, 2, 4, 2, 1, 2, 2, 4, 1,
+ 0, 2, 2, 2, 1, 2, 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, 4, 4, 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, 0, 0, 4, 1, 1, 3, 5, 3,
- 1, 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, 0, 0, 4, 1, 1,
+ 3, 5, 3, 1, 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, 3, 3, 2, 3, 2, 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
+ 1, 1, 1, 1, 1, 0, 1, 0, 2, 2,
+ 0, 1, 1, 1, 1, 1, 1, 1, 2, 0
};
@@ -5932,93 +6014,93 @@ yyreduce:
switch (yyn)
{
case 2:
-#line 1565 "mrbgems/mruby-compiler/core/parse.y"
+#line 1582 "mrbgems/mruby-compiler/core/parse.y"
{
p->lstate = EXPR_BEG;
if (!p->locals) p->locals = cons(0,0);
}
-#line 5941 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6023 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 3:
-#line 1570 "mrbgems/mruby-compiler/core/parse.y"
+#line 1587 "mrbgems/mruby-compiler/core/parse.y"
{
p->tree = new_scope(p, (yyvsp[0].nd));
NODE_LINENO(p->tree, (yyvsp[0].nd));
}
-#line 5950 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6032 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 4:
-#line 1577 "mrbgems/mruby-compiler/core/parse.y"
+#line 1594 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 5958 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6040 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 5:
-#line 1583 "mrbgems/mruby-compiler/core/parse.y"
+#line 1600 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_begin(p, 0);
}
-#line 5966 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6048 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 6:
-#line 1587 "mrbgems/mruby-compiler/core/parse.y"
+#line 1604 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_begin(p, (yyvsp[0].nd));
NODE_LINENO((yyval.nd), (yyvsp[0].nd));
}
-#line 5975 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6057 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 7:
-#line 1592 "mrbgems/mruby-compiler/core/parse.y"
+#line 1609 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), newline_node((yyvsp[0].nd)));
}
-#line 5983 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6065 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 8:
-#line 1596 "mrbgems/mruby-compiler/core/parse.y"
+#line 1613 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_begin(p, 0);
}
-#line 5991 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6073 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 10:
-#line 1603 "mrbgems/mruby-compiler/core/parse.y"
+#line 1620 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = local_switch(p);
nvars_block(p);
}
-#line 6000 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6082 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 11:
-#line 1608 "mrbgems/mruby-compiler/core/parse.y"
+#line 1625 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "BEGIN not supported");
local_resume(p, (yyvsp[-3].nd));
nvars_unnest(p);
(yyval.nd) = 0;
}
-#line 6011 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6093 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 12:
-#line 1620 "mrbgems/mruby-compiler/core/parse.y"
+#line 1637 "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");
+ yywarning(p, "else without rescue is useless");
(yyval.nd) = push((yyvsp[-3].nd), (yyvsp[-1].nd));
}
else {
@@ -6033,291 +6115,345 @@ yyreduce:
}
}
}
-#line 6037 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6119 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 13:
-#line 1644 "mrbgems/mruby-compiler/core/parse.y"
+#line 1661 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 6045 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6127 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 14:
-#line 1650 "mrbgems/mruby-compiler/core/parse.y"
+#line 1667 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_begin(p, 0);
}
-#line 6053 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6135 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 15:
-#line 1654 "mrbgems/mruby-compiler/core/parse.y"
+#line 1671 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_begin(p, (yyvsp[0].nd));
NODE_LINENO((yyval.nd), (yyvsp[0].nd));
}
-#line 6062 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6144 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 16:
-#line 1659 "mrbgems/mruby-compiler/core/parse.y"
+#line 1676 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), newline_node((yyvsp[0].nd)));
}
-#line 6070 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6152 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 17:
-#line 1663 "mrbgems/mruby-compiler/core/parse.y"
+#line 1680 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_begin(p, (yyvsp[0].nd));
}
-#line 6078 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6160 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 18:
-#line 1668 "mrbgems/mruby-compiler/core/parse.y"
+#line 1685 "mrbgems/mruby-compiler/core/parse.y"
{p->lstate = EXPR_FNAME;}
-#line 6084 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6166 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 19:
-#line 1669 "mrbgems/mruby-compiler/core/parse.y"
+#line 1686 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_alias(p, (yyvsp[-2].id), (yyvsp[0].id));
}
-#line 6092 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6174 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 20:
-#line 1673 "mrbgems/mruby-compiler/core/parse.y"
+#line 1690 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 6100 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6182 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 21:
-#line 1677 "mrbgems/mruby-compiler/core/parse.y"
+#line 1694 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_if(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd), 0);
}
-#line 6108 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6190 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 22:
-#line 1681 "mrbgems/mruby-compiler/core/parse.y"
+#line 1698 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_unless(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd), 0);
}
-#line 6116 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6198 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 23:
-#line 1685 "mrbgems/mruby-compiler/core/parse.y"
+#line 1702 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_while(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd));
}
-#line 6124 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6206 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 24:
-#line 1689 "mrbgems/mruby-compiler/core/parse.y"
+#line 1706 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_until(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd));
}
-#line 6132 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6214 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 25:
-#line 1693 "mrbgems/mruby-compiler/core/parse.y"
+#line 1710 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6140 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6222 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 26:
-#line 1697 "mrbgems/mruby-compiler/core/parse.y"
+#line 1714 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "END not supported");
(yyval.nd) = new_postexe(p, (yyvsp[-1].nd));
}
-#line 6149 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6231 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 28:
-#line 1703 "mrbgems/mruby-compiler/core/parse.y"
+#line 1720 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_masgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6157 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6239 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 29:
-#line 1707 "mrbgems/mruby-compiler/core/parse.y"
+#line 1724 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_asgn(p, (yyvsp[-2].nd), new_array(p, (yyvsp[0].nd)));
}
-#line 6165 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6247 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 30:
-#line 1711 "mrbgems/mruby-compiler/core/parse.y"
+#line 1728 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_masgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6173 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6255 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 31:
-#line 1715 "mrbgems/mruby-compiler/core/parse.y"
+#line 1732 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_masgn(p, (yyvsp[-2].nd), new_array(p, (yyvsp[0].nd)));
}
-#line 6181 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6263 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 32:
-#line 1719 "mrbgems/mruby-compiler/core/parse.y"
+#line 1736 "mrbgems/mruby-compiler/core/parse.y"
{
node *lhs = new_lvar(p, (yyvsp[0].id));
void_expr_error(p, (yyvsp[-2].nd));
assignable(p, lhs);
(yyval.nd) = new_asgn(p, lhs, (yyvsp[-2].nd));
}
-#line 6192 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6274 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 34:
-#line 1729 "mrbgems/mruby-compiler/core/parse.y"
+#line 1746 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_asgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6200 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6282 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 35:
-#line 1733 "mrbgems/mruby-compiler/core/parse.y"
+#line 1750 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_op_asgn(p, (yyvsp[-2].nd), (yyvsp[-1].id), (yyvsp[0].nd));
}
-#line 6208 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6290 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 36:
-#line 1737 "mrbgems/mruby-compiler/core/parse.y"
+#line 1754 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), intern_op(aref), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd));
}
-#line 6216 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6298 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 37:
-#line 1741 "mrbgems/mruby-compiler/core/parse.y"
+#line 1758 "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 6224 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6306 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 38:
-#line 1745 "mrbgems/mruby-compiler/core/parse.y"
+#line 1762 "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 6232 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6314 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 39:
-#line 1749 "mrbgems/mruby-compiler/core/parse.y"
+#line 1766 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "constant re-assignment");
(yyval.nd) = 0;
}
-#line 6241 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6323 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 40:
-#line 1754 "mrbgems/mruby-compiler/core/parse.y"
+#line 1771 "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 6249 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6331 "mrbgems/mruby-compiler/core/y.tab.c"
break;
case 41:
-#line 1758 "mrbgems/mruby-compiler/core/parse.y"
+#line 1775 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-3].nd);
+ endless_method_name(p, (yyvsp[-3].nd));
+ void_expr_error(p, (yyvsp[0].nd));
+ defn_setup(p, (yyval.nd), (yyvsp[-2].nd), (yyvsp[0].nd));
+ nvars_unnest(p);
+ p->in_def--;
+ }
+#line 6344 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 42:
+#line 1784 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-5].nd);
+ endless_method_name(p, (yyvsp[-5].nd));
+ void_expr_error(p, (yyvsp[-2].nd));
+ void_expr_error(p, (yyvsp[0].nd));
+ defn_setup(p, (yyval.nd), (yyvsp[-4].nd), new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd)));
+ nvars_unnest(p);
+ p->in_def--;
+ }
+#line 6358 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 43:
+#line 1794 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-3].nd);
+ void_expr_error(p, (yyvsp[0].nd));
+ defs_setup(p, (yyval.nd), (yyvsp[-2].nd), (yyvsp[0].nd));
+ nvars_unnest(p);
+ p->in_def--;
+ p->in_single--;
+ }
+#line 6371 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 44:
+#line 1803 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = (yyvsp[-5].nd);
+ void_expr_error(p, (yyvsp[-2].nd));
+ void_expr_error(p, (yyvsp[0].nd));
+ defs_setup(p, (yyval.nd), (yyvsp[-4].nd), new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd)));
+ nvars_unnest(p);
+ p->in_def--;
+ p->in_single--;
+ }
+#line 6385 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 45:
+#line 1813 "mrbgems/mruby-compiler/core/parse.y"
{
backref_error(p, (yyvsp[-2].nd));
(yyval.nd) = new_begin(p, 0);
}
-#line 6258 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6394 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 43:
-#line 1766 "mrbgems/mruby-compiler/core/parse.y"
+ case 47:
+#line 1821 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6266 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6402 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 46:
-#line 1775 "mrbgems/mruby-compiler/core/parse.y"
+ case 50:
+#line 1830 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_and(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6274 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6410 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 47:
-#line 1779 "mrbgems/mruby-compiler/core/parse.y"
+ case 51:
+#line 1834 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_or(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6282 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6418 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 48:
-#line 1783 "mrbgems/mruby-compiler/core/parse.y"
+ case 52:
+#line 1838 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!");
}
-#line 6290 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6426 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 49:
-#line 1787 "mrbgems/mruby-compiler/core/parse.y"
+ case 53:
+#line 1842 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!");
}
-#line 6298 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6434 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 51:
-#line 1795 "mrbgems/mruby-compiler/core/parse.y"
+ case 55:
+#line 1850 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_def(p, (yyvsp[0].id), nint(p->cmdarg_stack), local_switch(p));
p->cmdarg_stack = 0;
p->in_def++;
nvars_block(p);
}
-#line 6309 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6445 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 52:
-#line 1804 "mrbgems/mruby-compiler/core/parse.y"
+ case 56:
+#line 1859 "mrbgems/mruby-compiler/core/parse.y"
{
p->lstate = EXPR_FNAME;
}
-#line 6317 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6453 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 53:
-#line 1808 "mrbgems/mruby-compiler/core/parse.y"
+ case 57:
+#line 1863 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_sdef(p, (yyvsp[-3].nd), (yyvsp[0].id), nint(p->cmdarg_stack), local_switch(p));
p->cmdarg_stack = 0;
@@ -6326,1054 +6462,1054 @@ yyreduce:
nvars_block(p);
p->lstate = EXPR_ENDFN; /* force for args */
}
-#line 6330 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6466 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 54:
-#line 1819 "mrbgems/mruby-compiler/core/parse.y"
+ case 58:
+#line 1874 "mrbgems/mruby-compiler/core/parse.y"
{
if (!(yyvsp[0].nd)) (yyval.nd) = new_nil(p);
else {
(yyval.nd) = (yyvsp[0].nd);
}
}
-#line 6341 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6477 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 58:
-#line 1833 "mrbgems/mruby-compiler/core/parse.y"
+ case 62:
+#line 1888 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
}
-#line 6349 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6485 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 59:
-#line 1839 "mrbgems/mruby-compiler/core/parse.y"
+ case 63:
+#line 1894 "mrbgems/mruby-compiler/core/parse.y"
{
local_nest(p);
nvars_nest(p);
}
-#line 6358 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6494 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 60:
-#line 1846 "mrbgems/mruby-compiler/core/parse.y"
+ case 64:
+#line 1901 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_block(p, (yyvsp[-2].nd), (yyvsp[-1].nd));
local_unnest(p);
nvars_unnest(p);
}
-#line 6368 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6504 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 61:
-#line 1854 "mrbgems/mruby-compiler/core/parse.y"
+ case 65:
+#line 1909 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_fcall(p, (yyvsp[-1].id), (yyvsp[0].nd));
}
-#line 6376 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6512 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 62:
-#line 1858 "mrbgems/mruby-compiler/core/parse.y"
+ case 66:
+#line 1913 "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 6385 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6521 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 63:
-#line 1863 "mrbgems/mruby-compiler/core/parse.y"
+ case 67:
+#line 1918 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
}
-#line 6393 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6529 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 64:
-#line 1867 "mrbgems/mruby-compiler/core/parse.y"
+ case 68:
+#line 1922 "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 6402 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6538 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 65:
-#line 1872 "mrbgems/mruby-compiler/core/parse.y"
+ case 69:
+#line 1927 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), tCOLON2);
}
-#line 6410 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6546 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 66:
-#line 1876 "mrbgems/mruby-compiler/core/parse.y"
+ case 70:
+#line 1931 "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 6419 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6555 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 67:
-#line 1881 "mrbgems/mruby-compiler/core/parse.y"
+ case 71:
+#line 1936 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_super(p, (yyvsp[0].nd));
}
-#line 6427 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6563 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 68:
-#line 1885 "mrbgems/mruby-compiler/core/parse.y"
+ case 72:
+#line 1940 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_yield(p, (yyvsp[0].nd));
}
-#line 6435 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6571 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 69:
-#line 1889 "mrbgems/mruby-compiler/core/parse.y"
+ case 73:
+#line 1944 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_return(p, ret_args(p, (yyvsp[0].nd)));
}
-#line 6443 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6579 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 70:
-#line 1893 "mrbgems/mruby-compiler/core/parse.y"
+ case 74:
+#line 1948 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_break(p, ret_args(p, (yyvsp[0].nd)));
}
-#line 6451 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6587 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 71:
-#line 1897 "mrbgems/mruby-compiler/core/parse.y"
+ case 75:
+#line 1952 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_next(p, ret_args(p, (yyvsp[0].nd)));
}
-#line 6459 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6595 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 72:
-#line 1903 "mrbgems/mruby-compiler/core/parse.y"
+ case 76:
+#line 1958 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 6467 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6603 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 73:
-#line 1907 "mrbgems/mruby-compiler/core/parse.y"
+ case 77:
+#line 1962 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 6475 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6611 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 75:
-#line 1914 "mrbgems/mruby-compiler/core/parse.y"
+ case 79:
+#line 1969 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 6483 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6619 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 76:
-#line 1920 "mrbgems/mruby-compiler/core/parse.y"
+ case 80:
+#line 1975 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 6491 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6627 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 77:
-#line 1924 "mrbgems/mruby-compiler/core/parse.y"
+ case 81:
+#line 1979 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1(push((yyvsp[-1].nd),(yyvsp[0].nd)));
}
-#line 6499 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6635 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 78:
-#line 1928 "mrbgems/mruby-compiler/core/parse.y"
+ case 82:
+#line 1983 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list2((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6507 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6643 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 79:
-#line 1932 "mrbgems/mruby-compiler/core/parse.y"
+ case 83:
+#line 1987 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3((yyvsp[-4].nd), (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6515 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6651 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 80:
-#line 1936 "mrbgems/mruby-compiler/core/parse.y"
+ case 84:
+#line 1991 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list2((yyvsp[-1].nd), new_nil(p));
}
-#line 6523 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6659 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 81:
-#line 1940 "mrbgems/mruby-compiler/core/parse.y"
+ case 85:
+#line 1995 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3((yyvsp[-3].nd), new_nil(p), (yyvsp[0].nd));
}
-#line 6531 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6667 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 82:
-#line 1944 "mrbgems/mruby-compiler/core/parse.y"
+ case 86:
+#line 1999 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list2(0, (yyvsp[0].nd));
}
-#line 6539 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6675 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 83:
-#line 1948 "mrbgems/mruby-compiler/core/parse.y"
+ case 87:
+#line 2003 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3(0, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 6547 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6683 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 84:
-#line 1952 "mrbgems/mruby-compiler/core/parse.y"
+ case 88:
+#line 2007 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list2(0, new_nil(p));
}
-#line 6555 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6691 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 85:
-#line 1956 "mrbgems/mruby-compiler/core/parse.y"
+ case 89:
+#line 2011 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3(0, new_nil(p), (yyvsp[0].nd));
}
-#line 6563 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6699 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 87:
-#line 1963 "mrbgems/mruby-compiler/core/parse.y"
+ case 91:
+#line 2018 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_masgn(p, (yyvsp[-1].nd), NULL);
}
-#line 6571 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6707 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 88:
-#line 1969 "mrbgems/mruby-compiler/core/parse.y"
+ case 92:
+#line 2024 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[-1].nd));
}
-#line 6579 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6715 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 89:
-#line 1973 "mrbgems/mruby-compiler/core/parse.y"
+ case 93:
+#line 2028 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[-1].nd));
}
-#line 6587 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6723 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 90:
-#line 1979 "mrbgems/mruby-compiler/core/parse.y"
+ case 94:
+#line 2034 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 6595 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6731 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 91:
-#line 1983 "mrbgems/mruby-compiler/core/parse.y"
+ case 95:
+#line 2038 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 6603 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6739 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 92:
-#line 1989 "mrbgems/mruby-compiler/core/parse.y"
+ case 96:
+#line 2044 "mrbgems/mruby-compiler/core/parse.y"
{
assignable(p, (yyvsp[0].nd));
}
-#line 6611 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6747 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 93:
-#line 1993 "mrbgems/mruby-compiler/core/parse.y"
+ case 97:
+#line 2048 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_op(aref), (yyvsp[-1].nd), '.');
}
-#line 6619 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6755 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 94:
-#line 1997 "mrbgems/mruby-compiler/core/parse.y"
+ case 98:
+#line 2052 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
}
-#line 6627 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6763 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 95:
-#line 2001 "mrbgems/mruby-compiler/core/parse.y"
+ case 99:
+#line 2056 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2);
}
-#line 6635 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6771 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 96:
-#line 2005 "mrbgems/mruby-compiler/core/parse.y"
+ case 100:
+#line 2060 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
}
-#line 6643 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6779 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 97:
-#line 2009 "mrbgems/mruby-compiler/core/parse.y"
+ case 101:
+#line 2064 "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 6653 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6789 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 98:
-#line 2015 "mrbgems/mruby-compiler/core/parse.y"
+ case 102:
+#line 2070 "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 6663 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6799 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 99:
-#line 2021 "mrbgems/mruby-compiler/core/parse.y"
+ case 103:
+#line 2076 "mrbgems/mruby-compiler/core/parse.y"
{
backref_error(p, (yyvsp[0].nd));
(yyval.nd) = 0;
}
-#line 6672 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6808 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 100:
-#line 2028 "mrbgems/mruby-compiler/core/parse.y"
+ case 104:
+#line 2083 "mrbgems/mruby-compiler/core/parse.y"
{
assignable(p, (yyvsp[0].nd));
}
-#line 6680 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6816 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 101:
-#line 2032 "mrbgems/mruby-compiler/core/parse.y"
+ case 105:
+#line 2087 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_op(aref), (yyvsp[-1].nd), '.');
}
-#line 6688 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6824 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 102:
-#line 2036 "mrbgems/mruby-compiler/core/parse.y"
+ case 106:
+#line 2091 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
}
-#line 6696 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6832 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 103:
-#line 2040 "mrbgems/mruby-compiler/core/parse.y"
+ case 107:
+#line 2095 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2);
}
-#line 6704 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6840 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 104:
-#line 2044 "mrbgems/mruby-compiler/core/parse.y"
+ case 108:
+#line 2099 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num));
}
-#line 6712 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6848 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 105:
-#line 2048 "mrbgems/mruby-compiler/core/parse.y"
+ case 109:
+#line 2103 "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 6722 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6858 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 106:
-#line 2054 "mrbgems/mruby-compiler/core/parse.y"
+ case 110:
+#line 2109 "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 6732 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6868 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 107:
-#line 2060 "mrbgems/mruby-compiler/core/parse.y"
+ case 111:
+#line 2115 "mrbgems/mruby-compiler/core/parse.y"
{
backref_error(p, (yyvsp[0].nd));
(yyval.nd) = 0;
}
-#line 6741 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6877 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 108:
-#line 2065 "mrbgems/mruby-compiler/core/parse.y"
+ case 112:
+#line 2120 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "can't assign to numbered parameter");
}
-#line 6749 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6885 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 109:
-#line 2071 "mrbgems/mruby-compiler/core/parse.y"
+ case 113:
+#line 2126 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "class/module name must be CONSTANT");
}
-#line 6757 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6893 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 111:
-#line 2078 "mrbgems/mruby-compiler/core/parse.y"
+ case 115:
+#line 2133 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = cons(nint(1), nsym((yyvsp[0].id)));
}
-#line 6765 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6901 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 112:
-#line 2082 "mrbgems/mruby-compiler/core/parse.y"
+ case 116:
+#line 2137 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = cons(nint(0), nsym((yyvsp[0].id)));
}
-#line 6773 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6909 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 113:
-#line 2086 "mrbgems/mruby-compiler/core/parse.y"
+ case 117:
+#line 2141 "mrbgems/mruby-compiler/core/parse.y"
{
void_expr_error(p, (yyvsp[-2].nd));
(yyval.nd) = cons((yyvsp[-2].nd), nsym((yyvsp[0].id)));
}
-#line 6782 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6918 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 117:
-#line 2096 "mrbgems/mruby-compiler/core/parse.y"
+ case 121:
+#line 2151 "mrbgems/mruby-compiler/core/parse.y"
{
p->lstate = EXPR_ENDFN;
(yyval.id) = (yyvsp[0].id);
}
-#line 6791 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6927 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 118:
-#line 2101 "mrbgems/mruby-compiler/core/parse.y"
+ case 122:
+#line 2156 "mrbgems/mruby-compiler/core/parse.y"
{
p->lstate = EXPR_ENDFN;
(yyval.id) = (yyvsp[0].id);
}
-#line 6800 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6936 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 121:
-#line 2112 "mrbgems/mruby-compiler/core/parse.y"
+ case 125:
+#line 2167 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_undef(p, (yyvsp[0].id));
}
-#line 6808 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6944 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 122:
-#line 2115 "mrbgems/mruby-compiler/core/parse.y"
+ case 126:
+#line 2170 "mrbgems/mruby-compiler/core/parse.y"
{p->lstate = EXPR_FNAME;}
-#line 6814 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6950 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 123:
-#line 2116 "mrbgems/mruby-compiler/core/parse.y"
+ case 127:
+#line 2171 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-3].nd), nsym((yyvsp[0].id)));
}
-#line 6822 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6958 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 124:
-#line 2121 "mrbgems/mruby-compiler/core/parse.y"
+ case 128:
+#line 2176 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(or); }
-#line 6828 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6964 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 125:
-#line 2122 "mrbgems/mruby-compiler/core/parse.y"
+ case 129:
+#line 2177 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(xor); }
-#line 6834 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6970 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 126:
-#line 2123 "mrbgems/mruby-compiler/core/parse.y"
+ case 130:
+#line 2178 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(and); }
-#line 6840 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6976 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 127:
-#line 2124 "mrbgems/mruby-compiler/core/parse.y"
+ case 131:
+#line 2179 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(cmp); }
-#line 6846 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6982 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 128:
-#line 2125 "mrbgems/mruby-compiler/core/parse.y"
+ case 132:
+#line 2180 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(eq); }
-#line 6852 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6988 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 129:
-#line 2126 "mrbgems/mruby-compiler/core/parse.y"
+ case 133:
+#line 2181 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(eqq); }
-#line 6858 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 6994 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 130:
-#line 2127 "mrbgems/mruby-compiler/core/parse.y"
+ case 134:
+#line 2182 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(match); }
-#line 6864 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7000 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 131:
-#line 2128 "mrbgems/mruby-compiler/core/parse.y"
+ case 135:
+#line 2183 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(nmatch); }
-#line 6870 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7006 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 132:
-#line 2129 "mrbgems/mruby-compiler/core/parse.y"
+ case 136:
+#line 2184 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(gt); }
-#line 6876 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7012 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 133:
-#line 2130 "mrbgems/mruby-compiler/core/parse.y"
+ case 137:
+#line 2185 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(ge); }
-#line 6882 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7018 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 134:
-#line 2131 "mrbgems/mruby-compiler/core/parse.y"
+ case 138:
+#line 2186 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(lt); }
-#line 6888 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7024 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 135:
-#line 2132 "mrbgems/mruby-compiler/core/parse.y"
+ case 139:
+#line 2187 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(le); }
-#line 6894 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7030 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 136:
-#line 2133 "mrbgems/mruby-compiler/core/parse.y"
+ case 140:
+#line 2188 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(neq); }
-#line 6900 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7036 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 137:
-#line 2134 "mrbgems/mruby-compiler/core/parse.y"
+ case 141:
+#line 2189 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(lshift); }
-#line 6906 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7042 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 138:
-#line 2135 "mrbgems/mruby-compiler/core/parse.y"
+ case 142:
+#line 2190 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(rshift); }
-#line 6912 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7048 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 139:
-#line 2136 "mrbgems/mruby-compiler/core/parse.y"
+ case 143:
+#line 2191 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(add); }
-#line 6918 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7054 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 140:
-#line 2137 "mrbgems/mruby-compiler/core/parse.y"
+ case 144:
+#line 2192 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(sub); }
-#line 6924 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7060 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 141:
-#line 2138 "mrbgems/mruby-compiler/core/parse.y"
+ case 145:
+#line 2193 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(mul); }
-#line 6930 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7066 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 142:
-#line 2139 "mrbgems/mruby-compiler/core/parse.y"
+ case 146:
+#line 2194 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(mul); }
-#line 6936 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7072 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 143:
-#line 2140 "mrbgems/mruby-compiler/core/parse.y"
+ case 147:
+#line 2195 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(div); }
-#line 6942 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7078 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 144:
-#line 2141 "mrbgems/mruby-compiler/core/parse.y"
+ case 148:
+#line 2196 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(mod); }
-#line 6948 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7084 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 145:
-#line 2142 "mrbgems/mruby-compiler/core/parse.y"
+ case 149:
+#line 2197 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(pow); }
-#line 6954 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7090 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 146:
-#line 2143 "mrbgems/mruby-compiler/core/parse.y"
+ case 150:
+#line 2198 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(pow); }
-#line 6960 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7096 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 147:
-#line 2144 "mrbgems/mruby-compiler/core/parse.y"
+ case 151:
+#line 2199 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(not); }
-#line 6966 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7102 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 148:
-#line 2145 "mrbgems/mruby-compiler/core/parse.y"
+ case 152:
+#line 2200 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(neg); }
-#line 6972 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7108 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 149:
-#line 2146 "mrbgems/mruby-compiler/core/parse.y"
+ case 153:
+#line 2201 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(plus); }
-#line 6978 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7114 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 150:
-#line 2147 "mrbgems/mruby-compiler/core/parse.y"
+ case 154:
+#line 2202 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(minus); }
-#line 6984 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7120 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 151:
-#line 2148 "mrbgems/mruby-compiler/core/parse.y"
+ case 155:
+#line 2203 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(aref); }
-#line 6990 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7126 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 152:
-#line 2149 "mrbgems/mruby-compiler/core/parse.y"
+ case 156:
+#line 2204 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(aset); }
-#line 6996 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7132 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 153:
-#line 2150 "mrbgems/mruby-compiler/core/parse.y"
+ case 157:
+#line 2205 "mrbgems/mruby-compiler/core/parse.y"
{ (yyval.id) = intern_op(tick); }
-#line 7002 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7138 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 194:
-#line 2168 "mrbgems/mruby-compiler/core/parse.y"
+ case 198:
+#line 2223 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_asgn(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 7010 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7146 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 195:
-#line 2172 "mrbgems/mruby-compiler/core/parse.y"
+ case 199:
+#line 2227 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_op_asgn(p, (yyvsp[-2].nd), (yyvsp[-1].id), (yyvsp[0].nd));
}
-#line 7018 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7154 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 196:
-#line 2176 "mrbgems/mruby-compiler/core/parse.y"
+ case 200:
+#line 2231 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), intern_op(aref), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd));
}
-#line 7026 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7162 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 197:
-#line 2180 "mrbgems/mruby-compiler/core/parse.y"
+ case 201:
+#line 2235 "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 7034 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7170 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 198:
-#line 2184 "mrbgems/mruby-compiler/core/parse.y"
+ case 202:
+#line 2239 "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 7042 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7178 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 199:
-#line 2188 "mrbgems/mruby-compiler/core/parse.y"
+ case 203:
+#line 2243 "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 7050 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7186 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 200:
-#line 2192 "mrbgems/mruby-compiler/core/parse.y"
+ case 204:
+#line 2247 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "constant re-assignment");
(yyval.nd) = new_begin(p, 0);
}
-#line 7059 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7195 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 201:
-#line 2197 "mrbgems/mruby-compiler/core/parse.y"
+ case 205:
+#line 2252 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "constant re-assignment");
(yyval.nd) = new_begin(p, 0);
}
-#line 7068 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7204 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 202:
-#line 2202 "mrbgems/mruby-compiler/core/parse.y"
+ case 206:
+#line 2257 "mrbgems/mruby-compiler/core/parse.y"
{
backref_error(p, (yyvsp[-2].nd));
(yyval.nd) = new_begin(p, 0);
}
-#line 7077 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7213 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 203:
-#line 2207 "mrbgems/mruby-compiler/core/parse.y"
+ case 207:
+#line 2262 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_dot2(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 7085 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7221 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 204:
-#line 2211 "mrbgems/mruby-compiler/core/parse.y"
+ case 208:
+#line 2266 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_dot2(p, (yyvsp[-1].nd), new_nil(p));
}
-#line 7093 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7229 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 205:
-#line 2215 "mrbgems/mruby-compiler/core/parse.y"
+ case 209:
+#line 2270 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_dot2(p, new_nil(p), (yyvsp[0].nd));
}
-#line 7101 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7237 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 206:
-#line 2219 "mrbgems/mruby-compiler/core/parse.y"
+ case 210:
+#line 2274 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_dot3(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 7109 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7245 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 207:
-#line 2223 "mrbgems/mruby-compiler/core/parse.y"
+ case 211:
+#line 2278 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_dot3(p, (yyvsp[-1].nd), new_nil(p));
}
-#line 7117 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7253 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 208:
-#line 2227 "mrbgems/mruby-compiler/core/parse.y"
+ case 212:
+#line 2282 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_dot3(p, new_nil(p), (yyvsp[0].nd));
}
-#line 7125 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7261 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 209:
-#line 2231 "mrbgems/mruby-compiler/core/parse.y"
+ case 213:
+#line 2286 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "+", (yyvsp[0].nd));
}
-#line 7133 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7269 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 210:
-#line 2235 "mrbgems/mruby-compiler/core/parse.y"
+ case 214:
+#line 2290 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "-", (yyvsp[0].nd));
}
-#line 7141 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7277 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 211:
-#line 2239 "mrbgems/mruby-compiler/core/parse.y"
+ case 215:
+#line 2294 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "*", (yyvsp[0].nd));
}
-#line 7149 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7285 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 212:
-#line 2243 "mrbgems/mruby-compiler/core/parse.y"
+ case 216:
+#line 2298 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "/", (yyvsp[0].nd));
}
-#line 7157 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7293 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 213:
-#line 2247 "mrbgems/mruby-compiler/core/parse.y"
+ case 217:
+#line 2302 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "%", (yyvsp[0].nd));
}
-#line 7165 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7301 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 214:
-#line 2251 "mrbgems/mruby-compiler/core/parse.y"
+ case 218:
+#line 2306 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd));
}
-#line 7173 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7309 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 215:
-#line 2255 "mrbgems/mruby-compiler/core/parse.y"
+ case 219:
+#line 2310 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@");
+ (yyval.nd) = new_negate(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)));
}
-#line 7181 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7317 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 216:
-#line 2259 "mrbgems/mruby-compiler/core/parse.y"
+ case 220:
+#line 2314 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@");
+ (yyval.nd) = new_negate(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)));
}
-#line 7189 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7325 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 217:
-#line 2263 "mrbgems/mruby-compiler/core/parse.y"
+ case 221:
+#line 2318 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_uni_op(p, (yyvsp[0].nd), "+@");
}
-#line 7197 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7333 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 218:
-#line 2267 "mrbgems/mruby-compiler/core/parse.y"
+ case 222:
+#line 2322 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = call_uni_op(p, (yyvsp[0].nd), "-@");
+ (yyval.nd) = new_negate(p, (yyvsp[0].nd));
}
-#line 7205 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7341 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 219:
-#line 2271 "mrbgems/mruby-compiler/core/parse.y"
+ case 223:
+#line 2326 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "|", (yyvsp[0].nd));
}
-#line 7213 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7349 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 220:
-#line 2275 "mrbgems/mruby-compiler/core/parse.y"
+ case 224:
+#line 2330 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "^", (yyvsp[0].nd));
}
-#line 7221 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7357 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 221:
-#line 2279 "mrbgems/mruby-compiler/core/parse.y"
+ case 225:
+#line 2334 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "&", (yyvsp[0].nd));
}
-#line 7229 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7365 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 222:
-#line 2283 "mrbgems/mruby-compiler/core/parse.y"
+ case 226:
+#line 2338 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<=>", (yyvsp[0].nd));
}
-#line 7237 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7373 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 223:
-#line 2287 "mrbgems/mruby-compiler/core/parse.y"
+ case 227:
+#line 2342 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">", (yyvsp[0].nd));
}
-#line 7245 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7381 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 224:
-#line 2291 "mrbgems/mruby-compiler/core/parse.y"
+ case 228:
+#line 2346 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">=", (yyvsp[0].nd));
}
-#line 7253 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7389 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 225:
-#line 2295 "mrbgems/mruby-compiler/core/parse.y"
+ case 229:
+#line 2350 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<", (yyvsp[0].nd));
}
-#line 7261 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7397 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 226:
-#line 2299 "mrbgems/mruby-compiler/core/parse.y"
+ case 230:
+#line 2354 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<=", (yyvsp[0].nd));
}
-#line 7269 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7405 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 227:
-#line 2303 "mrbgems/mruby-compiler/core/parse.y"
+ case 231:
+#line 2358 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "==", (yyvsp[0].nd));
}
-#line 7277 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7413 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 228:
-#line 2307 "mrbgems/mruby-compiler/core/parse.y"
+ case 232:
+#line 2362 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "===", (yyvsp[0].nd));
}
-#line 7285 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7421 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 229:
-#line 2311 "mrbgems/mruby-compiler/core/parse.y"
+ case 233:
+#line 2366 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "!=", (yyvsp[0].nd));
}
-#line 7293 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7429 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 230:
-#line 2315 "mrbgems/mruby-compiler/core/parse.y"
+ case 234:
+#line 2370 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "=~", (yyvsp[0].nd));
}
-#line 7301 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7437 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 231:
-#line 2319 "mrbgems/mruby-compiler/core/parse.y"
+ case 235:
+#line 2374 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "!~", (yyvsp[0].nd));
}
-#line 7309 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7445 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 232:
-#line 2323 "mrbgems/mruby-compiler/core/parse.y"
+ case 236:
+#line 2378 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!");
}
-#line 7317 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7453 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 233:
-#line 2327 "mrbgems/mruby-compiler/core/parse.y"
+ case 237:
+#line 2382 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "~");
}
-#line 7325 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7461 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 234:
-#line 2331 "mrbgems/mruby-compiler/core/parse.y"
+ case 238:
+#line 2386 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<<", (yyvsp[0].nd));
}
-#line 7333 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7469 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 235:
-#line 2335 "mrbgems/mruby-compiler/core/parse.y"
+ case 239:
+#line 2390 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">>", (yyvsp[0].nd));
}
-#line 7341 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7477 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 236:
-#line 2339 "mrbgems/mruby-compiler/core/parse.y"
+ case 240:
+#line 2394 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_and(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 7349 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7485 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 237:
-#line 2343 "mrbgems/mruby-compiler/core/parse.y"
+ case 241:
+#line 2398 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_or(p, (yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 7357 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7493 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 238:
-#line 2347 "mrbgems/mruby-compiler/core/parse.y"
+ case 242:
+#line 2402 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_if(p, cond((yyvsp[-5].nd)), (yyvsp[-3].nd), (yyvsp[0].nd));
}
-#line 7365 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7501 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 239:
-#line 2351 "mrbgems/mruby-compiler/core/parse.y"
+ case 243:
+#line 2406 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_if(p, cond((yyvsp[-5].nd)), (yyvsp[-3].nd), (yyvsp[0].nd));
}
-#line 7373 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7509 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 240:
-#line 2355 "mrbgems/mruby-compiler/core/parse.y"
+ case 244:
+#line 2410 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-3].nd);
endless_method_name(p, (yyvsp[-3].nd));
@@ -7382,11 +7518,11 @@ yyreduce:
nvars_unnest(p);
p->in_def--;
}
-#line 7386 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7522 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 241:
-#line 2364 "mrbgems/mruby-compiler/core/parse.y"
+ case 245:
+#line 2419 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-5].nd);
endless_method_name(p, (yyvsp[-5].nd));
@@ -7396,11 +7532,11 @@ yyreduce:
nvars_unnest(p);
p->in_def--;
}
-#line 7400 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7536 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 242:
-#line 2374 "mrbgems/mruby-compiler/core/parse.y"
+ case 246:
+#line 2429 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-3].nd);
void_expr_error(p, (yyvsp[0].nd));
@@ -7409,11 +7545,11 @@ yyreduce:
p->in_def--;
p->in_single--;
}
-#line 7413 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7549 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 243:
-#line 2383 "mrbgems/mruby-compiler/core/parse.y"
+ case 247:
+#line 2438 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-5].nd);
void_expr_error(p, (yyvsp[-2].nd));
@@ -7423,71 +7559,71 @@ yyreduce:
p->in_def--;
p->in_single--;
}
-#line 7427 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7563 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 244:
-#line 2393 "mrbgems/mruby-compiler/core/parse.y"
+ case 248:
+#line 2448 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 7435 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7571 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 246:
-#line 2400 "mrbgems/mruby-compiler/core/parse.y"
+ case 250:
+#line 2455 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
}
-#line 7444 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7580 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 247:
-#line 2405 "mrbgems/mruby-compiler/core/parse.y"
+ case 251:
+#line 2460 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-3].nd), new_kw_hash(p, (yyvsp[-1].nd)));
}
-#line 7452 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7588 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 248:
-#line 2409 "mrbgems/mruby-compiler/core/parse.y"
+ case 252:
+#line 2464 "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 7461 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7597 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 249:
-#line 2416 "mrbgems/mruby-compiler/core/parse.y"
+ case 253:
+#line 2471 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 7469 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7605 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 250:
-#line 2420 "mrbgems/mruby-compiler/core/parse.y"
+ case 254:
+#line 2475 "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 7479 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7615 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 251:
-#line 2428 "mrbgems/mruby-compiler/core/parse.y"
+ case 255:
+#line 2483 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 7487 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7623 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 252:
-#line 2432 "mrbgems/mruby-compiler/core/parse.y"
+ case 256:
+#line 2487 "mrbgems/mruby-compiler/core/parse.y"
{
#if 1
mrb_sym r = intern_op(mul);
@@ -7503,11 +7639,11 @@ yyreduce:
new_block_arg(p, new_lvar(p, b)));
#endif
}
-#line 7507 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7643 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 253:
-#line 2448 "mrbgems/mruby-compiler/core/parse.y"
+ case 257:
+#line 2503 "mrbgems/mruby-compiler/core/parse.y"
{
#if 1
mrb_sym r = intern_op(mul);
@@ -7531,373 +7667,373 @@ yyreduce:
(yyval.nd) = 0;
}
}
-#line 7535 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7671 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 258:
-#line 2480 "mrbgems/mruby-compiler/core/parse.y"
+ case 262:
+#line 2535 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = cons((yyvsp[-1].nd),0);
NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
}
-#line 7544 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7680 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 259:
-#line 2485 "mrbgems/mruby-compiler/core/parse.y"
+ case 263:
+#line 2540 "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 7553 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7689 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 260:
-#line 2490 "mrbgems/mruby-compiler/core/parse.y"
+ case 264:
+#line 2545 "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 7562 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7698 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 261:
-#line 2497 "mrbgems/mruby-compiler/core/parse.y"
+ case 265:
+#line 2552 "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 7572 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7708 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 262:
-#line 2503 "mrbgems/mruby-compiler/core/parse.y"
+ case 266:
+#line 2558 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = cons((yyvsp[-1].nd), (yyvsp[0].nd));
NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
}
-#line 7581 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7717 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 263:
-#line 2508 "mrbgems/mruby-compiler/core/parse.y"
+ case 267:
+#line 2563 "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 7590 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7726 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 264:
-#line 2513 "mrbgems/mruby-compiler/core/parse.y"
+ case 268:
+#line 2568 "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 7599 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7735 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 265:
-#line 2518 "mrbgems/mruby-compiler/core/parse.y"
+ case 269:
+#line 2573 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = cons(0, (yyvsp[0].nd));
NODE_LINENO((yyval.nd), (yyvsp[0].nd));
}
-#line 7608 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7744 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 266:
-#line 2524 "mrbgems/mruby-compiler/core/parse.y"
+ case 270:
+#line 2579 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.stack) = p->cmdarg_stack;
CMDARG_PUSH(1);
}
-#line 7617 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7753 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 267:
-#line 2529 "mrbgems/mruby-compiler/core/parse.y"
+ case 271:
+#line 2584 "mrbgems/mruby-compiler/core/parse.y"
{
p->cmdarg_stack = (yyvsp[-1].stack);
(yyval.nd) = (yyvsp[0].nd);
}
-#line 7626 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7762 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 268:
-#line 2536 "mrbgems/mruby-compiler/core/parse.y"
+ case 272:
+#line 2591 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_block_arg(p, (yyvsp[0].nd));
}
-#line 7634 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7770 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 269:
-#line 2542 "mrbgems/mruby-compiler/core/parse.y"
+ case 273:
+#line 2597 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 7642 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7778 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 270:
-#line 2546 "mrbgems/mruby-compiler/core/parse.y"
+ case 274:
+#line 2601 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = 0;
}
-#line 7650 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7786 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 273:
-#line 2556 "mrbgems/mruby-compiler/core/parse.y"
+ case 276:
+#line 2610 "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 7660 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7796 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 274:
-#line 2562 "mrbgems/mruby-compiler/core/parse.y"
+ case 277:
+#line 2616 "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 7670 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7806 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 275:
-#line 2568 "mrbgems/mruby-compiler/core/parse.y"
+ case 278:
+#line 2622 "mrbgems/mruby-compiler/core/parse.y"
{
void_expr_error(p, (yyvsp[0].nd));
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 7679 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7815 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 276:
-#line 2573 "mrbgems/mruby-compiler/core/parse.y"
+ case 279:
+#line 2627 "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 7688 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7824 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 277:
-#line 2580 "mrbgems/mruby-compiler/core/parse.y"
+ case 280:
+#line 2634 "mrbgems/mruby-compiler/core/parse.y"
{
void_expr_error(p, (yyvsp[0].nd));
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 7697 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7833 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 278:
-#line 2585 "mrbgems/mruby-compiler/core/parse.y"
+ case 281:
+#line 2639 "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 7706 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7842 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 279:
-#line 2590 "mrbgems/mruby-compiler/core/parse.y"
+ case 282:
+#line 2644 "mrbgems/mruby-compiler/core/parse.y"
{
void_expr_error(p, (yyvsp[0].nd));
(yyval.nd) = list1(new_splat(p, (yyvsp[0].nd)));
}
-#line 7715 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7851 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 287:
-#line 2604 "mrbgems/mruby-compiler/core/parse.y"
+ case 290:
+#line 2658 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_nvar(p, (yyvsp[0].num));
}
-#line 7723 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7859 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 288:
-#line 2608 "mrbgems/mruby-compiler/core/parse.y"
+ case 291:
+#line 2662 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_fcall(p, (yyvsp[0].id), 0);
}
-#line 7731 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7867 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 289:
-#line 2612 "mrbgems/mruby-compiler/core/parse.y"
+ case 292:
+#line 2666 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.stack) = p->cmdarg_stack;
p->cmdarg_stack = 0;
}
-#line 7740 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7876 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 290:
-#line 2618 "mrbgems/mruby-compiler/core/parse.y"
+ case 293:
+#line 2672 "mrbgems/mruby-compiler/core/parse.y"
{
p->cmdarg_stack = (yyvsp[-2].stack);
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 7749 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7885 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 291:
-#line 2623 "mrbgems/mruby-compiler/core/parse.y"
+ case 294:
+#line 2677 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.stack) = p->cmdarg_stack;
p->cmdarg_stack = 0;
}
-#line 7758 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7894 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 292:
-#line 2627 "mrbgems/mruby-compiler/core/parse.y"
+ case 295:
+#line 2681 "mrbgems/mruby-compiler/core/parse.y"
{p->lstate = EXPR_ENDARG;}
-#line 7764 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7900 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 293:
-#line 2628 "mrbgems/mruby-compiler/core/parse.y"
+ case 296:
+#line 2682 "mrbgems/mruby-compiler/core/parse.y"
{
p->cmdarg_stack = (yyvsp[-3].stack);
(yyval.nd) = (yyvsp[-2].nd);
}
-#line 7773 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7909 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 294:
-#line 2632 "mrbgems/mruby-compiler/core/parse.y"
+ case 297:
+#line 2686 "mrbgems/mruby-compiler/core/parse.y"
{p->lstate = EXPR_ENDARG;}
-#line 7779 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7915 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 295:
-#line 2633 "mrbgems/mruby-compiler/core/parse.y"
+ case 298:
+#line 2687 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_nil(p);
}
-#line 7787 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7923 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 296:
-#line 2637 "mrbgems/mruby-compiler/core/parse.y"
+ case 299:
+#line 2691 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 7795 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7931 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 297:
-#line 2641 "mrbgems/mruby-compiler/core/parse.y"
+ case 300:
+#line 2695 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_colon2(p, (yyvsp[-2].nd), (yyvsp[0].id));
}
-#line 7803 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7939 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 298:
-#line 2645 "mrbgems/mruby-compiler/core/parse.y"
+ case 301:
+#line 2699 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_colon3(p, (yyvsp[0].id));
}
-#line 7811 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7947 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 299:
-#line 2649 "mrbgems/mruby-compiler/core/parse.y"
+ case 302:
+#line 2703 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_array(p, (yyvsp[-1].nd));
NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
}
-#line 7820 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7956 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 300:
-#line 2654 "mrbgems/mruby-compiler/core/parse.y"
+ case 303:
+#line 2708 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_hash(p, (yyvsp[-1].nd));
NODE_LINENO((yyval.nd), (yyvsp[-1].nd));
}
-#line 7829 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7965 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 301:
-#line 2659 "mrbgems/mruby-compiler/core/parse.y"
+ case 304:
+#line 2713 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_return(p, 0);
}
-#line 7837 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7973 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 302:
-#line 2663 "mrbgems/mruby-compiler/core/parse.y"
+ case 305:
+#line 2717 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_yield(p, (yyvsp[0].nd));
}
-#line 7845 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7981 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 303:
-#line 2667 "mrbgems/mruby-compiler/core/parse.y"
+ case 306:
+#line 2721 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_uni_op(p, cond((yyvsp[-1].nd)), "!");
}
-#line 7853 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7989 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 304:
-#line 2671 "mrbgems/mruby-compiler/core/parse.y"
+ case 307:
+#line 2725 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = call_uni_op(p, new_nil(p), "!");
}
-#line 7861 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 7997 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 305:
-#line 2675 "mrbgems/mruby-compiler/core/parse.y"
+ case 308:
+#line 2729 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_fcall(p, (yyvsp[-1].id), cons(0, (yyvsp[0].nd)));
}
-#line 7869 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8005 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 307:
-#line 2680 "mrbgems/mruby-compiler/core/parse.y"
+ case 310:
+#line 2734 "mrbgems/mruby-compiler/core/parse.y"
{
call_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd));
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 7878 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8014 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 308:
-#line 2685 "mrbgems/mruby-compiler/core/parse.y"
+ case 311:
+#line 2739 "mrbgems/mruby-compiler/core/parse.y"
{
local_nest(p);
(yyval.num) = p->lpar_beg;
p->lpar_beg = ++p->paren_nest;
}
-#line 7888 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8024 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 309:
-#line 2691 "mrbgems/mruby-compiler/core/parse.y"
+ case 312:
+#line 2745 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.stack) = p->cmdarg_stack;
p->cmdarg_stack = 0;
}
-#line 7897 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8033 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 310:
-#line 2696 "mrbgems/mruby-compiler/core/parse.y"
+ case 313:
+#line 2750 "mrbgems/mruby-compiler/core/parse.y"
{
p->lpar_beg = (yyvsp[-3].num);
(yyval.nd) = new_lambda(p, (yyvsp[-2].nd), (yyvsp[0].nd));
@@ -7905,149 +8041,149 @@ yyreduce:
p->cmdarg_stack = (yyvsp[-1].stack);
CMDARG_LEXPOP();
}
-#line 7909 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8045 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 311:
-#line 2707 "mrbgems/mruby-compiler/core/parse.y"
+ case 314:
+#line 2761 "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 7918 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8054 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 312:
-#line 2715 "mrbgems/mruby-compiler/core/parse.y"
+ case 315:
+#line 2769 "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 7927 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8063 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 313:
-#line 2719 "mrbgems/mruby-compiler/core/parse.y"
+ case 316:
+#line 2773 "mrbgems/mruby-compiler/core/parse.y"
{COND_PUSH(1);}
-#line 7933 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8069 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 314:
-#line 2719 "mrbgems/mruby-compiler/core/parse.y"
+ case 317:
+#line 2773 "mrbgems/mruby-compiler/core/parse.y"
{COND_POP();}
-#line 7939 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8075 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 315:
-#line 2722 "mrbgems/mruby-compiler/core/parse.y"
+ case 318:
+#line 2776 "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 7948 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8084 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 316:
-#line 2726 "mrbgems/mruby-compiler/core/parse.y"
+ case 319:
+#line 2780 "mrbgems/mruby-compiler/core/parse.y"
{COND_PUSH(1);}
-#line 7954 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8090 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 317:
-#line 2726 "mrbgems/mruby-compiler/core/parse.y"
+ case 320:
+#line 2780 "mrbgems/mruby-compiler/core/parse.y"
{COND_POP();}
-#line 7960 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8096 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 318:
-#line 2729 "mrbgems/mruby-compiler/core/parse.y"
+ case 321:
+#line 2783 "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 7969 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8105 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 319:
-#line 2736 "mrbgems/mruby-compiler/core/parse.y"
+ case 322:
+#line 2790 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_case(p, (yyvsp[-3].nd), (yyvsp[-1].nd));
}
-#line 7977 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8113 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 320:
-#line 2740 "mrbgems/mruby-compiler/core/parse.y"
+ case 323:
+#line 2794 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_case(p, 0, (yyvsp[-1].nd));
}
-#line 7985 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8121 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 321:
-#line 2744 "mrbgems/mruby-compiler/core/parse.y"
+ case 324:
+#line 2798 "mrbgems/mruby-compiler/core/parse.y"
{COND_PUSH(1);}
-#line 7991 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8127 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 322:
-#line 2746 "mrbgems/mruby-compiler/core/parse.y"
+ case 325:
+#line 2800 "mrbgems/mruby-compiler/core/parse.y"
{COND_POP();}
-#line 7997 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8133 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 323:
-#line 2749 "mrbgems/mruby-compiler/core/parse.y"
+ case 326:
+#line 2803 "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 8006 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8142 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 324:
-#line 2755 "mrbgems/mruby-compiler/core/parse.y"
+ case 327:
+#line 2809 "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 8017 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8153 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 325:
-#line 2763 "mrbgems/mruby-compiler/core/parse.y"
+ case 328:
+#line 2817 "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 8028 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8164 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 326:
-#line 2771 "mrbgems/mruby-compiler/core/parse.y"
+ case 329:
+#line 2825 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.num) = p->in_def;
p->in_def = 0;
}
-#line 8037 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8173 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 327:
-#line 2776 "mrbgems/mruby-compiler/core/parse.y"
+ case 330:
+#line 2830 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = cons(local_switch(p), nint(p->in_single));
nvars_block(p);
p->in_single = 0;
}
-#line 8047 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8183 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 328:
-#line 2783 "mrbgems/mruby-compiler/core/parse.y"
+ case 331:
+#line 2837 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_sclass(p, (yyvsp[-5].nd), (yyvsp[-1].nd));
SET_LINENO((yyval.nd), (yyvsp[-7].num));
@@ -8056,44 +8192,44 @@ yyreduce:
p->in_def = (yyvsp[-4].num);
p->in_single = intn((yyvsp[-2].nd)->cdr);
}
-#line 8060 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8196 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 329:
-#line 2793 "mrbgems/mruby-compiler/core/parse.y"
+ case 332:
+#line 2847 "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 8071 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8207 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 330:
-#line 2801 "mrbgems/mruby-compiler/core/parse.y"
+ case 333:
+#line 2855 "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 8082 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8218 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 331:
-#line 2811 "mrbgems/mruby-compiler/core/parse.y"
+ case 334:
+#line 2865 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-3].nd);
defn_setup(p, (yyval.nd), (yyvsp[-2].nd), (yyvsp[-1].nd));
nvars_unnest(p);
p->in_def--;
}
-#line 8093 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8229 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 332:
-#line 2821 "mrbgems/mruby-compiler/core/parse.y"
+ case 335:
+#line 2875 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-3].nd);
defs_setup(p, (yyval.nd), (yyvsp[-2].nd), (yyvsp[-1].nd));
@@ -8101,451 +8237,451 @@ yyreduce:
p->in_def--;
p->in_single--;
}
-#line 8105 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8241 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 333:
-#line 2829 "mrbgems/mruby-compiler/core/parse.y"
+ case 336:
+#line 2883 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_break(p, 0);
}
-#line 8113 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8249 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 334:
-#line 2833 "mrbgems/mruby-compiler/core/parse.y"
+ case 337:
+#line 2887 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_next(p, 0);
}
-#line 8121 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8257 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 335:
-#line 2837 "mrbgems/mruby-compiler/core/parse.y"
+ case 338:
+#line 2891 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_redo(p);
}
-#line 8129 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8265 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 336:
-#line 2841 "mrbgems/mruby-compiler/core/parse.y"
+ case 339:
+#line 2895 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_retry(p);
}
-#line 8137 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8273 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 337:
-#line 2847 "mrbgems/mruby-compiler/core/parse.y"
+ case 340:
+#line 2901 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
if (!(yyval.nd)) (yyval.nd) = new_nil(p);
}
-#line 8146 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8282 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 344:
-#line 2866 "mrbgems/mruby-compiler/core/parse.y"
+ case 347:
+#line 2920 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_if(p, cond((yyvsp[-3].nd)), (yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 8154 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8290 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 346:
-#line 2873 "mrbgems/mruby-compiler/core/parse.y"
+ case 349:
+#line 2927 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8162 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8298 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 347:
-#line 2879 "mrbgems/mruby-compiler/core/parse.y"
+ case 350:
+#line 2933 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1(list1((yyvsp[0].nd)));
}
-#line 8170 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8306 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 349:
-#line 2886 "mrbgems/mruby-compiler/core/parse.y"
+ case 352:
+#line 2940 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3((yyvsp[0].nd),0,0);
}
-#line 8178 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8314 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 350:
-#line 2890 "mrbgems/mruby-compiler/core/parse.y"
+ case 353:
+#line 2944 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3((yyvsp[-3].nd), new_arg(p, (yyvsp[0].id)), 0);
}
-#line 8186 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8322 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 351:
-#line 2894 "mrbgems/mruby-compiler/core/parse.y"
+ case 354:
+#line 2948 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3((yyvsp[-5].nd), new_arg(p, (yyvsp[-2].id)), (yyvsp[0].nd));
}
-#line 8194 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8330 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 352:
-#line 2898 "mrbgems/mruby-compiler/core/parse.y"
+ case 355:
+#line 2952 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, 0);
(yyval.nd) = list3((yyvsp[-2].nd), nint(-1), 0);
}
-#line 8203 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8339 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 353:
-#line 2903 "mrbgems/mruby-compiler/core/parse.y"
+ case 356:
+#line 2957 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3((yyvsp[-4].nd), nint(-1), (yyvsp[0].nd));
}
-#line 8211 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8347 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 354:
-#line 2907 "mrbgems/mruby-compiler/core/parse.y"
+ case 357:
+#line 2961 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3(0, new_arg(p, (yyvsp[0].id)), 0);
}
-#line 8219 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8355 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 355:
-#line 2911 "mrbgems/mruby-compiler/core/parse.y"
+ case 358:
+#line 2965 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3(0, new_arg(p, (yyvsp[-2].id)), (yyvsp[0].nd));
}
-#line 8227 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8363 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 356:
-#line 2915 "mrbgems/mruby-compiler/core/parse.y"
+ case 359:
+#line 2969 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, 0);
(yyval.nd) = list3(0, nint(-1), 0);
}
-#line 8236 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8372 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 357:
-#line 2920 "mrbgems/mruby-compiler/core/parse.y"
+ case 360:
+#line 2974 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, 0);
}
-#line 8244 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8380 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 358:
-#line 2924 "mrbgems/mruby-compiler/core/parse.y"
+ case 361:
+#line 2978 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list3(0, nint(-1), (yyvsp[0].nd));
}
-#line 8252 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8388 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 359:
-#line 2930 "mrbgems/mruby-compiler/core/parse.y"
+ case 362:
+#line 2984 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, (yyvsp[-3].nd), (yyvsp[-1].nd), (yyvsp[0].id));
}
-#line 8260 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8396 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 360:
-#line 2934 "mrbgems/mruby-compiler/core/parse.y"
+ case 363:
+#line 2988 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, (yyvsp[-1].nd), 0, (yyvsp[0].id));
}
-#line 8268 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8404 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 361:
-#line 2938 "mrbgems/mruby-compiler/core/parse.y"
+ case 364:
+#line 2992 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, 0, (yyvsp[-1].nd), (yyvsp[0].id));
}
-#line 8276 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8412 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 362:
-#line 2942 "mrbgems/mruby-compiler/core/parse.y"
+ case 365:
+#line 2996 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, 0, 0, (yyvsp[0].id));
}
-#line 8284 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8420 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 363:
-#line 2948 "mrbgems/mruby-compiler/core/parse.y"
+ case 366:
+#line 3002 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8292 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8428 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 364:
-#line 2952 "mrbgems/mruby-compiler/core/parse.y"
+ case 367:
+#line 3006 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, 0, 0, 0);
}
-#line 8300 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8436 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 365:
-#line 2958 "mrbgems/mruby-compiler/core/parse.y"
+ case 368:
+#line 3012 "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 8308 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8444 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 366:
-#line 2962 "mrbgems/mruby-compiler/core/parse.y"
+ case 369:
+#line 3016 "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 8316 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8452 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 367:
-#line 2966 "mrbgems/mruby-compiler/core/parse.y"
+ case 370:
+#line 3020 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, (yyvsp[-3].nd), (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
}
-#line 8324 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8460 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 368:
-#line 2970 "mrbgems/mruby-compiler/core/parse.y"
+ case 371:
+#line 3024 "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 8332 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8468 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 369:
-#line 2974 "mrbgems/mruby-compiler/core/parse.y"
+ case 372:
+#line 3028 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
}
-#line 8340 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8476 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 370:
-#line 2978 "mrbgems/mruby-compiler/core/parse.y"
+ case 373:
+#line 3032 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, (yyvsp[-2].nd), 0, 0, 0, (yyvsp[0].nd));
}
-#line 8348 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8484 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 371:
-#line 2982 "mrbgems/mruby-compiler/core/parse.y"
+ case 374:
+#line 3036 "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 8356 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8492 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 372:
-#line 2986 "mrbgems/mruby-compiler/core/parse.y"
+ case 375:
+#line 3040 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, (yyvsp[-1].nd), 0, 0, 0, (yyvsp[0].nd));
}
-#line 8364 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8500 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 373:
-#line 2990 "mrbgems/mruby-compiler/core/parse.y"
+ case 376:
+#line 3044 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd));
}
-#line 8372 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8508 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 374:
-#line 2994 "mrbgems/mruby-compiler/core/parse.y"
+ case 377:
+#line 3048 "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 8380 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8516 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 375:
-#line 2998 "mrbgems/mruby-compiler/core/parse.y"
+ case 378:
+#line 3052 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
}
-#line 8388 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8524 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 376:
-#line 3002 "mrbgems/mruby-compiler/core/parse.y"
+ case 379:
+#line 3056 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 8396 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8532 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 377:
-#line 3006 "mrbgems/mruby-compiler/core/parse.y"
+ case 380:
+#line 3060 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
}
-#line 8404 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8540 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 378:
-#line 3010 "mrbgems/mruby-compiler/core/parse.y"
+ case 381:
+#line 3064 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 8412 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8548 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 379:
-#line 3014 "mrbgems/mruby-compiler/core/parse.y"
+ case 382:
+#line 3068 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[0].nd));
}
-#line 8420 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8556 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 380:
-#line 3020 "mrbgems/mruby-compiler/core/parse.y"
+ case 383:
+#line 3074 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_blk(p, 0);
(yyval.nd) = 0;
}
-#line 8429 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8565 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 381:
-#line 3025 "mrbgems/mruby-compiler/core/parse.y"
+ case 384:
+#line 3079 "mrbgems/mruby-compiler/core/parse.y"
{
p->cmd_start = TRUE;
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8438 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8574 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 382:
-#line 3031 "mrbgems/mruby-compiler/core/parse.y"
+ case 385:
+#line 3085 "mrbgems/mruby-compiler/core/parse.y"
{local_add_blk(p, 0);}
-#line 8444 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8580 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 383:
-#line 3032 "mrbgems/mruby-compiler/core/parse.y"
+ case 386:
+#line 3086 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = 0;
}
-#line 8452 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8588 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 384:
-#line 3036 "mrbgems/mruby-compiler/core/parse.y"
+ case 387:
+#line 3090 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_blk(p, 0);
(yyval.nd) = 0;
}
-#line 8461 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8597 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 385:
-#line 3041 "mrbgems/mruby-compiler/core/parse.y"
+ case 388:
+#line 3095 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-2].nd);
}
-#line 8469 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8605 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 386:
-#line 3048 "mrbgems/mruby-compiler/core/parse.y"
+ case 389:
+#line 3102 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = 0;
}
-#line 8477 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8613 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 387:
-#line 3052 "mrbgems/mruby-compiler/core/parse.y"
+ case 390:
+#line 3106 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = 0;
}
-#line 8485 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8621 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 390:
-#line 3062 "mrbgems/mruby-compiler/core/parse.y"
+ case 393:
+#line 3116 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, (yyvsp[0].id));
new_bv(p, (yyvsp[0].id));
}
-#line 8494 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8630 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 392:
-#line 3070 "mrbgems/mruby-compiler/core/parse.y"
+ case 395:
+#line 3124 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-2].nd);
}
-#line 8502 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8638 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 393:
-#line 3074 "mrbgems/mruby-compiler/core/parse.y"
+ case 396:
+#line 3128 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8510 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8646 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 394:
-#line 3080 "mrbgems/mruby-compiler/core/parse.y"
+ case 397:
+#line 3134 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 8518 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8654 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 395:
-#line 3084 "mrbgems/mruby-compiler/core/parse.y"
+ case 398:
+#line 3138 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 8526 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8662 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 396:
-#line 3090 "mrbgems/mruby-compiler/core/parse.y"
+ case 399:
+#line 3144 "mrbgems/mruby-compiler/core/parse.y"
{
local_nest(p);
nvars_nest(p);
}
-#line 8535 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8671 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 397:
-#line 3097 "mrbgems/mruby-compiler/core/parse.y"
+ case 400:
+#line 3151 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_block(p,(yyvsp[-2].nd),(yyvsp[-1].nd));
local_unnest(p);
nvars_unnest(p);
}
-#line 8545 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8681 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 398:
-#line 3105 "mrbgems/mruby-compiler/core/parse.y"
+ case 401:
+#line 3159 "mrbgems/mruby-compiler/core/parse.y"
{
if (typen((yyvsp[-1].nd)->car) == NODE_YIELD) {
yyerror(p, "block given to yield");
@@ -8555,159 +8691,159 @@ yyreduce:
}
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 8559 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8695 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 399:
-#line 3115 "mrbgems/mruby-compiler/core/parse.y"
+ case 402:
+#line 3169 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
}
-#line 8567 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8703 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 400:
-#line 3119 "mrbgems/mruby-compiler/core/parse.y"
+ case 403:
+#line 3173 "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 8576 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8712 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 401:
-#line 3124 "mrbgems/mruby-compiler/core/parse.y"
+ case 404:
+#line 3178 "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 8585 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8721 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 402:
-#line 3131 "mrbgems/mruby-compiler/core/parse.y"
+ case 405:
+#line 3185 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_fcall(p, (yyvsp[-1].id), (yyvsp[0].nd));
}
-#line 8593 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8729 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 403:
-#line 3135 "mrbgems/mruby-compiler/core/parse.y"
+ case 406:
+#line 3189 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num));
}
-#line 8601 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8737 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 404:
-#line 3139 "mrbgems/mruby-compiler/core/parse.y"
+ case 407:
+#line 3193 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), tCOLON2);
}
-#line 8609 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8745 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 405:
-#line 3143 "mrbgems/mruby-compiler/core/parse.y"
+ case 408:
+#line 3197 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2);
}
-#line 8617 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8753 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 406:
-#line 3147 "mrbgems/mruby-compiler/core/parse.y"
+ case 409:
+#line 3201 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), MRB_SYM_2(p->mrb, call), (yyvsp[0].nd), (yyvsp[-1].num));
}
-#line 8625 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8761 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 407:
-#line 3151 "mrbgems/mruby-compiler/core/parse.y"
+ case 410:
+#line 3205 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-2].nd), MRB_SYM_2(p->mrb, call), (yyvsp[0].nd), tCOLON2);
}
-#line 8633 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8769 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 408:
-#line 3155 "mrbgems/mruby-compiler/core/parse.y"
+ case 411:
+#line 3209 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_super(p, (yyvsp[0].nd));
}
-#line 8641 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8777 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 409:
-#line 3159 "mrbgems/mruby-compiler/core/parse.y"
+ case 412:
+#line 3213 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_zsuper(p);
}
-#line 8649 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8785 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 410:
-#line 3163 "mrbgems/mruby-compiler/core/parse.y"
+ case 413:
+#line 3217 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_op(aref), (yyvsp[-1].nd), '.');
}
-#line 8657 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8793 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 411:
-#line 3169 "mrbgems/mruby-compiler/core/parse.y"
+ case 414:
+#line 3223 "mrbgems/mruby-compiler/core/parse.y"
{
local_nest(p);
nvars_nest(p);
(yyval.num) = p->lineno;
}
-#line 8667 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8803 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 412:
-#line 3176 "mrbgems/mruby-compiler/core/parse.y"
+ case 415:
+#line 3230 "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 8678 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8814 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 413:
-#line 3183 "mrbgems/mruby-compiler/core/parse.y"
+ case 416:
+#line 3237 "mrbgems/mruby-compiler/core/parse.y"
{
local_nest(p);
nvars_nest(p);
(yyval.num) = p->lineno;
}
-#line 8688 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8824 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 414:
-#line 3190 "mrbgems/mruby-compiler/core/parse.y"
+ case 417:
+#line 3244 "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 8699 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8835 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 415:
-#line 3201 "mrbgems/mruby-compiler/core/parse.y"
+ case 418:
+#line 3255 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = cons(cons((yyvsp[-3].nd), (yyvsp[-1].nd)), (yyvsp[0].nd));
}
-#line 8707 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8843 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 416:
-#line 3207 "mrbgems/mruby-compiler/core/parse.y"
+ case 419:
+#line 3261 "mrbgems/mruby-compiler/core/parse.y"
{
if ((yyvsp[0].nd)) {
(yyval.nd) = cons(cons(0, (yyvsp[0].nd)), 0);
@@ -8716,383 +8852,415 @@ yyreduce:
(yyval.nd) = 0;
}
}
-#line 8720 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8856 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 418:
-#line 3221 "mrbgems/mruby-compiler/core/parse.y"
+ case 421:
+#line 3275 "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 8729 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8865 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 420:
-#line 3229 "mrbgems/mruby-compiler/core/parse.y"
+ case 423:
+#line 3283 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 8737 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8873 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 423:
-#line 3237 "mrbgems/mruby-compiler/core/parse.y"
+ case 426:
+#line 3291 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8745 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8881 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 425:
-#line 3244 "mrbgems/mruby-compiler/core/parse.y"
+ case 428:
+#line 3298 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8753 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8889 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 432:
-#line 3258 "mrbgems/mruby-compiler/core/parse.y"
+ case 435:
+#line 3312 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = concat_string(p, (yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 8761 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8897 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 435:
-#line 3266 "mrbgems/mruby-compiler/core/parse.y"
+ case 438:
+#line 3320 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8769 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8905 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 436:
-#line 3270 "mrbgems/mruby-compiler/core/parse.y"
+ case 439:
+#line 3324 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = new_dstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ node *n = (yyvsp[-1].nd);
+ if (intn((yyvsp[0].nd)->cdr->cdr) > 0) {
+ n = push(n, (yyvsp[0].nd));
+ }
+ else {
+ cons_free((yyvsp[0].nd));
+ }
+ (yyval.nd) = new_dstr(p, n);
}
-#line 8777 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8920 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 438:
-#line 3277 "mrbgems/mruby-compiler/core/parse.y"
+ case 441:
+#line 3338 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = append((yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 8785 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8928 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 439:
-#line 3283 "mrbgems/mruby-compiler/core/parse.y"
+ case 442:
+#line 3344 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 8793 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8936 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 440:
-#line 3287 "mrbgems/mruby-compiler/core/parse.y"
+ case 443:
+#line 3348 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = p->lex_strterm;
p->lex_strterm = NULL;
}
-#line 8802 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8945 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 441:
-#line 3293 "mrbgems/mruby-compiler/core/parse.y"
+ case 444:
+#line 3354 "mrbgems/mruby-compiler/core/parse.y"
{
p->lex_strterm = (yyvsp[-2].nd);
(yyval.nd) = list2((yyvsp[-3].nd), (yyvsp[-1].nd));
}
-#line 8811 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8954 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 442:
-#line 3298 "mrbgems/mruby-compiler/core/parse.y"
+ case 445:
+#line 3359 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1(new_literal_delim(p));
}
-#line 8819 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8962 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 443:
-#line 3302 "mrbgems/mruby-compiler/core/parse.y"
+ case 446:
+#line 3363 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1(new_literal_delim(p));
}
-#line 8827 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8970 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 444:
-#line 3308 "mrbgems/mruby-compiler/core/parse.y"
+ case 447:
+#line 3369 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8835 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8978 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 445:
-#line 3312 "mrbgems/mruby-compiler/core/parse.y"
+ case 448:
+#line 3373 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = new_dxstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ node *n = (yyvsp[-1].nd);
+ if (intn((yyvsp[0].nd)->cdr->cdr) > 0) {
+ n = push(n, (yyvsp[0].nd));
+ }
+ else {
+ cons_free((yyvsp[0].nd));
+ }
+ (yyval.nd) = new_dxstr(p, n);
}
-#line 8843 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 8993 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 446:
-#line 3318 "mrbgems/mruby-compiler/core/parse.y"
+ case 449:
+#line 3386 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 8851 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9001 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 447:
-#line 3322 "mrbgems/mruby-compiler/core/parse.y"
+ case 450:
+#line 3390 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_dregx(p, (yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 8859 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9009 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 451:
-#line 3335 "mrbgems/mruby-compiler/core/parse.y"
+ case 454:
+#line 3403 "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 8869 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9019 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 452:
-#line 3341 "mrbgems/mruby-compiler/core/parse.y"
+ case 455:
+#line 3409 "mrbgems/mruby-compiler/core/parse.y"
{
heredoc_end(p);
}
-#line 8877 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9027 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 455:
-#line 3351 "mrbgems/mruby-compiler/core/parse.y"
+ case 458:
+#line 3419 "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 8887 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9037 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 456:
-#line 3357 "mrbgems/mruby-compiler/core/parse.y"
+ case 459:
+#line 3425 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = p->lex_strterm;
p->lex_strterm = NULL;
}
-#line 8896 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9046 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 457:
-#line 3363 "mrbgems/mruby-compiler/core/parse.y"
+ case 460:
+#line 3431 "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 8906 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9056 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 458:
-#line 3371 "mrbgems/mruby-compiler/core/parse.y"
+ case 461:
+#line 3439 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_words(p, list1((yyvsp[0].nd)));
}
-#line 8914 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9064 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 459:
-#line 3375 "mrbgems/mruby-compiler/core/parse.y"
+ case 462:
+#line 3443 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = new_words(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ node *n = (yyvsp[-1].nd);
+ if (intn((yyvsp[0].nd)->cdr->cdr) > 0) {
+ n = push(n, (yyvsp[0].nd));
+ }
+ else {
+ cons_free((yyvsp[0].nd));
+ }
+ (yyval.nd) = new_words(p, n);
}
-#line 8922 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9079 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 460:
-#line 3382 "mrbgems/mruby-compiler/core/parse.y"
+ case 463:
+#line 3457 "mrbgems/mruby-compiler/core/parse.y"
{
p->lstate = EXPR_ENDARG;
(yyval.nd) = new_sym(p, (yyvsp[0].id));
}
-#line 8931 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9088 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 461:
-#line 3387 "mrbgems/mruby-compiler/core/parse.y"
+ case 464:
+#line 3462 "mrbgems/mruby-compiler/core/parse.y"
{
+ node *n = (yyvsp[-1].nd);
p->lstate = EXPR_ENDARG;
- (yyval.nd) = new_dsym(p, new_dstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd))));
+ if (intn((yyvsp[0].nd)->cdr->cdr) > 0) {
+ n = push(n, (yyvsp[0].nd));
+ }
+ else {
+ cons_free((yyvsp[0].nd));
+ }
+ (yyval.nd) = new_dsym(p, new_dstr(p, n));
}
-#line 8940 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9104 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 462:
-#line 3394 "mrbgems/mruby-compiler/core/parse.y"
+ case 465:
+#line 3476 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.id) = (yyvsp[0].id);
}
-#line 8948 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9112 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 467:
-#line 3404 "mrbgems/mruby-compiler/core/parse.y"
+ case 470:
+#line 3486 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.id) = new_strsym(p, (yyvsp[0].nd));
}
-#line 8956 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9120 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 468:
-#line 3408 "mrbgems/mruby-compiler/core/parse.y"
+ case 471:
+#line 3490 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.id) = new_strsym(p, (yyvsp[0].nd));
}
-#line 8964 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9128 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 469:
-#line 3414 "mrbgems/mruby-compiler/core/parse.y"
+ case 472:
+#line 3496 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_symbols(p, list1((yyvsp[0].nd)));
}
-#line 8972 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9136 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 470:
-#line 3418 "mrbgems/mruby-compiler/core/parse.y"
+ case 473:
+#line 3500 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = new_symbols(p, push((yyvsp[-1].nd), (yyvsp[0].nd)));
+ node *n = (yyvsp[-1].nd);
+ if (intn((yyvsp[0].nd)->cdr->cdr) > 0) {
+ n = push(n, (yyvsp[0].nd));
+ }
+ (yyval.nd) = new_symbols(p, n);
}
-#line 8980 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9148 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 473:
-#line 3426 "mrbgems/mruby-compiler/core/parse.y"
+ case 476:
+#line 3512 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = negate_lit(p, (yyvsp[0].nd));
+ (yyval.nd) = new_negate(p, (yyvsp[0].nd));
}
-#line 8988 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9156 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 474:
-#line 3430 "mrbgems/mruby-compiler/core/parse.y"
+ case 477:
+#line 3516 "mrbgems/mruby-compiler/core/parse.y"
{
- (yyval.nd) = negate_lit(p, (yyvsp[0].nd));
+ (yyval.nd) = new_negate(p, (yyvsp[0].nd));
}
-#line 8996 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9164 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 475:
-#line 3436 "mrbgems/mruby-compiler/core/parse.y"
+ case 478:
+#line 3522 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_lvar(p, (yyvsp[0].id));
}
-#line 9004 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9172 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 476:
-#line 3440 "mrbgems/mruby-compiler/core/parse.y"
+ case 479:
+#line 3526 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_ivar(p, (yyvsp[0].id));
}
-#line 9012 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9180 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 477:
-#line 3444 "mrbgems/mruby-compiler/core/parse.y"
+ case 480:
+#line 3530 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_gvar(p, (yyvsp[0].id));
}
-#line 9020 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9188 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 478:
-#line 3448 "mrbgems/mruby-compiler/core/parse.y"
+ case 481:
+#line 3534 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_cvar(p, (yyvsp[0].id));
}
-#line 9028 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9196 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 479:
-#line 3452 "mrbgems/mruby-compiler/core/parse.y"
+ case 482:
+#line 3538 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_const(p, (yyvsp[0].id));
}
-#line 9036 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9204 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 480:
-#line 3458 "mrbgems/mruby-compiler/core/parse.y"
+ case 483:
+#line 3544 "mrbgems/mruby-compiler/core/parse.y"
{
assignable(p, (yyvsp[0].nd));
}
-#line 9044 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9212 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 481:
-#line 3462 "mrbgems/mruby-compiler/core/parse.y"
+ case 484:
+#line 3548 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "can't assign to numbered parameter");
}
-#line 9052 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9220 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 482:
-#line 3468 "mrbgems/mruby-compiler/core/parse.y"
+ case 485:
+#line 3554 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = var_reference(p, (yyvsp[0].nd));
}
-#line 9060 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9228 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 483:
-#line 3472 "mrbgems/mruby-compiler/core/parse.y"
+ case 486:
+#line 3558 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_nil(p);
}
-#line 9068 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9236 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 484:
-#line 3476 "mrbgems/mruby-compiler/core/parse.y"
+ case 487:
+#line 3562 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_self(p);
}
-#line 9076 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9244 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 485:
-#line 3480 "mrbgems/mruby-compiler/core/parse.y"
+ case 488:
+#line 3566 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_true(p);
}
-#line 9084 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9252 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 486:
-#line 3484 "mrbgems/mruby-compiler/core/parse.y"
+ case 489:
+#line 3570 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_false(p);
}
-#line 9092 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9260 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 487:
-#line 3488 "mrbgems/mruby-compiler/core/parse.y"
+ case 490:
+#line 3574 "mrbgems/mruby-compiler/core/parse.y"
{
const char *fn = mrb_sym_name_len(p->mrb, p->filename_sym, NULL);
if (!fn) {
@@ -9100,70 +9268,65 @@ yyreduce:
}
(yyval.nd) = new_str(p, fn, strlen(fn));
}
-#line 9104 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9272 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 488:
-#line 3496 "mrbgems/mruby-compiler/core/parse.y"
+ case 491:
+#line 3582 "mrbgems/mruby-compiler/core/parse.y"
{
char buf[16];
dump_int(p->lineno, buf);
(yyval.nd) = new_int(p, buf, 10, 0);
}
-#line 9115 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9283 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 489:
-#line 3503 "mrbgems/mruby-compiler/core/parse.y"
+ case 492:
+#line 3589 "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));
+ (yyval.nd) = new_fcall(p, MRB_SYM_2(p->mrb, __ENCODING__), 0);
}
-#line 9128 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9291 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 492:
-#line 3518 "mrbgems/mruby-compiler/core/parse.y"
+ case 495:
+#line 3599 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = 0;
}
-#line 9136 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9299 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 493:
-#line 3522 "mrbgems/mruby-compiler/core/parse.y"
+ case 496:
+#line 3603 "mrbgems/mruby-compiler/core/parse.y"
{
p->lstate = EXPR_BEG;
p->cmd_start = TRUE;
}
-#line 9145 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9308 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 494:
-#line 3527 "mrbgems/mruby-compiler/core/parse.y"
+ case 497:
+#line 3608 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 9153 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9316 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 497:
-#line 3543 "mrbgems/mruby-compiler/core/parse.y"
+ case 500:
+#line 3624 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
p->lstate = EXPR_BEG;
p->cmd_start = TRUE;
}
-#line 9163 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9326 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 498:
-#line 3549 "mrbgems/mruby-compiler/core/parse.y"
+ case 501:
+#line 3630 "mrbgems/mruby-compiler/core/parse.y"
{
#if 1
/* til real keyword args implemented */
@@ -9181,11 +9344,11 @@ yyreduce:
new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b));
#endif
}
-#line 9185 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9348 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 499:
-#line 3567 "mrbgems/mruby-compiler/core/parse.y"
+ case 502:
+#line 3648 "mrbgems/mruby-compiler/core/parse.y"
{
#if 1
/* til real keyword args implemented */
@@ -9203,504 +9366,504 @@ yyreduce:
new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b));
#endif
}
-#line 9207 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9370 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 501:
-#line 3588 "mrbgems/mruby-compiler/core/parse.y"
+ case 504:
+#line 3669 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 9215 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9378 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 502:
-#line 3594 "mrbgems/mruby-compiler/core/parse.y"
+ case 505:
+#line 3675 "mrbgems/mruby-compiler/core/parse.y"
{
local_nest(p);
}
-#line 9223 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9386 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 503:
-#line 3600 "mrbgems/mruby-compiler/core/parse.y"
+ case 506:
+#line 3681 "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 9233 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9396 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 504:
-#line 3606 "mrbgems/mruby-compiler/core/parse.y"
+ case 507:
+#line 3687 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_kw_arg(p, (yyvsp[0].id), 0);
local_unnest(p);
}
-#line 9242 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9405 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 505:
-#line 3613 "mrbgems/mruby-compiler/core/parse.y"
+ case 508:
+#line 3694 "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 9251 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9414 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 506:
-#line 3618 "mrbgems/mruby-compiler/core/parse.y"
+ case 509:
+#line 3699 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_kw_arg(p, (yyvsp[0].id), 0);
local_unnest(p);
}
-#line 9260 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9423 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 507:
-#line 3625 "mrbgems/mruby-compiler/core/parse.y"
+ case 510:
+#line 3706 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 9268 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9431 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 508:
-#line 3629 "mrbgems/mruby-compiler/core/parse.y"
+ case 511:
+#line 3710 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 9276 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9439 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 509:
-#line 3635 "mrbgems/mruby-compiler/core/parse.y"
+ case 512:
+#line 3716 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 9284 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9447 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 510:
-#line 3639 "mrbgems/mruby-compiler/core/parse.y"
+ case 513:
+#line 3720 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 9292 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9455 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 513:
-#line 3649 "mrbgems/mruby-compiler/core/parse.y"
+ case 516:
+#line 3730 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_kw_rest_args(p, nsym((yyvsp[0].id)));
}
-#line 9300 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9463 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 514:
-#line 3653 "mrbgems/mruby-compiler/core/parse.y"
+ case 517:
+#line 3734 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_kw_rest_args(p, 0);
}
-#line 9308 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9471 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 515:
-#line 3659 "mrbgems/mruby-compiler/core/parse.y"
+ case 518:
+#line 3740 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, (yyvsp[-3].nd), (yyvsp[-1].nd), (yyvsp[0].id));
}
-#line 9316 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9479 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 516:
-#line 3663 "mrbgems/mruby-compiler/core/parse.y"
+ case 519:
+#line 3744 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, (yyvsp[-1].nd), 0, (yyvsp[0].id));
}
-#line 9324 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9487 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 517:
-#line 3667 "mrbgems/mruby-compiler/core/parse.y"
+ case 520:
+#line 3748 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, 0, (yyvsp[-1].nd), (yyvsp[0].id));
}
-#line 9332 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9495 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 518:
-#line 3671 "mrbgems/mruby-compiler/core/parse.y"
+ case 521:
+#line 3752 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, 0, 0, (yyvsp[0].id));
}
-#line 9340 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9503 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 519:
-#line 3677 "mrbgems/mruby-compiler/core/parse.y"
+ case 522:
+#line 3758 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
}
-#line 9348 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9511 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 520:
-#line 3681 "mrbgems/mruby-compiler/core/parse.y"
+ case 523:
+#line 3762 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args_tail(p, 0, 0, 0);
}
-#line 9356 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9519 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 521:
-#line 3687 "mrbgems/mruby-compiler/core/parse.y"
+ case 524:
+#line 3768 "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 9364 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9527 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 522:
-#line 3691 "mrbgems/mruby-compiler/core/parse.y"
+ case 525:
+#line 3772 "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 9372 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9535 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 523:
-#line 3695 "mrbgems/mruby-compiler/core/parse.y"
+ case 526:
+#line 3776 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, (yyvsp[-3].nd), (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
}
-#line 9380 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9543 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 524:
-#line 3699 "mrbgems/mruby-compiler/core/parse.y"
+ case 527:
+#line 3780 "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 9388 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9551 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 525:
-#line 3703 "mrbgems/mruby-compiler/core/parse.y"
+ case 528:
+#line 3784 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
}
-#line 9396 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9559 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 526:
-#line 3707 "mrbgems/mruby-compiler/core/parse.y"
+ case 529:
+#line 3788 "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 9404 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9567 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 527:
-#line 3711 "mrbgems/mruby-compiler/core/parse.y"
+ case 530:
+#line 3792 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, (yyvsp[-1].nd), 0, 0, 0, (yyvsp[0].nd));
}
-#line 9412 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9575 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 528:
-#line 3715 "mrbgems/mruby-compiler/core/parse.y"
+ case 531:
+#line 3796 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd));
}
-#line 9420 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9583 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 529:
-#line 3719 "mrbgems/mruby-compiler/core/parse.y"
+ case 532:
+#line 3800 "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 9428 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9591 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 530:
-#line 3723 "mrbgems/mruby-compiler/core/parse.y"
+ case 533:
+#line 3804 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd));
}
-#line 9436 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9599 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 531:
-#line 3727 "mrbgems/mruby-compiler/core/parse.y"
+ case 534:
+#line 3808 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 9444 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9607 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 532:
-#line 3731 "mrbgems/mruby-compiler/core/parse.y"
+ case 535:
+#line 3812 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, 0, (yyvsp[-1].id), 0, (yyvsp[0].nd));
}
-#line 9452 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9615 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 533:
-#line 3735 "mrbgems/mruby-compiler/core/parse.y"
+ case 536:
+#line 3816 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd));
}
-#line 9460 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9623 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 534:
-#line 3739 "mrbgems/mruby-compiler/core/parse.y"
+ case 537:
+#line 3820 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[0].nd));
}
-#line 9468 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9631 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 535:
-#line 3743 "mrbgems/mruby-compiler/core/parse.y"
+ case 538:
+#line 3824 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, intern_op(and));
(yyval.nd) = new_args(p, 0, 0, 0, 0, 0);
}
-#line 9477 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9640 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 536:
-#line 3750 "mrbgems/mruby-compiler/core/parse.y"
+ case 539:
+#line 3831 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "formal argument cannot be a constant");
(yyval.nd) = 0;
}
-#line 9486 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9649 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 537:
-#line 3755 "mrbgems/mruby-compiler/core/parse.y"
+ case 540:
+#line 3836 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "formal argument cannot be an instance variable");
(yyval.nd) = 0;
}
-#line 9495 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9658 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 538:
-#line 3760 "mrbgems/mruby-compiler/core/parse.y"
+ case 541:
+#line 3841 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "formal argument cannot be a global variable");
(yyval.nd) = 0;
}
-#line 9504 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9667 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 539:
-#line 3765 "mrbgems/mruby-compiler/core/parse.y"
+ case 542:
+#line 3846 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "formal argument cannot be a class variable");
(yyval.nd) = 0;
}
-#line 9513 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9676 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 540:
-#line 3770 "mrbgems/mruby-compiler/core/parse.y"
+ case 543:
+#line 3851 "mrbgems/mruby-compiler/core/parse.y"
{
yyerror(p, "formal argument cannot be a numbered parameter");
(yyval.nd) = 0;
}
-#line 9522 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9685 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 541:
-#line 3777 "mrbgems/mruby-compiler/core/parse.y"
+ case 544:
+#line 3858 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.id) = 0;
}
-#line 9530 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9693 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 542:
-#line 3781 "mrbgems/mruby-compiler/core/parse.y"
+ case 545:
+#line 3862 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, (yyvsp[0].id));
(yyval.id) = (yyvsp[0].id);
}
-#line 9539 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9702 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 543:
-#line 3788 "mrbgems/mruby-compiler/core/parse.y"
+ case 546:
+#line 3869 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = new_arg(p, (yyvsp[0].id));
}
-#line 9547 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9710 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 544:
-#line 3792 "mrbgems/mruby-compiler/core/parse.y"
+ case 547:
+#line 3873 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = local_switch(p);
}
-#line 9555 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9718 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 545:
-#line 3796 "mrbgems/mruby-compiler/core/parse.y"
+ case 548:
+#line 3877 "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 9565 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9728 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 546:
-#line 3804 "mrbgems/mruby-compiler/core/parse.y"
+ case 549:
+#line 3885 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 9573 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9736 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 547:
-#line 3808 "mrbgems/mruby-compiler/core/parse.y"
+ case 550:
+#line 3889 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 9581 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9744 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 548:
-#line 3814 "mrbgems/mruby-compiler/core/parse.y"
+ case 551:
+#line 3895 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, (yyvsp[-1].id));
local_nest(p);
(yyval.id) = (yyvsp[-1].id);
}
-#line 9591 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9754 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 549:
-#line 3822 "mrbgems/mruby-compiler/core/parse.y"
+ case 552:
+#line 3903 "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 9601 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9764 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 550:
-#line 3830 "mrbgems/mruby-compiler/core/parse.y"
+ case 553:
+#line 3911 "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 9611 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9774 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 551:
-#line 3838 "mrbgems/mruby-compiler/core/parse.y"
+ case 554:
+#line 3919 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 9619 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9782 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 552:
-#line 3842 "mrbgems/mruby-compiler/core/parse.y"
+ case 555:
+#line 3923 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 9627 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9790 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 553:
-#line 3848 "mrbgems/mruby-compiler/core/parse.y"
+ case 556:
+#line 3929 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
}
-#line 9635 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9798 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 554:
-#line 3852 "mrbgems/mruby-compiler/core/parse.y"
+ case 557:
+#line 3933 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 9643 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9806 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 557:
-#line 3862 "mrbgems/mruby-compiler/core/parse.y"
+ case 560:
+#line 3943 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, (yyvsp[0].id));
(yyval.id) = (yyvsp[0].id);
}
-#line 9652 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9815 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 558:
-#line 3867 "mrbgems/mruby-compiler/core/parse.y"
+ case 561:
+#line 3948 "mrbgems/mruby-compiler/core/parse.y"
{
local_add_f(p, intern_op(mul));
(yyval.id) = -1;
}
-#line 9661 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9824 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 561:
-#line 3878 "mrbgems/mruby-compiler/core/parse.y"
+ case 564:
+#line 3959 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.id) = (yyvsp[0].id);
}
-#line 9669 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9832 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 562:
-#line 3884 "mrbgems/mruby-compiler/core/parse.y"
+ case 565:
+#line 3965 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.id) = (yyvsp[0].id);
}
-#line 9677 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9840 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 563:
-#line 3888 "mrbgems/mruby-compiler/core/parse.y"
+ case 566:
+#line 3969 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.id) = 0;
}
-#line 9685 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9848 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 564:
-#line 3894 "mrbgems/mruby-compiler/core/parse.y"
+ case 567:
+#line 3975 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[0].nd);
if (!(yyval.nd)) (yyval.nd) = new_nil(p);
}
-#line 9694 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9857 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 565:
-#line 3898 "mrbgems/mruby-compiler/core/parse.y"
+ case 568:
+#line 3979 "mrbgems/mruby-compiler/core/parse.y"
{p->lstate = EXPR_BEG;}
-#line 9700 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9863 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 566:
-#line 3899 "mrbgems/mruby-compiler/core/parse.y"
+ case 569:
+#line 3980 "mrbgems/mruby-compiler/core/parse.y"
{
if ((yyvsp[-1].nd) == 0) {
yyerror(p, "can't define singleton method for ().");
@@ -9723,55 +9886,63 @@ yyreduce:
}
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 9727 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9890 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 568:
-#line 3925 "mrbgems/mruby-compiler/core/parse.y"
+ case 571:
+#line 4006 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = (yyvsp[-1].nd);
}
-#line 9735 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9898 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 569:
-#line 3931 "mrbgems/mruby-compiler/core/parse.y"
+ case 572:
+#line 4012 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = list1((yyvsp[0].nd));
NODE_LINENO((yyval.nd), (yyvsp[0].nd));
}
-#line 9744 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9907 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 570:
-#line 3936 "mrbgems/mruby-compiler/core/parse.y"
+ case 573:
+#line 4017 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd));
}
-#line 9752 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9915 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 573:
-#line 3946 "mrbgems/mruby-compiler/core/parse.y"
+ case 574:
+#line 4023 "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 9762 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9925 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 574:
-#line 3952 "mrbgems/mruby-compiler/core/parse.y"
+ case 575:
+#line 4029 "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 9771 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9934 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 575:
-#line 3957 "mrbgems/mruby-compiler/core/parse.y"
+ case 576:
+#line 4034 "mrbgems/mruby-compiler/core/parse.y"
+ {
+ (yyval.nd) = cons(new_sym(p, (yyvsp[-1].id)), label_reference(p, (yyvsp[-1].id)));
+ }
+#line 9942 "mrbgems/mruby-compiler/core/y.tab.c"
+ break;
+
+ case 577:
+#line 4038 "mrbgems/mruby-compiler/core/parse.y"
{
void_expr_error(p, (yyvsp[0].nd));
if (typen((yyvsp[-2].nd)->car) == NODE_DSTR) {
@@ -9781,67 +9952,67 @@ yyreduce:
(yyval.nd) = cons(new_sym(p, new_strsym(p, (yyvsp[-2].nd))), (yyvsp[0].nd));
}
}
-#line 9785 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9956 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 576:
-#line 3967 "mrbgems/mruby-compiler/core/parse.y"
+ case 578:
+#line 4048 "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 9794 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9965 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 589:
-#line 3994 "mrbgems/mruby-compiler/core/parse.y"
+ case 591:
+#line 4075 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.num) = '.';
}
-#line 9802 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9973 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 590:
-#line 3998 "mrbgems/mruby-compiler/core/parse.y"
+ case 592:
+#line 4079 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.num) = 0;
}
-#line 9810 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9981 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 592:
-#line 4005 "mrbgems/mruby-compiler/core/parse.y"
+ case 594:
+#line 4086 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.num) = tCOLON2;
}
-#line 9818 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9989 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 601:
-#line 4026 "mrbgems/mruby-compiler/core/parse.y"
+ case 603:
+#line 4107 "mrbgems/mruby-compiler/core/parse.y"
{yyerrok;}
-#line 9824 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 9995 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 604:
-#line 4032 "mrbgems/mruby-compiler/core/parse.y"
+ case 605:
+#line 4112 "mrbgems/mruby-compiler/core/parse.y"
{
p->lineno += (yyvsp[0].num);
p->column = 0;
}
-#line 9833 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 10004 "mrbgems/mruby-compiler/core/y.tab.c"
break;
- case 607:
-#line 4043 "mrbgems/mruby-compiler/core/parse.y"
+ case 609:
+#line 4124 "mrbgems/mruby-compiler/core/parse.y"
{
(yyval.nd) = 0;
}
-#line 9841 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 10012 "mrbgems/mruby-compiler/core/y.tab.c"
break;
-#line 9845 "mrbgems/mruby-compiler/core/y.tab.c"
+#line 10016 "mrbgems/mruby-compiler/core/y.tab.c"
default: break;
}
@@ -10073,7 +10244,7 @@ yyreturn:
#endif
return yyresult;
}
-#line 4047 "mrbgems/mruby-compiler/core/parse.y"
+#line 4128 "mrbgems/mruby-compiler/core/parse.y"
#define pylval (*((YYSTYPE*)(p->ylval)))
@@ -10117,7 +10288,7 @@ yyerror_c(parser_state *p, const char *msg, char c)
}
static void
-yywarn(parser_state *p, const char *s)
+yywarning(parser_state *p, const char *s)
{
char* c;
size_t n;
@@ -10145,12 +10316,6 @@ yywarn(parser_state *p, const char *s)
}
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];
@@ -12255,10 +12420,10 @@ parser_yylex(parser_state *p)
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;
+ mrb_int n = mrb_int_read(tok(p), NULL, NULL);
+ if (n > INT32_MAX) {
+ yywarning(p, "capture group index too big; always nil");
+ return keyword_nil;
}
pylval.nd = new_nth_ref(p, (int)n);
}
@@ -12543,6 +12708,7 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt)
int i = 0;
if (!cxt) return;
+ if (!p->tree) return;
if (intn(p->tree->car) != NODE_SCOPE) return;
n0 = n = p->tree->cdr->car;
while (n) {
@@ -12563,53 +12729,39 @@ MRB_API void
mrb_parser_parse(parser_state *p, mrbc_context *c)
{
struct mrb_jmpbuf buf1;
- p->jmp = &buf1;
+ struct mrb_jmpbuf *prev = p->mrb->jmp;
+ p->mrb->jmp = &buf1;
- MRB_TRY(p->jmp) {
+ MRB_TRY(p->mrb->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;
- }
+ n = yyparse(p);
if (n != 0 || p->nerr > 0) {
p->tree = 0;
+ p->mrb->jmp = prev;
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");
+ MRB_CATCH(p->mrb->jmp) {
p->nerr++;
- p->tree = 0;
- return;
+ if (p->mrb->exc == NULL) {
+ yyerror(p, "memory allocation error");
+ p->nerr++;
+ p->tree = 0;
+ }
}
MRB_END_EXC(p->jmp);
+ p->mrb->jmp = prev;
}
MRB_API parser_state*
@@ -13750,3 +13902,19 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
}
#endif
}
+
+typedef mrb_bool mrb_parser_foreach_top_variable_func(mrb_state *mrb, mrb_sym sym, void *user);
+void mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user);
+
+void
+mrb_parser_foreach_top_variable(mrb_state *mrb, struct mrb_parser_state *p, mrb_parser_foreach_top_variable_func *func, void *user)
+{
+ const mrb_ast_node *n = p->tree;
+ if ((intptr_t)n->car == NODE_SCOPE) {
+ n = n->cdr->car;
+ for (; n; n = n->cdr) {
+ mrb_sym sym = sym(n->car);
+ if (sym && !func(mrb, sym, user)) break;
+ }
+ }
+}
diff --git a/mrbgems/mruby-complex/src/complex.c b/mrbgems/mruby-complex/src/complex.c
index fe66e0e37..66176c3c1 100644
--- a/mrbgems/mruby-complex/src/complex.c
+++ b/mrbgems/mruby-complex/src/complex.c
@@ -2,7 +2,6 @@
#include <mruby/class.h>
#include <mruby/numeric.h>
#include <mruby/presym.h>
-#include <math.h>
#ifdef MRB_NO_FLOAT
# error Complex conflicts with 'MRB_NO_FLOAT' configuration
@@ -50,7 +49,7 @@ static struct RBasic*
complex_alloc(mrb_state *mrb, struct RClass *c, struct mrb_complex **p)
{
struct RComplex *s;
- s = (struct RComplex*)mrb_obj_alloc(mrb, MRB_TT_COMPLEX, c);
+ s = MRB_OBJ_ALLOC(mrb, MRB_TT_COMPLEX, c);
#ifdef COMPLEX_INLINE
*p = &s->r;
#else
@@ -184,7 +183,7 @@ complex_add(mrb_state *mrb, mrb_value x)
default:
{
- mrb_float z = mrb_to_flo(mrb, y);
+ mrb_float z = mrb_as_float(mrb, y);
return mrb_complex_new(mrb, p1->real+z, p1->imaginary);
}
}
@@ -205,7 +204,7 @@ complex_sub(mrb_state *mrb, mrb_value x)
default:
{
- mrb_float z = mrb_to_flo(mrb, y);
+ mrb_float z = mrb_as_float(mrb, y);
return mrb_complex_new(mrb, p1->real-z, p1->imaginary);
}
}
@@ -227,16 +226,12 @@ complex_mul(mrb_state *mrb, mrb_value x)
default:
{
- mrb_float z = mrb_to_flo(mrb, y);
+ mrb_float z = mrb_as_float(mrb, y);
return mrb_complex_new(mrb, p1->real*z, p1->imaginary*z);
}
}
}
-#ifndef MRB_NO_FLOAT
-mrb_float mrb_div_flo(mrb_float, mrb_float);
-#endif
-
/* Arithmetic on (significand, exponent) pairs avoids premature overflow in
complex division */
struct float_pair {
@@ -273,7 +268,7 @@ static void
div_pair(struct float_pair *q, struct float_pair const *a,
struct float_pair const *b)
{
- q->s = mrb_div_flo(a->s, b->s);
+ q->s = mrb_div_float(a->s, b->s);
q->x = a->x - b->x;
}
@@ -285,8 +280,8 @@ complex_div(mrb_state *mrb, mrb_value self)
a = complex_ptr(mrb, self);
if (mrb_type(rhs) != MRB_TT_COMPLEX) {
- mrb_float f = mrb_to_flo(mrb, rhs);
- return complex_new(mrb, mrb_div_flo(a->real, f), mrb_div_flo(a->imaginary, f));
+ mrb_float f = mrb_as_float(mrb, rhs);
+ return complex_new(mrb, mrb_div_float(a->real, f), mrb_div_float(a->imaginary, f));
}
struct float_pair ar, ai, br, bi;
@@ -356,7 +351,7 @@ cpx_int_div(mrb_state *mrb, mrb_value x)
x = complex_new(mrb, (mrb_float)a, 0);
return complex_div(mrb, x);
default:
- return mrb_float_value(mrb, mrb_div_flo((mrb_float)a, mrb_to_flo(mrb, y)));
+ return mrb_float_value(mrb, mrb_div_float((mrb_float)a, mrb_as_float(mrb, y)));
}
}
@@ -381,7 +376,7 @@ cpx_int_quo(mrb_state *mrb, mrb_value x)
x = complex_new(mrb, (mrb_float)a, 0);
return complex_div(mrb, x);
default:
- return mrb_float_value(mrb, mrb_div_flo((mrb_float)a, mrb_to_flo(mrb, y)));
+ return mrb_float_value(mrb, mrb_div_float((mrb_float)a, mrb_as_float(mrb, y)));
}
}
@@ -395,10 +390,10 @@ cpx_flo_div(mrb_state *mrb, mrb_value x)
case MRB_TT_COMPLEX:
return complex_div(mrb, complex_new(mrb, a, 0));
case MRB_TT_FLOAT:
- a = mrb_div_flo(a, mrb_float(y));
+ a = mrb_div_float(a, mrb_float(y));
return mrb_float_value(mrb, a);
default:
- a = mrb_div_flo(a, mrb_to_flo(mrb, y));
+ a = mrb_div_float(a, mrb_as_float(mrb, y));
return mrb_float_value(mrb, a);
}
}
@@ -429,10 +424,10 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
mrb_define_method(mrb, comp, "/", complex_div, MRB_ARGS_REQ(1));
mrb_define_method(mrb, comp, "quo", complex_div, MRB_ARGS_REQ(1));
mrb_define_method(mrb, comp, "==", complex_eq, MRB_ARGS_REQ(1));
- mrb_define_method(mrb, mrb->integer_class, "/", cpx_int_div, MRB_ARGS_REQ(1)); /* overrride */
- mrb_define_method(mrb, mrb->integer_class, "quo", cpx_int_quo, MRB_ARGS_REQ(1)); /* overrride */
- mrb_define_method(mrb, mrb->float_class, "/", cpx_flo_div, MRB_ARGS_REQ(1)); /* overrride */
- mrb_define_method(mrb, mrb->float_class, "quo", cpx_flo_div, MRB_ARGS_REQ(1)); /* overrride */
+ mrb_define_method(mrb, mrb->integer_class, "/", cpx_int_div, MRB_ARGS_REQ(1)); /* override */
+ mrb_define_method(mrb, mrb->integer_class, "quo", cpx_int_quo, MRB_ARGS_REQ(1)); /* override */
+ mrb_define_method(mrb, mrb->float_class, "/", cpx_flo_div, MRB_ARGS_REQ(1)); /* override */
+ mrb_define_method(mrb, mrb->float_class, "quo", cpx_flo_div, MRB_ARGS_REQ(1)); /* override */
}
void
diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb
index f007b8553..5856eb653 100644
--- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb
+++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb
@@ -631,7 +631,7 @@ module Kernel
# def repeat(n)
# raise ArgumentError, "#{n} is negative!" if n < 0
# unless block_given?
- # return to_enum(__method__, n) # __method__ is :repeat here
+ # return to_enum(__callee__, n) do # __callee__ is :repeat here
# end
# each do |*val|
# n.times { yield *val }
diff --git a/mrbgems/mruby-error/src/exception.c b/mrbgems/mruby-error/src/exception.c
index ca26b8819..ffa7d53bf 100644
--- a/mrbgems/mruby-error/src/exception.c
+++ b/mrbgems/mruby-error/src/exception.c
@@ -31,7 +31,7 @@ mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data, mrb_func_t ensure,
mrb_gc_arena_restore(mrb, ai);
mrb_gc_protect(mrb, result);
if (error) {
- mrb_exc_raise(mrb, result); /* rethrow catched exceptions */
+ mrb_exc_raise(mrb, result); /* rethrow caught exceptions */
}
return result;
}
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c
index 508f5ffcb..c21284bdd 100644
--- a/mrbgems/mruby-eval/src/eval.c
+++ b/mrbgems/mruby-eval/src/eval.c
@@ -9,10 +9,10 @@
#include <mruby/variable.h>
struct REnv *mrb_env_new(mrb_state *mrb, struct mrb_context *c, mrb_callinfo *ci, int nstacks, mrb_value *stack, struct RClass *tc);
-mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p, mrb_func_t posthook);
+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);
+mrb_value mrb_mod_module_eval(mrb_state*, mrb_value);
void mrb_codedump_all(mrb_state*, struct RProc*);
-void mrb_proc_merge_lvar(mrb_state *mrb, mrb_irep *irep, struct REnv *env, int num, const mrb_sym *lv, const mrb_value *stack);
static struct RProc*
create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value binding, const char *file, mrb_int line)
@@ -52,10 +52,19 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi
e = NULL;
}
+ if (file) {
+ if (strlen(file) >= UINT16_MAX) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "filename too long");
+ }
+ }
+ else {
+ file = "(eval)";
+ }
+
cxt = mrbc_context_new(mrb);
cxt->lineno = (uint16_t)line;
- mrbc_filename(mrb, cxt, file ? file : "(eval)");
+ mrbc_filename(mrb, cxt, file);
cxt->capture_errors = TRUE;
cxt->no_optimize = TRUE;
cxt->upper = scope && MRB_PROC_CFUNC_P(scope) ? NULL : scope;
@@ -64,6 +73,7 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi
/* only occur when memory ran out */
if (!p) {
+ mrbc_context_free(mrb, cxt);
mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state (out of memory)");
}
@@ -71,6 +81,11 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi
/* parse error */
mrb_value str;
+ mrbc_context_free(mrb, cxt);
+ if (!p->error_buffer[0].message) {
+ mrb_parser_free(p);
+ mrb_raise(mrb, E_SYNTAX_ERROR, "compile error");
+ }
if (file) {
str = mrb_format(mrb, "file %s line %d: %s",
file,
@@ -83,7 +98,6 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi
p->error_buffer[0].message);
}
mrb_parser_free(p);
- mrbc_context_free(mrb, cxt);
mrb_exc_raise(mrb, mrb_exc_new_str(mrb, E_SYNTAX_ERROR, str));
}
@@ -127,44 +141,13 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi
}
static mrb_value
-exec_irep(mrb_state *mrb, mrb_value self, struct RProc *proc, mrb_func_t posthook)
+exec_irep(mrb_state *mrb, mrb_value self, struct RProc *proc)
{
/* no argument passed from eval() */
mrb->c->ci->argc = 0;
/* clear block */
mrb->c->ci->stack[1] = mrb_nil_value();
- return mrb_exec_irep(mrb, self, proc, posthook);
-}
-
-static void
-eval_merge_lvar(mrb_state *mrb, mrb_irep *irep, struct REnv *env, int num, const mrb_sym *lv, const mrb_value *stack)
-{
- mrb_assert(mrb->c->stend >= stack + num);
- mrb_proc_merge_lvar(mrb, irep, env, num, lv, stack);
-}
-
-static mrb_value
-eval_merge_lvar_hook(mrb_state *mrb, mrb_value dummy_self)
-{
- const mrb_callinfo *orig_ci = &mrb->c->ci[1];
- const struct RProc *orig_proc = orig_ci->proc;
- const mrb_irep *orig_irep = orig_proc->body.irep;
- int orig_nlocals = orig_irep->nlocals;
-
- if (orig_nlocals > 1) {
- struct RProc *proc = (struct RProc *)orig_proc->upper;
- struct REnv *env = MRB_PROC_ENV(orig_proc);
- eval_merge_lvar(mrb, (mrb_irep *)proc->body.irep, env,
- orig_nlocals - 1, orig_irep->lv,
- mrb->c->ci->stack + 3 /* hook proc + exc + ret val */);
- }
-
- mrb_value exc = mrb->c->ci->stack[1];
- if (!mrb_nil_p(exc)) {
- mrb_exc_raise(mrb, exc);
- }
-
- return mrb->c->ci->stack[2];
+ return mrb_exec_irep(mrb, self, proc);
}
static mrb_value
@@ -176,30 +159,21 @@ f_eval(mrb_state *mrb, mrb_value self)
const char *file = NULL;
mrb_int line = 1;
struct RProc *proc;
- mrb_func_t posthook = NULL;
mrb_get_args(mrb, "s|ozi", &s, &len, &binding, &file, &line);
proc = create_proc_from_string(mrb, s, len, binding, file, line);
if (!mrb_nil_p(binding)) {
self = mrb_iv_get(mrb, binding, MRB_SYM(recv));
- if (mrb_env_p(mrb_iv_get(mrb, binding, MRB_SYM(env)))) {
- posthook = eval_merge_lvar_hook;
- }
}
mrb_assert(!MRB_PROC_CFUNC_P(proc));
- return exec_irep(mrb, self, proc, posthook);
+ return exec_irep(mrb, self, proc);
}
static mrb_value
f_instance_eval(mrb_state *mrb, mrb_value self)
{
- mrb_value b;
- mrb_int argc; const mrb_value *argv;
-
- mrb_get_args(mrb, "*!&", &argv, &argc, &b);
-
- if (mrb_nil_p(b)) {
+ if (!mrb_block_given_p(mrb)) {
const char *s;
mrb_int len;
const char *file = NULL;
@@ -213,19 +187,44 @@ f_instance_eval(mrb_state *mrb, mrb_value self)
MRB_PROC_SET_TARGET_CLASS(proc, mrb_class_ptr(cv));
mrb_assert(!MRB_PROC_CFUNC_P(proc));
mrb_vm_ci_target_class_set(mrb->c->ci, mrb_class_ptr(cv));
- return exec_irep(mrb, self, proc, NULL);
+ return exec_irep(mrb, self, proc);
}
else {
- mrb_get_args(mrb, "&", &b);
+ mrb_get_args(mrb, "");
return mrb_obj_instance_eval(mrb, self);
}
}
+static mrb_value
+f_class_eval(mrb_state *mrb, mrb_value self)
+{
+ if (!mrb_block_given_p(mrb)) {
+ const char *s;
+ mrb_int len;
+ const char *file = NULL;
+ mrb_int line = 1;
+ struct RProc *proc;
+
+ mrb_get_args(mrb, "s|zi", &s, &len, &file, &line);
+ proc = create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line);
+ MRB_PROC_SET_TARGET_CLASS(proc, mrb_class_ptr(self));
+ mrb_assert(!MRB_PROC_CFUNC_P(proc));
+ mrb_vm_ci_target_class_set(mrb->c->ci, mrb_class_ptr(self));
+ return exec_irep(mrb, self, proc);
+ }
+ else {
+ mrb_get_args(mrb, "");
+ return mrb_mod_module_eval(mrb, self);
+ }
+}
+
void
mrb_mruby_eval_gem_init(mrb_state* mrb)
{
mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3));
mrb_define_method_id(mrb, mrb_class_get_id(mrb, MRB_SYM(BasicObject)), MRB_SYM(instance_eval), f_instance_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK());
+ mrb_define_method_id(mrb, mrb_class_get_id(mrb, MRB_SYM(Module)), MRB_SYM(module_eval), f_class_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK());
+ mrb_define_method_id(mrb, mrb_class_get_id(mrb, MRB_SYM(Module)), MRB_SYM(class_eval), f_class_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK());
}
void
diff --git a/mrbgems/mruby-eval/test/eval.rb b/mrbgems/mruby-eval/test/eval.rb
index e95171223..7e28ade07 100644
--- a/mrbgems/mruby-eval/test/eval.rb
+++ b/mrbgems/mruby-eval/test/eval.rb
@@ -151,3 +151,14 @@ assert('Access numbered parameter from eval') do
hoge.fuga(3) { _1 + eval("_1") }
}
end
+
+assert('Module#class_eval with string') do
+ c = Class.new
+ c.class_eval "def foo() 42; end"
+ cc = c.new
+ assert_true cc.respond_to?(:foo)
+ assert_equal 42, c.new.foo
+
+ b = c.class_eval("class A; def a; 55; end; end; class B; def b; A; end; end; B")
+ assert_equal 55, b.new.b.new.a
+end
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 5f45bf04f..141dcc2ed 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -7,7 +7,8 @@
#define FIBER_STACK_INIT_SIZE 64
#define FIBER_CI_INIT_SIZE 8
-#define CI_ACC_RESUMED -3
+/* copied from vm.c */
+#define CINFO_RESUMED 3
/*
* call-seq:
@@ -94,7 +95,6 @@ fiber_init(mrb_state *mrb, mrb_value self)
c->stbase = (mrb_value *)mrb_malloc(mrb, slen*sizeof(mrb_value));
c->stend = c->stbase + slen;
-#ifdef MRB_NAN_BOXING
{
mrb_value *p = c->stbase;
mrb_value *pend = c->stend;
@@ -104,9 +104,6 @@ fiber_init(mrb_state *mrb, mrb_value self)
p++;
}
}
-#else
- memset(c->stbase, 0, slen * sizeof(mrb_value));
-#endif
/* copy receiver from a block */
c->stbase[0] = mrb->c->ci->stack[0];
@@ -160,7 +157,7 @@ fiber_check_cfunc(mrb_state *mrb, struct mrb_context *c)
mrb_callinfo *ci;
for (ci = c->ci; ci >= c->cibase; ci--) {
- if (ci->acc < 0) {
+ if (ci->cci > 0) {
mrb_raise(mrb, E_FIBER_ERROR, "can't cross C function boundary");
}
}
@@ -226,7 +223,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
else {
value = fiber_result(mrb, a, len);
if (vmexec) {
- c->ci->stack[c->ci[1].acc] = value;
+ c->ci[1].stack[0] = value;
}
}
@@ -264,7 +261,7 @@ fiber_resume(mrb_state *mrb, mrb_value self)
mrb_bool vmexec = FALSE;
mrb_get_args(mrb, "*!", &a, &len);
- if (mrb->c->ci->acc < 0) {
+ if (mrb->c->ci->cci > 0) {
vmexec = TRUE;
}
return fiber_switch(mrb, self, len, a, TRUE, vmexec);
@@ -357,7 +354,7 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
c->prev = NULL;
if (c->vmexec) {
c->vmexec = FALSE;
- mrb->c->ci->acc = CI_ACC_RESUMED;
+ mrb->c->ci->cci = CINFO_RESUMED;
c->ci--; /* pop callinfo for yield */
}
MARK_CONTEXT_MODIFY(mrb->c);
@@ -397,7 +394,7 @@ static mrb_value
fiber_current(mrb_state *mrb, mrb_value self)
{
if (!mrb->c->fib) {
- struct RFiber *f = (struct RFiber*)mrb_obj_alloc(mrb, MRB_TT_FIBER, mrb_class_ptr(self));
+ struct RFiber *f = MRB_OBJ_ALLOC(mrb, MRB_TT_FIBER, mrb_class_ptr(self));
f->cxt = mrb->c;
mrb->c->fib = f;
diff --git a/mrbgems/mruby-hash-ext/mrblib/hash.rb b/mrbgems/mruby-hash-ext/mrblib/hash.rb
index 33e2dcb9f..5775913c3 100644
--- a/mrbgems/mruby-hash-ext/mrblib/hash.rb
+++ b/mrbgems/mruby-hash-ext/mrblib/hash.rb
@@ -116,7 +116,6 @@ class Hash
nk.each {|k|
h[k] = self[k]
}
- h
self.replace(h)
end
@@ -256,7 +255,6 @@ class Hash
def keep_if(&block)
return to_enum :keep_if unless block
- keys = []
self.each do |k, v|
unless block.call([k, v])
self.delete(k)
diff --git a/mrbgems/mruby-io/README.md b/mrbgems/mruby-io/README.md
index a518e6169..c07a6e89b 100644
--- a/mrbgems/mruby-io/README.md
+++ b/mrbgems/mruby-io/README.md
@@ -1,5 +1,4 @@
-mruby-io
-========
+# mruby-io
`IO` and `File` classes for mruby
diff --git a/mrbgems/mruby-io/mrblib/io.rb b/mrbgems/mruby-io/mrblib/io.rb
index 645733226..006578222 100644
--- a/mrbgems/mruby-io/mrblib/io.rb
+++ b/mrbgems/mruby-io/mrblib/io.rb
@@ -209,7 +209,7 @@ class IO
end
array = []
- while 1
+ while true
begin
_read_buf
rescue EOFError
@@ -256,7 +256,7 @@ class IO
end
array = []
- while 1
+ while true
begin
_read_buf
rescue EOFError
diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c
index 03a6a070d..fe7861798 100644
--- a/mrbgems/mruby-io/src/file.c
+++ b/mrbgems/mruby-io/src/file.c
@@ -14,7 +14,6 @@
#include <sys/stat.h>
#include <fcntl.h>
-#include <limits.h>
#include <errno.h>
#include <stdlib.h>
@@ -89,7 +88,7 @@ flock(int fd, int operation) {
DWORD flags;
flags = ((operation & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0)
| ((operation & LOCK_SH) ? LOCKFILE_EXCLUSIVE_LOCK : 0);
- memset(&ov, 0, sizeof(ov));
+ ov = (OVERLAPPED){0};
return LockFileEx(h, flags, 0, 0xffffffff, 0xffffffff, &ov) ? 0 : -1;
}
#endif
@@ -117,14 +116,14 @@ static mrb_value
mrb_file_s_unlink(mrb_state *mrb, mrb_value obj)
{
const mrb_value *argv;
- mrb_value pathv;
mrb_int argc, i;
char *path;
mrb_get_args(mrb, "*", &argv, &argc);
for (i = 0; i < argc; i++) {
const char *utf8_path;
- pathv = mrb_ensure_string_type(mrb, argv[i]);
+ mrb_value pathv = argv[i];
+ mrb_ensure_string_type(mrb, pathv);
utf8_path = RSTRING_CSTR(mrb, pathv);
path = mrb_locale_from_utf8(utf8_path, -1);
if (UNLINK(path) < 0) {
@@ -497,7 +496,7 @@ mrb_file_truncate(mrb_state *mrb, mrb_value self)
mrb_value lenv = mrb_get_arg1(mrb);
fd = mrb_io_fileno(mrb, self);
- length = mrb_int(mrb, lenv);
+ length = mrb_as_int(mrb, lenv);
if (mrb_ftruncate(fd, length) != 0) {
mrb_raise(mrb, E_IO_ERROR, "ftruncate failed");
}
diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c
index 234d7b1fc..0c79660a8 100644
--- a/mrbgems/mruby-io/src/io.c
+++ b/mrbgems/mruby-io/src/io.c
@@ -169,7 +169,7 @@ mrb_io_mode_to_flags(mrb_state *mrb, mrb_value mode)
}
else {
int flags = 0;
- mrb_int flags0 = mrb_int(mrb, mode);
+ mrb_int flags0 = mrb_as_int(mrb, mode);
switch (flags0 & MRB_O_ACCMODE) {
case MRB_O_RDONLY:
@@ -1415,7 +1415,7 @@ mrb_io_sync(mrb_state *mrb, mrb_value self)
static off_t
value2off(mrb_state *mrb, mrb_value offv)
{
- return (off_t)mrb_int(mrb, offv);
+ return (off_t)mrb_as_int(mrb, offv);
}
/*
diff --git a/mrbgems/mruby-kernel-ext/src/kernel.c b/mrbgems/mruby-kernel-ext/src/kernel.c
index 7afa6fa5f..5b3dd6b35 100644
--- a/mrbgems/mruby-kernel-ext/src/kernel.c
+++ b/mrbgems/mruby-kernel-ext/src/kernel.c
@@ -3,70 +3,73 @@
#include <mruby/array.h>
#include <mruby/hash.h>
#include <mruby/range.h>
+#include <mruby/string.h>
+#include <mruby/numeric.h>
+#include <mruby/proc.h>
#include <mruby/presym.h>
static mrb_value
mrb_f_caller(mrb_state *mrb, mrb_value self)
{
- mrb_value bt, v, length;
+ mrb_value bt, v;
mrb_int bt_len, argc, lev, n;
+ argc = mrb_get_args(mrb, "|oi", &v, &n);
+
bt = mrb_get_backtrace(mrb);
bt_len = RARRAY_LEN(bt);
- argc = mrb_get_args(mrb, "|oo", &v, &length);
switch (argc) {
- case 0:
- lev = 1;
- n = bt_len - lev;
- break;
- case 1:
- if (mrb_range_p(v)) {
- mrb_int beg, len;
- if (mrb_range_beg_len(mrb, v, &beg, &len, bt_len, TRUE) == MRB_RANGE_OK) {
- lev = beg;
- n = len;
- }
- else {
- return mrb_nil_value();
- }
+ case 0:
+ lev = 1;
+ n = bt_len - 1;
+ break;
+ case 1:
+ if (mrb_range_p(v)) {
+ mrb_int beg, len;
+ if (mrb_range_beg_len(mrb, v, &beg, &len, bt_len, TRUE) == MRB_RANGE_OK) {
+ lev = beg;
+ n = len;
}
else {
- lev = mrb_int(mrb, v);
- if (lev < 0) {
- mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%v)", v);
- }
- n = bt_len - lev;
+ return mrb_nil_value();
}
- break;
- case 2:
- lev = mrb_int(mrb, v);
- n = mrb_int(mrb, length);
+ }
+ else {
+ lev = mrb_as_int(mrb, v);
if (lev < 0) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%v)", v);
}
- if (n < 0) {
- mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative size (%v)", length);
- }
- break;
- default:
- lev = n = 0;
- break;
+ n = bt_len - lev;
+ }
+ break;
+ case 2:
+ lev = mrb_as_int(mrb, v);
+ break;
+ default:
+ /* not reached */
+ lev = n = 0;
+ break;
}
-
- if (n == 0) {
+ if (lev >= bt_len) return mrb_nil_value();
+ if (lev < 0) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative level (%v)", v);
+ }
+ if (n < 0) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative size (%d)", n);
+ }
+ if (n == 0 || bt_len <= lev) {
return mrb_ary_new(mrb);
}
-
- return mrb_funcall_id(mrb, bt, MRB_OPSYM(aref), 2, mrb_fixnum_value(lev), mrb_fixnum_value(n));
+ if (bt_len <= n + lev) n = bt_len - lev - 1;
+ return mrb_ary_new_from_values(mrb, n, RARRAY_PTR(bt)+lev+1);
}
/*
* call-seq:
* __method__ -> symbol
*
- * Returns the name at the definition of the current method as a
- * Symbol.
+ * Returns the called name of the current method as a Symbol.
* If called outside of a method, it returns <code>nil</code>.
*
*/
@@ -75,6 +78,27 @@ mrb_f_method(mrb_state *mrb, mrb_value self)
{
mrb_callinfo *ci = mrb->c->ci;
ci--;
+ if (ci->proc->e.env->tt == MRB_TT_ENV && ci->proc->e.env->mid)
+ return mrb_symbol_value(ci->proc->e.env->mid);
+ else if (ci->mid)
+ return mrb_symbol_value(ci->mid);
+ else
+ return mrb_nil_value();
+}
+
+/*
+ * call-seq:
+ * __callee__ -> symbol
+ *
+ * Returns the called name of the current method as a Symbol.
+ * If called outside of a method, it returns <code>nil</code>.
+ *
+ */
+static mrb_value
+mrb_f_callee(mrb_state *mrb, mrb_value self)
+{
+ mrb_callinfo *ci = mrb->c->ci;
+ ci--;
if (ci->mid)
return mrb_symbol_value(ci->mid);
else
@@ -106,11 +130,43 @@ mrb_f_method(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_f_integer(mrb_state *mrb, mrb_value self)
{
- mrb_value arg;
+ mrb_value val, tmp;
mrb_int base = 0;
- mrb_get_args(mrb, "o|i", &arg, &base);
- return mrb_convert_to_integer(mrb, arg, base);
+ mrb_get_args(mrb, "o|i", &val, &base);
+ if (mrb_nil_p(val)) {
+ if (base != 0) goto arg_error;
+ mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Integer");
+ }
+ switch (mrb_type(val)) {
+#ifndef MRB_NO_FLOAT
+ case MRB_TT_FLOAT:
+ if (base != 0) goto arg_error;
+ return mrb_float_to_integer(mrb, val);
+#endif
+
+ case MRB_TT_INTEGER:
+ if (base != 0) goto arg_error;
+ return val;
+
+ case MRB_TT_STRING:
+ string_conv:
+ return mrb_str_to_integer(mrb, val, base, TRUE);
+
+ default:
+ break;
+ }
+ if (base != 0) {
+ tmp = mrb_obj_as_string(mrb, val);
+ if (mrb_string_p(tmp)) {
+ val = tmp;
+ goto string_conv;
+ }
+arg_error:
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value");
+ }
+ /* to raise TypeError */
+ return mrb_to_integer(mrb, val);
}
#ifndef MRB_NO_FLOAT
@@ -131,7 +187,7 @@ mrb_f_float(mrb_state *mrb, mrb_value self)
{
mrb_value arg = mrb_get_arg1(mrb);
- return mrb_Float(mrb, arg);
+ return mrb_to_float(mrb, arg);
}
#endif
@@ -201,7 +257,8 @@ mrb_f_hash(mrb_state *mrb, mrb_value self)
if (mrb_nil_p(arg) || (mrb_array_p(arg) && RARRAY_LEN(arg) == 0)) {
return mrb_hash_new(mrb);
}
- return mrb_ensure_hash_type(mrb, arg);
+ mrb_ensure_hash_type(mrb, arg);
+ return arg;
}
void
@@ -212,6 +269,7 @@ mrb_mruby_kernel_ext_gem_init(mrb_state *mrb)
mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2));
mrb_define_module_function(mrb, krn, "caller", mrb_f_caller, MRB_ARGS_OPT(2));
mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE());
+ mrb_define_method(mrb, krn, "__callee__", mrb_f_callee, MRB_ARGS_NONE());
mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ARG(1,1));
#ifndef MRB_NO_FLOAT
mrb_define_module_function(mrb, krn, "Float", mrb_f_float, MRB_ARGS_REQ(1));
diff --git a/mrbgems/mruby-kernel-ext/test/kernel.rb b/mrbgems/mruby-kernel-ext/test/kernel.rb
index fc4402b3d..e5876f976 100644
--- a/mrbgems/mruby-kernel-ext/test/kernel.rb
+++ b/mrbgems/mruby-kernel-ext/test/kernel.rb
@@ -38,17 +38,29 @@ assert('Kernel.caller, Kernel#caller') do
end
assert('Kernel#__method__') do
- assert_equal(:m, Class.new {def m; __method__; end}.new.m)
- assert_equal(:m, Class.new {define_method(:m) {__method__}}.new.m)
c = Class.new do
- [:m1, :m2].each do |m|
- define_method(m) do
- __method__
- end
- end
+ def m1; __method__ end
+ define_method(:m2) {__method__}
+ alias m3 m1
+ alias_method :m4, :m2
+ end
+ assert_equal(:m1, c.new.m1)
+ assert_equal(:m2, c.new.m2)
+ assert_equal(:m1, c.new.m3)
+ assert_equal(:m2, c.new.m4)
+end
+
+assert('Kernel#__callee__') do
+ c = Class.new do
+ def m1; __callee__ end
+ define_method(:m2) {__callee__}
+ alias m3 m1
+ alias_method :m4, :m2
end
assert_equal(:m1, c.new.m1)
assert_equal(:m2, c.new.m2)
+ assert_equal(:m3, c.new.m3)
+ assert_equal(:m4, c.new.m4)
end
assert('Kernel#Integer') do
diff --git a/mrbgems/mruby-math/src/math.c b/mrbgems/mruby-math/src/math.c
index 0b85b1763..79fdb7c6f 100644
--- a/mrbgems/mruby-math/src/math.c
+++ b/mrbgems/mruby-math/src/math.c
@@ -12,7 +12,6 @@
#include <mruby/array.h>
#include <mruby/presym.h>
-#include <math.h>
static void
domain_error(mrb_state *mrb, const char *func)
@@ -25,8 +24,6 @@ domain_error(mrb_state *mrb, const char *func)
/* math functions not provided by Microsoft Visual C++ 2012 or older */
#if defined _MSC_VER && _MSC_VER <= 1700
-#include <float.h>
-
double
asinh(double x)
{
diff --git a/mrbgems/mruby-metaprog/test/metaprog.rb b/mrbgems/mruby-metaprog/test/metaprog.rb
index d63913020..4d2651702 100644
--- a/mrbgems/mruby-metaprog/test/metaprog.rb
+++ b/mrbgems/mruby-metaprog/test/metaprog.rb
@@ -104,6 +104,17 @@ assert('Kernel#global_variables', '15.3.1.3.14') do
assert_equal(1, variables2.size - variables1.size)
end
+assert('Kernel#local_variables', '15.3.1.3.28') do
+ assert_equal Array, local_variables.class
+
+ def local_var_list
+ a = "hello"
+ local_variables
+ end
+
+ assert_equal [:a], local_var_list
+end
+
assert('Kernel.local_variables', '15.3.1.2.7') do
a, b = 0, 1
a += b
diff --git a/mrbgems/mruby-method/README.md b/mrbgems/mruby-method/README.md
index f299718df..41130bb82 100644
--- a/mrbgems/mruby-method/README.md
+++ b/mrbgems/mruby-method/README.md
@@ -1,5 +1,4 @@
-mruby-method
-===
+# mruby-method
An implementation of class **Method** and **UnboundMethod** for mruby
diff --git a/mrbgems/mruby-method/src/method.c b/mrbgems/mruby-method/src/method.c
index 02eddda9c..02131050d 100644
--- a/mrbgems/mruby-method/src/method.c
+++ b/mrbgems/mruby-method/src/method.c
@@ -7,7 +7,7 @@
#include "mruby/presym.h"
mrb_noreturn void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args);
-mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p, mrb_func_t posthook);
+mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p);
static mrb_value
args_shift(mrb_state *mrb)
@@ -81,7 +81,7 @@ method_missing_prepare(mrb_state *mrb, mrb_sym *mid, mrb_value recv, struct RCla
static struct RObject *
method_object_alloc(mrb_state *mrb, struct RClass *mclass)
{
- return (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mclass);
+ return MRB_OBJ_ALLOC(mrb, MRB_TT_OBJECT, mclass);
}
static struct RProc*
@@ -242,7 +242,7 @@ mcall(mrb_state *mrb, mrb_value self, mrb_value recv)
mrb->c->ci->mid = mid;
mrb->c->ci->u.target_class = tc;
- return mrb_exec_irep(mrb, recv, proc, NULL);
+ return mrb_exec_irep(mrb, recv, proc);
}
static mrb_value
diff --git a/mrbgems/mruby-numeric-ext/src/numeric_ext.c b/mrbgems/mruby-numeric-ext/src/numeric_ext.c
index dbc7f39d9..2f2a6c755 100644
--- a/mrbgems/mruby-numeric-ext/src/numeric_ext.c
+++ b/mrbgems/mruby-numeric-ext/src/numeric_ext.c
@@ -1,4 +1,3 @@
-#include <limits.h>
#include <mruby.h>
#include <mruby/numeric.h>
#include <mruby/presym.h>
@@ -10,12 +9,12 @@
* Returns +true+ if all bits of <code>+int+ & +mask+</code> are 1.
*/
static mrb_value
-mrb_int_allbits(mrb_state *mrb, mrb_value self)
+int_allbits(mrb_state *mrb, mrb_value self)
{
mrb_int n, m;
mrb_get_args(mrb, "i", &m);
- n = mrb_int(mrb, self);
+ n = mrb_integer(self);
return mrb_bool_value((n & m) == m);
}
@@ -26,12 +25,12 @@ mrb_int_allbits(mrb_state *mrb, mrb_value self)
* Returns +true+ if any bits of <code>+int+ & +mask+</code> are 1.
*/
static mrb_value
-mrb_int_anybits(mrb_state *mrb, mrb_value self)
+int_anybits(mrb_state *mrb, mrb_value self)
{
mrb_int n, m;
mrb_get_args(mrb, "i", &m);
- n = mrb_int(mrb, self);
+ n = mrb_integer(self);
return mrb_bool_value((n & m) != 0);
}
@@ -42,25 +41,85 @@ mrb_int_anybits(mrb_state *mrb, mrb_value self)
* Returns +true+ if no bits of <code>+int+ & +mask+</code> are 1.
*/
static mrb_value
-mrb_int_nobits(mrb_state *mrb, mrb_value self)
+int_nobits(mrb_state *mrb, mrb_value self)
{
mrb_int n, m;
mrb_get_args(mrb, "i", &m);
- n = mrb_int(mrb, self);
+ n = mrb_integer(self);
return mrb_bool_value((n & m) == 0);
}
+static void
+zerodiv(mrb_state *mrb)
+{
+ mrb_raise(mrb, E_ZERODIV_ERROR, "divided by 0");
+}
+
+/*
+ * call-seq:
+ * num.remainder(numeric) -> real
+ *
+ * <code>x.remainder(y)</code> means <code>x-y*(x/y).truncate</code>.
+ *
+ * See Numeric#divmod.
+ */
+static mrb_value
+int_remainder(mrb_state *mrb, mrb_value x)
+{
+ mrb_value y = mrb_get_arg1(mrb);
+ mrb_int a, b;
+
+ a = mrb_integer(x);
+ if (mrb_integer_p(y)) {
+ b = mrb_integer(y);
+ if (b == 0) zerodiv(mrb);
+ if (a == MRB_INT_MIN && b == -1) return mrb_fixnum_value(0);
+ return mrb_int_value(mrb, a % b);
+ }
+#ifdef MRB_NO_FLOAT
+ mrb_raise(mrb, E_TYPE_ERROR, "non integer remainder");
+#else
+ mrb_float n = (mrb_float)a;
+ mrb_float m = mrb_as_float(mrb, y);
+
+ if (isinf(m)) return mrb_float_value(mrb, n);
+ return mrb_float_value(mrb, n-m*trunc(n/m));
+#endif
+}
+
+#ifndef MRB_NO_FLOAT
+static mrb_value
+flo_remainder(mrb_state *mrb, mrb_value self)
+{
+ mrb_float a, b;
+
+ a = mrb_float(self);
+ mrb_get_args(mrb, "f", &b);
+ if (b == 0) zerodiv(mrb);
+ if (isinf(b)) return mrb_float_value(mrb, a);
+ return mrb_float_value(mrb, a-b*trunc(a/b));
+}
+#endif
+
void
mrb_mruby_numeric_ext_gem_init(mrb_state* mrb)
{
struct RClass *i = mrb_class_get(mrb, "Integer");
- mrb_define_method(mrb, i, "allbits?", mrb_int_allbits, MRB_ARGS_REQ(1));
- mrb_define_method(mrb, i, "anybits?", mrb_int_anybits, MRB_ARGS_REQ(1));
- mrb_define_method(mrb, i, "nobits?", mrb_int_nobits, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, i, "allbits?", int_allbits, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, i, "anybits?", int_anybits, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, i, "nobits?", int_nobits, MRB_ARGS_REQ(1));
+
+ mrb_define_alias(mrb, i, "modulo", "%");
+ mrb_define_method(mrb, i, "remainder", int_remainder, MRB_ARGS_REQ(1));
#ifndef MRB_NO_FLOAT
+ struct RClass *f = mrb_class_get(mrb, "Float");
+
+ mrb_define_alias(mrb, f, "modulo", "%");
+ mrb_define_method(mrb, f, "remainder", flo_remainder, MRB_ARGS_REQ(1));
+
mrb_define_const_id(mrb, mrb->float_class, MRB_SYM(RADIX), mrb_fixnum_value(MRB_FLT_RADIX));
mrb_define_const_id(mrb, mrb->float_class, MRB_SYM(MANT_DIG), mrb_fixnum_value(MRB_FLT_MANT_DIG));
mrb_define_const_id(mrb, mrb->float_class, MRB_SYM(EPSILON), mrb_float_value(mrb, MRB_FLT_EPSILON));
diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c
index a65feea6d..69f1763ce 100644
--- a/mrbgems/mruby-object-ext/src/object.c
+++ b/mrbgems/mruby-object-ext/src/object.c
@@ -103,7 +103,7 @@ mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
c = mrb_singleton_class_ptr(mrb, self);
- if (mrb->c->ci->acc < 0) {
+ if (mrb->c->ci->cci > 0) {
return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
}
mrb_vm_ci_target_class_set(mrb->c->ci, c);
diff --git a/mrbgems/mruby-os-memsize/src/memsize.c b/mrbgems/mruby-os-memsize/src/memsize.c
index 9947512cf..b6a25a204 100644
--- a/mrbgems/mruby-os-memsize/src/memsize.c
+++ b/mrbgems/mruby-os-memsize/src/memsize.c
@@ -88,6 +88,7 @@ os_memsize_of_object(mrb_state* mrb, mrb_value obj)
mrb_hash_memsize(obj);
break;
}
+ case MRB_TT_STRUCT:
case MRB_TT_ARRAY: {
mrb_int len = RARRAY_LEN(obj);
/* Arrays that do not fit within an RArray perform a heap allocation
diff --git a/mrbgems/mruby-pack/README.md b/mrbgems/mruby-pack/README.md
index efa51cc1b..712cf8e1c 100644
--- a/mrbgems/mruby-pack/README.md
+++ b/mrbgems/mruby-pack/README.md
@@ -1,5 +1,4 @@
-mruby-pack (pack / unpack)
-=========
+# mruby-pack (pack / unpack)
mruby-pack provides `Array#pack` and `String#unpack` for mruby.
@@ -8,41 +7,41 @@ mruby-pack provides `Array#pack` and `String#unpack` for mruby.
Add the line below into your build configuration:
```
- conf.gem :github => 'iij/mruby-pack'
+ conf.gem :core => 'mruby-pack'
```
There is no dependency on other mrbgems.
## Supported template string
- - A : arbitrary binary string (space padded, count is width)
- - a : arbitrary binary string (null padded, count is width)
- - C : 8-bit unsigned (unsigned char)
- - c : 8-bit signed (signed char)
- - D, d: 64-bit float, native format
- - E : 64-bit float, little endian byte order
- - e : 32-bit float, little endian byte order
- - F, f: 32-bit float, native format
- - G : 64-bit float, network (big-endian) byte order
- - g : 32-bit float, network (big-endian) byte order
- - H : hex string (high nibble first)
- - h : hex string (low nibble first)
- - I : unsigned integer, native endian (`unsigned int` in C)
- - i : signed integer, native endian (`int` in C)
- - L : 32-bit unsigned, native endian (`uint32_t`)
- - l : 32-bit signed, native endian (`int32_t`)
- - m : base64 encoded string (see RFC 2045, count is width)
- - N : 32-bit unsigned, network (big-endian) byte order
- - n : 16-bit unsigned, network (big-endian) byte order
- - Q : 64-bit unsigned, native endian (`uint64_t`)
- - q : 64-bit signed, native endian (`int64_t`)
- - S : 16-bit unsigned, native endian (`uint16_t`)
- - s : 16-bit signed, native endian (`int16_t`)
- - U : UTF-8 character
- - V : 32-bit unsigned, VAX (little-endian) byte order
- - v : 16-bit unsigned, VAX (little-endian) byte order
- - x : null byte
- - Z : same as "a", except that null is added with *
+- A : arbitrary binary string (space padded, count is width)
+- a : arbitrary binary string (null padded, count is width)
+- C : 8-bit unsigned (unsigned char)
+- c : 8-bit signed (signed char)
+- D, d: 64-bit float, native format
+- E : 64-bit float, little endian byte order
+- e : 32-bit float, little endian byte order
+- F, f: 32-bit float, native format
+- G : 64-bit float, network (big-endian) byte order
+- g : 32-bit float, network (big-endian) byte order
+- H : hex string (high nibble first)
+- h : hex string (low nibble first)
+- I : unsigned integer, native endian (`unsigned int` in C)
+- i : signed integer, native endian (`int` in C)
+- L : 32-bit unsigned, native endian (`uint32_t`)
+- l : 32-bit signed, native endian (`int32_t`)
+- m : base64 encoded string (see RFC 2045, count is width)
+- N : 32-bit unsigned, network (big-endian) byte order
+- n : 16-bit unsigned, network (big-endian) byte order
+- Q : 64-bit unsigned, native endian (`uint64_t`)
+- q : 64-bit signed, native endian (`int64_t`)
+- S : 16-bit unsigned, native endian (`uint16_t`)
+- s : 16-bit signed, native endian (`int16_t`)
+- U : UTF-8 character
+- V : 32-bit unsigned, VAX (little-endian) byte order
+- v : 16-bit unsigned, VAX (little-endian) byte order
+- x : null byte
+- Z : same as "a", except that null is added with *
## License
diff --git a/mrbgems/mruby-pack/src/pack.c b/mrbgems/mruby-pack/src/pack.c
index e52171d6b..f0d4b8d9e 100644
--- a/mrbgems/mruby-pack/src/pack.c
+++ b/mrbgems/mruby-pack/src/pack.c
@@ -18,18 +18,23 @@
#define INT_OVERFLOW_P(n) ((n) < MRB_INT_MIN || (n) > MRB_INT_MAX)
#define UINT_OVERFLOW_P(n) ((n) > MRB_INT_MAX)
+#ifndef EOF
+# define EOF (-1) /* for MRB_NO_STDIO */
+#endif
+
struct tmpl {
mrb_value str;
int idx;
};
-enum {
+enum pack_dir {
PACK_DIR_CHAR, /* C */
PACK_DIR_SHORT, /* S */
PACK_DIR_LONG, /* L */
PACK_DIR_QUAD, /* Q */
//PACK_DIR_INT, /* i */
//PACK_DIR_VAX,
+ PACK_DIR_BER, /* w */
PACK_DIR_UTF8, /* U */
//PACK_DIR_BER,
PACK_DIR_DOUBLE, /* E */
@@ -37,30 +42,33 @@ enum {
PACK_DIR_STR, /* A */
PACK_DIR_HEX, /* h */
PACK_DIR_BASE64, /* m */
+ PACK_DIR_QENC, /* M */
PACK_DIR_NUL, /* x */
+ PACK_DIR_BACK, /* X */
+ PACK_DIR_ABS, /* @ */
PACK_DIR_INVALID
};
-enum {
+enum pack_type {
PACK_TYPE_INTEGER,
PACK_TYPE_FLOAT,
PACK_TYPE_STRING,
PACK_TYPE_NONE
};
-#define PACK_FLAG_s 0x00000001 /* native size ("_" "!") */
-#define PACK_FLAG_a 0x00000002 /* null padding ("a") */
-#define PACK_FLAG_Z 0x00000004 /* append nul char ("z") */
-#define PACK_FLAG_SIGNED 0x00000008 /* native size ("_" "!") */
-#define PACK_FLAG_GT 0x00000010 /* big endian (">") */
-#define PACK_FLAG_LT 0x00000020 /* little endian ("<") */
-#define PACK_FLAG_WIDTH 0x00000040 /* "count" is "width" */
-#define PACK_FLAG_LSB 0x00000080 /* LSB / low nibble first */
-#define PACK_FLAG_COUNT2 0x00000100 /* "count" is special... */
-#define PACK_FLAG_LITTLEENDIAN 0x00000200 /* little endian actually */
+#define PACK_FLAG_s 0x00000001 /* native size ("_" "!") */
+#define PACK_FLAG_a 0x00000002 /* null padding ("a") */
+#define PACK_FLAG_Z 0x00000004 /* append nul char ("z") */
+#define PACK_FLAG_SIGNED 0x00000008 /* native size ("_" "!") */
+#define PACK_FLAG_GT 0x00000010 /* big endian (">") */
+#define PACK_FLAG_LT 0x00000020 /* little endian ("<") */
+#define PACK_FLAG_WIDTH 0x00000040 /* "count" is "width" */
+#define PACK_FLAG_LSB 0x00000080 /* LSB / low nibble first */
+#define PACK_FLAG_COUNT2 0x00000100 /* "count" is special... */
+#define PACK_FLAG_LITTLEENDIAN 0x00000200 /* little endian actually */
-#define PACK_BASE64_IGNORE 0xff
-#define PACK_BASE64_PADDING 0xfe
+#define PACK_BASE64_IGNORE 0xff
+#define PACK_BASE64_PADDING 0xfe
const static unsigned char base64chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -76,7 +84,7 @@ hex2int(unsigned char ch)
else if (ch >= 'a' && ch <= 'f')
return 10 + (ch - 'a');
else
- return 0;
+ return -1;
}
static void
@@ -113,7 +121,7 @@ str_len_ensure(mrb_state *mrb, mrb_value str, mrb_int len)
static int
-pack_c(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
+pack_char(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
{
str = str_len_ensure(mrb, str, sidx + 1);
RSTRING_PTR(str)[sidx] = (char)mrb_integer(o);
@@ -121,7 +129,7 @@ pack_c(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int fl
}
static int
-unpack_c(mrb_state *mrb, const void *src, int srclen, mrb_value ary, unsigned int flags)
+unpack_char(mrb_state *mrb, const void *src, int srclen, mrb_value ary, unsigned int flags)
{
if (flags & PACK_FLAG_SIGNED)
mrb_ary_push(mrb, ary, mrb_fixnum_value(*(signed char *)src));
@@ -131,7 +139,7 @@ unpack_c(mrb_state *mrb, const void *src, int srclen, mrb_value ary, unsigned in
}
static int
-pack_s(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
+pack_short(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
{
uint16_t n;
@@ -148,7 +156,7 @@ pack_s(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int fl
}
static int
-unpack_s(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
+unpack_short(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
{
int n;
@@ -165,7 +173,7 @@ unpack_s(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un
}
static int
-pack_l(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
+pack_long(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
{
uint32_t n;
@@ -219,7 +227,7 @@ u32tostr(char *buf, size_t len, uint32_t n)
#endif /* MRB_INT64 */
static int
-unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
+unpack_long(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
{
#ifndef MRB_INT64
char msg[60];
@@ -254,7 +262,7 @@ unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un
}
static int
-pack_q(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
+pack_quad(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
{
uint64_t n;
@@ -336,7 +344,7 @@ i64tostr(char *buf, size_t len, int64_t n)
#endif /* MRB_INT64 */
static int
-unpack_q(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
+unpack_quad(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
{
char msg[60];
uint64_t ull;
@@ -375,6 +383,46 @@ unpack_q(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un
return 8;
}
+static int
+pack_BER(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
+{
+ mrb_int n = mrb_integer(o);
+ size_t i;
+ char *p;
+
+ if (n < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "can't compress negative numbers");
+ }
+ for (i=1; i<sizeof(mrb_int)+1; i++) {
+ mrb_int mask = ~((1L<<(7*i))-1);
+ if ((n & mask) == 0) break;
+ }
+ str = str_len_ensure(mrb, str, sidx + i);
+ p = RSTRING_PTR(str)+sidx;
+ for (size_t j=i; j>0; p++,j--) {
+ mrb_int x = (n>>(7*(j-1)))&0x7f;
+ *p = (char)x;
+ if (j > 1) *p |= 0x80;
+ }
+ return i;
+}
+
+static int
+unpack_BER(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags)
+{
+ mrb_int i, n = 0;
+ const unsigned char *p = src;
+ const unsigned char *e = p + srclen;
+
+ for (i=1; p<e; p++,i++) {
+ n <<= 7;
+ n |= *p & 0x7f;
+ if ((*p & 0x80) == 0) break;
+ }
+ mrb_ary_push(mrb, ary, mrb_int_value(mrb, n));
+ return i;
+}
+
#ifndef MRB_NO_FLOAT
static int
pack_double(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags)
@@ -504,7 +552,7 @@ unpack_float(mrb_state *mrb, const unsigned char * src, int srclen, mrb_value ar
#endif
static int
-pack_utf8(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, long count, unsigned int flags)
+pack_utf8(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, int count, unsigned int flags)
{
char utf8[4];
int len = 0;
@@ -621,7 +669,7 @@ unpack_utf8(mrb_state *mrb, const unsigned char * src, int srclen, mrb_value ary
}
static int
-pack_a(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, unsigned int flags)
+pack_str(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, int count, unsigned int flags)
{
mrb_int copylen, slen, padlen;
char *dptr, *dptr0, pad, *sptr;
@@ -659,7 +707,7 @@ pack_a(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, u
}
static int
-unpack_a(mrb_state *mrb, const void *src, int slen, mrb_value ary, long count, unsigned int flags)
+unpack_str(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, unsigned int flags)
{
mrb_value dst;
const char *cp, *sptr;
@@ -693,7 +741,7 @@ unpack_a(mrb_state *mrb, const void *src, int slen, mrb_value ary, long count, u
static int
-pack_h(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, unsigned int flags)
+pack_hex(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, int count, unsigned int flags)
{
unsigned int a, ashift, b, bshift;
long slen;
@@ -724,10 +772,12 @@ pack_h(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, u
a = b = 0;
if (slen > 0) {
a = hex2int(*sptr++);
+ if (a < 0) break;
slen--;
}
if (slen > 0) {
b = hex2int(*sptr++);
+ if (b < 0) break;
slen--;
}
*dptr++ = (a << ashift) + (b << bshift);
@@ -737,7 +787,7 @@ pack_h(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, u
}
static int
-unpack_h(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, unsigned int flags)
+unpack_hex(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, unsigned int flags)
{
mrb_value dst;
int a, ashift, b, bshift;
@@ -783,9 +833,8 @@ unpack_h(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, un
return (int)(sptr - sptr0);
}
-
static int
-pack_m(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, unsigned int flags)
+pack_base64(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, int count)
{
mrb_int dstlen;
unsigned long l;
@@ -851,7 +900,7 @@ pack_m(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, u
}
static int
-unpack_m(mrb_state *mrb, const void *src, int slen, mrb_value ary, unsigned int flags)
+unpack_base64(mrb_state *mrb, const void *src, int slen, mrb_value ary)
{
mrb_value dst;
int dlen;
@@ -874,13 +923,13 @@ unpack_m(mrb_state *mrb, const void *src, int slen, mrb_value ary, unsigned int
if (slen-- == 0)
goto done;
c = *sptr++;
- if (c >= sizeof(base64_dec_tab))
- continue;
- ch[i] = base64_dec_tab[c];
- if (ch[i] == PACK_BASE64_PADDING) {
- ch[i] = 0;
- padding++;
- }
+ if (c >= sizeof(base64_dec_tab))
+ continue;
+ ch[i] = base64_dec_tab[c];
+ if (ch[i] == PACK_BASE64_PADDING) {
+ ch[i] = 0;
+ padding++;
+ }
} while (c >= sizeof(base64_dec_tab) || ch[i] == PACK_BASE64_IGNORE);
}
@@ -907,25 +956,117 @@ done:
}
static int
-pack_x(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, unsigned int flags)
+pack_qenc(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, int count)
+{
+ static const char hex_table[] = "0123456789ABCDEF";
+ char buff[1024];
+ char *s = RSTRING_PTR(src);
+ char *send = s + RSTRING_LEN(src);
+ int i = 0, n = 0, prev = EOF;
+ int dlen = 0;
+
+ if (count <= 1) count = 72;
+ while (s < send) {
+ if ((*s > 126) ||
+ (*s < 32 && *s != '\n' && *s != '\t') ||
+ (*s == '=')) {
+ buff[i++] = '=';
+ buff[i++] = hex_table[(*s & 0xf0) >> 4];
+ buff[i++] = hex_table[*s & 0x0f];
+ n += 3;
+ prev = EOF;
+ }
+ else if (*s == '\n') {
+ if (prev == ' ' || prev == '\t') {
+ buff[i++] = '=';
+ buff[i++] = *s;
+ }
+ buff[i++] = *s;
+ n = 0;
+ prev = *s;
+ }
+ else {
+ buff[i++] = *s;
+ n++;
+ prev = *s;
+ }
+ if (n > count) {
+ buff[i++] = '=';
+ buff[i++] = '\n';
+ n = 0;
+ prev = '\n';
+ }
+ if (i > 1024 - 5) {
+ str_len_ensure(mrb, dst, didx+dlen+i);
+ memcpy(RSTRING_PTR(dst)+didx+dlen, buff, i);
+ dlen += i;
+ i = 0;
+ }
+ s++;
+ }
+ if (n > 0) {
+ buff[i++] = '=';
+ buff[i++] = '\n';
+ }
+ if (i > 0) {
+ str_len_ensure(mrb, dst, didx+dlen+i);
+ memcpy(RSTRING_PTR(dst)+didx+dlen, buff, i);
+ dlen += i;
+ }
+ return dlen;
+}
+
+static int
+unpack_qenc(mrb_state *mrb, const void *src, int slen, mrb_value ary)
+{
+ mrb_value buf = mrb_str_new(mrb, 0, slen);
+ const char *s = (const char*)src, *ss = s;
+ const char *send = s + slen;
+ char *ptr = RSTRING_PTR(buf);
+ int c1, c2;
+
+ while (s < send) {
+ if (*s == '=') {
+ if (++s == send) break;
+ if (s+1 < send && *s == '\r' && *(s+1) == '\n')
+ s++;
+ if (*s != '\n') {
+ if ((c1 = hex2int(*s)) == -1) break;
+ if (++s == send) break;
+ if ((c2 = hex2int(*s)) == -1) break;
+ *ptr++ = (char)(c1 << 4 | c2);
+ }
+ }
+ else {
+ *ptr++ = *s;
+ }
+ s++;
+ ss = s;
+ }
+ buf = mrb_str_resize(mrb, buf, (mrb_int)(ptr - RSTRING_PTR(buf)));
+ mrb_str_cat(mrb, buf, ss, send-ss);
+ mrb_ary_push(mrb, ary, buf);
+ return slen;
+}
+
+static int
+pack_nul(mrb_state *mrb, mrb_value dst, mrb_int didx, int count)
{
long i;
- if (count < 0) return 0;
dst = str_len_ensure(mrb, dst, didx + count);
for (i = 0; i < count; i++) {
RSTRING_PTR(dst)[didx + i] = '\0';
}
return count;
}
-static int
-unpack_x(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, unsigned int flags)
+
+static void
+check_x(mrb_state *mrb, int a, int count, char c)
{
- if (count < 0) return slen;
- if (slen < count) {
- mrb_raise(mrb, E_ARGUMENT_ERROR, "x outside of string");
+ if (a < count) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "%c outside of string", c);
}
- return count;
}
static void
@@ -942,10 +1083,12 @@ has_tmpl(const struct tmpl *tmpl)
}
static void
-read_tmpl(mrb_state *mrb, struct tmpl *tmpl, int *dirp, int *typep, int *sizep, int *countp, unsigned int *flagsp)
+read_tmpl(mrb_state *mrb, struct tmpl *tmpl, enum pack_dir *dirp, enum pack_type *typep, int *sizep, int *countp, unsigned int *flagsp)
{
mrb_int t, tlen;
- int ch, dir, type, size = 0;
+ int ch, size = 0;
+ enum pack_dir dir;
+ enum pack_type type;
int count = 1;
unsigned int flags = 0;
const char *tptr;
@@ -1052,11 +1195,21 @@ alias:
size = 4;
flags |= PACK_FLAG_SIGNED;
break;
+ case 'w':
+ dir = PACK_DIR_BER;
+ type = PACK_TYPE_INTEGER;
+ flags |= PACK_FLAG_SIGNED;
+ break;
case 'm':
dir = PACK_DIR_BASE64;
type = PACK_TYPE_STRING;
flags |= PACK_FLAG_WIDTH | PACK_FLAG_COUNT2;
break;
+ case 'M':
+ dir = PACK_DIR_QENC;
+ type = PACK_TYPE_STRING;
+ flags |= PACK_FLAG_WIDTH | PACK_FLAG_COUNT2;
+ break;
case 'N': /* = "L>" */
dir = PACK_DIR_LONG;
type = PACK_TYPE_INTEGER;
@@ -1111,11 +1264,23 @@ alias:
dir = PACK_DIR_NUL;
type = PACK_TYPE_NONE;
break;
+ case 'X':
+ dir = PACK_DIR_BACK;
+ type = PACK_TYPE_NONE;
+ break;
+ case '@':
+ dir = PACK_DIR_ABS;
+ type = PACK_TYPE_NONE;
+ break;
case 'Z':
dir = PACK_DIR_STR;
type = PACK_TYPE_STRING;
flags |= PACK_FLAG_WIDTH | PACK_FLAG_COUNT2 | PACK_FLAG_Z;
break;
+ case 'p': case 'P':
+ case '%':
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "%c is not supported", (char)t);
+ break;
default:
dir = PACK_DIR_INVALID;
type = PACK_TYPE_NONE;
@@ -1124,19 +1289,21 @@ alias:
/* read suffix [0-9*_!<>] */
while (tmpl->idx < tlen) {
- ch = tptr[tmpl->idx++];
+ ch = tptr[tmpl->idx];
if (ISDIGIT(ch)) {
- count = ch - '0';
- while (tmpl->idx < tlen && ISDIGIT(tptr[tmpl->idx])) {
- int ch = tptr[tmpl->idx++] - '0';
- if (count+ch > INT_MAX/10) {
- mrb_raise(mrb, E_RUNTIME_ERROR, "too big template length");
- }
- count = count * 10 + ch;
+ char *e;
+ mrb_int n = mrb_int_read(tptr+tmpl->idx, tptr+tlen, &e);
+ if (e == NULL || n > INT_MAX) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "too big template length");
}
- continue; /* special case */
+ count = (int)n;
+ tmpl->idx = e - tptr;
+ continue;
} else if (ch == '*') {
- count = -1;
+ if (type == PACK_TYPE_NONE)
+ count = 0;
+ else
+ count = -1;
} else if (ch == '_' || ch == '!' || ch == '<' || ch == '>') {
if (strchr("sSiIlLqQ", (int)t) == NULL) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "'%c' allowed only after types sSiIlLqQ", ch);
@@ -1148,10 +1315,11 @@ alias:
} else if (ch == '>') {
flags |= PACK_FLAG_GT;
}
- } else {
- tmpl->idx--;
+ }
+ else {
break;
}
+ tmpl->idx++;
}
if ((flags & PACK_FLAG_LT) || (!(flags & PACK_FLAG_GT) && littleendian)) {
@@ -1173,7 +1341,9 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary)
struct tmpl tmpl;
int count;
unsigned int flags;
- int dir, ridx, size, type;
+ enum pack_dir dir;
+ enum pack_type type;
+ int ridx, size;
prepare_tmpl(mrb, &tmpl);
@@ -1186,8 +1356,22 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary)
if (dir == PACK_DIR_INVALID)
continue;
else if (dir == PACK_DIR_NUL) {
- ridx += pack_x(mrb, mrb_nil_value(), result, ridx, count, flags);
- if (ridx < 0) goto overflow;
+ grow:
+ if (ridx > INT_MAX - count) goto overflow;
+ ridx += pack_nul(mrb, result, ridx, count);
+ continue;
+ }
+ else if (dir == PACK_DIR_BACK) {
+ check_x(mrb, ridx, count, 'X');
+ ridx -= count;
+ continue;
+ }
+ else if (dir == PACK_DIR_ABS) {
+ count -= ridx;
+ if (count > 0) goto grow;
+ count = -count;
+ check_x(mrb, ridx, count, '@');
+ ridx -= count;
continue;
}
@@ -1200,12 +1384,12 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary)
o = mrb_ary_ref(mrb, ary, aidx);
if (type == PACK_TYPE_INTEGER) {
- o = mrb_to_int(mrb, o);
+ o = mrb_to_integer(mrb, o);
}
#ifndef MRB_NO_FLOAT
else if (type == PACK_TYPE_FLOAT) {
if (!mrb_float_p(o)) {
- mrb_float f = mrb_to_flo(mrb, o);
+ mrb_float f = mrb_as_float(mrb, o);
o = mrb_float_value(mrb, f);
}
}
@@ -1218,25 +1402,31 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary)
switch (dir) {
case PACK_DIR_CHAR:
- ridx += pack_c(mrb, o, result, ridx, flags);
+ ridx += pack_char(mrb, o, result, ridx, flags);
break;
case PACK_DIR_SHORT:
- ridx += pack_s(mrb, o, result, ridx, flags);
+ ridx += pack_short(mrb, o, result, ridx, flags);
break;
case PACK_DIR_LONG:
- ridx += pack_l(mrb, o, result, ridx, flags);
+ ridx += pack_long(mrb, o, result, ridx, flags);
break;
case PACK_DIR_QUAD:
- ridx += pack_q(mrb, o, result, ridx, flags);
+ ridx += pack_quad(mrb, o, result, ridx, flags);
+ break;
+ case PACK_DIR_BER:
+ ridx += pack_BER(mrb, o, result, ridx, flags);
break;
case PACK_DIR_BASE64:
- ridx += pack_m(mrb, o, result, ridx, count, flags);
+ ridx += pack_base64(mrb, o, result, ridx, count);
+ break;
+ case PACK_DIR_QENC:
+ ridx += pack_qenc(mrb, o, result, ridx, count);
break;
case PACK_DIR_HEX:
- ridx += pack_h(mrb, o, result, ridx, count, flags);
+ ridx += pack_hex(mrb, o, result, ridx, count, flags);
break;
case PACK_DIR_STR:
- ridx += pack_a(mrb, o, result, ridx, count, flags);
+ ridx += pack_str(mrb, o, result, ridx, count, flags);
break;
#ifndef MRB_NO_FLOAT
case PACK_DIR_DOUBLE:
@@ -1252,7 +1442,7 @@ mrb_pack_pack(mrb_state *mrb, mrb_value ary)
default:
break;
}
- if (dir == PACK_DIR_STR || dir == PACK_DIR_BASE64 || dir == PACK_DIR_HEX) {
+ if (flags & PACK_FLAG_COUNT2) {
/* always consumes 1 entry */
aidx++;
break;
@@ -1278,7 +1468,9 @@ pack_unpack(mrb_state *mrb, mrb_value str, int single)
struct tmpl tmpl;
int count;
unsigned int flags;
- int dir, size, type;
+ enum pack_dir dir;
+ enum pack_type type;
+ int size;
int srcidx, srclen;
const unsigned char *sptr;
@@ -1294,24 +1486,39 @@ pack_unpack(mrb_state *mrb, mrb_value str, int single)
if (dir == PACK_DIR_INVALID)
continue;
else if (dir == PACK_DIR_NUL) {
- srcidx += unpack_x(mrb, sptr, srclen - srcidx, result, count, flags);
+ check_x(mrb, srclen-srcidx, count, 'x');
+ srcidx += count;
+ continue;
+ }
+ else if (dir == PACK_DIR_BACK) {
+ check_x(mrb, srcidx, count, 'X');
+ srcidx -= count;
+ continue;
+ }
+ else if (dir == PACK_DIR_ABS) {
+ check_x(mrb, srclen, count, '@');
+ srcidx = count;
continue;
}
- if (flags & PACK_FLAG_COUNT2) {
- sptr = (const unsigned char *)RSTRING_PTR(str) + srcidx;
- switch (dir) {
- case PACK_DIR_HEX:
- srcidx += unpack_h(mrb, sptr, srclen - srcidx, result, count, flags);
- break;
- case PACK_DIR_STR:
- srcidx += unpack_a(mrb, sptr, srclen - srcidx, result, count, flags);
- break;
- case PACK_DIR_BASE64:
- srcidx += unpack_m(mrb, sptr, srclen - srcidx, result, flags);
- break;
- }
+ /* PACK_FLAG_COUNT2 directions */
+ sptr = (const unsigned char *)RSTRING_PTR(str) + srcidx;
+ switch (dir) {
+ case PACK_DIR_HEX:
+ srcidx += unpack_hex(mrb, sptr, srclen - srcidx, result, count, flags);
+ continue;
+ case PACK_DIR_STR:
+ srcidx += unpack_str(mrb, sptr, srclen - srcidx, result, count, flags);
continue;
+ case PACK_DIR_BASE64:
+ srcidx += unpack_base64(mrb, sptr, srclen - srcidx, result);
+ continue;
+ break;
+ case PACK_DIR_QENC:
+ srcidx += unpack_qenc(mrb, sptr, srclen - srcidx, result);
+ continue;
+ default:
+ break;
}
while (count != 0) {
@@ -1325,16 +1532,19 @@ pack_unpack(mrb_state *mrb, mrb_value str, int single)
sptr = (const unsigned char*)RSTRING_PTR(str) + srcidx;
switch (dir) {
case PACK_DIR_CHAR:
- srcidx += unpack_c(mrb, sptr, srclen - srcidx, result, flags);
+ srcidx += unpack_char(mrb, sptr, srclen - srcidx, result, flags);
break;
case PACK_DIR_SHORT:
- srcidx += unpack_s(mrb, sptr, srclen - srcidx, result, flags);
+ srcidx += unpack_short(mrb, sptr, srclen - srcidx, result, flags);
break;
case PACK_DIR_LONG:
- srcidx += unpack_l(mrb, sptr, srclen - srcidx, result, flags);
+ srcidx += unpack_long(mrb, sptr, srclen - srcidx, result, flags);
break;
case PACK_DIR_QUAD:
- srcidx += unpack_q(mrb, sptr, srclen - srcidx, result, flags);
+ srcidx += unpack_quad(mrb, sptr, srclen - srcidx, result, flags);
+ break;
+ case PACK_DIR_BER:
+ srcidx += unpack_BER(mrb, sptr, srclen - srcidx, result, flags);
break;
#ifndef MRB_NO_FLOAT
case PACK_DIR_FLOAT:
diff --git a/mrbgems/mruby-pack/test/pack.rb b/mrbgems/mruby-pack/test/pack.rb
index a248174a5..16db6607b 100644
--- a/mrbgems/mruby-pack/test/pack.rb
+++ b/mrbgems/mruby-pack/test/pack.rb
@@ -10,78 +10,59 @@ def assert_pack tmpl, packed, unpacked
end
# pack & unpack 'm' (base64)
-assert('[""].pack("m")') do
+assert('pack("m")') do
assert_pack "m", "", [""]
-end
-
-assert('["\0"].pack("m")') do
assert_pack "m", "AA==\n", ["\0"]
-end
-
-assert('["\0\0"].pack("m")') do
assert_pack "m", "AAA=\n", ["\0\0"]
-end
-
-assert('["\0\0\0"].pack("m")') do
assert_pack "m", "AAAA\n", ["\0\0\0"]
-end
-
-assert('["abc..xyzABC..XYZ"].pack("m")') do
assert_pack "m", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJT\nVFVWV1hZWg==\n", ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]
-end
-assert('"YWJ...".unpack("m") should "abc..xyzABC..XYZ"') do
ary = ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]
assert_equal ary, "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJT\nVFVWV1hZWg==\n".unpack("m")
assert_equal ary, "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWg==\n".unpack("m")
-end
-assert('["A", "B"].pack') do
assert_equal "QQ==\n", ["A", "B"].pack("m50")
assert_equal ["A"], "QQ==\n".unpack("m50")
assert_equal "QQ==Qg==", ["A", "B"].pack("m0 m0")
assert_equal ["A", "B"], "QQ==Qg==".unpack("m10 m10")
+ assert_pack "m0", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWg==", ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]
end
-assert('["abc..xyzABC..XYZ"].pack("m0")') do
- assert_pack "m0", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWg==", ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]
+# pack & unpack 'M' (Quoted-printable)
+assert('pack("M")') do
+ assert_pack "M", "123=\n", ["123"]
+ assert_pack "M", "=3D\n", ["=\n"]
+ assert_pack "M", "=E3=81=82=\n", ["あ"]
+
+ assert_equal ["123"], "123=\n".unpack("M")
+ assert_equal ["=\n"], "=3D\n".unpack("M")
+ assert_equal ["あ"], "=E3=81=82=\n".unpack("M")
end
# pack & unpack 'H'
-assert('["3031"].pack("H*")') do
+assert('pack("H")') do
assert_pack "H*", "01", ["3031"]
-end
-
-assert('["10"].pack("H*")') do
assert_pack "H*", "\020", ["10"]
end
-assert('[0,1,127,128,255].pack("C*")') do
+assert('pack("C")') do
assert_pack "C*", "\x00\x01\x7F\x80\xFF", [0, 1, 127, 128, 255]
end
-# pack "a"
-assert('["abc"].pack("a")') do
+assert('pack("a")') do
assert_equal "a", ["abc"].pack("a")
assert_equal "abc", ["abc"].pack("a*")
assert_equal "abc\0", ["abc"].pack("a4")
-end
-# upack "a"
-assert('["abc"].pack("a")') do
assert_equal ["abc\0"], "abc\0".unpack("a4")
assert_equal ["abc "], "abc ".unpack("a4")
end
-# pack "A"
-assert('["abc"].pack("A")') do
+assert('pack("A")') do
assert_equal "a", ["abc"].pack("A")
assert_equal "abc", ["abc"].pack("A*")
assert_equal "abc ", ["abc"].pack("A4")
-end
-# upack "A"
-assert('["abc"].pack("A")') do
assert_equal ["abc"], "abc\0".unpack("A4")
assert_equal ["abc"], "abc ".unpack("A4")
end
@@ -143,6 +124,12 @@ assert 'pack/unpack "I"' do
assert_pack 'I', str, [12345]
end
+assert 'pack/unpack "w"' do
+ for x in [0,1,127,128,16383,16384,65535,65536]
+ assert_equal [x], [x].pack("w").unpack("w")
+ end
+end
+
assert 'pack/unpack "U"' do
assert_equal [], "".unpack("U")
assert_equal [], "".unpack("U*")
diff --git a/mrbgems/mruby-print/src/print.c b/mrbgems/mruby-print/src/print.c
index c98bfb7bf..789808deb 100644
--- a/mrbgems/mruby-print/src/print.c
+++ b/mrbgems/mruby-print/src/print.c
@@ -6,7 +6,6 @@
#include <mruby/string.h>
#include <string.h>
-#include <stdlib.h>
#if defined(_WIN32)
# include <windows.h>
# include <io.h>
diff --git a/mrbgems/mruby-proc-binding/src/proc-binding.c b/mrbgems/mruby-proc-binding/src/proc-binding.c
index 82d9d1d51..d176034d2 100644
--- a/mrbgems/mruby-proc-binding/src/proc-binding.c
+++ b/mrbgems/mruby-proc-binding/src/proc-binding.c
@@ -3,8 +3,6 @@
#include <mruby/proc.h>
#include <mruby/variable.h>
-void mrb_proc_merge_lvar(mrb_state *mrb, mrb_irep *irep, struct REnv *env, int num, const mrb_sym *lv, const mrb_value *stack);
-
/* provided by mruby-proc-ext */
mrb_value mrb_proc_source_location(mrb_state *mrb, struct RProc *p);
diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c
index 9712fbd7e..027e7ce0b 100644
--- a/mrbgems/mruby-random/src/random.c
+++ b/mrbgems/mruby-random/src/random.c
@@ -22,8 +22,6 @@ worldwide. This software is distributed without any warranty.
See <https://creativecommons.org/publicdomain/zero/1.0/>. */
-#include <stdint.h>
-
/* This is xoshiro128++ 1.0, one of our 32-bit all-purpose, rock-solid
generators. It has excellent speed, a state size (128 bits) that is
large enough for mild parallelism, and it passes all tests we are aware
@@ -60,12 +58,17 @@ rand_init(rand_state *t)
#endif
}
+static uint32_t rand_uint32(rand_state *state);
+
static uint32_t
rand_seed(rand_state *t, uint32_t seed)
{
uint32_t old_seed = t->seed[SEEDPOS];
rand_init(t);
t->seed[SEEDPOS] = seed;
+ for (int i = 0; i < 10; i++) {
+ rand_uint32(t);
+ }
return old_seed;
}
@@ -151,14 +154,6 @@ get_opt(mrb_state* mrb)
return arg;
}
-static void
-random_check(mrb_state *mrb, mrb_value random) {
- struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Random));
- if (!mrb_obj_is_kind_of(mrb, random, c) || !mrb_istruct_p(random)) {
- mrb_raise(mrb, E_TYPE_ERROR, "Random instance required");
- }
-}
-
static mrb_value
random_default(mrb_state *mrb) {
struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Random));
@@ -229,47 +224,13 @@ static mrb_value
mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
{
mrb_int i, max;
- 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);
-
- if (mrb_nil_p(r)) {
+ struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Random));
+ if (mrb_get_args(mrb, "|I", &random, c) == 0) {
random = random_default_state(mrb);
}
- else {
- random_check(mrb, r);
- random = random_ptr(r);
- }
mrb_ary_modify(mrb, mrb_ary_ptr(ary));
max = RARRAY_LEN(ary);
for (i = RARRAY_LEN(ary) - 1; i > 0; i--) {
@@ -324,18 +285,13 @@ mrb_ary_sample(mrb_state *mrb, mrb_value ary)
{
mrb_int n = 0;
mrb_bool given;
- mrb_value r = mrb_nil_value();
rand_state *random;
mrb_int len;
+ struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Random));
- mrb_get_args(mrb, "|i?o", &n, &given, &r);
- if (mrb_nil_p(r)) {
+ if (mrb_get_args(mrb, "|i?I", &n, &given, &random, c) < 2) {
random = random_default_state(mrb);
}
- else {
- random_check(mrb, r);
- random = random_ptr(r);
- }
len = RARRAY_LEN(ary);
if (!given) { /* pick one element */
switch (len) {
diff --git a/mrbgems/mruby-range-ext/src/range.c b/mrbgems/mruby-range-ext/src/range.c
index 7b919eb90..633c97b73 100644
--- a/mrbgems/mruby-range-ext/src/range.c
+++ b/mrbgems/mruby-range-ext/src/range.c
@@ -1,6 +1,5 @@
#include <mruby.h>
#include <mruby/range.h>
-#include <math.h>
static mrb_bool
r_le(mrb_state *mrb, mrb_value a, mrb_value b)
@@ -81,7 +80,7 @@ range_size(mrb_state *mrb, mrb_value range)
beg = RANGE_BEG(r);
end = RANGE_END(r);
- if ((mrb_fixnum_p(beg) || mrb_float_p(beg)) && mrb_nil_p(end)) {
+ if ((mrb_integer_p(beg) || mrb_float_p(beg)) && mrb_nil_p(end)) {
return mrb_float_value(mrb, INFINITY);
}
@@ -136,7 +135,7 @@ range_size(mrb_state *mrb, mrb_value range)
beg = RANGE_BEG(r);
end = RANGE_END(r);
- if (mrb_fixnum_p(beg) && mrb_nil_p(end)) {
+ if (mrb_integer_p(beg) && mrb_nil_p(end)) {
return mrb_nil_value();
}
@@ -147,7 +146,7 @@ range_size(mrb_state *mrb, mrb_value range)
mrb_int b = mrb_integer(end);
mrb_int c = b - a + excl;
- return mrb_fixnum_value(c);
+ return mrb_int_value(mrb, c);
}
return mrb_nil_value();
}
diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c
index 2dfabe504..dacce53eb 100644
--- a/mrbgems/mruby-rational/src/rational.c
+++ b/mrbgems/mruby-rational/src/rational.c
@@ -37,7 +37,7 @@ static struct RBasic*
rational_alloc(mrb_state *mrb, struct RClass *c, struct mrb_rational **p)
{
struct RRational *s;
- s = (struct RRational*)mrb_obj_alloc(mrb, MRB_TT_RATIONAL, c);
+ s = MRB_OBJ_ALLOC(mrb, MRB_TT_RATIONAL, c);
#ifdef RATIONAL_INLINE
*p = &s->r;
#else
@@ -155,7 +155,6 @@ rational_new_i(mrb_state *mrb, mrb_int n, mrb_int d)
}
#ifndef MRB_NO_FLOAT
-#include <math.h>
#if defined(MRB_INT32) || defined(MRB_USE_FLOAT32)
#define frexp_rat(x,exp) frexpf((float)x, exp)
@@ -255,20 +254,20 @@ rational_s_new(mrb_state *mrb, mrb_value self)
}
else {
mrb_float numf = (mrb_float)numerator;
- mrb_float denomf = mrb_to_flo(mrb, denomv);
+ mrb_float denomf = mrb_as_float(mrb, denomv);
return rational_new_f(mrb, numf/denomf);
}
}
else {
- mrb_float numf = mrb_to_flo(mrb, numv);
+ mrb_float numf = mrb_as_float(mrb, numv);
mrb_float denomf;
if (mrb_integer_p(denomv)) {
denomf = (mrb_float)mrb_integer(denomv);
}
else {
- denomf = mrb_to_flo(mrb, denomv);
+ denomf = mrb_as_float(mrb, denomv);
}
return rational_new_f(mrb, numf/denomf);
}
@@ -278,7 +277,7 @@ rational_s_new(mrb_state *mrb, mrb_value self)
#ifndef MRB_NO_FLOAT
static mrb_float
-rat_to_flo(struct mrb_rational *p)
+rat_float(struct mrb_rational *p)
{
mrb_float f;
@@ -296,7 +295,7 @@ static mrb_value
rational_to_f(mrb_state *mrb, mrb_value self)
{
struct mrb_rational *p = rational_ptr(mrb, self);
- return mrb_float_value(mrb, rat_to_flo(p));
+ return mrb_float_value(mrb, rat_float(p));
}
#endif
@@ -346,8 +345,8 @@ rational_m(mrb_state *mrb, mrb_value self)
return rational_new_i(mrb, mrb_integer(a), mrb_integer(b));
}
else {
- mrb_float x = mrb_to_flo(mrb, a);
- mrb_float y = mrb_to_flo(mrb, b);
+ mrb_float x = mrb_as_float(mrb, a);
+ mrb_float y = mrb_as_float(mrb, b);
return rational_new_f(mrb, x/y);
}
#endif
@@ -436,7 +435,7 @@ rational_cmp(mrb_state *mrb, mrb_value x)
#ifndef MRB_NO_FLOAT
case MRB_TT_FLOAT:
{
- mrb_float a = rat_to_flo(p1), b = mrb_to_flo(mrb, y);
+ mrb_float a = rat_float(p1), b = mrb_as_float(mrb, y);
if (a > b)
return mrb_fixnum_value(1);
else if (a < b)
@@ -458,7 +457,7 @@ rational_cmp(mrb_state *mrb, mrb_value x)
#endif
#ifdef MRB_USE_COMPLEX
case MRB_TT_COMPLEX:
- x = mrb_complex_new(mrb, rat_to_flo(p1), 0);
+ x = mrb_complex_new(mrb, rat_float(p1), 0);
return mrb_funcall_id(mrb, x, MRB_OPSYM(cmp), 1, y);
#endif
default:
@@ -480,10 +479,6 @@ rational_minus(mrb_state *mrb, mrb_value x)
return rational_new(mrb, -n, p->denominator);
}
-#ifndef MRB_NO_FLOAT
-mrb_float mrb_div_flo(mrb_float, mrb_float);
-#endif
-
static mrb_value
rational_add(mrb_state *mrb, mrb_value x)
{
@@ -514,7 +509,7 @@ rational_add(mrb_state *mrb, mrb_value x)
case MRB_TT_FLOAT:
{
mrb_float z = p1->numerator + mrb_float(y) * p1->denominator;
- return mrb_float_value(mrb, mrb_div_flo(z, (mrb_float)p1->denominator));
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
}
#endif
@@ -551,7 +546,7 @@ rational_sub(mrb_state *mrb, mrb_value x)
#if defined(MRB_USE_COMPLEX)
case MRB_TT_COMPLEX:
- x = mrb_complex_new(mrb, rat_to_flo(p1), 0);
+ x = mrb_complex_new(mrb, rat_float(p1), 0);
return mrb_funcall_id(mrb, x, MRB_OPSYM(sub), 1, y);
#endif
@@ -559,8 +554,8 @@ rational_sub(mrb_state *mrb, mrb_value x)
case MRB_TT_FLOAT:
default:
{
- mrb_float z = p1->numerator - mrb_to_flo(mrb, y) * p1->denominator;
- return mrb_float_value(mrb, mrb_div_flo(z, (mrb_float)p1->denominator));
+ mrb_float z = p1->numerator - mrb_as_float(mrb, y) * p1->denominator;
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
}
#else
default:
@@ -596,7 +591,7 @@ rational_mul(mrb_state *mrb, mrb_value x)
case MRB_TT_FLOAT:
{
mrb_float z = p1->numerator * mrb_float(y);
- return mrb_float_value(mrb, mrb_div_flo(z, (mrb_float)p1->denominator));
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
}
#endif
@@ -630,7 +625,7 @@ mrb_rational_div(mrb_state *mrb, mrb_value x)
#if defined(MRB_USE_COMPLEX)
case MRB_TT_COMPLEX:
- x = mrb_complex_new(mrb, rat_to_flo(p1), 0);
+ x = mrb_complex_new(mrb, rat_float(p1), 0);
return mrb_funcall_id(mrb, x, MRB_OPSYM(div), 1, y);
#endif
@@ -638,8 +633,8 @@ mrb_rational_div(mrb_state *mrb, mrb_value x)
#ifndef MRB_NO_FLOAT
case MRB_TT_FLOAT:
{
- mrb_float z = mrb_div_flo((mrb_float)p1->numerator, mrb_to_flo(mrb, y));
- return mrb_float_value(mrb, mrb_div_flo(z, (mrb_float)p1->denominator));
+ mrb_float z = mrb_div_float((mrb_float)p1->numerator, mrb_as_float(mrb, y));
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
}
#else
mrb_raise(mrb, E_TYPE_ERROR, "non integer division");
@@ -656,7 +651,7 @@ mrb_int mrb_div_int(mrb_state *, mrb_int, mrb_int);
* redefine Integer#/
*/
static mrb_value
-rat_int_div(mrb_state *mrb, mrb_value x)
+rational_int_div(mrb_state *mrb, mrb_value x)
{
mrb_value y = mrb_get_arg1(mrb);
mrb_int a = mrb_integer(x);
@@ -673,7 +668,7 @@ rat_int_div(mrb_state *mrb, mrb_value x)
case MRB_TT_FLOAT:
mrb_raise(mrb, E_TYPE_ERROR, "non integer multiplication");
#else
- return mrb_float_value(mrb, mrb_div_flo((mrb_float)a, mrb_to_flo(mrb, y)));
+ return mrb_float_value(mrb, mrb_div_float((mrb_float)a, mrb_as_float(mrb, y)));
#endif
}
}
@@ -684,7 +679,7 @@ rat_int_div(mrb_state *mrb, mrb_value x)
*/
static mrb_value
-rat_int_quo(mrb_state *mrb, mrb_value x)
+rational_int_quo(mrb_state *mrb, mrb_value x)
{
mrb_value y = mrb_get_arg1(mrb);
mrb_int a = mrb_integer(x);
@@ -700,7 +695,7 @@ rat_int_quo(mrb_state *mrb, mrb_value x)
#ifdef MRB_NO_FLOAT
mrb_raise(mrb, E_TYPE_ERROR, "non integer multiplication");
#else
- return mrb_float_value(mrb, mrb_div_flo((mrb_float)a, mrb_to_flo(mrb, y)));
+ return mrb_float_value(mrb, mrb_div_float((mrb_float)a, mrb_as_float(mrb, y)));
#endif
}
}
@@ -732,8 +727,8 @@ void mrb_mruby_rational_gem_init(mrb_state *mrb)
mrb_define_method(mrb, rat, "quo", rational_div, MRB_ARGS_REQ(1));
mrb_define_method(mrb, mrb->integer_class, "to_r", fix_to_r, MRB_ARGS_NONE());
#ifndef MRB_USE_COMPLEX
- mrb_define_method(mrb, mrb->integer_class, "/", rat_int_div, MRB_ARGS_REQ(1)); /* overrride */
- mrb_define_method(mrb, mrb->integer_class, "quo", rat_int_quo, MRB_ARGS_REQ(1)); /* overrride */
+ mrb_define_method(mrb, mrb->integer_class, "/", rational_int_div, MRB_ARGS_REQ(1)); /* override */
+ mrb_define_method(mrb, mrb->integer_class, "quo", rational_int_quo, MRB_ARGS_REQ(1)); /* override */
#endif
mrb_define_method(mrb, mrb->kernel_module, "Rational", rational_m, MRB_ARGS_ARG(1,1));
}
diff --git a/mrbgems/mruby-sleep/mrbgem.rake b/mrbgems/mruby-sleep/mrbgem.rake
index 7a303b81c..024106a48 100644
--- a/mrbgems/mruby-sleep/mrbgem.rake
+++ b/mrbgems/mruby-sleep/mrbgem.rake
@@ -1,5 +1,5 @@
MRuby::Gem::Specification.new('mruby-sleep') do |spec|
spec.license = 'MIT'
spec.authors = ['MATSUMOTO Ryosuke', 'mruby developers']
- spec.version = '0.0.1'
+ spec.summary = 'Kernel#sleep and Kernel#usleep'
end
diff --git a/mrbgems/mruby-socket/README.md b/mrbgems/mruby-socket/README.md
index b727dc982..8084cdb70 100644
--- a/mrbgems/mruby-socket/README.md
+++ b/mrbgems/mruby-socket/README.md
@@ -1,5 +1,4 @@
-mruby-socket
-============
+# mruby-socket
"mruby-socket" mrbgem provides BSD socket interface for mruby.
API is compatible with CRuby's "socket" library.
diff --git a/mrbgems/mruby-socket/src/socket.c b/mrbgems/mruby-socket/src/socket.c
index 28418fa12..027404459 100644
--- a/mrbgems/mruby-socket/src/socket.c
+++ b/mrbgems/mruby-socket/src/socket.c
@@ -31,7 +31,6 @@
typedef size_t fsize_t;
#endif
-#include <stddef.h>
#include <string.h>
#include "mruby.h"
@@ -65,52 +64,52 @@
#ifdef _WIN32
static const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
{
- if (af == AF_INET)
- {
- struct sockaddr_in in;
- memset(&in, 0, sizeof(in));
- in.sin_family = AF_INET;
- memcpy(&in.sin_addr, src, sizeof(struct in_addr));
- getnameinfo((struct sockaddr *)&in, sizeof(struct
- sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
- return dst;
- }
- else if (af == AF_INET6)
- {
- struct sockaddr_in6 in;
- memset(&in, 0, sizeof(in));
- in.sin6_family = AF_INET6;
- memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
- getnameinfo((struct sockaddr *)&in, sizeof(struct
- sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
- return dst;
- }
- return NULL;
+ if (af == AF_INET)
+ {
+ struct sockaddr_in in = {0};
+
+ in.sin_family = AF_INET;
+ memcpy(&in.sin_addr, src, sizeof(struct in_addr));
+ getnameinfo((struct sockaddr *)&in, sizeof(struct
+ sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
+ return dst;
+ }
+ else if (af == AF_INET6)
+ {
+ struct sockaddr_in6 in = {0};
+
+ in.sin6_family = AF_INET6;
+ memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
+ getnameinfo((struct sockaddr *)&in, sizeof(struct
+ sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
+ return dst;
+ }
+ return NULL;
}
static int inet_pton(int af, const char *src, void *dst)
{
- struct addrinfo hints, *res, *ressave;
+ struct addrinfo hints = {0};
+ struct addrinfo *res, *ressave;
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = af;
+ hints.ai_family = af;
- if (getaddrinfo(src, NULL, &hints, &res) != 0)
- {
- printf("Couldn't resolve host %s\n", src);
- return -1;
- }
+ if (getaddrinfo(src, NULL, &hints, &res) != 0)
+ {
+ printf("Couldn't resolve host %s\n", src);
+ return -1;
+ }
- ressave = res;
+ ressave = res;
- while (res)
- {
- memcpy(dst, res->ai_addr, res->ai_addrlen);
- res = res->ai_next;
- }
+ while (res)
+ {
+ memcpy(dst, res->ai_addr, res->ai_addrlen);
+ res = res->ai_next;
+ }
- freeaddrinfo(ressave);
- return 0;
+ freeaddrinfo(ressave);
+ return 0;
}
#endif
@@ -118,7 +117,7 @@ static int inet_pton(int af, const char *src, void *dst)
static mrb_value
mrb_addrinfo_getaddrinfo(mrb_state *mrb, mrb_value klass)
{
- struct addrinfo hints, *res0, *res;
+ struct addrinfo hints = {0}, *res0, *res;
mrb_value ai, ary, family, lastai, nodename, protocol, sa, service, socktype;
mrb_int flags;
int arena_idx, error;
@@ -142,14 +141,13 @@ mrb_addrinfo_getaddrinfo(mrb_state *mrb, mrb_value klass)
if (mrb_string_p(service)) {
servname = RSTRING_CSTR(mrb, service);
} else if (mrb_integer_p(service)) {
- servname = RSTRING_PTR(mrb_fixnum_to_str(mrb, service, 10));
+ servname = RSTRING_PTR(mrb_integer_to_str(mrb, service, 10));
} else if (mrb_nil_p(service)) {
servname = NULL;
} else {
mrb_raise(mrb, E_TYPE_ERROR, "service must be String, Integer, or nil");
}
- memset(&hints, 0, sizeof(hints));
hints.ai_flags = (int)flags;
if (mrb_integer_p(family)) {
@@ -574,7 +572,7 @@ mrb_ipsocket_recvfrom(mrb_state *mrb, mrb_value self)
buf = mrb_str_new_capa(mrb, maxlen);
socklen = sizeof(ss);
n = recvfrom(fd, RSTRING_PTR(buf), (fsize_t)maxlen, (int)flags,
- (struct sockaddr *)&ss, &socklen);
+ (struct sockaddr *)&ss, &socklen);
if (n == -1) {
mrb_sys_fail(mrb, "recvfrom");
}
@@ -938,8 +936,8 @@ mrb_mruby_socket_gem_init(mrb_state* mrb)
constants = mrb_define_module_under(mrb, sock, "Constants");
#define define_const(SYM) \
- do { \
- mrb_define_const(mrb, constants, #SYM, mrb_int_value(mrb, SYM)); \
+ do { \
+ mrb_define_const(mrb, constants, #SYM, mrb_int_value(mrb, SYM)); \
} while (0)
#include "const.cstub"
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c
index 839ee4dc4..8de3a4541 100644
--- a/mrbgems/mruby-sprintf/src/sprintf.c
+++ b/mrbgems/mruby-sprintf/src/sprintf.c
@@ -5,15 +5,11 @@
*/
#include <mruby.h>
-#include <limits.h>
-#include <string.h>
#include <mruby/string.h>
#include <mruby/hash.h>
#include <mruby/numeric.h>
#include <mruby/presym.h>
-#ifndef MRB_NO_FLOAT
-#include <math.h>
-#endif
+#include <string.h>
#include <ctype.h>
#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */
@@ -21,9 +17,6 @@
#define EXTENDSIGN(n, l) (((~0U << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0U << (n)))
mrb_value mrb_str_format(mrb_state *, mrb_int, const mrb_value *, mrb_value);
-#ifndef MRB_NO_FLOAT
-static void fmt_setup(char*,size_t,int,int,mrb_int,mrb_int);
-#endif
static char*
remove_sign_bits(char *str, int base)
@@ -71,35 +64,24 @@ sign_bits(int base, const char *p)
return c;
}
-static mrb_value
-mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
+static char *
+mrb_uint_to_cstr(char *buf, size_t len, mrb_int num, int base)
{
- char buf[66], *b = buf + sizeof buf;
- mrb_int num = mrb_integer(x);
- const int mask = base -1;
+ char *b = buf + len - 1;
+ const int mask = base-1;
int shift;
-#ifdef MRB_INT64
- uint64_t val = (uint64_t)num;
-#else
- uint32_t val = (uint32_t)num;
-#endif
+ mrb_uint val = (uint64_t)num;
char d;
- switch (base) {
- case 2:
- shift = 1;
- break;
- case 8:
- shift = 3;
- break;
- case 16:
- shift = 4;
- break;
- default:
- mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base);
- }
if (num == 0) {
- return mrb_str_new_lit(mrb, "0");
+ buf[0] = '0'; buf[1] = '\0';
+ return buf;
+ }
+ switch (base) {
+ case 16: d = 'f'; shift = 4; break;
+ case 8: d = '7'; shift = 3; break;
+ case 2: d = '1'; shift = 1; break;
+ default: return NULL;
}
*--b = '\0';
do {
@@ -108,19 +90,12 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
if (num < 0) {
b = remove_sign_bits(b, base);
- switch (base) {
- case 16: d = 'f'; break;
- case 8: d = '7'; break;
- case 2: d = '1'; break;
- default: d = 0; break;
- }
-
if (d && *b != d) {
*--b = d;
}
}
- return mrb_str_new_cstr(mrb, b);
+ return b;
}
#define FNONE 0
@@ -133,7 +108,52 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
#define FPREC 64
#define FPREC0 128
-#define CHECK(l) do {\
+#ifndef MRB_NO_FLOAT
+static int
+fmt_float(char *buf, size_t buf_size, char fmt, int flags, mrb_int width, int prec, mrb_float f)
+{
+ char sign = '\0';
+ int left_align = 0;
+ int zero_pad = 0;
+
+ if (flags & FSHARP) fmt |= 0x80;
+ if (flags & FPLUS) sign = '+';
+ if (flags & FMINUS) left_align = 1;
+ if (flags & FZERO) zero_pad = 1;
+ if (flags & FSPACE) sign = ' ';
+
+ int len = mrb_format_float(f, buf, buf_size, fmt, prec, sign);
+
+ // buf[0] < '0' returns true if the first character is space, + or -
+ // buf[1] < '9' matches a digit, and doesn't match when we get back +nan or +inf
+ if (buf[0] < '0' && buf[1] <= '9' && zero_pad) {
+ buf++;
+ width--;
+ len--;
+ }
+ if (*buf < '0' || *buf >= '9') {
+ // For inf or nan, we don't want to zero pad.
+ zero_pad = 0;
+ }
+ if (len >= width) {
+ return len;
+ }
+ buf[width] = '\0';
+ if (left_align) {
+ memset(&buf[len], ' ', width - len);
+ return width;
+ }
+ memmove(&buf[width - len], buf, len);
+ if (zero_pad) {
+ memset(buf, '0', width - len);
+ } else {
+ memset(buf, ' ', width - len);
+ }
+ return width;
+}
+#endif
+
+#define CHECK(l) do { \
while ((l) >= bsiz - blen) {\
if (bsiz > MRB_INT_MAX/2) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \
bsiz*=2;\
@@ -221,7 +241,6 @@ check_name_arg(mrb_state *mrb, int posarg, const char *name, size_t len)
#define GETASTER(num) do { \
mrb_value tmp_v; \
t = p++; \
- n = 0; \
GETNUM(n, val); \
if (*p == '$') { \
tmp_v = GETPOSARG(n); \
@@ -230,27 +249,17 @@ check_name_arg(mrb_state *mrb, int posarg, const char *name, size_t len)
tmp_v = GETNEXTARG(); \
p = t; \
} \
- num = mrb_int(mrb, tmp_v); \
+ num = mrb_as_int(mrb, tmp_v); \
} while (0)
static const char *
-get_num(mrb_state *mrb, const char *p, const char *end, mrb_int *valp)
+get_num(mrb_state *mrb, const char *p, const char *end, int *valp)
{
- mrb_int next_n = *valp;
- for (; p < end && ISDIGIT(*p); p++) {
- if (mrb_int_mul_overflow(10, next_n, &next_n)) {
- return NULL;
- }
- if (MRB_INT_MAX - (*p - '0') < next_n) {
- return NULL;
- }
- next_n += *p - '0';
- }
- if (p >= end) {
- mrb_raise(mrb, E_ARGUMENT_ERROR, "malformed format string - %%*[0-9]");
- }
- *valp = next_n;
- return p;
+ char *e;
+ mrb_int n = mrb_int_read(p, end, &e);
+ if (e == NULL || n > INT_MAX) return NULL;
+ *valp = (int)n;
+ return e;
}
static void
@@ -326,10 +335,6 @@ get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv)
* | equal to the precision, or in dd.dddd form otherwise.
* | The precision specifies the number of significant digits.
* G | Equivalent to 'g', but use an uppercase 'E' in exponent form.
- * a | Convert floating-point argument as [-]0xh.hhhhp[+-]dd,
- * | which is consisted from optional sign, "0x", fraction part
- * | as hexadecimal, "p", and exponential part as decimal.
- * A | Equivalent to 'a', but use uppercase 'X' and 'P'.
*
* Field | Other Format
* ------+--------------------------------------------------------------
@@ -364,7 +369,7 @@ get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv)
* | | For the conversions 'x', 'X', 'b' and 'B'
* | | on non-zero, prefix the result with "0x",
* | | "0X", "0b" and "0B", respectively.
- * | | For 'a', 'A', 'e', 'E', 'f', 'g', and 'G',
+ * | | For 'e', 'E', 'f', 'g', and 'G',
* | | force a decimal point to be added,
* | | even if no digits follow.
* | | For 'g' and 'G', do not remove trailing zeros.
@@ -547,50 +552,6 @@ mrb_f_sprintf(mrb_state *mrb, mrb_value obj)
}
}
-static int
-mrb_int2str(char *buf, size_t len, mrb_int n)
-{
-#ifdef MRB_NO_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_NO_STDIO */
-}
-
mrb_value
mrb_str_format(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value fmt)
{
@@ -599,9 +560,9 @@ mrb_str_format(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value fm
mrb_int blen;
mrb_int bsiz;
mrb_value result;
- mrb_int n;
- mrb_int width;
- mrb_int prec;
+ int n;
+ int width;
+ int prec;
int nextarg = 1;
int posarg = 0;
mrb_value nextvalue;
@@ -625,7 +586,7 @@ mrb_str_format(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value fm
++argc;
--argv;
- mrb_to_str(mrb, fmt);
+ mrb_ensure_string_type(mrb, fmt);
p = RSTRING_PTR(fmt);
end = p + RSTRING_LEN(fmt);
blen = 0;
@@ -688,7 +649,6 @@ retry:
case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
- n = 0;
GETNUM(n, width);
if (*p == '$') {
if (!mrb_undef_p(nextvalue)) {
@@ -732,6 +692,9 @@ retry:
CHECK_FOR_WIDTH(flags);
flags |= FWIDTH;
GETASTER(width);
+ if (width > INT16_MAX || INT16_MIN > width) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "width too big");
+ }
if (width < 0) {
flags |= FMINUS;
width = -width;
@@ -745,7 +708,6 @@ retry:
}
flags |= FPREC|FPREC0;
- prec = 0;
p++;
if (*p == '*') {
GETASTER(prec);
@@ -755,7 +717,6 @@ retry:
p++;
goto retry;
}
-
GETNUM(prec, precision);
goto retry;
@@ -898,19 +859,18 @@ retry:
switch (mrb_type(val)) {
#ifndef MRB_NO_FLOAT
case MRB_TT_FLOAT:
- val = mrb_flo_to_fixnum(mrb, val);
- if (mrb_integer_p(val)) goto bin_retry;
- break;
+ val = mrb_float_to_integer(mrb, val);
+ goto bin_retry;
#endif
case MRB_TT_STRING:
- val = mrb_str_to_inum(mrb, val, 0, TRUE);
+ val = mrb_str_to_integer(mrb, val, 0, TRUE);
goto bin_retry;
case MRB_TT_INTEGER:
v = mrb_integer(val);
break;
default:
- val = mrb_Integer(mrb, val);
- goto bin_retry;
+ v = mrb_as_int(mrb, val);
+ break;
}
switch (*p) {
@@ -946,21 +906,15 @@ retry:
sc = '-';
width--;
}
- mrb_assert(base == 10);
- mrb_int2str(nbuf, sizeof(nbuf)-1, v);
- s = nbuf;
+ s = mrb_int_to_cstr(nbuf, sizeof(nbuf), v, base);
if (v < 0) s++; /* skip minus sign */
}
else {
- s = nbuf;
+ /* print as unsigned */
+ s = mrb_uint_to_cstr(nbuf, sizeof(nbuf), v, base);
if (v < 0) {
dots = 1;
- val = mrb_fix2binstr(mrb, mrb_int_value(mrb, v), base);
}
- else {
- val = mrb_fixnum_to_str(mrb, mrb_int_value(mrb, v), base);
- }
- strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-2);
}
{
size_t size;
@@ -1053,15 +1007,12 @@ retry:
case 'g':
case 'G':
case 'e':
- case 'E':
- case 'a':
- case 'A': {
+ case 'E': {
mrb_value val = GETARG();
double fval;
mrb_int need = 6;
- char fbuf[64];
- fval = mrb_float(mrb_Float(mrb, val));
+ fval = mrb_as_float(mrb, val);
if (!isfinite(fval)) {
const char *expr;
const mrb_int elen = 3;
@@ -1108,7 +1059,7 @@ retry:
need = BIT_DIGITS(i);
}
if (need > MRB_INT_MAX - ((flags&FPREC) ? prec : 6)) {
- too_big_width:
+ too_big_width_prec:
mrb_raise(mrb, E_ARGUMENT_ERROR,
(width > prec ? "width too big" : "prec too big"));
}
@@ -1116,13 +1067,12 @@ retry:
if ((flags&FWIDTH) && need < width)
need = width;
if (need > MRB_INT_MAX - 20) {
- goto too_big_width;
+ goto too_big_width_prec;
}
need += 20;
CHECK(need);
- fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec);
- n = mrb_float_to_cstr(mrb, &buf[blen], need, fbuf, fval);
+ n = fmt_float(&buf[blen], need, *p, flags, width, prec, fval);
if (n < 0 || n >= need) {
mrb_raise(mrb, E_RUNTIME_ERROR, "formatting error");
}
@@ -1149,35 +1099,6 @@ retry:
return result;
}
-#ifndef MRB_NO_FLOAT
-static void
-fmt_setup(char *buf, size_t size, int c, int flags, mrb_int width, mrb_int prec)
-{
- char *end = buf + size;
- int n;
-
- *buf++ = '%';
- if (flags & FSHARP) *buf++ = '#';
- if (flags & FPLUS) *buf++ = '+';
- if (flags & FMINUS) *buf++ = '-';
- if (flags & FZERO) *buf++ = '0';
- if (flags & FSPACE) *buf++ = ' ';
-
- if (flags & FWIDTH) {
- n = mrb_int2str(buf, end - buf, width);
- buf += n;
- }
-
- if (flags & FPREC) {
- *buf ++ = '.';
- n = mrb_int2str(buf, end - buf, prec);
- buf += n;
- }
-
- *buf++ = c;
- *buf = '\0';
-}
-#endif
void
mrb_mruby_sprintf_gem_init(mrb_state *mrb)
diff --git a/mrbgems/mruby-sprintf/test/sprintf.rb b/mrbgems/mruby-sprintf/test/sprintf.rb
index 0a8166bae..aedc2787a 100644
--- a/mrbgems/mruby-sprintf/test/sprintf.rb
+++ b/mrbgems/mruby-sprintf/test/sprintf.rb
@@ -10,11 +10,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 " 1234567.12", "% 4.2f" % 1234567.123456789
- assert_equal "1234567.12", "%-4.2f" % 1234567.123456789
- assert_equal "+1234567.12", "%+4.2f" % 1234567.123456789
- assert_equal "1234567.12", "%04.2f" % 1234567.123456789
- assert_equal "00000000001234567.12", "%020.2f" % 1234567.123456789
+ assert_equal " 12345.12", "% 4.2f" % 12345.1234
+ assert_equal "12345.12", "%-4.2f" % 12345.12345
+ assert_equal "+12345.12", "%+4.2f" % 12345.1234
+ assert_equal "12345.12", "%04.2f" % 12345.12345
+ assert_equal "0012345.12", "%010.2f" % 12345.1234
end
assert('String#% with inf') do
diff --git a/mrbgems/mruby-string-ext/mrblib/string.rb b/mrbgems/mruby-string-ext/mrblib/string.rb
index ff113dd95..d485c51ef 100644
--- a/mrbgems/mruby-string-ext/mrblib/string.rb
+++ b/mrbgems/mruby-string-ext/mrblib/string.rb
@@ -111,36 +111,6 @@ class String
(s == self) ? nil : self.replace(s)
end
- ##
- # call-seq:
- # str.casecmp(other_str) -> -1, 0, +1 or nil
- #
- # Case-insensitive version of <code>String#<=></code>.
- #
- # "abcdef".casecmp("abcde") #=> 1
- # "aBcDeF".casecmp("abcdef") #=> 0
- # "abcdef".casecmp("abcdefg") #=> -1
- # "abcdef".casecmp("ABCDEF") #=> 0
- #
- def casecmp(str)
- self.downcase <=> str.__to_str.downcase
- rescue NoMethodError
- nil
- end
-
- ##
- # call-seq:
- # str.casecmp?(other) -> true, false, or nil
- #
- # Returns true if str and other_str are equal after case folding,
- # false if they are not equal, and nil if other_str is not a string.
-
- def casecmp?(str)
- c = self.casecmp(str)
- return nil if c.nil?
- return c == 0
- end
-
def partition(sep)
raise TypeError, "type mismatch: #{sep.class} given" unless sep.is_a? String
n = index(sep)
@@ -344,8 +314,6 @@ class String
end
def codepoints(&block)
- len = self.size
-
if block_given?
self.split('').each do|x|
block.call(x.ord)
@@ -459,14 +427,14 @@ class String
break if exclusive and n == 0
yield bs
break if n == 0
+ bsiz = bs.size
+ break if bsiz > max.size || bsiz == 0
bs = bs.succ
end
self
end
def __upto_endless(&block)
- return to_enum(:__upto_endless) unless block
-
len = self.length
# both edges are all digits
bi = self.to_i(10)
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c
index 09cbf7995..e3dabcc18 100644
--- a/mrbgems/mruby-string-ext/src/string.c
+++ b/mrbgems/mruby-string-ext/src/string.c
@@ -35,7 +35,7 @@ str_casecmp_p(const char *s1, mrb_int len1, const char *s2, mrb_int len2)
static mrb_value
int_chr_binary(mrb_state *mrb, mrb_value num)
{
- mrb_int cp = mrb_int(mrb, num);
+ mrb_int cp = mrb_as_int(mrb, num);
char c;
mrb_value str;
@@ -195,14 +195,14 @@ static mrb_value
mrb_str_start_with(mrb_state *mrb, mrb_value self)
{
const mrb_value *argv;
- mrb_value sub;
mrb_int argc, i;
mrb_get_args(mrb, "*", &argv, &argc);
for (i = 0; i < argc; i++) {
size_t len_l, len_r;
int ai = mrb_gc_arena_save(mrb);
- sub = mrb_ensure_string_type(mrb, argv[i]);
+ mrb_value sub = argv[i];
+ mrb_ensure_string_type(mrb, sub);
mrb_gc_arena_restore(mrb, ai);
len_l = RSTRING_LEN(self);
len_r = RSTRING_LEN(sub);
@@ -225,14 +225,14 @@ static mrb_value
mrb_str_end_with(mrb_state *mrb, mrb_value self)
{
const mrb_value *argv;
- mrb_value sub;
mrb_int argc, i;
mrb_get_args(mrb, "*", &argv, &argc);
for (i = 0; i < argc; i++) {
size_t len_l, len_r;
int ai = mrb_gc_arena_save(mrb);
- sub = mrb_ensure_string_type(mrb, argv[i]);
+ mrb_value sub = argv[i];
+ mrb_ensure_string_type(mrb, sub);
mrb_gc_arena_restore(mrb, ai);
len_l = RSTRING_LEN(self);
len_r = RSTRING_LEN(sub);
@@ -262,7 +262,7 @@ enum tr_pattern_type {
<range> ::= <ch> '-' <ch>
*/
struct tr_pattern {
- uint8_t type; // 1:in-order, 2:range
+ uint8_t type; // 1:in-order, 2:range
mrb_bool flag_reverse : 1;
mrb_bool flag_on_heap : 1;
uint16_t n;
@@ -329,9 +329,9 @@ tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_patte
mrb_int len;
while (i < pattern_length) {
- if ((i+2) < pattern_length && pattern[i] != '\\' && pattern[i+1] == '-')
+ if ((i+2) < pattern_length && pattern[i] != '\\' && pattern[i+1] == '-')
break;
- i++;
+ i++;
}
len = i - start_pos;
@@ -375,7 +375,7 @@ tr_find_character(const struct tr_pattern *pat, const char *pat_str, int ch)
if (pat->type == TR_IN_ORDER) {
int i;
for (i = 0; i < pat->n; i++) {
- if (pat_str[pat->val.start_pos + i] == ch) ret = n_sum + i;
+ if (pat_str[pat->val.start_pos + i] == ch) ret = n_sum + i;
}
}
else if (pat->type == TR_RANGE) {
@@ -509,7 +509,7 @@ str_tr(mrb_state *mrb, mrb_value str, mrb_value p1, mrb_value p2, mrb_bool squee
if (n >= 0) {
flag_changed = TRUE;
if (rep == NULL) {
- j--;
+ j--;
}
else {
mrb_int c = tr_get_character(rep, RSTRING_PTR(p2), n);
@@ -521,8 +521,8 @@ str_tr(mrb_state *mrb, mrb_value str, mrb_value p1, mrb_value p2, mrb_bool squee
if (c > 0x80) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "character (%i) out of range", c);
}
- lastch = c;
- s[i] = (char)c;
+ lastch = c;
+ s[i] = (char)c;
}
}
}
@@ -835,13 +835,13 @@ mrb_str_count(mrb_state *mrb, mrb_value str)
static mrb_value
mrb_str_hex(mrb_state *mrb, mrb_value self)
{
- return mrb_str_to_inum(mrb, self, 16, FALSE);
+ return mrb_str_to_integer(mrb, self, 16, FALSE);
}
static mrb_value
mrb_str_oct(mrb_state *mrb, mrb_value self)
{
- return mrb_str_to_inum(mrb, self, 8, FALSE);
+ return mrb_str_to_integer(mrb, self, 8, FALSE);
}
/*
@@ -1174,6 +1174,60 @@ mrb_str_del_suffix(mrb_state *mrb, mrb_value self)
return mrb_str_substr(mrb, self, 0, slen-plen);
}
+#define lesser(a,b) (((a)>(b))?(b):(a))
+
+/*
+ * call-seq:
+ * str.casecmp(other_str) -> -1, 0, +1 or nil
+ *
+ * Case-insensitive version of <code>String#<=></code>.
+ *
+ * "abcdef".casecmp("abcde") #=> 1
+ * "aBcDeF".casecmp("abcdef") #=> 0
+ * "abcdef".casecmp("abcdefg") #=> -1
+ * "abcdef".casecmp("ABCDEF") #=> 0
+ */
+static mrb_value
+mrb_str_casecmp(mrb_state *mrb, mrb_value self)
+{
+ mrb_value str;
+
+ mrb_get_args(mrb, "o", &str);
+ if (!mrb_string_p(str)) return mrb_nil_value();
+
+ struct RString *s1 = mrb_str_ptr(self);
+ struct RString *s2 = mrb_str_ptr(str);
+ mrb_int len = lesser(RSTR_LEN(s1), RSTR_LEN(s2));
+ char *p1 = RSTR_PTR(s1);
+ char *p2 = RSTR_PTR(s2);
+
+ for (mrb_int i=0; i<len; i++) {
+ int c1 = p1[i], c2 = p2[i];
+ if (ISASCII(c1) && ISUPPER(c1)) c1 = TOLOWER(c1);
+ if (ISASCII(c2) && ISUPPER(c2)) c2 = TOLOWER(c2);
+ if (c1 > c2) return mrb_fixnum_value(1);
+ if (c1 < c2) return mrb_fixnum_value(-1);
+ }
+ if (RSTR_LEN(s1) == RSTR_LEN(s2)) return mrb_fixnum_value(0);
+ if (RSTR_LEN(s1) > RSTR_LEN(s2)) return mrb_fixnum_value(1);
+ return mrb_fixnum_value(-1);
+}
+
+/*
+ * call-seq:
+ * str.casecmp?(other) -> true, false, or nil
+ *
+ * Returns true if str and other_str are equal after case folding,
+ * false if they are not equal, and nil if other is not a string.
+ */
+static mrb_value
+mrb_str_casecmp_p(mrb_state *mrb, mrb_value self)
+{
+ mrb_value c = mrb_str_casecmp(mrb, self);
+ if (mrb_nil_p(c)) return c;
+ return mrb_bool_value(mrb_fixnum(c) == 0);
+}
+
static mrb_value
mrb_str_lines(mrb_state *mrb, mrb_value self)
{
@@ -1184,6 +1238,7 @@ mrb_str_lines(mrb_state *mrb, mrb_value self)
char *p = b, *t;
char *e = b + RSTRING_LEN(self);
+ mrb->c->ci->mid = 0;
result = mrb_ary_new(mrb);
ai = mrb_gc_arena_save(mrb);
while (p < e) {
@@ -1230,6 +1285,8 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb)
mrb_define_method(mrb, s, "delete_prefix", mrb_str_del_prefix, MRB_ARGS_REQ(1));
mrb_define_method(mrb, s, "delete_suffix!", mrb_str_del_suffix_bang, MRB_ARGS_REQ(1));
mrb_define_method(mrb, s, "delete_suffix", mrb_str_del_suffix, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, s, "casecmp", mrb_str_casecmp, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, s, "casecmp?", mrb_str_casecmp_p, MRB_ARGS_REQ(1));
mrb_define_method(mrb, s, "__lines", mrb_str_lines, MRB_ARGS_NONE());
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index 54afefd74..2d864bdaf 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -18,6 +18,8 @@
#define RSTRUCT_LEN(st) RARRAY_LEN(st)
#define RSTRUCT_PTR(st) RARRAY_PTR(st)
+#define mrb_struct_p(o) (mrb_type(o) == MRB_TT_STRUCT)
+
static struct RClass *
struct_class(mrb_state *mrb)
{
@@ -58,18 +60,13 @@ static mrb_value
struct_members(mrb_state *mrb, mrb_value s)
{
mrb_value members = struct_s_members(mrb, mrb_obj_class(mrb, s));
- if (!mrb_array_p(s)) {
+ if (!mrb_struct_p(s) || RSTRUCT_LEN(s) == 0) {
mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
}
if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) {
- if (RSTRUCT_LEN(s) == 0) { /* probably uninitialized */
- mrb_ary_resize(mrb, s, RARRAY_LEN(members));
- }
- else {
- mrb_raisef(mrb, E_TYPE_ERROR,
- "struct size differs (%i required %i given)",
- RARRAY_LEN(members), RSTRUCT_LEN(s));
- }
+ mrb_raisef(mrb, E_TYPE_ERROR,
+ "struct size differs (%i required %i given)",
+ RARRAY_LEN(members), RSTRUCT_LEN(s));
}
return members;
}
@@ -202,7 +199,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass *kl
}
else {
/* old style: should we warn? */
- mrb_to_str(mrb, name);
+ mrb_ensure_string_type(mrb, name);
id = mrb_obj_to_sym(mrb, name);
if (!mrb_const_name_p(mrb, RSTRING_PTR(name), RSTRING_LEN(name))) {
mrb_name_error(mrb, id, "identifier %v needs to be constant", name);
@@ -213,7 +210,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass *kl
}
c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass);
}
- MRB_SET_INSTANCE_TT(c, MRB_TT_ARRAY);
+ MRB_SET_INSTANCE_TT(c, MRB_TT_STRUCT);
nstr = mrb_obj_value(c);
mrb_iv_set(mrb, nstr, MRB_SYM(__members__), members);
@@ -362,7 +359,7 @@ mrb_struct_init_copy(mrb_state *mrb, mrb_value copy)
if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) {
mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
}
- if (!mrb_array_p(s)) {
+ if (!mrb_struct_p(s)) {
mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
}
mrb_ary_replace(mrb, copy, s);
@@ -435,7 +432,7 @@ mrb_struct_aref(mrb_state *mrb, mrb_value s)
if (mrb_symbol_p(idx)) {
return struct_aref_sym(mrb, s, mrb_symbol(idx));
}
- return struct_aref_int(mrb, s, mrb_int(mrb, idx));
+ return struct_aref_int(mrb, s, mrb_as_int(mrb, idx));
}
static mrb_value
@@ -499,7 +496,7 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s)
return mrb_struct_aset_sym(mrb, s, mrb_symbol(idx), val);
}
- i = mrb_int(mrb, idx);
+ i = mrb_as_int(mrb, idx);
if (i < 0) i = RSTRUCT_LEN(s) + i;
if (i < 0) {
mrb_raisef(mrb, E_INDEX_ERROR,
diff --git a/mrbgems/mruby-test-inline-struct/test/inline.c b/mrbgems/mruby-test-inline-struct/test/inline.c
index 7a91f5ec3..7537bffc6 100644
--- a/mrbgems/mruby-test-inline-struct/test/inline.c
+++ b/mrbgems/mruby-test-inline-struct/test/inline.c
@@ -57,7 +57,8 @@ static mrb_value
istruct_test_test_receive_direct(mrb_state *mrb, mrb_value self)
{
char *ptr;
- mrb_get_args(mrb, "I", &ptr);
+ struct RClass *klass = mrb_class_get(mrb, "InlineStructTest");
+ mrb_get_args(mrb, "I", &ptr, klass);
return mrb_bool_value(ptr[0] == 's');
}
diff --git a/mrbgems/mruby-test/driver.c b/mrbgems/mruby-test/driver.c
index 958e87dd1..21e272536 100644
--- a/mrbgems/mruby-test/driver.c
+++ b/mrbgems/mruby-test/driver.c
@@ -220,14 +220,14 @@ mrb_init_test_driver(mrb_state *mrb, mrb_bool verbose)
mrbtest = mrb_define_module(mrb, "Mrbtest");
- mrb_define_const(mrb, mrbtest, "FIXNUM_MAX", mrb_fixnum_value(MRB_INT_MAX));
- mrb_define_const(mrb, mrbtest, "FIXNUM_MIN", mrb_fixnum_value(MRB_INT_MIN));
- mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT));
-
#ifndef MRB_NO_FLOAT
#ifdef MRB_USE_FLOAT32
+#ifdef MRB_WORDBOX_NO_FLOAT_TRUNCATE
mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-5));
#else
+ mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-4));
+#endif
+#else
mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-10));
#endif
#endif
diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c
index 2a5e9dd6b..6b9762acf 100644
--- a/mrbgems/mruby-time/src/time.c
+++ b/mrbgems/mruby-time/src/time.c
@@ -4,10 +4,6 @@
** See Copyright Notice in mruby.h
*/
-#ifndef MRB_NO_FLOAT
-#include <math.h>
-#endif
-
#include <mruby.h>
#include <mruby/class.h>
#include <mruby/data.h>
@@ -20,6 +16,7 @@
#include <string.h>
#endif
+
#include <stdlib.h>
#ifndef _WIN32
#include <unistd.h>
@@ -85,8 +82,12 @@ double round(double x) {
/** end of Time class configuration */
-#ifndef NO_GETTIMEOFDAY
-# ifdef _WIN32
+#if (defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0) && defined(CLOCK_REALTIME)
+# define USE_CLOCK_GETTIME
+#endif
+
+#if !defined(NO_GETTIMEOFDAY)
+# if defined(_WIN32) && !defined(USE_CLOCK_GETTIME)
# define WIN32_LEAN_AND_MEAN /* don't include winsock.h */
# include <windows.h>
# define gettimeofday my_gettimeofday
@@ -177,17 +178,6 @@ timegm(struct tm *tm)
* second level. Also, there are only 2 timezones, namely UTC and LOCAL.
*/
-typedef struct mrb_timezone_name {
- const char name[8];
- size_t len;
-} mrb_timezone_name;
-
-static const mrb_timezone_name timezone_names[] = {
- { "none", sizeof("none") - 1 },
- { "UTC", sizeof("UTC") - 1 },
- { "LOCAL", sizeof("LOCAL") - 1 },
-};
-
#ifndef MRB_NO_STDIO
static const char mon_names[12][4] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
@@ -389,7 +379,7 @@ current_mrb_time(mrb_state *mrb)
sec = ts.tv_sec;
usec = ts.tv_nsec / 1000;
}
-#elif (defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0) && defined(CLOCK_REALTIME)
+#elif defined(USE_CLOCK_GETTIME)
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
@@ -690,19 +680,35 @@ mrb_time_year(mrb_state *mrb, mrb_value self)
return mrb_fixnum_value(tm->datetime.tm_year + 1900);
}
+static size_t
+time_zonename(mrb_state *mrb, struct mrb_time *tm, char *buf, size_t len)
+{
+#if defined(_MSC_VER) && _MSC_VER < 1900 || defined(__MINGW64__) || defined(__MINGW32__)
+ struct tm datetime = {0};
+ time_t utc_sec = timegm(&tm->datetime);
+ int offset = abs((int)(utc_sec - tm->sec) / 60);
+ datetime.tm_year = 100;
+ datetime.tm_hour = offset / 60;
+ datetime.tm_min = offset % 60;
+ buf[0] = utc_sec < tm->sec ? '-' : '+';
+ return strftime(buf+1, len-1, "%H%M", &datetime) + 1;
+#else
+ return strftime(buf, len, "%z", &tm->datetime);
+#endif
+}
+
/* 15.2.19.7.33 */
/* Returns name of time's timezone. */
static mrb_value
mrb_time_zone(mrb_state *mrb, mrb_value self)
{
- struct mrb_time *tm;
-
- tm = time_get_ptr(mrb, self);
- if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value();
- if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value();
- return mrb_str_new_static(mrb,
- timezone_names[tm->timezone].name,
- timezone_names[tm->timezone].len);
+ struct mrb_time *tm = time_get_ptr(mrb, self);
+ if (tm->timezone == MRB_TIMEZONE_UTC) {
+ return mrb_str_new_lit(mrb, "UTC");
+ }
+ char buf[64];
+ size_t len = time_zonename(mrb, tm, buf, sizeof(buf));
+ return mrb_str_new(mrb, buf, len);
}
/* 15.2.19.7.4 */
@@ -886,7 +892,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self)
return mrb_fixnum_value(tm->datetime.tm_min);
}
-/* 15.2.19.7.21 and 15.2.19.7.22 */
+/* 15.2.19.7.21 (mon) and 15.2.19.7.22 (month) */
/* Returns month of time. */
static mrb_value
mrb_time_mon(mrb_state *mrb, mrb_value self)
@@ -938,7 +944,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self)
}
/* 15.2.19.7.26 */
-/* Returns an Integer with the time since the epoch in microseconds. */
+/* Returns the number of microseconds for time. */
static mrb_value
mrb_time_usec(mrb_state *mrb, mrb_value self)
{
@@ -972,44 +978,20 @@ mrb_time_utc_p(mrb_state *mrb, mrb_value self)
return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC);
}
-static size_t
-time_to_s_utc(mrb_state *mrb, struct mrb_time *tm, char *buf, size_t buf_len)
-{
- return strftime(buf, buf_len, TO_S_FMT "UTC", &tm->datetime);
-}
-
-static size_t
-time_to_s_local(mrb_state *mrb, struct mrb_time *tm, char *buf, size_t buf_len)
-{
-#if defined(_MSC_VER) && _MSC_VER < 1900 || defined(__MINGW64__) || defined(__MINGW32__)
- struct tm datetime = {0};
- time_t utc_sec = timegm(&tm->datetime);
- size_t len;
- int offset;
-
- if (utc_sec == (time_t)-1) {
- mrb_raise(mrb, E_ARGUMENT_ERROR, "Not a valid time");
- }
- offset = abs((int)(utc_sec - tm->sec) / 60);
- datetime.tm_year = 100;
- datetime.tm_hour = offset / 60;
- datetime.tm_min = offset % 60;
- len = strftime(buf, buf_len, TO_S_FMT, &tm->datetime);
- buf[len++] = utc_sec < tm->sec ? '-' : '+';
-
- return len + strftime(buf + len, buf_len - len, "%H%M", &datetime);
-#else
- return strftime(buf, buf_len, TO_S_FMT "%z", &tm->datetime);
-#endif
-}
-
static mrb_value
mrb_time_to_s(mrb_state *mrb, mrb_value self)
{
- char buf[64];
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));
+ char buf[64];
+ size_t len;
+
+ if (tm->timezone == MRB_TIMEZONE_UTC) {
+ len = strftime(buf, sizeof(buf), TO_S_FMT "UTC", &tm->datetime);
+ }
+ else {
+ len = strftime(buf, sizeof(buf), TO_S_FMT, &tm->datetime);
+ len += time_zonename(mrb, tm, buf+len, sizeof(buf)-len);
+ }
mrb_value str = mrb_str_new(mrb, buf, len);
RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
return str;
diff --git a/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb b/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb
index 774562398..664008d1c 100644
--- a/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb
+++ b/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb
@@ -1,5 +1,5 @@
-def self.include (*modules)
+def self.include(*modules)
self.class.include(*modules)
end
diff --git a/mrblib/10error.rb b/mrblib/10error.rb
index 054603514..aa9da91bb 100644
--- a/mrblib/10error.rb
+++ b/mrblib/10error.rb
@@ -2,8 +2,8 @@
class ArgumentError < StandardError
end
-# ISO 15.2.25 says "LocalJumpError < StandardError"
-class LocalJumpError < ScriptError
+# ISO 15.2.25
+class LocalJumpError < StandardError
end
# ISO 15.2.26
diff --git a/mrblib/array.rb b/mrblib/array.rb
index 18b729128..6b4f74b96 100644
--- a/mrblib/array.rb
+++ b/mrblib/array.rb
@@ -4,7 +4,6 @@
#
# ISO 15.2.12
class Array
-
##
# Calls the given block for each element of +self+
# and pass the respective element.
@@ -193,13 +192,6 @@ class Array
return block.call if ret.nil? && block
ret
end
-end
-
-##
-# Array is enumerable
-class Array
- # ISO 15.2.12.3
- include Enumerable
##
# Sort all elements and replace +self+ with these
@@ -276,4 +268,10 @@ class Array
def to_a
self
end
+ alias entries to_a
+
+ ##
+ # Array is enumerable
+ # ISO 15.2.12.3
+ include Enumerable
end
diff --git a/mrblib/hash.rb b/mrblib/hash.rb
index 085536c6c..ac70f4c70 100644
--- a/mrblib/hash.rb
+++ b/mrblib/hash.rb
@@ -4,6 +4,12 @@
# ISO 15.2.13
class Hash
##
+ # Hash is enumerable
+ #
+ # ISO 15.2.13.3
+ include Enumerable
+
+ ##
# Equality---Two hashes are equal if they each contain the same number
# of keys and if each key-value pair is equal to (according to
# <code>Object#==</code>) the corresponding elements in the other
@@ -297,11 +303,3 @@ class Hash
h
end
end
-
-##
-# Hash is enumerable
-#
-# ISO 15.2.13.3
-class Hash
- include Enumerable
-end
diff --git a/mrblib/range.rb b/mrblib/range.rb
index 36886d50c..4a8e10f30 100644
--- a/mrblib/range.rb
+++ b/mrblib/range.rb
@@ -3,6 +3,11 @@
#
# ISO 15.2.14
class Range
+ ##
+ # Range is enumerable
+ #
+ # ISO 15.2.14.3
+ include Enumerable
##
# Calls the given block for each element of +self+
@@ -15,7 +20,7 @@ class Range
val = self.begin
last = self.end
- if val.kind_of?(Fixnum) && last.nil?
+ if val.kind_of?(Integer) && last.nil?
i = val
while true
block.call(i)
@@ -32,7 +37,7 @@ class Range
end
end
- if val.kind_of?(Integer) && last.kind_of?(Integer) # fixnums are special
+ if val.kind_of?(Integer) && last.kind_of?(Integer) # integers are special
lim = last
lim += 1 unless exclude_end?
i = val
@@ -74,16 +79,19 @@ class Range
h
end
+ ##
+ # call-seq:
+ # rng.to_a -> array
+ # rng.entries -> array
+ #
+ # Returns an array containing the items in the range.
+ #
+ # (1..7).to_a #=> [1, 2, 3, 4, 5, 6, 7]
+ # (1..).to_a #=> RangeError: cannot convert endless range to an array
def to_a
- raise RangeError, "cannot convert endless range to an array" if self.last.nil?
+ a = __num_to_a
+ return a if a
super
end
-end
-
-##
-# Range is enumerable
-#
-# ISO 15.2.14.3
-class Range
- include Enumerable
+ alias entries to_a
end
diff --git a/mrblib/string.rb b/mrblib/string.rb
index 675026e73..2b3178688 100644
--- a/mrblib/string.rb
+++ b/mrblib/string.rb
@@ -42,32 +42,6 @@ class String
self
end
- # private method for gsub/sub
- def __sub_replace(pre, m, post)
- s = ""
- i = 0
- while j = index("\\", i)
- break if j == length-1
- t = case self[j+1]
- when "\\"
- "\\"
- when "`"
- pre
- when "&", "0"
- m
- when "'"
- post
- when "1", "2", "3", "4", "5", "6", "7", "8", "9"
- ""
- else
- self[j, 2]
- end
- s += self[i, j-i] + t
- i = j + 2
- end
- s + self[i, length-i]
- end
-
##
# Replace all matches of +pattern+ with +replacement+.
# Call block (if given) for each match and replace
@@ -84,9 +58,6 @@ class String
if args.length == 2 && block
block = nil
end
- if !replace.nil? || !block
- replace.__to_str
- end
offset = 0
result = []
while found = index(pattern, offset)
@@ -95,7 +66,7 @@ class String
result << if block
block.call(pattern).to_s
else
- replace.__sub_replace(self[0, found], pattern, self[offset..-1] || "")
+ self.__sub_replace(replace, pattern, found)
end
if plen == 0
result << self[offset, 1]
@@ -144,25 +115,20 @@ class String
end
pattern, replace = *args
- pattern.__to_str
if args.length == 2 && block
block = nil
end
- unless block
- replace.__to_str
- end
result = []
- this = dup
found = index(pattern)
- return this unless found
- result << this[0, found]
+ return self.dup unless found
+ result << self[0, found]
offset = found + pattern.length
result << if block
block.call(pattern).to_s
else
- replace.__sub_replace(this[0, found], pattern, this[offset..-1] || "")
+ self.__sub_replace(replace, pattern, found)
end
- result << this[offset..-1] if offset < length
+ result << self[offset..-1] if offset < length
result.join
end
diff --git a/src/array.c b/src/array.c
index e83f7e2d8..c100591eb 100644
--- a/src/array.c
+++ b/src/array.c
@@ -29,7 +29,7 @@ ary_new_capa(mrb_state *mrb, mrb_int capa)
}
blen = capa * sizeof(mrb_value);
- a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class);
+ a = MRB_OBJ_ALLOC(mrb, MRB_TT_ARRAY, mrb->array_class);
if (capa <= MRB_ARY_EMBED_LEN_MAX) {
ARY_SET_EMBED_LEN(a, 0);
}
@@ -578,7 +578,7 @@ mrb_ary_shift(mrb_state *mrb, mrb_value self)
return val;
}
-MRB_API mrb_value
+static mrb_value
mrb_ary_shift_m(mrb_state *mrb, mrb_value self)
{
struct RArray *a = mrb_ary_ptr(self);
@@ -591,6 +591,7 @@ mrb_ary_shift_m(mrb_state *mrb, mrb_value self)
};
ary_modify_check(mrb, a);
if (len == 0 || n == 0) return mrb_ary_new(mrb);
+ if (n < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array shift");
if (n > len) n = len;
val = mrb_ary_new_from_values(mrb, n, ARY_PTR(a));
if (ARY_SHARED_P(a)) {
@@ -693,19 +694,6 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self)
return self;
}
-MRB_API mrb_value
-mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n)
-{
- struct RArray *a = mrb_ary_ptr(ary);
- mrb_int len = ARY_LEN(a);
-
- /* range check */
- if (n < 0) n += len;
- if (n < 0 || len <= n) return mrb_nil_value();
-
- return ARY_PTR(a)[n];
-}
-
MRB_API void
mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val)
{
@@ -754,13 +742,16 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
/* range check */
if (head < 0) {
head += alen;
- if (head < 0) {
- mrb_raise(mrb, E_INDEX_ERROR, "index is out of array");
- }
+ if (head < 0) goto out_of_range;
+ }
+ if (head > ARY_MAX_SIZE - len) {
+ out_of_range:
+ mrb_raisef(mrb, E_INDEX_ERROR, "index %i is out of array", head);
}
tail = head + len;
if (alen < len || alen < tail) {
len = alen - head;
+ tail = head + len;
}
/* size check */
@@ -786,12 +777,10 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
argv = &rpl;
}
if (head >= alen) {
- if (head > ARY_MAX_SIZE - argc) {
- mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", head);
- }
+ if (head > ARY_MAX_SIZE - argc) goto out_of_range;
len = head + argc;
if (len > ARY_CAPA(a)) {
- ary_expand_capa(mrb, a, head + argc);
+ ary_expand_capa(mrb, a, len);
}
ary_fill_with_nil(ARY_PTR(a) + alen, head - alen);
if (argc > 0) {
@@ -803,7 +792,8 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
mrb_int newlen;
if (alen - len > ARY_MAX_SIZE - argc) {
- mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", alen + argc - len);
+ head = alen + argc - len;
+ goto out_of_range;
}
newlen = alen + argc - len;
if (newlen > ARY_CAPA(a)) {
@@ -812,7 +802,6 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
if (len != argc) {
mrb_value *ptr = ARY_PTR(a);
- tail = head + len;
value_move(ptr + head + argc, ptr + tail, alen - tail);
ARY_SET_LEN(a, newlen);
}
@@ -843,7 +832,7 @@ ary_subseq(mrb_state *mrb, struct RArray *a, mrb_int beg, mrb_int len)
return mrb_ary_new_from_values(mrb, len, ARY_PTR(a)+beg);
}
ary_make_shared(mrb, a);
- b = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class);
+ b = MRB_OBJ_ALLOC(mrb, MRB_TT_ARRAY, mrb->array_class);
b->as.heap.ptr = a->as.heap.ptr + beg;
b->as.heap.len = len;
b->as.heap.aux.shared = a->as.heap.aux.shared;
@@ -1095,7 +1084,7 @@ mrb_ary_index_m(mrb_state *mrb, mrb_value self)
for (i = 0; i < RARRAY_LEN(self); i++) {
if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
- return mrb_fixnum_value(i);
+ return mrb_int_value(mrb, i);
}
}
return mrb_nil_value();
@@ -1109,7 +1098,7 @@ mrb_ary_rindex_m(mrb_state *mrb, mrb_value self)
for (i = RARRAY_LEN(self) - 1; i >= 0; i--) {
if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
- return mrb_fixnum_value(i);
+ return mrb_int_value(mrb, i);
}
if (i > (len = RARRAY_LEN(self))) {
i = len;
@@ -1148,7 +1137,7 @@ mrb_ary_size(mrb_state *mrb, mrb_value self)
{
struct RArray *a = mrb_ary_ptr(self);
- return mrb_fixnum_value(ARY_LEN(a));
+ return mrb_int_value(mrb, ARY_LEN(a));
}
MRB_API mrb_value
@@ -1190,15 +1179,16 @@ mrb_ary_empty_p(mrb_state *mrb, mrb_value self)
}
MRB_API mrb_value
-mrb_ary_entry(mrb_value ary, mrb_int offset)
+mrb_ary_entry(mrb_value ary, mrb_int n)
{
- if (offset < 0) {
- offset += RARRAY_LEN(ary);
- }
- if (offset < 0 || RARRAY_LEN(ary) <= offset) {
- return mrb_nil_value();
- }
- return RARRAY_PTR(ary)[offset];
+ struct RArray *a = mrb_ary_ptr(ary);
+ mrb_int len = ARY_LEN(a);
+
+ /* range check */
+ if (n < 0) n += len;
+ if (n < 0 || len <= n) return mrb_nil_value();
+
+ return ARY_PTR(a)[n];
}
static mrb_value
@@ -1292,6 +1282,7 @@ mrb_ary_eq(mrb_state *mrb, mrb_value ary1)
{
mrb_value ary2 = mrb_get_arg1(mrb);
+ mrb->c->ci->mid = 0;
if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value();
if (!mrb_array_p(ary2)) {
return mrb_false_value();
@@ -1306,6 +1297,7 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1)
{
mrb_value ary2 = mrb_get_arg1(mrb);
+ mrb->c->ci->mid = 0;
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 6e7e66f8c..d6648cc43 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -32,44 +32,64 @@ mrb_value mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace);
static void
each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void *data)
{
- ptrdiff_t i;
- int n = 0;
-
if (ciidx >= mrb->c->ciend - mrb->c->cibase)
ciidx = 10; /* ciidx is broken... */
- for (i=ciidx; i >= 0; i--) {
+ for (ptrdiff_t i=ciidx; i >= 0; i--) {
struct backtrace_location loc;
mrb_callinfo *ci;
- const mrb_irep *irep;
+ const mrb_irep *irep = 0;
const mrb_code *pc;
uint32_t idx;
ci = &mrb->c->cibase[i];
- if (!ci->proc) continue;
- if (MRB_PROC_CFUNC_P(ci->proc)) continue;
-
- irep = ci->proc->body.irep;
- if (!irep) continue;
-
- if (mrb->c->cibase[i].pc) {
- pc = &mrb->c->cibase[i].pc[-1];
+ if (!ci->proc || MRB_PROC_CFUNC_P(ci->proc)) {
+ if (!ci->mid) continue;
+ loc.lineno = -1;
+ idx = 0;
}
else {
- continue;
+ irep = ci->proc->body.irep;
+ if (!irep) continue;
+ if (mrb->c->cibase[i].pc) {
+ pc = &mrb->c->cibase[i].pc[-1];
+ }
+ else {
+ continue;
+ }
+ idx = (uint32_t)(pc - irep->iseq);
+ loc.lineno = mrb_debug_get_line(mrb, irep, idx);
+ }
+ loc.method_id = ci->mid;
+ if (loc.lineno == -1) {
+ for (ptrdiff_t j=i-1; j >= 0; j--) {
+ ci = &mrb->c->cibase[j];
+
+ if (!ci->proc) continue;
+ if (MRB_PROC_CFUNC_P(ci->proc)) continue;
+
+ irep = ci->proc->body.irep;
+ if (!irep) continue;
+
+ if (mrb->c->cibase[j].pc) {
+ pc = &mrb->c->cibase[j].pc[-1];
+ }
+ else {
+ continue;
+ }
+
+ idx = (uint32_t)(pc - irep->iseq);
+ loc.lineno = mrb_debug_get_line(mrb, irep, idx);
+ if (loc.lineno > 0) break;
+ }
}
-
- idx = (uint32_t)(pc - irep->iseq);
- loc.lineno = mrb_debug_get_line(mrb, irep, idx);
- if (n++ == 0 && loc.lineno == -1 && ci->acc < 0) continue;
loc.filename = mrb_debug_get_filename(mrb, irep, idx);
if (!loc.filename) {
loc.filename = "(unknown)";
}
- loc.method_id = ci->mid;
func(mrb, &loc, data);
}
}
@@ -82,22 +102,24 @@ print_backtrace(mrb_state *mrb, struct RObject *exc, mrb_value backtrace)
mrb_int i;
mrb_int n = RARRAY_LEN(backtrace);
mrb_value *loc, mesg;
- FILE *stream = stderr;
if (n != 0) {
- fprintf(stream, "trace (most recent call last):\n");
+ if (n > 1) {
+ fprintf(stderr, "trace (most recent call last):\n");
+ }
for (i=n-1,loc=&RARRAY_PTR(backtrace)[i]; i>0; i--,loc--) {
if (mrb_string_p(*loc)) {
- fprintf(stream, "\t[%d] %.*s\n",
+ fprintf(stderr, "\t[%d] %.*s\n",
(int)i, (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc));
}
}
if (mrb_string_p(*loc)) {
- fprintf(stream, "%.*s: ", (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc));
+ fprintf(stderr, "%.*s: ", (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc));
}
}
mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc));
- fprintf(stream, "%.*s\n", (int)RSTRING_LEN(mesg), RSTRING_PTR(mesg));
+ fwrite(RSTRING_PTR(mesg), RSTRING_LEN(mesg), 1, stderr);
+ fputc('\n', stderr);
}
/* mrb_print_backtrace
diff --git a/src/cdump.c b/src/cdump.c
new file mode 100644
index 000000000..ecc27d9a1
--- /dev/null
+++ b/src/cdump.c
@@ -0,0 +1,468 @@
+/*
+** dump.c - mruby binary dumper (mrbc binary format)
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <mruby.h>
+#include <mruby/string.h>
+#include <mruby/dump.h>
+#include <mruby/irep.h>
+#include <mruby/debug.h>
+
+#include <string.h>
+
+#ifndef MRB_NO_STDIO
+
+#ifndef MRB_NO_FLOAT
+#include <mruby/endian.h>
+#define MRB_FLOAT_FMT "%.17g"
+#endif
+
+static int
+cdump_pool(mrb_state *mrb, const mrb_pool_value *p, FILE *fp)
+{
+ if (p->tt & IREP_TT_NFLAG) { /* number */
+ switch (p->tt) {
+#ifdef MRB_64BIT
+ case IREP_TT_INT64:
+ if (p->u.i64 < INT32_MIN || INT32_MAX < p->u.i64) {
+ fprintf(fp, "{IREP_TT_INT64, {.i64=%" PRId64 "}},\n", p->u.i64);
+ }
+ else {
+ fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", (int32_t)p->u.i64);
+ }
+ break;
+#endif
+ case IREP_TT_INT32:
+ fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", p->u.i32);
+ break;
+ case IREP_TT_FLOAT:
+#ifndef MRB_NO_FLOAT
+ if (p->u.f == 0) {
+ fprintf(fp, "{IREP_TT_FLOAT, {.f=%#.1f}},\n", p->u.f);
+ }
+ else {
+ fprintf(fp, "{IREP_TT_FLOAT, {.f=" MRB_FLOAT_FMT "}},\n", p->u.f);
+ }
+#endif
+ break;
+ case IREP_TT_BIGINT:
+ {
+ const char *s = p->u.str;
+ int len = s[0]+2;
+ fputs("{IREP_TT_BIGINT, {\"", fp);
+ for (int i=0; i<len; i++) {
+ fprintf(fp, "\\x%02x", (int)s[i]&0xff);
+ }
+ fputs("\"}},\n", fp);
+ }
+ break;
+ }
+ }
+ else { /* string */
+ int i, len = p->tt>>2;
+ const char *s = p->u.str;
+ fprintf(fp, "{IREP_TT_STR|(%d<<2), {\"", len);
+ for (i=0; i<len; i++) {
+ fprintf(fp, "\\x%02x", (int)s[i]&0xff);
+ }
+ fputs("\"}},\n", fp);
+ }
+ return MRB_DUMP_OK;
+}
+
+static mrb_bool
+sym_name_word_p(const char *name, mrb_int len)
+{
+ if (len == 0) return FALSE;
+ if (name[0] != '_' && !ISALPHA(name[0])) return FALSE;
+ for (int i = 1; i < len; i++) {
+ if (name[i] != '_' && !ISALNUM(name[i])) return FALSE;
+ }
+ return TRUE;
+}
+
+static mrb_bool
+sym_name_with_equal_p(const char *name, mrb_int len)
+{
+ return len >= 2 && name[len-1] == '=' && sym_name_word_p(name, len-1);
+}
+
+static mrb_bool
+sym_name_with_question_mark_p(const char *name, mrb_int len)
+{
+ return len >= 2 && name[len-1] == '?' && sym_name_word_p(name, len-1);
+}
+
+static mrb_bool
+sym_name_with_bang_p(const char *name, mrb_int len)
+{
+ return len >= 2 && name[len-1] == '!' && sym_name_word_p(name, len-1);
+}
+
+static mrb_bool
+sym_name_ivar_p(const char *name, mrb_int len)
+{
+ return len >= 2 && name[0] == '@' && sym_name_word_p(name+1, len-1);
+}
+
+static mrb_bool
+sym_name_cvar_p(const char *name, mrb_int len)
+{
+ return len >= 3 && name[0] == '@' && sym_name_ivar_p(name+1, len-1);
+}
+
+#define OPERATOR_SYMBOL(sym_name, name) {name, sym_name, sizeof(sym_name)-1}
+struct operator_symbol {
+ const char *name;
+ const char *sym_name;
+ uint16_t sym_name_len;
+};
+static const struct operator_symbol operator_table[] = {
+ OPERATOR_SYMBOL("!", "not"),
+ OPERATOR_SYMBOL("%", "mod"),
+ OPERATOR_SYMBOL("&", "and"),
+ OPERATOR_SYMBOL("*", "mul"),
+ OPERATOR_SYMBOL("+", "add"),
+ OPERATOR_SYMBOL("-", "sub"),
+ OPERATOR_SYMBOL("/", "div"),
+ OPERATOR_SYMBOL("<", "lt"),
+ OPERATOR_SYMBOL(">", "gt"),
+ OPERATOR_SYMBOL("^", "xor"),
+ OPERATOR_SYMBOL("`", "tick"),
+ OPERATOR_SYMBOL("|", "or"),
+ OPERATOR_SYMBOL("~", "neg"),
+ OPERATOR_SYMBOL("!=", "neq"),
+ OPERATOR_SYMBOL("!~", "nmatch"),
+ OPERATOR_SYMBOL("&&", "andand"),
+ OPERATOR_SYMBOL("**", "pow"),
+ OPERATOR_SYMBOL("+@", "plus"),
+ OPERATOR_SYMBOL("-@", "minus"),
+ OPERATOR_SYMBOL("<<", "lshift"),
+ OPERATOR_SYMBOL("<=", "le"),
+ OPERATOR_SYMBOL("==", "eq"),
+ OPERATOR_SYMBOL("=~", "match"),
+ OPERATOR_SYMBOL(">=", "ge"),
+ OPERATOR_SYMBOL(">>", "rshift"),
+ OPERATOR_SYMBOL("[]", "aref"),
+ OPERATOR_SYMBOL("||", "oror"),
+ OPERATOR_SYMBOL("<=>", "cmp"),
+ OPERATOR_SYMBOL("===", "eqq"),
+ OPERATOR_SYMBOL("[]=", "aset"),
+};
+
+static const char*
+sym_operator_name(const char *sym_name, mrb_int len)
+{
+ mrb_sym table_size = sizeof(operator_table)/sizeof(struct operator_symbol);
+ if (operator_table[table_size-1].sym_name_len < len) return NULL;
+
+ mrb_sym start, idx;
+ int cmp;
+ const struct operator_symbol *op_sym;
+ for (start = 0; table_size != 0; table_size/=2) {
+ idx = start+table_size/2;
+ op_sym = &operator_table[idx];
+ cmp = (int)len-(int)op_sym->sym_name_len;
+ if (cmp == 0) {
+ cmp = memcmp(sym_name, op_sym->sym_name, len);
+ if (cmp == 0) return op_sym->name;
+ }
+ if (0 < cmp) {
+ start = ++idx;
+ --table_size;
+ }
+ }
+ return NULL;
+}
+
+static const char*
+sym_var_name(mrb_state *mrb, const char *initname, const char *key, int n)
+{
+ char buf[32];
+ mrb_value s = mrb_str_new_cstr(mrb, initname);
+ mrb_str_cat_lit(mrb, s, "_");
+ mrb_str_cat_cstr(mrb, s, key);
+ mrb_str_cat_lit(mrb, s, "_");
+ snprintf(buf, sizeof(buf), "%d", n);
+ mrb_str_cat_cstr(mrb, s, buf);
+ return RSTRING_PTR(s);
+}
+
+static int
+cdump_sym(mrb_state *mrb, mrb_sym sym, const char *var_name, int idx, mrb_value init_syms_code, FILE *fp)
+{
+ if (sym == 0) return MRB_DUMP_INVALID_ARGUMENT;
+
+ mrb_int len;
+ const char *name = mrb_sym_name_len(mrb, sym, &len), *op_name;
+ if (!name) return MRB_DUMP_INVALID_ARGUMENT;
+ if (sym_name_word_p(name, len)) {
+ fprintf(fp, "MRB_SYM(%s)", name);
+ }
+ else if (sym_name_with_equal_p(name, len)) {
+ fprintf(fp, "MRB_SYM_E(%.*s)", (int)(len-1), name);
+ }
+ else if (sym_name_with_question_mark_p(name, len)) {
+ fprintf(fp, "MRB_SYM_Q(%.*s)", (int)(len-1), name);
+ }
+ else if (sym_name_with_bang_p(name, len)) {
+ fprintf(fp, "MRB_SYM_B(%.*s)", (int)(len-1), name);
+ }
+ else if (sym_name_ivar_p(name, len)) {
+ fprintf(fp, "MRB_IVSYM(%s)", name+1);
+ }
+ else if (sym_name_cvar_p(name, len)) {
+ fprintf(fp, "MRB_CVSYM(%s)", name+2);
+ }
+ else if ((op_name = sym_operator_name(name, len))) {
+ fprintf(fp, "MRB_OPSYM(%s)", op_name);
+ }
+ else {
+ char buf[32];
+ mrb_value name_obj = mrb_str_new(mrb, name, len);
+ mrb_str_cat_lit(mrb, init_syms_code, " ");
+ mrb_str_cat_cstr(mrb, init_syms_code, var_name);
+ snprintf(buf, sizeof(buf), "[%d] = ", idx);
+ mrb_str_cat_cstr(mrb, init_syms_code, buf);
+ mrb_str_cat_lit(mrb, init_syms_code, "mrb_intern_lit(mrb, ");
+ mrb_str_cat_str(mrb, init_syms_code, mrb_str_dump(mrb, name_obj));
+ mrb_str_cat_lit(mrb, init_syms_code, ");\n");
+ fputs("0", fp);
+ }
+ fputs(", ", fp);
+ return MRB_DUMP_OK;
+}
+
+static int
+cdump_syms(mrb_state *mrb, const char *name, const char *key, int n, int syms_len, const mrb_sym *syms, mrb_value init_syms_code, FILE *fp)
+{
+ int ai = mrb_gc_arena_save(mrb);
+ mrb_int code_len = RSTRING_LEN(init_syms_code);
+ const char *var_name = sym_var_name(mrb, name, key, n);
+ fprintf(fp, "mrb_DEFINE_SYMS_VAR(%s, %d, (", var_name, syms_len);
+ for (int i=0; i<syms_len; i++) {
+ cdump_sym(mrb, syms[i], var_name, i, init_syms_code, fp);
+ }
+ fputs("), ", fp);
+ if (code_len == RSTRING_LEN(init_syms_code)) fputs("const", fp);
+ fputs(");\n", fp);
+ mrb_gc_arena_restore(mrb, ai);
+ return MRB_DUMP_OK;
+}
+
+//Handle the simple/common case of debug_info:
+// - 1 file associated with a single irep
+// - mrb_debug_line_ary format only
+static int
+simple_debug_info(mrb_irep_debug_info *info)
+{
+ if (!info || info->flen != 1) {
+ return 0;
+ }
+ return 1;
+}
+
+//Adds debug information to c-structs and
+//adds filenames in init_syms_code block
+static int
+cdump_debug(mrb_state *mrb, const char *name, int n, mrb_irep_debug_info *info,
+ mrb_value init_syms_code, FILE *fp)
+{
+ char buffer[256];
+ const char *filename;
+ mrb_int file_len;
+ int len, i;
+ const char *line_type = "mrb_debug_line_ary";
+
+ if (!simple_debug_info(info))
+ return MRB_DUMP_INVALID_IREP;
+
+ len = info->files[0]->line_entry_count;
+
+ filename = mrb_sym_name_len(mrb, info->files[0]->filename_sym, &file_len);
+ snprintf(buffer, sizeof(buffer), " %s_debug_file_%d.filename_sym = mrb_intern_lit(mrb,\"",
+ name, n);
+ mrb_str_cat_cstr(mrb, init_syms_code, buffer);
+ mrb_str_cat_cstr(mrb, init_syms_code, filename);
+ mrb_str_cat_cstr(mrb, init_syms_code, "\");\n");
+
+ switch (info->files[0]->line_type) {
+ case mrb_debug_line_ary:
+ fprintf(fp, "static uint16_t %s_debug_lines_%d[%d] = {", name, n, len);
+ for (i=0; i<len; i++) {
+ if (i%10 == 0) fputs("\n", fp);
+ fprintf(fp, "0x%04x,", info->files[0]->lines.ary[i]);
+ }
+ fputs("};\n", fp);
+ break;
+
+ case mrb_debug_line_flat_map:
+ line_type = "mrb_debug_line_flat_map";
+ fprintf(fp, "static struct mrb_irep_debug_info_line %s_debug_lines_%d[%d] = {", name, n, len);
+ for (i=0; i<len; i++) {
+ mrb_irep_debug_info_line *fmap = &info->files[0]->lines.flat_map[i];
+ fprintf(fp, "\t{.start_pos=0x%04x,.line=%d},\n", fmap->start_pos, fmap->line);
+ }
+ fputs("};\n", fp);
+ break;
+
+ case mrb_debug_line_packed_map:
+ line_type = "mrb_debug_line_packed_map";
+ fprintf(fp, "static char %s_debug_lines_%d[] = \"", name, n);
+ uint8_t *pmap = info->files[0]->lines.packed_map;
+ for (i=0; i<len; i++) {
+ fprintf(fp, "\\x%02x", pmap[i]&0xff);
+ }
+ fputs("\";\n", fp);
+ break;
+ }
+ fprintf(fp, "static mrb_irep_debug_info_file %s_debug_file_%d = {\n", name, n);
+ fprintf(fp, "%d, %d, %d, %s, {%s_debug_lines_%d}};\n",
+ info->files[0]->start_pos,
+ info->files[0]->filename_sym,
+ info->files[0]->line_entry_count,
+ line_type,
+ name,n);
+ fprintf(fp, "static mrb_irep_debug_info_file *%s_debug_file_%d_ = &%s_debug_file_%d;\n", name, n, name, n);
+
+ fprintf(fp, "static mrb_irep_debug_info %s_debug_%d = {\n", name, n);
+ fprintf(fp, "%d, %d, &%s_debug_file_%d_};\n", info->pc_count, info->flen, name, n);
+
+ return MRB_DUMP_OK;
+}
+
+static int
+cdump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *name, int n, mrb_value init_syms_code, int *mp)
+{
+ int i, len;
+ int max = *mp;
+ int debug_available = 0;
+
+ /* dump reps */
+ if (irep->reps) {
+ for (i=0,len=irep->rlen; i<len; i++) {
+ *mp += len;
+ if (cdump_irep_struct(mrb, irep->reps[i], flags, fp, name, max+i, init_syms_code, mp) != MRB_DUMP_OK)
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+ fprintf(fp, "static const mrb_irep *%s_reps_%d[%d] = {\n", name, n, len);
+ for (i=0,len=irep->rlen; i<len; i++) {
+ fprintf(fp, " &%s_irep_%d,\n", name, max+i);
+ }
+ fputs("};\n", fp);
+ }
+ /* dump pool */
+ if (irep->pool) {
+ len=irep->plen;
+ fprintf(fp, "static const mrb_pool_value %s_pool_%d[%d] = {\n", name, n, len);
+ for (i=0; i<len; i++) {
+ if (cdump_pool(mrb, &irep->pool[i], fp) != MRB_DUMP_OK)
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+ fputs("};\n", fp);
+ }
+ /* dump syms */
+ if (irep->syms) {
+ cdump_syms(mrb, name, "syms", n, irep->slen, irep->syms, init_syms_code, fp);
+ }
+ /* dump iseq */
+ len=irep->ilen+sizeof(struct mrb_irep_catch_handler)*irep->clen;
+ fprintf(fp, "static const mrb_code %s_iseq_%d[%d] = {", name, n, len);
+ for (i=0; i<len; i++) {
+ if (i%20 == 0) fputs("\n", fp);
+ fprintf(fp, "0x%02x,", irep->iseq[i]);
+ }
+ fputs("};\n", fp);
+ /* dump lv */
+ if (irep->lv) {
+ cdump_syms(mrb, name, "lv", n, irep->nlocals-1, irep->lv, init_syms_code, fp);
+ }
+ /* dump debug */
+ if (flags & MRB_DUMP_DEBUG_INFO) {
+ if(cdump_debug(mrb, name, n, irep->debug_info,
+ init_syms_code, fp) == MRB_DUMP_OK) {
+ debug_available = 1;
+ }
+ }
+
+
+ /* dump irep */
+ fprintf(fp, "static const mrb_irep %s_irep_%d = {\n", name, n);
+ fprintf(fp, " %d,%d,%d,\n", irep->nlocals, irep->nregs, irep->clen);
+ fprintf(fp, " MRB_IREP_STATIC,%s_iseq_%d,\n", name, n);
+ if (irep->pool) {
+ fprintf(fp, " %s_pool_%d,", name, n);
+ }
+ else {
+ fputs( " NULL,", fp);
+ }
+ if (irep->syms) {
+ fprintf(fp, "%s_syms_%d,", name, n);
+ }
+ else {
+ fputs( "NULL,", fp);
+ }
+ if (irep->reps) {
+ fprintf(fp, "%s_reps_%d,\n", name, n);
+ }
+ else {
+ fputs( "NULL,\n", fp);
+ }
+ if (irep->lv) {
+ fprintf(fp, " %s_lv_%d,\n", name, n);
+ }
+ else {
+ fputs( " NULL,\t\t\t\t\t/* lv */\n", fp);
+ }
+ if(debug_available) {
+ fprintf(fp, " &%s_debug_%d,\n", name, n);
+ }
+ else {
+ fputs(" NULL,\t\t\t\t\t/* debug_info */\n", fp);
+ }
+ fprintf(fp, " %d,%d,%d,%d,0\n};\n", irep->ilen, irep->plen, irep->slen, irep->rlen);
+
+ return MRB_DUMP_OK;
+}
+
+int
+mrb_dump_irep_cstruct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *initname)
+{
+ if (fp == NULL || initname == NULL || initname[0] == '\0') {
+ return MRB_DUMP_INVALID_ARGUMENT;
+ }
+ if (fprintf(fp, "#include <mruby.h>\n"
+ "#include <mruby/irep.h>\n"
+ "#include <mruby/debug.h>\n"
+ "#include <mruby/proc.h>\n"
+ "#include <mruby/presym.h>\n"
+ "\n") < 0) {
+ return MRB_DUMP_WRITE_FAULT;
+ }
+ fputs("#define mrb_BRACED(...) {__VA_ARGS__}\n", fp);
+ fputs("#define mrb_DEFINE_SYMS_VAR(name, len, syms, qualifier) \\\n", fp);
+ fputs(" static qualifier mrb_sym name[len] = mrb_BRACED syms\n", fp);
+ fputs("\n", fp);
+ mrb_value init_syms_code = mrb_str_new_capa(mrb, 0);
+ int max = 1;
+ int n = cdump_irep_struct(mrb, irep, flags, fp, initname, 0, init_syms_code, &max);
+ if (n != MRB_DUMP_OK) return n;
+ fprintf(fp,
+ "%s\n"
+ "const struct RProc %s[] = {{\n",
+ (flags & MRB_DUMP_STATIC) ? "static"
+ : "#ifdef __cplusplus\n"
+ "extern\n"
+ "#endif",
+ initname);
+ fprintf(fp, "NULL,NULL,MRB_TT_PROC,MRB_GC_RED,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname);
+ fputs("static void\n", fp);
+ fprintf(fp, "%s_init_syms(mrb_state *mrb)\n", initname);
+ fputs("{\n", fp);
+ fputs(RSTRING_PTR(init_syms_code), fp);
+ fputs("}\n", fp);
+ return MRB_DUMP_OK;
+}
+#endif
diff --git a/src/class.c b/src/class.c
index dfd25b371..fdf63794b 100644
--- a/src/class.c
+++ b/src/class.c
@@ -4,7 +4,6 @@
** See Copyright Notice in mruby.h
*/
-#include <stdarg.h>
#include <mruby.h>
#include <mruby/array.h>
#include <mruby/hash.h>
@@ -341,7 +340,7 @@ prepare_singleton_class(mrb_state *mrb, struct RBasic *o)
struct RClass *sc, *c;
if (o->c->tt == MRB_TT_SCLASS) return;
- sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class);
+ sc = MRB_OBJ_ALLOC(mrb, MRB_TT_SCLASS, mrb->class_class);
sc->flags |= MRB_FL_CLASS_IS_INHERITED;
sc->mt = mt_new(mrb);
sc->iv = 0;
@@ -800,18 +799,12 @@ mrb_notimplement_m(mrb_state *mrb, mrb_value self)
return mrb_nil_value();
}
-static mrb_value
-to_ary(mrb_state *mrb, mrb_value val)
-{
- mrb_check_type(mrb, val, MRB_TT_ARRAY);
- return val;
-}
-
-static mrb_value
-to_hash(mrb_state *mrb, mrb_value val)
+static void
+ensure_class_type(mrb_state *mrb, mrb_value val)
{
- mrb_check_type(mrb, val, MRB_TT_HASH);
- return val;
+ if (!class_ptr_p(val)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "%v is not class/module", val);
+ }
}
#define to_sym(mrb, ss) mrb_obj_to_sym(mrb, ss)
@@ -859,6 +852,17 @@ mrb_get_arg1(mrb_state *mrb)
return array_argv[0];
}
+MRB_API mrb_bool
+mrb_block_given_p(mrb_state *mrb)
+{
+ const mrb_callinfo *ci = mrb->c->ci;
+ int argc = ci->argc;
+ int idx = (argc < 0) ? 2 : argc + 1;
+ mrb_value b = ci->stack[idx];
+
+ return !mrb_nil_p(b);
+}
+
void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
/*
@@ -873,52 +877,57 @@ void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
string mruby type C type note
----------------------------------------------------------------------------------------------
o: Object [mrb_value]
- C: Class/Module [mrb_value]
+ C: Class/Module [mrb_value] when ! follows, the value may be nil
S: String [mrb_value] when ! follows, the value may be nil
A: Array [mrb_value] when ! follows, the value may be nil
H: Hash [mrb_value] when ! follows, the value may be nil
s: String [const char*,mrb_int] Receive two arguments; s! gives (NULL,0) for nil
z: String [const char*] NUL terminated string; z! gives NULL for nil
a: Array [const mrb_value*,mrb_int] Receive two arguments; a! gives (NULL,0) for nil
- c: Class/Module [strcut RClass*]
+ c: Class/Module [strcut RClass*] c! gives NULL for nil
f: Integer/Float [mrb_float]
i: Integer/Float [mrb_int]
b: boolean [mrb_bool]
n: String/Symbol [mrb_sym]
d: data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified; when ! follows, the value may be nil
- I: inline struct [void*]
+ I: inline struct [void*,struct RClass] I! gives NULL for nil
&: block [mrb_value] &! raises exception if no block given
*: rest argument [const mrb_value*,mrb_int] The rest of the arguments as an array; *! avoid copy of the stack
|: optional Following arguments are optional
?: optional given [mrb_bool] true if preceding argument (optional) is given
':': keyword args [mrb_kwargs const] Get keyword arguments
+
+ format modifiers:
+
+ string note
+ ----------------------------------------------------------------------------------------------
+ !: Switch to the alternate mode; The behaviour changes depending on the specifier
+ +: Request a not frozen object; However, except nil value
*/
MRB_API mrb_int
mrb_get_args(mrb_state *mrb, const char *format, ...)
{
const char *fmt = format;
char c;
- mrb_int i = 0;
+ int i = 0;
va_list ap;
- mrb_int argc = mrb->c->ci->argc;
- mrb_value *array_argv = mrb->c->ci->stack+1;
+ int argc = mrb->c->ci->argc;
+ const mrb_value *argv = mrb->c->ci->stack+1;
mrb_bool argv_on_stack = argc >= 0;
mrb_bool opt = FALSE;
mrb_bool opt_skip = TRUE;
- mrb_bool given = TRUE;
+ const mrb_value *pickarg = NULL; /* arguments currently being processed */
mrb_value kdict;
mrb_bool reqkarg = FALSE;
int argc_min = 0, argc_max = 0;
if (!argv_on_stack) {
- struct RArray *a = mrb_ary_ptr(*array_argv);
- array_argv = ARY_PTR(a);
+ struct RArray *a = mrb_ary_ptr(*argv);
+ argv = ARY_PTR(a);
argc = ARY_LEN(a);
}
va_start(ap, format);
-#define ARGV array_argv
-
while ((c = *fmt++)) {
switch (c) {
case '|':
@@ -930,6 +939,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
if (!reqkarg) reqkarg = strchr(fmt, ':') ? TRUE : FALSE;
goto check_exit;
case '!':
+ case '+':
break;
case ':':
reqkarg = TRUE;
@@ -945,9 +955,9 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
}
check_exit:
- if (reqkarg && argc > argc_min && mrb_hash_p(kdict = ARGV[argc - 1])) {
+ if (reqkarg && argc > argc_min && mrb_hash_p(kdict = argv[argc - 1])) {
mrb_hash_check_kdict(mrb, kdict);
- argc --;
+ argc--;
}
else {
kdict = mrb_nil_value();
@@ -956,16 +966,45 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
opt = FALSE;
i = 0;
while ((c = *format++)) {
- mrb_value *argv = ARGV;
- mrb_bool altmode;
+ mrb_bool altmode = FALSE;
+ mrb_bool needmodify = FALSE;
+
+ for (; *format; format++) {
+ switch (*format) {
+ case '!':
+ if (altmode) goto modifier_exit; /* not accept for multiple '!' */
+ altmode = TRUE;
+ break;
+ case '+':
+ if (needmodify) goto modifier_exit; /* not accept for multiple '+' */
+ needmodify = TRUE;
+ break;
+ default:
+ goto modifier_exit;
+ }
+ }
+ modifier_exit:
switch (c) {
case '|': case '*': case '&': case '?': case ':':
+ if (needmodify) {
+ bad_needmodify:
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong `%c+` modified specifer`", c);
+ }
break;
default:
- if (argc <= i) {
+ if (i < argc) {
+ pickarg = &argv[i++];
+ if (needmodify && !mrb_nil_p(*pickarg)) {
+ if (mrb_immediate_p(*pickarg)) {
+ mrb_raisef(mrb, E_FROZEN_ERROR, "can't modify frozen %t", *pickarg);
+ }
+ mrb_check_frozen(mrb, mrb_obj_ptr(*pickarg));
+ }
+ }
+ else {
if (opt) {
- given = FALSE;
+ pickarg = NULL;
}
else {
mrb_argnum_error(mrb, argc, argc_min, argc_max);
@@ -974,38 +1013,26 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
break;
}
- if (*format == '!') {
- format ++;
- altmode = TRUE;
- }
- else {
- altmode = FALSE;
- }
-
switch (c) {
case 'o':
- {
- mrb_value *p;
-
- p = va_arg(ap, mrb_value*);
- if (i < argc) {
- *p = argv[i++];
- }
- }
- break;
case 'C':
+ case 'S':
+ case 'A':
+ case 'H':
{
mrb_value *p;
p = va_arg(ap, mrb_value*);
- 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);
+ if (pickarg) {
+ if (!(altmode && mrb_nil_p(*pickarg))) {
+ switch (c) {
+ case 'C': ensure_class_type(mrb, *pickarg); break;
+ case 'S': mrb_ensure_string_type(mrb, *pickarg); break;
+ case 'A': mrb_ensure_array_type(mrb, *pickarg); break;
+ case 'H': mrb_ensure_hash_type(mrb, *pickarg); break;
+ }
}
- *p = ss;
+ *p = *pickarg;
}
}
break;
@@ -1014,114 +1041,72 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
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;
-
- p = va_arg(ap, mrb_value*);
- if (i < argc) {
- *p = argv[i++];
- if (!(altmode && mrb_nil_p(*p))) {
- mrb_to_str(mrb, *p);
+ if (pickarg) {
+ if (altmode && mrb_nil_p(*pickarg)) {
+ *p = NULL;
}
- }
- }
- break;
- case 'A':
- {
- mrb_value *p;
-
- p = va_arg(ap, mrb_value*);
- if (i < argc) {
- *p = argv[i++];
- if (!(altmode && mrb_nil_p(*p))) {
- *p = to_ary(mrb, *p);
- }
- }
- }
- break;
- case 'H':
- {
- mrb_value *p;
-
- p = va_arg(ap, mrb_value*);
- if (i < argc) {
- *p = argv[i++];
- if (!(altmode && mrb_nil_p(*p))) {
- *p = to_hash(mrb, *p);
+ else {
+ ensure_class_type(mrb, *pickarg);
+ *p = mrb_class_ptr(*pickarg);
}
}
}
break;
case 's':
{
- mrb_value ss;
const char **ps = 0;
mrb_int *pl = 0;
ps = va_arg(ap, const char**);
pl = va_arg(ap, mrb_int*);
- if (i < argc) {
- ss = argv[i++];
- if (altmode && mrb_nil_p(ss)) {
+ if (needmodify) goto bad_needmodify;
+ if (pickarg) {
+ if (altmode && mrb_nil_p(*pickarg)) {
*ps = NULL;
*pl = 0;
}
else {
- mrb_to_str(mrb, ss);
- *ps = RSTRING_PTR(ss);
- *pl = RSTRING_LEN(ss);
+ mrb_ensure_string_type(mrb, *pickarg);
+ *ps = RSTRING_PTR(*pickarg);
+ *pl = RSTRING_LEN(*pickarg);
}
}
}
break;
case 'z':
{
- mrb_value ss;
const char **ps;
ps = va_arg(ap, const char**);
- if (i < argc) {
- ss = argv[i++];
- if (altmode && mrb_nil_p(ss)) {
+ if (needmodify) goto bad_needmodify;
+ if (pickarg) {
+ if (altmode && mrb_nil_p(*pickarg)) {
*ps = NULL;
}
else {
- mrb_to_str(mrb, ss);
- *ps = RSTRING_CSTR(mrb, ss);
+ mrb_ensure_string_type(mrb, *pickarg);
+ *ps = RSTRING_CSTR(mrb, *pickarg);
}
}
}
break;
case 'a':
{
- mrb_value aa;
struct RArray *a;
const mrb_value **pb;
mrb_int *pl;
pb = va_arg(ap, const mrb_value**);
pl = va_arg(ap, mrb_int*);
- if (i < argc) {
- aa = argv[i++];
- if (altmode && mrb_nil_p(aa)) {
+ if (needmodify) goto bad_needmodify;
+ if (pickarg) {
+ if (altmode && mrb_nil_p(*pickarg)) {
*pb = 0;
*pl = 0;
}
else {
- aa = to_ary(mrb, aa);
- a = mrb_ary_ptr(aa);
+ mrb_ensure_array_type(mrb, *pickarg);
+ a = mrb_ary_ptr(*pickarg);
*pb = ARY_PTR(a);
*pl = ARY_LEN(a);
}
@@ -1131,16 +1116,23 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
case 'I':
{
void* *p;
- mrb_value ss;
+ struct RClass *klass;
p = va_arg(ap, void**);
- if (i < argc) {
- ss = argv[i++];
- if (!mrb_istruct_p(ss))
- {
- mrb_raisef(mrb, E_TYPE_ERROR, "%v is not inline struct", ss);
+ klass = va_arg(ap, struct RClass*);
+ if (pickarg) {
+ if (altmode && mrb_nil_p(*pickarg)) {
+ *p = NULL;
+ }
+ else {
+ if (!mrb_obj_is_kind_of(mrb, *pickarg, klass)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "%v is not a %C", *pickarg, klass);
+ }
+ if (!mrb_istruct_p(*pickarg)) {
+ mrb_raisef(mrb, E_TYPE_ERROR, "%v is not inline struct", *pickarg);
+ }
+ *p = mrb_istruct_ptr(*pickarg);
}
- *p = mrb_istruct_ptr(ss);
}
}
break;
@@ -1150,8 +1142,8 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_float *p;
p = va_arg(ap, mrb_float*);
- if (i < argc) {
- *p = mrb_to_flo(mrb, argv[i++]);
+ if (pickarg) {
+ *p = mrb_as_float(mrb, *pickarg);
}
}
break;
@@ -1161,8 +1153,8 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_int *p;
p = va_arg(ap, mrb_int*);
- if (i < argc) {
- *p = mrb_integer(mrb_to_int(mrb, argv[i++]));
+ if (pickarg) {
+ *p = mrb_as_int(mrb, *pickarg);
}
}
break;
@@ -1170,9 +1162,8 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
{
mrb_bool *boolp = va_arg(ap, mrb_bool*);
- if (i < argc) {
- mrb_value b = argv[i++];
- *boolp = mrb_test(b);
+ if (pickarg) {
+ *boolp = mrb_test(*pickarg);
}
}
break;
@@ -1181,11 +1172,8 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_sym *symp;
symp = va_arg(ap, mrb_sym*);
- if (i < argc) {
- mrb_value ss;
-
- ss = argv[i++];
- *symp = to_sym(mrb, ss);
+ if (pickarg) {
+ *symp = to_sym(mrb, *pickarg);
}
}
break;
@@ -1196,13 +1184,12 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
datap = va_arg(ap, void**);
type = va_arg(ap, struct mrb_data_type const*);
- if (i < argc) {
- mrb_value dd = argv[i++];
- if (altmode && mrb_nil_p(dd)) {
+ if (pickarg) {
+ if (altmode && mrb_nil_p(*pickarg)) {
*datap = 0;
}
else {
- *datap = mrb_data_get_ptr(mrb, dd, type);
+ *datap = mrb_data_get_ptr(mrb, *pickarg, type);
}
}
}
@@ -1234,7 +1221,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_bool *p;
p = va_arg(ap, mrb_bool*);
- *p = given;
+ *p = pickarg ? TRUE : FALSE;
}
break;
@@ -1288,7 +1275,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_raise(mrb, E_ARGUMENT_ERROR, "keyword number is too large");
}
- for (j = required; j > 0; j --, kname ++, values ++) {
+ for (j = required; j > 0; j--, kname++, values++) {
mrb_value k = mrb_symbol_value(*kname);
if (!mrb_hash_key_p(mrb, ksrc, k)) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "missing keyword: %n", *kname);
@@ -1297,7 +1284,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_gc_protect(mrb, *values);
}
- for (j = kwnum - required; j > 0; j --, kname ++, values ++) {
+ for (j = kwnum - required; j > 0; j--, kname++, values++) {
mrb_value k = mrb_symbol_value(*kname);
if (mrb_hash_key_p(mrb, ksrc, k)) {
*values = mrb_hash_delete_key(mrb, ksrc, k);
@@ -1328,8 +1315,6 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
}
}
-#undef ARGV
-
if (!c && argc > i) {
mrb_argnum_error(mrb, argc, argc_min, argc_max);
}
@@ -1344,7 +1329,7 @@ boot_defclass(mrb_state *mrb, struct RClass *super)
{
struct RClass *c;
- c = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_CLASS, mrb->class_class);
+ c = MRB_OBJ_ALLOC(mrb, MRB_TT_CLASS, mrb->class_class);
if (super) {
c->super = super;
mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)super);
@@ -1367,7 +1352,7 @@ boot_initmod(mrb_state *mrb, struct RClass *mod)
static struct RClass*
include_class_new(mrb_state *mrb, struct RClass *m, struct RClass *super)
{
- struct RClass *ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class);
+ struct RClass *ic = MRB_OBJ_ALLOC(mrb, MRB_TT_ICLASS, mrb->class_class);
if (m->tt == MRB_TT_ICLASS) {
m = m->c;
}
@@ -1435,7 +1420,7 @@ fix_include_module(mrb_state *mrb, struct RBasic *obj, void *data)
{
struct RClass **m = (struct RClass**)data;
- if (obj->tt == MRB_TT_ICLASS && obj->c == m[0] && (obj->flags & MRB_FL_CLASS_IS_ORIGIN) == 0) {
+ if (obj->tt == MRB_TT_ICLASS && obj->c == m[0] && !MRB_FLAG_TEST(obj, MRB_FL_CLASS_IS_ORIGIN)) {
struct RClass *ic = (struct RClass*)obj;
include_module_at(mrb, ic, ic, m[1], 1);
}
@@ -1498,7 +1483,7 @@ mrb_prepend_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
else {
c0 = c;
}
- origin = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, c0);
+ origin = MRB_OBJ_ALLOC(mrb, MRB_TT_ICLASS, c0);
origin->flags |= MRB_FL_CLASS_IS_ORIGIN | MRB_FL_CLASS_IS_INHERITED;
origin->super = c->super;
c->super = origin;
@@ -1713,7 +1698,11 @@ mrb_define_module_function(mrb_state *mrb, struct RClass *c, const char *name, m
static void
mc_clear(mrb_state *mrb)
{
- memset(mrb->cache, 0, MRB_METHOD_CACHE_SIZE*sizeof(mrb->cache[0]));
+ static const struct mrb_cache_entry ce_zero ={0};
+
+ for (int i=0; i<MRB_METHOD_CACHE_SIZE; i++) {
+ mrb->cache[i] = ce_zero;
+ }
}
void
@@ -2169,7 +2158,7 @@ mrb_class_new(mrb_state *mrb, struct RClass *super)
MRB_API struct RClass*
mrb_module_new(mrb_state *mrb)
{
- struct RClass *m = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_MODULE, mrb->module_class);
+ struct RClass *m = MRB_OBJ_ALLOC(mrb, MRB_TT_MODULE, mrb->module_class);
boot_initmod(mrb, m);
return m;
}
@@ -2197,6 +2186,7 @@ mrb_obj_class(mrb_state *mrb, mrb_value obj)
MRB_API void
mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
{
+ if (a == b) return;
mrb_method_t m = mrb_method_search(mrb, c, b);
if (!MRB_METHOD_CFUNC_P(m)) {
@@ -2207,7 +2197,7 @@ mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
}
else if (p->color != MRB_GC_RED) {
struct RClass *tc = MRB_PROC_TARGET_CLASS(p);
- struct REnv *e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL);
+ struct REnv *e = MRB_OBJ_ALLOC(mrb, MRB_TT_ENV, NULL);
e->mid = b;
if (tc) {
@@ -2216,6 +2206,7 @@ mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
}
p->e.env = e;
p->flags |= MRB_PROC_ENVSET;
+ mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)e);
}
}
mrb_define_method_raw(mrb, c, a, m);
@@ -2269,6 +2260,8 @@ mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
}
}
+void mrb_method_added(mrb_state *mrb, struct RClass *c, mrb_sym mid);
+
static mrb_value
mrb_mod_alias(mrb_state *mrb, mrb_value mod)
{
@@ -2277,6 +2270,7 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod)
mrb_get_args(mrb, "nn", &new_name, &old_name);
mrb_alias_method(mrb, c, new_name, old_name);
+ mrb_method_added(mrb, c, new_name);
return mod;
}
@@ -2389,7 +2383,7 @@ mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
}
/* const get with class path string */
- path = mrb_ensure_string_type(mrb, path);
+ mrb_ensure_string_type(mrb, path);
ptr = RSTRING_PTR(path);
len = RSTRING_LEN(path);
off = 0;
@@ -2445,6 +2439,7 @@ mrb_mod_const_missing(mrb_state *mrb, mrb_value mod)
mrb_sym sym;
mrb_get_args(mrb, "n", &sym);
+ mrb->c->ci->mid = 0;
if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) {
mrb_name_error(mrb, sym, "uninitialized constant %v::%n", mod, sym);
@@ -2492,6 +2487,22 @@ mrb_mod_method_defined(mrb_state *mrb, mrb_value mod)
return mrb_bool_value(mrb_obj_respond_to(mrb, mrb_class_ptr(mod), id));
}
+void
+mrb_method_added(mrb_state *mrb, struct RClass *c, mrb_sym mid)
+{
+ mrb_sym added;
+ mrb_value recv = mrb_obj_value(c);
+
+ if (c->tt == MRB_TT_SCLASS) {
+ added = MRB_SYM(singleton_method_added);
+ recv = mrb_iv_get(mrb, recv, MRB_SYM(__attached__));
+ }
+ else {
+ added = MRB_SYM(method_added);
+ }
+ mrb_funcall_id(mrb, recv, added, 1, mrb_symbol_value(mid));
+}
+
mrb_value
mrb_mod_define_method_m(mrb_state *mrb, struct RClass *c)
{
@@ -2516,11 +2527,12 @@ mrb_mod_define_method_m(mrb_state *mrb, struct RClass *c)
if (mrb_nil_p(blk)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
}
- p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ p = MRB_OBJ_ALLOC(mrb, MRB_TT_PROC, mrb->proc_class);
mrb_proc_copy(p, mrb_proc_ptr(blk));
p->flags |= MRB_PROC_STRICT;
MRB_METHOD_FROM_PROC(m, p);
mrb_define_method_raw(mrb, c, mid, m);
+ mrb_method_added(mrb, c, mid);
return mrb_symbol_value(mid);
}
@@ -2879,6 +2891,7 @@ mrb_init_class(mrb_state *mrb)
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 */
mrb_define_method(mrb, bob, "instance_eval", mrb_obj_instance_eval, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); /* 15.3.1.3.18 */
+ mrb_define_method(mrb, bob, "singleton_method_added", mrb_bob_init, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK());
mrb_define_method(mrb, cls, "allocate", mrb_instance_alloc, MRB_ARGS_NONE());
@@ -2919,13 +2932,14 @@ mrb_init_class(mrb_state *mrb)
mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_ARG(1,1));
mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1)); /* 15.2.2.4.7 */
mrb_define_method(mrb, mod, "dup", mrb_mod_dup, MRB_ARGS_NONE());
+ mrb_define_method(mrb, bob, "method_added", mrb_bob_init, MRB_ARGS_REQ(1));
mrb_undef_method(mrb, cls, "append_features");
mrb_undef_method(mrb, cls, "prepend_features");
mrb_undef_method(mrb, cls, "extend_object");
mrb_undef_method(mrb, cls, "module_function");
- mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);
+ mrb->top_self = MRB_OBJ_ALLOC(mrb, MRB_TT_OBJECT, mrb->object_class);
mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());
mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());
mrb_define_singleton_method(mrb, mrb->top_self, "define_method", top_define_method, MRB_ARGS_ARG(1,1));
diff --git a/src/codedump.c b/src/codedump.c
index f382bb7eb..431771ca9 100644
--- a/src/codedump.c
+++ b/src/codedump.c
@@ -57,7 +57,7 @@ print_header(mrb_state *mrb, const mrb_irep *irep, uint32_t i)
printf("%03d ", (int)i);
}
-#define CASE(insn,ops) case insn: FETCH_ ## ops ();
+#define CASE(insn,ops) case insn: FETCH_ ## ops (); L_ ## insn
static void
codedump(mrb_state *mrb, const mrb_irep *irep)
@@ -68,7 +68,7 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
const char *file = NULL, *next_file;
if (!irep) return;
- printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d iseq=%d\n", (void*)irep,
+ printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d ilen=%d\n", (void*)irep,
irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen, (int)irep->ilen);
if (irep->lv) {
@@ -128,23 +128,21 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
print_header(mrb, irep, (uint32_t)i);
ins = READ_B();
switch (ins) {
- CASE(OP_NOP, Z);
+ CASE(OP_NOP, Z):
printf("OP_NOP\n");
break;
- CASE(OP_MOVE, BB);
+ CASE(OP_MOVE, BB):
printf("OP_MOVE\tR%d\tR%d\t", a, b);
print_lv_ab(mrb, irep, a, b);
break;
- CASE(OP_LOADL16, BS);
- goto op_loadl;
- CASE(OP_LOADL, BB);
- op_loadl:
+
+ CASE(OP_LOADL, BB):
switch (irep->pool[b].tt) {
- case IREP_TT_FLOAT:
#ifndef MRB_NO_FLOAT
+ case IREP_TT_FLOAT:
printf("OP_LOADL\tR%d\tL(%d)\t; %f", a, b, (double)irep->pool[b].u.f);
-#endif
break;
+#endif
case IREP_TT_INT32:
printf("OP_LOADL\tR%d\tL(%d)\t; %" PRId32, a, b, irep->pool[b].u.i32);
break;
@@ -159,160 +157,160 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
}
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADI, BB);
+ CASE(OP_LOADI, BB):
printf("OP_LOADI\tR%d\t%d\t", a, b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADINEG, BB);
+ CASE(OP_LOADINEG, BB):
printf("OP_LOADI\tR%d\t-%d\t", a, b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADI16, BS);
+ 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_LOADI32, BSS);
+ CASE(OP_LOADI32, BSS):
printf("OP_LOADI32\tR%d\t%d\t", a, (int32_t)(((uint32_t)b<<16)+c));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADI__1, B);
+ CASE(OP_LOADI__1, B):
printf("OP_LOADI__1\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADI_0, B); goto L_LOADI;
- CASE(OP_LOADI_1, B); goto L_LOADI;
- CASE(OP_LOADI_2, B); goto L_LOADI;
- CASE(OP_LOADI_3, B); goto L_LOADI;
- CASE(OP_LOADI_4, B); goto L_LOADI;
- CASE(OP_LOADI_5, B); goto L_LOADI;
- CASE(OP_LOADI_6, B); goto L_LOADI;
- CASE(OP_LOADI_7, B);
+ CASE(OP_LOADI_0, B): goto L_LOADI;
+ CASE(OP_LOADI_1, B): goto L_LOADI;
+ CASE(OP_LOADI_2, B): goto L_LOADI;
+ CASE(OP_LOADI_3, B): goto L_LOADI;
+ CASE(OP_LOADI_4, B): goto L_LOADI;
+ CASE(OP_LOADI_5, B): goto L_LOADI;
+ CASE(OP_LOADI_6, B): goto L_LOADI;
+ CASE(OP_LOADI_7, B):
L_LOADI:
printf("OP_LOADI_%d\tR%d\t\t", ins-(int)OP_LOADI_0, a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADSYM16, BS);
- goto op_loadsym;
- CASE(OP_LOADSYM, BB);
- op_loadsym:
+ CASE(OP_LOADSYM, BB):
printf("OP_LOADSYM\tR%d\t:%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADNIL, B);
+ CASE(OP_LOADNIL, B):
printf("OP_LOADNIL\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADSELF, B);
+ CASE(OP_LOADSELF, B):
printf("OP_LOADSELF\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADT, B);
+ CASE(OP_LOADT, B):
printf("OP_LOADT\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LOADF, B);
+ CASE(OP_LOADF, B):
printf("OP_LOADF\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_GETGV, BB);
- printf("OP_GETGV\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b]));
+ CASE(OP_GETGV, BB):
+ printf("OP_GETGV\tR%d\t%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SETGV, BB);
- printf("OP_SETGV\t:%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a);
+ CASE(OP_SETGV, BB):
+ printf("OP_SETGV\t%s\tR%d\t", mrb_sym_dump(mrb, irep->syms[b]), a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_GETSV, BB);
- printf("OP_GETSV\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b]));
+ CASE(OP_GETSV, BB):
+ printf("OP_GETSV\tR%d\t%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SETSV, BB);
- printf("OP_SETSV\t:%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a);
+ CASE(OP_SETSV, BB):
+ printf("OP_SETSV\t%s\tR%d\t", mrb_sym_dump(mrb, irep->syms[b]), a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_GETCONST, BB);
- printf("OP_GETCONST\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b]));
+ CASE(OP_GETCONST, BB):
+ printf("OP_GETCONST\tR%d\t%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SETCONST, BB);
- printf("OP_SETCONST\t:%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a);
+ CASE(OP_SETCONST, BB):
+ printf("OP_SETCONST\t%s\tR%d\t", mrb_sym_dump(mrb, irep->syms[b]), a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_GETMCNST, BB);
- printf("OP_GETMCNST\tR%d\tR%d::%s", a, a, mrb_sym_dump(mrb, irep->syms[b]));
+ CASE(OP_GETMCNST, BB):
+ printf("OP_GETMCNST\tR%d\tR%d::%s\t", a, a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SETMCNST, BB);
- printf("OP_SETMCNST\tR%d::%s\tR%d", a+1, mrb_sym_dump(mrb, irep->syms[b]), a);
+ CASE(OP_SETMCNST, BB):
+ printf("OP_SETMCNST\tR%d::%s\tR%d\t", a+1, mrb_sym_dump(mrb, irep->syms[b]), a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_GETIV, BB);
- printf("OP_GETIV\tR%d\t%s", a, mrb_sym_dump(mrb, irep->syms[b]));
+ CASE(OP_GETIV, BB):
+ printf("OP_GETIV\tR%d\t%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SETIV, BB);
- printf("OP_SETIV\t%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a);
+ CASE(OP_SETIV, BB):
+ printf("OP_SETIV\t%s\tR%d\t", mrb_sym_dump(mrb, irep->syms[b]), a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_GETUPVAR, BBB);
- printf("OP_GETUPVAR\tR%d\t%d\t%d", a, b, c);
+ CASE(OP_GETUPVAR, BBB):
+ printf("OP_GETUPVAR\tR%d\t%d\t%d\t", a, b, c);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SETUPVAR, BBB);
- printf("OP_SETUPVAR\tR%d\t%d\t%d", a, b, c);
+ CASE(OP_SETUPVAR, BBB):
+ printf("OP_SETUPVAR\tR%d\t%d\t%d\t", a, b, c);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_GETCV, BB);
- printf("OP_GETCV\tR%d\t%s", a, mrb_sym_dump(mrb, irep->syms[b]));
+ CASE(OP_GETCV, BB):
+ printf("OP_GETCV\tR%d\t%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SETCV, BB);
- printf("OP_SETCV\t%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a);
+ CASE(OP_SETCV, BB):
+ printf("OP_SETCV\t%s\tR%d\t", mrb_sym_dump(mrb, irep->syms[b]), a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_JMP, S);
+ CASE(OP_JMP, S):
i = pc - irep->iseq;
printf("OP_JMP\t\t%03d\n", (int)i+(int16_t)a);
break;
- CASE(OP_JMPUW, S);
+ CASE(OP_JMPUW, S):
i = pc - irep->iseq;
printf("OP_JMPUW\t\t%03d\n", (int)i+(int16_t)a);
break;
- CASE(OP_JMPIF, BS);
+ CASE(OP_JMPIF, BS):
i = pc - irep->iseq;
printf("OP_JMPIF\tR%d\t%03d\t", a, (int)i+(int16_t)b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_JMPNOT, BS);
+ CASE(OP_JMPNOT, BS):
i = pc - irep->iseq;
printf("OP_JMPNOT\tR%d\t%03d\t", a, (int)i+(int16_t)b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_JMPNIL, BS);
+ CASE(OP_JMPNIL, BS):
i = pc - irep->iseq;
printf("OP_JMPNIL\tR%d\t%03d\t", a, (int)i+(int16_t)b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SENDV, BB);
+ CASE(OP_SENDV, BB):
printf("OP_SENDV\tR%d\t:%s\n", a, mrb_sym_dump(mrb, irep->syms[b]));
break;
- CASE(OP_SENDVB, BB);
+ CASE(OP_SENDVB, BB):
printf("OP_SENDVB\tR%d\t:%s\n", a, mrb_sym_dump(mrb, irep->syms[b]));
break;
- CASE(OP_SEND, BBB);
+ CASE(OP_SEND, BBB):
printf("OP_SEND\tR%d\t:%s\t%d\n", a, mrb_sym_dump(mrb, irep->syms[b]), c);
break;
- CASE(OP_SENDB, BBB);
+ CASE(OP_SENDB, BBB):
printf("OP_SENDB\tR%d\t:%s\t%d\n", a, mrb_sym_dump(mrb, irep->syms[b]), c);
break;
- CASE(OP_CALL, Z);
+ CASE(OP_SENDVK, BB):
+ printf("OP_SENDVK\tR%d\t:%s\n", a, mrb_sym_dump(mrb, irep->syms[b]));
+ break;
+ CASE(OP_CALL, Z):
printf("OP_CALL\n");
break;
- CASE(OP_SUPER, BB);
+ CASE(OP_SUPER, BB):
printf("OP_SUPER\tR%d\t%d\n", a, b);
break;
- CASE(OP_ARGARY, BS);
- printf("OP_ARGARY\tR%d\t%d:%d:%d:%d (%d)", a,
+ CASE(OP_ARGARY, BS):
+ printf("OP_ARGARY\tR%d\t%d:%d:%d:%d (%d)\t", a,
(b>>11)&0x3f,
(b>>10)&0x1,
(b>>5)&0x1f,
@@ -320,7 +318,7 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
(b>>0)&0xf);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_ENTER, W);
+ CASE(OP_ENTER, W):
printf("OP_ENTER\t%d:%d:%d:%d:%d:%d:%d\n",
MRB_ASPEC_REQ(a),
MRB_ASPEC_OPT(a),
@@ -330,31 +328,31 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
MRB_ASPEC_KDICT(a),
MRB_ASPEC_BLOCK(a));
break;
- CASE(OP_KEY_P, BB);
+ CASE(OP_KEY_P, BB):
printf("OP_KEY_P\tR%d\t:%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_KEYEND, Z);
+ CASE(OP_KEYEND, Z):
printf("OP_KEYEND\n");
break;
- CASE(OP_KARG, BB);
+ CASE(OP_KARG, BB):
printf("OP_KARG\tR%d\t:%s\t", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_RETURN, B);
+ CASE(OP_RETURN, B):
printf("OP_RETURN\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_RETURN_BLK, B);
+ CASE(OP_RETURN_BLK, B):
printf("OP_RETURN_BLK\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_BREAK, B);
+ CASE(OP_BREAK, B):
printf("OP_BREAK\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_BLKPUSH, BS);
- printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d (%d)", a,
+ CASE(OP_BLKPUSH, BS):
+ printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d (%d)\t", a,
(b>>11)&0x3f,
(b>>10)&0x1,
(b>>5)&0x1f,
@@ -362,112 +360,108 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
(b>>0)&0xf);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_LAMBDA, BB);
- printf("OP_LAMBDA\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
- break;
- CASE(OP_BLOCK, BB);
- printf("OP_BLOCK\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
- break;
- CASE(OP_METHOD, BB);
- printf("OP_METHOD\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
- break;
- CASE(OP_LAMBDA16, BS);
+ CASE(OP_LAMBDA, BB):
printf("OP_LAMBDA\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
break;
- CASE(OP_BLOCK16, BS);
+ CASE(OP_BLOCK, BB):
printf("OP_BLOCK\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
break;
- CASE(OP_METHOD16, BS);
+ CASE(OP_METHOD, BB):
printf("OP_METHOD\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
break;
- CASE(OP_RANGE_INC, B);
+ CASE(OP_RANGE_INC, B):
printf("OP_RANGE_INC\tR%d\n", a);
break;
- CASE(OP_RANGE_EXC, B);
+ CASE(OP_RANGE_EXC, B):
printf("OP_RANGE_EXC\tR%d\n", a);
break;
- CASE(OP_DEF, BB);
+ CASE(OP_DEF, BB):
printf("OP_DEF\tR%d\t:%s\n", a, mrb_sym_dump(mrb, irep->syms[b]));
break;
- CASE(OP_UNDEF, B);
+ CASE(OP_UNDEF, B):
printf("OP_UNDEF\t:%s\n", mrb_sym_dump(mrb, irep->syms[a]));
break;
- CASE(OP_ALIAS, BB);
+ CASE(OP_ALIAS, BB):
printf("OP_ALIAS\t:%s\t%s\n", mrb_sym_dump(mrb, irep->syms[a]), mrb_sym_dump(mrb, irep->syms[b]));
break;
- CASE(OP_ADD, B);
+ CASE(OP_ADD, B):
printf("OP_ADD\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_ADDI, BB);
- printf("OP_ADDI\tR%d\t%d\n", a, b);
+ CASE(OP_ADDI, BB):
+ printf("OP_ADDI\tR%d\t%d\t", a, b);
+ print_lv_a(mrb, irep, a);
break;
- CASE(OP_SUB, B);
+ CASE(OP_SUB, B):
printf("OP_SUB\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_SUBI, BB);
- printf("OP_SUBI\tR%d\t%d\n", a, b);
+ CASE(OP_SUBI, BB):
+ printf("OP_SUBI\tR%d\t%d\t", a, b);
+ print_lv_a(mrb, irep, a);
break;
- CASE(OP_MUL, B);
+ CASE(OP_MUL, B):
printf("OP_MUL\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_DIV, B);
+ CASE(OP_DIV, B):
printf("OP_DIV\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_LT, B);
+ CASE(OP_LT, B):
printf("OP_LT\t\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_LE, B);
+ CASE(OP_LE, B):
printf("OP_LE\t\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_GT, B);
+ CASE(OP_GT, B):
printf("OP_GT\t\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_GE, B);
+ CASE(OP_GE, B):
printf("OP_GE\t\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_EQ, B);
+ CASE(OP_EQ, B):
printf("OP_EQ\t\tR%d\tR%d\n", a, a+1);
break;
- CASE(OP_ARRAY, BB);
+ CASE(OP_ARRAY, BB):
printf("OP_ARRAY\tR%d\t%d\t", a, b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_ARRAY2, BBB);
+ CASE(OP_ARRAY2, BBB):
printf("OP_ARRAY\tR%d\tR%d\t%d\t", a, b, c);
print_lv_ab(mrb, irep, a, b);
break;
- CASE(OP_ARYCAT, B);
- printf("OP_ARYCAT\tR%d\t", a);
+ CASE(OP_ARYCAT, B):
+ printf("OP_ARYCAT\tR%d\tR%d\t", a, a+1);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_ARYPUSH, B);
- printf("OP_ARYPUSH\tR%d\t", a);
+ CASE(OP_ARYPUSH, BB):
+ printf("OP_ARYPUSH\tR%d\t%d\t", a, b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_ARYDUP, B);
+ CASE(OP_ARYDUP, B):
printf("OP_ARYDUP\tR%d\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_AREF, BBB);
+ CASE(OP_AREF, BBB):
printf("OP_AREF\tR%d\tR%d\t%d", a, b, c);
print_lv_ab(mrb, irep, a, b);
break;
- CASE(OP_ASET, BBB);
+ CASE(OP_ASET, BBB):
printf("OP_ASET\tR%d\tR%d\t%d", a, b, c);
print_lv_ab(mrb, irep, a, b);
break;
- CASE(OP_APOST, BBB);
+ CASE(OP_APOST, BBB):
printf("OP_APOST\tR%d\t%d\t%d", a, b, c);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_INTERN, B);
- printf("OP_INTERN\tR%d", a);
+ CASE(OP_INTERN, B):
+ printf("OP_INTERN\tR%d\t\t", a);
+ print_lv_a(mrb, irep, a);
+ break;
+ CASE(OP_SYMBOL, BB):
+ mrb_assert((irep->pool[b].tt&IREP_TT_NFLAG)==0);
+ printf("OP_SYMBOL\tR%d\tL(%d)\t; %s", a, b, irep->pool[b].u.str);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_STRING16, BS);
- goto op_string;
- CASE(OP_STRING, BB);
- op_string:
+ CASE(OP_STRING, BB):
+ mrb_assert((irep->pool[b].tt&IREP_TT_NFLAG)==0);
if ((irep->pool[b].tt & IREP_TT_NFLAG) == 0) {
printf("OP_STRING\tR%d\tL(%d)\t; %s", a, b, irep->pool[b].u.str);
}
@@ -476,48 +470,48 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
}
print_lv_a(mrb, irep, a);
break;
- CASE(OP_STRCAT, B);
- printf("OP_STRCAT\tR%d\t", a);
+ CASE(OP_STRCAT, B):
+ printf("OP_STRCAT\tR%d\tR%d\n", a, a+1);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_HASH, BB);
+ CASE(OP_HASH, BB):
printf("OP_HASH\tR%d\t%d\t", a, b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_HASHADD, BB);
+ CASE(OP_HASHADD, BB):
printf("OP_HASHADD\tR%d\t%d\t", a, b);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_HASHCAT, B);
+ CASE(OP_HASHCAT, B):
printf("OP_HASHCAT\tR%d\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_OCLASS, B);
+ CASE(OP_OCLASS, B):
printf("OP_OCLASS\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_CLASS, BB);
+ CASE(OP_CLASS, BB):
printf("OP_CLASS\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_MODULE, BB);
+ CASE(OP_MODULE, BB):
printf("OP_MODULE\tR%d\t:%s", a, mrb_sym_dump(mrb, irep->syms[b]));
print_lv_a(mrb, irep, a);
break;
- CASE(OP_EXEC, BB);
+ CASE(OP_EXEC, BB):
printf("OP_EXEC\tR%d\tI(%d:%p)", a, b, (void*)irep->reps[b]);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_SCLASS, B);
+ CASE(OP_SCLASS, B):
printf("OP_SCLASS\tR%d\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_TCLASS, B);
+ CASE(OP_TCLASS, B):
printf("OP_TCLASS\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_ERR, B);
+ CASE(OP_ERR, B):
if ((irep->pool[a].tt & IREP_TT_NFLAG) == 0) {
printf("OP_ERR\t%s\n", irep->pool[a].u.str);
}
@@ -525,27 +519,52 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
printf("OP_ERR\tL(%d)\n", a);
}
break;
- CASE(OP_EXCEPT, B);
+ CASE(OP_EXCEPT, B):
printf("OP_EXCEPT\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_RESCUE, BB);
+ CASE(OP_RESCUE, BB):
printf("OP_RESCUE\tR%d\tR%d", a, b);
print_lv_ab(mrb, irep, a, b);
break;
- CASE(OP_RAISEIF, B);
+ CASE(OP_RAISEIF, B):
printf("OP_RAISEIF\tR%d\t\t", a);
print_lv_a(mrb, irep, a);
break;
- CASE(OP_DEBUG, BBB);
+ CASE(OP_DEBUG, BBB):
printf("OP_DEBUG\t%d\t%d\t%d\n", a, b, c);
break;
- CASE(OP_STOP, Z);
+ CASE(OP_STOP, Z):
printf("OP_STOP\n");
break;
+ CASE(OP_EXT1, Z):
+ ins = READ_B();
+ switch (ins) {
+#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _1 (); goto L_OP_ ## i;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ break;
+ CASE(OP_EXT2, Z):
+ ins = READ_B();
+ switch (ins) {
+#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _2 (); goto L_OP_ ## i;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ break;
+ CASE(OP_EXT3, Z):
+ ins = READ_B();
+ switch (ins) {
+#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _3 (); goto L_OP_ ## i;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ break;
+
default:
printf("OP_unknown (0x%x)\n", ins);
break;
diff --git a/src/debug.c b/src/debug.c
index c03c91cf5..e570e8068 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -35,19 +35,46 @@ get_file(mrb_irep_debug_info *info, uint32_t pc)
return *ret;
}
-static mrb_debug_line_type
-select_line_type(const uint16_t *lines, size_t lines_len)
+size_t
+mrb_packed_int_len(uint32_t num)
{
- size_t line_count = 0;
- int prev_line = -1;
- size_t i;
- for (i = 0; i < lines_len; ++i) {
- if (lines[i] != prev_line) {
- ++line_count;
- }
- }
- return (sizeof(uint16_t) * lines_len) <= (sizeof(mrb_irep_debug_info_line) * line_count)
- ? mrb_debug_line_ary : mrb_debug_line_flat_map;
+ size_t llen = 0;
+
+ do {
+ llen++;
+ } while (num >>= 7);
+ return llen;
+}
+
+size_t
+mrb_packed_int_encode(uint32_t num, uint8_t *p, uint8_t *pend)
+{
+ size_t llen = 0;
+
+ do {
+ uint8_t byte = num & 0x7f;
+ num >>= 7;
+ if (num != 0) byte |= 0x80;
+ if (p < pend) *p++ = byte;
+ llen++;
+ } while (num != 0);
+
+ return llen;
+}
+
+uint32_t
+mrb_packed_int_decode(uint8_t *p, uint8_t **newpos)
+{
+ size_t i = 0, shift = 0;
+ uint32_t n = 0;
+
+ do {
+ n |= ((uint32_t)(p[i] & 0x7f)) << shift;
+ i++;
+ shift += 7;
+ } while (shift < sizeof(uint32_t) * 8 && (p[i - 1] & 0x80));
+ if (newpos) *newpos = p + i;
+ return n;
}
MRB_API char const*
@@ -102,6 +129,19 @@ mrb_debug_get_line(mrb_state *mrb, const mrb_irep *irep, uint32_t pc)
return ret->line;
}
+
+ case mrb_debug_line_packed_map: {
+ uint8_t *p = f->lines.packed_map;
+ uint8_t *pend = p + f->line_entry_count;
+ uint32_t pos = 0, line = 0, line_diff;
+ while (p < pend) {
+ pos += mrb_packed_int_decode(p, &p);
+ line_diff = mrb_packed_int_decode(p, &p);
+ if (pc < pos) break;
+ line += line_diff;
+ }
+ return line;
+ }
}
}
}
@@ -144,10 +184,7 @@ mrb_debug_info_append_file(mrb_state *mrb, mrb_irep_debug_info *d,
}
f = (mrb_irep_debug_info_file*)mrb_malloc(mrb, sizeof(*f));
- d->files = (mrb_irep_debug_info_file**)(
- d->files
- ? mrb_realloc(mrb, d->files, sizeof(mrb_irep_debug_info_file*) * (d->flen + 1))
- : mrb_malloc(mrb, sizeof(mrb_irep_debug_info_file*)));
+ d->files = (mrb_irep_debug_info_file**)mrb_realloc(mrb, d->files, sizeof(mrb_irep_debug_info_file*) * (d->flen + 1));
d->files[d->flen++] = f;
file_pc_count = end_pos - start_pos;
@@ -157,42 +194,32 @@ mrb_debug_info_append_file(mrb_state *mrb, mrb_irep_debug_info *d,
fn_len = strlen(filename);
f->filename_sym = mrb_intern(mrb, filename, fn_len);
-
- f->line_type = select_line_type(lines + start_pos, end_pos - start_pos);
+ f->line_type = mrb_debug_line_packed_map;
f->lines.ptr = NULL;
- switch (f->line_type) {
- case mrb_debug_line_ary:
- f->line_entry_count = file_pc_count;
- f->lines.ary = (uint16_t*)mrb_malloc(mrb, sizeof(uint16_t) * file_pc_count);
- for (i = 0; i < file_pc_count; ++i) {
- f->lines.ary[i] = lines[start_pos + i];
- }
- break;
-
- case mrb_debug_line_flat_map: {
- uint16_t prev_line = 0;
- mrb_irep_debug_info_line m;
- f->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info_line) * 1);
- f->line_entry_count = 0;
- for (i = 0; i < file_pc_count; ++i) {
- if (lines[start_pos + i] == prev_line) { continue; }
-
- f->lines.flat_map = (mrb_irep_debug_info_line*)mrb_realloc(
- mrb, f->lines.flat_map,
- sizeof(mrb_irep_debug_info_line) * (f->line_entry_count + 1));
- m.start_pos = start_pos + i;
- m.line = lines[start_pos + i];
- f->lines.flat_map[f->line_entry_count] = m;
-
- /* update */
- ++f->line_entry_count;
- prev_line = lines[start_pos + i];
- }
- } break;
-
- default: mrb_assert(0); break;
+ uint16_t prev_line = 0;
+ uint32_t prev_pc = 0;
+ size_t packed_size = 0;
+ uint8_t *p, *pend;
+
+ for (i = 0; i < file_pc_count; ++i) {
+ if (lines[start_pos + i] == prev_line) continue;
+ packed_size += mrb_packed_int_len(start_pos+i-prev_pc);
+ prev_pc = start_pos+i;
+ packed_size += mrb_packed_int_len(lines[start_pos+i]-prev_line);
+ prev_line = lines[start_pos + i];
+ }
+ p = f->lines.packed_map = (uint8_t*)mrb_malloc(mrb, packed_size);
+ pend = p + packed_size;
+ prev_line = 0; prev_pc = 0;
+ for (i = 0; i < file_pc_count; ++i) {
+ if (lines[start_pos + i] == prev_line) continue;
+ p += mrb_packed_int_encode(start_pos+i-prev_pc, p, pend);
+ prev_pc = start_pos + i;
+ p += mrb_packed_int_encode(lines[start_pos + i]-prev_line, p, pend);
+ prev_line = lines[start_pos + i];
}
+ f->line_entry_count = (uint32_t)packed_size;
return f;
}
diff --git a/src/dump.c b/src/dump.c
index 91edf17d3..4327cb375 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -1,20 +1,18 @@
/*
-** dump.c - mruby binary dumper (mrbc binary format)
+** cdump.c - mruby binary dumper (in C)
**
** See Copyright Notice in mruby.h
*/
-#include <string.h>
-#include <limits.h>
-#include <math.h>
+#include <mruby.h>
#include <mruby/dump.h>
#include <mruby/string.h>
#include <mruby/irep.h>
#include <mruby/debug.h>
+#include <string.h>
#ifndef MRB_NO_FLOAT
#include <mruby/endian.h>
-#define MRB_FLOAT_FMT "%.17g"
#endif
static size_t get_irep_record_size_1(mrb_state *mrb, const mrb_irep *irep);
@@ -414,6 +412,10 @@ get_debug_record_size(mrb_state *mrb, const mrb_irep *irep)
ret += (sizeof(uint32_t) + sizeof(uint16_t)) * (size_t)(file->line_entry_count);
break;
+ case mrb_debug_line_packed_map:
+ ret += (size_t)(file->line_entry_count);
+ break;
+
default: mrb_assert(0); break;
}
}
@@ -508,6 +510,11 @@ write_debug_record_1(mrb_state *mrb, const mrb_irep *irep, uint8_t *bin, mrb_sym
}
} break;
+ case mrb_debug_line_packed_map: {
+ memcpy(cur, file->lines.packed_map, file->line_entry_count);
+ cur += file->line_entry_count;
+ } break;
+
default: mrb_assert(0); break;
}
}
@@ -929,428 +936,4 @@ mrb_dump_irep_cfunc(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *f
return result;
}
-static int
-dump_pool(mrb_state *mrb, const mrb_pool_value *p, FILE *fp)
-{
- if (p->tt & IREP_TT_NFLAG) { /* number */
- switch (p->tt) {
-#ifdef MRB_64BIT
- case IREP_TT_INT64:
- if (p->u.i64 < INT32_MIN || INT32_MAX < p->u.i64) {
- fprintf(fp, "{IREP_TT_INT64, {.i64=%" PRId64 "}},\n", p->u.i64);
- }
- else {
- fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", (int32_t)p->u.i64);
- }
- break;
-#endif
- case IREP_TT_INT32:
- fprintf(fp, "{IREP_TT_INT32, {.i32=%" PRId32 "}},\n", p->u.i32);
- break;
- case IREP_TT_FLOAT:
-#ifndef MRB_NO_FLOAT
- if (p->u.f == 0) {
- fprintf(fp, "{IREP_TT_FLOAT, {.f=%#.1f}},\n", p->u.f);
- }
- else {
- fprintf(fp, "{IREP_TT_FLOAT, {.f=" MRB_FLOAT_FMT "}},\n", p->u.f);
- }
-#endif
- break;
- case IREP_TT_BIGINT:
- {
- const char *s = p->u.str;
- int len = s[0]+2;
- fputs("{IREP_TT_BIGINT, {\"", fp);
- for (int i=0; i<len; i++) {
- fprintf(fp, "\\x%02x", (int)s[i]&0xff);
- }
- fputs("\"}},\n", fp);
- }
- break;
- }
- }
- else { /* string */
- int i, len = p->tt>>2;
- const char *s = p->u.str;
- fprintf(fp, "{IREP_TT_STR|(%d<<2), {\"", len);
- for (i=0; i<len; i++) {
- fprintf(fp, "\\x%02x", (int)s[i]&0xff);
- }
- fputs("\"}},\n", fp);
- }
- return MRB_DUMP_OK;
-}
-
-static mrb_bool
-sym_name_word_p(const char *name, mrb_int len)
-{
- if (len == 0) return FALSE;
- if (name[0] != '_' && !ISALPHA(name[0])) return FALSE;
- for (int i = 1; i < len; i++) {
- if (name[i] != '_' && !ISALNUM(name[i])) return FALSE;
- }
- return TRUE;
-}
-
-static mrb_bool
-sym_name_with_equal_p(const char *name, mrb_int len)
-{
- return len >= 2 && name[len-1] == '=' && sym_name_word_p(name, len-1);
-}
-
-static mrb_bool
-sym_name_with_question_mark_p(const char *name, mrb_int len)
-{
- return len >= 2 && name[len-1] == '?' && sym_name_word_p(name, len-1);
-}
-
-static mrb_bool
-sym_name_with_bang_p(const char *name, mrb_int len)
-{
- return len >= 2 && name[len-1] == '!' && sym_name_word_p(name, len-1);
-}
-
-static mrb_bool
-sym_name_ivar_p(const char *name, mrb_int len)
-{
- return len >= 2 && name[0] == '@' && sym_name_word_p(name+1, len-1);
-}
-
-static mrb_bool
-sym_name_cvar_p(const char *name, mrb_int len)
-{
- return len >= 3 && name[0] == '@' && sym_name_ivar_p(name+1, len-1);
-}
-
-#define OPERATOR_SYMBOL(sym_name, name) {name, sym_name, sizeof(sym_name)-1}
-struct operator_symbol {
- const char *name;
- const char *sym_name;
- uint16_t sym_name_len;
-};
-static const struct operator_symbol operator_table[] = {
- OPERATOR_SYMBOL("!", "not"),
- OPERATOR_SYMBOL("%", "mod"),
- OPERATOR_SYMBOL("&", "and"),
- OPERATOR_SYMBOL("*", "mul"),
- OPERATOR_SYMBOL("+", "add"),
- OPERATOR_SYMBOL("-", "sub"),
- OPERATOR_SYMBOL("/", "div"),
- OPERATOR_SYMBOL("<", "lt"),
- OPERATOR_SYMBOL(">", "gt"),
- OPERATOR_SYMBOL("^", "xor"),
- OPERATOR_SYMBOL("`", "tick"),
- OPERATOR_SYMBOL("|", "or"),
- OPERATOR_SYMBOL("~", "neg"),
- OPERATOR_SYMBOL("!=", "neq"),
- OPERATOR_SYMBOL("!~", "nmatch"),
- OPERATOR_SYMBOL("&&", "andand"),
- OPERATOR_SYMBOL("**", "pow"),
- OPERATOR_SYMBOL("+@", "plus"),
- OPERATOR_SYMBOL("-@", "minus"),
- OPERATOR_SYMBOL("<<", "lshift"),
- OPERATOR_SYMBOL("<=", "le"),
- OPERATOR_SYMBOL("==", "eq"),
- OPERATOR_SYMBOL("=~", "match"),
- OPERATOR_SYMBOL(">=", "ge"),
- OPERATOR_SYMBOL(">>", "rshift"),
- OPERATOR_SYMBOL("[]", "aref"),
- OPERATOR_SYMBOL("||", "oror"),
- OPERATOR_SYMBOL("<=>", "cmp"),
- OPERATOR_SYMBOL("===", "eqq"),
- OPERATOR_SYMBOL("[]=", "aset"),
-};
-
-static const char*
-sym_operator_name(const char *sym_name, mrb_int len)
-{
- mrb_sym table_size = sizeof(operator_table)/sizeof(struct operator_symbol);
- if (operator_table[table_size-1].sym_name_len < len) return NULL;
-
- mrb_sym start, idx;
- int cmp;
- const struct operator_symbol *op_sym;
- for (start = 0; table_size != 0; table_size/=2) {
- idx = start+table_size/2;
- op_sym = &operator_table[idx];
- cmp = (int)len-(int)op_sym->sym_name_len;
- if (cmp == 0) {
- cmp = memcmp(sym_name, op_sym->sym_name, len);
- if (cmp == 0) return op_sym->name;
- }
- if (0 < cmp) {
- start = ++idx;
- --table_size;
- }
- }
- return NULL;
-}
-
-static const char*
-sym_var_name(mrb_state *mrb, const char *initname, const char *key, int n)
-{
- char buf[32];
- mrb_value s = mrb_str_new_cstr(mrb, initname);
- mrb_str_cat_lit(mrb, s, "_");
- mrb_str_cat_cstr(mrb, s, key);
- mrb_str_cat_lit(mrb, s, "_");
- snprintf(buf, sizeof(buf), "%d", n);
- mrb_str_cat_cstr(mrb, s, buf);
- return RSTRING_PTR(s);
-}
-
-static int
-dump_sym(mrb_state *mrb, mrb_sym sym, const char *var_name, int idx, mrb_value init_syms_code, FILE *fp)
-{
- if (sym == 0) return MRB_DUMP_INVALID_ARGUMENT;
-
- mrb_int len;
- const char *name = mrb_sym_name_len(mrb, sym, &len), *op_name;
- if (!name) return MRB_DUMP_INVALID_ARGUMENT;
- if (sym_name_word_p(name, len)) {
- fprintf(fp, "MRB_SYM(%s)", name);
- }
- else if (sym_name_with_equal_p(name, len)) {
- fprintf(fp, "MRB_SYM_E(%.*s)", (int)(len-1), name);
- }
- else if (sym_name_with_question_mark_p(name, len)) {
- fprintf(fp, "MRB_SYM_Q(%.*s)", (int)(len-1), name);
- }
- else if (sym_name_with_bang_p(name, len)) {
- fprintf(fp, "MRB_SYM_B(%.*s)", (int)(len-1), name);
- }
- else if (sym_name_ivar_p(name, len)) {
- fprintf(fp, "MRB_IVSYM(%s)", name+1);
- }
- else if (sym_name_cvar_p(name, len)) {
- fprintf(fp, "MRB_CVSYM(%s)", name+2);
- }
- else if ((op_name = sym_operator_name(name, len))) {
- fprintf(fp, "MRB_OPSYM(%s)", op_name);
- }
- else {
- char buf[32];
- mrb_value name_obj = mrb_str_new(mrb, name, len);
- mrb_str_cat_lit(mrb, init_syms_code, " ");
- mrb_str_cat_cstr(mrb, init_syms_code, var_name);
- snprintf(buf, sizeof(buf), "[%d] = ", idx);
- mrb_str_cat_cstr(mrb, init_syms_code, buf);
- mrb_str_cat_lit(mrb, init_syms_code, "mrb_intern_lit(mrb, ");
- mrb_str_cat_str(mrb, init_syms_code, mrb_str_dump(mrb, name_obj));
- mrb_str_cat_lit(mrb, init_syms_code, ");\n");
- fputs("0", fp);
- }
- fputs(", ", fp);
- return MRB_DUMP_OK;
-}
-
-static int
-dump_syms(mrb_state *mrb, const char *name, const char *key, int n, int syms_len, const mrb_sym *syms, mrb_value init_syms_code, FILE *fp)
-{
- int ai = mrb_gc_arena_save(mrb);
- mrb_int code_len = RSTRING_LEN(init_syms_code);
- const char *var_name = sym_var_name(mrb, name, key, n);
- fprintf(fp, "mrb_DEFINE_SYMS_VAR(%s, %d, (", var_name, syms_len);
- for (int i=0; i<syms_len; i++) {
- dump_sym(mrb, syms[i], var_name, i, init_syms_code, fp);
- }
- fputs("), ", fp);
- if (code_len == RSTRING_LEN(init_syms_code)) fputs("const", fp);
- fputs(");\n", fp);
- mrb_gc_arena_restore(mrb, ai);
- return MRB_DUMP_OK;
-}
-
-//Handle the simple/common case of debug_info:
-// - 1 file associated with a single irep
-// - mrb_debug_line_ary format only
-static int
-simple_debug_info(mrb_irep_debug_info *info)
-{
- if (!info ||
- info->flen != 1 ||
- info->files[0]->line_type != mrb_debug_line_ary) {
- return 0;
- }
- return 1;
-}
-
-//Adds debug information to c-structs and
-//adds filenames in init_syms_code block
-static int
-dump_debug(mrb_state *mrb, const char *name, int n, mrb_irep_debug_info *info,
- mrb_value init_syms_code, FILE *fp)
-{
- char buffer[256];
- const char *filename;
- mrb_int file_len;
- int len, i;
-
- if (!simple_debug_info(info))
- return MRB_DUMP_INVALID_IREP;
-
- len = info->files[0]->line_entry_count;
-
- filename = mrb_sym_name_len(mrb, info->files[0]->filename_sym, &file_len);
- snprintf(buffer, sizeof(buffer), " %s_debug_file_%d.filename_sym = mrb_intern_lit(mrb,\"",
- name, n);
- mrb_str_cat_cstr(mrb, init_syms_code, buffer);
- mrb_str_cat_cstr(mrb, init_syms_code, filename);
- mrb_str_cat_cstr(mrb, init_syms_code, "\");\n");
-
- fprintf(fp, "static uint16_t %s_debug_lines_%d[%d] = {", name, n, len);
- for (i=0; i<len; i++) {
- if (i%10 == 0) fputs("\n", fp);
- fprintf(fp, "0x%04x,", info->files[0]->lines.ary[i]);
- }
- fputs("};\n", fp);
-
- fprintf(fp, "static mrb_irep_debug_info_file %s_debug_file_%d = {\n", name, n);
- fprintf(fp, "%d, %d, %d, mrb_debug_line_ary, {%s_debug_lines_%d}};\n",
- info->files[0]->start_pos,
- info->files[0]->filename_sym,
- info->files[0]->line_entry_count,
- name,n);
- fprintf(fp, "static mrb_irep_debug_info_file *%s_debug_file_%d_ = &%s_debug_file_%d;\n", name, n, name, n);
-
- fprintf(fp, "static mrb_irep_debug_info %s_debug_%d = {\n", name, n);
- fprintf(fp, "%d, %d, &%s_debug_file_%d_};\n", info->pc_count, info->flen, name, n);
-
- return MRB_DUMP_OK;
-}
-
-static int
-dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *name, int n, mrb_value init_syms_code, int *mp)
-{
- int i, len;
- int max = *mp;
- int debug_available = 0;
-
- /* dump reps */
- if (irep->reps) {
- for (i=0,len=irep->rlen; i<len; i++) {
- *mp += len;
- if (dump_irep_struct(mrb, irep->reps[i], flags, fp, name, max+i, init_syms_code, mp) != MRB_DUMP_OK)
- return MRB_DUMP_INVALID_ARGUMENT;
- }
- fprintf(fp, "static const mrb_irep *%s_reps_%d[%d] = {\n", name, n, len);
- for (i=0,len=irep->rlen; i<len; i++) {
- fprintf(fp, " &%s_irep_%d,\n", name, max+i);
- }
- fputs("};\n", fp);
- }
- /* dump pool */
- if (irep->pool) {
- len=irep->plen;
- fprintf(fp, "static const mrb_pool_value %s_pool_%d[%d] = {\n", name, n, len);
- for (i=0; i<len; i++) {
- if (dump_pool(mrb, &irep->pool[i], fp) != MRB_DUMP_OK)
- return MRB_DUMP_INVALID_ARGUMENT;
- }
- fputs("};\n", fp);
- }
- /* dump syms */
- if (irep->syms) {
- dump_syms(mrb, name, "syms", n, irep->slen, irep->syms, init_syms_code, fp);
- }
- /* dump iseq */
- len=irep->ilen+sizeof(struct mrb_irep_catch_handler)*irep->clen;
- fprintf(fp, "static const mrb_code %s_iseq_%d[%d] = {", name, n, len);
- for (i=0; i<len; i++) {
- if (i%20 == 0) fputs("\n", fp);
- fprintf(fp, "0x%02x,", irep->iseq[i]);
- }
- fputs("};\n", fp);
- /* dump lv */
- if (irep->lv) {
- dump_syms(mrb, name, "lv", n, irep->nlocals-1, irep->lv, init_syms_code, fp);
- }
- /* dump debug */
- if (flags & MRB_DUMP_DEBUG_INFO) {
- if(dump_debug(mrb, name, n, irep->debug_info,
- init_syms_code, fp) == MRB_DUMP_OK) {
- debug_available = 1;
- }
- }
-
-
- /* dump irep */
- fprintf(fp, "static const mrb_irep %s_irep_%d = {\n", name, n);
- fprintf(fp, " %d,%d,%d,\n", irep->nlocals, irep->nregs, irep->clen);
- fprintf(fp, " MRB_IREP_STATIC,%s_iseq_%d,\n", name, n);
- if (irep->pool) {
- fprintf(fp, " %s_pool_%d,", name, n);
- }
- else {
- fputs( " NULL,", fp);
- }
- if (irep->syms) {
- fprintf(fp, "%s_syms_%d,", name, n);
- }
- else {
- fputs( "NULL,", fp);
- }
- if (irep->reps) {
- fprintf(fp, "%s_reps_%d,\n", name, n);
- }
- else {
- fputs( "NULL,\n", fp);
- }
- if (irep->lv) {
- fprintf(fp, " %s_lv_%d,\n", name, n);
- }
- else {
- fputs( " NULL,\t\t\t\t\t/* lv */\n", fp);
- }
- if(debug_available) {
- fprintf(fp, " &%s_debug_%d,\n", name, n);
- }
- else {
- fputs(" NULL,\t\t\t\t\t/* debug_info */\n", fp);
- }
- fprintf(fp, " %d,%d,%d,%d,0\n};\n", irep->ilen, irep->plen, irep->slen, irep->rlen);
-
- return MRB_DUMP_OK;
-}
-
-int
-mrb_dump_irep_cstruct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *initname)
-{
- if (fp == NULL || initname == NULL || initname[0] == '\0') {
- return MRB_DUMP_INVALID_ARGUMENT;
- }
- if (fprintf(fp, "#include <mruby.h>\n"
- "#include <mruby/irep.h>\n"
- "#include <mruby/debug.h>\n"
- "#include <mruby/proc.h>\n"
- "#include <mruby/presym.h>\n"
- "\n") < 0) {
- return MRB_DUMP_WRITE_FAULT;
- }
- fputs("#define mrb_BRACED(...) {__VA_ARGS__}\n", fp);
- fputs("#define mrb_DEFINE_SYMS_VAR(name, len, syms, qualifier) \\\n", fp);
- fputs(" static qualifier mrb_sym name[len] = mrb_BRACED syms\n", fp);
- fputs("\n", fp);
- mrb_value init_syms_code = mrb_str_new_capa(mrb, 0);
- int max = 1;
- int n = dump_irep_struct(mrb, irep, flags, fp, initname, 0, init_syms_code, &max);
- if (n != MRB_DUMP_OK) return n;
- fprintf(fp,
- "%s\n"
- "const struct RProc %s[] = {{\n",
- (flags & MRB_DUMP_STATIC) ? "static"
- : "#ifdef __cplusplus\n"
- "extern\n"
- "#endif",
- initname);
- fprintf(fp, "NULL,NULL,MRB_TT_PROC,MRB_GC_RED,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname);
- fputs("static void\n", fp);
- fprintf(fp, "%s_init_syms(mrb_state *mrb)\n", initname);
- fputs("{\n", fp);
- fputs(RSTRING_PTR(init_syms_code), fp);
- fputs("}\n", fp);
- return MRB_DUMP_OK;
-}
-
#endif /* MRB_NO_STDIO */
diff --git a/src/error.c b/src/error.c
index 5d9b367bd..5ceff2436 100644
--- a/src/error.c
+++ b/src/error.c
@@ -5,7 +5,6 @@
*/
#include <errno.h>
-#include <stdarg.h>
#include <stdlib.h>
#include <mruby.h>
#include <mruby/array.h>
@@ -19,17 +18,20 @@
#include <mruby/presym.h>
MRB_API mrb_value
-mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, size_t len)
+mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str)
{
- mrb_value arg = mrb_str_new(mrb, ptr, len);
- return mrb_obj_new(mrb, c, 1, &arg);
+ mrb_ensure_string_type(mrb, str);
+
+ struct RBasic* e = mrb_obj_alloc(mrb, MRB_TT_EXCEPTION, c);
+ mrb_value exc = mrb_obj_value(e);
+ mrb_iv_set(mrb, exc, MRB_SYM(mesg), str);
+ return exc;
}
MRB_API mrb_value
-mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str)
+mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, size_t len)
{
- mrb_to_str(mrb, str);
- return mrb_obj_new(mrb, c, 1, &str);
+ return mrb_exc_new_str(mrb, c, mrb_str_new(mrb, ptr, len));
}
/*
@@ -287,7 +289,7 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap)
#else
i = *p == 'd' ? (mrb_int)va_arg(ap, int) : va_arg(ap, mrb_int);
#endif
- obj = mrb_fixnum_value(i);
+ obj = mrb_int_value(mrb, i);
goto L_cat_obj;
#ifndef MRB_NO_FLOAT
case 'f':
@@ -302,6 +304,7 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap)
obj = mrb_str_new(mrb, chars, len);
goto L_cat_obj;
}
+ L_cat_plain:
mrb_str_cat(mrb, result, b, e - b - 1);
mrb_str_cat(mrb, result, chars, len);
b = ++p;
@@ -325,10 +328,15 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap)
obj = va_arg(ap, mrb_value);
L_cat_obj:
str = (inspect ? mrb_inspect : mrb_obj_as_string)(mrb, obj);
- chars = RSTRING_PTR(str);
- len = RSTRING_LEN(str);
- inspect = FALSE;
- goto L_cat;
+ if (mrb_type(str) != MRB_TT_STRING) {
+ chars = "void (no string conversion)";
+ len = strlen(chars);
+ }
+ else {
+ chars = RSTRING_PTR(str);
+ len = RSTRING_LEN(str);
+ }
+ goto L_cat_plain;
case 'C':
cls = va_arg(ap, struct RClass*);
L_cat_class:
@@ -352,7 +360,7 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap)
L_cat_current:
chars = p;
len = 1;
- goto L_cat;
+ goto L_cat_plain;
default:
mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - %%%c", *p);
}
@@ -381,41 +389,37 @@ mrb_format(mrb_state *mrb, const char *format, ...)
return str;
}
-static mrb_noreturn void
-raise_va(mrb_state *mrb, struct RClass *c, const char *fmt, va_list ap, int argc, mrb_value *argv)
+static mrb_value
+error_va(mrb_state *mrb, struct RClass *c, const char *fmt, va_list ap)
{
- mrb_value mesg;
-
- mesg = mrb_vformat(mrb, fmt, ap);
- if (argv == NULL) {
- argv = &mesg;
- }
- else {
- argv[0] = mesg;
- }
- mrb_exc_raise(mrb, mrb_obj_new(mrb, c, argc+1, argv));
+ mrb_value mesg = mrb_vformat(mrb, fmt, ap);
+ return mrb_exc_new_str(mrb, c, mesg);
}
MRB_API mrb_noreturn void
mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
{
- va_list args;
+ va_list ap;
+ mrb_value exc;
- va_start(args, fmt);
- raise_va(mrb, c, fmt, args, 0, NULL);
- va_end(args);
+ va_start(ap, fmt);
+ exc = error_va(mrb, c, fmt, ap);
+ va_end(ap);
+
+ mrb_exc_raise(mrb, exc);
}
MRB_API mrb_noreturn void
mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...)
{
- mrb_value argv[2];
- va_list args;
+ va_list ap;
+ mrb_value exc;
- va_start(args, fmt);
- argv[1] = mrb_symbol_value(id);
- raise_va(mrb, E_NAME_ERROR, fmt, args, 1, argv);
- va_end(args);
+ va_start(ap, fmt);
+ exc = error_va(mrb, E_NAME_ERROR, fmt, ap);
+ va_end(ap);
+ mrb_iv_set(mrb, exc, MRB_IVSYM(name), mrb_symbol_value(id));
+ mrb_exc_raise(mrb, exc);
}
MRB_API void
@@ -524,16 +528,14 @@ mrb_sys_fail(mrb_state *mrb, const char *mesg)
MRB_API mrb_noreturn void
mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, char const* fmt, ...)
{
- mrb_value exc;
- mrb_value argv[3];
va_list ap;
+ mrb_value exc;
va_start(ap, fmt);
- argv[0] = mrb_vformat(mrb, fmt, ap);
- argv[1] = mrb_symbol_value(id);
- argv[2] = args;
+ exc = error_va(mrb, E_NOMETHOD_ERROR, fmt, ap);
va_end(ap);
- exc = mrb_obj_new(mrb, E_NOMETHOD_ERROR, 3, argv);
+ mrb_iv_set(mrb, exc, MRB_IVSYM(name), mrb_symbol_value(id));
+ mrb_iv_set(mrb, exc, MRB_IVSYM(args), args);
mrb_exc_raise(mrb, exc);
}
diff --git a/src/etc.c b/src/etc.c
index 278acea61..11784214a 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -15,7 +15,7 @@ mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb
{
struct RData *data;
- data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass);
+ data = MRB_OBJ_ALLOC(mrb, MRB_TT_DATA, klass);
data->data = ptr;
data->type = type;
@@ -158,11 +158,35 @@ mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
{
union mrb_value_ v;
+#ifdef MRB_WORDBOX_NO_FLOAT_TRUNCATE
v.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
v.fp->f = f;
MRB_SET_FROZEN_FLAG(v.bp);
+#elif defined(MRB_64BIT) && defined(MRB_USE_FLOAT32)
+ v.w = 0;
+ v.f = f;
+ v.w = ((v.w<<2) & ~3) | 2;
+#else
+ v.f = f;
+ v.w = (v.w & ~3) | 2;
+#endif
return v.value;
}
+
+
+#ifndef MRB_WORDBOX_NO_FLOAT_TRUNCATE
+MRB_API mrb_float
+mrb_word_boxing_value_float(mrb_value v)
+{
+ union mrb_value_ u;
+ u.value = v;
+ u.w = u.w & ~3;
+#if defined(MRB_64BIT) && defined(MRB_USE_FLOAT32)
+ u.w >>= 2;
+#endif
+ return u.f;
+}
+#endif
#endif /* MRB_NO_FLOAT */
MRB_API mrb_value
@@ -185,7 +209,7 @@ MRB_API mrb_value
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);
+ struct RCptr *cptr = MRB_OBJ_ALLOC(mrb, MRB_TT_CPTR, mrb->object_class);
SET_OBJ_VALUE(v, cptr);
cptr->p = p;
diff --git a/src/fmt_fp.c b/src/fmt_fp.c
index d3fe97ce3..bcb9ccc24 100644
--- a/src/fmt_fp.c
+++ b/src/fmt_fp.c
@@ -1,463 +1,363 @@
#include <mruby.h>
-#if !defined(MRB_NO_FLOAT)
-#if defined(MRB_NO_STDIO) || defined(_WIN32) || defined(_WIN64)
-/*
-
-Most code in this file originates from musl (src/stdio/vfprintf.c)
-which, just like mruby itself, is licensed under the MIT license.
-
-Copyright (c) 2005-2014 Rich Felker, et al.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <limits.h>
#include <string.h>
-#include <math.h>
-#include <float.h>
-#include <ctype.h>
-#include <mruby/string.h>
+#ifndef MRB_NO_FLOAT
+/***********************************************************************
-struct fmt_args;
+ Routine for converting a single-precision
+ floating point number into a string.
-typedef void output_func(struct fmt_args *f, const char *s, size_t l);
+ The code in this function was inspired from Fred Bayer's pdouble.c.
+ Since pdouble.c was released as Public Domain, I'm releasing this
+ code as public domain as well.
-struct fmt_args {
- mrb_state *mrb;
- output_func *output;
- void *opaque;
-};
+ Dave Hylands
-struct mrb_cstr {
- char *buf;
- size_t len;
-};
+ The original code can be found in https://github.com/dhylands/format-float
+***********************************************************************/
-#define MAX(a,b) ((a)>(b) ? (a) : (b))
-#define MIN(a,b) ((a)<(b) ? (a) : (b))
+/***********************************************************************
-/* Convenient bit representation for modifier flags, which all fall
- * within 31 codepoints of the space character. */
+ I modified the routine for mruby:
-#define ALT_FORM (1U<<('#'-' '))
-#define ZERO_PAD (1U<<('0'-' '))
-#define LEFT_ADJ (1U<<('-'-' '))
-#define PAD_POS (1U<<(' '-' '))
-#define MARK_POS (1U<<('+'-' '))
+ * support `double`
+ * support `#` (alt_form) modifier
-#define FLAGMASK (ALT_FORM|ZERO_PAD|LEFT_ADJ|PAD_POS|MARK_POS)
+ My modifications in this file are also placed in the public domain.
-static output_func strcat_value;
-static output_func strcat_cstr;
+ Matz (Yukihiro Matsumoto)
-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;
+#include <math.h>
- if (l > cstr->len) {
- mrb_state *mrb = f->mrb;
+#ifdef MRB_USE_FLOAT32
- mrb_raise(mrb, E_ARGUMENT_ERROR, "string buffer too small");
- }
+// 1 sign bit, 8 exponent bits, and 23 mantissa bits.
+// exponent values 0 and 255 are reserved, exponent can be 1 to 254.
+// exponent is stored with a bias of 127.
+// The min and max floats are on the order of 1x10^37 and 1x10^-37
- memcpy(cstr->buf, s, l);
+#define FLT_DECEXP 32
+#define FLT_ROUND_TO_ONE 0.9999995F
+#define FLT_MIN_BUF_SIZE 6 // -9e+99
- cstr->buf += l;
- cstr->len -= l;
-}
+#else
-static void
-out(struct fmt_args *f, const char *s, size_t l)
-{
- f->output(f, s, l);
-}
+// 1 sign bit, 11 exponent bits, and 52 mantissa bits.
-#define PAD_SIZE 256
-static void
-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;
- l = w - l;
- memset(pad, c, l>PAD_SIZE ? PAD_SIZE : l);
- for (; l >= PAD_SIZE; l -= PAD_SIZE)
- out(f, pad, PAD_SIZE);
- out(f, pad, l);
-}
+#define FLT_DECEXP 256
+#define FLT_ROUND_TO_ONE 0.999999999995
+#define FLT_MIN_BUF_SIZE 7 // -9e+199
-static const char xdigits[16] = {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
-};
+#endif /* MRB_USE_FLOAT32 */
-static char*
-fmt_u(uint32_t x, char *s)
-{
- for (; x; x /= 10) *--s = '0' + x % 10;
- return s;
-}
-
-/* Do not override this check. The floating-point printing code below
- * depends on the float.h constants being right. If they are wrong, it
- * may overflow the stack. */
-#if LDBL_MANT_DIG == 53
-typedef char compiler_defines_long_double_incorrectly[9-(int)sizeof(long double)];
+static const mrb_float g_pos_pow[] = {
+#ifndef MRB_USE_FLOAT32
+ 1e256, 1e128, 1e64,
#endif
+ 1e32, 1e16, 1e8, 1e4, 1e2, 1e1
+};
+static const mrb_float g_neg_pow[] = {
+#ifndef MRB_USE_FLOAT32
+ 1e-256, 1e-128, 1e-64,
+#endif
+ 1e-32, 1e-16, 1e-8, 1e-4, 1e-2, 1e-1
+};
-static int
-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
- uint32_t *a, *d, *r, *z;
- uint32_t i;
- int e2=0, e, j;
- ptrdiff_t l;
- char buf[9+LDBL_MANT_DIG/4], *s;
- const char *prefix="-0X+0X 0X-0x+0x 0x";
- ptrdiff_t pl;
- char ebuf0[3*sizeof(int)], *ebuf=&ebuf0[3*sizeof(int)], *estr;
-
- pl=1;
- if (signbit(y)) {
- y=-y;
- } else if (fl & MARK_POS) {
- prefix+=3;
- } else if (fl & PAD_POS) {
- prefix+=6;
- } else prefix++, pl=0;
-
- if (!isfinite(y)) {
- const char *ss = (t&32)?"inf":"INF";
- if (y!=y) ss=(t&32)?"nan":"NAN";
- pad(f, ' ', w, 3+pl, fl&~ZERO_PAD);
- out(f, prefix, pl);
- out(f, ss, 3);
- pad(f, ' ', w, 3+pl, fl^LEFT_ADJ);
- return (int)MAX(w, 3+pl);
+/*
+ * mrb_format_float(mrb_float f, char *buf, size_t buf_size, char fmt, int prec, char sign)
+ *
+ * fmt: should be one of 'e', 'E', 'f', 'F', 'g', or 'G'. (|0x80 for '#')
+ * prec: is the precision (as specified in printf)
+ * sign: should be '\0', '+', or ' ' ('\0' is the normal one - only print
+ * a sign if ```f``` is negative. Anything else is printed as the
+ * sign character for positive numbers.
+ */
+
+int
+mrb_format_float(mrb_float f, char *buf, size_t buf_size, char fmt, int prec, char sign) {
+ char *s = buf;
+ int buf_remaining = buf_size - 1;
+ int alt_form = 0;
+
+ if ((uint8_t)fmt & 0x80) {
+ fmt &= 0x7f; /* turn off alt_form flag */
+ alt_form = 1;
}
+ if (buf_size <= FLT_MIN_BUF_SIZE) {
+ // Smallest exp notion is -9e+99 (-9e+199) which is 6 (7) chars plus terminating
+ // null.
- y = frexp((double)y, &e2) * 2;
- if (y) e2--;
-
- if ((t|32)=='a') {
- long double round = 8.0;
- ptrdiff_t re;
-
- if (t&32) prefix += 9;
- pl += 2;
+ if (buf_size >= 2) {
+ *s++ = '?';
+ }
+ if (buf_size >= 1) {
+ *s++ = '\0';
+ }
+ return buf_size >= 2;
+ }
+ if (signbit(f)) {
+ *s++ = '-';
+ f = -f;
+ } else if (sign) {
+ *s++ = sign;
+ }
+ buf_remaining -= (s - buf); // Adjust for sign
+
+ {
+ char uc = fmt & 0x20;
+ if (isinf(f)) {
+ *s++ = 'I' ^ uc;
+ *s++ = 'N' ^ uc;
+ *s++ = 'F' ^ uc;
+ goto ret;
+ } else if (isnan(f)) {
+ *s++ = 'N' ^ uc;
+ *s++ = 'A' ^ uc;
+ *s++ = 'N' ^ uc;
+ ret:
+ *s = '\0';
+ return s - buf;
+ }
+ }
- if (p<0 || p>=LDBL_MANT_DIG/4-1) re=0;
- else re=LDBL_MANT_DIG/4-1-p;
+ if (prec < 0) {
+ prec = 6;
+ }
+ char e_char = 'E' | (fmt & 0x20); // e_char will match case of fmt
+ fmt |= 0x20; // Force fmt to be lowercase
+ char org_fmt = fmt;
+ if (fmt == 'g' && prec == 0) {
+ prec = 1;
+ }
+ int e, e1;
+ int dec = 0;
+ char e_sign = '\0';
+ int num_digits = 0;
+ const mrb_float *pos_pow = g_pos_pow;
+ const mrb_float *neg_pow = g_neg_pow;
+
+ if (f == 0.0) {
+ e = 0;
+ if (fmt == 'e') {
+ e_sign = '+';
+ } else if (fmt == 'f') {
+ num_digits = prec + 1;
+ }
+ } else if (f < 1.0) { // f < 1.0
+ char first_dig = '0';
+ if (f >= FLT_ROUND_TO_ONE) {
+ first_dig = '1';
+ }
- if (re) {
- while (re--) round*=16;
- if (*prefix=='-') {
- y=-y;
- y-=round;
- y+=round;
- y=-y;
+ // Build negative exponent
+ for (e = 0, e1 = FLT_DECEXP; e1; e1 >>= 1, pos_pow++, neg_pow++) {
+ if (*neg_pow > f) {
+ e += e1;
+ f *= *pos_pow;
}
- else {
- y+=round;
- y-=round;
+ }
+ char e_sign_char = '-';
+ if (f < 1.0) {
+ if (f >= FLT_ROUND_TO_ONE) {
+ f = 1.0;
+ if (e == 0) {
+ e_sign_char = '+';
+ }
+ } else {
+ e++;
+ f *= 10.0;
}
}
- estr=fmt_u(e2<0 ? -e2 : e2, ebuf);
- if (estr==ebuf) *--estr='0';
- *--estr = (e2<0 ? '-' : '+');
- *--estr = t+('p'-'a');
-
- s=buf;
- do {
- int x=(int)y;
- *s++=xdigits[x]|(t&32);
- y=16*(y-x);
- if (s-buf==1 && (y||p>0||(fl&ALT_FORM))) *s++='.';
- } while (y);
-
- if (p && s-buf-2 < p)
- l = (p+2) + (ebuf-estr);
- else
- l = (s-buf) + (ebuf-estr);
-
- pad(f, ' ', w, pl+l, fl);
- out(f, prefix, pl);
- 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, ' ', w, pl+l, fl^LEFT_ADJ);
- return (int)MAX(w, pl+l);
- }
- if (p<0) p=6;
-
- if (y) y *= 268435456.0, e2-=28;
+ // If the user specified 'g' format, and e is <= 4, then we'll switch
+ // to the fixed format ('f')
- if (e2<0) a=r=z=big;
- else a=r=z=big+sizeof(big)/sizeof(*big) - LDBL_MANT_DIG - 1;
+ if (fmt == 'f' || (fmt == 'g' && e <= 4)) {
+ fmt = 'f';
+ dec = -1;
+ *s++ = first_dig;
- do {
- *z = (uint32_t)y;
- y = 1000000000*(y-*z++);
- } while (y);
-
- while (e2>0) {
- uint32_t carry=0;
- int sh=MIN(29,e2);
- for (d=z-1; d>=a; d--) {
- uint64_t x = ((uint64_t)*d<<sh)+carry;
- *d = x % 1000000000;
- carry = (uint32_t)(x / 1000000000);
+ if (org_fmt == 'g') {
+ prec += (e - 1);
+ }
+ // truncate precision to prevent buffer overflow
+ if (prec + 2 > buf_remaining) {
+ prec = buf_remaining - 2;
+ }
+ num_digits = prec;
+ if (num_digits || alt_form) {
+ *s++ = '.';
+ while (--e && num_digits) {
+ *s++ = '0';
+ num_digits--;
+ }
+ }
+ } else {
+ // For e & g formats, we'll be printing the exponent, so set the
+ // sign.
+ e_sign = e_sign_char;
+ dec = 0;
+
+ if (prec > (buf_remaining - FLT_MIN_BUF_SIZE)) {
+ prec = buf_remaining - FLT_MIN_BUF_SIZE;
+ if (fmt == 'g') {
+ prec++;
+ }
+ }
}
- if (carry) *--a = carry;
- while (z>a && !z[-1]) z--;
- e2-=sh;
- }
- while (e2<0) {
- uint32_t carry=0, *b;
- int sh=MIN(9,-e2), need=1+((int)p+LDBL_MANT_DIG/3+8)/9;
- for (d=a; d<z; d++) {
- uint32_t rm = *d & ((1<<sh)-1);
- *d = (*d>>sh) + carry;
- carry = (1000000000>>sh) * rm;
+ } else {
+ // Build positive exponent
+ for (e = 0, e1 = FLT_DECEXP; e1; e1 >>= 1, pos_pow++, neg_pow++) {
+ if (*pos_pow <= f) {
+ e += e1;
+ f *= *neg_pow;
+ }
}
- if (!*a) a++;
- if (carry) *z++ = carry;
- /* Avoid (slow!) computation past requested precision */
- b = (t|32)=='f' ? r : a;
- if (z-b > need) z = b+need;
- e2+=sh;
- }
- if (a<z) for (i=10, e=9*(int)(r-a); *a>=i; i*=10, e++);
- else e=0;
-
- /* Perform rounding: j is precision after the radix (possibly neg) */
- j = (int)p - ((t|32)!='f')*e - ((t|32)=='g' && p);
- if (j < 9*(z-r-1)) {
- uint32_t x;
- /* We avoid C's broken division of negative numbers */
- d = r + 1 + ((j+9*LDBL_MAX_EXP)/9 - LDBL_MAX_EXP);
- j += 9*LDBL_MAX_EXP;
- j %= 9;
- for (i=10, j++; j<9; i*=10, j++);
- x = *d % i;
- /* Are there any significant digits past j? */
- if (x || d+1!=z) {
- long double round = 2/LDBL_EPSILON;
- long double small;
- if (*d/i & 1) round += 2;
- if (x<i/2) small=0.5;
- else if (x==i/2 && d+1==z) small=1.0;
- else small=1.5;
- if (pl && *prefix=='-') round*=-1, small*=-1;
- *d -= x;
- /* Decide whether to round by probing round+small */
- if (round+small != round) {
- *d = *d + i;
- while (*d > 999999999) {
- *d--=0;
- if (d<a) *--a=0;
- (*d)++;
+ // If the user specified fixed format (fmt == 'f') and e makes the
+ // number too big to fit into the available buffer, then we'll
+ // switch to the 'e' format.
+
+ if (fmt == 'f') {
+ if (e >= buf_remaining) {
+ fmt = 'e';
+ } else if ((e + prec + 2) > buf_remaining) {
+ prec = buf_remaining - e - 2;
+ if (prec < 0) {
+ // This means no decimal point, so we can add one back
+ // for the decimal.
+ prec++;
}
- for (i=10, e=9*(int)(r-a); *a>=i; i*=10, e++);
}
}
- if (z>d+1) z=d+1;
- }
- for (; z>a && !z[-1]; z--);
-
- if ((t|32)=='g') {
- if (!p) p++;
- if (p>e && e>=-4) {
- t--;
- p-=e+1;
- }
- else {
- t-=2;
- p--;
- }
- if (!(fl&ALT_FORM)) {
- /* Count trailing zeros in last place */
- if (z>a && z[-1]) for (i=10, j=0; z[-1]%i==0; i*=10, j++);
- else j=9;
- if ((t|32)=='f')
- p = MIN(p,MAX(0,9*(z-r-1)-j));
- else
- p = MIN(p,MAX(0,9*(z-r-1)+e-j));
+ if (fmt == 'e' && prec > (buf_remaining - 6)) {
+ prec = buf_remaining - 6;
}
- }
- l = 1 + p + (p || (fl&ALT_FORM));
- if ((t|32)=='f') {
- if (e>0) l+=e;
- }
- else {
- estr=fmt_u(e<0 ? -e : e, ebuf);
- while(ebuf-estr<2) *--estr='0';
- *--estr = (e<0 ? '-' : '+');
- *--estr = t;
- l += ebuf-estr;
- }
+ // If the user specified 'g' format, and e is < prec, then we'll switch
+ // to the fixed format.
- pad(f, ' ', w, pl+l, fl);
- out(f, prefix, pl);
- pad(f, '0', w, pl+l, fl^ZERO_PAD);
-
- if ((t|32)=='f') {
- if (a>r) a=r;
- for (d=a; d<=r; d++) {
- char *ss = fmt_u(*d, buf+9);
- if (d!=a) while (ss>buf) *--ss='0';
- else if (ss==buf+9) *--ss='0';
- out(f, ss, buf+9-ss);
+ if (fmt == 'g' && e < prec) {
+ fmt = 'f';
+ prec -= (e + 1);
}
- if (p || (fl&ALT_FORM)) out(f, ".", 1);
- for (; d<z && p>0; d++, p-=9) {
- char *ss = fmt_u(*d, buf+9);
- while (ss>buf) *--ss='0';
- out(f, ss, MIN(9,p));
+ if (fmt == 'f') {
+ dec = e;
+ num_digits = prec + e + 1;
+ } else {
+ e_sign = '+';
}
- pad(f, '0', p+9, 9, 0);
}
- else {
- if (z<=a) z=a+1;
- for (d=a; d<z && p>=0; d++) {
- char *ss = fmt_u(*d, buf+9);
- if (ss==buf+9) *--ss='0';
- if (d!=a) while (ss>buf) *--ss='0';
- else {
- out(f, ss++, 1);
- if (p>0||(fl&ALT_FORM)) out(f, ".", 1);
- }
- out(f, ss, MIN(buf+9-ss, p));
- p -= (int)(buf+9-ss);
- }
- pad(f, '0', p+18, 18, 0);
- out(f, estr, ebuf-estr);
+ if (prec < 0) {
+ // This can happen when the prec is trimmed to prevent buffer overflow
+ prec = 0;
}
- pad(f, ' ', w, pl+l, fl^LEFT_ADJ);
-
- return (int)MAX(w, pl+l);
-}
-
-static int
-fmt_core(struct fmt_args *f, const char *fmt, mrb_float flo)
-{
- 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');
+ // We now have f as a floating point number between >= 1 and < 10
+ // (or equal to zero), and e contains the absolute value of the power of
+ // 10 exponent. and (dec + 1) == the number of dgits before the decimal.
+
+ // For e, prec is # digits after the decimal
+ // For f, prec is # digits after the decimal
+ // For g, prec is the max number of significant digits
+ //
+ // For e & g there will be a single digit before the decimal
+ // for f there will be e digits before the decimal
+
+ if (fmt == 'e') {
+ num_digits = prec + 1;
+ } else if (fmt == 'g') {
+ if (prec == 0) {
+ prec = 1;
+ }
+ num_digits = prec;
}
- if (*fmt == '.') {
- ++fmt;
- for (p = 0; ISDIGIT(*fmt); ++fmt) {
- p = 10 * p + (*fmt - '0');
+ // Print the digits of the mantissa
+ for (int i = 0; i < num_digits; ++i, --dec) {
+ int8_t d = (int8_t)((int)f)%10;
+ *s++ = '0' + d;
+ if (dec == 0 && (prec > 0 || alt_form)) {
+ *s++ = '.';
}
- }
- else {
- p = -1;
+ f -= (mrb_float)d;
+ f *= 10.0;
}
- switch (*fmt) {
- case 'e': case 'f': case 'g': case 'a':
- case 'E': case 'F': case 'G': case 'A':
- return fmt_fp(f, flo, w, p, fl, *fmt);
- default:
- return -1;
+ // Round
+ if (f >= 5.0) {
+ char *rs = s;
+ rs--;
+ while (1) {
+ if (*rs == '.') {
+ rs--;
+ continue;
+ }
+ if (*rs < '0' || *rs > '9') {
+ // + or -
+ rs++; // So we sit on the digit to the right of the sign
+ break;
+ }
+ if (*rs < '9') {
+ (*rs)++;
+ break;
+ }
+ *rs = '0';
+ if (rs == buf) {
+ break;
+ }
+ rs--;
+ }
+ if (*rs == '0') {
+ // We need to insert a 1
+ if (rs[1] == '.' && fmt != 'f') {
+ // We're going to round 9.99 to 10.00
+ // Move the decimal point
+ rs[0] = '.';
+ rs[1] = '0';
+ if (e_sign == '-') {
+ e--;
+ } else {
+ e++;
+ }
+ }
+ s++;
+ char *ss = s;
+ while (ss > rs) {
+ *ss = ss[-1];
+ ss--;
+ }
+ *rs = '1';
+ if (f < 1.0 && fmt == 'f') {
+ // We rounded up to 1.0
+ prec--;
+ }
+ }
}
-}
-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.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");
+ if (org_fmt == 'g' && prec > 0 && !alt_form) {
+ // Remove trailing zeros and a trailing decimal point
+ while (s[-1] == '0') {
+ s--;
+ }
+ if (s[-1] == '.') {
+ s--;
+ }
}
- 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");
+ // Append the exponent
+ if (e_sign) {
+ *s++ = e_char;
+ *s++ = e_sign;
+ if (e >= 100) {
+ *s++ = '0' + (e / 100);
+ e %= 100;
+ }
+ *s++ = '0' + (e / 10);
+ *s++ = '0' + (e % 10);
}
- *cstr.buf = '\0';
- return (int)(cstr.buf - buf);
-}
-#else /* MRB_NO_STDIO || _WIN32 || _WIN64 */
-#include <stdio.h>
-
-MRB_API mrb_value
-mrb_float_to_str(mrb_state *mrb, mrb_value flo, const char *fmt)
-{
- char buf[25];
-
- snprintf(buf, sizeof(buf), fmt, mrb_float(flo));
- return mrb_str_new_cstr(mrb, buf);
-}
+ *s = '\0';
-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);
+ return s - buf;
}
-#endif /* MRB_NO_STDIO || _WIN32 || _WIN64 */
#endif
diff --git a/src/gc.c b/src/gc.c
index 96013da00..2a7d7f6e1 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -5,7 +5,6 @@
*/
#include <string.h>
-#include <stdlib.h>
#ifdef MRB_USE_MALLOC_TRIM
#include <malloc.h>
#endif
@@ -24,6 +23,10 @@
#include <mruby/throw.h>
#include <mruby/presym.h>
+#ifdef MRB_GC_STRESS
+#include <stdlib.h>
+#endif
+
/*
= Tri-color Incremental Garbage Collection
@@ -131,12 +134,6 @@ typedef struct {
struct RFiber fiber;
struct RException exc;
struct RBreak brk;
-#ifdef MRB_WORD_BOXING
-#ifndef MRB_NO_FLOAT
- struct RFloat floatv;
-#endif
- struct RCptr cptr;
-#endif
} as;
} RVALUE;
@@ -295,7 +292,7 @@ MRB_API void*
mrb_alloca(mrb_state *mrb, size_t size)
{
struct RString *s;
- s = (struct RString*)mrb_obj_alloc(mrb, MRB_TT_STRING, mrb->string_class);
+ s = MRB_OBJ_ALLOC(mrb, MRB_TT_STRING, mrb->string_class);
return s->as.heap.ptr = (char*)mrb_malloc(mrb, size);
}
@@ -745,6 +742,7 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
}
break;
+ case MRB_TT_STRUCT:
case MRB_TT_ARRAY:
{
struct RArray *a = (struct RArray*)obj;
@@ -860,6 +858,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end)
}
break;
+ case MRB_TT_STRUCT:
case MRB_TT_ARRAY:
if (ARY_SHARED_P(obj))
mrb_ary_decref(mrb, ((struct RArray*)obj)->as.heap.aux.shared);
@@ -1044,6 +1043,7 @@ gc_gray_counts(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
}
break;
+ case MRB_TT_STRUCT:
case MRB_TT_ARRAY:
{
struct RArray *a = (struct RArray*)obj;
@@ -1468,7 +1468,7 @@ gc_disable(mrb_state *mrb, mrb_value obj)
/*
* call-seq:
- * GC.interval_ratio -> fixnum
+ * GC.interval_ratio -> int
*
* Returns ratio of GC interval. Default value is 200(%).
*
@@ -1477,12 +1477,12 @@ gc_disable(mrb_state *mrb, mrb_value obj)
static mrb_value
gc_interval_ratio_get(mrb_state *mrb, mrb_value obj)
{
- return mrb_fixnum_value(mrb->gc.interval_ratio);
+ return mrb_int_value(mrb, mrb->gc.interval_ratio);
}
/*
* call-seq:
- * GC.interval_ratio = fixnum -> nil
+ * GC.interval_ratio = int -> nil
*
* Updates ratio of GC interval. Default value is 200(%).
* GC start as soon as after end all step of GC if you set 100(%).
@@ -1501,7 +1501,7 @@ gc_interval_ratio_set(mrb_state *mrb, mrb_value obj)
/*
* call-seq:
- * GC.step_ratio -> fixnum
+ * GC.step_ratio -> int
*
* Returns step span ratio of Incremental GC. Default value is 200(%).
*
@@ -1510,12 +1510,12 @@ gc_interval_ratio_set(mrb_state *mrb, mrb_value obj)
static mrb_value
gc_step_ratio_get(mrb_state *mrb, mrb_value obj)
{
- return mrb_fixnum_value(mrb->gc.step_ratio);
+ return mrb_int_value(mrb, mrb->gc.step_ratio);
}
/*
* call-seq:
- * GC.step_ratio = fixnum -> nil
+ * GC.step_ratio = int -> nil
*
* Updates step span ratio of Incremental GC. Default value is 200(%).
* 1 step of incrementalGC becomes long if a rate is big.
diff --git a/src/hash.c b/src/hash.c
index 3b5d17761..918722a2b 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -970,7 +970,7 @@ h_key_for(mrb_state *mrb, mrb_value key)
static struct RHash*
h_alloc(mrb_state *mrb)
{
- return (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
+ return MRB_OBJ_ALLOC(mrb, MRB_TT_HASH, mrb->hash_class);
}
static void
@@ -1482,6 +1482,7 @@ static mrb_value
mrb_hash_delete(mrb_state *mrb, mrb_value self)
{
mrb_value key = mrb_get_arg1(mrb);
+ mrb->c->ci->mid = 0;
return mrb_hash_delete_key(mrb, self, key);
}
diff --git a/src/kernel.c b/src/kernel.c
index 25aa41baf..f8ef1bfe1 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -84,8 +84,8 @@ mrb_equal_m(mrb_state *mrb, mrb_value self)
* Document-method: object_id
*
* call-seq:
- * obj.__id__ -> fixnum
- * obj.object_id -> fixnum
+ * obj.__id__ -> int
+ * obj.object_id -> int
*
* Returns an integer identifier for <i>obj</i>. The same number will
* be returned on all calls to <code>id</code> for a given object, and
@@ -293,7 +293,7 @@ mrb_obj_frozen(mrb_state *mrb, mrb_value self)
/* 15.3.1.3.15 */
/*
* call-seq:
- * obj.hash -> fixnum
+ * obj.hash -> int
*
* Generates a <code>Integer</code> hash value for this object. This
* function must have the property that <code>a.eql?(b)</code> implies
@@ -423,8 +423,8 @@ mrb_f_raise(mrb_state *mrb, mrb_value self)
mrb_value a[2], exc;
mrb_int argc;
-
argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]);
+ mrb->c->ci->mid = 0;
switch (argc) {
case 0:
mrb_raise(mrb, E_RUNTIME_ERROR, "");
@@ -510,7 +510,7 @@ mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args)
* # ...
* end
* def method_missing(methId)
- * str = methId.id2name
+ * str = methId.to_s
* romanToInt(str)
* end
* end
@@ -527,6 +527,7 @@ mrb_obj_missing(mrb_state *mrb, mrb_value mod)
const mrb_value *a;
mrb_int alen;
+ mrb->c->ci->mid = 0;
mrb_get_args(mrb, "n*!", &name, &a, &alen);
mrb_method_missing(mrb, name, mod, mrb_ary_new_from_values(mrb, alen, a));
/* not reached */
@@ -584,6 +585,7 @@ mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
mrb_sym eqq = MRB_OPSYM(eqq);
mrb_value ary;
+ mrb->c->ci->mid = 0;
if (mrb_array_p(self)) {
ary = self;
}
@@ -610,6 +612,17 @@ mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
return mrb_false_value();
}
+static mrb_value
+mrb_encoding(mrb_state *mrb, mrb_value self)
+{
+ mrb_get_args(mrb, "");
+#ifdef MRB_UTF8_STRING
+ return mrb_str_new_lit(mrb, "UTF-8");
+#else
+ return mrb_str_new_lit(mrb, "ASCII-8BIT");
+#endif
+}
+
mrb_value mrb_obj_equal_m(mrb_state *mrb, mrb_value);
void
@@ -649,8 +662,8 @@ mrb_init_kernel(mrb_state *mrb)
mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ARG(1,1)); /* 15.3.1.3.43 */
mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */
mrb_define_method(mrb, krn, "__case_eqq", mrb_obj_ceqq, MRB_ARGS_REQ(1)); /* internal */
- mrb_define_method(mrb, krn, "__to_int", mrb_to_int, MRB_ARGS_NONE()); /* internal */
- mrb_define_method(mrb, krn, "__to_str", mrb_to_str, MRB_ARGS_NONE()); /* internal */
+ mrb_define_method(mrb, krn, "__to_int", mrb_to_integer, MRB_ARGS_NONE()); /* internal */
+ mrb_define_method(mrb, krn, "__ENCODING__", mrb_encoding, MRB_ARGS_NONE());
mrb_include_module(mrb, mrb->object_class, mrb->kernel_module);
}
diff --git a/src/load.c b/src/load.c
index f370dc67e..256dd58fd 100644
--- a/src/load.c
+++ b/src/load.c
@@ -4,10 +4,7 @@
** See Copyright Notice in mruby.h
*/
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
+#include <mruby.h>
#include <mruby/dump.h>
#include <mruby/irep.h>
#include <mruby/proc.h>
@@ -16,6 +13,7 @@
#include <mruby/error.h>
#include <mruby/data.h>
#include <mruby/endian.h>
+#include <string.h>
#if SIZE_MAX < UINT32_MAX
# error size_t must be at least 32 bits wide
@@ -60,8 +58,6 @@ str_to_double(mrb_state *mrb, const char *p)
}
#endif
-mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, int badcheck);
-
static mrb_bool
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags, mrb_irep **irepp)
{
@@ -146,7 +142,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
}
break;
case IREP_TT_INT64:
-#ifdef MRB_64BIT
+#ifdef MRB_INT64
{
uint64_t i64 = bin_to_uint32(src);
src += sizeof(uint32_t);
@@ -158,7 +154,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
}
break;
#else
- return FALSE; /* INT64 not supported on MRB_32BIT */
+ return FALSE;
#endif
case IREP_TT_BIGINT:
@@ -364,6 +360,12 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *
}
} break;
+ case mrb_debug_line_packed_map: {
+ file->lines.packed_map = (uint8_t*)mrb_calloc(mrb, 1, (size_t)file->line_entry_count);
+ memcpy(file->lines.packed_map, bin, file->line_entry_count);
+ bin += file->line_entry_count;
+ } break;
+
default: return MRB_DUMP_GENERAL_FAILURE;
}
}
@@ -604,11 +606,7 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
static struct RProc*
mrb_proc_read_irep(mrb_state *mrb, const uint8_t *bin)
{
-#if defined(MRB_USE_LINK_TIME_RO_DATA_P) || defined(MRB_USE_CUSTOM_RO_DATA_P)
uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC;
-#else
- uint8_t flags = FLAG_SRC_STATIC;
-#endif
return read_irep(mrb, bin, (size_t)-1, flags);
}
@@ -679,7 +677,7 @@ mrb_load_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize)
MRB_API mrb_value
mrb_load_proc(mrb_state *mrb, const struct RProc *proc)
{
- return mrb_vm_run(mrb, proc, mrb_top_self(mrb), 0);
+ return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0);
}
#ifndef MRB_NO_STDIO
diff --git a/src/numeric.c b/src/numeric.c
index fe1a18f04..fd9f5ce2c 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -4,36 +4,25 @@
** See Copyright Notice in mruby.h
*/
-#ifndef MRB_NO_FLOAT
-#include <float.h>
-#include <math.h>
-#endif
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-
#include <mruby.h>
#include <mruby/array.h>
#include <mruby/numeric.h>
#include <mruby/string.h>
#include <mruby/class.h>
#include <mruby/presym.h>
+#include <string.h>
#ifndef MRB_NO_FLOAT
#ifdef MRB_USE_FLOAT32
#define trunc(f) truncf(f)
-#define floor(f) floorf(f)
-#define ceil(f) ceilf(f)
#define fmod(x,y) fmodf(x,y)
-#define FLO_TO_STR_PREC 8
#else
-#define FLO_TO_STR_PREC 16
#endif
#endif
#ifndef MRB_NO_FLOAT
MRB_API mrb_float
-mrb_to_flo(mrb_state *mrb, mrb_value val)
+mrb_as_float(mrb_state *mrb, mrb_value val)
{
switch (mrb_type(val)) {
case MRB_TT_INTEGER:
@@ -137,10 +126,6 @@ mrb_div_int(mrb_state *mrb, mrb_int x, mrb_int y)
return 0;
}
-#ifndef MRB_NO_FLOAT
-mrb_float mrb_div_flo(mrb_float x, mrb_float y);
-#endif
-
/* 15.2.8.3.4 */
/* 15.2.9.3.4 */
/*
@@ -164,7 +149,7 @@ int_div(mrb_state *mrb, mrb_value x)
#ifdef MRB_NO_FLOAT
mrb_raise(mrb, E_TYPE_ERROR, "non integer division");
#else
- return mrb_float_value(mrb, mrb_div_flo((mrb_float)a, mrb_to_flo(mrb, y)));
+ return mrb_float_value(mrb, mrb_div_float((mrb_float)a, mrb_as_float(mrb, y)));
#endif
}
@@ -191,7 +176,7 @@ int_idiv(mrb_state *mrb, mrb_value x)
if (y == 0) {
int_zerodiv(mrb);
}
- return mrb_fixnum_value(mrb_integer(x) / y);
+ return mrb_int_value(mrb, mrb_integer(x) / y);
}
static mrb_value
@@ -218,8 +203,9 @@ coerce_step_counter(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "oo", &num, &step);
#ifndef MRB_NO_FLOAT
- if (mrb_float_p(self) || mrb_float_p(num) || mrb_float_p(step)) {
- return mrb_Float(mrb, self);
+ mrb->c->ci->mid = 0;
+ if (mrb_float_p(num) || mrb_float_p(step)) {
+ return mrb_to_float(mrb, self);
}
#endif
@@ -240,7 +226,7 @@ static mrb_value
flo_pow(mrb_state *mrb, mrb_value x)
{
mrb_value y = mrb_get_arg1(mrb);
- mrb_float d = pow(mrb_to_flo(mrb, x), mrb_to_flo(mrb, y));
+ mrb_float d = pow(mrb_as_float(mrb, x), mrb_as_float(mrb, y));
return mrb_float_value(mrb, d);
}
@@ -255,7 +241,7 @@ flo_idiv(mrb_state *mrb, mrb_value xv)
}
mrb_float
-mrb_div_flo(mrb_float x, mrb_float y)
+mrb_div_float(mrb_float x, mrb_float y)
{
if (y != 0.0) {
return x / y;
@@ -275,14 +261,39 @@ flo_div(mrb_state *mrb, mrb_value x)
mrb_float a = mrb_float(x);
if (mrb_float_p(y)) {
- a = mrb_div_flo(a, mrb_float(y));
+ a = mrb_div_float(a, mrb_float(y));
}
else {
- a = mrb_div_flo(a, mrb_to_flo(mrb, y));
+ a = mrb_div_float(a, mrb_as_float(mrb, y));
}
return mrb_float_value(mrb, a);
}
+/* the argument `fmt` is no longer used; you can pass `NULL` */
+mrb_value
+mrb_float_to_str(mrb_state *mrb, mrb_value flo, const char *fmt)
+{
+ char buf[25];
+#ifdef MRB_USE_FLOAT32
+ const int prec = 7;
+#else
+ const int prec = 15;
+#endif
+
+ mrb_format_float(mrb_float(flo), buf, sizeof(buf), 'g', prec, '\0');
+ for (char *p = buf; *p; p++) {
+ if (*p == '.') goto exit;
+ if (*p == 'e') {
+ memmove(p+2, p, strlen(p)+1);
+ memcpy(p, ".0", 2);
+ goto exit;
+ }
+ }
+ strcat(buf, ".0");
+ exit:
+ return mrb_str_new_cstr(mrb, buf);
+}
+
/* 15.2.9.3.16(x) */
/*
* call-seq:
@@ -307,49 +318,14 @@ flo_to_s(mrb_state *mrb, mrb_value flt)
if (isinf(f)) {
str = f < 0 ? mrb_str_new_lit(mrb, "-Infinity")
: mrb_str_new_lit(mrb, "Infinity");
- goto exit;
}
else if (isnan(f)) {
str = mrb_str_new_lit(mrb, "NaN");
- goto exit;
}
else {
- char fmt[] = "%." MRB_STRINGIZE(FLO_TO_STR_PREC) "g";
- 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 == '.') {
- goto exit;
- }
- else if (*p == 'e') {
- ptrdiff_t e_pos = p - begp;
- mrb_str_cat(mrb, str, ".0", 2);
- p = RSTRING_PTR(str) + e_pos;
- memmove(p + 2, p, len - e_pos);
- memcpy(p, ".0", 2);
- goto exit;
- }
- }
-
- if (FLO_TO_STR_PREC + (begp[0] == '-') <= len) {
- --fmt[sizeof(fmt) - 3]; /* %.16g(%.8g) -> %.15g(%.7g) */
- str = mrb_float_to_str(mrb, flt, fmt);
- goto insert_dot_zero;
- }
- else {
- mrb_str_cat(mrb, str, ".0", 2);
- }
-
- goto exit;
+ str = mrb_float_to_str(mrb, flt, NULL);
}
- exit:
RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
return str;
}
@@ -376,7 +352,7 @@ flo_add(mrb_state *mrb, mrb_value x)
return mrb_funcall_id(mrb, y, MRB_OPSYM(add), 1, x);
#endif
default:
- return mrb_float_value(mrb, a + mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, a + mrb_as_float(mrb, y));
}
}
@@ -404,7 +380,7 @@ flo_sub(mrb_state *mrb, mrb_value x)
return mrb_funcall_id(mrb, x, MRB_OPSYM(minus), 0);
#endif
default:
- return mrb_float_value(mrb, a - mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, a - mrb_as_float(mrb, y));
}
}
@@ -431,7 +407,7 @@ flo_mul(mrb_state *mrb, mrb_value x)
return mrb_funcall_id(mrb, y, MRB_OPSYM(mul), 1, x);
#endif
default:
- return mrb_float_value(mrb, a * mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, a * mrb_as_float(mrb, y));
}
}
@@ -490,7 +466,7 @@ flo_mod(mrb_state *mrb, mrb_value x)
mrb_value y = mrb_get_arg1(mrb);
mrb_float mod;
- flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), 0, &mod);
+ flodivmod(mrb, mrb_float(x), mrb_as_float(mrb, y), 0, &mod);
return mrb_float_value(mrb, mod);
}
#endif
@@ -551,7 +527,7 @@ flo_eq(mrb_state *mrb, mrb_value x)
return mrb_bool_value(mrb_float(x) == mrb_float(y));
#ifdef MRB_USE_RATIONAL
case MRB_TT_RATIONAL:
- return mrb_bool_value(mrb_float(x) == mrb_to_flo(mrb, y));
+ return mrb_bool_value(mrb_float(x) == mrb_as_float(mrb, y));
#endif
#ifdef MRB_USE_COMPLEX
case MRB_TT_COMPLEX:
@@ -761,49 +737,127 @@ mrb_check_num_exact(mrb_state *mrb, mrb_float num)
}
}
+static mrb_value
+flo_ceil_floor(mrb_state *mrb, mrb_value num, double (*func)(double))
+{
+ mrb_float f = mrb_float(num);
+ mrb_int ndigits = 0;
+#ifdef MRB_USE_FLOAT32
+ const int fprec = 7;
+#else
+ const int fprec = 15;
+#endif
+
+ mrb_get_args(mrb, "|i", &ndigits);
+ if (f == 0.0) {
+ return ndigits > 0 ? mrb_float_value(mrb, f) : mrb_fixnum_value(0);
+ }
+ if (ndigits > 0) {
+ if (ndigits > fprec) return num;
+ mrb_float d = pow(10, ndigits);
+ f = func(f * d) / d;
+ return mrb_float_value(mrb, f);
+ }
+ if (ndigits < 0) {
+ mrb_float d = pow(10, -ndigits);
+ f = func(f / d) * d;
+ }
+ else { /* ndigits == 0 */
+ f = func(f);
+ }
+ mrb_check_num_exact(mrb, f);
+ return mrb_int_value(mrb, (mrb_int)f);
+}
+
/* 15.2.9.3.10 */
/*
* call-seq:
- * flt.floor -> integer
+ * float.floor([ndigits]) -> integer or float
*
- * Returns the largest integer less than or equal to <i>flt</i>.
+ * Returns the largest number less than or equal to +float+ with
+ * a precision of +ndigits+ decimal digits (default: 0).
+ *
+ * When the precision is negative, the returned value is an integer
+ * with at least <code>ndigits.abs</code> trailing zeros.
+ *
+ * Returns a floating point number when +ndigits+ is positive,
+ * otherwise returns an integer.
*
* 1.2.floor #=> 1
* 2.0.floor #=> 2
* (-1.2).floor #=> -2
* (-2.0).floor #=> -2
+ *
+ * 1.234567.floor(2) #=> 1.23
+ * 1.234567.floor(3) #=> 1.234
+ * 1.234567.floor(4) #=> 1.2345
+ * 1.234567.floor(5) #=> 1.23456
+ *
+ * 34567.89.floor(-5) #=> 0
+ * 34567.89.floor(-4) #=> 30000
+ * 34567.89.floor(-3) #=> 34000
+ * 34567.89.floor(-2) #=> 34500
+ * 34567.89.floor(-1) #=> 34560
+ * 34567.89.floor(0) #=> 34567
+ * 34567.89.floor(1) #=> 34567.8
+ * 34567.89.floor(2) #=> 34567.89
+ * 34567.89.floor(3) #=> 34567.89
+ *
+ * Note that the limited precision of floating point arithmetic
+ * might lead to surprising results:
+ *
+ * (0.3 / 0.1).floor #=> 2 (!)
*/
-
static mrb_value
flo_floor(mrb_state *mrb, mrb_value num)
{
- mrb_float f = floor(mrb_float(num));
-
- mrb_check_num_exact(mrb, f);
- return mrb_int_value(mrb, (mrb_int)f);
+ return flo_ceil_floor(mrb, num, floor);
}
/* 15.2.9.3.8 */
/*
* call-seq:
- * flt.ceil -> integer
+ * float.ceil([ndigits]) -> integer or float
+ *
+ * Returns the smallest number greater than or equal to +float+ with
+ * a precision of +ndigits+ decimal digits (default: 0).
+ *
+ * When the precision is negative, the returned value is an integer
+ * with at least <code>ndigits.abs</code> trailing zeros.
*
- * Returns the smallest <code>Integer</code> greater than or equal to
- * <i>flt</i>.
+ * Returns a floating point number when +ndigits+ is positive,
+ * otherwise returns an integer.
*
* 1.2.ceil #=> 2
* 2.0.ceil #=> 2
* (-1.2).ceil #=> -1
* (-2.0).ceil #=> -2
+ *
+ * 1.234567.ceil(2) #=> 1.24
+ * 1.234567.ceil(3) #=> 1.235
+ * 1.234567.ceil(4) #=> 1.2346
+ * 1.234567.ceil(5) #=> 1.23457
+ *
+ * 34567.89.ceil(-5) #=> 100000
+ * 34567.89.ceil(-4) #=> 40000
+ * 34567.89.ceil(-3) #=> 35000
+ * 34567.89.ceil(-2) #=> 34600
+ * 34567.89.ceil(-1) #=> 34570
+ * 34567.89.ceil(0) #=> 34568
+ * 34567.89.ceil(1) #=> 34567.9
+ * 34567.89.ceil(2) #=> 34567.89
+ * 34567.89.ceil(3) #=> 34567.89
+ *
+ * Note that the limited precision of floating point arithmetic
+ * might lead to surprising results:
+ *
+ * (2.1 / 0.7).ceil #=> 4 (!)
*/
static mrb_value
flo_ceil(mrb_state *mrb, mrb_value num)
{
- mrb_float f = ceil(mrb_float(num));
-
- mrb_check_num_exact(mrb, f);
- return mrb_int_value(mrb, (mrb_int)f);
+ return flo_ceil_floor(mrb, num, ceil);
}
/* 15.2.9.3.12 */
@@ -853,6 +907,7 @@ flo_round(mrb_state *mrb, mrb_value num)
mrb_check_num_exact(mrb, number);
f = 1.0;
+ if (ndigits < -DBL_DIG-2) return mrb_fixnum_value(0);
i = ndigits >= 0 ? ndigits : -ndigits;
if (ndigits > DBL_DIG+2) return num;
while (--i >= 0)
@@ -891,6 +946,18 @@ flo_round(mrb_state *mrb, mrb_value num)
}
/* 15.2.9.3.14 */
+static mrb_value
+flo_to_i(mrb_state *mrb, mrb_value num)
+{
+ mrb_float f = mrb_float(num);
+
+ if (f > 0.0) f = floor(f);
+ if (f < 0.0) f = ceil(f);
+
+ mrb_check_num_exact(mrb, f);
+ return mrb_int_value(mrb, (mrb_int)f);
+}
+
/* 15.2.9.3.15 */
/*
* call-seq:
@@ -903,13 +970,8 @@ flo_round(mrb_state *mrb, mrb_value num)
static mrb_value
flo_truncate(mrb_state *mrb, mrb_value num)
{
- mrb_float f = mrb_float(num);
-
- if (f > 0.0) f = floor(f);
- if (f < 0.0) f = ceil(f);
-
- mrb_check_num_exact(mrb, f);
- return mrb_int_value(mrb, (mrb_int)f);
+ if (signbit(mrb_float(num))) return flo_ceil(mrb, num);
+ return flo_floor(mrb, num);
}
static mrb_value
@@ -917,6 +979,15 @@ flo_nan_p(mrb_state *mrb, mrb_value num)
{
return mrb_bool_value(isnan(mrb_float(num)));
}
+
+static mrb_value
+flo_abs(mrb_state *mrb, mrb_value num)
+{
+ mrb_float f = mrb_float(num);
+
+ if (signbit(f)) return mrb_float_value(mrb, -f);
+ return num;
+}
#endif
/*
@@ -967,7 +1038,7 @@ fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)
#ifdef MRB_NO_FLOAT
mrb_raise(mrb, E_TYPE_ERROR, "non integer multiplication");
#else
- return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, (mrb_float)a * mrb_as_float(mrb, y));
#endif
}
}
@@ -980,7 +1051,7 @@ mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y)
}
#ifndef MRB_NO_FLOAT
if (mrb_float_p(x)) {
- return mrb_float_value(mrb, mrb_float(x) * mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, mrb_float(x) * mrb_as_float(mrb, y));
}
#endif
#if defined(MRB_USE_RATIONAL) || defined(MRB_USE_COMPLEX)
@@ -999,7 +1070,7 @@ mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y)
/* 15.2.8.3.3 */
/*
* call-seq:
- * fix * numeric -> numeric_result
+ * int * numeric -> numeric_result
*
* Performs multiplication: the class of the resulting object depends on
* the class of <code>numeric</code> and on the magnitude of the
@@ -1015,7 +1086,7 @@ int_mul(mrb_state *mrb, mrb_value x)
}
static void
-fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
+intdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
{
if (y == 0) {
int_zerodiv(mrb);
@@ -1039,10 +1110,9 @@ fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
/* 15.2.8.3.5 */
/*
* call-seq:
- * fix % other -> real
- * fix.modulo(other) -> real
+ * int % other -> real
*
- * Returns <code>fix</code> modulo <code>other</code>.
+ * Returns <code>int</code> modulo <code>other</code>.
* See <code>numeric.divmod</code> for more information.
*/
@@ -1053,27 +1123,29 @@ int_mod(mrb_state *mrb, mrb_value x)
mrb_int a, b;
a = mrb_integer(x);
- if (mrb_integer_p(y) && a != MRB_INT_MIN && (b=mrb_integer(y)) != MRB_INT_MIN) {
- mrb_int mod;
-
- fixdivmod(mrb, a, b, NULL, &mod);
- return mrb_fixnum_value(mod);
+ if (mrb_integer_p(y)) {
+ b = mrb_integer(y);
+ if (b == 0) int_zerodiv(mrb);
+ if (a == MRB_INT_MIN && b == -1) return mrb_fixnum_value(0);
+ mrb_int mod = a % b;
+ if ((a < 0) != (b < 0) && mod != 0) {
+ mod += b;
+ }
+ return mrb_int_value(mrb, mod);
}
#ifdef MRB_NO_FLOAT
mrb_raise(mrb, E_TYPE_ERROR, "non integer modulo");
#else
- else {
- mrb_float mod;
+ mrb_float mod;
- flodivmod(mrb, (mrb_float)a, mrb_to_flo(mrb, y), NULL, &mod);
- return mrb_float_value(mrb, mod);
- }
+ flodivmod(mrb, (mrb_float)a, mrb_as_float(mrb, y), NULL, &mod);
+ return mrb_float_value(mrb, mod);
#endif
}
/*
* call-seq:
- * fix.divmod(numeric) -> array
+ * int.divmod(numeric) -> array
*
* See <code>Numeric#divmod</code>.
*/
@@ -1085,7 +1157,7 @@ int_divmod(mrb_state *mrb, mrb_value x)
if (mrb_integer_p(y)) {
mrb_int div, mod;
- fixdivmod(mrb, mrb_integer(x), mrb_integer(y), &div, &mod);
+ intdivmod(mrb, mrb_integer(x), mrb_integer(y), &div, &mod);
return mrb_assoc_new(mrb, mrb_int_value(mrb, div), mrb_int_value(mrb, mod));
}
#ifdef MRB_NO_FLOAT
@@ -1095,7 +1167,7 @@ int_divmod(mrb_state *mrb, mrb_value x)
mrb_float div, mod;
mrb_value a, b;
- flodivmod(mrb, (mrb_float)mrb_integer(x), mrb_to_flo(mrb, y), &div, &mod);
+ flodivmod(mrb, (mrb_float)mrb_integer(x), mrb_as_float(mrb, y), &div, &mod);
a = mrb_int_value(mrb, (mrb_int)div);
b = mrb_float_value(mrb, mod);
return mrb_assoc_new(mrb, a, b);
@@ -1111,7 +1183,7 @@ flo_divmod(mrb_state *mrb, mrb_value x)
mrb_float div, mod;
mrb_value a, b;
- flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod);
+ flodivmod(mrb, mrb_float(x), mrb_as_float(mrb, y), &div, &mod);
if (!FIXABLE_FLOAT(div))
a = mrb_float_value(mrb, div);
else
@@ -1124,9 +1196,9 @@ flo_divmod(mrb_state *mrb, mrb_value x)
/* 15.2.8.3.7 */
/*
* call-seq:
- * fix == other -> true or false
+ * int == other -> true or false
*
- * Return <code>true</code> if <code>fix</code> equals <code>other</code>
+ * Return <code>true</code> if <code>int</code> equals <code>other</code>
* numerically.
*
* 1 == 2 #=> false
@@ -1161,7 +1233,7 @@ int_equal(mrb_state *mrb, mrb_value x)
/* 15.2.8.3.8 */
/*
* call-seq:
- * ~fix -> integer
+ * ~int -> integer
*
* One's complement: returns a number where each bit is flipped.
* ex.0---00001 (1)-> 1---11110 (-2)
@@ -1194,7 +1266,7 @@ static mrb_value flo_xor(mrb_state *mrb, mrb_value x);
/* 15.2.8.3.9 */
/*
* call-seq:
- * fix & integer -> integer_result
+ * int & integer -> integer_result
*
* Bitwise AND.
*/
@@ -1210,7 +1282,7 @@ int_and(mrb_state *mrb, mrb_value x)
/* 15.2.8.3.10 */
/*
* call-seq:
- * fix | integer -> integer_result
+ * int | integer -> integer_result
*
* Bitwise OR.
*/
@@ -1226,7 +1298,7 @@ int_or(mrb_state *mrb, mrb_value x)
/* 15.2.8.3.11 */
/*
* call-seq:
- * fix ^ integer -> integer_result
+ * int ^ integer -> integer_result
*
* Bitwise EXCLUSIVE OR.
*/
@@ -1241,45 +1313,48 @@ int_xor(mrb_state *mrb, mrb_value x)
#define NUMERIC_SHIFT_WIDTH_MAX (MRB_INT_BIT-1)
-static mrb_value
-lshift(mrb_state *mrb, mrb_int val, mrb_int width)
+mrb_bool
+mrb_num_shift(mrb_state *mrb, mrb_int val, mrb_int width, mrb_int *num)
{
- mrb_assert(width >= 0);
- if (val > 0) {
+ if (width < 0) { /* rshift */
+ if (width == MRB_INT_MIN || -width >= NUMERIC_SHIFT_WIDTH_MAX) {
+ if (val < 0) {
+ *num = -1;
+ }
+ else {
+ *num = 0;
+ }
+ }
+ else {
+ *num = val >> -width;
+ }
+ }
+ else if (val > 0) {
if ((width > NUMERIC_SHIFT_WIDTH_MAX) ||
(val > (MRB_INT_MAX >> width))) {
- int_overflow(mrb, "bit shift");
+ return FALSE;
}
- return mrb_int_value(mrb, val << width);
+ *num = val << width;
}
else {
if ((width > NUMERIC_SHIFT_WIDTH_MAX) ||
- (val <= (MRB_INT_MIN >> width))) {
- int_overflow(mrb, "bit shift");
+ (val < (MRB_INT_MIN >> width))) {
+ return FALSE;
}
- return mrb_int_value(mrb, (val * ((mrb_int)1 << width)));
+ if (width == NUMERIC_SHIFT_WIDTH_MAX)
+ *num = MRB_INT_MIN;
+ else
+ *num = val * ((mrb_int)1 << width);
}
-}
-
-static mrb_value
-rshift(mrb_state *mrb, mrb_int val, mrb_int width)
-{
- mrb_assert(width >= 0);
- if (width >= NUMERIC_SHIFT_WIDTH_MAX) {
- if (val < 0) {
- return mrb_fixnum_value(-1);
- }
- return mrb_fixnum_value(0);
- }
- return mrb_int_value(mrb, val >> width);
+ return TRUE;
}
/* 15.2.8.3.12 */
/*
* call-seq:
- * fix << count -> integer or float
+ * int << count -> integer or float
*
- * Shifts _fix_ left _count_ positions (right if _count_ is negative).
+ * Shifts _int_ left _count_ positions (right if _count_ is negative).
*/
static mrb_value
@@ -1293,19 +1368,18 @@ int_lshift(mrb_state *mrb, mrb_value x)
}
val = mrb_integer(x);
if (val == 0) return x;
- if (width < 0) {
- if (width == MRB_INT_MIN) return rshift(mrb, val, MRB_INT_BIT);
- return rshift(mrb, val, -width);
+ if (!mrb_num_shift(mrb, val, width, &val)) {
+ int_overflow(mrb, "bit shift");
}
- return lshift(mrb, val, width);
+ return mrb_int_value(mrb, val);
}
/* 15.2.8.3.13 */
/*
* call-seq:
- * fix >> count -> integer or float
+ * int >> count -> integer or float
*
- * Shifts _fix_ right _count_ positions (left if _count_ is negative).
+ * Shifts _int_ right _count_ positions (left if _count_ is negative).
*/
static mrb_value
@@ -1319,19 +1393,19 @@ int_rshift(mrb_state *mrb, mrb_value x)
}
val = mrb_integer(x);
if (val == 0) return x;
- if (width < 0) {
- if (width == MRB_INT_MIN) int_overflow(mrb, "bit shift");
- return lshift(mrb, val, -width);
+ if (width == MRB_INT_MIN) int_overflow(mrb, "bit shift");
+ if (!mrb_num_shift(mrb, val, -width, &val)) {
+ int_overflow(mrb, "bit shift");
}
- return rshift(mrb, val, width);
+ return mrb_int_value(mrb, val);
}
/* 15.2.8.3.23 */
/*
* call-seq:
- * fix.to_f -> float
+ * int.to_f -> float
*
- * Converts <i>fix</i> to a <code>Float</code>.
+ * Converts <i>int</i> to a <code>Float</code>.
*
*/
@@ -1357,13 +1431,12 @@ int_to_f(mrb_state *mrb, mrb_value num)
*/
/* ------------------------------------------------------------------------*/
MRB_API mrb_value
-mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x)
+mrb_float_to_integer(mrb_state *mrb, mrb_value x)
{
mrb_int z = 0;
if (!mrb_float_p(x)) {
mrb_raise(mrb, E_TYPE_ERROR, "non float value");
- z = 0; /* not reached. just suppress warnings. */
}
else {
mrb_float d = mrb_float(x);
@@ -1406,7 +1479,7 @@ int_plus(mrb_state *mrb, mrb_value x, mrb_value y)
#ifdef MRB_NO_FLOAT
mrb_raise(mrb, E_TYPE_ERROR, "non integer addition");
#else
- return mrb_float_value(mrb, (mrb_float)a + mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, (mrb_float)a + mrb_as_float(mrb, y));
#endif
}
}
@@ -1419,7 +1492,7 @@ mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y)
}
#ifndef MRB_NO_FLOAT
if (mrb_float_p(x)) {
- return mrb_float_value(mrb, mrb_float(x) + mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, mrb_float(x) + mrb_as_float(mrb, y));
}
#endif
#if defined(MRB_USE_RATIONAL) || defined(MRB_USE_COMPLEX)
@@ -1438,7 +1511,7 @@ mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y)
/* 15.2.8.3.1 */
/*
* call-seq:
- * fix + numeric -> numeric_result
+ * int + numeric -> numeric_result
*
* Performs addition: the class of the resulting object depends on
* the class of <code>numeric</code> and on the magnitude of the
@@ -1478,7 +1551,7 @@ int_minus(mrb_state *mrb, mrb_value x, mrb_value y)
#ifdef MRB_NO_FLOAT
mrb_raise(mrb, E_TYPE_ERROR, "non integer subtraction");
#else
- return mrb_float_value(mrb, (mrb_float)a - mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, (mrb_float)a - mrb_as_float(mrb, y));
#endif
}
}
@@ -1491,7 +1564,7 @@ mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y)
}
#ifndef MRB_NO_FLOAT
if (mrb_float_p(x)) {
- return mrb_float_value(mrb, mrb_float(x) - mrb_to_flo(mrb, y));
+ return mrb_float_value(mrb, mrb_float(x) - mrb_as_float(mrb, y));
}
#endif
#if defined(MRB_USE_RATIONAL) || defined(MRB_USE_COMPLEX)
@@ -1511,7 +1584,7 @@ mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y)
/* 15.2.8.3.16 */
/*
* call-seq:
- * fix - numeric -> numeric_result
+ * int - numeric -> numeric_result
*
* Performs subtraction: the class of the resulting object depends on
* the class of <code>numeric</code> and on the magnitude of the
@@ -1525,35 +1598,51 @@ int_sub(mrb_state *mrb, mrb_value self)
return int_minus(mrb, self, other);
}
-
-MRB_API mrb_value
-mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base)
+MRB_API char*
+mrb_int_to_cstr(char *buf, size_t len, mrb_int n, mrb_int base)
{
- char buf[MRB_INT_BIT+1];
- char *b = buf + sizeof buf;
- mrb_int val = mrb_integer(x);
- mrb_value str;
+ char *bufend = buf + len;
+ char *b = bufend-1;
- if (base < 2 || 36 < base) {
- mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %i", base);
- }
+ if (base < 2 || 36 < base) return NULL;
+ if (len < 2) return NULL;
- if (val == 0) {
- *--b = '0';
+ if (n == 0) {
+ buf[0] = '0';
+ buf[1] = '\0';
+ return buf;
}
- else if (val < 0) {
+
+ *b = '\0';
+ if (n < 0) {
do {
- *--b = mrb_digitmap[-(val % base)];
- } while (val /= base);
- *--b = '-';
+ if (b-- == buf) return NULL;
+ *b = mrb_digitmap[-(n % base)];
+ } while (n /= base);
+ if (b-- == buf) return NULL;
+ *b = '-';
}
else {
do {
- *--b = mrb_digitmap[(int)(val % base)];
- } while (val /= base);
+ if (b-- == buf) return NULL;
+ *b = mrb_digitmap[(int)(n % base)];
+ } while (n /= base);
}
+ return b;
+}
- str = mrb_str_new(mrb, b, buf + sizeof(buf) - b);
+MRB_API mrb_value
+mrb_integer_to_str(mrb_state *mrb, mrb_value x, mrb_int base)
+{
+ char buf[MRB_INT_BIT+1];
+ mrb_int val = mrb_integer(x);
+
+ if (base < 2 || 36 < base) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %i", base);
+ }
+ const char *p = mrb_int_to_cstr(buf, sizeof(buf), val, base);
+ mrb_assert(p != NULL);
+ mrb_value str = mrb_str_new_cstr(mrb, p);
RSTR_SET_ASCII_FLAG(mrb_str_ptr(str));
return str;
}
@@ -1561,9 +1650,9 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base)
/* 15.2.8.3.25 */
/*
* call-seq:
- * fix.to_s(base=10) -> string
+ * int.to_s(base=10) -> string
*
- * Returns a string containing the representation of <i>fix</i> radix
+ * Returns a string containing the representation of <i>int</i> radix
* <i>base</i> (between 2 and 36).
*
* 12345.to_s #=> "12345"
@@ -1580,7 +1669,7 @@ int_to_s(mrb_state *mrb, mrb_value self)
mrb_int base = 10;
mrb_get_args(mrb, "|i", &base);
- return mrb_fixnum_to_str(mrb, self, base);
+ return mrb_integer_to_str(mrb, self, base);
}
/* compare two numbers: (1:0:-1; -2 for error) */
@@ -1596,7 +1685,7 @@ cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2)
#ifdef MRB_NO_FLOAT
x = mrb_integer(v1);
#else
- x = mrb_to_flo(mrb, v1);
+ x = mrb_as_float(mrb, v1);
#endif
switch (mrb_type(v2)) {
case MRB_TT_INTEGER:
@@ -1612,7 +1701,7 @@ cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2)
break;
#ifdef MRB_USE_RATIONAL
case MRB_TT_RATIONAL:
- y = mrb_to_flo(mrb, v2);
+ y = mrb_as_float(mrb, v2);
break;
#endif
#endif
@@ -1635,7 +1724,7 @@ cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2)
* < => -1
* = => 0
* > => +1
- * Comparison---Returns -1, 0, or +1 depending on whether <i>fix</i> is
+ * Comparison---Returns -1, 0, or +1 depending on whether <i>int</i> is
* less than, equal to, or greater than <i>numeric</i>. This is the
* basis for the tests in <code>Comparable</code>. When the operands are
* not comparable, it returns nil instead of raising an exception.
@@ -1817,21 +1906,21 @@ mrb_init_numeric(mrb_state *mrb)
mrb_define_method(mrb, fl, "^", flo_xor, MRB_ARGS_REQ(1));
mrb_define_method(mrb, fl, ">>", flo_rshift, MRB_ARGS_REQ(1));
mrb_define_method(mrb, fl, "<<", flo_lshift, MRB_ARGS_REQ(1));
- mrb_define_method(mrb, fl, "ceil", flo_ceil, MRB_ARGS_NONE()); /* 15.2.9.3.8 */
+ mrb_define_method(mrb, fl, "ceil", flo_ceil, MRB_ARGS_OPT(1)); /* 15.2.9.3.8 */
mrb_define_method(mrb, fl, "finite?", flo_finite_p, MRB_ARGS_NONE()); /* 15.2.9.3.9 */
- mrb_define_method(mrb, fl, "floor", flo_floor, MRB_ARGS_NONE()); /* 15.2.9.3.10 */
+ mrb_define_method(mrb, fl, "floor", flo_floor, MRB_ARGS_OPT(1)); /* 15.2.9.3.10 */
mrb_define_method(mrb, fl, "infinite?", flo_infinite_p, MRB_ARGS_NONE()); /* 15.2.9.3.11 */
mrb_define_method(mrb, fl, "round", flo_round, MRB_ARGS_OPT(1)); /* 15.2.9.3.12 */
mrb_define_method(mrb, fl, "to_f", flo_to_f, MRB_ARGS_NONE()); /* 15.2.9.3.13 */
- mrb_define_method(mrb, fl, "to_i", flo_truncate, MRB_ARGS_NONE()); /* 15.2.9.3.14 */
- mrb_define_method(mrb, fl, "to_int", flo_truncate, MRB_ARGS_NONE());
- mrb_define_method(mrb, fl, "truncate", flo_truncate, MRB_ARGS_NONE()); /* 15.2.9.3.15 */
+ mrb_define_method(mrb, fl, "to_i", flo_to_i, MRB_ARGS_NONE()); /* 15.2.9.3.14 */
+ mrb_define_method(mrb, fl, "truncate", flo_truncate, MRB_ARGS_OPT(1)); /* 15.2.9.3.15 */
mrb_define_method(mrb, fl, "divmod", flo_divmod, MRB_ARGS_REQ(1));
mrb_define_method(mrb, fl, "eql?", flo_eql, MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
mrb_define_method(mrb, fl, "to_s", flo_to_s, MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
mrb_define_method(mrb, fl, "inspect", flo_to_s, MRB_ARGS_NONE());
mrb_define_method(mrb, fl, "nan?", flo_nan_p, MRB_ARGS_NONE());
+ mrb_define_method(mrb, fl, "abs", flo_abs, MRB_ARGS_NONE()); /* 15.2.7.4.3 */
#ifdef INFINITY
mrb_define_const_id(mrb, fl, MRB_SYM(INFINITY), mrb_float_value(mrb, INFINITY));
diff --git a/src/object.c b/src/object.c
index a44eab4bb..b3c9973bf 100644
--- a/src/object.c
+++ b/src/object.c
@@ -316,44 +316,15 @@ mrb_init_object(mrb_state *mrb)
mrb_define_method(mrb, f, "inspect", false_to_s, MRB_ARGS_NONE());
}
-static const struct types {
- const enum mrb_vtype type;
- const char *name;
-} builtin_types[] = {
-/* {MRB_TT_NIL, "nil"}, */
- {MRB_TT_FALSE, "false"},
- {MRB_TT_TRUE, "true"},
- {MRB_TT_INTEGER,"Integer"},
- {MRB_TT_SYMBOL, "Symbol"}, /* :symbol */
- {MRB_TT_MODULE, "Module"},
- {MRB_TT_OBJECT, "Object"},
- {MRB_TT_CLASS, "Class"},
- {MRB_TT_ICLASS, "iClass"}, /* internal use: mixed-in module holder */
- {MRB_TT_SCLASS, "SClass"},
- {MRB_TT_PROC, "Proc"},
-#ifndef MRB_NO_FLOAT
- {MRB_TT_FLOAT, "Float"},
-#endif
- {MRB_TT_ARRAY, "Array"},
- {MRB_TT_HASH, "Hash"},
- {MRB_TT_STRING, "String"},
- {MRB_TT_RANGE, "Range"},
-/* {MRB_TT_BIGNUM, "Bignum"}, */
- {MRB_TT_DATA, "Data"}, /* internal use: wrapped C pointers */
-/* {MRB_TT_UNDEF, "undef"}, */ /* internal use: #undef; should not happen */
- {MRB_TT_MAXDEFINE, 0}
-};
-
static const char*
type_name(enum mrb_vtype t)
{
- const struct types *type = builtin_types;
-
- while (type->type < MRB_TT_MAXDEFINE) {
- if (type->type == t) return type->name;
- type++;
+ switch (t) {
+#define MRB_VTYPE_NAME(tt, type, name) case tt: return name;
+ MRB_VTYPE_FOREACH(MRB_VTYPE_NAME)
+#undef MRB_VTYPE_NAME
+ default: return NULL;
}
- return NULL;
}
static mrb_value
@@ -409,7 +380,7 @@ mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t)
ename = "nil";
}
else if (mrb_integer_p(x)) {
- ename = "Fixnum";
+ ename = "Integer";
}
else if (mrb_symbol_p(x)) {
ename = "Symbol";
@@ -507,13 +478,13 @@ mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c)
}
MRB_API mrb_value
-mrb_to_int(mrb_state *mrb, mrb_value val)
+mrb_to_integer(mrb_state *mrb, mrb_value val)
{
if (!mrb_integer_p(val)) {
#ifndef MRB_NO_FLOAT
if (mrb_float_p(val)) {
- return mrb_flo_to_fixnum(mrb, val);
+ return mrb_float_to_integer(mrb, val);
}
#endif
if (mrb_string_p(val)) {
@@ -524,55 +495,9 @@ mrb_to_int(mrb_state *mrb, mrb_value val)
return val;
}
-MRB_API mrb_value
-mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base)
-{
- mrb_value tmp;
-
- if (mrb_nil_p(val)) {
- if (base != 0) goto arg_error;
- mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Integer");
- }
- switch (mrb_type(val)) {
-#ifndef MRB_NO_FLOAT
- case MRB_TT_FLOAT:
- if (base != 0) goto arg_error;
- return mrb_flo_to_fixnum(mrb, val);
-#endif
-
- case MRB_TT_INTEGER:
- if (base != 0) goto arg_error;
- return val;
-
- case MRB_TT_STRING:
- string_conv:
- return mrb_str_to_inum(mrb, val, base, TRUE);
-
- default:
- break;
- }
- if (base != 0) {
- tmp = mrb_check_string_type(mrb, val);
- if (!mrb_nil_p(tmp)) {
- val = tmp;
- goto string_conv;
- }
-arg_error:
- mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value");
- }
- /* to raise TypeError */
- return mrb_to_int(mrb, val);
-}
-
-MRB_API mrb_value
-mrb_Integer(mrb_state *mrb, mrb_value val)
-{
- return mrb_convert_to_integer(mrb, val, 0);
-}
-
#ifndef MRB_NO_FLOAT
MRB_API mrb_value
-mrb_Float(mrb_state *mrb, mrb_value val)
+mrb_to_float(mrb_state *mrb, mrb_value val)
{
if (mrb_nil_p(val)) {
mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Float");
@@ -594,19 +519,6 @@ mrb_Float(mrb_state *mrb, mrb_value val)
#endif
MRB_API mrb_value
-mrb_to_str(mrb_state *mrb, mrb_value val)
-{
- return mrb_ensure_string_type(mrb, val);
-}
-
-/* obsolete: use mrb_ensure_string_type() instead */
-MRB_API mrb_value
-mrb_string_type(mrb_state *mrb, mrb_value str)
-{
- return mrb_ensure_string_type(mrb, str);
-}
-
-MRB_API mrb_value
mrb_ensure_string_type(mrb_state *mrb, mrb_value str)
{
if (!mrb_string_p(str)) {
diff --git a/src/proc.c b/src/proc.c
index 78ce0e791..d48145f13 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -46,7 +46,7 @@ mrb_proc_new(mrb_state *mrb, const mrb_irep *irep)
struct RProc *p;
mrb_callinfo *ci = mrb->c->ci;
- p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ p = MRB_OBJ_ALLOC(mrb, MRB_TT_PROC, mrb->proc_class);
if (ci) {
struct RClass *tc = NULL;
@@ -81,7 +81,8 @@ mrb_env_new(mrb_state *mrb, struct mrb_context *c, mrb_callinfo *ci, int nstacks
struct REnv *e;
mrb_int bidx;
- e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, tc);
+ e = MRB_OBJ_ALLOC(mrb, MRB_TT_ENV, NULL);
+ e->c = tc;
MRB_ENV_SET_LEN(e, nstacks);
bidx = ci->argc;
if (bidx < 0) bidx = 2;
@@ -105,7 +106,7 @@ closure_setup(mrb_state *mrb, struct RProc *p)
/* do nothing, because e is assigned already */
}
else if (up) {
- struct RClass *tc = MRB_PROC_TARGET_CLASS(p);
+ struct RClass *tc = ci->u.target_class;
e = mrb_env_new(mrb, mrb->c, ci, up->body.irep->nlocals, ci->stack, tc);
ci->u.env = e;
@@ -134,7 +135,7 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func)
{
struct RProc *p;
- p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ p = MRB_OBJ_ALLOC(mrb, MRB_TT_PROC, mrb->proc_class);
p->body.func = func;
p->flags |= MRB_PROC_CFUNC_FL;
p->upper = 0;
@@ -224,7 +225,7 @@ mrb_proc_s_new(mrb_state *mrb, mrb_value proc_class)
/* Calling Proc.new without a block is not implemented yet */
mrb_get_args(mrb, "&!", &blk);
- p = (struct RProc *)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb_class_ptr(proc_class));
+ p = MRB_OBJ_ALLOC(mrb, MRB_TT_PROC, mrb_class_ptr(proc_class));
mrb_proc_copy(p, mrb_proc_ptr(blk));
proc = mrb_obj_value(p);
mrb_funcall_with_block(mrb, proc, MRB_SYM(initialize), 0, NULL, proc);
@@ -278,7 +279,7 @@ proc_lambda(mrb_state *mrb, mrb_value self)
}
p = mrb_proc_ptr(blk);
if (!MRB_PROC_STRICT_P(p)) {
- struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c);
+ struct RProc *p2 = MRB_OBJ_ALLOC(mrb, MRB_TT_PROC, p->c);
mrb_proc_copy(p2, p);
p2->flags |= MRB_PROC_STRICT;
return mrb_obj_value(p2);
@@ -417,7 +418,19 @@ mrb_proc_merge_lvar(mrb_state *mrb, mrb_irep *irep, struct REnv *env, int num, c
mrb_sym *destlv = (mrb_sym*)irep->lv + irep->nlocals - 1 /* self */;
mrb_value *destst = env->stack + irep->nlocals;
memmove(destlv, lv, sizeof(mrb_sym) * num);
- memmove(destst, stack, sizeof(mrb_value) * num);
+ if (stack) {
+ memmove(destst, stack, sizeof(mrb_value) * num);
+ for (int i = 0; i < num; i++) {
+ if (!mrb_immediate_p(stack[i])) {
+ mrb_field_write_barrier(mrb, (struct RBasic*)env, (struct RBasic*)mrb_obj_ptr(stack[i]));
+ }
+ }
+ }
+ else {
+ for (int i = num; i > 0; i--, destst++) {
+ *destst = mrb_nil_value();
+ }
+ }
irep->nlocals += num;
irep->nregs = irep->nlocals;
MRB_ENV_SET_LEN(env, irep->nlocals);
diff --git a/src/range.c b/src/range.c
index cb60bb63c..7507173b6 100644
--- a/src/range.c
+++ b/src/range.c
@@ -9,11 +9,12 @@
#include <mruby/range.h>
#include <mruby/string.h>
#include <mruby/array.h>
+#include <mruby/numeric.h>
#include <mruby/presym.h>
-#define RANGE_INITIALIZED_MASK 1
-#define RANGE_INITIALIZED(p) ((p)->flags |= RANGE_INITIALIZED_MASK)
-#define RANGE_INITIALIZED_P(p) ((p)->flags & RANGE_INITIALIZED_MASK)
+#define RANGE_INITIALIZED_FLAG 1
+#define RANGE_INITIALIZED(p) ((p)->flags |= RANGE_INITIALIZED_FLAG)
+#define RANGE_INITIALIZED_P(p) ((p)->flags & RANGE_INITIALIZED_FLAG)
static void
r_check(mrb_state *mrb, mrb_value a, mrb_value b)
@@ -25,13 +26,13 @@ r_check(mrb_state *mrb, mrb_value a, mrb_value b)
ta = mrb_type(a);
tb = mrb_type(b);
#ifdef MRB_NO_FLOAT
- if (ta == MRB_TT_INTEGER && tb == MRB_TT_INTEGER ) {
+ if (ta == MRB_TT_INTEGER && tb == MRB_TT_INTEGER ) return;
#else
if ((ta == MRB_TT_INTEGER || ta == MRB_TT_FLOAT) &&
(tb == MRB_TT_INTEGER || tb == MRB_TT_FLOAT)) {
-#endif
return;
}
+#endif
if (mrb_nil_p(a) || mrb_nil_p(b)) return;
@@ -88,7 +89,7 @@ range_ptr_init(mrb_state *mrb, struct RRange *r, mrb_value beg, mrb_value end, m
}
}
else {
- r = (struct RRange*)mrb_obj_alloc(mrb, MRB_TT_RANGE, mrb->range_class);
+ r = MRB_OBJ_ALLOC(mrb, MRB_TT_RANGE, mrb->range_class);
range_ptr_alloc_edges(mrb, r);
}
@@ -342,6 +343,59 @@ range_initialize_copy(mrb_state *mrb, mrb_value copy)
return copy;
}
+static mrb_value
+range_num_to_a(mrb_state *mrb, mrb_value range)
+{
+ struct RRange *r = mrb_range_ptr(mrb, range);
+ mrb_value beg = RANGE_BEG(r);
+ mrb_value end = RANGE_END(r);
+ mrb_value ary;
+
+ mrb->c->ci->mid = 0;
+ if (mrb_nil_p(end)) {
+ mrb_raise(mrb, E_RANGE_ERROR, "cannot convert endless range to an array");
+ }
+ if (mrb_integer_p(beg)) {
+ if (mrb_integer_p(end)) {
+ mrb_int a = mrb_integer(beg);
+ mrb_int b = mrb_integer(end);
+ mrb_int len;
+
+ if (mrb_int_sub_overflow(b, a, &len)) {
+ mrb_raise(mrb, E_RANGE_ERROR, "integer range too long");
+ }
+ if (!RANGE_EXCL(r)) len++;
+ ary = mrb_ary_new_capa(mrb, len);
+ for (mrb_int i=0; i<len; i++) {
+ mrb_ary_push(mrb, ary, mrb_int_value(mrb, a+i));
+ }
+ return ary;
+ }
+#ifndef MRB_NO_FLOAT
+ if (mrb_float_p(end)) {
+ mrb_float a = (mrb_float)mrb_integer(beg);
+ mrb_float b = mrb_float(end);
+
+ ary = mrb_ary_new_capa(mrb, (mrb_int)(b - a) + 1);
+ if (RANGE_EXCL(r)) {
+ while (a < b) {
+ mrb_ary_push(mrb, ary, mrb_int_value(mrb, (mrb_int)a));
+ a += 1.0;
+ }
+ }
+ else {
+ while (a <= b) {
+ mrb_ary_push(mrb, ary, mrb_int_value(mrb, (mrb_int)a));
+ a += 1.0;
+ }
+ }
+ return ary;
+ }
+#endif
+ }
+ return mrb_nil_value();
+}
+
mrb_value
mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int))
{
@@ -409,8 +463,8 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp,
if (!mrb_range_p(range)) return MRB_RANGE_TYPE_MISMATCH;
r = mrb_range_ptr(mrb, range);
- beg = mrb_nil_p(RANGE_BEG(r)) ? 0 : mrb_int(mrb, RANGE_BEG(r));
- end = mrb_nil_p(RANGE_END(r)) ? -1 : mrb_int(mrb, RANGE_END(r));
+ beg = mrb_nil_p(RANGE_BEG(r)) ? 0 : mrb_as_int(mrb, RANGE_BEG(r));
+ end = mrb_nil_p(RANGE_END(r)) ? -1 : mrb_as_int(mrb, RANGE_END(r));
excl = mrb_nil_p(RANGE_END(r)) ? 0 : RANGE_EXCL(r);
if (beg < 0) {
@@ -456,4 +510,5 @@ mrb_init_range(mrb_state *mrb)
mrb_define_method(mrb, r, "inspect", range_inspect, MRB_ARGS_NONE()); /* 15.2.14.4.13(x) */
mrb_define_method(mrb, r, "eql?", range_eql, MRB_ARGS_REQ(1)); /* 15.2.14.4.14(x) */
mrb_define_method(mrb, r, "initialize_copy", range_initialize_copy, MRB_ARGS_REQ(1)); /* 15.2.14.4.15(x) */
+ mrb_define_method(mrb, r, "__num_to_a", range_num_to_a, MRB_ARGS_NONE());
}
diff --git a/src/readflt.c b/src/readflt.c
new file mode 100644
index 000000000..b320a43c1
--- /dev/null
+++ b/src/readflt.c
@@ -0,0 +1,119 @@
+#include <mruby.h>
+
+#ifndef MRB_NO_FLOAT
+/*
+ * strtod implementation.
+ * author: Yasuhiro Matsumoto (@mattn)
+ * license: public domain
+ */
+
+/*
+The original code can be found in https://github.com/mattn/strtod
+
+I modified the routine for mruby:
+
+ * renamed the function `vim_strtod` -> `mrb_float_read`
+ * simplified the code
+
+My modifications in this file are also placed in the public domain.
+
+Matz (Yukihiro Matsumoto)
+*/
+
+#include <string.h>
+#include <math.h>
+#include <errno.h>
+
+MRB_API double
+mrb_float_read(const char *str, char **end)
+{
+ double d = 0.0;
+ int sign;
+ int n = 0;
+ const char *p, *a;
+
+ a = p = str;
+ while (ISSPACE(*p))
+ ++p;
+
+ /* decimal part */
+ sign = 1;
+ if (*p == '-') {
+ sign = -1;
+ ++p;
+ } else if (*p == '+')
+ ++p;
+ if (ISDIGIT(*p)) {
+ d = (double)(*p++ - '0');
+ while (*p && ISDIGIT(*p)) {
+ d = d * 10.0 + (double)(*p - '0');
+ ++p;
+ ++n;
+ }
+ a = p;
+ } else if (*p != '.')
+ goto done;
+ d *= sign;
+
+ /* fraction part */
+ if (*p == '.') {
+ double f = 0.0;
+ double base = 0.1;
+ ++p;
+
+ if (ISDIGIT(*p))
+ {
+ while (*p && ISDIGIT(*p)) {
+ f += base * (*p - '0') ;
+ base /= 10.0;
+ ++p;
+ ++n;
+ }
+ }
+ d += f * sign;
+ a = p;
+ }
+
+ /* exponential part */
+ if ((*p == 'E') || (*p == 'e')) {
+ int e = 0;
+ ++p;
+
+ sign = 1;
+ if (*p == '-') {
+ sign = -1;
+ ++p;
+ } else if (*p == '+')
+ ++p;
+
+ if (ISDIGIT(*p)) {
+ while (*p == '0')
+ ++p;
+ if (*p == '\0') --p;
+ e = (int)(*p++ - '0');
+ for (; *p && ISDIGIT(*p); p++) {
+ if (e < 10000)
+ e = e * 10 + (*p - '0');
+ }
+ e *= sign;
+ }
+ else if (!ISDIGIT(*(a-1))) {
+ a = str;
+ goto done;
+ }
+ else if (*p == 0)
+ goto done;
+ d *= pow(10.0, (double) e);
+ a = p;
+ }
+ else if (p > str && !ISDIGIT(*(p-1))) {
+ a = str;
+ goto done;
+ }
+
+done:
+ if (end)
+ *end = (char*)a;
+ return d;
+}
+#endif
diff --git a/src/readint.c b/src/readint.c
new file mode 100644
index 000000000..5fae222c2
--- /dev/null
+++ b/src/readint.c
@@ -0,0 +1,30 @@
+#include <mruby.h>
+#include <mruby/numeric.h>
+#include <errno.h>
+
+/* mrb_int_read(): read mrb_int from a string (base 10 only) */
+/* const char *p - string to read */
+/* const char *e - end of string */
+/* char **endp - end of parsed integer */
+
+/* if integer overflows, errno will be set to ERANGE */
+/* also endp will be set to NULL on overflow */
+MRB_API mrb_int
+mrb_int_read(const char *p, const char *e, char **endp)
+{
+ mrb_int n = 0;
+ int ch;
+
+ while ((e == NULL || p < e) && ISDIGIT(*p)) {
+ ch = *p - '0';
+ if (mrb_int_mul_overflow(n, 10, &n) ||
+ mrb_int_add_overflow(n, ch, &n)) {
+ if (endp) *endp = NULL;
+ errno = ERANGE;
+ return MRB_INT_MAX;
+ }
+ p++;
+ }
+ if (endp) *endp = (char*)p;
+ return n;
+}
diff --git a/src/string.c b/src/string.c
index e440bff8c..ac0f4a920 100644
--- a/src/string.c
+++ b/src/string.c
@@ -8,14 +8,6 @@
# define _CRT_NONSTDC_NO_DEPRECATE
#endif
-#ifndef MRB_NO_FLOAT
-#include <float.h>
-#include <math.h>
-#endif
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
#include <mruby.h>
#include <mruby/array.h>
#include <mruby/class.h>
@@ -23,6 +15,7 @@
#include <mruby/string.h>
#include <mruby/numeric.h>
#include <mruby/presym.h>
+#include <string.h>
typedef struct mrb_shared_string {
int refcnt;
@@ -32,7 +25,7 @@ typedef struct mrb_shared_string {
const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
-#define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class))
+#define mrb_obj_alloc_string(mrb) MRB_OBJ_ALLOC((mrb), MRB_TT_STRING, (mrb)->string_class)
static struct RString*
str_init_normal_capa(mrb_state *mrb, struct RString *s,
@@ -244,7 +237,7 @@ str_modify_keep_ascii(mrb_state *mrb, struct RString *s)
static void
check_null_byte(mrb_state *mrb, mrb_value str)
{
- mrb_to_str(mrb, str);
+ mrb_ensure_string_type(mrb, str);
if (memchr(RSTRING_PTR(str), '\0', RSTRING_LEN(str))) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
}
@@ -839,8 +832,15 @@ mrb_str_to_cstr(mrb_state *mrb, mrb_value str0)
{
struct RString *s;
+ const char *p = RSTRING_PTR(str0);
+ size_t len = RSTRING_LEN(str0);
check_null_byte(mrb, str0);
- s = str_new(mrb, RSTRING_PTR(str0), RSTRING_LEN(str0));
+ if (RSTR_EMBEDDABLE_P(len)) {
+ s = str_init_embed(mrb_obj_alloc_string(mrb), p, len);
+ }
+ else {
+ s = str_init_normal(mrb, mrb_obj_alloc_string(mrb), p, len);
+ }
return RSTR_PTR(s);
}
@@ -897,14 +897,14 @@ static mrb_value
mrb_str_size(mrb_state *mrb, mrb_value self)
{
mrb_int len = RSTRING_CHAR_LEN(self);
- return mrb_fixnum_value(len);
+ return mrb_int_value(mrb, len);
}
static mrb_value
mrb_str_bytesize(mrb_state *mrb, mrb_value self)
{
mrb_int len = RSTRING_LEN(self);
- return mrb_fixnum_value(len);
+ return mrb_int_value(mrb, len);
}
/* 15.2.10.5.1 */
@@ -1018,7 +1018,7 @@ mrb_str_cmp_m(mrb_state *mrb, mrb_value str1)
else {
result = mrb_str_cmp(mrb, str1, str2);
}
- return mrb_fixnum_value(result);
+ return mrb_int_value(mrb, result);
}
static mrb_bool
@@ -1071,7 +1071,7 @@ mrb_string_value_ptr(mrb_state *mrb, mrb_value str)
MRB_API mrb_int
mrb_string_value_len(mrb_state *mrb, mrb_value ptr)
{
- mrb_to_str(mrb, ptr);
+ mrb_ensure_string_type(mrb, ptr);
return RSTRING_LEN(ptr);
}
@@ -1102,8 +1102,8 @@ static enum str_convert_range
str_convert_range(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_int *beg, mrb_int *len)
{
if (!mrb_undef_p(alen)) {
- *beg = mrb_int(mrb, indx);
- *len = mrb_int(mrb, alen);
+ *beg = mrb_as_int(mrb, indx);
+ *len = mrb_as_int(mrb, alen);
return STR_CHAR_RANGE;
}
else {
@@ -1123,7 +1123,7 @@ str_convert_range(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen,
goto range_arg;
default:
- indx = mrb_to_int(mrb, indx);
+ indx = mrb_to_integer(mrb, indx);
if (mrb_integer_p(indx)) {
*beg = mrb_integer(indx);
*len = 1;
@@ -1175,14 +1175,14 @@ mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen)
/* 15.2.10.5.34 */
/*
* call-seq:
- * str[fixnum] => fixnum or nil
- * str[fixnum, fixnum] => new_str or nil
- * str[range] => new_str or nil
- * str[other_str] => new_str or nil
- * str.slice(fixnum) => fixnum or nil
- * str.slice(fixnum, fixnum) => new_str or nil
- * str.slice(range) => new_str or nil
- * str.slice(other_str) => new_str or nil
+ * str[int] => int or nil
+ * str[int, int] => new_str or nil
+ * str[range] => new_str or nil
+ * str[other_str] => new_str or nil
+ * str.slice(int) => int or nil
+ * str.slice(int, int) => new_str or nil
+ * str.slice(range) => new_str or nil
+ * str.slice(other_str) => new_str or nil
*
* Element Reference---If passed a single <code>Integer</code>, returns the code
* of the character at that position. If passed two <code>Integer</code>
@@ -1239,13 +1239,11 @@ str_replace_partial(mrb_state *mrb, mrb_value src, mrb_int pos, mrb_int end, mrb
if (end > len) { end = len; }
if (pos < 0 || pos > len) {
- str_out_of_index(mrb, mrb_fixnum_value(pos));
+ str_out_of_index(mrb, mrb_int_value(mrb, pos));
}
replen = (mrb_nil_p(rep) ? 0 : RSTRING_LEN(rep));
- newlen = replen + (len - (end - pos));
-
- if (newlen >= MRB_SSIZE_MAX || newlen < replen /* overflowed */) {
+ if (mrb_int_add_overflow(replen, len - (end - pos), &newlen) || newlen >= MRB_SSIZE_MAX) {
mrb_raise(mrb, E_RUNTIME_ERROR, "string size too big");
}
@@ -1358,8 +1356,7 @@ mrb_str_aset(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_
{
mrb_int beg, len, charlen;
- mrb_to_str(mrb, replace);
-
+ mrb_ensure_string_type(mrb, replace);
switch (str_convert_range(mrb, str, indx, alen, &beg, &len)) {
case STR_OUT_OF_RANGE:
default:
@@ -1376,14 +1373,17 @@ mrb_str_aset(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_
str_range_to_bytes(str, &beg, &len);
/* fall through */
case STR_BYTE_RANGE_CORRECTED:
- str_replace_partial(mrb, str, beg, beg + len, replace);
+ if (mrb_int_add_overflow(beg, len, &len)) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "string index too big");
+ }
+ str_replace_partial(mrb, str, beg, len, replace);
}
}
/*
* call-seq:
- * str[fixnum] = replace
- * str[fixnum, fixnum] = replace
+ * str[int] = replace
+ * str[int, int] = replace
* str[range] = replace
* str[other_str] = replace
*
@@ -1754,7 +1754,7 @@ mrb_str_hash(mrb_state *mrb, mrb_value str)
/* 15.2.10.5.20 */
/*
* call-seq:
- * str.hash => fixnum
+ * str.hash => int
*
* Return a hash based on the string's length and content.
*/
@@ -1762,14 +1762,14 @@ static mrb_value
mrb_str_hash_m(mrb_state *mrb, mrb_value self)
{
mrb_int key = mrb_str_hash(mrb, self);
- return mrb_fixnum_value(key);
+ return mrb_int_value(mrb, key);
}
/* 15.2.10.5.21 */
/*
* call-seq:
* str.include? other_str => true or false
- * str.include? fixnum => true or false
+ * str.include? int => true or false
*
* Returns <code>true</code> if <i>str</i> contains the given string or
* character.
@@ -1792,7 +1792,7 @@ mrb_str_include(mrb_state *mrb, mrb_value self)
/* 15.2.10.5.22 */
/*
* call-seq:
- * str.index(substring [, offset]) => fixnum or nil
+ * str.index(substring [, offset]) => int or nil
*
* Returns the index of the first occurrence of the given
* <i>substring</i>. Returns <code>nil</code> if not found.
@@ -1824,7 +1824,7 @@ mrb_str_index_m(mrb_state *mrb, mrb_value str)
if (pos == -1) return mrb_nil_value();
BYTES_ALIGN_CHECK(pos);
- return mrb_fixnum_value(pos);
+ return mrb_int_value(mrb, pos);
}
/* 15.2.10.5.24 */
@@ -1873,7 +1873,7 @@ mrb_str_init(mrb_state *mrb, mrb_value self)
* str.to_sym => symbol
*
* Returns the <code>Symbol</code> corresponding to <i>str</i>, creating the
- * symbol if it did not previously exist. See <code>Symbol#id2name</code>.
+ * symbol if it did not previously exist.
*
* "Koala".intern #=> :Koala
* s = 'cat'.to_sym #=> :cat
@@ -1901,7 +1901,7 @@ mrb_obj_as_string(mrb_state *mrb, mrb_value obj)
case MRB_TT_SYMBOL:
return mrb_sym_str(mrb, mrb_symbol(obj));
case MRB_TT_INTEGER:
- return mrb_fixnum_to_str(mrb, obj, 10);
+ return mrb_integer_to_str(mrb, obj, 10);
case MRB_TT_SCLASS:
case MRB_TT_CLASS:
case MRB_TT_MODULE:
@@ -2018,7 +2018,7 @@ mrb_str_reverse(mrb_state *mrb, mrb_value str)
/* 15.2.10.5.31 */
/*
* call-seq:
- * str.rindex(substring [, offset]) => fixnum or nil
+ * str.rindex(substring [, offset]) => int or nil
*
* Returns the index of the last occurrence of the given <i>substring</i>.
* Returns <code>nil</code> if not found. If the second parameter is
@@ -2053,7 +2053,7 @@ mrb_str_rindex(mrb_state *mrb, mrb_value str)
if (pos >= 0) {
pos = bytes2chars(RSTRING_PTR(str), RSTRING_LEN(str), pos);
BYTES_ALIGN_CHECK(pos);
- return mrb_fixnum_value(pos);
+ return mrb_int_value(mrb, pos);
}
return mrb_nil_value();
}
@@ -2199,8 +2199,8 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
return result;
}
-mrb_value
-mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, int badcheck)
+static mrb_value
+mrb_str_len_to_integer(mrb_state *mrb, const char *str, size_t len, mrb_int base, int badcheck)
{
const char *p = str;
const char *pend = str + len;
@@ -2363,12 +2363,6 @@ mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, i
return mrb_fixnum_value(0);
}
-MRB_API mrb_value
-mrb_cstr_to_inum(mrb_state *mrb, const char *str, mrb_int base, mrb_bool badcheck)
-{
- return mrb_str_len_to_inum(mrb, str, strlen(str), base, badcheck);
-}
-
/* obslete: use RSTRING_CSTR() or mrb_string_cstr() */
MRB_API const char*
mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr)
@@ -2401,15 +2395,15 @@ mrb_string_cstr(mrb_state *mrb, mrb_value str)
}
MRB_API mrb_value
-mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck)
+mrb_str_to_integer(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck)
{
const char *s;
mrb_int len;
- mrb_to_str(mrb, str);
+ mrb_ensure_string_type(mrb, str);
s = RSTRING_PTR(str);
len = RSTRING_LEN(str);
- return mrb_str_len_to_inum(mrb, s, len, base, badcheck);
+ return mrb_str_len_to_integer(mrb, s, len, base, badcheck);
}
/* 15.2.10.5.38 */
@@ -2439,14 +2433,14 @@ mrb_str_to_i(mrb_state *mrb, mrb_value self)
mrb_int base = 10;
mrb_get_args(mrb, "|i", &base);
- if (base < 0) {
+ if (base < 0 || 36 < base) {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %i", base);
}
- return mrb_str_to_inum(mrb, self, base, FALSE);
+ return mrb_str_to_integer(mrb, self, base, FALSE);
}
#ifndef MRB_NO_FLOAT
-double
+static double
mrb_str_len_to_dbl(mrb_state *mrb, const char *s, size_t len, mrb_bool badcheck)
{
char buf[DBL_DIG * 4 + 20];
@@ -2466,7 +2460,7 @@ mrb_str_len_to_dbl(mrb_state *mrb, const char *s, size_t len, mrb_bool badcheck)
mrb_value x;
if (!badcheck) return 0.0;
- x = mrb_str_len_to_inum(mrb, p, pend-p, 0, badcheck);
+ x = mrb_str_len_to_integer(mrb, p, pend-p, 0, badcheck);
if (mrb_integer_p(x))
d = (double)mrb_integer(x);
else /* if (mrb_float_p(x)) */
@@ -2536,12 +2530,6 @@ bad:
}
MRB_API double
-mrb_cstr_to_dbl(mrb_state *mrb, const char *s, mrb_bool badcheck)
-{
- return mrb_str_len_to_dbl(mrb, s, strlen(s), badcheck);
-}
-
-MRB_API double
mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck)
{
return mrb_str_len_to_dbl(mrb, RSTRING_PTR(str), RSTRING_LEN(str), badcheck);
@@ -2711,7 +2699,7 @@ mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2)
MRB_API mrb_value
mrb_str_append(mrb_state *mrb, mrb_value str1, mrb_value str2)
{
- mrb_to_str(mrb, str2);
+ mrb_ensure_string_type(mrb, str2);
return mrb_str_cat_str(mrb, str1, str2);
}
@@ -2734,7 +2722,7 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str)
/*
* call-seq:
- * str.bytes -> array of fixnums
+ * str.bytes -> array of int
*
* Returns an array of bytes in _str_.
*
@@ -2843,7 +2831,7 @@ mrb_str_byteslice(mrb_state *mrb, mrb_value str)
}
}
else {
- beg = mrb_integer(mrb_to_int(mrb, a1));
+ beg = mrb_integer(mrb_to_integer(mrb, a1));
len = 1;
empty = FALSE;
}
@@ -2860,6 +2848,51 @@ mrb_str_byteslice(mrb_state *mrb, mrb_value str)
}
}
+static mrb_value
+sub_replace(mrb_state *mrb, mrb_value self)
+{
+ char *p, *match;
+ mrb_int plen, mlen;
+ mrb_int found, offset;
+ mrb_value result;
+
+ mrb_get_args(mrb, "ssi", &p, &plen, &match, &mlen, &found);
+ result = mrb_str_new(mrb, 0, 0);
+ for (mrb_int i=0; i<plen; i++) {
+ if (p[i] != '\\' || i+1==plen) {
+ mrb_str_cat(mrb, result, p+i, 1);
+ continue;
+ }
+ i++;
+ switch (p[i]) {
+ case '\\':
+ mrb_str_cat(mrb, result, "\\", 1);
+ break;
+ case '`':
+ mrb_str_cat(mrb, result, RSTRING_PTR(self), chars2bytes(self, 0, found));
+ break;
+ case '&': case '0':
+ mrb_str_cat(mrb, result, match, mlen);
+ break;
+ case '\'':
+ offset = chars2bytes(self, 0, found) + mlen;
+ if (RSTRING_LEN(self) > offset) {
+ mrb_str_cat(mrb, result, RSTRING_PTR(self)+offset, RSTRING_LEN(self)-offset);
+ }
+ break;
+ case '1': case '2': case '3':
+ case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ /* ignore sub-group match (no Regexp supported) */
+ break;
+ default:
+ mrb_str_cat(mrb, result, &p[i-1], 2);
+ break;
+ }
+ }
+ return result;
+}
+
/* ---------------------------*/
void
mrb_init_string(mrb_state *mrb)
@@ -2921,251 +2954,6 @@ mrb_init_string(mrb_state *mrb)
mrb_define_method(mrb, s, "getbyte", mrb_str_getbyte, MRB_ARGS_REQ(1));
mrb_define_method(mrb, s, "setbyte", mrb_str_setbyte, MRB_ARGS_REQ(2));
mrb_define_method(mrb, s, "byteslice", mrb_str_byteslice, MRB_ARGS_ARG(1,1));
-}
-
-#ifndef MRB_NO_FLOAT
-/*
- * Source code for the "strtod" library procedure.
- *
- * Copyright (c) 1988-1993 The Regents of the University of California.
- * Copyright (c) 1994 Sun Microsystems, Inc.
- *
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies. The University of California
- * makes no representations about the suitability of this
- * software for any purpose. It is provided "as is" without
- * express or implied warranty.
- *
- * RCS: @(#) $Id: strtod.c 11708 2007-02-12 23:01:19Z shyouhei $
- */
-
-#include <ctype.h>
-#include <errno.h>
-
-static const int maxExponent = 511; /* Largest possible base 10 exponent. Any
- * exponent larger than this will already
- * produce underflow or overflow, so there's
- * no need to worry about additional digits.
- */
-static const double powersOf10[] = {/* Table giving binary powers of 10. Entry */
- 10., /* is 10^2^i. Used to convert decimal */
- 100., /* exponents into floating-point numbers. */
- 1.0e4,
- 1.0e8,
- 1.0e16,
- 1.0e32,
- 1.0e64,
- 1.0e128,
- 1.0e256
-};
-
-MRB_API double
-mrb_float_read(const char *string, char **endPtr)
-/* const char *string; A decimal ASCII floating-point number,
- * optionally preceded by white space.
- * Must have form "-I.FE-X", where I is the
- * integer part of the mantissa, F is the
- * fractional part of the mantissa, and X
- * is the exponent. Either of the signs
- * may be "+", "-", or omitted. Either I
- * or F may be omitted, or both. The decimal
- * point isn't necessary unless F is present.
- * The "E" may actually be an "e". E and X
- * may both be omitted (but not just one).
- */
-/* char **endPtr; If non-NULL, store terminating character's
- * address here. */
-{
- int sign, expSign = FALSE;
- double fraction, dblExp;
- const double *d;
- const char *p;
- int c;
- int exp = 0; /* Exponent read from "EX" field. */
- int fracExp = 0; /* Exponent that derives from the fractional
- * part. Under normal circumstances, it is
- * the negative of the number of digits in F.
- * However, if I is very long, the last digits
- * of I get dropped (otherwise a long I with a
- * large negative exponent could cause an
- * unnecessary overflow on I alone). In this
- * case, fracExp is incremented one for each
- * dropped digit. */
- int mantSize; /* Number of digits in mantissa. */
- int decPt; /* Number of mantissa digits BEFORE decimal
- * point. */
- const char *pExp; /* Temporarily holds location of exponent
- * in string. */
-
- /*
- * Strip off leading blanks and check for a sign.
- */
-
- p = string;
- while (ISSPACE(*p)) {
- p += 1;
- }
- if (*p == '-') {
- sign = TRUE;
- p += 1;
- }
- else {
- if (*p == '+') {
- p += 1;
- }
- sign = FALSE;
- }
-
- /*
- * Count the number of digits in the mantissa (including the decimal
- * point), and also locate the decimal point.
- */
-
- decPt = -1;
- for (mantSize = 0; ; mantSize += 1)
- {
- c = *p;
- if (!ISDIGIT(c)) {
- if ((c != '.') || (decPt >= 0)) {
- break;
- }
- decPt = mantSize;
- }
- p += 1;
- }
-
- /*
- * Now suck up the digits in the mantissa. Use two integers to
- * collect 9 digits each (this is faster than using floating-point).
- * If the mantissa has more than 18 digits, ignore the extras, since
- * they can't affect the value anyway.
- */
-
- pExp = p;
- p -= mantSize;
- if (decPt < 0) {
- decPt = mantSize;
- }
- else {
- mantSize -= 1; /* One of the digits was the point. */
- }
- if (mantSize > 18) {
- if (decPt - 18 > 29999) {
- fracExp = 29999;
- }
- else {
- fracExp = decPt - 18;
- }
- mantSize = 18;
- }
- else {
- fracExp = decPt - mantSize;
- }
- if (mantSize == 0) {
- fraction = 0.0;
- p = string;
- goto done;
- }
- else {
- int frac1, frac2;
- frac1 = 0;
- for ( ; mantSize > 9; mantSize -= 1)
- {
- c = *p;
- p += 1;
- if (c == '.') {
- c = *p;
- p += 1;
- }
- frac1 = 10*frac1 + (c - '0');
- }
- frac2 = 0;
- for (; mantSize > 0; mantSize -= 1)
- {
- c = *p;
- p += 1;
- if (c == '.') {
- c = *p;
- p += 1;
- }
- frac2 = 10*frac2 + (c - '0');
- }
- fraction = (1.0e9 * frac1) + frac2;
- }
-
- /*
- * Skim off the exponent.
- */
- p = pExp;
- if ((*p == 'E') || (*p == 'e')) {
- p += 1;
- if (*p == '-') {
- expSign = TRUE;
- p += 1;
- }
- else {
- if (*p == '+') {
- p += 1;
- }
- expSign = FALSE;
- }
- while (ISDIGIT(*p)) {
- exp = exp * 10 + (*p - '0');
- if (exp > 19999) {
- exp = 19999;
- }
- p += 1;
- }
- }
- if (expSign) {
- exp = fracExp - exp;
- }
- else {
- exp = fracExp + exp;
- }
-
- /*
- * Generate a floating-point number that represents the exponent.
- * Do this by processing the exponent one bit at a time to combine
- * many powers of 2 of 10. Then combine the exponent with the
- * fraction.
- */
-
- if (exp < 0) {
- expSign = TRUE;
- exp = -exp;
- }
- else {
- expSign = FALSE;
- }
- if (exp > maxExponent) {
- exp = maxExponent;
- errno = ERANGE;
- }
- dblExp = 1.0;
- for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
- if (exp & 01) {
- dblExp *= *d;
- }
- }
- if (expSign) {
- fraction /= dblExp;
- }
- else {
- fraction *= dblExp;
- }
-
-done:
- if (endPtr != NULL) {
- *endPtr = (char *) p;
- }
-
- if (sign) {
- return -fraction;
- }
- return fraction;
+ mrb_define_method(mrb, s, "__sub_replace", sub_replace, MRB_ARGS_REQ(3)); /* internal */
}
-#endif
diff --git a/src/symbol.c b/src/symbol.c
index 3cd925d99..cc8986eaa 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -4,7 +4,6 @@
** See Copyright Notice in mruby.h
*/
-#include <limits.h>
#include <string.h>
#include <mruby.h>
#include <mruby/khash.h>
@@ -54,13 +53,6 @@ presym_sym2name(mrb_sym sym, mrb_int *lenp)
#endif /* MRB_NO_PRESYM */
/* ------------------------------------------------------ */
-typedef struct symbol_name {
- mrb_bool lit : 1;
- uint8_t prev;
- uint16_t len;
- const char *name;
-} symbol_name;
-
static void
sym_validate_len(mrb_state *mrb, size_t len)
{
@@ -81,7 +73,11 @@ static const char pack_table[] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS
static mrb_sym
sym_inline_pack(const char *name, size_t len)
{
+#if defined(MRB_WORD_BOXING) && defined(MRB_32BIT) && !defined(MRB_WORDBOX_NO_FLOAT_TRUNCATE)
+ const size_t pack_length_max = 4;
+#else
const size_t pack_length_max = 5;
+#endif
char c;
const char *p;
@@ -138,11 +134,38 @@ symhash(const char *key, size_t len)
return hash & 0xff;
}
+size_t mrb_packed_int_len(uint32_t num);
+size_t mrb_packed_int_encode(uint32_t num, uint8_t *p, uint8_t *pend);
+uint32_t mrb_packed_int_decode(uint8_t *p, uint8_t **newpos);
+
+#define sym_lit_p(mrb, i) (mrb->symflags[i>>3]&(1<<(i&7)))
+#define sym_lit_set(mrb, i) mrb->symflags[i>>3]|=(1<<(i&7))
+#define sym_flags_clear(mrb, i) mrb->symflags[i>>3]&=~(1<<(i&7))
+#define sym_len(mrb, i) (size_t)(sym_lit_p(mrb, i)?strlen(mrb->symtbl[i]):mrb_packed_int_decode(mrb->symtbl[i],NULL))
+
+static mrb_bool
+sym_check(mrb_state *mrb, const char *name, size_t len, mrb_sym i)
+{
+ const char *symname = mrb->symtbl[i];
+ size_t symlen;
+
+ if (sym_lit_p(mrb, i)) {
+ symlen = strlen(symname);
+ }
+ else {
+ /* length in BER */
+ symlen = mrb_packed_int_decode((uint8_t*)symname, (uint8_t**)&symname);
+ }
+ if (len == symlen && memcmp(symname, name, len) == 0) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
static mrb_sym
find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp)
{
mrb_sym i;
- symbol_name *sname;
uint8_t hash;
#ifndef MRB_NO_PRESYM
@@ -160,24 +183,24 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp)
i = mrb->symhash[hash];
if (i == 0) return 0;
- do {
- sname = &mrb->symtbl[i];
- if (sname->len == len && memcmp(sname->name, name, len) == 0) {
+ for (;;) {
+ if (sym_check(mrb, name, len, i)) {
return (i+MRB_PRESYM_MAX);
}
- if (sname->prev == 0xff) {
+ uint8_t diff = mrb->symlink[i];
+ if (diff == 0xff) {
i -= 0xff;
- sname = &mrb->symtbl[i];
- while (mrb->symtbl < sname) {
- if (sname->len == len && memcmp(sname->name, name, len) == 0) {
- return (mrb_sym)((sname - mrb->symtbl)+MRB_PRESYM_MAX);
+ while (i > 0) {
+ if (sym_check(mrb, name, len, i)) {
+ return (i+MRB_PRESYM_MAX);
}
- sname--;
+ i--;
}
return 0;
}
- i -= sname->prev;
- } while (sname->prev > 0);
+ if (diff == 0) return 0;
+ i -= diff;
+ }
return 0;
}
@@ -185,7 +208,6 @@ static mrb_sym
sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit)
{
mrb_sym sym;
- symbol_name *sname;
uint8_t hash;
sym_validate_len(mrb, len);
@@ -194,35 +216,38 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit)
/* registering a new symbol */
sym = mrb->symidx + 1;
- if (mrb->symcapa < sym) {
+ if (mrb->symcapa <= sym) {
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->symtbl = (const char**)mrb_realloc(mrb, mrb->symtbl, sizeof(char*)*symcapa);
+ mrb->symflags = (uint8_t*)mrb_realloc(mrb, mrb->symflags, symcapa/8+1);
+ memset(mrb->symflags+mrb->symcapa/8+1, 0, (symcapa-mrb->symcapa)/8);
+ mrb->symlink = (uint8_t*)mrb_realloc(mrb, mrb->symlink, symcapa);
mrb->symcapa = symcapa;
}
- sname = &mrb->symtbl[sym];
- sname->len = (uint16_t)len;
- if (lit || mrb_ro_data_p(name)) {
- sname->name = name;
- sname->lit = TRUE;
+ sym_flags_clear(mrb, sym);
+ if ((lit || mrb_ro_data_p(name)) && strlen(name) == len) {
+ sym_lit_set(mrb, sym);
+ mrb->symtbl[sym] = name;
}
else {
- char *p = (char *)mrb_malloc(mrb, len+1);
- memcpy(p, name, len);
- p[len] = 0;
- sname->name = (const char*)p;
- sname->lit = FALSE;
+ int ilen = mrb_packed_int_len(len);
+ char *p = (char *)mrb_malloc(mrb, len+ilen+1);
+ mrb_packed_int_encode(len, (uint8_t*)p, (uint8_t*)p+ilen);
+ memcpy(p+ilen, name, len);
+ p[ilen+len] = 0;
+ mrb->symtbl[sym] = p;
}
if (mrb->symhash[hash]) {
mrb_sym i = sym - mrb->symhash[hash];
if (i > 0xff)
- sname->prev = 0xff;
+ mrb->symlink[sym] = 0xff;
else
- sname->prev = i;
+ mrb->symlink[sym] = i;
}
else {
- sname->prev = 0;
+ mrb->symlink[sym] = 0;
}
mrb->symhash[hash] = mrb->symidx = sym;
@@ -320,8 +345,15 @@ sym2name_len(mrb_state *mrb, mrb_sym sym, char *buf, mrb_int *lenp)
return NULL;
}
- if (lenp) *lenp = mrb->symtbl[sym].len;
- return mrb->symtbl[sym].name;
+ const char *symname = mrb->symtbl[sym];
+ if (!sym_lit_p(mrb, sym)) {
+ size_t len = mrb_packed_int_decode((uint8_t*)symname, (uint8_t**)&symname);
+ if (lenp) *lenp = (mrb_int)len;
+ }
+ else if (lenp) {
+ *lenp = (mrb_int)strlen(symname);
+ }
+ return symname;
}
MRB_API const char*
@@ -334,25 +366,19 @@ mrb_sym_name_len(mrb_state *mrb, mrb_sym sym, mrb_int *lenp)
#endif
}
-mrb_bool
-mrb_sym_static_p(mrb_state *mrb, mrb_sym sym)
-{
- if (SYMBOL_INLINE_P(sym)) return TRUE;
- if (sym > MRB_PRESYM_MAX) return FALSE;
- return TRUE;
-}
-
void
mrb_free_symtbl(mrb_state *mrb)
{
mrb_sym i, lim;
for (i=1, lim=mrb->symidx+1; i<lim; i++) {
- if (!mrb->symtbl[i].lit) {
- mrb_free(mrb, (char*)mrb->symtbl[i].name);
+ if (!sym_lit_p(mrb, i)) {
+ mrb_free(mrb, (char*)mrb->symtbl[i]);
}
}
mrb_free(mrb, mrb->symtbl);
+ mrb_free(mrb, mrb->symlink);
+ mrb_free(mrb, mrb->symflags);
}
void
@@ -397,12 +423,11 @@ mrb_init_symtbl(mrb_state *mrb)
/* 15.2.11.3.3 */
/*
* call-seq:
- * sym.id2name -> string
* sym.to_s -> string
*
* Returns the name or string corresponding to <i>sym</i>.
*
- * :fred.id2name #=> "fred"
+ * :fred.to_s #=> "fred"
*/
static mrb_value
sym_to_s(mrb_state *mrb, mrb_value sym)
@@ -410,6 +435,30 @@ sym_to_s(mrb_state *mrb, mrb_value sym)
return mrb_sym_str(mrb, mrb_symbol(sym));
}
+/*
+ * call-seq:
+ * sym.name -> string
+ *
+ * Returns the name or string corresponding to <i>sym</i>. Unlike #to_s, the
+ * returned string is frozen.
+ *
+ * :fred.name #=> "fred"
+ * :fred.name.frozen? #=> true
+ */
+static mrb_value
+sym_name(mrb_state *mrb, mrb_value vsym)
+{
+ mrb_sym sym = mrb_symbol(vsym);
+ mrb_int len;
+ const char *name = mrb_sym_name_len(mrb, sym, &len);
+
+ mrb_assert(name != NULL);
+ if (SYMBOL_INLINE_P(sym)) {
+ return mrb_str_new_frozen(mrb, name, len);
+ }
+ return mrb_str_new_static_frozen(mrb, name, len);
+}
+
/* 15.2.11.3.4 */
/*
* call-seq:
@@ -596,7 +645,7 @@ mrb_sym_str(mrb_state *mrb, mrb_sym sym)
}
static const char*
-sym_name(mrb_state *mrb, mrb_sym sym, mrb_bool dump)
+sym_cstr(mrb_state *mrb, mrb_sym sym, mrb_bool dump)
{
mrb_int len;
const char *name = mrb_sym_name_len(mrb, sym, &len);
@@ -615,13 +664,13 @@ sym_name(mrb_state *mrb, mrb_sym sym, mrb_bool dump)
MRB_API const char*
mrb_sym_name(mrb_state *mrb, mrb_sym sym)
{
- return sym_name(mrb, sym, FALSE);
+ return sym_cstr(mrb, sym, FALSE);
}
MRB_API const char*
mrb_sym_dump(mrb_state *mrb, mrb_sym sym)
{
- return sym_name(mrb, sym, TRUE);
+ return sym_cstr(mrb, sym, TRUE);
}
#define lesser(a,b) (((a)>(b))?(b):(a))
@@ -665,8 +714,8 @@ mrb_init_symbol(mrb_state *mrb)
MRB_SET_INSTANCE_TT(sym, MRB_TT_SYMBOL);
mrb_undef_class_method(mrb, sym, "new");
- mrb_define_method(mrb, sym, "id2name", sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.2 */
mrb_define_method(mrb, sym, "to_s", sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.3 */
+ mrb_define_method(mrb, sym, "name", sym_name, MRB_ARGS_NONE());
mrb_define_method(mrb, sym, "to_sym", sym_to_sym, MRB_ARGS_NONE()); /* 15.2.11.3.4 */
mrb_define_method(mrb, sym, "inspect", sym_inspect, MRB_ARGS_NONE()); /* 15.2.11.3.5(x) */
mrb_define_method(mrb, sym, "<=>", sym_cmp, MRB_ARGS_REQ(1));
diff --git a/src/variable.c b/src/variable.c
index 646353bfd..d89295229 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -766,16 +766,17 @@ mod_const_check(mrb_state *mrb, mrb_value mod)
}
static mrb_value
-const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
+const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym, mrb_bool skip)
{
struct RClass *c = base;
mrb_value v;
mrb_bool retry = FALSE;
mrb_value name;
+ if (skip) c = c->super;
L_RETRY:
while (c) {
- if (c->iv) {
+ if (!MRB_FLAG_TEST(c, MRB_FL_CLASS_IS_PREPENDED) && c->iv) {
if (iv_get(mrb, c->iv, sym, &v))
return v;
}
@@ -794,7 +795,7 @@ MRB_API mrb_value
mrb_const_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
{
mod_const_check(mrb, mod);
- return const_get(mrb, mrb_class_ptr(mod), sym);
+ return const_get(mrb, mrb_class_ptr(mod), sym, FALSE);
}
mrb_value
@@ -803,9 +804,9 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
struct RClass *c;
struct RClass *c2;
mrb_value v;
- const struct RProc *proc;
+ const struct RProc *proc = mrb->c->ci->proc;
- c = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc);
+ c = MRB_PROC_TARGET_CLASS(proc);
if (!c) c = mrb->object_class;
if (iv_get(mrb, c->iv, sym, &v)) {
return v;
@@ -821,8 +822,7 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
c2 = mrb_class_ptr(klass);
}
if (c2 && (c2->tt == MRB_TT_CLASS || c2->tt == MRB_TT_MODULE)) c = c2;
- mrb_assert(!MRB_PROC_CFUNC_P(mrb->c->ci->proc));
- proc = mrb->c->ci->proc;
+ proc = proc->upper;
while (proc) {
c2 = MRB_PROC_TARGET_CLASS(proc);
if (c2 && iv_get(mrb, c2->iv, sym, &v)) {
@@ -830,7 +830,7 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
}
proc = proc->upper;
}
- return const_get(mrb, c, sym);
+ return const_get(mrb, c, sym, TRUE);
}
MRB_API void
diff --git a/src/vm.c b/src/vm.c
index 346a14ba3..abb5d0c85 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -4,11 +4,6 @@
** See Copyright Notice in mruby.h
*/
-#include <stddef.h>
-#include <stdarg.h>
-#ifndef MRB_NO_FLOAT
-#include <math.h>
-#endif
#include <mruby.h>
#include <mruby/array.h>
#include <mruby/class.h>
@@ -91,14 +86,10 @@ 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)
{
-#ifdef MRB_NAN_BOXING
while (count-- > 0) {
SET_NIL_VALUE(*from);
from++;
}
-#else
- memset(from, 0, sizeof(mrb_value)*count);
-#endif
}
static inline void
@@ -245,12 +236,13 @@ top_proc(mrb_state *mrb, const struct RProc *proc)
return proc;
}
-#define CI_ACC_SKIP -1
-#define CI_ACC_DIRECT -2
-#define CI_ACC_RESUMED -3
+#define CINFO_NONE 0
+#define CINFO_SKIP 1
+#define CINFO_DIRECT 2
+#define CINFO_RESUMED 3
static inline mrb_callinfo*
-cipush(mrb_state *mrb, mrb_int push_stacks, mrb_int acc,
+cipush(mrb_state *mrb, mrb_int push_stacks, uint8_t cci,
struct RClass *target_class, const struct RProc *proc, mrb_sym mid, mrb_int argc)
{
struct mrb_context *c = mrb->c;
@@ -268,7 +260,7 @@ cipush(mrb_state *mrb, mrb_int push_stacks, mrb_int acc,
mrb_vm_ci_proc_set(ci, proc);
ci->stack = ci[-1].stack + push_stacks;
ci->argc = (int16_t)argc;
- ci->acc = (int16_t)acc;
+ ci->cci = cci;
ci->u.target_class = target_class;
return ci;
@@ -314,7 +306,7 @@ mrb_protect_error(mrb_state *mrb, mrb_protect_error_func *body, void *userdata,
mrb_value result = mrb_nil_value();
int ai = mrb_gc_arena_save(mrb);
const struct mrb_context *c = mrb->c;
- int ci_index = c->ci - c->cibase;
+ ptrdiff_t ci_index = c->ci - c->cibase;
if (error) { *error = FALSE; }
@@ -335,9 +327,9 @@ mrb_protect_error(mrb_state *mrb, mrb_protect_error_func *body, void *userdata,
}
else {
// It was probably switched by mrb_fiber_resume().
- // Simply destroy all successive CI_ACC_DIRECTs once the fiber has been switched.
+ // Simply destroy all successive CINFO_DIRECTs once the fiber has been switched.
c = mrb->c;
- while (c->ci > c->cibase && c->ci->acc == CI_ACC_DIRECT) {
+ while (c->ci > c->cibase && c->ci->cci == CINFO_DIRECT) {
cipop(mrb);
}
}
@@ -506,12 +498,12 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
mrb->c->ci->stack[argc+1] = blk;
if (MRB_METHOD_CFUNC_P(m)) {
- ci->acc = CI_ACC_DIRECT;
+ ci->cci = CINFO_DIRECT;
val = MRB_METHOD_CFUNC(m)(mrb, self);
cipop(mrb);
}
else {
- ci->acc = CI_ACC_SKIP;
+ ci->cci = CINFO_SKIP;
val = mrb_run(mrb, MRB_METHOD_PROC(m), self);
}
}
@@ -526,68 +518,8 @@ mrb_funcall_argv(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, cons
return mrb_funcall_with_block(mrb, self, mid, argc, argv, mrb_nil_value());
}
-#define DECOMPOSE32(n) (((n) >> 24) & 0xff), (((n) >> 16) & 0xff), (((n) >> 8) & 0xff), (((n) >> 0) & 0xff)
-#define CATCH_HANDLER_MAKE_BYTECODE(t, b, e, j) t, DECOMPOSE32(b), DECOMPOSE32(e), DECOMPOSE32(j)
-#define CATCH_HANDLER_NUM_TO_BYTE(n) ((n) * sizeof(struct mrb_irep_catch_handler))
-
-static void
-exec_irep_prepare_posthook(mrb_state *mrb, mrb_callinfo *ci, int nregs, mrb_func_t posthook)
-{
- /*
- * stack: [proc, errinfo, return value by called proc]
- *
- * begin
- * OP_NOP # A dummy instruction built in to make the catch handler react.
- * ensure
- * OP_EXCEPT R1 # Save the exception object.
- * OP_CALL # Call a C function for the hook.
- * # The stack is kept as it is in the called proc.
- * # The exception will be rethrown within the hook function.
- * end
- */
- static const mrb_code hook_iseq[] = {
- OP_NOP,
- OP_EXCEPT, 1,
- OP_CALL,
- CATCH_HANDLER_MAKE_BYTECODE(MRB_CATCH_ENSURE, 0, 1, 1),
- };
- static const mrb_irep hook_irep = {
- 1, 3, 1, MRB_IREP_STATIC, hook_iseq,
- NULL, NULL, NULL, NULL, NULL,
- sizeof(hook_iseq) / sizeof(hook_iseq[0]) - CATCH_HANDLER_NUM_TO_BYTE(1),
- 0, 0, 0, 0
- };
- static const struct RProc hook_caller = {
- NULL, NULL, MRB_TT_PROC, MRB_GC_RED, MRB_FL_OBJ_IS_FROZEN, { &hook_irep }, NULL, { NULL }
- };
-
- struct RProc *hook = mrb_proc_new_cfunc(mrb, posthook);
- int acc = 2;
- memmove(ci->stack + acc, ci->stack, sizeof(mrb_value) * nregs);
- ci->stack[0] = mrb_obj_value(hook);
- ci->stack[1] = mrb_nil_value();
- mrb_callinfo hook_ci = { 0, 0, ci->acc, &hook_caller, ci->stack, &hook_iseq[1], { NULL } };
- ci = cipush(mrb, acc, acc, NULL, ci[0].proc, ci[0].mid, ci[0].argc);
- ci->u.env = ci[-1].u.env;
- ci[-1] = hook_ci;
-}
-
-/*
- * If `posthook` is given, `posthook` will be called even if an
- * exception or global jump occurs in `p`. Exception or global jump objects
- * are stored in `mrb->c->stack[1]` and should be rethrown in `posthook`.
- *
- * if (!mrb_nil_p(mrb->c->stack[1])) {
- * mrb_exc_raise(mrb, mrb->c->stack[1]);
- * }
- *
- * If you want to return the return value by `proc` as it is, please do
- * `return mrb->c->stack[2]`.
- *
- * However, if `proc` is a C function, it will be ignored.
- */
static mrb_value
-exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p, mrb_func_t posthook)
+exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
{
mrb_callinfo *ci = mrb->c->ci;
int keep, nregs;
@@ -600,17 +532,12 @@ exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p, mrb_func_t posthook)
nregs = p->body.irep->nregs;
if (ci->argc < 0) keep = 3;
else keep = ci->argc + 2;
- int extra = posthook ? (2 /* hook proc + errinfo */) : 0;
if (nregs < keep) {
- mrb_stack_extend(mrb, keep + extra);
+ mrb_stack_extend(mrb, keep);
}
else {
- mrb_stack_extend(mrb, nregs + extra);
- stack_clear(ci->stack+keep, nregs-keep + extra);
- }
-
- if (posthook) {
- exec_irep_prepare_posthook(mrb, ci, (nregs < keep ? keep : nregs), posthook);
+ mrb_stack_extend(mrb, nregs);
+ stack_clear(ci->stack+keep, nregs-keep);
}
cipush(mrb, 0, 0, NULL, NULL, 0, 0);
@@ -619,16 +546,16 @@ exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p, mrb_func_t posthook)
}
mrb_value
-mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p, mrb_func_t posthook)
+mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
{
mrb_callinfo *ci = mrb->c->ci;
- if (ci->acc >= 0) {
- return exec_irep(mrb, self, p, posthook);
+ if (ci->cci == CINFO_NONE) {
+ return exec_irep(mrb, self, p);
}
else {
mrb_value ret;
if (MRB_PROC_CFUNC_P(p)) {
- cipush(mrb, 0, CI_ACC_DIRECT, mrb_vm_ci_target_class(ci), p, ci->mid, ci->argc);
+ cipush(mrb, 0, CINFO_DIRECT, mrb_vm_ci_target_class(ci), p, ci->mid, ci->argc);
ret = MRB_PROC_CFUNC(p)(mrb, self);
cipop(mrb);
}
@@ -675,7 +602,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block);
ci = mrb->c->ci;
- if (ci->acc < 0) {
+ if (ci->cci > CINFO_NONE) {
funcall:
return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
}
@@ -706,7 +633,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
}
return MRB_METHOD_CFUNC(m)(mrb, self);
}
- return exec_irep(mrb, self, MRB_METHOD_PROC(m), NULL);
+ return exec_irep(mrb, self, MRB_METHOD_PROC(m));
}
static mrb_value
@@ -720,7 +647,7 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
}
ci = mrb->c->ci;
- if (ci->acc == CI_ACC_DIRECT) {
+ if (ci->cci == CINFO_DIRECT) {
return mrb_yield_with_class(mrb, blk, 1, &self, self, c);
}
ci->u.target_class = c;
@@ -792,21 +719,11 @@ mrb_value
mrb_obj_instance_eval(mrb_state *mrb, mrb_value self)
{
mrb_value a, b;
- 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_MODULE:
- case MRB_TT_CLASS:
- case MRB_TT_ICLASS:
- c = mrb_class_ptr(self);
- break;
- default:
- c = mrb_singleton_class_ptr(mrb, self);
- }
- return eval_under(mrb, self, b, c);
+ return eval_under(mrb, self, b, mrb_singleton_class_ptr(mrb, self));
}
MRB_API mrb_value
@@ -827,7 +744,7 @@ 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, n, CI_ACC_SKIP, c, p, mid, 0 /* dummy */);
+ ci = cipush(mrb, n, CINFO_SKIP, c, p, mid, 0 /* dummy */);
if (argc >= CALL_MAXARGS) {
ci->argc = -1;
n = 3;
@@ -848,7 +765,7 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
mrb->c->ci->stack[argc+1] = mrb_nil_value();
if (MRB_PROC_CFUNC_P(p)) {
- ci->acc = CI_ACC_DIRECT;
+ ci->cci = CINFO_DIRECT;
val = MRB_PROC_CFUNC(p)(mrb, self);
cipop(mrb);
}
@@ -894,7 +811,7 @@ mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const
mrb->c->ci->stack[1] = mrb_ary_new_from_values(mrb, argc, argv);
mrb->c->ci->stack[2] = mrb_nil_value();
ci->argc = -1;
- return exec_irep(mrb, self, p, NULL);
+ return exec_irep(mrb, self, p);
}
static struct RBreak*
@@ -902,7 +819,7 @@ break_new(mrb_state *mrb, uint32_t tag, const struct RProc *p, mrb_value val)
{
struct RBreak *brk;
- brk = (struct RBreak*)mrb_obj_alloc(mrb, MRB_TT_BREAK, NULL);
+ brk = MRB_OBJ_ALLOC(mrb, MRB_TT_BREAK, NULL);
mrb_break_proc_set(brk, p);
mrb_break_value_set(brk, val);
mrb_break_tag_set(brk, tag);
@@ -1079,7 +996,7 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const struct RProc *proc, mrb
#ifndef DIRECT_THREADED
#define INIT_DISPATCH for (;;) { insn = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (insn) {
-#define CASE(insn,ops) case insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc;
+#define CASE(insn,ops) case insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc; L_ ## insn ## _BODY:
#define NEXT goto L_END_DISPATCH
#define JUMP NEXT
#define END_DISPATCH L_END_DISPATCH:;}}
@@ -1087,7 +1004,7 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const struct RProc *proc, mrb
#else
#define INIT_DISPATCH JUMP; return mrb_nil_value();
-#define CASE(insn,ops) L_ ## insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc;
+#define CASE(insn,ops) L_ ## insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc; L_ ## insn ## _BODY:
#define NEXT insn=BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[insn]
#define JUMP NEXT
@@ -1125,19 +1042,27 @@ mrb_vm_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, mrb_int sta
return result;
}
-static mrb_bool
+static struct RClass*
check_target_class(mrb_state *mrb)
{
- if (!mrb_vm_ci_target_class(mrb->c->ci)) {
+ struct RClass *target = mrb_vm_ci_target_class(mrb->c->ci);
+ if (!target) {
mrb_value exc = mrb_exc_new_lit(mrb, E_TYPE_ERROR, "no target class or module");
mrb_exc_set(mrb, exc);
- return FALSE;
}
- return TRUE;
+ return target;
+}
+
+mrb_value
+get_send_args(mrb_state *mrb, mrb_int argc, mrb_value *regs)
+{
+ if (argc < 0) return regs[0];
+ return mrb_ary_new_from_values(mrb, argc, regs);
}
mrb_value mrb_obj_missing(mrb_state *mrb, mrb_value mod);
void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
+void mrb_method_added(mrb_state *mrb, struct RClass *c, mrb_sym mid);
MRB_API mrb_value
mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)
@@ -1191,11 +1116,7 @@ RETRY_TRY_BLOCK:
NEXT;
}
- CASE(OP_LOADL16, BS) {
- goto op_loadl;
- }
CASE(OP_LOADL, BB) {
- op_loadl:
switch (pool[b].tt) { /* number */
case IREP_TT_INT32:
regs[a] = mrb_int_value(mrb, (mrb_int)pool[b].u.i32);
@@ -1267,11 +1188,6 @@ RETRY_TRY_BLOCK:
NEXT;
}
- CASE(OP_LOADSYM16, BS) {
- SET_SYM_VALUE(regs[a], syms[b]);
- NEXT;
- }
-
CASE(OP_LOADNIL, B) {
SET_NIL_VALUE(regs[a]);
NEXT;
@@ -1552,11 +1468,18 @@ RETRY_TRY_BLOCK:
m = mrb_method_search_vm(mrb, &cls, mid);
if (MRB_METHOD_UNDEF_P(m)) {
mrb_sym missing = MRB_SYM(method_missing);
- m = mrb_method_search_vm(mrb, &cls, missing);
- if (MRB_METHOD_UNDEF_P(m) || (missing == mrb->c->ci->mid && mrb_obj_eq(mrb, regs[0], recv))) {
- mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, c, regs+a+1);
+ mrb_value args;
+
+ if (mrb_func_basic_p(mrb, recv, missing, mrb_obj_missing)) {
+ method_missing:
+ args = get_send_args(mrb, argc, regs+a+1);
mrb_method_missing(mrb, mid, recv, args);
}
+ if (mid != missing) {
+ cls = mrb_class(mrb, recv);
+ }
+ m = mrb_method_search_vm(mrb, &cls, missing);
+ if (MRB_METHOD_UNDEF_P(m)) goto method_missing; /* just in case */
if (argc >= 0) {
if (a+2 >= irep->nregs) {
mrb_stack_extend(mrb, a+3);
@@ -1570,7 +1493,7 @@ RETRY_TRY_BLOCK:
}
/* push callinfo */
- ci = cipush(mrb, a, a, cls, NULL, mid, argc);
+ ci = cipush(mrb, a, 0, cls, NULL, mid, argc);
if (MRB_METHOD_CFUNC_P(m)) {
if (MRB_METHOD_PROC_P(m)) {
@@ -1598,7 +1521,7 @@ RETRY_TRY_BLOCK:
}
}
if (!ci->u.target_class) { /* return from context modifying method (resume/yield) */
- if (ci->acc == CI_ACC_RESUMED) {
+ if (ci->cci == CINFO_RESUMED) {
mrb->jmp = prev_jmp;
return recv;
}
@@ -1614,7 +1537,6 @@ RETRY_TRY_BLOCK:
/* pop stackpos */
ci = cipop(mrb);
pc = ci->pc;
- JUMP;
}
else {
/* setup environment for calling method */
@@ -1624,9 +1546,9 @@ RETRY_TRY_BLOCK:
syms = irep->syms;
mrb_stack_extend(mrb, (argc < 0 && irep->nregs < 3) ? 3 : irep->nregs);
pc = irep->iseq;
- JUMP;
}
}
+ JUMP;
CASE(OP_CALL, Z) {
mrb_callinfo *ci;
@@ -1650,7 +1572,7 @@ RETRY_TRY_BLOCK:
/* pop stackpos */
ci = cipop(mrb);
pc = ci->pc;
- regs[ci[1].acc] = recv;
+ ci[1].stack[0] = recv;
irep = mrb->c->ci->proc->body.irep;
pool = irep->pool;
syms = irep->syms;
@@ -1664,7 +1586,7 @@ RETRY_TRY_BLOCK:
mrb->c->ci->stack[0] = mrb_nil_value();
a = 0;
c = OP_R_NORMAL;
- goto L_RETURN;
+ goto L_OP_RETURN_BODY;
}
pool = irep->pool;
syms = irep->syms;
@@ -1712,13 +1634,12 @@ RETRY_TRY_BLOCK:
else if (target_class->tt == MRB_TT_MODULE) {
target_class = mrb_vm_ci_target_class(ci);
if (target_class->tt != MRB_TT_ICLASS) {
- mrb_value exc = mrb_exc_new_lit(mrb, E_RUNTIME_ERROR, "superclass info lost [mruby limitations]");
- mrb_exc_set(mrb, exc);
- goto L_RAISE;
+ goto super_typeerror;
}
}
recv = regs[0];
if (!mrb_obj_is_kind_of(mrb, recv, target_class)) {
+ super_typeerror: ;
mrb_value exc = mrb_exc_new_lit(mrb, E_TYPE_ERROR,
"self has wrong type to call super in this context");
mrb_exc_set(mrb, exc);
@@ -1736,20 +1657,18 @@ RETRY_TRY_BLOCK:
m = mrb_method_search_vm(mrb, &cls, mid);
if (MRB_METHOD_UNDEF_P(m)) {
mrb_sym missing = MRB_SYM(method_missing);
+ mrb_value args;
if (mrb_func_basic_p(mrb, recv, missing, mrb_obj_missing)) {
- mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, b, regs+a+1);
+ super_missing:
+ args = get_send_args(mrb, argc, regs+a+1);
mrb_no_method_error(mrb, mid, args, "no superclass method '%n'", mid);
}
if (mid != missing) {
cls = mrb_class(mrb, recv);
}
m = mrb_method_search_vm(mrb, &cls, missing);
- if (MRB_METHOD_UNDEF_P(m)) { /* just in case */
- mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, b, regs+a+1);
- mrb_method_missing(mrb, missing, recv, args);
- }
- mid = missing;
+ if (MRB_METHOD_UNDEF_P(m)) goto super_missing; /* just in case */
if (argc >= 0) {
if (a+2 >= irep->nregs) {
mrb_stack_extend(mrb, a+3);
@@ -1758,7 +1677,8 @@ RETRY_TRY_BLOCK:
regs[a+2] = blk;
argc = -1;
}
- mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid));
+ mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(mid));
+ mid = missing;
}
/* push callinfo */
@@ -1779,7 +1699,7 @@ RETRY_TRY_BLOCK:
ci = mrb->c->ci;
mrb_assert(!mrb_break_p(v));
if (!mrb_vm_ci_target_class(ci)) { /* return from context modifying method (resume/yield) */
- if (ci->acc == CI_ACC_RESUMED) {
+ if (ci->cci == CINFO_RESUMED) {
mrb->jmp = prev_jmp;
return v;
}
@@ -1797,9 +1717,6 @@ RETRY_TRY_BLOCK:
JUMP;
}
else {
- /* fill callinfo */
- ci->acc = a;
-
/* setup environment for calling method */
mrb_vm_ci_proc_set(ci, (proc = MRB_METHOD_PROC(m)));
irep = proc->body.irep;
@@ -2086,7 +2003,7 @@ RETRY_TRY_BLOCK:
}
while ((ch = catch_handler_find(mrb, ci, pc, MRB_CATCH_FILTER_ALL)) == NULL) {
ci = cipop(mrb);
- if (ci[1].acc == CI_ACC_SKIP && prev_jmp) {
+ if (ci[1].cci == CINFO_SKIP && prev_jmp) {
mrb->jmp = prev_jmp;
MRB_THROW(prev_jmp);
}
@@ -2134,7 +2051,7 @@ RETRY_TRY_BLOCK:
switch (c) {
case OP_R_RETURN:
/* Fall through to OP_R_NORMAL otherwise */
- if (ci->acc >=0 && MRB_PROC_ENV_P(proc) && !MRB_PROC_STRICT_P(proc)) {
+ if (ci->cci == CINFO_NONE && MRB_PROC_ENV_P(proc) && !MRB_PROC_STRICT_P(proc)) {
const struct RProc *dst;
mrb_callinfo *cibase;
cibase = mrb->c->cibase;
@@ -2150,7 +2067,7 @@ RETRY_TRY_BLOCK:
}
/* check jump destination */
while (cibase <= ci && ci->proc != dst) {
- if (ci->acc < 0) { /* jump cross C boudary */
+ if (ci->cci > CINFO_NONE) { /* jump cross C boundary */
localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
goto L_RAISE;
}
@@ -2258,7 +2175,7 @@ RETRY_TRY_BLOCK:
c->prev = NULL;
ci = mrb->c->ci;
}
- if (ci->acc < 0) {
+ if (ci->cci > CINFO_NONE) {
ci = cipop(mrb);
mrb_gc_arena_restore(mrb, ai);
mrb->c->vmexec = FALSE;
@@ -2284,7 +2201,7 @@ RETRY_TRY_BLOCK:
}
}
while (mrb->c->cibase < ci && ci[-1].proc != proc->upper) {
- if (ci[-1].acc == CI_ACC_SKIP) {
+ if (ci[-1].cci == CINFO_SKIP) {
goto L_BREAK_ERROR;
}
CHECKPOINT_RESTORE(RBREAK_TAG_BREAK_UPPER) {
@@ -2322,21 +2239,21 @@ RETRY_TRY_BLOCK:
mrb->jmp = prev_jmp;
return v;
}
- acc = ci->acc;
+ acc = ci->cci;
ci = cipop(mrb);
- if (acc == CI_ACC_SKIP || acc == CI_ACC_DIRECT) {
+ if (acc == CINFO_SKIP || acc == CINFO_DIRECT) {
mrb_gc_arena_restore(mrb, ai);
mrb->jmp = prev_jmp;
return v;
}
- pc = ci[0].pc;
+ pc = ci->pc;
DEBUG(fprintf(stderr, "from :%s\n", mrb_sym_name(mrb, ci->mid)));
- proc = mrb->c->ci->proc;
+ proc = ci->proc;
irep = proc->body.irep;
pool = irep->pool;
syms = irep->syms;
- regs[acc] = v;
+ ci[1].stack[0] = v;
mrb_gc_arena_restore(mrb, ai);
}
JUMP;
@@ -2440,9 +2357,7 @@ RETRY_TRY_BLOCK:
CASE(OP_DIV, B) {
#ifndef MRB_NO_FLOAT
mrb_float x, y, f;
- mrb_float mrb_div_flo(mrb_float x, mrb_float y);
#endif
- mrb_int mrb_div_int(mrb_state *mrb, mrb_int x, mrb_int y);
/* need to check if op is overridden */
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
@@ -2475,7 +2390,7 @@ RETRY_TRY_BLOCK:
}
#ifndef MRB_NO_FLOAT
- f = mrb_div_flo(x, y);
+ f = mrb_div_float(x, y);
SET_FLOAT_VALUE(mrb, regs[a], f);
#endif
NEXT;
@@ -2625,14 +2540,18 @@ RETRY_TRY_BLOCK:
regs[a] = splat;
}
else {
+ mrb_assert(mrb_type(regs[a]) == MRB_TT_ARRAY);
mrb_ary_concat(mrb, regs[a], splat);
}
mrb_gc_arena_restore(mrb, ai);
NEXT;
}
- CASE(OP_ARYPUSH, B) {
- mrb_ary_push(mrb, regs[a], regs[a+1]);
+ CASE(OP_ARYPUSH, BB) {
+ mrb_assert(mrb_type(regs[a]) == MRB_TT_ARRAY);
+ for (mrb_int i=0; i<b; i++) {
+ mrb_ary_push(mrb, regs[a], regs[a+i+1]);
+ }
NEXT;
}
@@ -2667,6 +2586,7 @@ RETRY_TRY_BLOCK:
}
CASE(OP_ASET, BBB) {
+ mrb_assert(mrb_type(regs[a]) == MRB_TT_ARRAY);
mrb_ary_set(mrb, regs[b], c, regs[a]);
NEXT;
}
@@ -2709,16 +2629,29 @@ RETRY_TRY_BLOCK:
mrb_sym sym = mrb_intern_str(mrb, regs[a]);
regs[a] = mrb_symbol_value(sym);
- mrb_gc_arena_restore(mrb, ai);
NEXT;
}
- CASE(OP_STRING16, BS) {
- goto op_string;
+ CASE(OP_SYMBOL, BB) {
+ size_t len;
+ mrb_sym sym;
+
+ mrb_assert((pool[b].tt&IREP_TT_NFLAG)==0);
+ len = pool[b].tt >> 2;
+ if (pool[b].tt & IREP_TT_SFLAG) {
+ sym = mrb_intern_static(mrb, pool[b].u.str, len);
+ }
+ else {
+ sym = mrb_intern(mrb, pool[b].u.str, len);
+ }
+ regs[a] = mrb_symbol_value(sym);
+ NEXT;
}
+
CASE(OP_STRING, BB) {
size_t len;
- op_string:
+
+ mrb_assert((pool[b].tt&IREP_TT_NFLAG)==0);
len = pool[b].tt >> 2;
if (pool[b].tt & IREP_TT_SFLAG) {
regs[a] = mrb_str_new_static(mrb, pool[b].u.str, len);
@@ -2753,7 +2686,8 @@ RETRY_TRY_BLOCK:
int i;
int lim = a+b*2+1;
- hash = mrb_ensure_hash_type(mrb, regs[a]);
+ hash = regs[a];
+ mrb_ensure_hash_type(mrb, hash);
for (i=a+1; i<lim; i+=2) {
mrb_hash_set(mrb, hash, regs[i], regs[i+1]);
}
@@ -2761,8 +2695,9 @@ RETRY_TRY_BLOCK:
NEXT;
}
CASE(OP_HASHCAT, B) {
- mrb_value hash = mrb_ensure_hash_type(mrb, regs[a]);
+ mrb_value hash = regs[a];
+ mrb_ensure_hash_type(mrb, hash);
mrb_hash_merge(mrb, hash, regs[a+1]);
mrb_gc_arena_restore(mrb, ai);
NEXT;
@@ -2795,18 +2730,6 @@ RETRY_TRY_BLOCK:
c = OP_L_METHOD;
goto L_MAKE_LAMBDA;
}
- CASE(OP_LAMBDA16, BS) {
- c = OP_L_LAMBDA;
- goto L_MAKE_LAMBDA;
- }
- CASE(OP_BLOCK16, BS) {
- c = OP_L_BLOCK;
- goto L_MAKE_LAMBDA;
- }
- CASE(OP_METHOD16, BS) {
- c = OP_L_METHOD;
- goto L_MAKE_LAMBDA;
- }
CASE(OP_RANGE_INC, B) {
mrb_value val = mrb_range_new(mrb, regs[a], regs[a+1], FALSE);
@@ -2862,10 +2785,7 @@ RETRY_TRY_BLOCK:
NEXT;
}
- CASE(OP_EXEC16, BS)
- goto L_EXEC;
CASE(OP_EXEC, BB)
- L_EXEC:
{
mrb_value recv = regs[a];
struct RProc *p;
@@ -2879,7 +2799,7 @@ RETRY_TRY_BLOCK:
p->flags |= MRB_PROC_SCOPE;
/* prepare call stack */
- cipush(mrb, a, a, mrb_class_ptr(recv), p, 0, 0);
+ cipush(mrb, a, 0, mrb_class_ptr(recv), p, 0, 0);
irep = p->body.irep;
pool = irep->pool;
@@ -2894,10 +2814,13 @@ RETRY_TRY_BLOCK:
struct RClass *target = mrb_class_ptr(regs[a]);
struct RProc *p = mrb_proc_ptr(regs[a+1]);
mrb_method_t m;
+ mrb_sym mid = syms[b];
MRB_METHOD_FROM_PROC(m, p);
- mrb_define_method_raw(mrb, target, syms[b], m);
+ mrb_define_method_raw(mrb, target, mid, m);
+ mrb_method_added(mrb, target, mid);
mrb_gc_arena_restore(mrb, ai);
+ regs[a] = mrb_symbol_value(mid);
NEXT;
}
@@ -2908,24 +2831,24 @@ RETRY_TRY_BLOCK:
}
CASE(OP_TCLASS, B) {
- if (!check_target_class(mrb)) goto L_RAISE;
- regs[a] = mrb_obj_value(mrb_vm_ci_target_class(mrb->c->ci));
+ struct RClass *target = check_target_class(mrb);
+ if (!target) goto L_RAISE;
+ regs[a] = mrb_obj_value(target);
NEXT;
}
CASE(OP_ALIAS, BB) {
- struct RClass *target;
+ struct RClass *target = check_target_class(mrb);
- if (!check_target_class(mrb)) goto L_RAISE;
- target = mrb_vm_ci_target_class(mrb->c->ci);
+ if (!target) goto L_RAISE;
mrb_alias_method(mrb, target, syms[a], syms[b]);
+ mrb_method_added(mrb, target, syms[a]);
NEXT;
}
CASE(OP_UNDEF, B) {
- struct RClass *target;
+ struct RClass *target = check_target_class(mrb);
- if (!check_target_class(mrb)) goto L_RAISE;
- target = mrb_vm_ci_target_class(mrb->c->ci);
+ if (!target) goto L_RAISE;
mrb_undef_method_id(mrb, target, syms[a]);
NEXT;
}
@@ -2958,6 +2881,37 @@ RETRY_TRY_BLOCK:
NEXT;
}
+ CASE(OP_EXT1, Z) {
+ insn = READ_B();
+ switch (insn) {
+#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _1(); mrb->c->ci->pc = pc; goto L_OP_ ## insn ## _BODY;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ pc--;
+ NEXT;
+ }
+ CASE(OP_EXT2, Z) {
+ insn = READ_B();
+ switch (insn) {
+#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _2(); mrb->c->ci->pc = pc; goto L_OP_ ## insn ## _BODY;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ pc--;
+ NEXT;
+ }
+ CASE(OP_EXT3, Z) {
+ uint8_t insn = READ_B();
+ switch (insn) {
+#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _3(); mrb->c->ci->pc = pc; goto L_OP_ ## insn ## _BODY;
+#include "mruby/ops.h"
+#undef OPCODE
+ }
+ pc--;
+ NEXT;
+ }
+
CASE(OP_STOP, Z) {
/* stop VM */
CHECKPOINT_RESTORE(RBREAK_TAG_STOP) {
@@ -2981,7 +2935,7 @@ RETRY_TRY_BLOCK:
}
MRB_CATCH(&c_jmp) {
mrb_callinfo *ci = mrb->c->ci;
- while (ci > mrb->c->cibase && ci->acc == CI_ACC_DIRECT) {
+ while (ci > mrb->c->cibase && ci->cci == CINFO_DIRECT) {
ci = cipop(mrb);
}
exc_catched = TRUE;
@@ -3014,7 +2968,7 @@ mrb_top_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, mrb_int st
mrb_vm_ci_env_set(mrb->c->ci, NULL);
return mrb_vm_run(mrb, proc, self, stack_keep);
}
- cipush(mrb, 0, CI_ACC_SKIP, mrb->object_class, NULL, 0, 0);
+ cipush(mrb, 0, CINFO_SKIP, mrb->object_class, NULL, 0, 0);
v = mrb_vm_run(mrb, proc, self, stack_keep);
return v;
diff --git a/tasks/doc.rake b/tasks/doc.rake
index 8013ed038..8a9108f1a 100644
--- a/tasks/doc.rake
+++ b/tasks/doc.rake
@@ -18,7 +18,10 @@ namespace :doc do
sh "doxygen Doxyfile"
rescue
puts "ERROR: To generate C API documents, you need Doxygen."
+ puts "On Debian-based systems:"
puts " $ sudo apt-get install doxygen"
+ puts "On RHEL-based systems:"
+ puts " $ sudo dnf install doxygen"
end
end
diff --git a/tasks/libmruby.rake b/tasks/libmruby.rake
index 9a7a57ff7..1fb3cbc31 100644
--- a/tasks/libmruby.rake
+++ b/tasks/libmruby.rake
@@ -14,7 +14,8 @@ MRuby.each_target do
file "#{build_dir}/lib/libmruby.flags.mak" => [__FILE__, libmruby_static] do |t|
mkdir_p File.dirname t.name
open(t.name, 'w') do |f|
- f.puts "MRUBY_CFLAGS = #{cc.all_flags}"
+ gemincs = gems.map { |g| g.export_include_paths.map { |n| g.filename(n) } }.flatten.uniq
+ f.puts "MRUBY_CFLAGS = #{cc.all_flags([], gemincs)}"
f.puts "MRUBY_CC = #{cc.command}"
f.puts "MRUBY_LD = #{linker.command}"
diff --git a/test/t/bs_block.rb b/test/t/bs_block.rb
index 995e52559..f4e4da375 100644
--- a/test/t/bs_block.rb
+++ b/test/t/bs_block.rb
@@ -520,3 +520,15 @@ assert('BS Block 38') do
assert_equal [1,2,3,4,5], iter{|a,b,c=:c,d,e| [a,b,c,d,e]}
end
+
+assert('BS Block 39') do
+ def iter
+ yield 1
+ end
+
+ assert_equal([1, 2, nil]) do
+ iter{|a, b=2, c|
+ [a, b, c]
+ }
+ end
+end
diff --git a/test/t/class.rb b/test/t/class.rb
index e2839111c..1b4b84890 100644
--- a/test/t/class.rb
+++ b/test/t/class.rb
@@ -375,6 +375,20 @@ assert('clone Class') do
assert_true(Foo.clone.new.func)
end
+assert('class definition in singleton class') do
+ class AClassS
+ class << self
+ class BClass
+ end
+
+ def iclass
+ BClass
+ end
+ end
+ end
+ assert_equal(Class, AClassS.iclass.class)
+end
+
assert('class variable and class << self style class method') do
class ClassVariableTest
@@class_variable = "value"
diff --git a/test/t/float.rb b/test/t/float.rb
index f6f6d01dd..e4c25b34e 100644
--- a/test/t/float.rb
+++ b/test/t/float.rb
@@ -277,8 +277,6 @@ assert('Float#to_s') do
assert_equal("-1.0e-10", -0.0000000001.to_s)
assert_equal("1.0e+20", 1e20.to_s)
assert_equal("-1.0e+20", -1e20.to_s)
- assert_equal("1.0e+16", 10000000000000000.0.to_s)
- assert_equal("-1.0e+16", -10000000000000000.0.to_s)
assert_equal("100000.0", 100000.0.to_s)
assert_equal("-100000.0", -100000.0.to_s)
if uses_float
@@ -305,4 +303,16 @@ assert('Float#eql?') do
assert_not_operator(5.0, :eql?, "5.0")
end
+assert('Float#abs') do
+ f = 1.0
+ assert_equal(1.0, f.abs)
+ f = -1.0
+ assert_equal(1.0, f.abs)
+ f = 0.0
+ assert_equal(0.0, f.abs)
+ # abs(negative zero) should be positive zero
+ f = -0.0
+ assert_equal(0.0, f.abs)
+end
+
end # const_defined?(:Float)
diff --git a/test/t/hash.rb b/test/t/hash.rb
index 9bc2668ae..1b4db056e 100644
--- a/test/t/hash.rb
+++ b/test/t/hash.rb
@@ -1006,3 +1006,9 @@ assert('#== receiver should be specified value') do
%i[has_value? value?].each{|m| assert_nothing_raised{h.__send__(m, v1)}}
end
end
+
+assert('test value ommision') do
+ x = 1
+ y = 2
+ assert_equal({x:1, y:2}, {x:, y:})
+end
diff --git a/test/t/methods.rb b/test/t/methods.rb
index f9c25dc33..9005d7976 100644
--- a/test/t/methods.rb
+++ b/test/t/methods.rb
@@ -107,3 +107,32 @@ assert('The undef statement (method undefined)', '13.3.7 a) 5)') do
undef :non_existing_method
end
end
+
+assert('method_added hook') do
+ c = Class.new do
+ # method to retrieve @name
+ def self.name; @name; end
+ # hook method on method definition
+ def self.method_added(name) @name = name; end
+ # method definition
+ def foo; end
+ end
+ assert_equal(:foo, c.name)
+ c.define_method(:bar){}
+ assert_equal(:bar, c.name)
+end
+
+assert('singleton_method_added hook') do
+ a = Object.new
+ # method to retrieve @name
+ def a.name; @name; end
+ # hook method on singleton method definition
+ def a.singleton_method_added(name) @name = name; end
+ # singleton method definition
+ def a.foo; end
+ assert_equal(:foo, a.name)
+ class <<a
+ def bar; end
+ end
+ assert_equal(:bar, a.name)
+end
diff --git a/test/t/superclass.rb b/test/t/superclass.rb
index f213b1247..81630192d 100644
--- a/test/t/superclass.rb
+++ b/test/t/superclass.rb
@@ -23,8 +23,7 @@
[:Exception, :Object, '15.2.22.2'],
[:StandardError, :Exception, '15.2.23.2'],
[:ArgumentError, :StandardError, '15.2.24.2'],
- # [:LocalJumpError, :StandardError, '15.2.25.2'],
- [:LocalJumpError, :ScriptError, '15.2.25.2'], # mruby specific
+ [:LocalJumpError, :StandardError, '15.2.25.2'],
[:RangeError, :StandardError, '15.2.26.2'],
[:RegexpError, :StandardError, '15.2.27.2'],
[:RuntimeError, :StandardError, '15.2.28.2'],
diff --git a/test/t/symbol.rb b/test/t/symbol.rb
index 5c674a9cb..4cb210757 100644
--- a/test/t/symbol.rb
+++ b/test/t/symbol.rb
@@ -17,10 +17,6 @@ assert('Symbol#===', '15.2.11.3.1') do
assert_false :abc === :cba
end
-assert('Symbol#id2name', '15.2.11.3.2') do
- assert_equal 'abc', :abc.id2name
-end
-
assert('Symbol#to_s', '15.2.11.3.3') do
assert_equal 'abc', :abc.to_s
end
diff --git a/test/t/syntax.rb b/test/t/syntax.rb
index b3ee2d438..515c8f361 100644
--- a/test/t/syntax.rb
+++ b/test/t/syntax.rb
@@ -48,7 +48,32 @@ assert('yield', '11.3.5') do
end
end
-assert('redo in a for loop (#3275)') do
+assert('break', '11.5.2.4.3') do
+ n = 0
+ a = []
+ while true
+ n += 1
+ a.push(n)
+ if n > 3
+ break
+ end
+ end
+
+ assert_equal [1,2,3,4], a
+
+ n = 0
+ a = []
+ 6.times do
+ n += 1
+ a.push(n)
+ if n > 3
+ break
+ end
+ end
+ assert_equal [1,2,3,4], a
+end
+
+assert('redo', '11.5.2.4.5') do
sum = 0
for i in 1..10
sum += i
@@ -59,6 +84,17 @@ assert('redo in a for loop (#3275)') do
end
assert_equal 220, sum
+
+ n = 0
+ a = []
+ 3.times do
+ n += 1
+ if n == 2
+ redo
+ end
+ a.push(n)
+ end
+ assert_equal [1,3,4], a
end
assert('Abbreviated variable assignment', '11.4.2.3.2') do
@@ -188,6 +224,18 @@ assert('Abbreviated variable assignment as returns') do
assert_equal 1, Syntax4AbbrVarAsgnAsReturns::A.new.b
end
+assert('Abbreviated variable assignment of object attribute') do
+ module Syntax4AbbrVarAsgnObjectAttr
+ class A
+ attr_accessor :c
+ def b
+ self.c ||= 1
+ end
+ end
+ end
+ assert_equal 1, Syntax4AbbrVarAsgnObjectAttr::A.new.b
+end
+
assert('Splat and multiple assignment') do
*a = *[1,2,3]
b, *c = *[7,8,9]
@@ -706,3 +754,29 @@ assert('argument forwarding') do
o.a(1,2,3){}
o.b(1,2,3){}
end
+
+assert('endless def') do
+ c = Class.new {
+ def m1 = 42
+ def m2() = 42
+ def m3(x) = x+1
+ def self.s1 = 42
+ def self.s2() = 42
+ def self.s3(x) = x + 1
+ def cm1 = m3 42
+ def cm2() = m3 42
+ def cm3(x) = m3 x+1
+ def self.cs1 = s3 42
+ def self.cs2() = s3 42
+ def self.cs3(x) = s3 x + 1
+ }
+ o = c.new
+ assert_equal(42, o.m1)
+ assert_equal(43, o.m3(o.m2))
+ assert_equal(42, c.s1)
+ assert_equal(43, c.s3(c.s2))
+ assert_equal(43, o.cm1)
+ assert_equal(45, o.cm3(o.cm2))
+ assert_equal(43, c.cs1)
+ assert_equal(45, c.cs3(c.cs2))
+end
diff --git a/test/t/unicode.rb b/test/t/unicode.rb
index 8622ae08a..c8602da5a 100644
--- a/test/t/unicode.rb
+++ b/test/t/unicode.rb
@@ -1,15 +1,15 @@
# Test of the \u notation
assert('bare \u notation test') do
- # Mininum and maximum one byte characters
+ # Minimum and maximum one byte characters
assert_equal("\x00", "\u0000")
assert_equal("\x7F", "\u007F")
- # Mininum and maximum two byte characters
+ # Minimum and maximum two byte characters
assert_equal("\xC2\x80", "\u0080")
assert_equal("\xDF\xBF", "\u07FF")
- # Mininum and maximum three byte characters
+ # Minimum and maximum three byte characters
assert_equal("\xE0\xA0\x80", "\u0800")
assert_equal("\xEF\xBF\xBF", "\uFFFF")
@@ -17,19 +17,19 @@ assert('bare \u notation test') do
end
assert('braced \u notation test') do
- # Mininum and maximum one byte characters
+ # Minimum and maximum one byte characters
assert_equal("\x00", "\u{0000}")
assert_equal("\x7F", "\u{007F}")
- # Mininum and maximum two byte characters
+ # Minimum and maximum two byte characters
assert_equal("\xC2\x80", "\u{0080}")
assert_equal("\xDF\xBF", "\u{07FF}")
- # Mininum and maximum three byte characters
+ # Minimum and maximum three byte characters
assert_equal("\xE0\xA0\x80", "\u{0800}")
assert_equal("\xEF\xBF\xBF", "\u{FFFF}")
- # Mininum and maximum four byte characters
+ # Minimum and maximum four byte characters
assert_equal("\xF0\x90\x80\x80", "\u{10000}")
assert_equal("\xF4\x8F\xBF\xBF", "\u{10FFFF}")
end