diff options
author | yui-knk <[email protected]> | 2023-05-28 20:00:20 +0900 |
---|---|---|
committer | Yuichiro Kaneko <[email protected]> | 2023-06-12 18:23:48 +0900 |
commit | b481b673d753339204290d7582dbb91a6e14447a () | |
tree | efb6e1149f38562c047b42146307578b74d5349a | |
parent | b308f7cfe4dd17ca34ac614ce09ea8bedbb134ea (diff) |
[Feature #19719] Universal Parser
Introduce Universal Parser mode for the parser. This commit includes these changes: * Introduce `UNIVERSAL_PARSER` macro. All of CRuby related functions are passed via `struct rb_parser_config_struct` when this macro is enabled. * Add CI task with 'cppflags=-DUNIVERSAL_PARSER' for ubuntu.
Notes: Merged: https://.com/ruby/ruby/pull/7927
-rw-r--r-- | ./workflows/ubuntu.yml | 2 | ||||
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | ast.c | 2 | ||||
-rw-r--r-- | common.mk | 488 | ||||
-rw-r--r-- | ext/coverage/depend | 13 | ||||
-rw-r--r-- | ext/objspace/depend | 20 | ||||
-rw-r--r-- | ext/ripper/depend | 532 | ||||
-rw-r--r-- | ext/ripper/eventids2.c | 12 | ||||
-rw-r--r-- | ext/ripper/eventids2.h | 8 | ||||
-rw-r--r-- | ext/ripper/extconf.rb | 4 | ||||
-rw-r--r-- | ext/ripper/ripper_init.c.tmpl | 650 | ||||
-rw-r--r-- | ext/ripper/ripper_init.h | 8 | ||||
-rw-r--r-- | ext/ripper/tools/generate.rb | 39 | ||||
-rw-r--r-- | ext/ripper/tools/preproc.rb | 33 | ||||
-rw-r--r-- | ext/socket/depend | 15 | ||||
-rw-r--r-- | internal/gc.h | 12 | ||||
-rw-r--r-- | internal/parse.h | 123 | ||||
-rw-r--r-- | internal/ruby_parser.h | 68 | ||||
-rw-r--r-- | iseq.c | 2 | ||||
-rw-r--r-- | load.c | 2 | ||||
-rw-r--r-- | node.c | 1275 | ||||
-rw-r--r-- | node.h | 537 | ||||
-rw-r--r-- | node_dump.c | 1122 | ||||
-rw-r--r-- | parse.y | 1383 | ||||
-rw-r--r-- | parser_bits.h | 564 | ||||
-rw-r--r-- | parser_node.h | 133 | ||||
-rw-r--r-- | parser_st.c | 2118 | ||||
-rw-r--r-- | parser_st.h | 165 | ||||
-rw-r--r-- | parser_value.h | 106 | ||||
-rw-r--r-- | ruby.c | 2 | ||||
-rw-r--r-- | ruby_parser.c | 983 | ||||
-rw-r--r-- | rubyparser.h | 642 | ||||
-rw-r--r-- | template/prelude.c.tmpl | 1 | ||||
-rwxr-xr-x | tool/update-deps | 1 | ||||
-rw-r--r-- | universal_parser.c | 400 | ||||
-rw-r--r-- | vm.c | 2 |
36 files changed, 9038 insertions, 2431 deletions
@@ -43,6 +43,8 @@ jobs: - test_task: check configure: '--enable-shared --enable-load-relative' - test_task: test-all TESTS=--repeat-count=2 - test_task: test-bundler-parallel - test_task: test-bundled-gems fail-fast: false @@ -205,8 +205,10 @@ lcov*.info # /ext/ripper/ /ext/ripper/eventids1.c /ext/ripper/.eventids2-check /ext/ripper/eventids2table.c /ext/ripper/ripper.* /ext/ripper/ids1 /ext/ripper/ids2 @@ -1,6 +1,6 @@ /* indent-tabs-mode: nil */ #include "internal.h" -#include "internal/parse.h" #include "internal/symbol.h" #include "internal/warnings.h" #include "iseq.h" @@ -113,10 +113,12 @@ COMMONOBJS = array.$(OBJEXT) \ rjit.$(OBJEXT) \ rjit_c.$(OBJEXT) \ node.$(OBJEXT) \ numeric.$(OBJEXT) \ object.$(OBJEXT) \ pack.$(OBJEXT) \ parse.$(OBJEXT) \ proc.$(OBJEXT) \ process.$(OBJEXT) \ ractor.$(OBJEXT) \ @@ -131,6 +133,7 @@ COMMONOBJS = array.$(OBJEXT) \ regparse.$(OBJEXT) \ regsyntax.$(OBJEXT) \ ruby.$(OBJEXT) \ scheduler.$(OBJEXT) \ shape.$(OBJEXT) \ signal.$(OBJEXT) \ @@ -1129,9 +1132,9 @@ id.c: $(tooldir)/generic_erb.rb $(srcdir)/template/id.c.tmpl $(srcdir)/defs/id.d $(Q) $(BASERUBY) $(tooldir)/generic_erb.rb --output=$@ \ $(srcdir)/template/id.c.tmpl -node_name.inc: $(tooldir)/node_name.rb $(srcdir)/node.h $(ECHO) generating $@ - $(Q) $(BASERUBY) -n $(tooldir)/node_name.rb < $(srcdir)/node.h > $@ encdb.h: $(RBCONFIG) $(tooldir)/generic_erb.rb $(srcdir)/template/encdb.h.tmpl $(ECHO) generating $@ @@ -2036,6 +2039,7 @@ array.$(OBJEXT): {$(VPATH)}probes.dmyh array.$(OBJEXT): {$(VPATH)}probes.h array.$(OBJEXT): {$(VPATH)}ruby_assert.h array.$(OBJEXT): {$(VPATH)}ruby_atomic.h array.$(OBJEXT): {$(VPATH)}shape.h array.$(OBJEXT): {$(VPATH)}st.h array.$(OBJEXT): {$(VPATH)}subst.h @@ -2057,6 +2061,7 @@ ast.$(OBJEXT): $(top_srcdir)/internal/compilers.h ast.$(OBJEXT): $(top_srcdir)/internal/gc.h ast.$(OBJEXT): $(top_srcdir)/internal/imemo.h ast.$(OBJEXT): $(top_srcdir)/internal/parse.h ast.$(OBJEXT): $(top_srcdir)/internal/serial.h ast.$(OBJEXT): $(top_srcdir)/internal/static_assert.h ast.$(OBJEXT): $(top_srcdir)/internal/symbol.h @@ -2241,6 +2246,7 @@ ast.$(OBJEXT): {$(VPATH)}onigmo.h ast.$(OBJEXT): {$(VPATH)}oniguruma.h ast.$(OBJEXT): {$(VPATH)}ruby_assert.h ast.$(OBJEXT): {$(VPATH)}ruby_atomic.h ast.$(OBJEXT): {$(VPATH)}shape.h ast.$(OBJEXT): {$(VPATH)}st.h ast.$(OBJEXT): {$(VPATH)}subst.h @@ -2287,6 +2293,7 @@ bignum.$(OBJEXT): {$(VPATH)}bignum.c bignum.$(OBJEXT): {$(VPATH)}config.h bignum.$(OBJEXT): {$(VPATH)}constant.h bignum.$(OBJEXT): {$(VPATH)}defines.h bignum.$(OBJEXT): {$(VPATH)}id.h bignum.$(OBJEXT): {$(VPATH)}id_table.h bignum.$(OBJEXT): {$(VPATH)}intern.h @@ -2362,6 +2369,15 @@ bignum.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h bignum.$(OBJEXT): {$(VPATH)}internal/ctype.h bignum.$(OBJEXT): {$(VPATH)}internal/dllexport.h bignum.$(OBJEXT): {$(VPATH)}internal/dosish.h bignum.$(OBJEXT): {$(VPATH)}internal/error.h bignum.$(OBJEXT): {$(VPATH)}internal/eval.h bignum.$(OBJEXT): {$(VPATH)}internal/event.h @@ -2433,8 +2449,11 @@ bignum.$(OBJEXT): {$(VPATH)}internal/xmalloc.h bignum.$(OBJEXT): {$(VPATH)}method.h bignum.$(OBJEXT): {$(VPATH)}missing.h bignum.$(OBJEXT): {$(VPATH)}node.h bignum.$(OBJEXT): {$(VPATH)}ruby_assert.h bignum.$(OBJEXT): {$(VPATH)}ruby_atomic.h bignum.$(OBJEXT): {$(VPATH)}shape.h bignum.$(OBJEXT): {$(VPATH)}st.h bignum.$(OBJEXT): {$(VPATH)}subst.h @@ -2476,6 +2495,7 @@ builtin.$(OBJEXT): {$(VPATH)}builtin_binary.inc builtin.$(OBJEXT): {$(VPATH)}config.h builtin.$(OBJEXT): {$(VPATH)}constant.h builtin.$(OBJEXT): {$(VPATH)}defines.h builtin.$(OBJEXT): {$(VPATH)}id.h builtin.$(OBJEXT): {$(VPATH)}id_table.h builtin.$(OBJEXT): {$(VPATH)}intern.h @@ -2551,6 +2571,15 @@ builtin.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h builtin.$(OBJEXT): {$(VPATH)}internal/ctype.h builtin.$(OBJEXT): {$(VPATH)}internal/dllexport.h builtin.$(OBJEXT): {$(VPATH)}internal/dosish.h builtin.$(OBJEXT): {$(VPATH)}internal/error.h builtin.$(OBJEXT): {$(VPATH)}internal/eval.h builtin.$(OBJEXT): {$(VPATH)}internal/event.h @@ -2623,8 +2652,11 @@ builtin.$(OBJEXT): {$(VPATH)}iseq.h builtin.$(OBJEXT): {$(VPATH)}method.h builtin.$(OBJEXT): {$(VPATH)}missing.h builtin.$(OBJEXT): {$(VPATH)}node.h builtin.$(OBJEXT): {$(VPATH)}ruby_assert.h builtin.$(OBJEXT): {$(VPATH)}ruby_atomic.h builtin.$(OBJEXT): {$(VPATH)}shape.h builtin.$(OBJEXT): {$(VPATH)}st.h builtin.$(OBJEXT): {$(VPATH)}subst.h @@ -2828,6 +2860,7 @@ class.$(OBJEXT): {$(VPATH)}onigmo.h class.$(OBJEXT): {$(VPATH)}oniguruma.h class.$(OBJEXT): {$(VPATH)}ruby_assert.h class.$(OBJEXT): {$(VPATH)}ruby_atomic.h class.$(OBJEXT): {$(VPATH)}shape.h class.$(OBJEXT): {$(VPATH)}st.h class.$(OBJEXT): {$(VPATH)}subst.h @@ -3231,6 +3264,7 @@ compile.$(OBJEXT): {$(VPATH)}re.h compile.$(OBJEXT): {$(VPATH)}regex.h compile.$(OBJEXT): {$(VPATH)}ruby_assert.h compile.$(OBJEXT): {$(VPATH)}ruby_atomic.h compile.$(OBJEXT): {$(VPATH)}shape.h compile.$(OBJEXT): {$(VPATH)}st.h compile.$(OBJEXT): {$(VPATH)}subst.h @@ -3280,6 +3314,7 @@ complex.$(OBJEXT): {$(VPATH)}complex.c complex.$(OBJEXT): {$(VPATH)}config.h complex.$(OBJEXT): {$(VPATH)}constant.h complex.$(OBJEXT): {$(VPATH)}defines.h complex.$(OBJEXT): {$(VPATH)}id.h complex.$(OBJEXT): {$(VPATH)}id_table.h complex.$(OBJEXT): {$(VPATH)}intern.h @@ -3355,6 +3390,15 @@ complex.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h complex.$(OBJEXT): {$(VPATH)}internal/ctype.h complex.$(OBJEXT): {$(VPATH)}internal/dllexport.h complex.$(OBJEXT): {$(VPATH)}internal/dosish.h complex.$(OBJEXT): {$(VPATH)}internal/error.h complex.$(OBJEXT): {$(VPATH)}internal/eval.h complex.$(OBJEXT): {$(VPATH)}internal/event.h @@ -3426,8 +3470,11 @@ complex.$(OBJEXT): {$(VPATH)}internal/xmalloc.h complex.$(OBJEXT): {$(VPATH)}method.h complex.$(OBJEXT): {$(VPATH)}missing.h complex.$(OBJEXT): {$(VPATH)}node.h complex.$(OBJEXT): {$(VPATH)}ruby_assert.h complex.$(OBJEXT): {$(VPATH)}ruby_atomic.h complex.$(OBJEXT): {$(VPATH)}shape.h complex.$(OBJEXT): {$(VPATH)}st.h complex.$(OBJEXT): {$(VPATH)}subst.h @@ -3640,6 +3687,7 @@ cont.$(OBJEXT): {$(VPATH)}ractor_core.h cont.$(OBJEXT): {$(VPATH)}rjit.h cont.$(OBJEXT): {$(VPATH)}ruby_assert.h cont.$(OBJEXT): {$(VPATH)}ruby_atomic.h cont.$(OBJEXT): {$(VPATH)}shape.h cont.$(OBJEXT): {$(VPATH)}st.h cont.$(OBJEXT): {$(VPATH)}subst.h @@ -3848,6 +3896,7 @@ debug.$(OBJEXT): {$(VPATH)}ractor.h debug.$(OBJEXT): {$(VPATH)}ractor_core.h debug.$(OBJEXT): {$(VPATH)}ruby_assert.h debug.$(OBJEXT): {$(VPATH)}ruby_atomic.h debug.$(OBJEXT): {$(VPATH)}shape.h debug.$(OBJEXT): {$(VPATH)}st.h debug.$(OBJEXT): {$(VPATH)}subst.h @@ -4220,6 +4269,7 @@ dir.$(OBJEXT): {$(VPATH)}onigmo.h dir.$(OBJEXT): {$(VPATH)}oniguruma.h dir.$(OBJEXT): {$(VPATH)}ruby_assert.h dir.$(OBJEXT): {$(VPATH)}ruby_atomic.h dir.$(OBJEXT): {$(VPATH)}shape.h dir.$(OBJEXT): {$(VPATH)}st.h dir.$(OBJEXT): {$(VPATH)}subst.h @@ -6120,6 +6170,7 @@ enumerator.$(OBJEXT): {$(VPATH)}onigmo.h enumerator.$(OBJEXT): {$(VPATH)}oniguruma.h enumerator.$(OBJEXT): {$(VPATH)}ruby_assert.h enumerator.$(OBJEXT): {$(VPATH)}ruby_atomic.h enumerator.$(OBJEXT): {$(VPATH)}shape.h enumerator.$(OBJEXT): {$(VPATH)}st.h enumerator.$(OBJEXT): {$(VPATH)}subst.h @@ -6330,6 +6381,7 @@ error.$(OBJEXT): {$(VPATH)}onigmo.h error.$(OBJEXT): {$(VPATH)}oniguruma.h error.$(OBJEXT): {$(VPATH)}ruby_assert.h error.$(OBJEXT): {$(VPATH)}ruby_atomic.h error.$(OBJEXT): {$(VPATH)}shape.h error.$(OBJEXT): {$(VPATH)}st.h error.$(OBJEXT): {$(VPATH)}subst.h @@ -6552,6 +6604,7 @@ eval.$(OBJEXT): {$(VPATH)}ractor_core.h eval.$(OBJEXT): {$(VPATH)}rjit.h eval.$(OBJEXT): {$(VPATH)}ruby_assert.h eval.$(OBJEXT): {$(VPATH)}ruby_atomic.h eval.$(OBJEXT): {$(VPATH)}shape.h eval.$(OBJEXT): {$(VPATH)}st.h eval.$(OBJEXT): {$(VPATH)}subst.h @@ -7007,6 +7060,7 @@ gc.$(OBJEXT): {$(VPATH)}regint.h gc.$(OBJEXT): {$(VPATH)}rjit.h gc.$(OBJEXT): {$(VPATH)}ruby_assert.h gc.$(OBJEXT): {$(VPATH)}ruby_atomic.h gc.$(OBJEXT): {$(VPATH)}shape.h gc.$(OBJEXT): {$(VPATH)}st.h gc.$(OBJEXT): {$(VPATH)}subst.h @@ -7032,6 +7086,7 @@ goruby.$(OBJEXT): $(top_srcdir)/internal/basic_operators.h goruby.$(OBJEXT): $(top_srcdir)/internal/compilers.h goruby.$(OBJEXT): $(top_srcdir)/internal/gc.h goruby.$(OBJEXT): $(top_srcdir)/internal/imemo.h goruby.$(OBJEXT): $(top_srcdir)/internal/serial.h goruby.$(OBJEXT): $(top_srcdir)/internal/static_assert.h goruby.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -7052,6 +7107,7 @@ goruby.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h goruby.$(OBJEXT): {$(VPATH)}config.h goruby.$(OBJEXT): {$(VPATH)}constant.h goruby.$(OBJEXT): {$(VPATH)}defines.h goruby.$(OBJEXT): {$(VPATH)}golf_prelude.c goruby.$(OBJEXT): {$(VPATH)}goruby.c goruby.$(OBJEXT): {$(VPATH)}id.h @@ -7129,6 +7185,15 @@ goruby.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h goruby.$(OBJEXT): {$(VPATH)}internal/ctype.h goruby.$(OBJEXT): {$(VPATH)}internal/dllexport.h goruby.$(OBJEXT): {$(VPATH)}internal/dosish.h goruby.$(OBJEXT): {$(VPATH)}internal/error.h goruby.$(OBJEXT): {$(VPATH)}internal/eval.h goruby.$(OBJEXT): {$(VPATH)}internal/event.h @@ -7202,8 +7267,11 @@ goruby.$(OBJEXT): {$(VPATH)}main.c goruby.$(OBJEXT): {$(VPATH)}method.h goruby.$(OBJEXT): {$(VPATH)}missing.h goruby.$(OBJEXT): {$(VPATH)}node.h goruby.$(OBJEXT): {$(VPATH)}ruby_assert.h goruby.$(OBJEXT): {$(VPATH)}ruby_atomic.h goruby.$(OBJEXT): {$(VPATH)}shape.h goruby.$(OBJEXT): {$(VPATH)}st.h goruby.$(OBJEXT): {$(VPATH)}subst.h @@ -7419,6 +7487,7 @@ hash.$(OBJEXT): {$(VPATH)}probes.h hash.$(OBJEXT): {$(VPATH)}ractor.h hash.$(OBJEXT): {$(VPATH)}ruby_assert.h hash.$(OBJEXT): {$(VPATH)}ruby_atomic.h hash.$(OBJEXT): {$(VPATH)}shape.h hash.$(OBJEXT): {$(VPATH)}st.h hash.$(OBJEXT): {$(VPATH)}subst.h @@ -7806,6 +7875,7 @@ io.$(OBJEXT): {$(VPATH)}oniguruma.h io.$(OBJEXT): {$(VPATH)}ractor.h io.$(OBJEXT): {$(VPATH)}ruby_assert.h io.$(OBJEXT): {$(VPATH)}ruby_atomic.h io.$(OBJEXT): {$(VPATH)}shape.h io.$(OBJEXT): {$(VPATH)}st.h io.$(OBJEXT): {$(VPATH)}subst.h @@ -8023,6 +8093,7 @@ iseq.$(OBJEXT): $(top_srcdir)/internal/gc.h iseq.$(OBJEXT): $(top_srcdir)/internal/hash.h iseq.$(OBJEXT): $(top_srcdir)/internal/imemo.h iseq.$(OBJEXT): $(top_srcdir)/internal/parse.h iseq.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h iseq.$(OBJEXT): $(top_srcdir)/internal/serial.h iseq.$(OBJEXT): $(top_srcdir)/internal/static_assert.h @@ -8216,6 +8287,7 @@ iseq.$(OBJEXT): {$(VPATH)}ractor.h iseq.$(OBJEXT): {$(VPATH)}rjit.h iseq.$(OBJEXT): {$(VPATH)}ruby_assert.h iseq.$(OBJEXT): {$(VPATH)}ruby_atomic.h iseq.$(OBJEXT): {$(VPATH)}shape.h iseq.$(OBJEXT): {$(VPATH)}st.h iseq.$(OBJEXT): {$(VPATH)}subst.h @@ -8241,6 +8313,7 @@ load.$(OBJEXT): $(top_srcdir)/internal/gc.h load.$(OBJEXT): $(top_srcdir)/internal/imemo.h load.$(OBJEXT): $(top_srcdir)/internal/load.h load.$(OBJEXT): $(top_srcdir)/internal/parse.h load.$(OBJEXT): $(top_srcdir)/internal/serial.h load.$(OBJEXT): $(top_srcdir)/internal/static_assert.h load.$(OBJEXT): $(top_srcdir)/internal/string.h @@ -8429,6 +8502,7 @@ load.$(OBJEXT): {$(VPATH)}probes.dmyh load.$(OBJEXT): {$(VPATH)}probes.h load.$(OBJEXT): {$(VPATH)}ruby_assert.h load.$(OBJEXT): {$(VPATH)}ruby_atomic.h load.$(OBJEXT): {$(VPATH)}shape.h load.$(OBJEXT): {$(VPATH)}st.h load.$(OBJEXT): {$(VPATH)}subst.h @@ -9132,6 +9206,7 @@ marshal.$(OBJEXT): {$(VPATH)}onigmo.h marshal.$(OBJEXT): {$(VPATH)}oniguruma.h marshal.$(OBJEXT): {$(VPATH)}ruby_assert.h marshal.$(OBJEXT): {$(VPATH)}ruby_atomic.h marshal.$(OBJEXT): {$(VPATH)}shape.h marshal.$(OBJEXT): {$(VPATH)}st.h marshal.$(OBJEXT): {$(VPATH)}subst.h @@ -9344,6 +9419,7 @@ memory_view.$(OBJEXT): {$(VPATH)}config.h memory_view.$(OBJEXT): {$(VPATH)}constant.h memory_view.$(OBJEXT): {$(VPATH)}debug_counter.h memory_view.$(OBJEXT): {$(VPATH)}defines.h memory_view.$(OBJEXT): {$(VPATH)}id.h memory_view.$(OBJEXT): {$(VPATH)}id_table.h memory_view.$(OBJEXT): {$(VPATH)}intern.h @@ -9419,6 +9495,15 @@ memory_view.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h memory_view.$(OBJEXT): {$(VPATH)}internal/ctype.h memory_view.$(OBJEXT): {$(VPATH)}internal/dllexport.h memory_view.$(OBJEXT): {$(VPATH)}internal/dosish.h memory_view.$(OBJEXT): {$(VPATH)}internal/error.h memory_view.$(OBJEXT): {$(VPATH)}internal/eval.h memory_view.$(OBJEXT): {$(VPATH)}internal/event.h @@ -9492,8 +9577,11 @@ memory_view.$(OBJEXT): {$(VPATH)}memory_view.h memory_view.$(OBJEXT): {$(VPATH)}method.h memory_view.$(OBJEXT): {$(VPATH)}missing.h memory_view.$(OBJEXT): {$(VPATH)}node.h memory_view.$(OBJEXT): {$(VPATH)}ruby_assert.h memory_view.$(OBJEXT): {$(VPATH)}ruby_atomic.h memory_view.$(OBJEXT): {$(VPATH)}shape.h memory_view.$(OBJEXT): {$(VPATH)}st.h memory_view.$(OBJEXT): {$(VPATH)}subst.h @@ -9515,6 +9603,7 @@ miniinit.$(OBJEXT): $(top_srcdir)/internal/basic_operators.h miniinit.$(OBJEXT): $(top_srcdir)/internal/compilers.h miniinit.$(OBJEXT): $(top_srcdir)/internal/gc.h miniinit.$(OBJEXT): $(top_srcdir)/internal/imemo.h miniinit.$(OBJEXT): $(top_srcdir)/internal/serial.h miniinit.$(OBJEXT): $(top_srcdir)/internal/static_assert.h miniinit.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -9714,6 +9803,7 @@ miniinit.$(OBJEXT): {$(VPATH)}rjit.rb miniinit.$(OBJEXT): {$(VPATH)}rjit_c.rb miniinit.$(OBJEXT): {$(VPATH)}ruby_assert.h miniinit.$(OBJEXT): {$(VPATH)}ruby_atomic.h miniinit.$(OBJEXT): {$(VPATH)}shape.h miniinit.$(OBJEXT): {$(VPATH)}st.h miniinit.$(OBJEXT): {$(VPATH)}subst.h @@ -9757,6 +9847,7 @@ node.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h node.$(OBJEXT): {$(VPATH)}config.h node.$(OBJEXT): {$(VPATH)}constant.h node.$(OBJEXT): {$(VPATH)}defines.h node.$(OBJEXT): {$(VPATH)}id.h node.$(OBJEXT): {$(VPATH)}id_table.h node.$(OBJEXT): {$(VPATH)}intern.h @@ -9832,6 +9923,15 @@ node.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h node.$(OBJEXT): {$(VPATH)}internal/ctype.h node.$(OBJEXT): {$(VPATH)}internal/dllexport.h node.$(OBJEXT): {$(VPATH)}internal/dosish.h node.$(OBJEXT): {$(VPATH)}internal/error.h node.$(OBJEXT): {$(VPATH)}internal/eval.h node.$(OBJEXT): {$(VPATH)}internal/event.h @@ -9905,8 +10005,11 @@ node.$(OBJEXT): {$(VPATH)}missing.h node.$(OBJEXT): {$(VPATH)}node.c node.$(OBJEXT): {$(VPATH)}node.h node.$(OBJEXT): {$(VPATH)}node_name.inc node.$(OBJEXT): {$(VPATH)}ruby_assert.h node.$(OBJEXT): {$(VPATH)}ruby_atomic.h node.$(OBJEXT): {$(VPATH)}shape.h node.$(OBJEXT): {$(VPATH)}st.h node.$(OBJEXT): {$(VPATH)}subst.h @@ -9914,6 +10017,205 @@ node.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h node.$(OBJEXT): {$(VPATH)}thread_native.h node.$(OBJEXT): {$(VPATH)}vm_core.h node.$(OBJEXT): {$(VPATH)}vm_opts.h numeric.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h numeric.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h numeric.$(OBJEXT): $(CCAN_DIR)/list/list.h @@ -10118,6 +10420,7 @@ numeric.$(OBJEXT): {$(VPATH)}onigmo.h numeric.$(OBJEXT): {$(VPATH)}oniguruma.h numeric.$(OBJEXT): {$(VPATH)}ruby_assert.h numeric.$(OBJEXT): {$(VPATH)}ruby_atomic.h numeric.$(OBJEXT): {$(VPATH)}shape.h numeric.$(OBJEXT): {$(VPATH)}st.h numeric.$(OBJEXT): {$(VPATH)}subst.h @@ -10333,6 +10636,7 @@ object.$(OBJEXT): {$(VPATH)}probes.dmyh object.$(OBJEXT): {$(VPATH)}probes.h object.$(OBJEXT): {$(VPATH)}ruby_assert.h object.$(OBJEXT): {$(VPATH)}ruby_atomic.h object.$(OBJEXT): {$(VPATH)}shape.h object.$(OBJEXT): {$(VPATH)}st.h object.$(OBJEXT): {$(VPATH)}subst.h @@ -10537,6 +10841,7 @@ pack.$(OBJEXT): {$(VPATH)}pack.c pack.$(OBJEXT): {$(VPATH)}pack.rbinc pack.$(OBJEXT): {$(VPATH)}ruby_assert.h pack.$(OBJEXT): {$(VPATH)}ruby_atomic.h pack.$(OBJEXT): {$(VPATH)}shape.h pack.$(OBJEXT): {$(VPATH)}st.h pack.$(OBJEXT): {$(VPATH)}subst.h @@ -10569,6 +10874,7 @@ parse.$(OBJEXT): $(top_srcdir)/internal/numeric.h parse.$(OBJEXT): $(top_srcdir)/internal/parse.h parse.$(OBJEXT): $(top_srcdir)/internal/rational.h parse.$(OBJEXT): $(top_srcdir)/internal/re.h parse.$(OBJEXT): $(top_srcdir)/internal/serial.h parse.$(OBJEXT): $(top_srcdir)/internal/static_assert.h parse.$(OBJEXT): $(top_srcdir)/internal/string.h @@ -10755,6 +11061,7 @@ parse.$(OBJEXT): {$(VPATH)}oniguruma.h parse.$(OBJEXT): {$(VPATH)}parse.c parse.$(OBJEXT): {$(VPATH)}parse.h parse.$(OBJEXT): {$(VPATH)}parse.y parse.$(OBJEXT): {$(VPATH)}probes.dmyh parse.$(OBJEXT): {$(VPATH)}probes.h parse.$(OBJEXT): {$(VPATH)}ractor.h @@ -10762,6 +11069,7 @@ parse.$(OBJEXT): {$(VPATH)}regenc.h parse.$(OBJEXT): {$(VPATH)}regex.h parse.$(OBJEXT): {$(VPATH)}ruby_assert.h parse.$(OBJEXT): {$(VPATH)}ruby_atomic.h parse.$(OBJEXT): {$(VPATH)}shape.h parse.$(OBJEXT): {$(VPATH)}st.h parse.$(OBJEXT): {$(VPATH)}subst.h @@ -10771,6 +11079,68 @@ parse.$(OBJEXT): {$(VPATH)}thread_native.h parse.$(OBJEXT): {$(VPATH)}util.h parse.$(OBJEXT): {$(VPATH)}vm_core.h parse.$(OBJEXT): {$(VPATH)}vm_opts.h proc.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h proc.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h proc.$(OBJEXT): $(CCAN_DIR)/list/list.h @@ -10970,6 +11340,7 @@ proc.$(OBJEXT): {$(VPATH)}oniguruma.h proc.$(OBJEXT): {$(VPATH)}proc.c proc.$(OBJEXT): {$(VPATH)}ruby_assert.h proc.$(OBJEXT): {$(VPATH)}ruby_atomic.h proc.$(OBJEXT): {$(VPATH)}shape.h proc.$(OBJEXT): {$(VPATH)}st.h proc.$(OBJEXT): {$(VPATH)}subst.h @@ -11191,6 +11562,7 @@ process.$(OBJEXT): {$(VPATH)}ractor.h process.$(OBJEXT): {$(VPATH)}rjit.h process.$(OBJEXT): {$(VPATH)}ruby_assert.h process.$(OBJEXT): {$(VPATH)}ruby_atomic.h process.$(OBJEXT): {$(VPATH)}shape.h process.$(OBJEXT): {$(VPATH)}st.h process.$(OBJEXT): {$(VPATH)}subst.h @@ -11409,6 +11781,7 @@ ractor.$(OBJEXT): {$(VPATH)}ractor_core.h ractor.$(OBJEXT): {$(VPATH)}rjit.h ractor.$(OBJEXT): {$(VPATH)}ruby_assert.h ractor.$(OBJEXT): {$(VPATH)}ruby_atomic.h ractor.$(OBJEXT): {$(VPATH)}shape.h ractor.$(OBJEXT): {$(VPATH)}st.h ractor.$(OBJEXT): {$(VPATH)}subst.h @@ -11457,6 +11830,7 @@ random.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h random.$(OBJEXT): {$(VPATH)}config.h random.$(OBJEXT): {$(VPATH)}constant.h random.$(OBJEXT): {$(VPATH)}defines.h random.$(OBJEXT): {$(VPATH)}id.h random.$(OBJEXT): {$(VPATH)}id_table.h random.$(OBJEXT): {$(VPATH)}intern.h @@ -11532,6 +11906,15 @@ random.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h random.$(OBJEXT): {$(VPATH)}internal/ctype.h random.$(OBJEXT): {$(VPATH)}internal/dllexport.h random.$(OBJEXT): {$(VPATH)}internal/dosish.h random.$(OBJEXT): {$(VPATH)}internal/error.h random.$(OBJEXT): {$(VPATH)}internal/eval.h random.$(OBJEXT): {$(VPATH)}internal/event.h @@ -11604,11 +11987,14 @@ random.$(OBJEXT): {$(VPATH)}method.h random.$(OBJEXT): {$(VPATH)}missing.h random.$(OBJEXT): {$(VPATH)}mt19937.c random.$(OBJEXT): {$(VPATH)}node.h random.$(OBJEXT): {$(VPATH)}ractor.h random.$(OBJEXT): {$(VPATH)}random.c random.$(OBJEXT): {$(VPATH)}random.h random.$(OBJEXT): {$(VPATH)}ruby_assert.h random.$(OBJEXT): {$(VPATH)}ruby_atomic.h random.$(OBJEXT): {$(VPATH)}shape.h random.$(OBJEXT): {$(VPATH)}siphash.c random.$(OBJEXT): {$(VPATH)}siphash.h @@ -11846,6 +12232,7 @@ rational.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h rational.$(OBJEXT): {$(VPATH)}config.h rational.$(OBJEXT): {$(VPATH)}constant.h rational.$(OBJEXT): {$(VPATH)}defines.h rational.$(OBJEXT): {$(VPATH)}id.h rational.$(OBJEXT): {$(VPATH)}id_table.h rational.$(OBJEXT): {$(VPATH)}intern.h @@ -11921,6 +12308,15 @@ rational.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h rational.$(OBJEXT): {$(VPATH)}internal/ctype.h rational.$(OBJEXT): {$(VPATH)}internal/dllexport.h rational.$(OBJEXT): {$(VPATH)}internal/dosish.h rational.$(OBJEXT): {$(VPATH)}internal/error.h rational.$(OBJEXT): {$(VPATH)}internal/eval.h rational.$(OBJEXT): {$(VPATH)}internal/event.h @@ -11992,9 +12388,12 @@ rational.$(OBJEXT): {$(VPATH)}internal/xmalloc.h rational.$(OBJEXT): {$(VPATH)}method.h rational.$(OBJEXT): {$(VPATH)}missing.h rational.$(OBJEXT): {$(VPATH)}node.h rational.$(OBJEXT): {$(VPATH)}rational.c rational.$(OBJEXT): {$(VPATH)}ruby_assert.h rational.$(OBJEXT): {$(VPATH)}ruby_atomic.h rational.$(OBJEXT): {$(VPATH)}shape.h rational.$(OBJEXT): {$(VPATH)}st.h rational.$(OBJEXT): {$(VPATH)}subst.h @@ -12209,6 +12608,7 @@ re.$(OBJEXT): {$(VPATH)}regex.h re.$(OBJEXT): {$(VPATH)}regint.h re.$(OBJEXT): {$(VPATH)}ruby_assert.h re.$(OBJEXT): {$(VPATH)}ruby_atomic.h re.$(OBJEXT): {$(VPATH)}shape.h re.$(OBJEXT): {$(VPATH)}st.h re.$(OBJEXT): {$(VPATH)}subst.h @@ -13397,6 +13797,7 @@ rjit.$(OBJEXT): {$(VPATH)}rjit.rbinc rjit.$(OBJEXT): {$(VPATH)}rjit_c.h rjit.$(OBJEXT): {$(VPATH)}ruby_assert.h rjit.$(OBJEXT): {$(VPATH)}ruby_atomic.h rjit.$(OBJEXT): {$(VPATH)}shape.h rjit.$(OBJEXT): {$(VPATH)}st.h rjit.$(OBJEXT): {$(VPATH)}subst.h @@ -13625,6 +14026,7 @@ rjit_c.$(OBJEXT): {$(VPATH)}rjit_c.rb rjit_c.$(OBJEXT): {$(VPATH)}rjit_c.rbinc rjit_c.$(OBJEXT): {$(VPATH)}ruby_assert.h rjit_c.$(OBJEXT): {$(VPATH)}ruby_atomic.h rjit_c.$(OBJEXT): {$(VPATH)}shape.h rjit_c.$(OBJEXT): {$(VPATH)}st.h rjit_c.$(OBJEXT): {$(VPATH)}subst.h @@ -13672,6 +14074,7 @@ ruby.$(OBJEXT): $(top_srcdir)/internal/loadpath.h ruby.$(OBJEXT): $(top_srcdir)/internal/missing.h ruby.$(OBJEXT): $(top_srcdir)/internal/object.h ruby.$(OBJEXT): $(top_srcdir)/internal/parse.h ruby.$(OBJEXT): $(top_srcdir)/internal/serial.h ruby.$(OBJEXT): $(top_srcdir)/internal/static_assert.h ruby.$(OBJEXT): $(top_srcdir)/internal/string.h @@ -13859,6 +14262,7 @@ ruby.$(OBJEXT): {$(VPATH)}rjit.h ruby.$(OBJEXT): {$(VPATH)}ruby.c ruby.$(OBJEXT): {$(VPATH)}ruby_assert.h ruby.$(OBJEXT): {$(VPATH)}ruby_atomic.h ruby.$(OBJEXT): {$(VPATH)}shape.h ruby.$(OBJEXT): {$(VPATH)}st.h ruby.$(OBJEXT): {$(VPATH)}subst.h @@ -13869,6 +14273,7 @@ ruby.$(OBJEXT): {$(VPATH)}util.h ruby.$(OBJEXT): {$(VPATH)}vm_core.h ruby.$(OBJEXT): {$(VPATH)}vm_opts.h ruby.$(OBJEXT): {$(VPATH)}yjit.h scheduler.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h scheduler.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h scheduler.$(OBJEXT): $(CCAN_DIR)/list/list.h @@ -14062,6 +14467,7 @@ scheduler.$(OBJEXT): {$(VPATH)}onigmo.h scheduler.$(OBJEXT): {$(VPATH)}oniguruma.h scheduler.$(OBJEXT): {$(VPATH)}ruby_assert.h scheduler.$(OBJEXT): {$(VPATH)}ruby_atomic.h scheduler.$(OBJEXT): {$(VPATH)}scheduler.c scheduler.$(OBJEXT): {$(VPATH)}shape.h scheduler.$(OBJEXT): {$(VPATH)}st.h @@ -14422,6 +14828,7 @@ shape.$(OBJEXT): {$(VPATH)}onigmo.h shape.$(OBJEXT): {$(VPATH)}oniguruma.h shape.$(OBJEXT): {$(VPATH)}ruby_assert.h shape.$(OBJEXT): {$(VPATH)}ruby_atomic.h shape.$(OBJEXT): {$(VPATH)}shape.c shape.$(OBJEXT): {$(VPATH)}shape.h shape.$(OBJEXT): {$(VPATH)}st.h @@ -14633,6 +15040,7 @@ signal.$(OBJEXT): {$(VPATH)}ractor.h signal.$(OBJEXT): {$(VPATH)}ractor_core.h signal.$(OBJEXT): {$(VPATH)}ruby_assert.h signal.$(OBJEXT): {$(VPATH)}ruby_atomic.h signal.$(OBJEXT): {$(VPATH)}shape.h signal.$(OBJEXT): {$(VPATH)}signal.c signal.$(OBJEXT): {$(VPATH)}st.h @@ -15391,6 +15799,7 @@ string.$(OBJEXT): {$(VPATH)}re.h string.$(OBJEXT): {$(VPATH)}regex.h string.$(OBJEXT): {$(VPATH)}ruby_assert.h string.$(OBJEXT): {$(VPATH)}ruby_atomic.h string.$(OBJEXT): {$(VPATH)}shape.h string.$(OBJEXT): {$(VPATH)}st.h string.$(OBJEXT): {$(VPATH)}string.c @@ -15630,6 +16039,7 @@ struct.$(OBJEXT): {$(VPATH)}onigmo.h struct.$(OBJEXT): {$(VPATH)}oniguruma.h struct.$(OBJEXT): {$(VPATH)}ruby_assert.h struct.$(OBJEXT): {$(VPATH)}ruby_atomic.h struct.$(OBJEXT): {$(VPATH)}shape.h struct.$(OBJEXT): {$(VPATH)}st.h struct.$(OBJEXT): {$(VPATH)}struct.c @@ -15840,6 +16250,7 @@ symbol.$(OBJEXT): {$(VPATH)}probes.dmyh symbol.$(OBJEXT): {$(VPATH)}probes.h symbol.$(OBJEXT): {$(VPATH)}ruby_assert.h symbol.$(OBJEXT): {$(VPATH)}ruby_atomic.h symbol.$(OBJEXT): {$(VPATH)}shape.h symbol.$(OBJEXT): {$(VPATH)}st.h symbol.$(OBJEXT): {$(VPATH)}subst.h @@ -16066,6 +16477,7 @@ thread.$(OBJEXT): {$(VPATH)}ractor_core.h thread.$(OBJEXT): {$(VPATH)}rjit.h thread.$(OBJEXT): {$(VPATH)}ruby_assert.h thread.$(OBJEXT): {$(VPATH)}ruby_atomic.h thread.$(OBJEXT): {$(VPATH)}shape.h thread.$(OBJEXT): {$(VPATH)}st.h thread.$(OBJEXT): {$(VPATH)}subst.h @@ -16280,6 +16692,7 @@ time.$(OBJEXT): {$(VPATH)}onigmo.h time.$(OBJEXT): {$(VPATH)}oniguruma.h time.$(OBJEXT): {$(VPATH)}ruby_assert.h time.$(OBJEXT): {$(VPATH)}ruby_atomic.h time.$(OBJEXT): {$(VPATH)}shape.h time.$(OBJEXT): {$(VPATH)}st.h time.$(OBJEXT): {$(VPATH)}subst.h @@ -16510,6 +16923,7 @@ transient_heap.$(OBJEXT): {$(VPATH)}constant.h transient_heap.$(OBJEXT): {$(VPATH)}debug.h transient_heap.$(OBJEXT): {$(VPATH)}debug_counter.h transient_heap.$(OBJEXT): {$(VPATH)}defines.h transient_heap.$(OBJEXT): {$(VPATH)}id.h transient_heap.$(OBJEXT): {$(VPATH)}id_table.h transient_heap.$(OBJEXT): {$(VPATH)}intern.h @@ -16585,6 +16999,15 @@ transient_heap.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h transient_heap.$(OBJEXT): {$(VPATH)}internal/ctype.h transient_heap.$(OBJEXT): {$(VPATH)}internal/dllexport.h transient_heap.$(OBJEXT): {$(VPATH)}internal/dosish.h transient_heap.$(OBJEXT): {$(VPATH)}internal/error.h transient_heap.$(OBJEXT): {$(VPATH)}internal/eval.h transient_heap.$(OBJEXT): {$(VPATH)}internal/event.h @@ -16656,8 +17079,11 @@ transient_heap.$(OBJEXT): {$(VPATH)}internal/xmalloc.h transient_heap.$(OBJEXT): {$(VPATH)}method.h transient_heap.$(OBJEXT): {$(VPATH)}missing.h transient_heap.$(OBJEXT): {$(VPATH)}node.h transient_heap.$(OBJEXT): {$(VPATH)}ruby_assert.h transient_heap.$(OBJEXT): {$(VPATH)}ruby_atomic.h transient_heap.$(OBJEXT): {$(VPATH)}shape.h transient_heap.$(OBJEXT): {$(VPATH)}st.h transient_heap.$(OBJEXT): {$(VPATH)}subst.h @@ -17036,6 +17462,7 @@ variable.$(OBJEXT): {$(VPATH)}ractor.h variable.$(OBJEXT): {$(VPATH)}ractor_core.h variable.$(OBJEXT): {$(VPATH)}ruby_assert.h variable.$(OBJEXT): {$(VPATH)}ruby_atomic.h variable.$(OBJEXT): {$(VPATH)}shape.h variable.$(OBJEXT): {$(VPATH)}st.h variable.$(OBJEXT): {$(VPATH)}subst.h @@ -17083,6 +17510,7 @@ version.$(OBJEXT): {$(VPATH)}config.h version.$(OBJEXT): {$(VPATH)}constant.h version.$(OBJEXT): {$(VPATH)}debug_counter.h version.$(OBJEXT): {$(VPATH)}defines.h version.$(OBJEXT): {$(VPATH)}id.h version.$(OBJEXT): {$(VPATH)}id_table.h version.$(OBJEXT): {$(VPATH)}intern.h @@ -17158,6 +17586,15 @@ version.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h version.$(OBJEXT): {$(VPATH)}internal/ctype.h version.$(OBJEXT): {$(VPATH)}internal/dllexport.h version.$(OBJEXT): {$(VPATH)}internal/dosish.h version.$(OBJEXT): {$(VPATH)}internal/error.h version.$(OBJEXT): {$(VPATH)}internal/eval.h version.$(OBJEXT): {$(VPATH)}internal/event.h @@ -17229,10 +17666,13 @@ version.$(OBJEXT): {$(VPATH)}internal/xmalloc.h version.$(OBJEXT): {$(VPATH)}method.h version.$(OBJEXT): {$(VPATH)}missing.h version.$(OBJEXT): {$(VPATH)}node.h version.$(OBJEXT): {$(VPATH)}revision.h version.$(OBJEXT): {$(VPATH)}rjit.h version.$(OBJEXT): {$(VPATH)}ruby_assert.h version.$(OBJEXT): {$(VPATH)}ruby_atomic.h version.$(OBJEXT): {$(VPATH)}shape.h version.$(OBJEXT): {$(VPATH)}st.h version.$(OBJEXT): {$(VPATH)}subst.h @@ -17270,6 +17710,7 @@ vm.$(OBJEXT): $(top_srcdir)/internal/parse.h vm.$(OBJEXT): $(top_srcdir)/internal/proc.h vm.$(OBJEXT): $(top_srcdir)/internal/random.h vm.$(OBJEXT): $(top_srcdir)/internal/re.h vm.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h vm.$(OBJEXT): $(top_srcdir)/internal/serial.h vm.$(OBJEXT): $(top_srcdir)/internal/static_assert.h @@ -17468,6 +17909,7 @@ vm.$(OBJEXT): {$(VPATH)}ractor_core.h vm.$(OBJEXT): {$(VPATH)}rjit.h vm.$(OBJEXT): {$(VPATH)}ruby_assert.h vm.$(OBJEXT): {$(VPATH)}ruby_atomic.h vm.$(OBJEXT): {$(VPATH)}shape.h vm.$(OBJEXT): {$(VPATH)}st.h vm.$(OBJEXT): {$(VPATH)}subst.h @@ -17687,6 +18129,7 @@ vm_backtrace.$(OBJEXT): {$(VPATH)}onigmo.h vm_backtrace.$(OBJEXT): {$(VPATH)}oniguruma.h vm_backtrace.$(OBJEXT): {$(VPATH)}ruby_assert.h vm_backtrace.$(OBJEXT): {$(VPATH)}ruby_atomic.h vm_backtrace.$(OBJEXT): {$(VPATH)}shape.h vm_backtrace.$(OBJEXT): {$(VPATH)}st.h vm_backtrace.$(OBJEXT): {$(VPATH)}subst.h @@ -17725,6 +18168,7 @@ vm_dump.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h vm_dump.$(OBJEXT): {$(VPATH)}config.h vm_dump.$(OBJEXT): {$(VPATH)}constant.h vm_dump.$(OBJEXT): {$(VPATH)}defines.h vm_dump.$(OBJEXT): {$(VPATH)}id.h vm_dump.$(OBJEXT): {$(VPATH)}id_table.h vm_dump.$(OBJEXT): {$(VPATH)}intern.h @@ -17800,6 +18244,15 @@ vm_dump.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h vm_dump.$(OBJEXT): {$(VPATH)}internal/ctype.h vm_dump.$(OBJEXT): {$(VPATH)}internal/dllexport.h vm_dump.$(OBJEXT): {$(VPATH)}internal/dosish.h vm_dump.$(OBJEXT): {$(VPATH)}internal/error.h vm_dump.$(OBJEXT): {$(VPATH)}internal/eval.h vm_dump.$(OBJEXT): {$(VPATH)}internal/event.h @@ -17872,11 +18325,14 @@ vm_dump.$(OBJEXT): {$(VPATH)}iseq.h vm_dump.$(OBJEXT): {$(VPATH)}method.h vm_dump.$(OBJEXT): {$(VPATH)}missing.h vm_dump.$(OBJEXT): {$(VPATH)}node.h vm_dump.$(OBJEXT): {$(VPATH)}procstat_vm.c vm_dump.$(OBJEXT): {$(VPATH)}ractor.h vm_dump.$(OBJEXT): {$(VPATH)}ractor_core.h vm_dump.$(OBJEXT): {$(VPATH)}ruby_assert.h vm_dump.$(OBJEXT): {$(VPATH)}ruby_atomic.h vm_dump.$(OBJEXT): {$(VPATH)}shape.h vm_dump.$(OBJEXT): {$(VPATH)}st.h vm_dump.$(OBJEXT): {$(VPATH)}subst.h @@ -17917,6 +18373,7 @@ vm_sync.$(OBJEXT): {$(VPATH)}config.h vm_sync.$(OBJEXT): {$(VPATH)}constant.h vm_sync.$(OBJEXT): {$(VPATH)}debug_counter.h vm_sync.$(OBJEXT): {$(VPATH)}defines.h vm_sync.$(OBJEXT): {$(VPATH)}id.h vm_sync.$(OBJEXT): {$(VPATH)}id_table.h vm_sync.$(OBJEXT): {$(VPATH)}intern.h @@ -17992,6 +18449,15 @@ vm_sync.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h vm_sync.$(OBJEXT): {$(VPATH)}internal/ctype.h vm_sync.$(OBJEXT): {$(VPATH)}internal/dllexport.h vm_sync.$(OBJEXT): {$(VPATH)}internal/dosish.h vm_sync.$(OBJEXT): {$(VPATH)}internal/error.h vm_sync.$(OBJEXT): {$(VPATH)}internal/eval.h vm_sync.$(OBJEXT): {$(VPATH)}internal/event.h @@ -18063,10 +18529,13 @@ vm_sync.$(OBJEXT): {$(VPATH)}internal/xmalloc.h vm_sync.$(OBJEXT): {$(VPATH)}method.h vm_sync.$(OBJEXT): {$(VPATH)}missing.h vm_sync.$(OBJEXT): {$(VPATH)}node.h vm_sync.$(OBJEXT): {$(VPATH)}ractor.h vm_sync.$(OBJEXT): {$(VPATH)}ractor_core.h vm_sync.$(OBJEXT): {$(VPATH)}ruby_assert.h vm_sync.$(OBJEXT): {$(VPATH)}ruby_atomic.h vm_sync.$(OBJEXT): {$(VPATH)}shape.h vm_sync.$(OBJEXT): {$(VPATH)}st.h vm_sync.$(OBJEXT): {$(VPATH)}subst.h @@ -18277,6 +18746,7 @@ vm_trace.$(OBJEXT): {$(VPATH)}ractor.h vm_trace.$(OBJEXT): {$(VPATH)}rjit.h vm_trace.$(OBJEXT): {$(VPATH)}ruby_assert.h vm_trace.$(OBJEXT): {$(VPATH)}ruby_atomic.h vm_trace.$(OBJEXT): {$(VPATH)}shape.h vm_trace.$(OBJEXT): {$(VPATH)}st.h vm_trace.$(OBJEXT): {$(VPATH)}subst.h @@ -18317,6 +18787,7 @@ weakmap.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h weakmap.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h weakmap.$(OBJEXT): {$(VPATH)}config.h weakmap.$(OBJEXT): {$(VPATH)}defines.h weakmap.$(OBJEXT): {$(VPATH)}id.h weakmap.$(OBJEXT): {$(VPATH)}intern.h weakmap.$(OBJEXT): {$(VPATH)}internal.h @@ -18391,6 +18862,15 @@ weakmap.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h weakmap.$(OBJEXT): {$(VPATH)}internal/ctype.h weakmap.$(OBJEXT): {$(VPATH)}internal/dllexport.h weakmap.$(OBJEXT): {$(VPATH)}internal/dosish.h weakmap.$(OBJEXT): {$(VPATH)}internal/error.h weakmap.$(OBJEXT): {$(VPATH)}internal/eval.h weakmap.$(OBJEXT): {$(VPATH)}internal/event.h @@ -18462,8 +18942,11 @@ weakmap.$(OBJEXT): {$(VPATH)}internal/xmalloc.h weakmap.$(OBJEXT): {$(VPATH)}method.h weakmap.$(OBJEXT): {$(VPATH)}missing.h weakmap.$(OBJEXT): {$(VPATH)}node.h weakmap.$(OBJEXT): {$(VPATH)}ruby_assert.h weakmap.$(OBJEXT): {$(VPATH)}ruby_atomic.h weakmap.$(OBJEXT): {$(VPATH)}st.h weakmap.$(OBJEXT): {$(VPATH)}subst.h weakmap.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h @@ -18681,6 +19164,7 @@ yjit.$(OBJEXT): {$(VPATH)}probes.h yjit.$(OBJEXT): {$(VPATH)}probes_helper.h yjit.$(OBJEXT): {$(VPATH)}ruby_assert.h yjit.$(OBJEXT): {$(VPATH)}ruby_atomic.h yjit.$(OBJEXT): {$(VPATH)}shape.h yjit.$(OBJEXT): {$(VPATH)}st.h yjit.$(OBJEXT): {$(VPATH)}subst.h @@ -15,6 +15,7 @@ coverage.o: $(hdrdir)/ruby/backward/2/long_long.h coverage.o: $(hdrdir)/ruby/backward/2/stdalign.h coverage.o: $(hdrdir)/ruby/backward/2/stdarg.h coverage.o: $(hdrdir)/ruby/defines.h coverage.o: $(hdrdir)/ruby/intern.h coverage.o: $(hdrdir)/ruby/internal/abi.h coverage.o: $(hdrdir)/ruby/internal/anyargs.h @@ -87,6 +88,15 @@ coverage.o: $(hdrdir)/ruby/internal/core/rtypeddata.h coverage.o: $(hdrdir)/ruby/internal/ctype.h coverage.o: $(hdrdir)/ruby/internal/dllexport.h coverage.o: $(hdrdir)/ruby/internal/dosish.h coverage.o: $(hdrdir)/ruby/internal/error.h coverage.o: $(hdrdir)/ruby/internal/eval.h coverage.o: $(hdrdir)/ruby/internal/event.h @@ -156,6 +166,8 @@ coverage.o: $(hdrdir)/ruby/internal/variable.h coverage.o: $(hdrdir)/ruby/internal/warning_push.h coverage.o: $(hdrdir)/ruby/internal/xmalloc.h coverage.o: $(hdrdir)/ruby/missing.h coverage.o: $(hdrdir)/ruby/ruby.h coverage.o: $(hdrdir)/ruby/st.h coverage.o: $(hdrdir)/ruby/subst.h @@ -184,6 +196,7 @@ coverage.o: $(top_srcdir)/method.h coverage.o: $(top_srcdir)/node.h coverage.o: $(top_srcdir)/ruby_assert.h coverage.o: $(top_srcdir)/ruby_atomic.h coverage.o: $(top_srcdir)/shape.h coverage.o: $(top_srcdir)/thread_pthread.h coverage.o: $(top_srcdir)/vm_core.h @@ -15,6 +15,7 @@ object_tracing.o: $(hdrdir)/ruby/backward/2/stdalign.h object_tracing.o: $(hdrdir)/ruby/backward/2/stdarg.h object_tracing.o: $(hdrdir)/ruby/debug.h object_tracing.o: $(hdrdir)/ruby/defines.h object_tracing.o: $(hdrdir)/ruby/intern.h object_tracing.o: $(hdrdir)/ruby/internal/abi.h object_tracing.o: $(hdrdir)/ruby/internal/anyargs.h @@ -87,6 +88,15 @@ object_tracing.o: $(hdrdir)/ruby/internal/core/rtypeddata.h object_tracing.o: $(hdrdir)/ruby/internal/ctype.h object_tracing.o: $(hdrdir)/ruby/internal/dllexport.h object_tracing.o: $(hdrdir)/ruby/internal/dosish.h object_tracing.o: $(hdrdir)/ruby/internal/error.h object_tracing.o: $(hdrdir)/ruby/internal/eval.h object_tracing.o: $(hdrdir)/ruby/internal/event.h @@ -156,6 +166,8 @@ object_tracing.o: $(hdrdir)/ruby/internal/variable.h object_tracing.o: $(hdrdir)/ruby/internal/warning_push.h object_tracing.o: $(hdrdir)/ruby/internal/xmalloc.h object_tracing.o: $(hdrdir)/ruby/missing.h object_tracing.o: $(hdrdir)/ruby/ruby.h object_tracing.o: $(hdrdir)/ruby/st.h object_tracing.o: $(hdrdir)/ruby/subst.h @@ -178,6 +190,7 @@ object_tracing.o: $(top_srcdir)/method.h object_tracing.o: $(top_srcdir)/node.h object_tracing.o: $(top_srcdir)/ruby_assert.h object_tracing.o: $(top_srcdir)/ruby_atomic.h object_tracing.o: $(top_srcdir)/thread_pthread.h object_tracing.o: $(top_srcdir)/vm_core.h object_tracing.o: $(top_srcdir)/vm_opts.h @@ -365,11 +378,6 @@ objspace.o: $(top_srcdir)/ccan/container_of/container_of.h objspace.o: $(top_srcdir)/ccan/list/list.h objspace.o: $(top_srcdir)/ccan/str/str.h objspace.o: $(top_srcdir)/constant.h -objspace.o: $(hdrdir)/ruby/thread_native.h -objspace.o: $(top_srcdir)/ccan/check_type/check_type.h -objspace.o: $(top_srcdir)/ccan/container_of/container_of.h -objspace.o: $(top_srcdir)/ccan/list/list.h -objspace.o: $(top_srcdir)/ccan/str/str.h objspace.o: $(top_srcdir)/id_table.h objspace.o: $(top_srcdir)/internal.h objspace.o: $(top_srcdir)/internal/array.h @@ -389,6 +397,7 @@ objspace.o: $(top_srcdir)/method.h objspace.o: $(top_srcdir)/node.h objspace.o: $(top_srcdir)/ruby_assert.h objspace.o: $(top_srcdir)/ruby_atomic.h objspace.o: $(top_srcdir)/shape.h objspace.o: $(top_srcdir)/symbol.h objspace.o: $(top_srcdir)/thread_pthread.h @@ -597,6 +606,7 @@ objspace_dump.o: $(top_srcdir)/method.h objspace_dump.o: $(top_srcdir)/node.h objspace_dump.o: $(top_srcdir)/ruby_assert.h objspace_dump.o: $(top_srcdir)/ruby_atomic.h objspace_dump.o: $(top_srcdir)/shape.h objspace_dump.o: $(top_srcdir)/symbol.h objspace_dump.o: $(top_srcdir)/thread_pthread.h @@ -28,6 +28,10 @@ check: .eventids2-check $(Q) $(RUBY) $(GEN) --mode=check --ids1src=$(SRC1) --ids2src=$(SRC2) @exit > $@ eventids1.c: $(GEN) $(srcdir)/tools/dsl.rb $(SRC1) $(ECHO) generating $@ from $(SRC1) $(Q) $(RUBY) $(GEN) --mode=eventids1 --ids1src=$(SRC1) --output=$@ @@ -36,6 +40,10 @@ eventids2table.c: $(GEN) $(srcdir)/tools/dsl.rb $(SRC2) $(ECHO) generating $@ from $(SRC2) $(Q) $(RUBY) $(GEN) --mode=eventids2table --ids2src=$(SRC2) --output=$@ # Entries for Ripper maintainer preproc: ripper.E @@ -44,6 +52,342 @@ ripper.E: ripper.c $(Q) $(CC) -E $(INCFLAGS) $(CPPFLAGS) $< | $(RUBY) $(srcdir)/tools/strip.rb > $@ # AUTOGENERATED DEPENDENCIES START ripper.o: $(RUBY_EXTCONF_H) ripper.o: $(arch_hdrdir)/ruby/config.h ripper.o: $(hdrdir)/ruby.h @@ -246,6 +590,7 @@ ripper.o: $(top_srcdir)/internal/numeric.h ripper.o: $(top_srcdir)/internal/parse.h ripper.o: $(top_srcdir)/internal/rational.h ripper.o: $(top_srcdir)/internal/re.h ripper.o: $(top_srcdir)/internal/serial.h ripper.o: $(top_srcdir)/internal/static_assert.h ripper.o: $(top_srcdir)/internal/string.h @@ -256,17 +601,22 @@ ripper.o: $(top_srcdir)/internal/vm.h ripper.o: $(top_srcdir)/internal/warnings.h ripper.o: $(top_srcdir)/method.h ripper.o: $(top_srcdir)/node.h ripper.o: $(top_srcdir)/regenc.h ripper.o: $(top_srcdir)/ruby_assert.h ripper.o: $(top_srcdir)/ruby_atomic.h ripper.o: $(top_srcdir)/shape.h ripper.o: $(top_srcdir)/symbol.h ripper.o: $(top_srcdir)/thread_pthread.h ripper.o: $(top_srcdir)/vm_core.h ripper.o: $(top_srcdir)/vm_opts.h ripper.o: ../../probes.h ripper.o: eventids2.c ripper.o: ripper.y ripper.o: {$(VPATH)}eventids1.c ripper.o: {$(VPATH)}eventids2table.c ripper.o: {$(VPATH)}id.h @@ -274,4 +624,186 @@ ripper.o: {$(VPATH)}lex.c ripper.o: {$(VPATH)}parse.h ripper.o: {$(VPATH)}probes.dmyh ripper.o: {$(VPATH)}ripper.c # AUTOGENERATED DEPENDENCIES END @@ -1,3 +1,11 @@ typedef struct { ID ripper_id_backref; ID ripper_id_backtick; @@ -57,7 +65,7 @@ static ripper_scanner_ids_t ripper_scanner_ids; #include "eventids2table.c" -static void ripper_init_eventids2(void) { #define set_id2(name) ripper_scanner_ids.ripper_id_##name = rb_intern_const("on_"#name) @@ -118,7 +126,7 @@ ripper_init_eventids2(void) STATIC_ASSERT(k__END___range, k__END__ < SHRT_MAX); STATIC_ASSERT(ripper_scanner_ids_size, sizeof(ripper_scanner_ids) < SHRT_MAX); -static ID ripper_token2eventid(enum yytokentype tok) { #define O(member) (int)offsetof(ripper_scanner_ids_t, ripper_id_##member)+1 @@ -0,0 +1,8 @@ @@ -5,8 +5,8 @@ require 'mkmf' require 'rbconfig' def main - $objs = %w(ripper.o) - $distcleanfiles.concat %w(ripper.y ripper.c eventids1.c eventids2table.c) $cleanfiles.concat %w(ripper.E ripper.output y.output .eventids2-check) $defs << '-DRIPPER' $defs << '-DRIPPER_DEBUG' if $debug @@ -0,0 +1,650 @@ @@ -0,0 +1,8 @@ @@ -11,7 +11,7 @@ def main parser = @parser = OptionParser.new parser.banner = "Usage: #{File.basename($0)} --mode=MODE [--ids1src=PATH] [--ids2src=PATH] [--output=PATH]" - parser.on('--mode=MODE', 'check, eventids1, or eventids2table.') {|m| mode = m } parser.on('--ids1src=PATH', 'A source file of event-IDs 1 (parse.y).') {|path| @@ -45,6 +45,9 @@ def main abort "event crash: #{common.join(' ')}" end exit 0 when 'eventids1' usage 'no --ids1src' unless ids1src result = generate_eventids1(read_ids1(ids1src)) @@ -67,19 +70,35 @@ def usage(msg) exit false end -def generate_eventids1(ids) buf = "".dup - buf << %Q[static struct {\n] ids.each do |id, arity| buf << %Q[ ID id_#{id};\n] end - buf << %Q[} ripper_parser_ids;\n] buf << %Q[\n] ids.each do |id, arity| buf << %Q[#define ripper_id_#{id} ripper_parser_ids.id_#{id}\n] end buf << %Q[\n] - buf << %Q[static void\n] buf << %Q[ripper_init_eventids1(void)\n] buf << %Q[{\n] buf << %Q[#define set_id1(name) ripper_id_##name = rb_intern_const("on_"#name)\n] @@ -88,7 +107,9 @@ def generate_eventids1(ids) end buf << %Q[}\n] buf << %Q[\n] - buf << %Q[static void\n] buf << %Q[ripper_init_eventids1_table(VALUE self)\n] buf << %Q[{\n] buf << %Q[ VALUE h = rb_hash_new();\n] @@ -102,7 +123,11 @@ end def generate_eventids2_table(ids) buf = "".dup - buf << %Q[static void\n] buf << %Q[ripper_init_eventids2_table(VALUE self)\n] buf << %Q[{\n] buf << %Q[ VALUE h = rb_hash_new();\n] @@ -5,11 +5,15 @@ require 'optparse' def main output = nil parser = OptionParser.new - parser.banner = "Usage: #{File.basename($0)} [--output=PATH] <parse.y>" parser.on('--output=PATH', 'An output file.') {|path| output = path } parser.on('--help', 'Prints this message and quit.') { puts parser.help exit true @@ -25,13 +29,13 @@ def main unless ARGV.size == 2 abort "wrong number of arguments (#{ARGV.size} for 2)" end - process STDIN, out, ARGV[1] else unless ARGV.size == 1 abort "wrong number of arguments (#{ARGV.size} for 1)" end File.open(ARGV[0]) {|f| - process f, out, ARGV[0] } end if output @@ -41,10 +45,10 @@ def main end end -def process(f, out, path) prelude f, out grammar f, out - usercode f, out, path end def prelude(f, out) @@ -103,12 +107,25 @@ def grammar(f, out) end end -def usercode(f, out, path) require 'erb' compiler = ERB::Compiler.new('%-') compiler.put_cmd = compiler.insert_cmd = "out.<<" - lineno = f.lineno - src, = compiler.compile(f.read) eval(src, binding, path, lineno) end @@ -208,6 +208,7 @@ ancdata.o: $(top_srcdir)/method.h ancdata.o: $(top_srcdir)/node.h ancdata.o: $(top_srcdir)/ruby_assert.h ancdata.o: $(top_srcdir)/ruby_atomic.h ancdata.o: $(top_srcdir)/shape.h ancdata.o: $(top_srcdir)/thread_pthread.h ancdata.o: $(top_srcdir)/vm_core.h @@ -415,6 +416,7 @@ basicsocket.o: $(top_srcdir)/method.h basicsocket.o: $(top_srcdir)/node.h basicsocket.o: $(top_srcdir)/ruby_assert.h basicsocket.o: $(top_srcdir)/ruby_atomic.h basicsocket.o: $(top_srcdir)/shape.h basicsocket.o: $(top_srcdir)/thread_pthread.h basicsocket.o: $(top_srcdir)/vm_core.h @@ -622,6 +624,7 @@ constants.o: $(top_srcdir)/method.h constants.o: $(top_srcdir)/node.h constants.o: $(top_srcdir)/ruby_assert.h constants.o: $(top_srcdir)/ruby_atomic.h constants.o: $(top_srcdir)/shape.h constants.o: $(top_srcdir)/thread_pthread.h constants.o: $(top_srcdir)/vm_core.h @@ -830,6 +833,7 @@ ifaddr.o: $(top_srcdir)/method.h ifaddr.o: $(top_srcdir)/node.h ifaddr.o: $(top_srcdir)/ruby_assert.h ifaddr.o: $(top_srcdir)/ruby_atomic.h ifaddr.o: $(top_srcdir)/shape.h ifaddr.o: $(top_srcdir)/thread_pthread.h ifaddr.o: $(top_srcdir)/vm_core.h @@ -1037,6 +1041,7 @@ init.o: $(top_srcdir)/method.h init.o: $(top_srcdir)/node.h init.o: $(top_srcdir)/ruby_assert.h init.o: $(top_srcdir)/ruby_atomic.h init.o: $(top_srcdir)/shape.h init.o: $(top_srcdir)/thread_pthread.h init.o: $(top_srcdir)/vm_core.h @@ -1244,6 +1249,7 @@ ipsocket.o: $(top_srcdir)/method.h ipsocket.o: $(top_srcdir)/node.h ipsocket.o: $(top_srcdir)/ruby_assert.h ipsocket.o: $(top_srcdir)/ruby_atomic.h ipsocket.o: $(top_srcdir)/shape.h ipsocket.o: $(top_srcdir)/thread_pthread.h ipsocket.o: $(top_srcdir)/vm_core.h @@ -1451,6 +1457,7 @@ option.o: $(top_srcdir)/method.h option.o: $(top_srcdir)/node.h option.o: $(top_srcdir)/ruby_assert.h option.o: $(top_srcdir)/ruby_atomic.h option.o: $(top_srcdir)/shape.h option.o: $(top_srcdir)/thread_pthread.h option.o: $(top_srcdir)/vm_core.h @@ -1658,6 +1665,7 @@ raddrinfo.o: $(top_srcdir)/method.h raddrinfo.o: $(top_srcdir)/node.h raddrinfo.o: $(top_srcdir)/ruby_assert.h raddrinfo.o: $(top_srcdir)/ruby_atomic.h raddrinfo.o: $(top_srcdir)/shape.h raddrinfo.o: $(top_srcdir)/thread_pthread.h raddrinfo.o: $(top_srcdir)/vm_core.h @@ -1865,6 +1873,7 @@ socket.o: $(top_srcdir)/method.h socket.o: $(top_srcdir)/node.h socket.o: $(top_srcdir)/ruby_assert.h socket.o: $(top_srcdir)/ruby_atomic.h socket.o: $(top_srcdir)/shape.h socket.o: $(top_srcdir)/thread_pthread.h socket.o: $(top_srcdir)/vm_core.h @@ -2072,6 +2081,7 @@ sockssocket.o: $(top_srcdir)/method.h sockssocket.o: $(top_srcdir)/node.h sockssocket.o: $(top_srcdir)/ruby_assert.h sockssocket.o: $(top_srcdir)/ruby_atomic.h sockssocket.o: $(top_srcdir)/shape.h sockssocket.o: $(top_srcdir)/thread_pthread.h sockssocket.o: $(top_srcdir)/vm_core.h @@ -2279,6 +2289,7 @@ tcpserver.o: $(top_srcdir)/method.h tcpserver.o: $(top_srcdir)/node.h tcpserver.o: $(top_srcdir)/ruby_assert.h tcpserver.o: $(top_srcdir)/ruby_atomic.h tcpserver.o: $(top_srcdir)/shape.h tcpserver.o: $(top_srcdir)/thread_pthread.h tcpserver.o: $(top_srcdir)/vm_core.h @@ -2486,6 +2497,7 @@ tcpsocket.o: $(top_srcdir)/method.h tcpsocket.o: $(top_srcdir)/node.h tcpsocket.o: $(top_srcdir)/ruby_assert.h tcpsocket.o: $(top_srcdir)/ruby_atomic.h tcpsocket.o: $(top_srcdir)/shape.h tcpsocket.o: $(top_srcdir)/thread_pthread.h tcpsocket.o: $(top_srcdir)/vm_core.h @@ -2693,6 +2705,7 @@ udpsocket.o: $(top_srcdir)/method.h udpsocket.o: $(top_srcdir)/node.h udpsocket.o: $(top_srcdir)/ruby_assert.h udpsocket.o: $(top_srcdir)/ruby_atomic.h udpsocket.o: $(top_srcdir)/shape.h udpsocket.o: $(top_srcdir)/thread_pthread.h udpsocket.o: $(top_srcdir)/vm_core.h @@ -2900,6 +2913,7 @@ unixserver.o: $(top_srcdir)/method.h unixserver.o: $(top_srcdir)/node.h unixserver.o: $(top_srcdir)/ruby_assert.h unixserver.o: $(top_srcdir)/ruby_atomic.h unixserver.o: $(top_srcdir)/shape.h unixserver.o: $(top_srcdir)/thread_pthread.h unixserver.o: $(top_srcdir)/vm_core.h @@ -3107,6 +3121,7 @@ unixsocket.o: $(top_srcdir)/method.h unixsocket.o: $(top_srcdir)/node.h unixsocket.o: $(top_srcdir)/ruby_assert.h unixsocket.o: $(top_srcdir)/ruby_atomic.h unixsocket.o: $(top_srcdir)/shape.h unixsocket.o: $(top_srcdir)/thread_pthread.h unixsocket.o: $(top_srcdir)/vm_core.h @@ -302,6 +302,12 @@ ruby_sized_xfree_inlined(void *ptr, size_t size) # define SIZED_REALLOC_N(x, y, z, w) REALLOC_N(x, y, z) #else static inline void * @@ -325,6 +331,12 @@ ruby_sized_xfree_inlined(void *ptr, size_t size) # define SIZED_REALLOC_N(v, T, m, n) \ ((v) = (T *)ruby_sized_xrealloc2((void *)(v), (m), sizeof(T), (n))) #endif /* HAVE_MALLOC_USABLE_SIZE */ #define ruby_sized_xrealloc ruby_sized_xrealloc_inlined @@ -8,18 +8,121 @@ * file COPYING are met. Consult the file for details. * @brief Internal header for the parser. */ -#include "ruby/ruby.h" /* for VALUE */ struct rb_iseq_struct; /* in vm_core.h */ /* parse.y */ -VALUE rb_parser_set_yydebug(VALUE, VALUE); -void *rb_parser_load_file(VALUE parser, VALUE name); -void rb_parser_keep_script_lines(VALUE vparser); -void rb_parser_error_tolerant(VALUE vparser); -void rb_parser_keep_tokens(VALUE vparser); - -RUBY_SYMBOL_EXPORT_BEGIN -VALUE rb_parser_set_context(VALUE, const struct rb_iseq_struct *, int); -RUBY_SYMBOL_EXPORT_END #endif /* INTERNAL_PARSE_H */ @@ -0,0 +1,68 @@ @@ -28,7 +28,7 @@ #include "internal/file.h" #include "internal/gc.h" #include "internal/hash.h" -#include "internal/parse.h" #include "internal/sanitizers.h" #include "internal/symbol.h" #include "internal/thread.h" @@ -9,7 +9,7 @@ #include "internal/error.h" #include "internal/file.h" #include "internal/load.h" -#include "internal/parse.h" #include "internal/thread.h" #include "internal/variable.h" #include "iseq.h" @@ -9,1119 +9,40 @@ **********************************************************************/ #include "internal.h" #include "internal/hash.h" #include "internal/variable.h" #include "ruby/ruby.h" #include "vm_core.h" -#define NODE_BUF_DEFAULT_LEN 16 - -#define A(str) rb_str_cat2(buf, (str)) -#define AR(str) rb_str_concat(buf, (str)) - -#define A_INDENT add_indent(buf, indent) -#define D_INDENT rb_str_cat2(indent, next_indent) -#define D_DEDENT rb_str_resize(indent, RSTRING_LEN(indent) - 4) -#define A_ID(id) add_id(buf, (id)) -#define A_INT(val) rb_str_catf(buf, "%d", (val)) -#define A_LONG(val) rb_str_catf(buf, "%ld", (val)) -#define A_LIT(lit) AR(rb_dump_literal(lit)) -#define A_NODE_HEADER(node, term) \ - rb_str_catf(buf, "@ %s (id: %d, line: %d, location: (%d,%d)-(%d,%d))%s"term, \ - ruby_node_name(nd_type(node)), nd_node_id(node), nd_line(node), \ - nd_first_lineno(node), nd_first_column(node), \ - nd_last_lineno(node), nd_last_column(node), \ - (node->flags & NODE_FL_NEWLINE ? "*" : "")) -#define A_FIELD_HEADER(len, name, term) \ - rb_str_catf(buf, "+- %.*s:"term, (len), (name)) -#define D_FIELD_HEADER(len, name, term) (A_INDENT, A_FIELD_HEADER(len, name, term)) - -#define D_NULL_NODE (A_INDENT, A("(null node)\n")) -#define D_NODE_HEADER(node) (A_INDENT, A_NODE_HEADER(node, "\n")) - -#define COMPOUND_FIELD(len, name) \ - FIELD_BLOCK((D_FIELD_HEADER((len), (name), "\n"), D_INDENT), D_DEDENT) - -#define COMPOUND_FIELD1(name, ann) \ - COMPOUND_FIELD(FIELD_NAME_LEN(name, ann), \ - FIELD_NAME_DESC(name, ann)) - -#define FIELD_NAME_DESC(name, ann) name " (" ann ")" -#define FIELD_NAME_LEN(name, ann) (int)( \ - comment ? \ - rb_strlen_lit(FIELD_NAME_DESC(name, ann)) : \ - rb_strlen_lit(name)) -#define SIMPLE_FIELD(len, name) \ - FIELD_BLOCK(D_FIELD_HEADER((len), (name), " "), A("\n")) - -#define FIELD_BLOCK(init, reset) \ - for (init, field_flag = 1; \ - field_flag; /* should be optimized away */ \ - reset, field_flag = 0) - -#define SIMPLE_FIELD1(name, ann) SIMPLE_FIELD(FIELD_NAME_LEN(name, ann), FIELD_NAME_DESC(name, ann)) -#define F_CUSTOM1(name, ann) SIMPLE_FIELD1(#name, ann) -#define F_ID(name, ann) SIMPLE_FIELD1(#name, ann) A_ID(node->name) -#define F_GENTRY(name, ann) SIMPLE_FIELD1(#name, ann) A_ID(node->name) -#define F_INT(name, ann) SIMPLE_FIELD1(#name, ann) A_INT(node->name) -#define F_LONG(name, ann) SIMPLE_FIELD1(#name, ann) A_LONG(node->name) -#define F_LIT(name, ann) SIMPLE_FIELD1(#name, ann) A_LIT(node->name) -#define F_MSG(name, ann, desc) SIMPLE_FIELD1(#name, ann) A(desc) - -#define F_NODE(name, ann) \ - COMPOUND_FIELD1(#name, ann) {dump_node(buf, indent, comment, node->name);} - -#define ANN(ann) \ - if (comment) { \ - A_INDENT; A("| # " ann "\n"); \ - } - -#define LAST_NODE (next_indent = " ") - -VALUE -rb_dump_literal(VALUE lit) -{ - if (!RB_SPECIAL_CONST_P(lit)) { - VALUE str; - switch (RB_BUILTIN_TYPE(lit)) { - case T_CLASS: case T_MODULE: case T_ICLASS: - str = rb_class_path(lit); - if (FL_TEST(lit, FL_SINGLETON)) { - str = rb_sprintf("<%"PRIsVALUE">", str); - } - return str; - default: - break; - } - } - return rb_inspect(lit); -} - -static void -add_indent(VALUE buf, VALUE indent) -{ - AR(indent); -} - -static void -add_id(VALUE buf, ID id) -{ - if (id == 0) { - A("(null)"); - } - else { - VALUE str = rb_id2str(id); - if (str) { - A(":"); AR(str); - } - else { - rb_str_catf(buf, "(internal variable: 0x%"PRIsVALUE")", id); - } - } -} - -struct add_option_arg { - VALUE buf, indent; - st_index_t count; -}; - -static void dump_node(VALUE, VALUE, int, const NODE *); -static const char default_indent[] = "| "; - -static void -dump_array(VALUE buf, VALUE indent, int comment, const NODE *node) -{ - int field_flag; - const char *next_indent = default_indent; - F_LONG(nd_alen, "length"); - F_NODE(nd_head, "element"); - while (node->nd_next && nd_type_p(node->nd_next, NODE_LIST)) { - node = node->nd_next; - F_NODE(nd_head, "element"); - } - LAST_NODE; - F_NODE(nd_next, "next element"); -} - -static void -dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) -{ - int field_flag; - int i; - const char *next_indent = default_indent; - enum node_type type; - - if (!node) { - D_NULL_NODE; - return; - } - - D_NODE_HEADER(node); - - type = nd_type(node); - switch (type) { - case NODE_BLOCK: - ANN("statement sequence"); - ANN("format: [nd_head]; ...; [nd_next]"); - ANN("example: foo; bar"); - i = 0; - do { - A_INDENT; - rb_str_catf(buf, "+- nd_head (%s%d):\n", - comment ? "statement #" : "", ++i); - if (!node->nd_next) LAST_NODE; - D_INDENT; - dump_node(buf, indent, comment, node->nd_head); - D_DEDENT; - } while (node->nd_next && - nd_type_p(node->nd_next, NODE_BLOCK) && - (node = node->nd_next, 1)); - if (node->nd_next) { - LAST_NODE; - F_NODE(nd_next, "next block"); - } - return; - - case NODE_IF: - ANN("if statement"); - ANN("format: if [nd_cond] then [nd_body] else [nd_else] end"); - ANN("example: if x == 1 then foo else bar end"); - F_NODE(nd_cond, "condition expr"); - F_NODE(nd_body, "then clause"); - LAST_NODE; - F_NODE(nd_else, "else clause"); - return; - - case NODE_UNLESS: - ANN("unless statement"); - ANN("format: unless [nd_cond] then [nd_body] else [nd_else] end"); - ANN("example: unless x == 1 then foo else bar end"); - F_NODE(nd_cond, "condition expr"); - F_NODE(nd_body, "then clause"); - LAST_NODE; - F_NODE(nd_else, "else clause"); - return; - - case NODE_CASE: - ANN("case statement"); - ANN("format: case [nd_head]; [nd_body]; end"); - ANN("example: case x; when 1; foo; when 2; bar; else baz; end"); - F_NODE(nd_head, "case expr"); - LAST_NODE; - F_NODE(nd_body, "when clauses"); - return; - case NODE_CASE2: - ANN("case statement with no head"); - ANN("format: case; [nd_body]; end"); - ANN("example: case; when 1; foo; when 2; bar; else baz; end"); - F_NODE(nd_head, "case expr"); - LAST_NODE; - F_NODE(nd_body, "when clauses"); - return; - case NODE_CASE3: - ANN("case statement (pattern matching)"); - ANN("format: case [nd_head]; [nd_body]; end"); - ANN("example: case x; in 1; foo; in 2; bar; else baz; end"); - F_NODE(nd_head, "case expr"); - LAST_NODE; - F_NODE(nd_body, "in clauses"); - return; - - case NODE_WHEN: - ANN("when clause"); - ANN("format: when [nd_head]; [nd_body]; (when or else) [nd_next]"); - ANN("example: case x; when 1; foo; when 2; bar; else baz; end"); - F_NODE(nd_head, "when value"); - F_NODE(nd_body, "when body"); - LAST_NODE; - F_NODE(nd_next, "next when clause"); - return; - - case NODE_IN: - ANN("in clause"); - ANN("format: in [nd_head]; [nd_body]; (in or else) [nd_next]"); - ANN("example: case x; in 1; foo; in 2; bar; else baz; end"); - F_NODE(nd_head, "in pattern"); - F_NODE(nd_body, "in body"); - LAST_NODE; - F_NODE(nd_next, "next in clause"); - return; - - case NODE_WHILE: - ANN("while statement"); - ANN("format: while [nd_cond]; [nd_body]; end"); - ANN("example: while x == 1; foo; end"); - goto loop; - case NODE_UNTIL: - ANN("until statement"); - ANN("format: until [nd_cond]; [nd_body]; end"); - ANN("example: until x == 1; foo; end"); - loop: - F_CUSTOM1(nd_state, "begin-end-while?") { - A_INT((int)node->nd_state); - A((node->nd_state == 1) ? " (while-end)" : " (begin-end-while)"); - } - F_NODE(nd_cond, "condition"); - LAST_NODE; - F_NODE(nd_body, "body"); - return; - - case NODE_ITER: - ANN("method call with block"); - ANN("format: [nd_iter] { [nd_body] }"); - ANN("example: 3.times { foo }"); - goto iter; - case NODE_FOR: - ANN("for statement"); - ANN("format: for * in [nd_iter] do [nd_body] end"); - ANN("example: for i in 1..3 do foo end"); - iter: - F_NODE(nd_iter, "iteration receiver"); - LAST_NODE; - F_NODE(nd_body, "body"); - return; - - case NODE_FOR_MASGN: - ANN("vars of for statement with masgn"); - ANN("format: for [nd_var] in ... do ... end"); - ANN("example: for x, y in 1..3 do foo end"); - LAST_NODE; - F_NODE(nd_var, "var"); - return; - - case NODE_BREAK: - ANN("break statement"); - ANN("format: break [nd_stts]"); - ANN("example: break 1"); - goto jump; - case NODE_NEXT: - ANN("next statement"); - ANN("format: next [nd_stts]"); - ANN("example: next 1"); - goto jump; - case NODE_RETURN: - ANN("return statement"); - ANN("format: return [nd_stts]"); - ANN("example: return 1"); - jump: - LAST_NODE; - F_NODE(nd_stts, "value"); - return; - - case NODE_REDO: - ANN("redo statement"); - ANN("format: redo"); - ANN("example: redo"); - return; - - case NODE_RETRY: - ANN("retry statement"); - ANN("format: retry"); - ANN("example: retry"); - return; - - case NODE_BEGIN: - ANN("begin statement"); - ANN("format: begin; [nd_body]; end"); - ANN("example: begin; 1; end"); - LAST_NODE; - F_NODE(nd_body, "body"); - return; - - case NODE_RESCUE: - ANN("rescue clause"); - ANN("format: begin; [nd_body]; (rescue) [nd_resq]; else [nd_else]; end"); - ANN("example: begin; foo; rescue; bar; else; baz; end"); - F_NODE(nd_head, "body"); - F_NODE(nd_resq, "rescue clause list"); - LAST_NODE; - F_NODE(nd_else, "rescue else clause"); - return; - - case NODE_RESBODY: - ANN("rescue clause (cont'd)"); - ANN("format: rescue [nd_args]; [nd_body]; (rescue) [nd_head]"); - ANN("example: begin; foo; rescue; bar; else; baz; end"); - F_NODE(nd_args, "rescue exceptions"); - F_NODE(nd_body, "rescue clause"); - LAST_NODE; - F_NODE(nd_head, "next rescue clause"); - return; - - case NODE_ENSURE: - ANN("ensure clause"); - ANN("format: begin; [nd_head]; ensure; [nd_ensr]; end"); - ANN("example: begin; foo; ensure; bar; end"); - F_NODE(nd_head, "body"); - LAST_NODE; - F_NODE(nd_ensr, "ensure clause"); - return; - - case NODE_AND: - ANN("&& operator"); - ANN("format: [nd_1st] && [nd_2nd]"); - ANN("example: foo && bar"); - goto andor; - case NODE_OR: - ANN("|| operator"); - ANN("format: [nd_1st] || [nd_2nd]"); - ANN("example: foo || bar"); - andor: - while (1) { - F_NODE(nd_1st, "left expr"); - if (!node->nd_2nd || !nd_type_p(node->nd_2nd, type)) - break; - node = node->nd_2nd; - } - LAST_NODE; - F_NODE(nd_2nd, "right expr"); - return; - - case NODE_MASGN: - ANN("multiple assignment"); - ANN("format: [nd_head], [nd_args] = [nd_value]"); - ANN("example: a, b = foo"); - F_NODE(nd_value, "rhsn"); - F_NODE(nd_head, "lhsn"); - if (NODE_NAMED_REST_P(node->nd_args)) { - LAST_NODE; - F_NODE(nd_args, "splatn"); - } - else { - F_MSG(nd_args, "splatn", "NODE_SPECIAL_NO_NAME_REST (rest argument without name)"); - } - return; - - case NODE_LASGN: - ANN("local variable assignment"); - ANN("format: [nd_vid](lvar) = [nd_value]"); - ANN("example: x = foo"); - F_ID(nd_vid, "local variable"); - if (NODE_REQUIRED_KEYWORD_P(node)) { - F_MSG(nd_value, "rvalue", "NODE_SPECIAL_REQUIRED_KEYWORD (required keyword argument)"); - } - else { - LAST_NODE; - F_NODE(nd_value, "rvalue"); - } - return; - case NODE_DASGN: - ANN("dynamic variable assignment"); - ANN("format: [nd_vid](dvar) = [nd_value]"); - ANN("example: x = nil; 1.times { x = foo }"); - ANN("example: 1.times { x = foo }"); - F_ID(nd_vid, "local variable"); - if (NODE_REQUIRED_KEYWORD_P(node)) { - F_MSG(nd_value, "rvalue", "NODE_SPECIAL_REQUIRED_KEYWORD (required keyword argument)"); - } - else { - LAST_NODE; - F_NODE(nd_value, "rvalue"); - } - return; - case NODE_IASGN: - ANN("instance variable assignment"); - ANN("format: [nd_vid](ivar) = [nd_value]"); - ANN("example: @x = foo"); - F_ID(nd_vid, "instance variable"); - LAST_NODE; - F_NODE(nd_value, "rvalue"); - return; - case NODE_CVASGN: - ANN("class variable assignment"); - ANN("format: [nd_vid](cvar) = [nd_value]"); - ANN("example: @@x = foo"); - F_ID(nd_vid, "class variable"); - LAST_NODE; - F_NODE(nd_value, "rvalue"); - return; - case NODE_GASGN: - ANN("global variable assignment"); - ANN("format: [nd_entry](gvar) = [nd_value]"); - ANN("example: $x = foo"); - F_GENTRY(nd_entry, "global variable"); - LAST_NODE; - F_NODE(nd_value, "rvalue"); - return; - - case NODE_CDECL: - ANN("constant declaration"); - ANN("format: [nd_else]::[nd_vid](constant) = [nd_value]"); - ANN("example: X = foo"); - if (node->nd_vid) { - F_ID(nd_vid, "constant"); - F_MSG(nd_else, "extension", "not used"); - } - else { - F_MSG(nd_vid, "constant", "0 (see extension field)"); - F_NODE(nd_else, "extension"); - } - LAST_NODE; - F_NODE(nd_value, "rvalue"); - return; - - case NODE_OP_ASGN1: - ANN("array assignment with operator"); - ANN("format: [nd_recv] [ [nd_args->nd_head] ] [nd_mid]= [nd_args->nd_body]"); - ANN("example: ary[1] += foo"); - F_NODE(nd_recv, "receiver"); - F_ID(nd_mid, "operator"); - F_NODE(nd_args->nd_head, "index"); - LAST_NODE; - F_NODE(nd_args->nd_body, "rvalue"); - return; - - case NODE_OP_ASGN2: - ANN("attr assignment with operator"); - ANN("format: [nd_recv].[attr] [nd_next->nd_mid]= [nd_value]"); - ANN(" where [attr]: [nd_next->nd_vid]"); - ANN("example: struct.field += foo"); - F_NODE(nd_recv, "receiver"); - F_CUSTOM1(nd_next->nd_vid, "attr") { - if (node->nd_next->nd_aid) A("? "); - A_ID(node->nd_next->nd_vid); - } - F_ID(nd_next->nd_mid, "operator"); - LAST_NODE; - F_NODE(nd_value, "rvalue"); - return; - - case NODE_OP_ASGN_AND: - ANN("assignment with && operator"); - ANN("format: [nd_head] &&= [nd_value]"); - ANN("example: foo &&= bar"); - goto asgn_andor; - case NODE_OP_ASGN_OR: - ANN("assignment with || operator"); - ANN("format: [nd_head] ||= [nd_value]"); - ANN("example: foo ||= bar"); - asgn_andor: - F_NODE(nd_head, "variable"); - LAST_NODE; - F_NODE(nd_value, "rvalue"); - return; - - case NODE_OP_CDECL: - ANN("constant declaration with operator"); - ANN("format: [nd_head](constant) [nd_aid]= [nd_value]"); - ANN("example: A::B ||= 1"); - F_NODE(nd_head, "constant"); - F_ID(nd_aid, "operator"); - LAST_NODE; - F_NODE(nd_value, "rvalue"); - return; - - case NODE_CALL: - ANN("method invocation"); - ANN("format: [nd_recv].[nd_mid]([nd_args])"); - ANN("example: obj.foo(1)"); - F_ID(nd_mid, "method id"); - F_NODE(nd_recv, "receiver"); - LAST_NODE; - F_NODE(nd_args, "arguments"); - return; - - case NODE_OPCALL: - ANN("method invocation"); - ANN("format: [nd_recv] [nd_mid] [nd_args]"); - ANN("example: foo + bar"); - F_ID(nd_mid, "method id"); - F_NODE(nd_recv, "receiver"); - LAST_NODE; - F_NODE(nd_args, "arguments"); - return; - - case NODE_FCALL: - ANN("function call"); - ANN("format: [nd_mid]([nd_args])"); - ANN("example: foo(1)"); - F_ID(nd_mid, "method id"); - LAST_NODE; - F_NODE(nd_args, "arguments"); - return; - - case NODE_VCALL: - ANN("function call with no argument"); - ANN("format: [nd_mid]"); - ANN("example: foo"); - F_ID(nd_mid, "method id"); - return; - - case NODE_QCALL: - ANN("safe method invocation"); - ANN("format: [nd_recv]&.[nd_mid]([nd_args])"); - ANN("example: obj&.foo(1)"); - F_ID(nd_mid, "method id"); - F_NODE(nd_recv, "receiver"); - LAST_NODE; - F_NODE(nd_args, "arguments"); - return; - - case NODE_SUPER: - ANN("super invocation"); - ANN("format: super [nd_args]"); - ANN("example: super 1"); - LAST_NODE; - F_NODE(nd_args, "arguments"); - return; - - case NODE_ZSUPER: - ANN("super invocation with no argument"); - ANN("format: super"); - ANN("example: super"); - return; - - case NODE_LIST: - ANN("list constructor"); - ANN("format: [ [nd_head], [nd_next].. ] (length: [nd_alen])"); - ANN("example: [1, 2, 3]"); - goto ary; - case NODE_VALUES: - ANN("return arguments"); - ANN("format: [ [nd_head], [nd_next].. ] (length: [nd_alen])"); - ANN("example: return 1, 2, 3"); - ary: - dump_array(buf, indent, comment, node); - return; - - case NODE_ZLIST: - ANN("empty list constructor"); - ANN("format: []"); - ANN("example: []"); - return; - - case NODE_HASH: - if (!node->nd_brace) { - ANN("keyword arguments"); - ANN("format: nd_head"); - ANN("example: a: 1, b: 2"); - } - else { - ANN("hash constructor"); - ANN("format: { [nd_head] }"); - ANN("example: { 1 => 2, 3 => 4 }"); - } - F_CUSTOM1(nd_brace, "keyword arguments or hash literal") { - switch (node->nd_brace) { - case 0: A("0 (keyword argument)"); break; - case 1: A("1 (hash literal)"); break; - } - } - LAST_NODE; - F_NODE(nd_head, "contents"); - return; - - case NODE_YIELD: - ANN("yield invocation"); - ANN("format: yield [nd_head]"); - ANN("example: yield 1"); - LAST_NODE; - F_NODE(nd_head, "arguments"); - return; - - case NODE_LVAR: - ANN("local variable reference"); - ANN("format: [nd_vid](lvar)"); - ANN("example: x"); - F_ID(nd_vid, "local variable"); - return; - case NODE_DVAR: - ANN("dynamic variable reference"); - ANN("format: [nd_vid](dvar)"); - ANN("example: 1.times { x = 1; x }"); - F_ID(nd_vid, "local variable"); - return; - case NODE_IVAR: - ANN("instance variable reference"); - ANN("format: [nd_vid](ivar)"); - ANN("example: @x"); - F_ID(nd_vid, "instance variable"); - return; - case NODE_CONST: - ANN("constant reference"); - ANN("format: [nd_vid](constant)"); - ANN("example: X"); - F_ID(nd_vid, "constant"); - return; - case NODE_CVAR: - ANN("class variable reference"); - ANN("format: [nd_vid](cvar)"); - ANN("example: @@x"); - F_ID(nd_vid, "class variable"); - return; - - case NODE_GVAR: - ANN("global variable reference"); - ANN("format: [nd_entry](gvar)"); - ANN("example: $x"); - F_GENTRY(nd_entry, "global variable"); - return; - - case NODE_NTH_REF: - ANN("nth special variable reference"); - ANN("format: $[nd_nth]"); - ANN("example: $1, $2, .."); - F_CUSTOM1(nd_nth, "variable") { A("$"); A_LONG(node->nd_nth); } - return; - - case NODE_BACK_REF: - ANN("back special variable reference"); - ANN("format: $[nd_nth]"); - ANN("example: $&, $`, $', $+"); - F_CUSTOM1(nd_nth, "variable") { - char name[3] = "$ "; - name[1] = (char)node->nd_nth; - A(name); - } - return; - - case NODE_MATCH: - ANN("match expression (against $_ implicitly)"); - ANN("format: [nd_lit] (in condition)"); - ANN("example: if /foo/; foo; end"); - F_LIT(nd_lit, "regexp"); - return; - - case NODE_MATCH2: - ANN("match expression (regexp first)"); - ANN("format: [nd_recv] =~ [nd_value]"); - ANN("example: /foo/ =~ 'foo'"); - F_NODE(nd_recv, "regexp (receiver)"); - if (!node->nd_args) LAST_NODE; - F_NODE(nd_value, "string (argument)"); - if (node->nd_args) { - LAST_NODE; - F_NODE(nd_args, "named captures"); - } - return; - case NODE_MATCH3: - ANN("match expression (regexp second)"); - ANN("format: [nd_recv] =~ [nd_value]"); - ANN("example: 'foo' =~ /foo/"); - F_NODE(nd_recv, "string (receiver)"); - LAST_NODE; - F_NODE(nd_value, "regexp (argument)"); - return; - - case NODE_LIT: - ANN("literal"); - ANN("format: [nd_lit]"); - ANN("example: 1, /foo/"); - goto lit; - case NODE_STR: - ANN("string literal"); - ANN("format: [nd_lit]"); - ANN("example: 'foo'"); - goto lit; - case NODE_XSTR: - ANN("xstring literal"); - ANN("format: [nd_lit]"); - ANN("example: `foo`"); - lit: - F_LIT(nd_lit, "literal"); - return; - - case NODE_ONCE: - ANN("once evaluation"); - ANN("format: [nd_body]"); - ANN("example: /foo#{ bar }baz/o"); - LAST_NODE; - F_NODE(nd_body, "body"); - return; - case NODE_DSTR: - ANN("string literal with interpolation"); - ANN("format: [nd_lit]"); - ANN("example: \"foo#{ bar }baz\""); - goto dlit; - case NODE_DXSTR: - ANN("xstring literal with interpolation"); - ANN("format: [nd_lit]"); - ANN("example: `foo#{ bar }baz`"); - goto dlit; - case NODE_DREGX: - ANN("regexp literal with interpolation"); - ANN("format: [nd_lit]"); - ANN("example: /foo#{ bar }baz/"); - goto dlit; - case NODE_DSYM: - ANN("symbol literal with interpolation"); - ANN("format: [nd_lit]"); - ANN("example: :\"foo#{ bar }baz\""); - dlit: - F_LIT(nd_lit, "preceding string"); - if (!node->nd_next) return; - F_NODE(nd_next->nd_head, "interpolation"); - LAST_NODE; - F_NODE(nd_next->nd_next, "tailing strings"); - return; - - case NODE_EVSTR: - ANN("interpolation expression"); - ANN("format: \"..#{ [nd_lit] }..\""); - ANN("example: \"foo#{ bar }baz\""); - LAST_NODE; - F_NODE(nd_body, "body"); - return; - - case NODE_ARGSCAT: - ANN("splat argument following arguments"); - ANN("format: ..(*[nd_head], [nd_body..])"); - ANN("example: foo(*ary, post_arg1, post_arg2)"); - F_NODE(nd_head, "preceding array"); - LAST_NODE; - F_NODE(nd_body, "following array"); - return; - - case NODE_ARGSPUSH: - ANN("splat argument following one argument"); - ANN("format: ..(*[nd_head], [nd_body])"); - ANN("example: foo(*ary, post_arg)"); - F_NODE(nd_head, "preceding array"); - LAST_NODE; - F_NODE(nd_body, "following element"); - return; - - case NODE_SPLAT: - ANN("splat argument"); - ANN("format: *[nd_head]"); - ANN("example: foo(*ary)"); - LAST_NODE; - F_NODE(nd_head, "splat'ed array"); - return; - - case NODE_BLOCK_PASS: - ANN("arguments with block argument"); - ANN("format: ..([nd_head], &[nd_body])"); - ANN("example: foo(x, &blk)"); - F_NODE(nd_head, "other arguments"); - LAST_NODE; - F_NODE(nd_body, "block argument"); - return; - - case NODE_DEFN: - ANN("method definition"); - ANN("format: def [nd_mid] [nd_defn]; end"); - ANN("example: def foo; bar; end"); - F_ID(nd_mid, "method name"); - LAST_NODE; - F_NODE(nd_defn, "method definition"); - return; - - case NODE_DEFS: - ANN("singleton method definition"); - ANN("format: def [nd_recv].[nd_mid] [nd_defn]; end"); - ANN("example: def obj.foo; bar; end"); - F_NODE(nd_recv, "receiver"); - F_ID(nd_mid, "method name"); - LAST_NODE; - F_NODE(nd_defn, "method definition"); - return; - - case NODE_ALIAS: - ANN("method alias statement"); - ANN("format: alias [nd_1st] [nd_2nd]"); - ANN("example: alias bar foo"); - F_NODE(nd_1st, "new name"); - LAST_NODE; - F_NODE(nd_2nd, "old name"); - return; - - case NODE_VALIAS: - ANN("global variable alias statement"); - ANN("format: alias [nd_alias](gvar) [nd_orig](gvar)"); - ANN("example: alias $y $x"); - F_ID(nd_alias, "new name"); - F_ID(nd_orig, "old name"); - return; - - case NODE_UNDEF: - ANN("method undef statement"); - ANN("format: undef [nd_undef]"); - ANN("example: undef foo"); - LAST_NODE; - F_NODE(nd_undef, "old name"); - return; - - case NODE_CLASS: - ANN("class definition"); - ANN("format: class [nd_cpath] < [nd_super]; [nd_body]; end"); - ANN("example: class C2 < C; ..; end"); - F_NODE(nd_cpath, "class path"); - F_NODE(nd_super, "superclass"); - LAST_NODE; - F_NODE(nd_body, "class definition"); - return; - - case NODE_MODULE: - ANN("module definition"); - ANN("format: module [nd_cpath]; [nd_body]; end"); - ANN("example: module M; ..; end"); - F_NODE(nd_cpath, "module path"); - LAST_NODE; - F_NODE(nd_body, "module definition"); - return; - - case NODE_SCLASS: - ANN("singleton class definition"); - ANN("format: class << [nd_recv]; [nd_body]; end"); - ANN("example: class << obj; ..; end"); - F_NODE(nd_recv, "receiver"); - LAST_NODE; - F_NODE(nd_body, "singleton class definition"); - return; - - case NODE_COLON2: - ANN("scoped constant reference"); - ANN("format: [nd_head]::[nd_mid]"); - ANN("example: M::C"); - F_ID(nd_mid, "constant name"); - LAST_NODE; - F_NODE(nd_head, "receiver"); - return; - - case NODE_COLON3: - ANN("top-level constant reference"); - ANN("format: ::[nd_mid]"); - ANN("example: ::Object"); - F_ID(nd_mid, "constant name"); - return; - - case NODE_DOT2: - ANN("range constructor (incl.)"); - ANN("format: [nd_beg]..[nd_end]"); - ANN("example: 1..5"); - goto dot; - case NODE_DOT3: - ANN("range constructor (excl.)"); - ANN("format: [nd_beg]...[nd_end]"); - ANN("example: 1...5"); - goto dot; - case NODE_FLIP2: - ANN("flip-flop condition (incl.)"); - ANN("format: [nd_beg]..[nd_end]"); - ANN("example: if (x==1)..(x==5); foo; end"); - goto dot; - case NODE_FLIP3: - ANN("flip-flop condition (excl.)"); - ANN("format: [nd_beg]...[nd_end]"); - ANN("example: if (x==1)...(x==5); foo; end"); - dot: - F_NODE(nd_beg, "begin"); - LAST_NODE; - F_NODE(nd_end, "end"); - return; - - case NODE_SELF: - ANN("self"); - ANN("format: self"); - ANN("example: self"); - return; - - case NODE_NIL: - ANN("nil"); - ANN("format: nil"); - ANN("example: nil"); - return; - - case NODE_TRUE: - ANN("true"); - ANN("format: true"); - ANN("example: true"); - return; - - case NODE_FALSE: - ANN("false"); - ANN("format: false"); - ANN("example: false"); - return; - - case NODE_ERRINFO: - ANN("virtual reference to $!"); - ANN("format: rescue => id"); - ANN("example: rescue => id"); - return; - - case NODE_DEFINED: - ANN("defined? expression"); - ANN("format: defined?([nd_head])"); - ANN("example: defined?(foo)"); - F_NODE(nd_head, "expr"); - return; - - case NODE_POSTEXE: - ANN("post-execution"); - ANN("format: END { [nd_body] }"); - ANN("example: END { foo }"); - LAST_NODE; - F_NODE(nd_body, "END clause"); - return; - - case NODE_ATTRASGN: - ANN("attr assignment"); - ANN("format: [nd_recv].[nd_mid] = [nd_args]"); - ANN("example: struct.field = foo"); - F_NODE(nd_recv, "receiver"); - F_ID(nd_mid, "method name"); - LAST_NODE; - F_NODE(nd_args, "arguments"); - return; - - case NODE_LAMBDA: - ANN("lambda expression"); - ANN("format: -> [nd_body]"); - ANN("example: -> { foo }"); - LAST_NODE; - F_NODE(nd_body, "lambda clause"); - return; - - case NODE_OPT_ARG: - ANN("optional arguments"); - ANN("format: def method_name([nd_body=some], [nd_next..])"); - ANN("example: def foo(a, b=1, c); end"); - F_NODE(nd_body, "body"); - LAST_NODE; - F_NODE(nd_next, "next"); - return; - - case NODE_KW_ARG: - ANN("keyword arguments"); - ANN("format: def method_name([nd_body=some], [nd_next..])"); - ANN("example: def foo(a:1, b:2); end"); - F_NODE(nd_body, "body"); - LAST_NODE; - F_NODE(nd_next, "next"); - return; - - case NODE_POSTARG: - ANN("post arguments"); - ANN("format: *[nd_1st], [nd_2nd..] = .."); - ANN("example: a, *rest, z = foo"); - if (NODE_NAMED_REST_P(node->nd_1st)) { - F_NODE(nd_1st, "rest argument"); - } - else { - F_MSG(nd_1st, "rest argument", "NODE_SPECIAL_NO_NAME_REST (rest argument without name)"); - } - LAST_NODE; - F_NODE(nd_2nd, "post arguments"); - return; - - case NODE_ARGS: - ANN("method parameters"); - ANN("format: def method_name(.., [nd_ainfo->nd_optargs], *[nd_ainfo->rest_arg], [nd_ainfo->first_post_arg], .., [nd_ainfo->kw_args], **[nd_ainfo->kw_rest_arg], &[nd_ainfo->block_arg])"); - ANN("example: def foo(a, b, opt1=1, opt2=2, *rest, y, z, kw: 1, **kwrest, &blk); end"); - F_INT(nd_ainfo->pre_args_num, "count of mandatory (pre-)arguments"); - F_NODE(nd_ainfo->pre_init, "initialization of (pre-)arguments"); - F_INT(nd_ainfo->post_args_num, "count of mandatory post-arguments"); - F_NODE(nd_ainfo->post_init, "initialization of post-arguments"); - F_ID(nd_ainfo->first_post_arg, "first post argument"); - F_CUSTOM1(nd_ainfo->rest_arg, "rest argument") { - if (node->nd_ainfo->rest_arg == NODE_SPECIAL_EXCESSIVE_COMMA) { - A("1 (excessed comma)"); - } - else { - A_ID(node->nd_ainfo->rest_arg); - } - } - F_ID(nd_ainfo->block_arg, "block argument"); - F_NODE(nd_ainfo->opt_args, "optional arguments"); - F_NODE(nd_ainfo->kw_args, "keyword arguments"); - LAST_NODE; - F_NODE(nd_ainfo->kw_rest_arg, "keyword rest argument"); - return; - - case NODE_SCOPE: - ANN("new scope"); - ANN("format: [nd_tbl]: local table, [nd_args]: arguments, [nd_body]: body"); - F_CUSTOM1(nd_tbl, "local table") { - rb_ast_id_table_t *tbl = node->nd_tbl; - int i; - int size = tbl ? tbl->size : 0; - if (size == 0) A("(empty)"); - for (i = 0; i < size; i++) { - A_ID(tbl->ids[i]); if (i < size - 1) A(","); - } - } - F_NODE(nd_args, "arguments"); - LAST_NODE; - F_NODE(nd_body, "body"); - return; - - case NODE_ARYPTN: - ANN("array pattern"); - ANN("format: [nd_pconst]([pre_args], ..., *[rest_arg], [post_args], ...)"); - F_NODE(nd_pconst, "constant"); - F_NODE(nd_apinfo->pre_args, "pre arguments"); - if (NODE_NAMED_REST_P(node->nd_apinfo->rest_arg)) { - F_NODE(nd_apinfo->rest_arg, "rest argument"); - } - else { - F_MSG(nd_apinfo->rest_arg, "rest argument", "NODE_SPECIAL_NO_NAME_REST (rest argument without name)"); - } - LAST_NODE; - F_NODE(nd_apinfo->post_args, "post arguments"); - return; - - case NODE_FNDPTN: - ANN("find pattern"); - ANN("format: [nd_pconst](*[pre_rest_arg], args, ..., *[post_rest_arg])"); - F_NODE(nd_pconst, "constant"); - if (NODE_NAMED_REST_P(node->nd_fpinfo->pre_rest_arg)) { - F_NODE(nd_fpinfo->pre_rest_arg, "pre rest argument"); - } - else { - F_MSG(nd_fpinfo->pre_rest_arg, "pre rest argument", "NODE_SPECIAL_NO_NAME_REST (rest argument without name)"); - } - F_NODE(nd_fpinfo->args, "arguments"); - - LAST_NODE; - if (NODE_NAMED_REST_P(node->nd_fpinfo->post_rest_arg)) { - F_NODE(nd_fpinfo->post_rest_arg, "post rest argument"); - } - else { - F_MSG(nd_fpinfo->post_rest_arg, "post rest argument", "NODE_SPECIAL_NO_NAME_REST (rest argument without name)"); - } - return; - - case NODE_HSHPTN: - ANN("hash pattern"); - ANN("format: [nd_pconst]([nd_pkwargs], ..., **[nd_pkwrestarg])"); - F_NODE(nd_pconst, "constant"); - F_NODE(nd_pkwargs, "keyword arguments"); - LAST_NODE; - if (node->nd_pkwrestarg == NODE_SPECIAL_NO_REST_KEYWORD) { - F_MSG(nd_pkwrestarg, "keyword rest argument", "NODE_SPECIAL_NO_REST_KEYWORD (**nil)"); - } - else { - F_NODE(nd_pkwrestarg, "keyword rest argument"); - } - return; - case NODE_ERROR: - ANN("Broken input recovered by Error Tolerant mode"); - return; - - case NODE_ARGS_AUX: - case NODE_LAST: - break; - } - - rb_bug("dump_node: unknown node: %s", ruby_node_name(nd_type(node))); -} - -VALUE -rb_parser_dump_tree(const NODE *node, int comment) -{ - VALUE buf = rb_str_new_cstr( - "###########################################################\n" - "## Do NOT use this node dump for any purpose other than ##\n" - "## debug and research. Compatibility is not guaranteed. ##\n" - "###########################################################\n\n" - ); - dump_node(buf, rb_str_new_cstr("# "), comment, node); - return buf; -} /* Setup NODE structure. * NODE is not an object managed by GC, but it imitates an object @@ -1145,40 +66,31 @@ rb_node_init(NODE *n, enum node_type type, VALUE a0, VALUE a1, VALUE a2) } const char * -ruby_node_name(int node) { switch (node) { #include "node_name.inc" default: - rb_bug("unknown node: %d", node); return 0; } } -typedef struct node_buffer_elem_struct { - struct node_buffer_elem_struct *next; - long len; - NODE buf[FLEX_ARY_LEN]; -} node_buffer_elem_t; - -typedef struct { - long idx, len; - node_buffer_elem_t *head; - node_buffer_elem_t *last; -} node_buffer_list_t; -struct node_buffer_struct { - node_buffer_list_t unmarkable; - node_buffer_list_t markable; - struct rb_ast_local_table_link *local_tables; - VALUE mark_hash; - // - id (sequence number) - // - token_type - // - text of token - // - location info - // Array, whose entry is array - VALUE tokens; -}; static void init_node_buffer_list(node_buffer_list_t * nb, node_buffer_elem_t *head) @@ -1190,6 +102,26 @@ init_node_buffer_list(node_buffer_list_t * nb, node_buffer_elem_t *head) nb->head->next = NULL; } static node_buffer_t * rb_node_buffer_new(void) { @@ -1207,9 +139,10 @@ rb_node_buffer_new(void) nb->tokens = Qnil; return nb; } static void -node_buffer_list_free(node_buffer_list_t * nb) { node_buffer_elem_t *nbe = nb->head; @@ -1229,10 +162,10 @@ struct rb_ast_local_table_link { }; static void -rb_node_buffer_free(node_buffer_t *nb) { - node_buffer_list_free(&nb->unmarkable); - node_buffer_list_free(&nb->markable); struct rb_ast_local_table_link *local_table = nb->local_tables; while (local_table) { struct rb_ast_local_table_link *next_table = local_table->next; @@ -1243,7 +176,7 @@ rb_node_buffer_free(node_buffer_t *nb) } static NODE * -ast_newnode_in_bucket(node_buffer_list_t *nb) { if (nb->idx >= nb->len) { long n = nb->len * 2; @@ -1286,9 +219,10 @@ rb_ast_newnode(rb_ast_t *ast, enum node_type type) node_buffer_t *nb = ast->node_buffer; node_buffer_list_t *bucket = (nodetype_markable_p(type) ? &nb->markable : &nb->unmarkable); - return ast_newnode_in_bucket(bucket); } void rb_ast_node_type_change(NODE *n, enum node_type type) { @@ -1298,6 +232,7 @@ rb_ast_node_type_change(NODE *n, enum node_type type) ruby_node_name(old_type), ruby_node_name(type)); } } rb_ast_id_table_t * rb_ast_new_local_table(rb_ast_t *ast, int size) @@ -1331,6 +266,15 @@ rb_ast_delete_node(rb_ast_t *ast, NODE *n) /* should we implement freelist? */ } rb_ast_t * rb_ast_new(void) { @@ -1338,36 +282,41 @@ rb_ast_new(void) rb_ast_t *ast = (rb_ast_t *)rb_imemo_new(imemo_ast, 0, 0, 0, (VALUE)nb); return ast; } -typedef void node_itr_t(void *ctx, NODE * node); static void -iterate_buffer_elements(node_buffer_elem_t *nbe, long len, node_itr_t *func, void *ctx) { long cursor; for (cursor = 0; cursor < len; cursor++) { - func(ctx, &nbe->buf[cursor]); } } static void -iterate_node_values(node_buffer_list_t *nb, node_itr_t * func, void *ctx) { node_buffer_elem_t *nbe = nb->head; /* iterate over the head first because it's not full */ - iterate_buffer_elements(nbe, nb->idx, func, ctx); nbe = nbe->next; while (nbe) { - iterate_buffer_elements(nbe, nbe->len, func, ctx); nbe = nbe->next; } } static void -mark_ast_value(void *ctx, NODE * node) { switch (nd_type(node)) { case NODE_ARGS: { @@ -1395,8 +344,12 @@ mark_ast_value(void *ctx, NODE * node) } static void -update_ast_value(void *ctx, NODE * node) { switch (nd_type(node)) { case NODE_ARGS: { @@ -1429,7 +382,7 @@ rb_ast_update_references(rb_ast_t *ast) if (ast->node_buffer) { node_buffer_t *nb = ast->node_buffer; - iterate_node_values(&nb->markable, update_ast_value, NULL); } } @@ -1439,22 +392,29 @@ rb_ast_mark(rb_ast_t *ast) if (ast->node_buffer) { rb_gc_mark(ast->node_buffer->mark_hash); rb_gc_mark(ast->node_buffer->tokens); - } - if (ast->body.compile_option) rb_gc_mark(ast->body.compile_option); - if (ast->node_buffer) { node_buffer_t *nb = ast->node_buffer; - - iterate_node_values(&nb->markable, mark_ast_value, NULL); } - if (ast->body.script_lines) rb_gc_mark(ast->body.script_lines); } void rb_ast_free(rb_ast_t *ast) { if (ast->node_buffer) { - rb_node_buffer_free(ast->node_buffer); ast->node_buffer = 0; } } @@ -1510,3 +470,12 @@ rb_ast_set_tokens(rb_ast_t *ast, VALUE tokens) { RB_OBJ_WRITE(ast, &ast->node_buffer->tokens, tokens); } @@ -11,199 +11,99 @@ **********************************************************************/ -#include "internal/compilers.h" - -#if defined(__cplusplus) -extern "C" { -#if 0 -} /* satisfy cc-mode */ -#endif #endif -enum node_type { - NODE_SCOPE, - NODE_BLOCK, - NODE_IF, - NODE_UNLESS, - NODE_CASE, - NODE_CASE2, - NODE_CASE3, - NODE_WHEN, - NODE_IN, - NODE_WHILE, - NODE_UNTIL, - NODE_ITER, - NODE_FOR, - NODE_FOR_MASGN, - NODE_BREAK, - NODE_NEXT, - NODE_REDO, - NODE_RETRY, - NODE_BEGIN, - NODE_RESCUE, - NODE_RESBODY, - NODE_ENSURE, - NODE_AND, - NODE_OR, - NODE_MASGN, - NODE_LASGN, - NODE_DASGN, - NODE_GASGN, - NODE_IASGN, - NODE_CDECL, - NODE_CVASGN, - NODE_OP_ASGN1, - NODE_OP_ASGN2, - NODE_OP_ASGN_AND, - NODE_OP_ASGN_OR, - NODE_OP_CDECL, - NODE_CALL, - NODE_OPCALL, - NODE_FCALL, - NODE_VCALL, - NODE_QCALL, - NODE_SUPER, - NODE_ZSUPER, - NODE_LIST, - NODE_ZLIST, - NODE_VALUES, - NODE_HASH, - NODE_RETURN, - NODE_YIELD, - NODE_LVAR, - NODE_DVAR, - NODE_GVAR, - NODE_IVAR, - NODE_CONST, - NODE_CVAR, - NODE_NTH_REF, - NODE_BACK_REF, - NODE_MATCH, - NODE_MATCH2, - NODE_MATCH3, - NODE_LIT, - NODE_STR, - NODE_DSTR, - NODE_XSTR, - NODE_DXSTR, - NODE_EVSTR, - NODE_DREGX, - NODE_ONCE, - NODE_ARGS, - NODE_ARGS_AUX, - NODE_OPT_ARG, - NODE_KW_ARG, - NODE_POSTARG, - NODE_ARGSCAT, - NODE_ARGSPUSH, - NODE_SPLAT, - NODE_BLOCK_PASS, - NODE_DEFN, - NODE_DEFS, - NODE_ALIAS, - NODE_VALIAS, - NODE_UNDEF, - NODE_CLASS, - NODE_MODULE, - NODE_SCLASS, - NODE_COLON2, - NODE_COLON3, - NODE_DOT2, - NODE_DOT3, - NODE_FLIP2, - NODE_FLIP3, - NODE_SELF, - NODE_NIL, - NODE_TRUE, - NODE_FALSE, - NODE_ERRINFO, - NODE_DEFINED, - NODE_POSTEXE, - NODE_DSYM, - NODE_ATTRASGN, - NODE_LAMBDA, - NODE_ARYPTN, - NODE_HSHPTN, - NODE_FNDPTN, - NODE_ERROR, - NODE_LAST }; -typedef struct rb_code_position_struct { - int lineno; - int column; -} rb_code_position_t; - -typedef struct rb_code_location_struct { - rb_code_position_t beg_pos; - rb_code_position_t end_pos; -} rb_code_location_t; - -static inline rb_code_location_t -code_loc_gen(const rb_code_location_t *loc1, const rb_code_location_t *loc2) -{ - rb_code_location_t loc; - loc.beg_pos = loc1->beg_pos; - loc.end_pos = loc2->end_pos; - return loc; -} -typedef struct rb_ast_id_table { - int size; - ID ids[FLEX_ARY_LEN]; -} rb_ast_id_table_t; -typedef struct RNode { - VALUE flags; - union { - struct RNode *node; - ID id; - VALUE value; - rb_ast_id_table_t *tbl; - } u1; - union { - struct RNode *node; - ID id; - long argc; - VALUE value; - } u2; - union { - struct RNode *node; - ID id; - long state; - struct rb_args_info *args; - struct rb_ary_pattern_info *apinfo; - struct rb_fnd_pattern_info *fpinfo; - VALUE value; - } u3; - rb_code_location_t nd_loc; - int node_id; -} NODE; -#define RNODE(obj) ((struct RNode *)(obj)) -/* FL : 0..4: T_TYPES, 5: KEEP_WB, 6: PROMOTED, 7: FINALIZE, 8: UNUSED, 9: UNUSED, 10: EXIVAR, 11: FREEZE */ -/* NODE_FL: 0..4: T_TYPES, 5: KEEP_WB, 6: PROMOTED, 7: NODE_FL_NEWLINE, - * 8..14: nd_type, - * 15..: nd_line - */ -#define NODE_FL_NEWLINE (((VALUE)1)<<7) -#define NODE_TYPESHIFT 8 -#define NODE_TYPEMASK (((VALUE)0x7f)<<NODE_TYPESHIFT) -#define nd_type(n) ((int) (((n)->flags & NODE_TYPEMASK)>>NODE_TYPESHIFT)) -#define nd_set_type(n,t) \ - rb_node_set_type(n, t) -#define nd_init_type(n,t) \ - (n)->flags=(((n)->flags&~NODE_TYPEMASK)|((((unsigned long)(t))<<NODE_TYPESHIFT)&NODE_TYPEMASK)) #define NODE_LSHIFT (NODE_TYPESHIFT+7) #define NODE_LMASK (((SIGNED_VALUE)1<<(sizeof(VALUE)*CHAR_BIT-NODE_LSHIFT))-1) #define nd_line(n) (int)(((SIGNED_VALUE)(n)->flags)>>NODE_LSHIFT) #define nd_set_line(n,l) \ (n)->flags=(((n)->flags&~((VALUE)(-1)<<NODE_LSHIFT))|((VALUE)((l)&NODE_LMASK)<<NODE_LSHIFT)) #define nd_first_column(n) ((int)((n)->nd_loc.beg_pos.column)) #define nd_set_first_column(n, v) ((n)->nd_loc.beg_pos.column = (v)) #define nd_first_lineno(n) ((int)((n)->nd_loc.beg_pos.lineno)) @@ -220,295 +120,10 @@ typedef struct RNode { #define nd_node_id(n) ((n)->node_id) #define nd_set_node_id(n,id) ((n)->node_id = (id)) -#define nd_head u1.node -#define nd_alen u2.argc -#define nd_next u3.node - -#define nd_cond u1.node -#define nd_body u2.node -#define nd_else u3.node - -#define nd_resq u2.node -#define nd_ensr u3.node - -#define nd_1st u1.node -#define nd_2nd u2.node - -#define nd_stts u1.node - -#define nd_entry u3.id -#define nd_vid u1.id - -#define nd_var u1.node -#define nd_iter u3.node - -#define nd_value u2.node -#define nd_aid u3.id - -#define nd_lit u1.value - -#define nd_recv u1.node -#define nd_mid u2.id -#define nd_args u3.node -#define nd_ainfo u3.args - -#define nd_defn u3.node - -#define nd_cpath u1.node -#define nd_super u3.node - -#define nd_beg u1.node -#define nd_end u2.node -#define nd_state u3.state - -#define nd_nth u2.argc - -#define nd_alias u1.id -#define nd_orig u2.id -#define nd_undef u2.node - -#define nd_brace u2.argc - -#define nd_pconst u1.node -#define nd_pkwargs u2.node -#define nd_pkwrestarg u3.node - -#define nd_apinfo u3.apinfo - -#define nd_fpinfo u3.fpinfo - -// for NODE_SCOPE -#define nd_tbl u1.tbl - -// for NODE_ARGS_AUX -#define nd_pid u1.id -#define nd_plen u2.argc -#define nd_cflag u2.id - -// for ripper -#define nd_cval u3.value -#define nd_rval u2.value -#define nd_tag u1.id - -#define NEW_NODE(t,a0,a1,a2,loc) rb_node_newnode((t),(VALUE)(a0),(VALUE)(a1),(VALUE)(a2),loc) -#define NEW_NODE_WITH_LOCALS(t,a1,a2,loc) node_newnode_with_locals(p, (t),(VALUE)(a1),(VALUE)(a2),loc) - -#define NEW_DEFN(i,a,d,loc) NEW_NODE(NODE_DEFN,0,i,NEW_SCOPE(a,d,loc),loc) -#define NEW_DEFS(r,i,a,d,loc) NEW_NODE(NODE_DEFS,r,i,NEW_SCOPE(a,d,loc),loc) -#define NEW_SCOPE(a,b,loc) NEW_NODE_WITH_LOCALS(NODE_SCOPE,b,a,loc) -#define NEW_BLOCK(a,loc) NEW_NODE(NODE_BLOCK,a,0,0,loc) -#define NEW_IF(c,t,e,loc) NEW_NODE(NODE_IF,c,t,e,loc) -#define NEW_UNLESS(c,t,e,loc) NEW_NODE(NODE_UNLESS,c,t,e,loc) -#define NEW_CASE(h,b,loc) NEW_NODE(NODE_CASE,h,b,0,loc) -#define NEW_CASE2(b,loc) NEW_NODE(NODE_CASE2,0,b,0,loc) -#define NEW_CASE3(h,b,loc) NEW_NODE(NODE_CASE3,h,b,0,loc) -#define NEW_WHEN(c,t,e,loc) NEW_NODE(NODE_WHEN,c,t,e,loc) -#define NEW_IN(c,t,e,loc) NEW_NODE(NODE_IN,c,t,e,loc) -#define NEW_WHILE(c,b,n,loc) NEW_NODE(NODE_WHILE,c,b,n,loc) -#define NEW_UNTIL(c,b,n,loc) NEW_NODE(NODE_UNTIL,c,b,n,loc) -#define NEW_FOR(i,b,loc) NEW_NODE(NODE_FOR,0,b,i,loc) -#define NEW_FOR_MASGN(v,loc) NEW_NODE(NODE_FOR_MASGN,v,0,0,loc) -#define NEW_ITER(a,b,loc) NEW_NODE(NODE_ITER,0,NEW_SCOPE(a,b,loc),0,loc) -#define NEW_LAMBDA(a,b,loc) NEW_NODE(NODE_LAMBDA,0,NEW_SCOPE(a,b,loc),0,loc) -#define NEW_BREAK(s,loc) NEW_NODE(NODE_BREAK,s,0,0,loc) -#define NEW_NEXT(s,loc) NEW_NODE(NODE_NEXT,s,0,0,loc) -#define NEW_REDO(loc) NEW_NODE(NODE_REDO,0,0,0,loc) -#define NEW_RETRY(loc) NEW_NODE(NODE_RETRY,0,0,0,loc) -#define NEW_BEGIN(b,loc) NEW_NODE(NODE_BEGIN,0,b,0,loc) -#define NEW_RESCUE(b,res,e,loc) NEW_NODE(NODE_RESCUE,b,res,e,loc) -#define NEW_RESBODY(a,ex,n,loc) NEW_NODE(NODE_RESBODY,n,ex,a,loc) -#define NEW_ENSURE(b,en,loc) NEW_NODE(NODE_ENSURE,b,0,en,loc) -#define NEW_RETURN(s,loc) NEW_NODE(NODE_RETURN,s,0,0,loc) -#define NEW_YIELD(a,loc) NEW_NODE(NODE_YIELD,a,0,0,loc) -#define NEW_LIST(a,loc) NEW_NODE(NODE_LIST,a,1,0,loc) -#define NEW_ZLIST(loc) NEW_NODE(NODE_ZLIST,0,0,0,loc) -#define NEW_HASH(a,loc) NEW_NODE(NODE_HASH,a,0,0,loc) -#define NEW_MASGN(l,r,loc) NEW_NODE(NODE_MASGN,l,0,r,loc) -#define NEW_GASGN(v,val,loc) NEW_NODE(NODE_GASGN,v,val,v,loc) -#define NEW_LASGN(v,val,loc) NEW_NODE(NODE_LASGN,v,val,0,loc) -#define NEW_DASGN(v,val,loc) NEW_NODE(NODE_DASGN,v,val,0,loc) -#define NEW_IASGN(v,val,loc) NEW_NODE(NODE_IASGN,v,val,0,loc) -#define NEW_CDECL(v,val,path,loc) NEW_NODE(NODE_CDECL,v,val,path,loc) -#define NEW_CVASGN(v,val,loc) NEW_NODE(NODE_CVASGN,v,val,0,loc) -#define NEW_OP_ASGN1(p,id,a,loc) NEW_NODE(NODE_OP_ASGN1,p,id,a,loc) -#define NEW_OP_ASGN2(r,t,i,o,val,loc) NEW_NODE(NODE_OP_ASGN2,r,val,NEW_OP_ASGN22(i,o,t,loc),loc) -#define NEW_OP_ASGN22(i,o,t,loc) NEW_NODE(NODE_OP_ASGN2,i,o,t,loc) -#define NEW_OP_ASGN_OR(i,val,loc) NEW_NODE(NODE_OP_ASGN_OR,i,val,0,loc) -#define NEW_OP_ASGN_AND(i,val,loc) NEW_NODE(NODE_OP_ASGN_AND,i,val,0,loc) -#define NEW_OP_CDECL(v,op,val,loc) NEW_NODE(NODE_OP_CDECL,v,val,op,loc) -#define NEW_GVAR(v,loc) NEW_NODE(NODE_GVAR,v,0,v,loc) -#define NEW_LVAR(v,loc) NEW_NODE(NODE_LVAR,v,0,0,loc) -#define NEW_DVAR(v,loc) NEW_NODE(NODE_DVAR,v,0,0,loc) -#define NEW_IVAR(v,loc) NEW_NODE(NODE_IVAR,v,0,0,loc) -#define NEW_CONST(v,loc) NEW_NODE(NODE_CONST,v,0,0,loc) -#define NEW_CVAR(v,loc) NEW_NODE(NODE_CVAR,v,0,0,loc) -#define NEW_NTH_REF(n,loc) NEW_NODE(NODE_NTH_REF,0,n,0,loc) -#define NEW_BACK_REF(n,loc) NEW_NODE(NODE_BACK_REF,0,n,0,loc) -#define NEW_MATCH(c,loc) NEW_NODE(NODE_MATCH,c,0,0,loc) -#define NEW_MATCH2(n1,n2,loc) NEW_NODE(NODE_MATCH2,n1,n2,0,loc) -#define NEW_MATCH3(r,n2,loc) NEW_NODE(NODE_MATCH3,r,n2,0,loc) -#define NEW_LIT(l,loc) NEW_NODE(NODE_LIT,l,0,0,loc) -#define NEW_STR(s,loc) NEW_NODE(NODE_STR,s,0,0,loc) -#define NEW_DSTR(s,loc) NEW_NODE(NODE_DSTR,s,1,0,loc) -#define NEW_XSTR(s,loc) NEW_NODE(NODE_XSTR,s,0,0,loc) -#define NEW_DXSTR(s,loc) NEW_NODE(NODE_DXSTR,s,0,0,loc) -#define NEW_DSYM(s,loc) NEW_NODE(NODE_DSYM,s,0,0,loc) -#define NEW_EVSTR(n,loc) NEW_NODE(NODE_EVSTR,0,(n),0,loc) -#define NEW_CALL(r,m,a,loc) NEW_NODE(NODE_CALL,r,m,a,loc) -#define NEW_OPCALL(r,m,a,loc) NEW_NODE(NODE_OPCALL,r,m,a,loc) -#define NEW_FCALL(m,a,loc) NEW_NODE(NODE_FCALL,0,m,a,loc) -#define NEW_VCALL(m,loc) NEW_NODE(NODE_VCALL,0,m,0,loc) -#define NEW_SUPER(a,loc) NEW_NODE(NODE_SUPER,0,0,a,loc) -#define NEW_ZSUPER(loc) NEW_NODE(NODE_ZSUPER,0,0,0,loc) -#define NEW_ARGS_AUX(r,b,loc) NEW_NODE(NODE_ARGS_AUX,r,b,0,loc) -#define NEW_OPT_ARG(i,v,loc) NEW_NODE(NODE_OPT_ARG,i,v,0,loc) -#define NEW_KW_ARG(i,v,loc) NEW_NODE(NODE_KW_ARG,i,v,0,loc) -#define NEW_POSTARG(i,v,loc) NEW_NODE(NODE_POSTARG,i,v,0,loc) -#define NEW_ARGSCAT(a,b,loc) NEW_NODE(NODE_ARGSCAT,a,b,0,loc) -#define NEW_ARGSPUSH(a,b,loc) NEW_NODE(NODE_ARGSPUSH,a,b,0,loc) -#define NEW_SPLAT(a,loc) NEW_NODE(NODE_SPLAT,a,0,0,loc) -#define NEW_BLOCK_PASS(b,loc) NEW_NODE(NODE_BLOCK_PASS,0,b,0,loc) -#define NEW_ALIAS(n,o,loc) NEW_NODE(NODE_ALIAS,n,o,0,loc) -#define NEW_VALIAS(n,o,loc) NEW_NODE(NODE_VALIAS,n,o,0,loc) -#define NEW_UNDEF(i,loc) NEW_NODE(NODE_UNDEF,0,i,0,loc) -#define NEW_CLASS(n,b,s,loc) NEW_NODE(NODE_CLASS,n,NEW_SCOPE(0,b,loc),(s),loc) -#define NEW_SCLASS(r,b,loc) NEW_NODE(NODE_SCLASS,r,NEW_SCOPE(0,b,loc),0,loc) -#define NEW_MODULE(n,b,loc) NEW_NODE(NODE_MODULE,n,NEW_SCOPE(0,b,loc),0,loc) -#define NEW_COLON2(c,i,loc) NEW_NODE(NODE_COLON2,c,i,0,loc) -#define NEW_COLON3(i,loc) NEW_NODE(NODE_COLON3,0,i,0,loc) -#define NEW_DOT2(b,e,loc) NEW_NODE(NODE_DOT2,b,e,0,loc) -#define NEW_DOT3(b,e,loc) NEW_NODE(NODE_DOT3,b,e,0,loc) -#define NEW_SELF(loc) NEW_NODE(NODE_SELF,0,0,1,loc) -#define NEW_NIL(loc) NEW_NODE(NODE_NIL,0,0,0,loc) -#define NEW_TRUE(loc) NEW_NODE(NODE_TRUE,0,0,0,loc) -#define NEW_FALSE(loc) NEW_NODE(NODE_FALSE,0,0,0,loc) -#define NEW_ERRINFO(loc) NEW_NODE(NODE_ERRINFO,0,0,0,loc) -#define NEW_DEFINED(e,loc) NEW_NODE(NODE_DEFINED,e,0,0,loc) -#define NEW_POSTEXE(b,loc) NEW_NODE(NODE_POSTEXE,0,b,0,loc) -#define NEW_ATTRASGN(r,m,a,loc) NEW_NODE(NODE_ATTRASGN,r,m,a,loc) -#define NEW_ERROR(loc) NEW_NODE(NODE_ERROR,0,0,0,loc) - -#define NODE_SPECIAL_REQUIRED_KEYWORD ((NODE *)-1) -#define NODE_REQUIRED_KEYWORD_P(node) ((node)->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD) -#define NODE_SPECIAL_NO_NAME_REST ((NODE *)-1) -#define NODE_NAMED_REST_P(node) ((node) != NODE_SPECIAL_NO_NAME_REST) -#define NODE_SPECIAL_EXCESSIVE_COMMA ((ID)1) -#define NODE_SPECIAL_NO_REST_KEYWORD ((NODE *)-1) - -VALUE rb_node_case_when_optimizable_literal(const NODE *const node); - -RUBY_SYMBOL_EXPORT_BEGIN - -typedef struct node_buffer_struct node_buffer_t; -/* T_IMEMO/ast */ -typedef struct rb_ast_body_struct { - const NODE *root; - VALUE compile_option; - VALUE script_lines; - // script_lines is either: - // - a Fixnum that represents the line count of the original source, or - // - an Array that contains the lines of the original source -} rb_ast_body_t; -typedef struct rb_ast_struct { - VALUE flags; - node_buffer_t *node_buffer; - rb_ast_body_t body; -} rb_ast_t; -rb_ast_t *rb_ast_new(void); -void rb_ast_mark(rb_ast_t*); -void rb_ast_update_references(rb_ast_t*); -void rb_ast_dispose(rb_ast_t*); -void rb_ast_free(rb_ast_t*); -size_t rb_ast_memsize(const rb_ast_t*); -void rb_ast_add_mark_object(rb_ast_t*, VALUE); -void rb_ast_set_tokens(rb_ast_t*, VALUE); -VALUE rb_ast_tokens(rb_ast_t *ast); -NODE *rb_ast_newnode(rb_ast_t*, enum node_type type); -void rb_ast_delete_node(rb_ast_t*, NODE *n); -rb_ast_id_table_t *rb_ast_new_local_table(rb_ast_t*, int); -rb_ast_id_table_t *rb_ast_resize_latest_local_table(rb_ast_t*, int); - -VALUE rb_parser_new(void); -VALUE rb_parser_end_seen_p(VALUE); -VALUE rb_parser_encoding(VALUE); -VALUE rb_parser_set_yydebug(VALUE, VALUE); -VALUE rb_parser_dump_tree(const NODE *node, int comment); -void rb_parser_set_options(VALUE, int, int, int, int); - -rb_ast_t *rb_parser_compile_string(VALUE, const char*, VALUE, int); -rb_ast_t *rb_parser_compile_string_path(VALUE vparser, VALUE fname, VALUE src, int line); -rb_ast_t *rb_parser_compile_file_path(VALUE vparser, VALUE fname, VALUE input, int line); -rb_ast_t *rb_parser_compile_generic(VALUE vparser, VALUE (*lex_gets)(VALUE, int), VALUE fname, VALUE input, int line); - -void rb_node_init(NODE *n, enum node_type type, VALUE a0, VALUE a1, VALUE a2); -const char *ruby_node_name(int node); - -const struct kwtable *rb_reserved_word(const char *, unsigned int); - -struct rb_args_info { - NODE *pre_init; - NODE *post_init; - - int pre_args_num; /* count of mandatory pre-arguments */ - int post_args_num; /* count of mandatory post-arguments */ - - ID first_post_arg; - - ID rest_arg; - ID block_arg; - - NODE *kw_args; - NODE *kw_rest_arg; - - NODE *opt_args; - unsigned int no_kwarg: 1; - unsigned int ruby2_keywords: 1; - unsigned int forwarding: 1; - - VALUE imemo; -}; - -struct rb_ary_pattern_info { - NODE *pre_args; - NODE *rest_arg; - NODE *post_args; -}; - -struct rb_fnd_pattern_info { - NODE *pre_rest_arg; - NODE *args; - NODE *post_rest_arg; -}; - -struct parser_params; -void *rb_parser_malloc(struct parser_params *, size_t); -void *rb_parser_realloc(struct parser_params *, void *, size_t); -void *rb_parser_calloc(struct parser_params *, size_t, size_t); -void rb_parser_free(struct parser_params *, void *); -PRINTF_ARGS(void rb_parser_printf(struct parser_params *parser, const char *fmt, ...), 2, 3); -void rb_ast_node_type_change(NODE *n, enum node_type type); - -RUBY_SYMBOL_EXPORT_END - -static inline VALUE -rb_node_set_type(NODE *n, enum node_type t) -{ -#if RUBY_DEBUG - rb_ast_node_type_change(n, t); -#endif - return nd_init_type(n, t); -} - static inline bool nd_type_p(const NODE *n, enum node_type t) { return (enum node_type)nd_type(n) == t; } -#if defined(__cplusplus) -#if 0 -{ /* satisfy cc-mode */ -#endif -} /* extern "C" { */ -#endif #endif /* RUBY_NODE_H */ @@ -0,0 +1,1122 @@ @@ -22,6 +22,27 @@ #define YYLTYPE rb_code_location_t #define YYLTYPE_IS_DECLARED 1 #include "ruby/internal/config.h" #include <ctype.h> @@ -43,10 +64,12 @@ struct lex_context; #include "internal/parse.h" #include "internal/rational.h" #include "internal/re.h" #include "internal/symbol.h" #include "internal/thread.h" #include "internal/variable.h" #include "node.h" #include "probes.h" #include "regenc.h" #include "ruby/encoding.h" @@ -57,6 +80,129 @@ struct lex_context; #include "ruby/ractor.h" #include "symbol.h" enum shareability { shareable_none, shareable_literal, @@ -141,44 +287,6 @@ RBIMPL_WARNING_POP() {p->ruby_sourceline, (int)(p->lex.pcur - p->lex.pbeg)}, \ } -enum lex_state_bits { - EXPR_BEG_bit, /* ignore newline, +/- is a sign. */ - EXPR_END_bit, /* newline significant, +/- is an operator. */ - EXPR_ENDARG_bit, /* ditto, and unbound braces. */ - EXPR_ENDFN_bit, /* ditto, and unbound braces. */ - EXPR_ARG_bit, /* newline significant, +/- is an operator. */ - EXPR_CMDARG_bit, /* newline significant, +/- is an operator. */ - EXPR_MID_bit, /* newline significant, +/- is an operator. */ - EXPR_FNAME_bit, /* ignore newline, no reserved words. */ - EXPR_DOT_bit, /* right after `.', `&.' or `::', no reserved words. */ - EXPR_CLASS_bit, /* immediate after `class', no here document. */ - EXPR_LABEL_bit, /* flag bit, label is allowed. */ - EXPR_LABELED_bit, /* flag bit, just after a label. */ - EXPR_FITEM_bit, /* symbol literal as FNAME. */ - EXPR_MAX_STATE -}; -/* examine combinations */ -enum lex_state_e { -#define DEF_EXPR(n) EXPR_##n = (1 << EXPR_##n##_bit) - DEF_EXPR(BEG), - DEF_EXPR(END), - DEF_EXPR(ENDARG), - DEF_EXPR(ENDFN), - DEF_EXPR(ARG), - DEF_EXPR(CMDARG), - DEF_EXPR(MID), - DEF_EXPR(FNAME), - DEF_EXPR(DOT), - DEF_EXPR(CLASS), - DEF_EXPR(LABEL), - DEF_EXPR(LABELED), - DEF_EXPR(FITEM), - EXPR_VALUE = EXPR_BEG, - EXPR_BEG_ANY = (EXPR_BEG | EXPR_MID | EXPR_CLASS), - EXPR_ARG_ANY = (EXPR_ARG | EXPR_CMDARG), - EXPR_END_ANY = (EXPR_END | EXPR_ENDARG | EXPR_ENDFN), - EXPR_NONE = 0 -}; #define IS_lex_state_for(x, ls) ((x) & (ls)) #define IS_lex_state_all_for(x, ls) (((x) & (ls)) == (ls)) #define IS_lex_state(ls) IS_lex_state_for(p->lex.state, (ls)) @@ -240,18 +348,6 @@ enum { NUMPARAM_MAX = 9, }; -#define NUMPARAM_ID_P(id) numparam_id_p(id) -#define NUMPARAM_ID_TO_IDX(id) (unsigned int)(((id) >> ID_SCOPE_SHIFT) - (tNUMPARAM_1 - 1)) -#define NUMPARAM_IDX_TO_ID(idx) TOKEN2LOCALID((tNUMPARAM_1 - 1 + (idx))) -static int -numparam_id_p(ID id) -{ - if (!is_local_id(id) || id < (tNUMPARAM_1 << ID_SCOPE_SHIFT)) return 0; - unsigned int idx = NUMPARAM_ID_TO_IDX(id); - return idx > 0 && idx <= NUMPARAM_MAX; -} -static void numparam_name(struct parser_params *p, ID id); - #define DVARS_INHERIT ((void*)1) #define DVARS_TOPSCOPE NULL #define DVARS_TERMINAL_P(tbl) ((tbl) == DVARS_INHERIT || (tbl) == DVARS_TOPSCOPE) @@ -264,8 +360,6 @@ typedef struct token_info { struct token_info *next; } token_info; -typedef struct rb_strterm_struct rb_strterm_t; - /* Structure of Lexer Buffer: @@ -344,6 +438,10 @@ struct parser_params { struct lex_context ctxt; unsigned int command_start:1; unsigned int eofp: 1; unsigned int ruby__end__seen: 1; @@ -388,12 +486,25 @@ struct parser_params { #endif }; #define intern_cstr(n,l,en) rb_intern3(n,l,en) #define STR_NEW(ptr,len) rb_enc_str_new((ptr),(len),p->enc) #define STR_NEW0() rb_enc_str_new(0,0,p->enc) #define STR_NEW2(ptr) rb_enc_str_new((ptr),strlen(ptr),p->enc) -#define STR_NEW3(ptr,len,e,func) parser_str_new((ptr),(len),(e),(func),p->enc) #define TOK_INTERN() intern_cstr(tok(p), toklen(p), p->enc) static st_table * @@ -463,7 +574,7 @@ peek_end_expect_token_locations(struct parser_params *p) } static ID -parser_token2id(enum yytokentype tok) { switch ((int) tok) { #define TOKEN2ID(tok) case tok: return rb_intern(#tok); @@ -830,7 +941,6 @@ static rb_ast_id_table_t *local_tbl(struct parser_params*); static VALUE reg_compile(struct parser_params*, VALUE, int); static void reg_fragment_setenc(struct parser_params*, VALUE, int); static int reg_fragment_check(struct parser_params*, VALUE, int); -static NODE *reg_named_capture_assign(struct parser_params* p, VALUE regexp, const YYLTYPE *loc); static int literal_concat0(struct parser_params *p, VALUE head, VALUE tail); static NODE *heredoc_dedent(struct parser_params*,NODE*); @@ -846,12 +956,12 @@ static void check_literal_when(struct parser_params *p, NODE *args, const YYLTYP #define NODE_RIPPER2 NODE_OP_CDECL #define NEW_RIPPER2(a,b,c,loc) (VALUE)NEW_OP_CDECL(a,c,b,loc) -static inline int ripper_is_node_yylval(VALUE n); static inline VALUE ripper_new_yylval(struct parser_params *p, ID a, VALUE b, VALUE c) { - if (ripper_is_node_yylval(c)) c = RNODE(c)->nd_cval; add_mark_object(p, b); add_mark_object(p, c); return NEW_RIPPER(a, b, c, &NULL_LOC); @@ -867,7 +977,7 @@ ripper_new_yylval2(struct parser_params *p, VALUE a, VALUE b, VALUE c) } static inline int -ripper_is_node_yylval(VALUE n) { return RB_TYPE_P(n, T_NODE) && nd_type_p(RNODE(n), NODE_RIPPER); } @@ -875,11 +985,11 @@ ripper_is_node_yylval(VALUE n) #define value_expr(node) ((void)(node)) #define remove_begin(node) (node) #define void_stmts(p,x) (x) #define rb_dvar_defined(id, base) 0 #define rb_local_defined(id, base) 0 -static ID ripper_get_id(VALUE); #define get_id(id) ripper_get_id(id) -static VALUE ripper_get_value(VALUE); #define get_value(val) ripper_get_value(val) #define get_num(num) (int)get_id(num) static VALUE assignable(struct parser_params*,VALUE); @@ -905,14 +1015,11 @@ static VALUE parser_reg_compile(struct parser_params*, VALUE, int, VALUE *); static VALUE backref_error(struct parser_params*, NODE *, VALUE); #endif /* !RIPPER */ -/* forward declaration */ -typedef struct rb_strterm_heredoc_struct rb_strterm_heredoc_t; - RUBY_SYMBOL_EXPORT_BEGIN VALUE rb_parser_reg_compile(struct parser_params* p, VALUE str, int options); int rb_reg_fragment_setenc(struct parser_params*, VALUE, int); enum lex_state_e rb_parser_trace_lex_state(struct parser_params *, enum lex_state_e, enum lex_state_e, int); -VALUE rb_parser_lex_state_name(enum lex_state_e state); void rb_parser_show_bitstack(struct parser_params *, stack_type, const char *, int); PRINTF_ARGS(void rb_parser_fatal(struct parser_params *p, const char *fmt, ...), 2, 3); YYLTYPE *rb_parser_set_location_from_strterm_heredoc(struct parser_params *p, rb_strterm_heredoc_t *here, YYLTYPE *yylloc); @@ -979,72 +1086,6 @@ static void numparam_pop(struct parser_params *p, NODE *prev_inner); #define RE_OPTION_MASK 0xff #define RE_OPTION_ARG_ENCODING_NONE 32 -/* structs for managing terminator of string literal and heredocment */ -typedef struct rb_strterm_literal_struct { - union { - VALUE dummy; - long nest; - } u0; - union { - VALUE dummy; - long func; /* STR_FUNC_* (e.g., STR_FUNC_ESCAPE and STR_FUNC_EXPAND) */ - } u1; - union { - VALUE dummy; - long paren; /* '(' of `%q(...)` */ - } u2; - union { - VALUE dummy; - long term; /* ')' of `%q(...)` */ - } u3; -} rb_strterm_literal_t; - -#define HERETERM_LENGTH_BITS ((SIZEOF_VALUE - 1) * CHAR_BIT - 1) - -struct rb_strterm_heredoc_struct { - VALUE lastline; /* the string of line that contains `<<"END"` */ - long offset; /* the column of END in `<<"END"` */ - int sourceline; /* lineno of the line that contains `<<"END"` */ - unsigned length /* the length of END in `<<"END"` */ -#if HERETERM_LENGTH_BITS < SIZEOF_INT * CHAR_BIT - : HERETERM_LENGTH_BITS -# define HERETERM_LENGTH_MAX ((1U << HERETERM_LENGTH_BITS) - 1) -#else -# define HERETERM_LENGTH_MAX UINT_MAX -#endif - ; -#if HERETERM_LENGTH_BITS < SIZEOF_INT * CHAR_BIT - unsigned quote: 1; - unsigned func: 8; -#else - uint8_t quote; - uint8_t func; -#endif -}; -STATIC_ASSERT(rb_strterm_heredoc_t, sizeof(rb_strterm_heredoc_t) <= 4 * SIZEOF_VALUE); - -#define STRTERM_HEREDOC IMEMO_FL_USER0 - -struct rb_strterm_struct { - VALUE flags; - union { - rb_strterm_literal_t literal; - rb_strterm_heredoc_t heredoc; - } u; -}; - -#ifndef RIPPER -void -rb_strterm_mark(VALUE obj) -{ - rb_strterm_t *strterm = (rb_strterm_t*)obj; - if (RBASIC(obj)->flags & STRTERM_HEREDOC) { - rb_strterm_heredoc_t *heredoc = &strterm->u.heredoc; - rb_gc_mark(heredoc->lastline); - } -} -#endif - #define yytnamerr(yyres, yystr) (YYSIZE_T)rb_yytnamerr(p, yyres, yystr) size_t rb_yytnamerr(struct parser_params *p, char *yyres, const char *yystr); @@ -1060,12 +1101,11 @@ size_t rb_yytnamerr(struct parser_params *p, char *yyres, const char *yystr); /****** Ripper *******/ #ifdef RIPPER -#define RIPPER_VERSION "0.1.0" -static inline VALUE intern_sym(const char *name); -#include "eventids1.c" -#include "eventids2.c" static VALUE ripper_dis0(struct parser_params*,ID); static VALUE ripper_dis1(struct parser_params*,ID,VALUE); @@ -1074,7 +1114,7 @@ static VALUE ripper_dis3(struct parser_params*,ID,VALUE,VALUE,VALUE); static VALUE ripper_dis4(struct parser_params*,ID,VALUE,VALUE,VALUE,VALUE); static VALUE ripper_dis5(struct parser_params*,ID,VALUE,VALUE,VALUE,VALUE,VALUE); static VALUE ripper_dis7(struct parser_params*,ID,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE); -static void ripper_error(struct parser_params *p); #define dis0(n) ripper_dis0(p, TOKEN_PASTE(ripper_id_, n)) #define dis1(n,a) ripper_dis1(p, TOKEN_PASTE(ripper_id_, n), (a)) @@ -1284,7 +1324,7 @@ endless_method_name(struct parser_params *p, NODE *defn, const YYLTYPE *loc) # define rb_warning3L(l,fmt,a,b,c) WARNING_CALL(WARNING_ARGS_L(l, fmt, 4), (a), (b), (c)) # define rb_warning4L(l,fmt,a,b,c,d) WARNING_CALL(WARNING_ARGS_L(l, fmt, 5), (a), (b), (c), (d)) #ifdef RIPPER -static ID id_warn, id_warning, id_gets, id_assoc; # define ERR_MESG() STR_NEW2(mesg) /* to bypass Ripper DSL */ # define WARN_S_L(s,l) STR_NEW(s,l) # define WARN_S(s) STR_NEW2(s) @@ -1307,7 +1347,6 @@ static ID id_warn, id_warning, id_gets, id_assoc; # else # define WARNING_CALL rb_funcall # endif -PRINTF_ARGS(static void ripper_compile_error(struct parser_params*, const char *fmt, ...), 2, 3); # define compile_error ripper_compile_error #else # define WARN_S_L(s,l) s @@ -4754,7 +4793,7 @@ p_kw_label : tLABEL $$ = SYM2ID(node->nd_lit); } /*% - if (ripper_is_node_yylval($2) && RNODE($2)->nd_cval) { VALUE label = RNODE($2)->nd_cval; VALUE rval = RNODE($2)->nd_rval; $$ = ripper_new_yylval(p, rb_intern_str(label), rval, label); @@ -5173,7 +5212,7 @@ string_contents : /* none */ /*% ripper: string_add!($1, $2) %*/ /*%%%*/ /*% - if (ripper_is_node_yylval($1) && ripper_is_node_yylval($2) && !RNODE($1)->nd_cval) { RNODE($1)->nd_cval = RNODE($2)->nd_cval; RNODE($1)->nd_rval = add_mark_object(p, $$); @@ -5235,11 +5274,11 @@ regexp_contents: /* none */ } /*% VALUE s1 = 1, s2 = 0, n1 = $1, n2 = $2; - if (ripper_is_node_yylval(n1)) { s1 = RNODE(n1)->nd_cval; n1 = RNODE(n1)->nd_rval; } - if (ripper_is_node_yylval(n2)) { s2 = RNODE(n2)->nd_cval; n2 = RNODE(n2)->nd_rval; } @@ -6187,7 +6226,7 @@ parser_has_token(struct parser_params *p) } static VALUE -code_loc_to_ary(const rb_code_location_t *loc) { VALUE ary = rb_ary_new_from_args(4, INT2NUM(loc->beg_pos.lineno), INT2NUM(loc->beg_pos.column), @@ -6206,9 +6245,9 @@ parser_append_tokens(struct parser_params *p, VALUE str, enum yytokentype t, int ary = rb_ary_new2(4); token_id = p->token_id; rb_ary_push(ary, INT2FIX(token_id)); - rb_ary_push(ary, ID2SYM(parser_token2id(t))); rb_ary_push(ary, str); - rb_ary_push(ary, code_loc_to_ary(p->yylloc)); rb_obj_freeze(ary); rb_ary_push(p->tokens, ary); p->token_id++; @@ -6263,13 +6302,6 @@ parser_dis_delayed_token(struct parser_params *p, enum yytokentype t, int l #define yylval_rval (*(RB_TYPE_P(yylval.val, T_NODE) ? &yylval.node->nd_rval : &yylval.val)) -static inline VALUE -intern_sym(const char *name) -{ - ID id = rb_intern_const(name); - return ID2SYM(id); -} - static int ripper_has_scan_event(struct parser_params *p) { @@ -6313,7 +6345,7 @@ ripper_dis_delayed_token(struct parser_params *p, enum yytokentype t) #endif /* RIPPER */ static inline int -is_identchar(const char *ptr, const char *MAYBE_UNUSED(ptr_end), rb_encoding *enc) { return rb_enc_isalnum((unsigned char)*ptr, enc) || *ptr == '_' || !ISASCII(*ptr); } @@ -6321,7 +6353,7 @@ is_identchar(const char *ptr, const char *MAYBE_UNUSED(ptr_end), rb_encoding *en static inline int parser_is_identchar(struct parser_params *p) { - return !(p)->eofp && is_identchar(p->lex.pcur-1, p->lex.pend, p->enc); } static inline int @@ -6424,7 +6456,7 @@ parser_precise_mbclen(struct parser_params *p, const char *ptr) } #ifndef RIPPER -static void ruby_show_error_line(VALUE errbuf, const YYLTYPE *yylloc, int lineno, VALUE str); static inline void parser_show_error_line(struct parser_params *p, const YYLTYPE *yylloc) @@ -6440,7 +6472,7 @@ parser_show_error_line(struct parser_params *p, const YYLTYPE *yylloc) else { return; } - ruby_show_error_line(p->error_buffer, yylloc, lineno, str); } static int @@ -6470,7 +6502,7 @@ parser_yyerror0(struct parser_params *p, const char *msg) } static void -ruby_show_error_line(VALUE errbuf, const YYLTYPE *yylloc, int lineno, VALUE str) { VALUE mesg; const int max_line_margin = 30; @@ -6716,12 +6748,10 @@ static void parser_prepare(struct parser_params *p); static NODE *parser_append_options(struct parser_params *p, NODE *node); static VALUE -debug_lines(VALUE fname) { - ID script_lines; - CONST_ID(script_lines, "SCRIPT_LINES__"); - if (rb_const_defined_at(rb_cObject, script_lines)) { - VALUE hash = rb_const_get_at(rb_cObject, script_lines); if (RB_TYPE_P(hash, T_HASH)) { VALUE lines = rb_ary_new(); rb_hash_aset(hash, fname, lines); @@ -6746,7 +6776,7 @@ yycompile0(VALUE arg) VALUE cov = Qfalse; if (!compile_for_eval && !NIL_P(p->ruby_sourcefile_string)) { - p->debug_lines = debug_lines(p->ruby_sourcefile_string); if (p->debug_lines && p->ruby_sourceline > 0) { VALUE str = rb_default_rs; n = p->ruby_sourceline; @@ -6783,7 +6813,7 @@ yycompile0(VALUE arg) if (n || p->error_p) { VALUE mesg = p->error_buffer; if (!mesg) { - mesg = rb_class_new_instance(0, 0, rb_eSyntaxError); } if (!p->error_tolerant) { rb_set_errinfo(mesg); @@ -6815,7 +6845,7 @@ yycompile0(VALUE arg) } static rb_ast_t * -yycompile(VALUE vparser, struct parser_params *p, VALUE fname, int line) { rb_ast_t *ast; if (NIL_P(fname)) { @@ -6831,9 +6861,8 @@ yycompile(VALUE vparser, struct parser_params *p, VALUE fname, int line) p->lvtbl = NULL; p->ast = ast = rb_ast_new(); - rb_suppress_tracing(yycompile0, (VALUE)p); p->ast = 0; - RB_GC_GUARD(vparser); /* prohibit tail call optimization */ while (p->lvtbl) { local_pop(p); @@ -6844,7 +6873,7 @@ yycompile(VALUE vparser, struct parser_params *p, VALUE fname, int line) #endif /* !RIPPER */ static rb_encoding * -must_be_ascii_compatible(VALUE s) { rb_encoding *enc = rb_enc_get(s); if (!rb_enc_asciicompat(enc)) { @@ -6878,45 +6907,37 @@ lex_getline(struct parser_params *p) { VALUE line = (*p->lex.gets)(p, p->lex.input); if (NIL_P(line)) return line; - must_be_ascii_compatible(line); if (RB_OBJ_FROZEN(line)) line = rb_str_dup(line); // needed for RubyVM::AST.of because script_lines in iseq is deep-frozen p->line_count++; return line; } -static const rb_data_type_t parser_data_type; - #ifndef RIPPER static rb_ast_t* -parser_compile_string(VALUE vparser, VALUE fname, VALUE s, int line) { - struct parser_params *p; - - TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - p->lex.gets = lex_get_str; p->lex.gets_.ptr = 0; p->lex.input = rb_str_new_frozen(s); p->lex.pbeg = p->lex.pcur = p->lex.pend = 0; - return yycompile(vparser, p, fname, line); } rb_ast_t* -rb_parser_compile_string(VALUE vparser, const char *f, VALUE s, int line) { - return rb_parser_compile_string_path(vparser, rb_filesystem_str_new_cstr(f), s, line); } rb_ast_t* -rb_parser_compile_string_path(VALUE vparser, VALUE f, VALUE s, int line) { - must_be_ascii_compatible(s); - return parser_compile_string(vparser, f, s, line); } -VALUE rb_io_gets_internal(VALUE io); - static VALUE lex_io_gets(struct parser_params *p, VALUE io) { @@ -6924,17 +6945,13 @@ lex_io_gets(struct parser_params *p, VALUE io) } rb_ast_t* -rb_parser_compile_file_path(VALUE vparser, VALUE fname, VALUE file, int start) { - struct parser_params *p; - - TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - p->lex.gets = lex_io_gets; p->lex.input = file; p->lex.pbeg = p->lex.pcur = p->lex.pend = 0; - return yycompile(vparser, p, fname, start); } static VALUE @@ -6944,18 +6961,14 @@ lex_generic_gets(struct parser_params *p, VALUE input) } rb_ast_t* -rb_parser_compile_generic(VALUE vparser, VALUE (*lex_gets)(VALUE, int), VALUE fname, VALUE input, int start) { - struct parser_params *p; - - TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - p->lex.gets = lex_generic_gets; p->lex.gets_.call = lex_gets; p->lex.input = input; p->lex.pbeg = p->lex.pcur = p->lex.pend = 0; - return yycompile(vparser, p, fname, start); } #endif /* !RIPPER */ @@ -6982,7 +6995,7 @@ enum string_type { }; static VALUE -parser_str_new(const char *ptr, long len, rb_encoding *enc, int func, rb_encoding *enc0) { VALUE str; @@ -6990,7 +7003,7 @@ parser_str_new(const char *ptr, long len, rb_encoding *enc, int func, rb_encodin if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) { if (is_ascii_string(str)) { } - else if (rb_is_usascii_enc(enc0) && enc != rb_utf8_encoding()) { rb_enc_associate(str, rb_ascii8bit_encoding()); } } @@ -7174,7 +7187,7 @@ tok_hex(struct parser_params *p, size_t *numlen) { int c; - c = scan_hex(p->lex.pcur, 2, numlen); if (!*numlen) { yyerror0("invalid hex escape"); token_flush(p); @@ -7221,10 +7234,10 @@ tokadd_codepoint(struct parser_params *p, rb_encoding **encp, int regexp_literal, int wide) { size_t numlen; - int codepoint = scan_hex(p->lex.pcur, wide ? p->lex.pend - p->lex.pcur : 4, &numlen); p->lex.pcur += numlen; if (p->lex.strterm == NULL || - (p->lex.strterm->flags & STRTERM_HEREDOC) || (p->lex.strterm->u.literal.u1.func != str_regexp)) { if (wide ? (numlen == 0 || numlen > 6) : (numlen < 4)) { literal_flush(p, p->lex.pcur); @@ -7363,7 +7376,7 @@ read_escape(struct parser_params *p, int flags, rb_encoding **encp) case '0': case '1': case '2': case '3': /* octal constant */ case '4': case '5': case '6': case '7': pushback(p, c); - c = scan_oct(p->lex.pcur, 3, &numlen); p->lex.pcur += numlen; return c; @@ -7773,22 +7786,16 @@ tokadd_string(struct parser_params *p, return c; } -static inline rb_strterm_t * -new_strterm(VALUE v1, VALUE v2, VALUE v3, VALUE v0) -{ - return (rb_strterm_t*)rb_imemo_new(imemo_parser_strterm, v1, v2, v3, v0); -} - /* imemo_parser_strterm for literal */ #define NEW_STRTERM(func, term, paren) \ - new_strterm((VALUE)(func), (VALUE)(paren), (VALUE)(term), 0) #ifdef RIPPER static void flush_string_content(struct parser_params *p, rb_encoding *enc) { VALUE content = yylval.val; - if (!ripper_is_node_yylval(content)) content = ripper_new_yylval(p, 0, 0, content); if (has_delayed_token(p)) { ptrdiff_t len = p->lex.pcur - p->lex.ptok; @@ -8058,8 +8065,7 @@ heredoc_identifier(struct parser_params *p) dis_scan_event(p, tHEREDOC_BEG); lex_goto_eol(p); - p->lex.strterm = new_strterm(0, 0, 0, p->lex.lastline); - p->lex.strterm->flags |= STRTERM_HEREDOC; rb_strterm_heredoc_t *here = &p->lex.strterm->u.heredoc; here->offset = offset; here->sourceline = p->ruby_sourceline; @@ -8092,7 +8098,7 @@ heredoc_restore(struct parser_params *p, rb_strterm_heredoc_t *here) } static int -dedent_string(VALUE string, int width) { char *str; long len; @@ -8140,7 +8146,7 @@ heredoc_dedent(struct parser_params *p, NODE *root) while (str_node) { VALUE lit = str_node->nd_lit; if (str_node->flags & NODE_FL_NEWLINE) { - dedent_string(lit, indent); } if (!prev_lit) { prev_lit = lit; @@ -8185,26 +8191,6 @@ heredoc_dedent(struct parser_params *p, VALUE array) dis2(heredoc_dedent, array, INT2NUM(indent)); return array; } - -/* - * call-seq: - * Ripper.dedent_string(input, width) -> Integer - * - * USE OF RIPPER LIBRARY ONLY. - * - * Strips up to +width+ leading whitespaces from +input+, - * and returns the stripped column width. - */ -static VALUE -parser_dedent_string(VALUE self, VALUE input, VALUE width) -{ - int wid, col; - - StringValue(input); - wid = NUM2UINT(width); - col = dedent_string(input, wid); - return INT2NUM(col); -} #endif static int @@ -9266,14 +9252,14 @@ parse_qmark(struct parser_params *p, int space_seen) if (tokadd_mbchar(p, c) == -1) return 0; } else if ((rb_enc_isalnum(c, p->enc) || c == '_') && - p->lex.pcur < p->lex.pend && is_identchar(p->lex.pcur, p->lex.pend, p->enc)) { if (space_seen) { const char *start = p->lex.pcur - 1, *ptr = start; do { int n = parser_precise_mbclen(p, ptr); if (n < 0) return -1; ptr += n; - } while (ptr < p->lex.pend && is_identchar(ptr, p->lex.pend, p->enc)); rb_warn2("`?' just followed by `%.*s' is interpreted as" \ " a conditional operator, put a space after `?'", WARN_I((int)(ptr - start)), WARN_S_L(start, (ptr - start))); @@ -9777,7 +9763,7 @@ parser_yylex(struct parser_params *p) int token_seen = p->token_seen; if (p->lex.strterm) { - if (p->lex.strterm->flags & STRTERM_HEREDOC) { token_flush(p); return here_document(p, &p->lex.strterm->u.heredoc); } @@ -10121,7 +10107,7 @@ parser_yylex(struct parser_params *p) if ((c != ':') || (c = peekc_n(p, 1)) == -1 || !(c == '\'' || c == '"' || - is_identchar((p->lex.pcur+1), p->lex.pend, p->enc))) { rb_warning0("`&' interpreted as argument prefix"); } c = tAMPER; @@ -10696,7 +10682,7 @@ literal_concat0(struct parser_params *p, VALUE head, VALUE tail) } static VALUE -string_literal_head(enum node_type htype, NODE *head) { if (htype != NODE_DSTR) return Qfalse; if (head->nd_next) { @@ -10735,7 +10721,7 @@ literal_concat(struct parser_params *p, NODE *head, NODE *tail, const YYLTYPE *l } switch (nd_type(tail)) { case NODE_STR: - if ((lit = string_literal_head(htype, head)) != Qfalse) { htype = NODE_STR; } else { @@ -10775,7 +10761,7 @@ literal_concat(struct parser_params *p, NODE *head, NODE *tail, const YYLTYPE *l } rb_discard_node(p, tail); } - else if ((lit = string_literal_head(htype, head)) != Qfalse) { if (!literal_concat0(p, lit, tail->nd_lit)) goto error; tail->nd_lit = Qnil; @@ -11235,11 +11221,11 @@ new_regexp(struct parser_params *p, VALUE re, VALUE opt, const YYLTYPE *loc) { VALUE src = 0, err; int options = 0; - if (ripper_is_node_yylval(re)) { src = RNODE(re)->nd_cval; re = RNODE(re)->nd_rval; } - if (ripper_is_node_yylval(opt)) { options = (int)RNODE(opt)->nd_tag; opt = RNODE(opt)->nd_rval; } @@ -11267,7 +11253,7 @@ static const char rb_parser_lex_state_names[][8] = { }; static VALUE -append_lex_state_name(enum lex_state_e state, VALUE buf) { int i, sep = 0; unsigned int mask = 1; @@ -11308,22 +11294,22 @@ rb_parser_trace_lex_state(struct parser_params *p, enum lex_state_e from, { VALUE mesg; mesg = rb_str_new_cstr("lex_state: "); - append_lex_state_name(from, mesg); rb_str_cat_cstr(mesg, " -> "); - append_lex_state_name(to, mesg); rb_str_catf(mesg, " at line %d\n", line); flush_debug_buffer(p, p->debug_output, mesg); return to; } VALUE -rb_parser_lex_state_name(enum lex_state_e state) { - return rb_fstring(append_lex_state_name(state, rb_str_new(0, 0))); } static void -append_bitstack_value(stack_type stack, VALUE mesg) { if (stack == 0) { rb_str_cat_cstr(mesg, "0"); @@ -11340,7 +11326,7 @@ rb_parser_show_bitstack(struct parser_params *p, stack_type stack, const char *name, int line) { VALUE mesg = rb_sprintf("%s: ", name); - append_bitstack_value(stack, mesg); rb_str_catf(mesg, " at line %d\n", line); flush_debug_buffer(p, p->debug_output, mesg); } @@ -11358,13 +11344,13 @@ rb_parser_fatal(struct parser_params *p, const char *fmt, ...) RB_GC_GUARD(mesg); mesg = rb_str_new(0, 0); - append_lex_state_name(p->lex.state, mesg); compile_error(p, "lex.state: %"PRIsVALUE, mesg); rb_str_resize(mesg, 0); - append_bitstack_value(p->cond_stack, mesg); compile_error(p, "cond_stack: %"PRIsVALUE, mesg); rb_str_resize(mesg, 0); - append_bitstack_value(p->cmdarg_stack, mesg); compile_error(p, "cmdarg_stack: %"PRIsVALUE, mesg); if (p->debug_output == rb_ractor_stdout()) p->debug_output = rb_ractor_stderr(); @@ -11527,7 +11513,7 @@ assignable(struct parser_params *p, VALUE lhs) #endif static int -is_private_local_id(ID name) { VALUE s; if (name == idUScore) return 1; @@ -11542,7 +11528,7 @@ shadowing_lvar_0(struct parser_params *p, ID name) { if (dyna_in_block(p)) { if (dvar_curr(p, name)) { - if (is_private_local_id(name)) return 1; yyerror0("duplicated argument name"); } else if (dvar_defined(p, name) || local_id(p, name)) { @@ -11555,7 +11541,7 @@ shadowing_lvar_0(struct parser_params *p, ID name) } else { if (local_id(p, name)) { - if (is_private_local_id(name)) return 1; yyerror0("duplicated argument name"); } } @@ -11768,8 +11754,6 @@ const_decl_path(struct parser_params *p, NODE **dest) return n; } -extern VALUE rb_mRubyVMFrozenCore; - static NODE * make_shareable_node(struct parser_params *p, NODE *value, bool copy, const YYLTYPE *loc) { @@ -11797,7 +11781,7 @@ ensure_shareable_node(struct parser_params *p, NODE **dest, NODE *value, const Y static int is_static_content(NODE *node); static VALUE -shareable_literal_value(NODE *node) { if (!node) return Qnil; enum node_type type = nd_type(node); @@ -11870,7 +11854,7 @@ shareable_literal_constant(struct parser_params *p, enum shareability shareable, } } if (RTEST(lit)) { - VALUE e = shareable_literal_value(elt); if (!UNDEF_P(e)) { rb_ary_push(lit, e); } @@ -11909,8 +11893,8 @@ shareable_literal_constant(struct parser_params *p, enum shareability shareable, } } if (RTEST(lit)) { - VALUE k = shareable_literal_value(key); - VALUE v = shareable_literal_value(val); if (!UNDEF_P(k) && !UNDEF_P(v)) { rb_hash_aset(lit, k, v); } @@ -12520,15 +12504,15 @@ negate_lit(struct parser_params *p, VALUE lit) } switch (BUILTIN_TYPE(lit)) { case T_BIGNUM: - BIGNUM_NEGATE(lit); lit = rb_big_norm(lit); break; case T_RATIONAL: - RATIONAL_SET_NUM(lit, negate_lit(p, RRATIONAL(lit)->num)); break; case T_COMPLEX: - RCOMPLEX_SET_REAL(lit, negate_lit(p, RCOMPLEX(lit)->real)); - RCOMPLEX_SET_IMAG(lit, negate_lit(p, RCOMPLEX(lit)->imag)); break; case T_FLOAT: lit = DBL2NUM(-RFLOAT_VALUE(lit)); @@ -12827,40 +12811,14 @@ append_literal_keys(st_data_t k, st_data_t v, st_data_t h) return ST_CONTINUE; } -static bool -hash_literal_key_p(VALUE k) -{ - switch (OBJ_BUILTIN_TYPE(k)) { - case T_NODE: - return false; - default: - return true; - } -} - -static int -literal_cmp(VALUE val, VALUE lit) -{ - if (val == lit) return 0; - if (!hash_literal_key_p(val) || !hash_literal_key_p(lit)) return -1; - return rb_iseq_cdhash_cmp(val, lit); -} - -static st_index_t -literal_hash(VALUE a) -{ - if (!hash_literal_key_p(a)) return (st_index_t)a; - return rb_iseq_cdhash_hash(a); -} - -static const struct st_hash_type literal_type = { - literal_cmp, - literal_hash, -}; - static NODE * remove_duplicate_keys(struct parser_params *p, NODE *hash) { st_table *literal_keys = st_init_table_with_size(&literal_type, hash->nd_alen / 2); NODE *result = 0; NODE *last_expr = 0; @@ -12910,7 +12868,7 @@ new_hash(struct parser_params *p, NODE *hash, const YYLTYPE *loc) static void error_duplicate_pattern_variable(struct parser_params *p, ID id, const YYLTYPE *loc) { - if (is_private_local_id(id)) { return; } if (st_is_member(p->pvtbl, id)) { @@ -13117,7 +13075,7 @@ warn_unused_var(struct parser_params *p, struct local_vars *local) ID *u = local->used->tbl; for (int i = 0; i < cnt; ++i) { if (!v[i] || (u[i] & LVAR_USED)) continue; - if (is_private_local_id(v[i])) continue; rb_warn1L((int)u[i], "assigned but unused variable - %"PRIsWARN, rb_id2str(v[i])); } #endif @@ -13522,6 +13480,7 @@ reg_fragment_check(struct parser_params* p, VALUE str, int options) return 1; } typedef struct { struct parser_params* parser; rb_encoding *enc; @@ -13571,6 +13530,30 @@ reg_named_capture_assign(struct parser_params* p, VALUE regexp, const YYLTYPE *l if (!arg.succ_block) return 0; return arg.succ_block->nd_next; } static VALUE parser_reg_compile(struct parser_params* p, VALUE str, int options) @@ -13607,7 +13590,7 @@ parser_reg_compile(struct parser_params* p, VALUE str, int options, VALUE *errms { VALUE err = rb_errinfo(); VALUE re; - str = ripper_is_node_yylval(str) ? RNODE(str)->nd_cval : str; int c = rb_reg_fragment_setenc(p, str, options); if (c) reg_fragment_enc_error(p, str, c); re = rb_parser_reg_compile(p, str, options); @@ -13621,10 +13604,8 @@ parser_reg_compile(struct parser_params* p, VALUE str, int options, VALUE *errms #ifndef RIPPER void -rb_parser_set_options(VALUE vparser, int print, int loop, int chomp, int split) { - struct parser_params *p; - TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); p->do_print = print; p->do_loop = loop; p->do_chomp = chomp; @@ -13708,12 +13689,13 @@ parser_initialize(struct parser_params *p) } #ifdef RIPPER -#define parser_mark ripper_parser_mark -#define parser_free ripper_parser_free #endif -static void -parser_mark(void *ptr) { struct parser_params *p = (struct parser_params*)ptr; @@ -13743,11 +13725,14 @@ parser_mark(void *ptr) #endif } -static void -parser_free(void *ptr) { struct parser_params *p = (struct parser_params*)ptr; struct local_vars *local, *prev; if (p->tokenbuf) { ruby_sized_xfree(p->tokenbuf, p->toksiz); @@ -13765,10 +13750,17 @@ parser_free(void *ptr) } } xfree(ptr); } -static size_t -parser_memsize(const void *ptr) { struct parser_params *p = (struct parser_params*)ptr; struct local_vars *local; @@ -13782,19 +13774,33 @@ parser_memsize(const void *ptr) return size; } -static const rb_data_type_t parser_data_type = { #ifndef RIPPER "parser", -#else - "ripper", -#endif { - parser_mark, - parser_free, - parser_memsize, }, 0, 0, RUBY_TYPED_FREE_IMMEDIATELY }; #ifndef RIPPER #undef rb_reserved_word @@ -13805,181 +13811,362 @@ rb_reserved_word(const char *str, unsigned int len) return reserved_word(str, len); } -VALUE -rb_parser_new(void) { - struct parser_params *p; - VALUE parser = TypedData_Make_Struct(0, struct parser_params, - &parser_data_type, p); - parser_initialize(p); - return parser; } -VALUE -rb_parser_set_context(VALUE vparser, const struct rb_iseq_struct *base, int main) { - struct parser_params *p; - TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); p->error_buffer = main ? Qfalse : Qnil; p->parent_iseq = base; - return vparser; } void -rb_parser_keep_script_lines(VALUE vparser) { struct parser_params *p; TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - p->keep_script_lines = 1; } -void -rb_parser_error_tolerant(VALUE vparser) { struct parser_params *p; TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - p->error_tolerant = 1; - p->end_expect_token_locations = rb_ary_new(); } -void -rb_parser_keep_tokens(VALUE vparser) { struct parser_params *p; TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - p->keep_tokens = 1; - p->tokens = rb_ary_new(); } -#endif -#ifdef RIPPER -#define rb_parser_end_seen_p ripper_parser_end_seen_p -#define rb_parser_encoding ripper_parser_encoding -#define rb_parser_get_yydebug ripper_parser_get_yydebug -#define rb_parser_set_yydebug ripper_parser_set_yydebug -#define rb_parser_get_debug_output ripper_parser_get_debug_output -#define rb_parser_set_debug_output ripper_parser_set_debug_output -static VALUE ripper_parser_end_seen_p(VALUE vparser); -static VALUE ripper_parser_encoding(VALUE vparser); -static VALUE ripper_parser_get_yydebug(VALUE self); -static VALUE ripper_parser_set_yydebug(VALUE self, VALUE flag); -static VALUE ripper_parser_get_debug_output(VALUE self); -static VALUE ripper_parser_set_debug_output(VALUE self, VALUE output); -/* - * call-seq: - * ripper.error? -> Boolean - * - * Return true if parsed source has errors. - */ -static VALUE -ripper_error_p(VALUE vparser) { struct parser_params *p; TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - return RBOOL(p->error_p); } -#endif -/* - * call-seq: - * ripper.end_seen? -> Boolean - * - * Return true if parsed source ended by +\_\_END\_\_+. - */ VALUE rb_parser_end_seen_p(VALUE vparser) { struct parser_params *p; TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - return RBOOL(p->ruby__end__seen); } -/* - * call-seq: - * ripper.encoding -> encoding - * - * Return encoding of the source. - */ -VALUE -rb_parser_encoding(VALUE vparser) { struct parser_params *p; TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); - return rb_enc_from_encoding(p->enc); } -#ifdef RIPPER -/* - * call-seq: - * ripper.yydebug -> true or false - * - * Get yydebug. - */ VALUE -rb_parser_get_yydebug(VALUE self) { struct parser_params *p; - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - return RBOOL(p->debug); } -#endif -/* - * call-seq: - * ripper.yydebug = flag - * - * Set yydebug. - */ VALUE rb_parser_set_yydebug(VALUE self, VALUE flag) { struct parser_params *p; TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - p->debug = RTEST(flag); return flag; } -/* - * call-seq: - * ripper.debug_output -> obj - * - * Get debug output. - */ VALUE -rb_parser_get_debug_output(VALUE self) { - struct parser_params *p; - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); return p->debug_output; } -/* - * call-seq: - * ripper.debug_output = obj - * - * Set debug output. - */ VALUE -rb_parser_set_debug_output(VALUE self, VALUE output) { - struct parser_params *p; - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - return p->debug_output = output; } #ifndef RIPPER #ifdef YYMALLOC #define HEAPCNT(n, size) ((n) * (size) / sizeof(YYSTYPE)) @@ -14262,377 +14449,21 @@ ripper_dis7(struct parser_params *p, ID mid, VALUE a, VALUE b, VALUE c, VAL return rb_funcall(p->value, mid, 7, a, b, c, d, e, f, g); } -static ID -ripper_get_id(VALUE v) -{ - NODE *nd; - if (!RB_TYPE_P(v, T_NODE)) return 0; - nd = (NODE *)v; - if (!nd_type_p(nd, NODE_RIPPER)) return 0; - return nd->nd_vid; -} - -static VALUE -ripper_get_value(VALUE v) -{ - NODE *nd; - if (UNDEF_P(v)) return Qnil; - if (!RB_TYPE_P(v, T_NODE)) return v; - nd = (NODE *)v; - if (!nd_type_p(nd, NODE_RIPPER)) return Qnil; - return nd->nd_rval; -} - -static void ripper_error(struct parser_params *p) { p->error_p = TRUE; } -static void -ripper_compile_error(struct parser_params *p, const char *fmt, ...) -{ - VALUE str; - va_list args; - - va_start(args, fmt); - str = rb_vsprintf(fmt, args); - va_end(args); - rb_funcall(p->value, rb_intern("compile_error"), 1, str); - ripper_error(p); -} - -static VALUE -ripper_lex_get_generic(struct parser_params *p, VALUE src) -{ - VALUE line = rb_funcallv_public(src, id_gets, 0, 0); - if (!NIL_P(line) && !RB_TYPE_P(line, T_STRING)) { - rb_raise(rb_eTypeError, - "gets returned %"PRIsVALUE" (expected String or nil)", - rb_obj_class(line)); - } - return line; -} - -static VALUE -ripper_lex_io_get(struct parser_params *p, VALUE src) -{ - return rb_io_gets(src); -} - -static VALUE -ripper_s_allocate(VALUE klass) -{ - struct parser_params *p; - VALUE self = TypedData_Make_Struct(klass, struct parser_params, - &parser_data_type, p); - p->value = self; - return self; -} - -#define ripper_initialized_p(r) ((r)->lex.input != 0) - -/* - * call-seq: - * Ripper.new(src, filename="(ripper)", lineno=1) -> ripper - * - * Create a new Ripper object. - * _src_ must be a String, an IO, or an Object which has #gets method. - * - * This method does not starts parsing. - * See also Ripper#parse and Ripper.parse. - */ -static VALUE -ripper_initialize(int argc, VALUE *argv, VALUE self) -{ - struct parser_params *p; - VALUE src, fname, lineno; - - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - rb_scan_args(argc, argv, "12", &src, &fname, &lineno); - if (RB_TYPE_P(src, T_FILE)) { - p->lex.gets = ripper_lex_io_get; - } - else if (rb_respond_to(src, id_gets)) { - p->lex.gets = ripper_lex_get_generic; - } - else { - StringValue(src); - p->lex.gets = lex_get_str; - } - p->lex.input = src; - p->eofp = 0; - if (NIL_P(fname)) { - fname = STR_NEW2("(ripper)"); - OBJ_FREEZE(fname); - } - else { - StringValueCStr(fname); - fname = rb_str_new_frozen(fname); - } - parser_initialize(p); - - p->ruby_sourcefile_string = fname; - p->ruby_sourcefile = RSTRING_PTR(fname); - p->ruby_sourceline = NIL_P(lineno) ? 0 : NUM2INT(lineno) - 1; - - return Qnil; -} - -static VALUE -ripper_parse0(VALUE parser_v) -{ - struct parser_params *p; - - TypedData_Get_Struct(parser_v, struct parser_params, &parser_data_type, p); - parser_prepare(p); - p->ast = rb_ast_new(); - ripper_yyparse((void*)p); - rb_ast_dispose(p->ast); - p->ast = 0; - return p->result; -} - -static VALUE -ripper_ensure(VALUE parser_v) -{ - struct parser_params *p; - - TypedData_Get_Struct(parser_v, struct parser_params, &parser_data_type, p); - p->parsing_thread = Qnil; - return Qnil; -} - -/* - * call-seq: - * ripper.parse - * - * Start parsing and returns the value of the root action. - */ -static VALUE -ripper_parse(VALUE self) -{ - struct parser_params *p; - - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - if (!ripper_initialized_p(p)) { - rb_raise(rb_eArgError, "method called for uninitialized object"); - } - if (!NIL_P(p->parsing_thread)) { - if (p->parsing_thread == rb_thread_current()) - rb_raise(rb_eArgError, "Ripper#parse is not reentrant"); - else - rb_raise(rb_eArgError, "Ripper#parse is not multithread-safe"); - } - p->parsing_thread = rb_thread_current(); - rb_ensure(ripper_parse0, self, ripper_ensure, self); - - return p->result; -} - -/* - * call-seq: - * ripper.column -> Integer - * - * Return column number of current parsing line. - * This number starts from 0. - */ -static VALUE -ripper_column(VALUE self) -{ - struct parser_params *p; - long col; - - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - if (!ripper_initialized_p(p)) { - rb_raise(rb_eArgError, "method called for uninitialized object"); - } - if (NIL_P(p->parsing_thread)) return Qnil; - col = p->lex.ptok - p->lex.pbeg; - return LONG2NUM(col); -} - -/* - * call-seq: - * ripper.filename -> String - * - * Return current parsing filename. - */ -static VALUE -ripper_filename(VALUE self) -{ - struct parser_params *p; - - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - if (!ripper_initialized_p(p)) { - rb_raise(rb_eArgError, "method called for uninitialized object"); - } - return p->ruby_sourcefile_string; -} - -/* - * call-seq: - * ripper.lineno -> Integer - * - * Return line number of current parsing line. - * This number starts from 1. - */ -static VALUE -ripper_lineno(VALUE self) -{ - struct parser_params *p; - - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - if (!ripper_initialized_p(p)) { - rb_raise(rb_eArgError, "method called for uninitialized object"); - } - if (NIL_P(p->parsing_thread)) return Qnil; - return INT2NUM(p->ruby_sourceline); -} - -/* - * call-seq: - * ripper.state -> Integer - * - * Return scanner state of current token. - */ -static VALUE -ripper_state(VALUE self) -{ - struct parser_params *p; - - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - if (!ripper_initialized_p(p)) { - rb_raise(rb_eArgError, "method called for uninitialized object"); - } - if (NIL_P(p->parsing_thread)) return Qnil; - return INT2NUM(p->lex.state); -} - -/* - * call-seq: - * ripper.token -> String - * - * Return the current token string. - */ -static VALUE -ripper_token(VALUE self) -{ - struct parser_params *p; - long pos, len; - - TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p); - if (!ripper_initialized_p(p)) { - rb_raise(rb_eArgError, "method called for uninitialized object"); - } - if (NIL_P(p->parsing_thread)) return Qnil; - pos = p->lex.ptok - p->lex.pbeg; - len = p->lex.pcur - p->lex.ptok; - return rb_str_subseq(p->lex.lastline, pos, len); -} - -#ifdef RIPPER_DEBUG -/* :nodoc: */ -static VALUE -ripper_assert_Qundef(VALUE self, VALUE obj, VALUE msg) -{ - StringValue(msg); - if (UNDEF_P(obj)) { - rb_raise(rb_eArgError, "%"PRIsVALUE, msg); - } - return Qnil; -} - -/* :nodoc: */ -static VALUE -ripper_value(VALUE self, VALUE obj) -{ - return ULONG2NUM(obj); -} -#endif - -/* - * call-seq: - * Ripper.lex_state_name(integer) -> string - * - * Returns a string representation of lex_state. - */ -static VALUE -ripper_lex_state_name(VALUE self, VALUE state) -{ - return rb_parser_lex_state_name(NUM2INT(state)); -} - -void -Init_ripper(void) { - ripper_init_eventids1(); - ripper_init_eventids2(); - id_warn = rb_intern_const("warn"); - id_warning = rb_intern_const("warning"); - id_gets = rb_intern_const("gets"); - id_assoc = rb_intern_const("=>"); - (void)yystpcpy; /* may not used in newer bison */ - InitVM(ripper); } -void -InitVM_ripper(void) -{ - VALUE Ripper; - - Ripper = rb_define_class("Ripper", rb_cObject); - /* version of Ripper */ - rb_define_const(Ripper, "Version", rb_usascii_str_new2(RIPPER_VERSION)); - rb_define_alloc_func(Ripper, ripper_s_allocate); - rb_define_method(Ripper, "initialize", ripper_initialize, -1); - rb_define_method(Ripper, "parse", ripper_parse, 0); - rb_define_method(Ripper, "column", ripper_column, 0); - rb_define_method(Ripper, "filename", ripper_filename, 0); - rb_define_method(Ripper, "lineno", ripper_lineno, 0); - rb_define_method(Ripper, "state", ripper_state, 0); - rb_define_method(Ripper, "token", ripper_token, 0); - rb_define_method(Ripper, "end_seen?", rb_parser_end_seen_p, 0); - rb_define_method(Ripper, "encoding", rb_parser_encoding, 0); - rb_define_method(Ripper, "yydebug", rb_parser_get_yydebug, 0); - rb_define_method(Ripper, "yydebug=", rb_parser_set_yydebug, 1); - rb_define_method(Ripper, "debug_output", rb_parser_get_debug_output, 0); - rb_define_method(Ripper, "debug_output=", rb_parser_set_debug_output, 1); - rb_define_method(Ripper, "error?", ripper_error_p, 0); -#ifdef RIPPER_DEBUG - rb_define_method(Ripper, "assert_Qundef", ripper_assert_Qundef, 2); - rb_define_method(Ripper, "rawVALUE", ripper_value, 1); - rb_define_method(Ripper, "validate_object", ripper_validate_object, 1); -#endif - - rb_define_singleton_method(Ripper, "dedent_string", parser_dedent_string, 2); - rb_define_private_method(Ripper, "dedent_string", parser_dedent_string, 2); - - rb_define_singleton_method(Ripper, "lex_state_name", ripper_lex_state_name, 1); - -<% @exprs.each do |expr, desc| -%> - /* <%=desc%> */ - rb_define_const(Ripper, "<%=expr%>", INT2NUM(<%=expr%>)); -<% end %> - ripper_init_eventids1_table(Ripper); - ripper_init_eventids2_table(Ripper); - -# if 0 - /* Hack to let RDoc document SCRIPT_LINES__ */ - - /* - * When a Hash is assigned to +SCRIPT_LINES__+ the contents of files loaded - * after the assignment will be added as an Array of lines with the file - * name as the key. - */ - rb_define_global_const("SCRIPT_LINES__", Qnil); -#endif - -} #endif /* RIPPER */ - /* * Local variables: * mode: c @@ -0,0 +1,564 @@ @@ -0,0 +1,133 @@ @@ -0,0 +1,2118 @@ @@ -0,0 +1,165 @@ @@ -0,0 +1,106 @@ @@ -53,7 +53,7 @@ #include "internal/loadpath.h" #include "internal/missing.h" #include "internal/object.h" -#include "internal/parse.h" #include "internal/variable.h" #include "ruby/encoding.h" #include "ruby/thread.h" @@ -0,0 +1,983 @@ @@ -0,0 +1,642 @@ @@ -86,6 +86,7 @@ Prelude.new(output, ARGV, vpath).instance_eval do */ %unless @preludes.empty? #include "internal.h" #include "internal/warnings.h" #include "iseq.h" #include "ruby/ruby.h" @@ -111,6 +111,7 @@ FILES_NEED_VPATH = %w[ ext/ripper/eventids1.c ext/ripper/eventids2table.c ext/ripper/ripper.c golf_prelude.c id.c id.h @@ -0,0 +1,400 @@ @@ -20,9 +20,9 @@ #include "internal/gc.h" #include "internal/inits.h" #include "internal/object.h" -#include "internal/parse.h" #include "internal/proc.h" #include "internal/re.h" #include "internal/symbol.h" #include "internal/thread.h" #include "internal/vm.h" |