diff options
56 files changed, 2601 insertions, 1669 deletions
@@ -45,3 +45,4 @@ of this list. RIZAL Reckordp Rory O'Connell John Bampton + Seeker diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 000000000..9f91caaf8 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @matz @@ -1,4 +1,4 @@ -Copyright (c) 2020 mruby developers +Copyright (c) 2010-2021 mruby developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -1,4 +1,4 @@ -# mruby is using Rake (http://rake.rubyforge.org) as a build tool. +# mruby is using Rake (https://ruby.github.io/rake/) as a build tool. RAKE = rake @@ -25,12 +25,11 @@ end # load custom rules load "#{MRUBY_ROOT}/tasks/core.rake" load "#{MRUBY_ROOT}/tasks/mrblib.rake" - load "#{MRUBY_ROOT}/tasks/mrbgems.rake" load "#{MRUBY_ROOT}/tasks/libmruby.rake" - +load "#{MRUBY_ROOT}/tasks/bin.rake" +load "#{MRUBY_ROOT}/tasks/presym.rake" load "#{MRUBY_ROOT}/tasks/benchmark.rake" - load "#{MRUBY_ROOT}/tasks/gitlab.rake" load "#{MRUBY_ROOT}/tasks/doc.rake" @@ -38,219 +37,19 @@ load "#{MRUBY_ROOT}/tasks/doc.rake" # generic build targets, rules task :default => :all -bin_path = ENV['INSTALL_DIR'] || "#{MRUBY_ROOT}/bin" - -if MRuby.targets['host'] - target = MRuby.targets['host'] - depfiles = target.bins.map do |bin| - install_path = target.exefile("#{bin_path}/#{bin}") - source_path = target.exefile("#{target.build_dir}/bin/#{bin}") - - file install_path => source_path do |t| - install_D t.prerequisites.first, t.name - end - install_path - end -else - depfiles = [] -end - -cfiles = Dir.glob("#{MRUBY_ROOT}/src/*.c") -rbfiles = Dir.glob("#{MRUBY_ROOT}/mrblib/**/*.rb") -psfiles = [] -MRuby.each_target do |target| - gems.each do |gem| - current_dir = gem.dir.relative_path_from(Dir.pwd) - relative_from_root = gem.dir.relative_path_from(MRUBY_ROOT) - current_build_dir = File.expand_path "#{build_dir}/#{relative_from_root}" - - if current_build_dir !~ /^#{Regexp.escape(build_dir)}/ - current_build_dir = "#{build_dir}/mrbgems/#{gem.name}" - end - - gem.bins.each do |bin| - exec = exefile("#{build_dir}/bin/#{bin}") - objs = Dir.glob("#{current_dir}/tools/#{bin}/*.{c,cpp,cxx,cc}").map { |f| objfile(f.pathmap("#{current_build_dir}/tools/#{bin}/%n")) } - - file exec => objs + target.libraries do |t| - gem_flags = gems.map { |g| g.linker.flags } - gem_flags_before_libraries = gems.map { |g| g.linker.flags_before_libraries } - gem_flags_after_libraries = gems.map { |g| g.linker.flags_after_libraries } - gem_libraries = gems.map { |g| g.linker.libraries } - gem_library_paths = gems.map { |g| g.linker.library_paths } - linker.run t.name, t.prerequisites, gem_libraries, gem_library_paths, gem_flags, gem_flags_before_libraries, gem_flags_after_libraries - end - - if target == MRuby.targets['host'] - install_path = MRuby.targets['host'].exefile("#{bin_path}/#{bin}") - - file install_path => exec do |t| - install_D t.prerequisites.first, t.name - end - depfiles += [ install_path ] - else - depfiles += [ exec ] - end - end - - cfiles += Dir.glob(gem.dir+"/{src,core,tools/*}/*.c") - if gem.cdump? - rbfiles += Dir.glob(gem.dir+"/mrblib/**/*.rb") - psfiles += Dir.glob(gem.dir+"/**/presym") - end - end -end - -mkdir_p "#{MRUBY_ROOT}/build" -symbols = [] -psfiles.each do |file| - symbols += File.readlines(file).grep_v(/^# /) -end -symbols.each{|x| x.chomp!} -presym_file="#{MRUBY_ROOT}/build/presym" -presym_inc="#{presym_file}.inc" -op_table = { - "!" => "not", - "!=" => "neq", - "!~" => "nmatch", - "%" => "mod", - "&" => "and", - "&&" => "andand", - "*" => "mul", - "**" => "pow", - "+" => "add", - "+@" => "plus", - "-" => "sub", - "-@" => "minus", - "/" => "div", - "<" => "lt", - "<=" => "le", - "<<" => "lshift", - "<=>" => "cmp", - "==" => "eq", - "===" => "eqq", - "=~" => "match", - ">" => "gt", - ">=" => "ge", - ">>" => "rshift", - "[]" => "aref", - "[]=" => "aset", - "^" => "xor", - "`" => "tick", - "|" => "or", - "||" => "oror", - "~" => "neg", -} -macro_to_symbol = { -# Macro Symbol -# [prefix, suffix] => [prefix, suffix] - ["CV" , "" ] => ["@@" , "" ], - ["IV" , "" ] => ["@" , "" ], - ["" , "_B" ] => ["" , "!" ], - ["" , "_Q" ] => ["" , "?" ], - ["" , "_E" ] => ["" , "=" ], - ["" , "" ] => ["" , "" ], -} - -file presym_file => cfiles+rbfiles+psfiles+[__FILE__] do - prefix_re = Regexp.union(*macro_to_symbol.keys.map(&:first).uniq) - suffix_re = Regexp.union(*macro_to_symbol.keys.map(&:last).uniq) - macro_re = /MRB_(#{prefix_re})SYM(#{suffix_re})\((\w+)\)/o - csymbols = cfiles.map do |f| - src = File.read(f) - src.gsub!(/\/\/.+(\n|$)/, "\n") - [src.scan(/intern_lit\([^\n"]*"([^\n "]*)"/), - src.scan(/mrb_define_method\([^\n"]*"([^\n"]*)"/), - src.scan(/mrb_define_class_method\([^\n"]*"([^\n"]*)"/), - src.scan(/mrb_define_class\([^\n"]*"([^\n"]*)"/), - src.scan(/mrb_define_module\([^\n"]*"([^\n"]*)"/), - src.scan(/mrb_define_module_function\([^\n"]*"([^\n"]*)"/), - src.scan(/mrb_define_const\([^\n"]*"([^\n"]*)"/), - src.scan(/mrb_define_global_const\([^\n"]*"([^\n"]*)"/), - src.scan(macro_re).map{|prefix, suffix, name| - macro_to_symbol[[prefix, suffix]] * name - }] - end - csymbols += File.readlines("#{MRUBY_ROOT}/include/mruby.h").grep(/define E_/).join.scan(/MRB_SYM\((\w+)\)/) - - rbsymbols = rbfiles.map do |f| - src = File.read(f) - src.force_encoding(Encoding::BINARY) - [src.scan(/\bclass +([A-Z]\w*)/), - src.scan(/\bmodule +([A-Z]\w*)/), - src.scan(/\bdef +(\w+[!?=]?)/), - src.scan(/\balias +(\w+[!?]?)/), - src.scan(/\b([A-Z]\w*) *=[^=]/), - src.scan(/(\$[a-zA-Z_]\w*)/), - src.scan(/(\$[$!?0-9]\w*)/), - src.scan(/(@@?[a-zA-Z_]\w*)/), - src.scan(/[^.]\.([a-zA-Z_]\w*[!?]?)/), - src.scan(/\.([a-zA-Z_]\w* *=)/).map{|x|x.map{|s|s.gsub(' ', '')}}, - src.scan(/\b([a-zA-Z_]\w*):/), - src.scan(/:([a-zA-Z_]\w*[!?=]?)/), - src.scan(/[\(\[\{ ]:"([^"]+)"/).map{|x|x.map{|s|s.gsub('\#', '#')}}, - src.scan(/[ \(\[\{]:'([^']+)'/) - ] - end - symbols = (symbols+csymbols+rbsymbols+op_table.keys).flatten.compact.uniq.grep_v(/#/).map{|x| x.gsub("\n", '\n')}.sort_by!{|x| [x.bytesize, x]} - presyms = File.readlines(presym_file) rescue [] - presyms.each{|x| x.chomp!} - if presyms != symbols - _pp "GEN", presym_file.relative_path - File.write(presym_file, symbols.join("\n")) - Rake::Task[presym_inc].invoke - end -end - -task presym_inc do - presyms = File.readlines(presym_file) - presyms.each{|x| x.chomp!} - symbol_to_macro = macro_to_symbol.invert - prefix_re = Regexp.union(*symbol_to_macro.keys.map(&:first).uniq) - suffix_re = Regexp.union(*symbol_to_macro.keys.map(&:last).uniq) - sym_re = /\A(#{prefix_re})?([\w&&\D]\w*)(#{suffix_re})?\z/o - _pp "GEN", presym_inc.relative_path - File.open(presym_inc, "w") do |f| - f.puts "/* MRB_PRESYM_NAMED(lit, num, type, name) */" - f.puts "/* MRB_PRESYM_UNNAMED(lit, num) */" - presyms.each.with_index(1) do |sym, num| - if sym_re =~ sym && (affixes = symbol_to_macro[[$1, $3]]) - f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, #{affixes * 'SYM'}, #{$2})| - elsif name = op_table[sym] - f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, OPSYM, #{name})| - elsif - f.puts %|MRB_PRESYM_UNNAMED("#{sym}", #{num})| - end - end - f.print "#define MRB_PRESYM_MAX #{presyms.size}" - end -end - -desc "preallocated symbols" -task :gensym => presym_file - -depfiles += MRuby.targets.map { |n, t| - t.libmruby_enabled? ? t.libraries : t.libmruby_core_static -}.flatten - -depfiles += MRuby.targets.reject { |n, t| n == 'host' }.map { |n, t| - t.bins.map { |bin| t.exefile("#{t.build_dir}/bin/#{bin}") } -}.flatten - desc "build all targets, install (locally) in-repo" -task :all => :build do +task :all => :gensym do + Rake::Task[:build].invoke puts puts "Build summary:" puts - MRuby.each_target do - print_build_summary + MRuby.each_target do |build| + build.print_build_summary end MRuby::Lockfile.write end -task :build => :gensym do - depfiles.each {|dep| Rake::Task[dep].invoke} -end +task :build => MRuby.targets.flat_map{|_, build| build.products} desc "run all mruby tests" task :test @@ -274,19 +73,17 @@ end desc "clean all built and in-repo installed artifacts" task :clean do - MRuby.each_target do |t| - rm_rf t.build_dir + MRuby.each_target do |build| + rm_rf build.products + rm_rf build.build_dir end - rm_f depfiles - rm_f presym_file - rm_f presym_inc puts "Cleaned up target build folder" end desc "clean everything!" task :deep_clean => ["clean", "clean_doc"] do - MRuby.each_target do |t| - rm_rf t.gem_clone_dir + MRuby.each_target do |build| + rm_rf build.gem_clone_dir end puts "Cleaned up mrbgems build folder" end diff --git a/build_config/ArduinoDue.rb b/build_config/ArduinoDue.rb index a5d6102c0..ba7271633 100644 --- a/build_config/ArduinoDue.rb +++ b/build_config/ArduinoDue.rb @@ -1,5 +1,5 @@ # Cross Compiling configuration for Arduino Due -# http://arduino.cc/en/Main/ArduinoBoardDue +# https://arduino.cc/en/Main/ArduinoBoardDue # # Requires Arduino IDE >= 1.5 MRuby::CrossBuild.new("ArduinoDue") do |conf| diff --git a/build_config/chipKITMax32.rb b/build_config/chipKITMax32.rb index 2a8ebe16d..4fe8b4ba2 100644 --- a/build_config/chipKITMax32.rb +++ b/build_config/chipKITMax32.rb @@ -1,5 +1,5 @@ # Cross Compiling configuration for Digilent chipKIT Max32 -# http://www.digilentinc.com/Products/Detail.cfm?Prod=CHIPKIT-MAX32 +# https://www.digilentinc.com/Products/Detail.cfm?Prod=CHIPKIT-MAX32 # # Requires MPIDE (https://github.com/chipKIT32/chipKIT32-MAX) # diff --git a/build_config/ci/msvc.rb b/build_config/ci/msvc.rb index e084a6a36..2df2d4864 100644 --- a/build_config/ci/msvc.rb +++ b/build_config/ci/msvc.rb @@ -1,6 +1,6 @@ def setup_option(conf) - conf.cc.flags[0].delete("/Zi") unless ENV['CFLAGS'] - conf.cxx.flags[0].delete("/Zi") unless ENV['CFLAGS'] || ENV['CXXFLAGS'] + conf.cc.compile_options.sub!(%r{/Zi }, "") unless ENV['CFLAGS'] + conf.cxx.compile_options.sub!(%r{/Zi }, "") unless ENV['CFLAGS'] || ENV['CXXFLAGS'] conf.linker.flags << "/DEBUG:NONE" unless ENV['LDFLAGS'] end diff --git a/build_config/gameboyadvance.rb b/build_config/gameboyadvance.rb new file mode 100644 index 000000000..964dc7af1 --- /dev/null +++ b/build_config/gameboyadvance.rb @@ -0,0 +1,73 @@ +# Cross Compiling configuration for the Nintendo GameBoyAdvance. +# This configuration requires devkitARM +# https://devkitpro.org/wiki/Getting_Started/devkitARM +# +# Tested only on GNU/Linux +# +MRuby::CrossBuild.new("gameboyadvance") do |conf| + toolchain :gcc + + DEVKITPRO_PATH = "/opt/devkitpro" + BIN_PATH = "#{DEVKITPRO_PATH}/devkitARM/bin" + + # C compiler + conf.cc do |cc| + cc.command = "#{BIN_PATH}/arm-none-eabi-gcc" + cc.flags << ["-mthumb-interwork", "-mthumb", "-O2"] + cc.compile_options = %(%{flags} -o "%{outfile}" -c "%{infile}") + end + + # C++ compiler + conf.cxx do |cxx| + cxx.command = "#{BIN_PATH}/arm-none-eabi-g++" + cxx.include_paths = conf.cc.include_paths.dup + cxx.flags = conf.cc.flags.dup + cxx.flags << %w[-fno-rtti -fno-exceptions] + cxx.defines = conf.cc.defines.dup + cxx.compile_options = conf.cc.compile_options.dup + end + + # Linker + conf.linker do |linker| + linker.command = "#{BIN_PATH}/arm-none-eabi-gcc" + linker.flags << ["-mthumb-interwork", "-mthumb", "-specs=gba.specs"] + end + + # No executables + conf.bins = [] + + # Do not build executable test + conf.build_mrbtest_lib_only + + # Disable C++ exception + conf.disable_cxx_exception + + # Gems from core + # removing mruby-io + conf.gem core: "mruby-metaprog" + conf.gem core: "mruby-pack" + conf.gem core: "mruby-sprintf" + conf.gem core: "mruby-print" + conf.gem core: "mruby-math" + conf.gem core: "mruby-time" + conf.gem core: "mruby-struct" + conf.gem core: "mruby-compar-ext" + conf.gem core: "mruby-enum-ext" + conf.gem core: "mruby-string-ext" + conf.gem core: "mruby-numeric-ext" + conf.gem core: "mruby-array-ext" + conf.gem core: "mruby-hash-ext" + conf.gem core: "mruby-range-ext" + conf.gem core: "mruby-proc-ext" + conf.gem core: "mruby-symbol-ext" + conf.gem core: "mruby-random" + conf.gem core: "mruby-object-ext" + conf.gem core: "mruby-objectspace" + conf.gem core: "mruby-fiber" + conf.gem core: "mruby-enumerator" + conf.gem core: "mruby-enum-lazy" + conf.gem core: "mruby-toplevel-ext" + conf.gem core: "mruby-kernel-ext" + conf.gem core: "mruby-class-ext" + conf.gem core: "mruby-compiler" +end diff --git a/build_config/mrbc.rb b/build_config/mrbc.rb new file mode 100644 index 000000000..95444b936 --- /dev/null +++ b/build_config/mrbc.rb @@ -0,0 +1,11 @@ +MRuby::Build.new do |conf| + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + conf.toolchain :visualcpp + else + conf.toolchain :gcc + end + + conf.build_mrbc_exec + conf.disable_libmruby + conf.disable_presym +end diff --git a/include/mruby.h b/include/mruby.h index 6f58fd7cd..ccb76ebe4 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -1,7 +1,7 @@ /* ** mruby - An embeddable Ruby implementation ** -** Copyright (c) mruby developers 2010-2020 +** Copyright (c) mruby developers 2010-2021 ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the @@ -93,7 +93,6 @@ #include <mruby/common.h> #include <mruby/value.h> #include <mruby/gc.h> -#include <mruby/presym.h> #include <mruby/version.h> #ifndef MRB_NO_FLOAT @@ -1410,6 +1409,8 @@ MRB_API void mrb_show_copyright(mrb_state *mrb); MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...); +#include <mruby/presym.h> + #if 0 /* memcpy and memset does not work with gdb reverse-next on my box */ /* use naive memcpy and memset instead */ diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 9b062e60b..8159cd696 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -99,6 +99,9 @@ enum mrb_string_type { /* heredoc structure */ struct mrb_parser_heredoc_info { mrb_bool allow_indent:1; + mrb_bool remove_indent:1; + size_t indent; + mrb_ast_node *indented; mrb_bool line_head:1; enum mrb_string_type type; const char *term; diff --git a/include/mruby/presym.h b/include/mruby/presym.h index fd08a24da..fd326c758 100644 --- a/include/mruby/presym.h +++ b/include/mruby/presym.h @@ -7,42 +7,36 @@ #ifndef MRUBY_PRESYM_H #define MRUBY_PRESYM_H -#undef MRB_PRESYM_MAX -#ifdef MRB_USE_ALL_SYMBOLS -#define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num), +#if defined(MRB_PRESYM_SCANNING) +# include <mruby/presym/scanning.h> +#elif defined(MRB_NO_PRESYM) +# include <mruby/presym/disable.h> #else -#define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num<<1), +# include <mruby/presym/enable.h> #endif -#define MRB_PRESYM_UNNAMED(lit, num) - -enum mruby_presym { -#include <../build/presym.inc> -}; - -#undef MRB_PRESYM_NAMED -#undef MRB_PRESYM_UNNAMED /* - * For `MRB_OPSYM`, specify the names corresponding to operators (refer to - * `op_table` in `Rakefile` for the names that can be specified for it). - * Other than that, describe only word characters excluding leading and - * ending punctuations. + * Where `mrb_intern_lit` is allowed for symbol interning, it is directly + * replaced by the symbol ID if presym is enabled by using the following + * macros. + * + * MRB_OPSYM(xor) //=> ^ (Operator) + * MRB_CVSYM(xor) //=> @@xor (Class Variable) + * MRB_IVSYM(xor) //=> @xor (Instance Variable) + * MRB_SYM_B(xor) //=> xor! (Method with Bang) + * MRB_SYM_Q(xor) //=> xor? (Method with Question mark) + * MRB_SYM_E(xor) //=> xor= (Method with Equal) + * MRB_SYM(xor) //=> xor (Word characters) + * + * For `MRB_OPSYM`, specify the names corresponding to operators (see + * `MRuby::Presym::OPERATORS` in `lib/mruby/presym.rb for the names that can + * be specified for it). Other than that, describe only word characters + * excluding leading and ending punctuations. * - * Example: - * MRB_OPSYM(and) //=> & - * MRB_CVSYM(foo) //=> @@foo - * MRB_IVSYM(foo) //=> @foo - * MRB_SYM_B(foo) //=> foo! - * MRB_SYM_Q(foo) //=> foo? - * MRB_SYM_E(foo) //=> foo= - * MRB_SYM(foo) //=> foo + * These macros are expanded to `mrb_intern_lit` if presym is disabled, + * therefore the mruby state variable is required. The above macros can be + * used when the variable name is `mrb`. If you want to use other variable + * names, you need to use macros with `_2` suffix, such as `MRB_SYM_2`. */ -#define MRB_OPSYM(name) MRB_OPSYM__##name /* Operator */ -#define MRB_CVSYM(name) MRB_CVSYM__##name /* Class Variable */ -#define MRB_IVSYM(name) MRB_IVSYM__##name /* Instance Variable */ -#define MRB_SYM_B(name) MRB_SYM_B__##name /* Method with Bang */ -#define MRB_SYM_Q(name) MRB_SYM_Q__##name /* Method with Question mark */ -#define MRB_SYM_E(name) MRB_SYM_E__##name /* Method with Equal */ -#define MRB_SYM(name) MRB_SYM__##name /* Word characters */ #endif /* MRUBY_PRESYM_H */ diff --git a/include/mruby/presym/disable.h b/include/mruby/presym/disable.h new file mode 100644 index 000000000..477405225 --- /dev/null +++ b/include/mruby/presym/disable.h @@ -0,0 +1,68 @@ +/** +** @file mruby/presym/scanning.h - Disable Preallocated Symbols +** +** See Copyright Notice in mruby.h +*/ + +#ifndef MRUBY_PRESYM_DISABLE_H +#define MRUBY_PRESYM_DISABLE_H + +#include <string.h> + +#define MRB_PRESYM_MAX 0 + +#define MRB_OPSYM(name) MRB_OPSYM__##name(mrb) +#define MRB_CVSYM(name) mrb_intern_lit(mrb, "@@" #name) +#define MRB_IVSYM(name) mrb_intern_lit(mrb, "@" #name) +#define MRB_SYM_B(name) mrb_intern_lit(mrb, #name "!") +#define MRB_SYM_Q(name) mrb_intern_lit(mrb, #name "?") +#define MRB_SYM_E(name) mrb_intern_lit(mrb, #name "=") +#define MRB_SYM(name) mrb_intern_lit(mrb, #name) + +#define MRB_OPSYM_2(mrb, name) MRB_OPSYM__##name(mrb) +#define MRB_CVSYM_2(mrb, name) mrb_intern_lit(mrb, "@@" #name) +#define MRB_IVSYM_2(mrb, name) mrb_intern_lit(mrb, "@" #name) +#define MRB_SYM_B_2(mrb, name) mrb_intern_lit(mrb, #name "!") +#define MRB_SYM_Q_2(mrb, name) mrb_intern_lit(mrb, #name "?") +#define MRB_SYM_E_2(mrb, name) mrb_intern_lit(mrb, #name "=") +#define MRB_SYM_2(mrb, name) mrb_intern_lit(mrb, #name) + +#define MRB_OPSYM__not(mrb) mrb_intern_lit(mrb, "!") +#define MRB_OPSYM__mod(mrb) mrb_intern_lit(mrb, "%") +#define MRB_OPSYM__and(mrb) mrb_intern_lit(mrb, "&") +#define MRB_OPSYM__mul(mrb) mrb_intern_lit(mrb, "*") +#define MRB_OPSYM__add(mrb) mrb_intern_lit(mrb, "+") +#define MRB_OPSYM__sub(mrb) mrb_intern_lit(mrb, "-") +#define MRB_OPSYM__div(mrb) mrb_intern_lit(mrb, "/") +#define MRB_OPSYM__lt(mrb) mrb_intern_lit(mrb, "<") +#define MRB_OPSYM__gt(mrb) mrb_intern_lit(mrb, ">") +#define MRB_OPSYM__xor(mrb) mrb_intern_lit(mrb, "^") +#define MRB_OPSYM__tick(mrb) mrb_intern_lit(mrb, "`") +#define MRB_OPSYM__or(mrb) mrb_intern_lit(mrb, "|") +#define MRB_OPSYM__neg(mrb) mrb_intern_lit(mrb, "~") +#define MRB_OPSYM__neq(mrb) mrb_intern_lit(mrb, "!=") +#define MRB_OPSYM__nmatch(mrb) mrb_intern_lit(mrb, "!~") +#define MRB_OPSYM__andand(mrb) mrb_intern_lit(mrb, "&&") +#define MRB_OPSYM__pow(mrb) mrb_intern_lit(mrb, "**") +#define MRB_OPSYM__plus(mrb) mrb_intern_lit(mrb, "+@") +#define MRB_OPSYM__minus(mrb) mrb_intern_lit(mrb, "-@") +#define MRB_OPSYM__lshift(mrb) mrb_intern_lit(mrb, "<<") +#define MRB_OPSYM__le(mrb) mrb_intern_lit(mrb, "<=") +#define MRB_OPSYM__eq(mrb) mrb_intern_lit(mrb, "==") +#define MRB_OPSYM__match(mrb) mrb_intern_lit(mrb, "=~") +#define MRB_OPSYM__ge(mrb) mrb_intern_lit(mrb, ">=") +#define MRB_OPSYM__rshift(mrb) mrb_intern_lit(mrb, ">>") +#define MRB_OPSYM__aref(mrb) mrb_intern_lit(mrb, "[]") +#define MRB_OPSYM__oror(mrb) mrb_intern_lit(mrb, "||") +#define MRB_OPSYM__cmp(mrb) mrb_intern_lit(mrb, "<=>") +#define MRB_OPSYM__eqq(mrb) mrb_intern_lit(mrb, "===") +#define MRB_OPSYM__aset(mrb) mrb_intern_lit(mrb, "[]=") + +#define MRB_PRESYM_DEFINE_VAR_AND_INITER(name, size, ...) \ + static mrb_sym name[size]; \ + static void init_##name(mrb_state *mrb) { \ + mrb_sym name__[] = {__VA_ARGS__}; \ + memcpy(name, name__, sizeof(name)); \ + } + +#endif /* MRUBY_PRESYM_DISABLE_H */ diff --git a/include/mruby/presym/enable.h b/include/mruby/presym/enable.h new file mode 100644 index 000000000..0aec7274d --- /dev/null +++ b/include/mruby/presym/enable.h @@ -0,0 +1,45 @@ +/** +** @file mruby/presym/scanning.h - Enable Preallocated Symbols +** +** See Copyright Notice in mruby.h +*/ + +#ifndef MRUBY_PRESYM_ENABLE_H +#define MRUBY_PRESYM_ENABLE_H + +#undef MRB_PRESYM_MAX +#ifdef MRB_USE_ALL_SYMBOLS +# define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num), +#else +# define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num<<1), +#endif +#define MRB_PRESYM_UNNAMED(lit, num) + +enum mruby_presym { +# include <mruby/presym.inc> +}; + +#undef MRB_PRESYM_NAMED +#undef MRB_PRESYM_UNNAMED + +#define MRB_OPSYM(name) MRB_OPSYM__##name +#define MRB_CVSYM(name) MRB_CVSYM__##name +#define MRB_IVSYM(name) MRB_IVSYM__##name +#define MRB_SYM_B(name) MRB_SYM_B__##name +#define MRB_SYM_Q(name) MRB_SYM_Q__##name +#define MRB_SYM_E(name) MRB_SYM_E__##name +#define MRB_SYM(name) MRB_SYM__##name + +#define MRB_OPSYM_2(mrb, name) MRB_OPSYM__##name +#define MRB_CVSYM_2(mrb, name) MRB_CVSYM__##name +#define MRB_IVSYM_2(mrb, name) MRB_IVSYM__##name +#define MRB_SYM_B_2(mrb, name) MRB_SYM_B__##name +#define MRB_SYM_Q_2(mrb, name) MRB_SYM_Q__##name +#define MRB_SYM_E_2(mrb, name) MRB_SYM_E__##name +#define MRB_SYM_2(mrb, name) MRB_SYM__##name + +#define MRB_PRESYM_DEFINE_VAR_AND_INITER(name, size, ...) \ + static const mrb_sym name[] = {__VA_ARGS__}; \ + static void init_##name(mrb_state *mrb) {} + +#endif /* MRUBY_PRESYM_ENABLE_H */ diff --git a/include/mruby/presym/scanning.h b/include/mruby/presym/scanning.h new file mode 100644 index 000000000..11a3ba312 --- /dev/null +++ b/include/mruby/presym/scanning.h @@ -0,0 +1,69 @@ +/** +** @file mruby/presym/scanning.h - Scanning Preallocated Symbols +** +** See Copyright Notice in mruby.h +*/ + +#ifndef MRUBY_PRESYM_SCANNING_H +#define MRUBY_PRESYM_SCANNING_H + +#define MRB_PRESYM_SCANNING_TAGGED(arg) <@! arg !@> + +#undef mrb_intern_lit +#define mrb_intern_lit(mrb, name) MRB_PRESYM_SCANNING_TAGGED(name) +#define mrb_define_method(mrb, c, name, f, a) MRB_PRESYM_SCANNING_TAGGED(name) +#define mrb_define_class_method(mrb, c, name, f, a) MRB_PRESYM_SCANNING_TAGGED(name) +#define mrb_define_class(mrb, name, s) MRB_PRESYM_SCANNING_TAGGED(name) +#define mrb_define_module(mrb, name) MRB_PRESYM_SCANNING_TAGGED(name) +#define mrb_define_module_function(mrb, c, name, f, s) MRB_PRESYM_SCANNING_TAGGED(name) +#define mrb_define_const(mrb, c, name, v) MRB_PRESYM_SCANNING_TAGGED(name) +#define mrb_define_global_const(mrb, name, v) MRB_PRESYM_SCANNING_TAGGED(name) + +#define MRB_OPSYM(name) MRB_OPSYM__##name(mrb) +#define MRB_CVSYM(name) MRB_PRESYM_SCANNING_TAGGED("@@" #name) +#define MRB_IVSYM(name) MRB_PRESYM_SCANNING_TAGGED("@" #name) +#define MRB_SYM_B(name) MRB_PRESYM_SCANNING_TAGGED(#name "!") +#define MRB_SYM_Q(name) MRB_PRESYM_SCANNING_TAGGED(#name "?") +#define MRB_SYM_E(name) MRB_PRESYM_SCANNING_TAGGED(#name "=") +#define MRB_SYM(name) MRB_PRESYM_SCANNING_TAGGED(#name) + +#define MRB_OPSYM_2(mrb, name) MRB_OPSYM__##name(mrb) +#define MRB_CVSYM_2(mrb, name) MRB_PRESYM_SCANNING_TAGGED("@@" #name) +#define MRB_IVSYM_2(mrb, name) MRB_PRESYM_SCANNING_TAGGED("@" #name) +#define MRB_SYM_B_2(mrb, name) MRB_PRESYM_SCANNING_TAGGED(#name "!") +#define MRB_SYM_Q_2(mrb, name) MRB_PRESYM_SCANNING_TAGGED(#name "?") +#define MRB_SYM_E_2(mrb, name) MRB_PRESYM_SCANNING_TAGGED(#name "=") +#define MRB_SYM_2(mrb, name) MRB_PRESYM_SCANNING_TAGGED(#name) + +#define MRB_OPSYM__not(mrb) MRB_PRESYM_SCANNING_TAGGED("!") +#define MRB_OPSYM__mod(mrb) MRB_PRESYM_SCANNING_TAGGED("%") +#define MRB_OPSYM__and(mrb) MRB_PRESYM_SCANNING_TAGGED("&") +#define MRB_OPSYM__mul(mrb) MRB_PRESYM_SCANNING_TAGGED("*") +#define MRB_OPSYM__add(mrb) MRB_PRESYM_SCANNING_TAGGED("+") +#define MRB_OPSYM__sub(mrb) MRB_PRESYM_SCANNING_TAGGED("-") +#define MRB_OPSYM__div(mrb) MRB_PRESYM_SCANNING_TAGGED("/") +#define MRB_OPSYM__lt(mrb) MRB_PRESYM_SCANNING_TAGGED("<") +#define MRB_OPSYM__gt(mrb) MRB_PRESYM_SCANNING_TAGGED(">") +#define MRB_OPSYM__xor(mrb) MRB_PRESYM_SCANNING_TAGGED("^") +#define MRB_OPSYM__tick(mrb) MRB_PRESYM_SCANNING_TAGGED("`") +#define MRB_OPSYM__or(mrb) MRB_PRESYM_SCANNING_TAGGED("|") +#define MRB_OPSYM__neg(mrb) MRB_PRESYM_SCANNING_TAGGED("~") +#define MRB_OPSYM__neq(mrb) MRB_PRESYM_SCANNING_TAGGED("!=") +#define MRB_OPSYM__nmatch(mrb) MRB_PRESYM_SCANNING_TAGGED("!~") +#define MRB_OPSYM__andand(mrb) MRB_PRESYM_SCANNING_TAGGED("&&") +#define MRB_OPSYM__pow(mrb) MRB_PRESYM_SCANNING_TAGGED("**") +#define MRB_OPSYM__plus(mrb) MRB_PRESYM_SCANNING_TAGGED("+@") +#define MRB_OPSYM__minus(mrb) MRB_PRESYM_SCANNING_TAGGED("-@") +#define MRB_OPSYM__lshift(mrb) MRB_PRESYM_SCANNING_TAGGED("<<") +#define MRB_OPSYM__le(mrb) MRB_PRESYM_SCANNING_TAGGED("<=") +#define MRB_OPSYM__eq(mrb) MRB_PRESYM_SCANNING_TAGGED("==") +#define MRB_OPSYM__match(mrb) MRB_PRESYM_SCANNING_TAGGED("=~") +#define MRB_OPSYM__ge(mrb) MRB_PRESYM_SCANNING_TAGGED(">=") +#define MRB_OPSYM__rshift(mrb) MRB_PRESYM_SCANNING_TAGGED(">>") +#define MRB_OPSYM__aref(mrb) MRB_PRESYM_SCANNING_TAGGED("[]") +#define MRB_OPSYM__oror(mrb) MRB_PRESYM_SCANNING_TAGGED("||") +#define MRB_OPSYM__cmp(mrb) MRB_PRESYM_SCANNING_TAGGED("<=>") +#define MRB_OPSYM__eqq(mrb) MRB_PRESYM_SCANNING_TAGGED("===") +#define MRB_OPSYM__aset(mrb) MRB_PRESYM_SCANNING_TAGGED("[]=") + +#endif /* MRUBY_PRESYM_SCANNING_H */ diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index 8fe1da2de..2819ad594 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -5,6 +5,7 @@ require "mruby/build/command" module MRuby autoload :Gem, "mruby/gem" autoload :Lockfile, "mruby/lockfile" + autoload :Presym, "mruby/presym" class << self def targets @@ -51,6 +52,7 @@ module MRuby class Build class << self attr_accessor :current + def mruby_config_path path = ENV['MRUBY_CONFIG'] || ENV['CONFIG'] if path.nil? || path.empty? @@ -61,11 +63,16 @@ module MRuby end path end + + def install_dir + @install_dir ||= ENV['INSTALL_DIR'] || "#{MRUBY_ROOT}/bin" + end end + include Rake::DSL include LoadGems attr_accessor :name, :bins, :exts, :file_separator, :build_dir, :gem_clone_dir - attr_reader :libmruby_core_objs, :libmruby_objs, :gems, :toolchains, :gem_dir_to_repo_url + attr_reader :products, :libmruby_core_objs, :libmruby_objs, :gems, :toolchains, :presym, :mrbc_build, :gem_dir_to_repo_url alias libmruby libmruby_objs @@ -73,16 +80,16 @@ module MRuby COMMANDS = COMPILERS + %w(linker archiver yacc gperf git exts mrbc) attr_block MRuby::Build::COMMANDS - Exts = Struct.new(:object, :executable, :library) + Exts = Struct.new(:object, :executable, :library, :preprocessed) - def initialize(name='host', build_dir=nil, &block) + def initialize(name='host', build_dir=nil, internal: false, &block) @name = name.to_s unless current = MRuby.targets[@name] if ENV['OS'] == 'Windows_NT' - @exts = Exts.new('.o', '.exe', '.a') + @exts = Exts.new('.o', '.exe', '.a', '.i') else - @exts = Exts.new('.o', '', '.a') + @exts = Exts.new('.o', '', '.a', '.i') end build_dir = build_dir || ENV['MRUBY_BUILD_DIR'] || "#{MRUBY_ROOT}/build" @@ -101,6 +108,7 @@ module MRuby @git = Command::Git.new(self) @mrbc = Command::Mrbc.new(self) + @products = [] @bins = [] @gems = MRuby::Gem::List.new @libmruby_core_objs = [] @@ -113,6 +121,9 @@ module MRuby @enable_bintest = false @enable_test = false @enable_lock = true + @enable_presym = true + @mrbcfile_external = false + @internal = internal @toolchains = [] @gem_dir_to_repo_url = {} @@ -121,7 +132,14 @@ module MRuby MRuby::Build.current = current current.instance_eval(&block) - current.build_mrbc_exec if current.libmruby_enabled? && @name == "host" + if current.libmruby_enabled? && !current.mrbcfile_external? + if current.presym_enabled? + current.create_mrbc_build if current.host? || current.gems["mruby-bin-mrbc"] + elsif current.host? + current.build_mrbc_exec + end + end + current.presym = Presym.new(current) if current.presym_enabled? current.build_mrbtest if current.test_enabled? end @@ -149,6 +167,17 @@ module MRuby @enable_debug = true end + def presym_enabled? + @enable_presym + end + + def disable_presym + if @enable_presym + @enable_presym = false + compilers.each{|c| c.defines << "MRB_NO_PRESYM"} + end + end + def disable_lock @enable_lock = false end @@ -200,8 +229,29 @@ module MRuby @cxx_abi_enabled = true end - def compile_as_cxx src, cxx_src, obj = nil, includes = [] - obj = objfile(cxx_src) if obj.nil? + def compile_as_cxx(src, cxx_src = nil, obj = nil, includes = []) + # + # If `cxx_src` is specified, this method behaves the same as before as + # compatibility mode, but `.d` file is not read. + # + # If `cxx_src` is omitted, `.d` file is read by using mruby standard + # Rake rule (C++ source name is also changed). + # + if cxx_src + obj ||= cxx_src + @exts.object + dsts = [obj] + dsts << (cxx_src + @exts.preprocessed) if presym_enabled? + defines = [] + include_paths = ["#{MRUBY_ROOT}/src", *includes] + dsts.each do |dst| + file dst => cxx_src do |t| + cxx.run t.name, t.prerequisites.first, defines, include_paths + end + end + else + cxx_src = "#{build_dir}/#{src.relative_path})".ext << "-cxx.cxx" + obj = cxx_src.ext(@exts.object) + end file cxx_src => [src, __FILE__] do |t| mkdir_p File.dirname t.name @@ -219,10 +269,6 @@ extern "C" { EOS end - file obj => cxx_src do |t| - cxx.run t.name, t.prerequisites.first, [], ["#{MRUBY_ROOT}/src"] + includes - end - obj end @@ -263,11 +309,11 @@ EOS end def build_mrbtest - gem :core => 'mruby-test' + gem :core => 'mruby-test' unless @gems['mruby-test'] end def build_mrbc_exec - gem :core => 'mruby-bin-mrbc' + gem :core => 'mruby-bin-mrbc' unless @gems['mruby-bin-mrbc'] end def locks @@ -278,10 +324,23 @@ EOS return @mrbcfile if @mrbcfile gem_name = "mruby-bin-mrbc" - gem = gems[gem_name] || MRuby.targets["host"].gems[gem_name] + gem = @gems[gem_name] + gem ||= (host = MRuby.targets["host"]) && host.gems[gem_name] + unless gem + fail "external mrbc or mruby-bin-mrbc gem in current('#{@name}') or 'host' build is required" + end @mrbcfile = exefile("#{gem.build.build_dir}/bin/mrbc") end + def mrbcfile=(path) + @mrbcfile = path + @mrbcfile_external = true + end + + def mrbcfile_external? + @mrbcfile_external + end + def compilers COMPILERS.map do |c| instance_variable_get("@#{c}") @@ -289,7 +348,7 @@ EOS end def define_rules - use_mrdb = @gems.find{|g| g.name == "mruby-bin-debugger"} + use_mrdb = @gems["mruby-bin-debugger"] compilers.each do |compiler| if respond_to?(:enable_gems?) && enable_gems? compiler.defines -= %w(MRB_NO_GEMS) @@ -298,7 +357,10 @@ EOS end compiler.defines |= %w(MRB_USE_DEBUG_HOOK) if use_mrdb end - cc.define_rules(build_dir, MRUBY_ROOT) + [@cc, *(@cxx if cxx_exception_enabled?)].each do |compiler| + compiler.define_rules(@build_dir, MRUBY_ROOT, @exts.object) + compiler.define_rules(@build_dir, MRUBY_ROOT, @exts.preprocessed) if presym_enabled? + end end def filename(name) @@ -359,7 +421,8 @@ EOS puts ">>> Bintest #{name} <<<" targets = @gems.select { |v| File.directory? "#{v.dir}/bintest" }.map { |v| filename v.dir } targets << filename(".") if File.directory? "./bintest" - env = {"BUILD_DIR" => @build_dir} + mrbc = @gems["mruby-bin-mrbc"] ? exefile("#{@build_dir}/bin/mrbc") : mrbcfile + env = {"BUILD_DIR" => @build_dir, "MRBCFILE" => mrbc} sh env, "ruby test/bintest.rb#{verbose_flag} #{targets.join ' '}" end @@ -393,6 +456,41 @@ EOS def libraries [libmruby_static] end + + def host? + @name == "host" + end + + def internal? + @internal + end + + protected + + attr_writer :presym + + def create_mrbc_build + exclusions = %i[@name @build_dir @gems @enable_test @enable_bintest @internal] + name = "#{@name}/mrbc" + MRuby.targets.delete(name) + build = self.class.new(name, internal: true){} + instance_variables.each do |n| + next if exclusions.include?(n) + v = instance_variable_get(n) + v = case v + when nil, true, false, Numeric; v + when String, Command; v.clone + else Marshal.load(Marshal.dump(v)) # deep clone + end + build.instance_variable_set(n, v) + end + build.build_mrbc_exec + build.disable_libmruby + build.disable_presym + @mrbc_build = build + self.mrbcfile = build.mrbcfile + build + end end # Build class CrossBuild < Build @@ -405,7 +503,7 @@ EOS def initialize(name, build_dir=nil, &block) @test_runner = Command::CrossTestRunner.new(self) super - unless MRuby.targets['host'] + unless mrbcfile_external? || MRuby.targets['host'] # add minimal 'host' MRuby::Build.new('host') do |conf| if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] @@ -413,16 +511,13 @@ EOS else toolchain :gcc end - conf.gem :core => 'mruby-bin-mrbc' + conf.build_mrbc_exec conf.disable_libmruby + conf.disable_presym end end end - def mrbcfile - MRuby.targets['host'].mrbcfile - end - def run_test @test_runner.runner_options << verbose_flag mrbtest = exefile("#{build_dir}/bin/mrbtest") @@ -433,5 +528,9 @@ EOS @test_runner.run(mrbtest) end end + + protected + + def create_mrbc_build; end end # CrossBuild end # MRuby diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 80657eadc..9362a9d95 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -42,6 +42,7 @@ module MRuby attr_accessor :label, :flags, :include_paths, :defines, :source_exts attr_accessor :compile_options, :option_define, :option_include_path, :out_ext attr_accessor :cxx_compile_flag, :cxx_exception_flag, :cxx_invalid_flags + attr_writer :preprocess_options def initialize(build, source_exts=[], label: "CC") super(build) @@ -55,9 +56,15 @@ module MRuby @option_define = %q[-D"%s"] @compile_options = %q[%{flags} -o "%{outfile}" -c "%{infile}"] @cxx_invalid_flags = [] + @out_ext = build.exts.object end alias header_search_paths include_paths + + def preprocess_options + @preprocess_options ||= @compile_options.sub(/(?:\A|\s)\K-c(?=\s)/, "-E -P") + end + def search_header_path(name) header_search_paths.find do |v| File.exist? build.filename("#{v}/#{name}").sub(/^"(.*)"$/, '\1') @@ -79,13 +86,20 @@ module MRuby def run(outfile, infile, _defines=[], _include_paths=[], _flags=[]) mkdir_p File.dirname(outfile) - _pp @label, infile.relative_path, outfile.relative_path - _run compile_options, { :flags => all_flags(_defines, _include_paths, _flags), - :infile => filename(infile), :outfile => filename(outfile) } + flags = all_flags(_defines, _include_paths, _flags) + if File.extname(outfile) == build.exts.object + label = @label + opts = compile_options + else + label = "CPP" + opts = preprocess_options + flags << " -DMRB_PRESYM_SCANNING" + end + _pp label, infile.relative_path, outfile.relative_path + _run opts, flags: flags, infile: filename(infile), outfile: filename(outfile) end - def define_rules(build_dir, source_dir='') - @out_ext = build.exts.object + def define_rules(build_dir, source_dir='', out_ext=build.exts.object) gemrake = File.join(source_dir, "mrbgem.rake") rakedep = File.exist?(gemrake) ? [ gemrake ] : [] @@ -143,10 +157,10 @@ module MRuby # /src/value_array.h: # def get_dependencies(file) - file = file.ext('d') unless File.extname(file) == '.d' - return [MRUBY_CONFIG] unless File.exist?(file) + dep_file = "#{file}.d" + return [MRUBY_CONFIG] unless File.exist?(dep_file) - deps = File.read(file).gsub("\\\n ", "").split("\n").map do |dep_line| + deps = File.read(dep_file).gsub("\\\n ", "").split("\n").map do |dep_line| # dep_line: # - "/build/host/src/array.o: /src/array.c /include/mruby/common.h ..." # - "" @@ -187,6 +201,10 @@ module MRuby [libraries, _libraries].flatten.map{ |d| option_library % d }.join(' ') end + def run_attrs + [@libraries, @library_paths, @flags, @flags_before_libraries, @flags_after_libraries] + end + def run(outfile, objfiles, _libraries=[], _library_paths=[], _flags=[], _flags_before_libraries=[], _flags_after_libraries=[]) mkdir_p File.dirname(outfile) library_flags = [libraries, _libraries].flatten.map { |d| option_library % d } diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb index e3b758f4f..4e918745f 100644 --- a/lib/mruby/gem.rb +++ b/lib/mruby/gem.rb @@ -7,7 +7,6 @@ module MRuby class << self attr_accessor :current end - LinkerConfig = Struct.new(:libraries, :library_paths, :flags, :flags_before_libraries, :flags_after_libraries) class Specification include Rake::DSL @@ -50,13 +49,13 @@ module MRuby end def setup - return if defined?(@linker) # return if already set up + return if defined?(@bins) # return if already set up MRuby::Gem.current = self MRuby::Build::COMMANDS.each do |command| instance_variable_set("@#{command}", @build.send(command).clone) end - @linker = LinkerConfig.new([], [], [], [], []) + @linker.run_attrs.each(&:clear) @rbfiles = Dir.glob("#{@dir}/mrblib/**/*.rb").sort @objs = Dir.glob("#{@dir}/src/*.{c,cpp,cxx,cc,m,asm,s,S}").map do |f| @@ -72,6 +71,7 @@ module MRuby @test_args = {} @bins = [] + @cdump = true @requirements = [] @export_include_paths = [] @@ -81,7 +81,6 @@ module MRuby @generate_functions = !(@rbfiles.empty? && @objs.empty?) @objs << objfile("#{build_dir}/gem_init") if @generate_functions - @cdump = core? # by default core gems use cdump and others use mrb dump if !name || !licenses || !authors fail "#{name || dir} required to set name, license(s) and author(s)" @@ -96,10 +95,11 @@ module MRuby end def setup_compilers - (core? ? [cc] : compilers).each do |compiler| - compiler.define_rules build_dir, "#{dir}" + (core? ? [@cc, *(@cxx if build.cxx_exception_enabled?)] : compilers).each do |compiler| + compiler.define_rules build_dir, @dir, @build.exts.preprocessed if build.presym_enabled? + compiler.define_rules build_dir, @dir, @build.exts.object compiler.defines << %Q[MRBGEM_#{funcname.upcase}_VERSION=#{version}] - compiler.include_paths << "#{dir}/include" if File.directory? "#{dir}/include" + compiler.include_paths << "#{@dir}/include" if File.directory? "#{@dir}/include" end define_gem_init_builder if @generate_functions @@ -114,12 +114,12 @@ module MRuby return false end - def enable_cdump - @cdump = true + def disable_cdump + @cdump = false end def cdump? - @cdump + build.presym_enabled? && @cdump end def core? @@ -175,7 +175,6 @@ module MRuby end def define_gem_init_builder - file objfile("#{build_dir}/gem_init") => [ "#{build_dir}/gem_init.c", File.join(dir, "mrbgem.rake") ] file "#{build_dir}/gem_init.c" => [build.mrbcfile, __FILE__] + [rbfiles].flatten do |t| mkdir_p build_dir generate_gem_init("#{build_dir}/gem_init.c") @@ -187,7 +186,7 @@ module MRuby open(fname, 'w') do |f| print_gem_init_header f unless rbfiles.empty? - if @cdump + if cdump? build.mrbc.run f, rbfiles, "gem_mrblib_#{funcname}_proc" else build.mrbc.run f, rbfiles, "gem_mrblib_irep_#{funcname}", false @@ -198,10 +197,10 @@ module MRuby f.puts %Q[] f.puts %Q[void GENERATED_TMP_mrb_#{funcname}_gem_init(mrb_state *mrb) {] f.puts %Q[ int ai = mrb_gc_arena_save(mrb);] - f.puts %Q[ struct REnv *e;] unless rbfiles.empty? + f.puts %Q[ gem_mrblib_#{funcname}_proc_init_syms(mrb);] if !rbfiles.empty? && cdump? f.puts %Q[ mrb_#{funcname}_gem_init(mrb);] if objs != [objfile("#{build_dir}/gem_init")] unless rbfiles.empty? - if @cdump + if cdump? f.puts %Q[ mrb_load_proc(mrb, gem_mrblib_#{funcname}_proc);] else f.puts %Q[ mrb_load_irep(mrb, gem_mrblib_irep_#{funcname});] @@ -211,7 +210,7 @@ module MRuby f.puts %Q[ mrb_close(mrb);] f.puts %Q[ exit(EXIT_FAILURE);] f.puts %Q[ }] - f.puts %Q[ e = mrb->c->cibase->env;] + f.puts %Q[ struct REnv *e = mrb->c->cibase->env;] f.puts %Q[ mrb->c->cibase->env = NULL;] f.puts %Q[ mrb_env_unshare(mrb, e);] end @@ -241,8 +240,6 @@ module MRuby f.puts %Q[#include <mruby.h>] else f.puts %Q[#include <stdlib.h>] - f.puts %Q[#include <mruby.h>] - f.puts %Q[#include <mruby/proc.h>] end end @@ -251,7 +248,7 @@ module MRuby f.puts %Q[#include <stdio.h>] f.puts %Q[#include <stdlib.h>] f.puts %Q[#include <mruby.h>] - f.puts %Q[#include <mruby/proc.h>] + f.puts %Q[#include <mruby/irep.h>] f.puts %Q[#include <mruby/variable.h>] f.puts %Q[#include <mruby/hash.h>] unless test_args.empty? end diff --git a/lib/mruby/presym.rb b/lib/mruby/presym.rb new file mode 100644 index 000000000..75a903dba --- /dev/null +++ b/lib/mruby/presym.rb @@ -0,0 +1,113 @@ +module MRuby + class Presym + include Rake::DSL + + OPERATORS = { + "!" => "not", + "%" => "mod", + "&" => "and", + "*" => "mul", + "+" => "add", + "-" => "sub", + "/" => "div", + "<" => "lt", + ">" => "gt", + "^" => "xor", + "`" => "tick", + "|" => "or", + "~" => "neg", + "!=" => "neq", + "!~" => "nmatch", + "&&" => "andand", + "**" => "pow", + "+@" => "plus", + "-@" => "minus", + "<<" => "lshift", + "<=" => "le", + "==" => "eq", + "=~" => "match", + ">=" => "ge", + ">>" => "rshift", + "[]" => "aref", + "||" => "oror", + "<=>" => "cmp", + "===" => "eqq", + "[]=" => "aset", + }.freeze + + SYMBOL_TO_MACRO = { + # Symbol => Macro + # [prefix, suffix] => [prefix, suffix] + ["@@" , "" ] => ["CV" , "" ], + ["@" , "" ] => ["IV" , "" ], + ["" , "!" ] => ["" , "_B" ], + ["" , "?" ] => ["" , "_Q" ], + ["" , "=" ] => ["" , "_E" ], + ["" , "" ] => ["" , "" ], + }.freeze + + C_STR_LITERAL_RE = /"(?:[^\\\"]|\\.)*"/ + + def initialize(build) + @build = build + end + + def scan(paths) + presym_hash = {} + paths.each {|path| read_preprocessed(presym_hash, path)} + presym_hash.keys.sort_by!{|sym| [c_literal_size(sym), sym]} + end + + def read_list + File.readlines(list_path, mode: "r:binary").each(&:chomp!) + end + + def write_list(presyms) + _pp "GEN", list_path.relative_path + File.binwrite(list_path, presyms.join("\n") << "\n") + end + + def write_header(presyms) + prefix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:first).uniq) + suffix_re = Regexp.union(*SYMBOL_TO_MACRO.keys.map(&:last).uniq) + sym_re = /\A(#{prefix_re})?([\w&&\D]\w*)(#{suffix_re})?\z/o + _pp "GEN", header_path.relative_path + mkdir_p(File.dirname(header_path)) + File.open(header_path, "w:binary") do |f| + f.puts "/* MRB_PRESYM_NAMED(lit, num, type, name) */" + f.puts "/* MRB_PRESYM_UNNAMED(lit, num) */" + presyms.each.with_index(1) do |sym, num| + if sym_re =~ sym && (affixes = SYMBOL_TO_MACRO[[$1, $3]]) + f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, #{affixes * 'SYM'}, #{$2})| + elsif name = OPERATORS[sym] + f.puts %|MRB_PRESYM_NAMED("#{sym}", #{num}, OPSYM, #{name})| + elsif + f.puts %|MRB_PRESYM_UNNAMED("#{sym}", #{num})| + end + end + f.puts "#define MRB_PRESYM_MAX #{presyms.size}" + end + end + + def list_path + @list_pat ||= "#{@build.build_dir}/presym".freeze + end + + def header_path + @header_path ||= "#{@build.build_dir}/include/mruby/presym.inc".freeze + end + + private + + def read_preprocessed(presym_hash, path) + File.binread(path).scan(/<@! (.*?) !@>/) do |part,| + literals = part.scan(C_STR_LITERAL_RE) + presym_hash[literals.map{|l| l[1..-2]}.join] = true unless literals.empty? + end + end + + def c_literal_size(literal_without_quote) + literal_without_quote.size # TODO: consider escape sequence + end + end +end diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index be73c2e86..b626024d1 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -650,9 +650,8 @@ main(int argc, char **argv) /* generate bytecode */ struct RProc *proc = mrb_generate_code(mrb, parser); if (proc == NULL) { - fputs("codegen error\n", stderr); mrb_parser_free(parser); - break; + continue; } if (args.verbose) { diff --git a/mrbgems/mruby-bin-mruby/mrbgem.rake b/mrbgems/mruby-bin-mruby/mrbgem.rake index 1415013e3..36bf2fa61 100644 --- a/mrbgems/mruby-bin-mruby/mrbgem.rake +++ b/mrbgems/mruby-bin-mruby/mrbgem.rake @@ -7,6 +7,6 @@ MRuby::Gem::Specification.new('mruby-bin-mruby') do |spec| spec.add_test_dependency('mruby-print', :core => 'mruby-print') if build.cxx_exception_enabled? - build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c", "#{spec.build_dir}/tools/mruby/mruby.cxx") + build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c") end end diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 4ac092176..00a33021f 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -819,7 +819,7 @@ for_body(codegen_scope *s, node *tree) genop_2(s, OP_BLOCK, cursp(), s->irep->rlen-1); push();pop(); /* space for a block */ pop(); - idx = new_sym(s, MRB_SYM(each)); + idx = new_sym(s, MRB_SYM_2(s->mrb, each)); genop_3(s, OP_SENDB, cursp(), idx, 0); } @@ -1547,14 +1547,14 @@ codegen(codegen_scope *s, node *tree, int val) gen_move(s, cursp(), exc, 0); push_n(2); pop_n(2); /* space for one arg and a block */ pop(); - genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM(__case_eqq)), 1); + genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM_2(s->mrb, __case_eqq)), 1); } else { if (n4) { codegen(s, n4->car, VAL); } else { - genop_2(s, OP_GETCONST, cursp(), new_sym(s, MRB_SYM(StandardError))); + genop_2(s, OP_GETCONST, cursp(), new_sym(s, MRB_SYM_2(s->mrb, StandardError))); push(); } pop(); @@ -1668,7 +1668,7 @@ codegen(codegen_scope *s, node *tree, int val) { node *n = tree->car->cdr; mrb_sym mid = nsym(n->cdr->car); - mrb_sym mnil = MRB_SYM_Q(nil); + mrb_sym mnil = MRB_SYM_Q_2(s->mrb, nil); if (mid == mnil && n->cdr->cdr->car == NULL) { nil_p = TRUE; codegen(s, n->car, VAL); @@ -1804,10 +1804,10 @@ codegen(codegen_scope *s, node *tree, int val) gen_move(s, cursp(), head, 0); push(); push(); pop(); pop(); pop(); if (nint(n->car->car) == NODE_SPLAT) { - genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM(__case_eqq)), 1); + genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM_2(s->mrb, __case_eqq)), 1); } else { - genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_OPSYM(eqq)), 1); + genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_OPSYM_2(s->mrb, eqq)), 1); } } else { @@ -2333,7 +2333,7 @@ codegen(codegen_scope *s, node *tree, int val) pop_n(n+1); genop_2S(s, OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)); if (sendv) n = CALL_MAXARGS; - genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM(call)), n); + genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM_2(s->mrb, call)), n); if (val) push(); } break; @@ -2582,7 +2582,7 @@ codegen(codegen_scope *s, node *tree, int val) default: if (val) { - int sym = new_sym(s, MRB_OPSYM(minus)); + int sym = new_sym(s, MRB_OPSYM_2(s->mrb, minus)); codegen(s, tree, VAL); pop(); genop_3(s, OP_SEND, cursp(), sym, 0); @@ -2655,7 +2655,7 @@ codegen(codegen_scope *s, node *tree, int val) { node *n; int ai = mrb_gc_arena_save(s->mrb); - int sym = new_sym(s, MRB_SYM(Kernel)); + int sym = new_sym(s, MRB_SYM_2(s->mrb, Kernel)); genop_1(s, OP_LOADSELF, cursp()); push(); @@ -2674,7 +2674,7 @@ codegen(codegen_scope *s, node *tree, int val) } push(); /* for block */ pop_n(3); - sym = new_sym(s, MRB_OPSYM(tick)); /* ` */ + sym = new_sym(s, MRB_OPSYM_2(s->mrb, tick)); /* ` */ genop_3(s, OP_SEND, cursp(), sym, 1); if (val) push(); mrb_gc_arena_restore(s->mrb, ai); @@ -2694,7 +2694,7 @@ codegen(codegen_scope *s, node *tree, int val) genop_bs(s, OP_STRING, cursp(), off); push(); push(); pop_n(3); - sym = new_sym(s, MRB_OPSYM(tick)); /* ` */ + sym = new_sym(s, MRB_OPSYM_2(s->mrb, tick)); /* ` */ genop_3(s, OP_SEND, cursp(), sym, 1); if (val) push(); mrb_gc_arena_restore(s->mrb, ai); @@ -2735,7 +2735,7 @@ codegen(codegen_scope *s, node *tree, int val) } push(); /* space for a block */ pop_n(argc+2); - sym = new_sym(s, MRB_SYM(compile)); + sym = new_sym(s, MRB_SYM_2(s->mrb, compile)); genop_3(s, OP_SEND, cursp(), sym, argc); mrb_gc_arena_restore(s->mrb, ai); push(); @@ -2789,7 +2789,7 @@ codegen(codegen_scope *s, node *tree, int val) } push(); /* space for a block */ pop_n(argc+2); - sym = new_sym(s, MRB_SYM(compile)); + sym = new_sym(s, MRB_SYM_2(s->mrb, compile)); genop_3(s, OP_SEND, cursp(), sym, argc); mrb_gc_arena_restore(s->mrb, ai); push(); diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 16e1cef32..680b57d25 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -70,6 +70,7 @@ typedef unsigned int stack_type; #define nsym(x) ((node*)(intptr_t)(x)) #define nint(x) ((node*)(intptr_t)(x)) #define intn(x) ((int)(intptr_t)(x)) +#define typen(x) ((enum node_type)(intptr_t)(x)) #define NUM_SUFFIX_R (1<<0) #define NUM_SUFFIX_I (1<<1) @@ -88,7 +89,7 @@ intern_gen(parser_state *p, const char *s, size_t len) } #define intern(s,len) intern_gen(p,(s),(len)) -#define intern_lit(s) mrb_intern_lit(p->mrb, s) +#define intern_op(op) MRB_OPSYM_2(p->mrb, op) static void cons_free_gen(parser_state *p, node *cons) @@ -314,14 +315,14 @@ static void local_add_blk(parser_state *p, mrb_sym blk) { /* allocate register for block */ - local_add_f(p, blk ? blk : MRB_OPSYM(and)); + local_add_f(p, blk ? blk : intern_op(and)); } static void local_add_kw(parser_state *p, mrb_sym kwd) { /* allocate register for keywords hash */ - local_add_f(p, kwd ? kwd : MRB_OPSYM(pow)); + local_add_f(p, kwd ? kwd : intern_op(pow)); } static node* @@ -779,7 +780,7 @@ static void local_add_margs(parser_state *p, node *n) { while (n) { - if (n->car->car == (node*)NODE_MASGN) { + if (typen(n->car->car) == NODE_MASGN) { node *t = n->car->cdr->cdr; n->car->cdr->cdr = NULL; @@ -959,13 +960,13 @@ new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b) static node* new_imaginary(parser_state *p, node *imaginary) { - return new_call(p, new_const(p, MRB_SYM(Kernel)), MRB_SYM(Complex), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1); + return new_call(p, new_const(p, MRB_SYM_2(p->mrb, Kernel)), MRB_SYM_2(p->mrb, Complex), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1); } static node* new_rational(parser_state *p, node *rational) { - return new_call(p, new_const(p, MRB_SYM(Kernel)), MRB_SYM(Rational), list1(list1(rational)), 1); + return new_call(p, new_const(p, MRB_SYM_2(p->mrb, Kernel)), MRB_SYM_2(p->mrb, Rational), list1(list1(rational)), 1); } /* (:int . i) */ @@ -1015,7 +1016,7 @@ new_dstr(parser_state *p, node *a) static int string_node_p(node *n) { - return (int)((enum node_type)(intptr_t)n->car == NODE_STR); + return (int)(typen(n->car) == NODE_STR); } static node* @@ -1207,7 +1208,7 @@ call_with_block(parser_state *p, node *a, node *b) { node *n; - switch ((enum node_type)intn(a->car)) { + switch (typen(a->car)) { case NODE_SUPER: case NODE_ZSUPER: if (!a->cdr) a->cdr = cons(0, b); @@ -1281,7 +1282,7 @@ typedef enum mrb_string_type string_type; static node* new_strterm(parser_state *p, string_type type, int term, int paren) { - return cons(nint(type), cons((node*)0, cons(nint(paren), nint(term)))); + return cons(nint(type), cons(nint(0), cons(nint(paren), nint(term)))); } static void @@ -1499,7 +1500,7 @@ heredoc_end(parser_state *p) %token tANDDOT /* &. */ %token tSYMBEG tREGEXP_BEG tWORDS_BEG tSYMBOLS_BEG %token tSTRING_BEG tXSTRING_BEG tSTRING_DVAR tLAMBEG -%token <nd> tHEREDOC_BEG /* <<, <<- */ +%token <nd> tHEREDOC_BEG /* <<, <<-, <<~ */ %token tHEREDOC_END tLITERAL_DELIM tHD_LITERAL_DELIM %token <nd> tHD_STRING_PART tHD_STRING_MID @@ -1706,7 +1707,7 @@ command_asgn : lhs '=' command_rhs } | primary_value '[' opt_call_args ']' tOP_ASGN command_rhs { - $$ = new_op_asgn(p, new_call(p, $1, MRB_OPSYM(aref), $3, '.'), $5, $6); + $$ = new_op_asgn(p, new_call(p, $1, intern_op(aref), $3, '.'), $5, $6); } | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs { @@ -1962,7 +1963,7 @@ mlhs_node : variable } | primary_value '[' opt_call_args ']' { - $$ = new_call(p, $1, MRB_OPSYM(aref), $3, '.'); + $$ = new_call(p, $1, intern_op(aref), $3, '.'); } | primary_value call_op tIDENTIFIER { @@ -2001,7 +2002,7 @@ lhs : variable } | primary_value '[' opt_call_args ']' { - $$ = new_call(p, $1, MRB_OPSYM(aref), $3, '.'); + $$ = new_call(p, $1, intern_op(aref), $3, '.'); } | primary_value call_op tIDENTIFIER { @@ -2047,11 +2048,11 @@ cname : tIDENTIFIER cpath : tCOLON3 cname { - $$ = cons((node*)1, nsym($2)); + $$ = cons(nint(1), nsym($2)); } | cname { - $$ = cons((node*)0, nsym($1)); + $$ = cons(nint(0), nsym($1)); } | primary_value tCOLON2 cname { @@ -2089,36 +2090,36 @@ undef_list : fsym } ; -op : '|' { $$ = MRB_OPSYM(or); } - | '^' { $$ = MRB_OPSYM(xor); } - | '&' { $$ = MRB_OPSYM(and); } - | tCMP { $$ = MRB_OPSYM(cmp); } - | tEQ { $$ = MRB_OPSYM(eq); } - | tEQQ { $$ = MRB_OPSYM(eqq); } - | tMATCH { $$ = MRB_OPSYM(match); } - | tNMATCH { $$ = MRB_OPSYM(nmatch); } - | '>' { $$ = MRB_OPSYM(gt); } - | tGEQ { $$ = MRB_OPSYM(ge); } - | '<' { $$ = MRB_OPSYM(lt); } - | tLEQ { $$ = MRB_OPSYM(le); } - | tNEQ { $$ = MRB_OPSYM(neq); } - | tLSHFT { $$ = MRB_OPSYM(lshift); } - | tRSHFT { $$ = MRB_OPSYM(rshift); } - | '+' { $$ = MRB_OPSYM(add); } - | '-' { $$ = MRB_OPSYM(sub); } - | '*' { $$ = MRB_OPSYM(mul); } - | tSTAR { $$ = MRB_OPSYM(mul); } - | '/' { $$ = MRB_OPSYM(div); } - | '%' { $$ = MRB_OPSYM(mod); } - | tPOW { $$ = MRB_OPSYM(pow); } - | tDSTAR { $$ = MRB_OPSYM(pow); } - | '!' { $$ = MRB_OPSYM(not); } - | '~' { $$ = MRB_OPSYM(neg); } - | tUPLUS { $$ = MRB_OPSYM(plus); } - | tUMINUS { $$ = MRB_OPSYM(minus); } - | tAREF { $$ = MRB_OPSYM(aref); } - | tASET { $$ = MRB_OPSYM(aset); } - | '`' { $$ = MRB_OPSYM(tick); } +op : '|' { $$ = intern_op(or); } + | '^' { $$ = intern_op(xor); } + | '&' { $$ = intern_op(and); } + | tCMP { $$ = intern_op(cmp); } + | tEQ { $$ = intern_op(eq); } + | tEQQ { $$ = intern_op(eqq); } + | tMATCH { $$ = intern_op(match); } + | tNMATCH { $$ = intern_op(nmatch); } + | '>' { $$ = intern_op(gt); } + | tGEQ { $$ = intern_op(ge); } + | '<' { $$ = intern_op(lt); } + | tLEQ { $$ = intern_op(le); } + | tNEQ { $$ = intern_op(neq); } + | tLSHFT { $$ = intern_op(lshift); } + | tRSHFT { $$ = intern_op(rshift); } + | '+' { $$ = intern_op(add); } + | '-' { $$ = intern_op(sub); } + | '*' { $$ = intern_op(mul); } + | tSTAR { $$ = intern_op(mul); } + | '/' { $$ = intern_op(div); } + | '%' { $$ = intern_op(mod); } + | tPOW { $$ = intern_op(pow); } + | tDSTAR { $$ = intern_op(pow); } + | '!' { $$ = intern_op(not); } + | '~' { $$ = intern_op(neg); } + | tUPLUS { $$ = intern_op(plus); } + | tUMINUS { $$ = intern_op(minus); } + | tAREF { $$ = intern_op(aref); } + | tASET { $$ = intern_op(aset); } + | '`' { $$ = intern_op(tick); } ; reswords : keyword__LINE__ | keyword__FILE__ | keyword__ENCODING__ @@ -2145,7 +2146,7 @@ arg : lhs '=' arg_rhs } | primary_value '[' opt_call_args ']' tOP_ASGN arg_rhs { - $$ = new_op_asgn(p, new_call(p, $1, MRB_OPSYM(aref), $3, '.'), $5, $6); + $$ = new_op_asgn(p, new_call(p, $1, intern_op(aref), $3, '.'), $5, $6); } | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs { @@ -2400,14 +2401,14 @@ paren_args : '(' opt_call_args ')' | '(' args comma tBDOT3 rparen { #if 1 - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); $$ = cons(push($2, new_splat(p, new_lvar(p, r))), new_block_arg(p, new_lvar(p, b))); #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); $$ = cons(list2(push($2, new_splat(p, new_lvar(p, r))), new_kw_hash(p, list1(cons(new_kw_rest_args(p, 0), new_lvar(p, k))))), new_block_arg(p, new_lvar(p, b))); @@ -2416,16 +2417,16 @@ paren_args : '(' opt_call_args ')' | '(' tBDOT3 rparen { #if 1 - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); if (local_var_p(p, r) && local_var_p(p, b)) { $$ = cons(list1(new_splat(p, new_lvar(p, r))), new_block_arg(p, new_lvar(p, b))); } #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); if (local_var_p(p, r) && local_var_p(p, k) && local_var_p(p, b)) { $$ = cons(list2(new_splat(p, new_lvar(p, r)), new_kw_hash(p, list1(cons(new_kw_rest_args(p, 0), new_lvar(p, k))))), @@ -2866,11 +2867,11 @@ f_margs : f_arg | f_arg ',' tSTAR { local_add_f(p, 0); - $$ = list3($1, (node*)-1, 0); + $$ = list3($1, nint(-1), 0); } | f_arg ',' tSTAR ',' f_arg { - $$ = list3($1, (node*)-1, $5); + $$ = list3($1, nint(-1), $5); } | tSTAR f_norm_arg { @@ -2883,7 +2884,7 @@ f_margs : f_arg | tSTAR { local_add_f(p, 0); - $$ = list3(0, (node*)-1, 0); + $$ = list3(0, nint(-1), 0); } | tSTAR ',' { @@ -2891,7 +2892,7 @@ f_margs : f_arg } f_arg { - $$ = list3(0, (node*)-1, $4); + $$ = list3(0, nint(-1), $4); } ; @@ -3072,7 +3073,7 @@ do_block : keyword_do_block block_call : command do_block { - if ($1->car == (node*)NODE_YIELD) { + if (typen($1->car) == NODE_YIELD) { yyerror(p, "block given to yield"); } else { @@ -3114,11 +3115,11 @@ method_call : operation paren_args } | primary_value call_op paren_args { - $$ = new_call(p, $1, MRB_SYM(call), $3, $2); + $$ = new_call(p, $1, MRB_SYM_2(p->mrb, call), $3, $2); } | primary_value tCOLON2 paren_args { - $$ = new_call(p, $1, MRB_SYM(call), $3, tCOLON2); + $$ = new_call(p, $1, MRB_SYM_2(p->mrb, call), $3, tCOLON2); } | keyword_super paren_args { @@ -3130,7 +3131,7 @@ method_call : operation paren_args } | primary_value '[' opt_call_args ']' { - $$ = new_call(p, $1, MRB_OPSYM(aref), $3, '.'); + $$ = new_call(p, $1, intern_op(aref), $3, '.'); } ; @@ -3513,15 +3514,15 @@ f_arglist_paren : '(' f_args rparen { #if 1 /* til real keyword args implemented */ - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); local_add_f(p, r); $$ = new_args(p, $2, 0, r, 0, new_args_tail(p, 0, 0, b)); #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); local_add_f(p, r); local_add_f(p, k); $$ = new_args(p, $2, 0, r, 0, new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b)); @@ -3531,15 +3532,15 @@ f_arglist_paren : '(' f_args rparen { #if 1 /* til real keyword args implemented */ - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); local_add_f(p, r); $$ = new_args(p, 0, 0, r, 0, new_args_tail(p, 0, 0, b)); #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); local_add_f(p, r); local_add_f(p, k); $$ = new_args(p, 0, 0, r, 0, new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b)); @@ -3705,7 +3706,7 @@ f_args : f_arg ',' f_optarg ',' f_rest_arg opt_args_tail } | /* none */ { - local_add_f(p, MRB_OPSYM(and)); + local_add_f(p, intern_op(and)); $$ = new_args(p, 0, 0, 0, 0, 0); } ; @@ -3829,7 +3830,7 @@ f_rest_arg : restarg_mark tIDENTIFIER } | restarg_mark { - local_add_f(p, MRB_OPSYM(mul)); + local_add_f(p, intern_op(mul)); $$ = -1; } ; @@ -3865,7 +3866,7 @@ singleton : var_ref yyerror(p, "can't define singleton method for ()."); } else { - switch ((enum node_type)intn($3->car)) { + switch (typen($3->car)) { case NODE_STR: case NODE_DSTR: case NODE_XSTR: @@ -3920,7 +3921,7 @@ assoc : arg tASSOC arg | string_fragment label_tag arg { void_expr_error(p, $3); - if ($1->car == (node*)NODE_DSTR) { + if (typen($1->car) == NODE_DSTR) { $$ = cons(new_dsym(p, $1), $3); } else { @@ -4624,6 +4625,93 @@ read_escape(parser_state *p) } } +static void +heredoc_count_indent(parser_heredoc_info *hinf, const char *str, size_t len, size_t *indent, size_t *offset) +{ + *indent = 0; + *offset = 0; + for (size_t i = 0; i < len; i++) { + size_t size; + if (str[i] == '\n') + break; + else if (str[i] == '\t') + size = 8; + else if (ISSPACE(str[i])) + size = 1; + else + break; + if (*indent + size > hinf->indent) + break; + *indent += size; + *offset += 1; + } +} + +static void +heredoc_remove_indent(parser_state *p, parser_heredoc_info *hinf) +{ + if (!hinf->remove_indent) + return; + node *indented, *n, *pair, *escaped; + const char *str; + size_t len, indent, offset, start, end; + indented = hinf->indented; + while (indented) { + n = indented->car; + pair = n->car; + str = (char*)pair->car; + len = (size_t)pair->cdr; + escaped = n->cdr; + if (escaped) { + start = 0; + while (start < len) { + end = escaped ? (size_t)escaped->car : len; + heredoc_count_indent(hinf, str + start, end - start, &indent, &offset); + if (indent < hinf->indent) + hinf->indent = indent; + start = end; + if (escaped) + escaped = escaped->cdr; + } + } + indented = indented->cdr; + } + if (hinf->indent == 0) + return; + indented = hinf->indented; + while (indented) { + n = indented->car; + pair = n->car; + str = (char*)pair->car; + len = (size_t)pair->cdr; + escaped = n->cdr; + if (escaped) { + char *newstr = strndup(str, len); + size_t newlen = 0; + start = 0; + while (start < len) { + end = escaped ? (size_t)escaped->car : len; + size_t esclen = end - start; + heredoc_count_indent(hinf, str + start, esclen, &indent, &offset); + esclen -= offset; + memcpy(newstr + newlen, str + start + offset, esclen); + newlen += esclen; + start = end; + if (escaped) + escaped = escaped->cdr; + } + newstr[newlen] = '\0'; + pair->car = (node*)newstr; + pair->cdr = (node*)newlen; + } else { + heredoc_count_indent(hinf, str, len, &indent, &offset); + pair->car = (node*)(str + offset); + pair->cdr = (node*)(len - offset); + } + indented = indented->cdr; + } +} + static int parse_string(parser_state *p) { @@ -4634,10 +4722,18 @@ parse_string(parser_state *p) int end = intn(p->lex_strterm->cdr->cdr->cdr); parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL; + mrb_bool unindent = hinf && hinf->remove_indent; + mrb_bool head = hinf && hinf->line_head; + mrb_bool empty = TRUE; + size_t spaces = 0; + size_t pos = -1; + node *escaped = NULL; + if (beg == 0) beg = -3; /* should never happen */ if (end == 0) end = -3; newtok(p); while ((c = nextc(p)) != end || nest_level != 0) { + pos++; if (hinf && (c == '\n' || c < 0)) { mrb_bool line_head; tokadd(p, '\n'); @@ -4657,6 +4753,7 @@ parse_string(parser_state *p) } } if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) { + heredoc_remove_indent(p, hinf); return tHEREDOC_END; } } @@ -4675,9 +4772,23 @@ parse_string(parser_state *p) } return 0; } - pylval.nd = new_str(p, tok(p), toklen(p)); + node *nd = new_str(p, tok(p), toklen(p)); + pylval.nd = nd; + if (unindent && head) { + hinf->indented = push(hinf->indented, cons(nd->cdr, escaped)); + if ((hinf->indent == ~0U || spaces < hinf->indent) && (!empty || !line_head)) + hinf->indent = spaces; + } return tHD_STRING_MID; } + if (unindent && head && empty) { + if (c == '\t') + spaces += 8; + else if (ISSPACE(c)) + ++spaces; + else + empty = FALSE; + } if (c < 0) { yyerror(p, "unterminated string meets end of file"); return 0; @@ -4699,6 +4810,10 @@ parse_string(parser_state *p) else if (c == '\n') { p->lineno++; p->column = 0; + if (unindent) { + escaped = push(escaped, (node*)pos); + pos--; + } if (type & STR_FUNC_ARRAY) { tokadd(p, '\n'); } @@ -4748,8 +4863,14 @@ parse_string(parser_state *p) tokfix(p); p->lstate = EXPR_BEG; p->cmd_start = TRUE; - pylval.nd = new_str(p, tok(p), toklen(p)); + node *nd = new_str(p, tok(p), toklen(p)); + pylval.nd = nd; if (hinf) { + if (unindent && head) { + hinf->indented = push(hinf->indented, cons(nd->cdr, escaped)); + if (hinf->indent == ~0U || spaces < hinf->indent) + hinf->indent = spaces; + } hinf->line_head = FALSE; return tHD_STRING_PART; } @@ -4870,7 +4991,7 @@ number_literal_suffix(parser_state *p) int mask = NUM_SUFFIX_R|NUM_SUFFIX_I; while ((c = nextc(p)) != -1) { - list = push(list, (node*)(intptr_t)c); + list = push(list, nint(c)); if ((mask & NUM_SUFFIX_I) && c == 'i') { result |= (mask & NUM_SUFFIX_I); @@ -4906,6 +5027,7 @@ heredoc_identifier(parser_state *p) int c; int type = str_heredoc; mrb_bool indent = FALSE; + mrb_bool squiggly = FALSE; mrb_bool quote = FALSE; node *newnode; parser_heredoc_info *info; @@ -4915,8 +5037,11 @@ heredoc_identifier(parser_state *p) pushback(p, c); return 0; } - if (c == '-') { - indent = TRUE; + if (c == '-' || c == '~') { + if (c == '-') + indent = TRUE; + if (c == '~') + squiggly = TRUE; c = nextc(p); } if (c == '\'' || c == '"') { @@ -4943,6 +5068,7 @@ heredoc_identifier(parser_state *p) if (! identchar(c)) { pushback(p, c); if (indent) pushback(p, '-'); + if (squiggly) pushback(p, '~'); return 0; } newtok(p); @@ -4959,7 +5085,10 @@ heredoc_identifier(parser_state *p) if (! quote) type |= STR_FUNC_EXPAND; info->type = (string_type)type; - info->allow_indent = indent; + info->allow_indent = indent || squiggly; + info->remove_indent = squiggly; + info->indent = ~0U; + info->indented = NULL; info->line_head = TRUE; info->doc = NULL; p->heredocs_from_nextline = push(p->heredocs_from_nextline, newnode); @@ -5086,7 +5215,7 @@ parser_yylex(parser_state *p) case '*': if ((c = nextc(p)) == '*') { if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(pow); + pylval.id = intern_op(pow); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5104,7 +5233,7 @@ parser_yylex(parser_state *p) } else { if (c == '=') { - pylval.id = MRB_OPSYM(mul); + pylval.id = intern_op(mul); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5220,7 +5349,7 @@ parser_yylex(parser_state *p) } if (c == '<') { if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(lshift); + pylval.id = intern_op(lshift); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5242,7 +5371,7 @@ parser_yylex(parser_state *p) } if (c == '>') { if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(rshift); + pylval.id = intern_op(rshift); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5350,7 +5479,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '&') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(andand); + pylval.id = intern_op(andand); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5362,7 +5491,7 @@ parser_yylex(parser_state *p) return tANDDOT; } else if (c == '=') { - pylval.id = MRB_OPSYM(and); + pylval.id = intern_op(and); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5389,7 +5518,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '|') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(oror); + pylval.id = intern_op(oror); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5397,7 +5526,7 @@ parser_yylex(parser_state *p) return tOROP; } if (c == '=') { - pylval.id = MRB_OPSYM(or); + pylval.id = intern_op(or); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5421,7 +5550,7 @@ parser_yylex(parser_state *p) return '+'; } if (c == '=') { - pylval.id = MRB_OPSYM(add); + pylval.id = intern_op(add); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5449,7 +5578,7 @@ parser_yylex(parser_state *p) return '-'; } if (c == '=') { - pylval.id = MRB_OPSYM(sub); + pylval.id = intern_op(sub); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5772,7 +5901,7 @@ parser_yylex(parser_state *p) return tREGEXP_BEG; } if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(div); + pylval.id = intern_op(div); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5791,7 +5920,7 @@ parser_yylex(parser_state *p) case '^': if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(xor); + pylval.id = intern_op(xor); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5844,6 +5973,7 @@ parser_yylex(parser_state *p) p->paren_nest++; if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { p->lstate = EXPR_ARG; + p->paren_nest--; if ((c = nextc(p)) == ']') { if ((c = nextc(p)) == '=') { return tASET; @@ -5968,7 +6098,7 @@ parser_yylex(parser_state *p) } } if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(mod); + pylval.id = intern_op(mod); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -7168,7 +7298,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) if (n2->car) { dump_prefix(n2, offset+2); printf("rest:\n"); - if (n2->car == (node*)-1) { + if (n2->car == nint(-1)) { dump_prefix(n2, offset+2); printf("(empty)\n"); } @@ -7410,11 +7540,11 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) case NODE_CLASS: printf("NODE_CLASS:\n"); - if (tree->car->car == (node*)0) { + if (tree->car->car == nint(0)) { dump_prefix(tree, offset+1); printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } - else if (tree->car->car == (node*)1) { + else if (tree->car->car == nint(1)) { dump_prefix(tree, offset+1); printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } @@ -7435,11 +7565,11 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) case NODE_MODULE: printf("NODE_MODULE:\n"); - if (tree->car->car == (node*)0) { + if (tree->car->car == nint(0)) { dump_prefix(tree, offset+1); printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } - else if (tree->car->car == (node*)1) { + else if (tree->car->car == nint(1)) { dump_prefix(tree, offset+1); printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 012f4a74e..a715abd0e 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. */ + along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -133,6 +133,7 @@ typedef unsigned int stack_type; #define nsym(x) ((node*)(intptr_t)(x)) #define nint(x) ((node*)(intptr_t)(x)) #define intn(x) ((int)(intptr_t)(x)) +#define typen(x) ((enum node_type)(intptr_t)(x)) #define NUM_SUFFIX_R (1<<0) #define NUM_SUFFIX_I (1<<1) @@ -151,7 +152,7 @@ intern_gen(parser_state *p, const char *s, size_t len) } #define intern(s,len) intern_gen(p,(s),(len)) -#define intern_lit(s) mrb_intern_lit(p->mrb, s) +#define intern_op(op) MRB_OPSYM_2(p->mrb, op) static void cons_free_gen(parser_state *p, node *cons) @@ -377,14 +378,14 @@ static void local_add_blk(parser_state *p, mrb_sym blk) { /* allocate register for block */ - local_add_f(p, blk ? blk : MRB_OPSYM(and)); + local_add_f(p, blk ? blk : intern_op(and)); } static void local_add_kw(parser_state *p, mrb_sym kwd) { /* allocate register for keywords hash */ - local_add_f(p, kwd ? kwd : MRB_OPSYM(pow)); + local_add_f(p, kwd ? kwd : intern_op(pow)); } static node* @@ -842,7 +843,7 @@ static void local_add_margs(parser_state *p, node *n) { while (n) { - if (n->car->car == (node*)NODE_MASGN) { + if (typen(n->car->car) == NODE_MASGN) { node *t = n->car->cdr->cdr; n->car->cdr->cdr = NULL; @@ -1022,13 +1023,13 @@ new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b) static node* new_imaginary(parser_state *p, node *imaginary) { - return new_call(p, new_const(p, MRB_SYM(Kernel)), MRB_SYM(Complex), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1); + return new_call(p, new_const(p, MRB_SYM_2(p->mrb, Kernel)), MRB_SYM_2(p->mrb, Complex), list1(list2(list3((node*)NODE_INT, (node*)strdup("0"), nint(10)), imaginary)), 1); } static node* new_rational(parser_state *p, node *rational) { - return new_call(p, new_const(p, MRB_SYM(Kernel)), MRB_SYM(Rational), list1(list1(rational)), 1); + return new_call(p, new_const(p, MRB_SYM_2(p->mrb, Kernel)), MRB_SYM_2(p->mrb, Rational), list1(list1(rational)), 1); } /* (:int . i) */ @@ -1078,7 +1079,7 @@ new_dstr(parser_state *p, node *a) static int string_node_p(node *n) { - return (int)((enum node_type)(intptr_t)n->car == NODE_STR); + return (int)(typen(n->car) == NODE_STR); } static node* @@ -1270,7 +1271,7 @@ call_with_block(parser_state *p, node *a, node *b) { node *n; - switch ((enum node_type)intn(a->car)) { + switch (typen(a->car)) { case NODE_SUPER: case NODE_ZSUPER: if (!a->cdr) a->cdr = cons(0, b); @@ -1344,7 +1345,7 @@ typedef enum mrb_string_type string_type; static node* new_strterm(parser_state *p, string_type type, int term, int paren) { - return cons(nint(type), cons((node*)0, cons(nint(paren), nint(term)))); + return cons(nint(type), cons(nint(0), cons(nint(paren), nint(term)))); } static void @@ -1431,7 +1432,7 @@ heredoc_end(parser_state *p) /* xxx ----------------------------- */ -#line 1435 "mrbgems/mruby-compiler/core/y.tab.c" +#line 1436 "mrbgems/mruby-compiler/core/y.tab.c" # ifndef YY_CAST # ifdef __cplusplus @@ -1603,7 +1604,7 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 1377 "mrbgems/mruby-compiler/core/parse.y" +#line 1378 "mrbgems/mruby-compiler/core/parse.y" node *nd; mrb_sym id; @@ -1611,7 +1612,7 @@ union YYSTYPE stack_type stack; const struct vtable *vars; -#line 1615 "mrbgems/mruby-compiler/core/y.tab.c" +#line 1616 "mrbgems/mruby-compiler/core/y.tab.c" }; typedef union YYSTYPE YYSTYPE; @@ -1997,67 +1998,67 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 1536, 1536, 1536, 1547, 1553, 1557, 1562, 1566, 1572, - 1574, 1573, 1587, 1614, 1620, 1624, 1629, 1633, 1639, 1639, - 1643, 1647, 1651, 1655, 1659, 1663, 1667, 1672, 1673, 1677, - 1681, 1685, 1689, 1696, 1699, 1703, 1707, 1711, 1715, 1719, - 1724, 1728, 1735, 1736, 1740, 1744, 1745, 1749, 1753, 1757, - 1761, 1765, 1775, 1774, 1789, 1798, 1799, 1802, 1803, 1810, - 1809, 1824, 1828, 1833, 1837, 1842, 1846, 1851, 1855, 1859, - 1863, 1867, 1873, 1877, 1883, 1884, 1890, 1894, 1898, 1902, - 1906, 1910, 1914, 1918, 1922, 1926, 1932, 1933, 1939, 1943, - 1949, 1953, 1959, 1963, 1967, 1971, 1975, 1979, 1985, 1991, - 1998, 2002, 2006, 2010, 2014, 2018, 2024, 2030, 2035, 2041, - 2045, 2048, 2052, 2056, 2063, 2064, 2065, 2066, 2071, 2078, - 2079, 2082, 2086, 2086, 2092, 2093, 2094, 2095, 2096, 2097, - 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, - 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, - 2118, 2119, 2120, 2121, 2124, 2124, 2124, 2125, 2125, 2126, - 2126, 2126, 2127, 2127, 2127, 2127, 2128, 2128, 2128, 2129, - 2129, 2129, 2130, 2130, 2130, 2130, 2131, 2131, 2131, 2131, - 2132, 2132, 2132, 2132, 2133, 2133, 2133, 2133, 2134, 2134, - 2134, 2134, 2135, 2135, 2138, 2142, 2146, 2150, 2154, 2158, - 2162, 2167, 2172, 2177, 2181, 2185, 2189, 2193, 2197, 2201, - 2205, 2209, 2213, 2217, 2221, 2225, 2229, 2233, 2237, 2241, - 2245, 2249, 2253, 2257, 2261, 2265, 2269, 2273, 2277, 2281, - 2285, 2289, 2293, 2297, 2301, 2305, 2309, 2313, 2317, 2321, - 2325, 2333, 2342, 2351, 2361, 2367, 2368, 2373, 2377, 2384, - 2388, 2396, 2400, 2416, 2442, 2443, 2446, 2447, 2448, 2453, - 2458, 2465, 2471, 2476, 2481, 2486, 2493, 2493, 2504, 2510, - 2514, 2520, 2521, 2524, 2530, 2536, 2541, 2548, 2553, 2558, - 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2576, 2581, - 2580, 2592, 2596, 2591, 2601, 2601, 2605, 2609, 2613, 2617, - 2622, 2627, 2631, 2635, 2639, 2643, 2647, 2648, 2654, 2660, - 2653, 2672, 2680, 2688, 2688, 2688, 2695, 2695, 2695, 2702, - 2708, 2713, 2715, 2712, 2724, 2722, 2740, 2745, 2738, 2762, - 2760, 2776, 2786, 2797, 2801, 2805, 2809, 2815, 2822, 2823, - 2824, 2827, 2828, 2831, 2832, 2840, 2841, 2847, 2851, 2854, - 2858, 2862, 2866, 2871, 2875, 2879, 2883, 2889, 2888, 2898, - 2902, 2906, 2910, 2916, 2921, 2926, 2930, 2934, 2938, 2942, - 2946, 2950, 2954, 2958, 2962, 2966, 2970, 2974, 2978, 2982, - 2988, 2993, 3000, 3000, 3004, 3009, 3016, 3020, 3026, 3027, - 3030, 3035, 3038, 3042, 3048, 3052, 3059, 3058, 3073, 3083, - 3087, 3092, 3099, 3103, 3107, 3111, 3115, 3119, 3123, 3127, - 3131, 3138, 3137, 3152, 3151, 3167, 3175, 3184, 3187, 3194, - 3197, 3201, 3202, 3205, 3209, 3212, 3216, 3219, 3220, 3221, - 3222, 3225, 3226, 3232, 3233, 3234, 3238, 3244, 3245, 3251, - 3256, 3255, 3266, 3270, 3276, 3280, 3286, 3290, 3296, 3299, - 3300, 3303, 3309, 3315, 3316, 3319, 3326, 3325, 3339, 3343, - 3350, 3355, 3362, 3368, 3369, 3370, 3371, 3372, 3376, 3382, - 3386, 3392, 3393, 3394, 3398, 3404, 3408, 3412, 3416, 3420, - 3426, 3430, 3436, 3440, 3444, 3448, 3452, 3456, 3464, 3471, - 3482, 3483, 3487, 3491, 3490, 3506, 3512, 3530, 3550, 3551, - 3557, 3563, 3569, 3576, 3581, 3588, 3592, 3598, 3602, 3608, - 3609, 3612, 3616, 3622, 3626, 3630, 3634, 3640, 3645, 3650, - 3654, 3658, 3662, 3666, 3670, 3674, 3678, 3682, 3686, 3690, - 3694, 3698, 3702, 3707, 3713, 3718, 3723, 3728, 3733, 3740, - 3744, 3751, 3756, 3755, 3767, 3771, 3777, 3785, 3793, 3801, - 3805, 3811, 3815, 3821, 3822, 3825, 3830, 3837, 3838, 3841, - 3847, 3851, 3857, 3862, 3862, 3887, 3888, 3894, 3899, 3905, - 3906, 3909, 3915, 3920, 3930, 3937, 3938, 3939, 3942, 3943, - 3944, 3945, 3948, 3949, 3950, 3953, 3954, 3957, 3961, 3967, - 3968, 3974, 3975, 3978, 3979, 3982, 3985, 3986, 3987, 3990, - 3991, 3992, 3995, 4002, 4003, 4007 + 0, 1537, 1537, 1537, 1548, 1554, 1558, 1563, 1567, 1573, + 1575, 1574, 1588, 1615, 1621, 1625, 1630, 1634, 1640, 1640, + 1644, 1648, 1652, 1656, 1660, 1664, 1668, 1673, 1674, 1678, + 1682, 1686, 1690, 1697, 1700, 1704, 1708, 1712, 1716, 1720, + 1725, 1729, 1736, 1737, 1741, 1745, 1746, 1750, 1754, 1758, + 1762, 1766, 1776, 1775, 1790, 1799, 1800, 1803, 1804, 1811, + 1810, 1825, 1829, 1834, 1838, 1843, 1847, 1852, 1856, 1860, + 1864, 1868, 1874, 1878, 1884, 1885, 1891, 1895, 1899, 1903, + 1907, 1911, 1915, 1919, 1923, 1927, 1933, 1934, 1940, 1944, + 1950, 1954, 1960, 1964, 1968, 1972, 1976, 1980, 1986, 1992, + 1999, 2003, 2007, 2011, 2015, 2019, 2025, 2031, 2036, 2042, + 2046, 2049, 2053, 2057, 2064, 2065, 2066, 2067, 2072, 2079, + 2080, 2083, 2087, 2087, 2093, 2094, 2095, 2096, 2097, 2098, + 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, + 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, + 2119, 2120, 2121, 2122, 2125, 2125, 2125, 2126, 2126, 2127, + 2127, 2127, 2128, 2128, 2128, 2128, 2129, 2129, 2129, 2130, + 2130, 2130, 2131, 2131, 2131, 2131, 2132, 2132, 2132, 2132, + 2133, 2133, 2133, 2133, 2134, 2134, 2134, 2134, 2135, 2135, + 2135, 2135, 2136, 2136, 2139, 2143, 2147, 2151, 2155, 2159, + 2163, 2168, 2173, 2178, 2182, 2186, 2190, 2194, 2198, 2202, + 2206, 2210, 2214, 2218, 2222, 2226, 2230, 2234, 2238, 2242, + 2246, 2250, 2254, 2258, 2262, 2266, 2270, 2274, 2278, 2282, + 2286, 2290, 2294, 2298, 2302, 2306, 2310, 2314, 2318, 2322, + 2326, 2334, 2343, 2352, 2362, 2368, 2369, 2374, 2378, 2385, + 2389, 2397, 2401, 2417, 2443, 2444, 2447, 2448, 2449, 2454, + 2459, 2466, 2472, 2477, 2482, 2487, 2494, 2494, 2505, 2511, + 2515, 2521, 2522, 2525, 2531, 2537, 2542, 2549, 2554, 2559, + 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2577, 2582, + 2581, 2593, 2597, 2592, 2602, 2602, 2606, 2610, 2614, 2618, + 2623, 2628, 2632, 2636, 2640, 2644, 2648, 2649, 2655, 2661, + 2654, 2673, 2681, 2689, 2689, 2689, 2696, 2696, 2696, 2703, + 2709, 2714, 2716, 2713, 2725, 2723, 2741, 2746, 2739, 2763, + 2761, 2777, 2787, 2798, 2802, 2806, 2810, 2816, 2823, 2824, + 2825, 2828, 2829, 2832, 2833, 2841, 2842, 2848, 2852, 2855, + 2859, 2863, 2867, 2872, 2876, 2880, 2884, 2890, 2889, 2899, + 2903, 2907, 2911, 2917, 2922, 2927, 2931, 2935, 2939, 2943, + 2947, 2951, 2955, 2959, 2963, 2967, 2971, 2975, 2979, 2983, + 2989, 2994, 3001, 3001, 3005, 3010, 3017, 3021, 3027, 3028, + 3031, 3036, 3039, 3043, 3049, 3053, 3060, 3059, 3074, 3084, + 3088, 3093, 3100, 3104, 3108, 3112, 3116, 3120, 3124, 3128, + 3132, 3139, 3138, 3153, 3152, 3168, 3176, 3185, 3188, 3195, + 3198, 3202, 3203, 3206, 3210, 3213, 3217, 3220, 3221, 3222, + 3223, 3226, 3227, 3233, 3234, 3235, 3239, 3245, 3246, 3252, + 3257, 3256, 3267, 3271, 3277, 3281, 3287, 3291, 3297, 3300, + 3301, 3304, 3310, 3316, 3317, 3320, 3327, 3326, 3340, 3344, + 3351, 3356, 3363, 3369, 3370, 3371, 3372, 3373, 3377, 3383, + 3387, 3393, 3394, 3395, 3399, 3405, 3409, 3413, 3417, 3421, + 3427, 3431, 3437, 3441, 3445, 3449, 3453, 3457, 3465, 3472, + 3483, 3484, 3488, 3492, 3491, 3507, 3513, 3531, 3551, 3552, + 3558, 3564, 3570, 3577, 3582, 3589, 3593, 3599, 3603, 3609, + 3610, 3613, 3617, 3623, 3627, 3631, 3635, 3641, 3646, 3651, + 3655, 3659, 3663, 3667, 3671, 3675, 3679, 3683, 3687, 3691, + 3695, 3699, 3703, 3708, 3714, 3719, 3724, 3729, 3734, 3741, + 3745, 3752, 3757, 3756, 3768, 3772, 3778, 3786, 3794, 3802, + 3806, 3812, 3816, 3822, 3823, 3826, 3831, 3838, 3839, 3842, + 3848, 3852, 3858, 3863, 3863, 3888, 3889, 3895, 3900, 3906, + 3907, 3910, 3916, 3921, 3931, 3938, 3939, 3940, 3943, 3944, + 3945, 3946, 3949, 3950, 3951, 3954, 3955, 3958, 3962, 3968, + 3969, 3975, 3976, 3979, 3980, 3983, 3986, 3987, 3988, 3991, + 3992, 3993, 3996, 4003, 4004, 4008 }; #endif @@ -5869,86 +5870,86 @@ yyreduce: switch (yyn) { case 2: -#line 1536 "mrbgems/mruby-compiler/core/parse.y" +#line 1537 "mrbgems/mruby-compiler/core/parse.y" { p->lstate = EXPR_BEG; if (!p->locals) p->locals = cons(0,0); } -#line 5878 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5879 "mrbgems/mruby-compiler/core/y.tab.c" break; case 3: -#line 1541 "mrbgems/mruby-compiler/core/parse.y" +#line 1542 "mrbgems/mruby-compiler/core/parse.y" { p->tree = new_scope(p, (yyvsp[0].nd)); NODE_LINENO(p->tree, (yyvsp[0].nd)); } -#line 5887 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5888 "mrbgems/mruby-compiler/core/y.tab.c" break; case 4: -#line 1548 "mrbgems/mruby-compiler/core/parse.y" +#line 1549 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 5895 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5896 "mrbgems/mruby-compiler/core/y.tab.c" break; case 5: -#line 1554 "mrbgems/mruby-compiler/core/parse.y" +#line 1555 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_begin(p, 0); } -#line 5903 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5904 "mrbgems/mruby-compiler/core/y.tab.c" break; case 6: -#line 1558 "mrbgems/mruby-compiler/core/parse.y" +#line 1559 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_begin(p, (yyvsp[0].nd)); NODE_LINENO((yyval.nd), (yyvsp[0].nd)); } -#line 5912 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5913 "mrbgems/mruby-compiler/core/y.tab.c" break; case 7: -#line 1563 "mrbgems/mruby-compiler/core/parse.y" +#line 1564 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), newline_node((yyvsp[0].nd))); } -#line 5920 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5921 "mrbgems/mruby-compiler/core/y.tab.c" break; case 8: -#line 1567 "mrbgems/mruby-compiler/core/parse.y" +#line 1568 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_begin(p, 0); } -#line 5928 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5929 "mrbgems/mruby-compiler/core/y.tab.c" break; case 10: -#line 1574 "mrbgems/mruby-compiler/core/parse.y" +#line 1575 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = local_switch(p); nvars_block(p); } -#line 5937 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5938 "mrbgems/mruby-compiler/core/y.tab.c" break; case 11: -#line 1579 "mrbgems/mruby-compiler/core/parse.y" +#line 1580 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "BEGIN not supported"); local_resume(p, (yyvsp[-3].nd)); nvars_unnest(p); (yyval.nd) = 0; } -#line 5948 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5949 "mrbgems/mruby-compiler/core/y.tab.c" break; case 12: -#line 1591 "mrbgems/mruby-compiler/core/parse.y" +#line 1592 "mrbgems/mruby-compiler/core/parse.y" { if ((yyvsp[-2].nd)) { (yyval.nd) = new_rescue(p, (yyvsp[-3].nd), (yyvsp[-2].nd), (yyvsp[-1].nd)); @@ -5970,291 +5971,291 @@ yyreduce: } } } -#line 5974 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5975 "mrbgems/mruby-compiler/core/y.tab.c" break; case 13: -#line 1615 "mrbgems/mruby-compiler/core/parse.y" +#line 1616 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 5982 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5983 "mrbgems/mruby-compiler/core/y.tab.c" break; case 14: -#line 1621 "mrbgems/mruby-compiler/core/parse.y" +#line 1622 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_begin(p, 0); } -#line 5990 "mrbgems/mruby-compiler/core/y.tab.c" +#line 5991 "mrbgems/mruby-compiler/core/y.tab.c" break; case 15: -#line 1625 "mrbgems/mruby-compiler/core/parse.y" +#line 1626 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_begin(p, (yyvsp[0].nd)); NODE_LINENO((yyval.nd), (yyvsp[0].nd)); } -#line 5999 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6000 "mrbgems/mruby-compiler/core/y.tab.c" break; case 16: -#line 1630 "mrbgems/mruby-compiler/core/parse.y" +#line 1631 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), newline_node((yyvsp[0].nd))); } -#line 6007 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6008 "mrbgems/mruby-compiler/core/y.tab.c" break; case 17: -#line 1634 "mrbgems/mruby-compiler/core/parse.y" +#line 1635 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_begin(p, (yyvsp[0].nd)); } -#line 6015 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6016 "mrbgems/mruby-compiler/core/y.tab.c" break; case 18: -#line 1639 "mrbgems/mruby-compiler/core/parse.y" +#line 1640 "mrbgems/mruby-compiler/core/parse.y" {p->lstate = EXPR_FNAME;} -#line 6021 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6022 "mrbgems/mruby-compiler/core/y.tab.c" break; case 19: -#line 1640 "mrbgems/mruby-compiler/core/parse.y" +#line 1641 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_alias(p, (yyvsp[-2].id), (yyvsp[0].id)); } -#line 6029 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6030 "mrbgems/mruby-compiler/core/y.tab.c" break; case 20: -#line 1644 "mrbgems/mruby-compiler/core/parse.y" +#line 1645 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 6037 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6038 "mrbgems/mruby-compiler/core/y.tab.c" break; case 21: -#line 1648 "mrbgems/mruby-compiler/core/parse.y" +#line 1649 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_if(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd), 0); } -#line 6045 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6046 "mrbgems/mruby-compiler/core/y.tab.c" break; case 22: -#line 1652 "mrbgems/mruby-compiler/core/parse.y" +#line 1653 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_unless(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd), 0); } -#line 6053 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6054 "mrbgems/mruby-compiler/core/y.tab.c" break; case 23: -#line 1656 "mrbgems/mruby-compiler/core/parse.y" +#line 1657 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_while(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd)); } -#line 6061 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6062 "mrbgems/mruby-compiler/core/y.tab.c" break; case 24: -#line 1660 "mrbgems/mruby-compiler/core/parse.y" +#line 1661 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_until(p, cond((yyvsp[0].nd)), (yyvsp[-2].nd)); } -#line 6069 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6070 "mrbgems/mruby-compiler/core/y.tab.c" break; case 25: -#line 1664 "mrbgems/mruby-compiler/core/parse.y" +#line 1665 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6077 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6078 "mrbgems/mruby-compiler/core/y.tab.c" break; case 26: -#line 1668 "mrbgems/mruby-compiler/core/parse.y" +#line 1669 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "END not supported"); (yyval.nd) = new_postexe(p, (yyvsp[-1].nd)); } -#line 6086 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6087 "mrbgems/mruby-compiler/core/y.tab.c" break; case 28: -#line 1674 "mrbgems/mruby-compiler/core/parse.y" +#line 1675 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_masgn(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6094 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6095 "mrbgems/mruby-compiler/core/y.tab.c" break; case 29: -#line 1678 "mrbgems/mruby-compiler/core/parse.y" +#line 1679 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_asgn(p, (yyvsp[-2].nd), new_array(p, (yyvsp[0].nd))); } -#line 6102 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6103 "mrbgems/mruby-compiler/core/y.tab.c" break; case 30: -#line 1682 "mrbgems/mruby-compiler/core/parse.y" +#line 1683 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_masgn(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6110 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6111 "mrbgems/mruby-compiler/core/y.tab.c" break; case 31: -#line 1686 "mrbgems/mruby-compiler/core/parse.y" +#line 1687 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_masgn(p, (yyvsp[-2].nd), new_array(p, (yyvsp[0].nd))); } -#line 6118 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6119 "mrbgems/mruby-compiler/core/y.tab.c" break; case 32: -#line 1690 "mrbgems/mruby-compiler/core/parse.y" +#line 1691 "mrbgems/mruby-compiler/core/parse.y" { node *lhs = new_lvar(p, (yyvsp[0].id)); void_expr_error(p, (yyvsp[-2].nd)); assignable(p, lhs); (yyval.nd) = new_asgn(p, lhs, (yyvsp[-2].nd)); } -#line 6129 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6130 "mrbgems/mruby-compiler/core/y.tab.c" break; case 34: -#line 1700 "mrbgems/mruby-compiler/core/parse.y" +#line 1701 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_asgn(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6137 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6138 "mrbgems/mruby-compiler/core/y.tab.c" break; case 35: -#line 1704 "mrbgems/mruby-compiler/core/parse.y" +#line 1705 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, (yyvsp[-2].nd), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6145 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6146 "mrbgems/mruby-compiler/core/y.tab.c" break; case 36: -#line 1708 "mrbgems/mruby-compiler/core/parse.y" +#line 1709 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), MRB_OPSYM(aref), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd)); + (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), intern_op(aref), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6153 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6154 "mrbgems/mruby-compiler/core/y.tab.c" break; case 37: -#line 1712 "mrbgems/mruby-compiler/core/parse.y" +#line 1713 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6161 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6162 "mrbgems/mruby-compiler/core/y.tab.c" break; case 38: -#line 1716 "mrbgems/mruby-compiler/core/parse.y" +#line 1717 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6169 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6170 "mrbgems/mruby-compiler/core/y.tab.c" break; case 39: -#line 1720 "mrbgems/mruby-compiler/core/parse.y" +#line 1721 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "constant re-assignment"); (yyval.nd) = 0; } -#line 6178 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6179 "mrbgems/mruby-compiler/core/y.tab.c" break; case 40: -#line 1725 "mrbgems/mruby-compiler/core/parse.y" +#line 1726 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, tCOLON2), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6186 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6187 "mrbgems/mruby-compiler/core/y.tab.c" break; case 41: -#line 1729 "mrbgems/mruby-compiler/core/parse.y" +#line 1730 "mrbgems/mruby-compiler/core/parse.y" { backref_error(p, (yyvsp[-2].nd)); (yyval.nd) = new_begin(p, 0); } -#line 6195 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6196 "mrbgems/mruby-compiler/core/y.tab.c" break; case 43: -#line 1737 "mrbgems/mruby-compiler/core/parse.y" +#line 1738 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6203 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6204 "mrbgems/mruby-compiler/core/y.tab.c" break; case 46: -#line 1746 "mrbgems/mruby-compiler/core/parse.y" +#line 1747 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_and(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6211 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6212 "mrbgems/mruby-compiler/core/y.tab.c" break; case 47: -#line 1750 "mrbgems/mruby-compiler/core/parse.y" +#line 1751 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_or(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6219 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6220 "mrbgems/mruby-compiler/core/y.tab.c" break; case 48: -#line 1754 "mrbgems/mruby-compiler/core/parse.y" +#line 1755 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!"); } -#line 6227 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6228 "mrbgems/mruby-compiler/core/y.tab.c" break; case 49: -#line 1758 "mrbgems/mruby-compiler/core/parse.y" +#line 1759 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!"); } -#line 6235 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6236 "mrbgems/mruby-compiler/core/y.tab.c" break; case 51: -#line 1766 "mrbgems/mruby-compiler/core/parse.y" +#line 1767 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_def(p, (yyvsp[0].id), nint(p->cmdarg_stack), local_switch(p)); p->cmdarg_stack = 0; p->in_def++; nvars_block(p); } -#line 6246 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6247 "mrbgems/mruby-compiler/core/y.tab.c" break; case 52: -#line 1775 "mrbgems/mruby-compiler/core/parse.y" +#line 1776 "mrbgems/mruby-compiler/core/parse.y" { p->lstate = EXPR_FNAME; } -#line 6254 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6255 "mrbgems/mruby-compiler/core/y.tab.c" break; case 53: -#line 1779 "mrbgems/mruby-compiler/core/parse.y" +#line 1780 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_sdef(p, (yyvsp[-3].nd), (yyvsp[0].id), nint(p->cmdarg_stack), local_switch(p)); p->cmdarg_stack = 0; @@ -6263,1054 +6264,1054 @@ yyreduce: nvars_block(p); p->lstate = EXPR_ENDFN; /* force for args */ } -#line 6267 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6268 "mrbgems/mruby-compiler/core/y.tab.c" break; case 54: -#line 1790 "mrbgems/mruby-compiler/core/parse.y" +#line 1791 "mrbgems/mruby-compiler/core/parse.y" { if (!(yyvsp[0].nd)) (yyval.nd) = new_nil(p); else { (yyval.nd) = (yyvsp[0].nd); } } -#line 6278 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6279 "mrbgems/mruby-compiler/core/y.tab.c" break; case 58: -#line 1804 "mrbgems/mruby-compiler/core/parse.y" +#line 1805 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num)); } -#line 6286 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6287 "mrbgems/mruby-compiler/core/y.tab.c" break; case 59: -#line 1810 "mrbgems/mruby-compiler/core/parse.y" +#line 1811 "mrbgems/mruby-compiler/core/parse.y" { local_nest(p); nvars_nest(p); } -#line 6295 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6296 "mrbgems/mruby-compiler/core/y.tab.c" break; case 60: -#line 1817 "mrbgems/mruby-compiler/core/parse.y" +#line 1818 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_block(p, (yyvsp[-2].nd), (yyvsp[-1].nd)); local_unnest(p); nvars_unnest(p); } -#line 6305 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6306 "mrbgems/mruby-compiler/core/y.tab.c" break; case 61: -#line 1825 "mrbgems/mruby-compiler/core/parse.y" +#line 1826 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_fcall(p, (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6313 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6314 "mrbgems/mruby-compiler/core/y.tab.c" break; case 62: -#line 1829 "mrbgems/mruby-compiler/core/parse.y" +#line 1830 "mrbgems/mruby-compiler/core/parse.y" { args_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd)); (yyval.nd) = new_fcall(p, (yyvsp[-2].id), (yyvsp[-1].nd)); } -#line 6322 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6323 "mrbgems/mruby-compiler/core/y.tab.c" break; case 63: -#line 1834 "mrbgems/mruby-compiler/core/parse.y" +#line 1835 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num)); } -#line 6330 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6331 "mrbgems/mruby-compiler/core/y.tab.c" break; case 64: -#line 1838 "mrbgems/mruby-compiler/core/parse.y" +#line 1839 "mrbgems/mruby-compiler/core/parse.y" { args_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd)); (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), (yyvsp[-3].num)); } -#line 6339 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6340 "mrbgems/mruby-compiler/core/y.tab.c" break; case 65: -#line 1843 "mrbgems/mruby-compiler/core/parse.y" +#line 1844 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), tCOLON2); } -#line 6347 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6348 "mrbgems/mruby-compiler/core/y.tab.c" break; case 66: -#line 1847 "mrbgems/mruby-compiler/core/parse.y" +#line 1848 "mrbgems/mruby-compiler/core/parse.y" { args_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd)); (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), tCOLON2); } -#line 6356 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6357 "mrbgems/mruby-compiler/core/y.tab.c" break; case 67: -#line 1852 "mrbgems/mruby-compiler/core/parse.y" +#line 1853 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_super(p, (yyvsp[0].nd)); } -#line 6364 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6365 "mrbgems/mruby-compiler/core/y.tab.c" break; case 68: -#line 1856 "mrbgems/mruby-compiler/core/parse.y" +#line 1857 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_yield(p, (yyvsp[0].nd)); } -#line 6372 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6373 "mrbgems/mruby-compiler/core/y.tab.c" break; case 69: -#line 1860 "mrbgems/mruby-compiler/core/parse.y" +#line 1861 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_return(p, ret_args(p, (yyvsp[0].nd))); } -#line 6380 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6381 "mrbgems/mruby-compiler/core/y.tab.c" break; case 70: -#line 1864 "mrbgems/mruby-compiler/core/parse.y" +#line 1865 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_break(p, ret_args(p, (yyvsp[0].nd))); } -#line 6388 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6389 "mrbgems/mruby-compiler/core/y.tab.c" break; case 71: -#line 1868 "mrbgems/mruby-compiler/core/parse.y" +#line 1869 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_next(p, ret_args(p, (yyvsp[0].nd))); } -#line 6396 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6397 "mrbgems/mruby-compiler/core/y.tab.c" break; case 72: -#line 1874 "mrbgems/mruby-compiler/core/parse.y" +#line 1875 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 6404 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6405 "mrbgems/mruby-compiler/core/y.tab.c" break; case 73: -#line 1878 "mrbgems/mruby-compiler/core/parse.y" +#line 1879 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 6412 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6413 "mrbgems/mruby-compiler/core/y.tab.c" break; case 75: -#line 1885 "mrbgems/mruby-compiler/core/parse.y" +#line 1886 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 6420 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6421 "mrbgems/mruby-compiler/core/y.tab.c" break; case 76: -#line 1891 "mrbgems/mruby-compiler/core/parse.y" +#line 1892 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 6428 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6429 "mrbgems/mruby-compiler/core/y.tab.c" break; case 77: -#line 1895 "mrbgems/mruby-compiler/core/parse.y" +#line 1896 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1(push((yyvsp[-1].nd),(yyvsp[0].nd))); } -#line 6436 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6437 "mrbgems/mruby-compiler/core/y.tab.c" break; case 78: -#line 1899 "mrbgems/mruby-compiler/core/parse.y" +#line 1900 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list2((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6444 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6445 "mrbgems/mruby-compiler/core/y.tab.c" break; case 79: -#line 1903 "mrbgems/mruby-compiler/core/parse.y" +#line 1904 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3((yyvsp[-4].nd), (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6452 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6453 "mrbgems/mruby-compiler/core/y.tab.c" break; case 80: -#line 1907 "mrbgems/mruby-compiler/core/parse.y" +#line 1908 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list2((yyvsp[-1].nd), new_nil(p)); } -#line 6460 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6461 "mrbgems/mruby-compiler/core/y.tab.c" break; case 81: -#line 1911 "mrbgems/mruby-compiler/core/parse.y" +#line 1912 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3((yyvsp[-3].nd), new_nil(p), (yyvsp[0].nd)); } -#line 6468 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6469 "mrbgems/mruby-compiler/core/y.tab.c" break; case 82: -#line 1915 "mrbgems/mruby-compiler/core/parse.y" +#line 1916 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list2(0, (yyvsp[0].nd)); } -#line 6476 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6477 "mrbgems/mruby-compiler/core/y.tab.c" break; case 83: -#line 1919 "mrbgems/mruby-compiler/core/parse.y" +#line 1920 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3(0, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6484 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6485 "mrbgems/mruby-compiler/core/y.tab.c" break; case 84: -#line 1923 "mrbgems/mruby-compiler/core/parse.y" +#line 1924 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list2(0, new_nil(p)); } -#line 6492 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6493 "mrbgems/mruby-compiler/core/y.tab.c" break; case 85: -#line 1927 "mrbgems/mruby-compiler/core/parse.y" +#line 1928 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3(0, new_nil(p), (yyvsp[0].nd)); } -#line 6500 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6501 "mrbgems/mruby-compiler/core/y.tab.c" break; case 87: -#line 1934 "mrbgems/mruby-compiler/core/parse.y" +#line 1935 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_masgn(p, (yyvsp[-1].nd), NULL); } -#line 6508 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6509 "mrbgems/mruby-compiler/core/y.tab.c" break; case 88: -#line 1940 "mrbgems/mruby-compiler/core/parse.y" +#line 1941 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[-1].nd)); } -#line 6516 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6517 "mrbgems/mruby-compiler/core/y.tab.c" break; case 89: -#line 1944 "mrbgems/mruby-compiler/core/parse.y" +#line 1945 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[-1].nd)); } -#line 6524 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6525 "mrbgems/mruby-compiler/core/y.tab.c" break; case 90: -#line 1950 "mrbgems/mruby-compiler/core/parse.y" +#line 1951 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 6532 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6533 "mrbgems/mruby-compiler/core/y.tab.c" break; case 91: -#line 1954 "mrbgems/mruby-compiler/core/parse.y" +#line 1955 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 6540 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6541 "mrbgems/mruby-compiler/core/y.tab.c" break; case 92: -#line 1960 "mrbgems/mruby-compiler/core/parse.y" +#line 1961 "mrbgems/mruby-compiler/core/parse.y" { assignable(p, (yyvsp[0].nd)); } -#line 6548 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6549 "mrbgems/mruby-compiler/core/y.tab.c" break; case 93: -#line 1964 "mrbgems/mruby-compiler/core/parse.y" +#line 1965 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = new_call(p, (yyvsp[-3].nd), MRB_OPSYM(aref), (yyvsp[-1].nd), '.'); + (yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_op(aref), (yyvsp[-1].nd), '.'); } -#line 6556 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6557 "mrbgems/mruby-compiler/core/y.tab.c" break; case 94: -#line 1968 "mrbgems/mruby-compiler/core/parse.y" +#line 1969 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num)); } -#line 6564 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6565 "mrbgems/mruby-compiler/core/y.tab.c" break; case 95: -#line 1972 "mrbgems/mruby-compiler/core/parse.y" +#line 1973 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2); } -#line 6572 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6573 "mrbgems/mruby-compiler/core/y.tab.c" break; case 96: -#line 1976 "mrbgems/mruby-compiler/core/parse.y" +#line 1977 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num)); } -#line 6580 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6581 "mrbgems/mruby-compiler/core/y.tab.c" break; case 97: -#line 1980 "mrbgems/mruby-compiler/core/parse.y" +#line 1981 "mrbgems/mruby-compiler/core/parse.y" { if (p->in_def || p->in_single) yyerror(p, "dynamic constant assignment"); (yyval.nd) = new_colon2(p, (yyvsp[-2].nd), (yyvsp[0].id)); } -#line 6590 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6591 "mrbgems/mruby-compiler/core/y.tab.c" break; case 98: -#line 1986 "mrbgems/mruby-compiler/core/parse.y" +#line 1987 "mrbgems/mruby-compiler/core/parse.y" { if (p->in_def || p->in_single) yyerror(p, "dynamic constant assignment"); (yyval.nd) = new_colon3(p, (yyvsp[0].id)); } -#line 6600 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6601 "mrbgems/mruby-compiler/core/y.tab.c" break; case 99: -#line 1992 "mrbgems/mruby-compiler/core/parse.y" +#line 1993 "mrbgems/mruby-compiler/core/parse.y" { backref_error(p, (yyvsp[0].nd)); (yyval.nd) = 0; } -#line 6609 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6610 "mrbgems/mruby-compiler/core/y.tab.c" break; case 100: -#line 1999 "mrbgems/mruby-compiler/core/parse.y" +#line 2000 "mrbgems/mruby-compiler/core/parse.y" { assignable(p, (yyvsp[0].nd)); } -#line 6617 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6618 "mrbgems/mruby-compiler/core/y.tab.c" break; case 101: -#line 2003 "mrbgems/mruby-compiler/core/parse.y" +#line 2004 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = new_call(p, (yyvsp[-3].nd), MRB_OPSYM(aref), (yyvsp[-1].nd), '.'); + (yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_op(aref), (yyvsp[-1].nd), '.'); } -#line 6625 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6626 "mrbgems/mruby-compiler/core/y.tab.c" break; case 102: -#line 2007 "mrbgems/mruby-compiler/core/parse.y" +#line 2008 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num)); } -#line 6633 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6634 "mrbgems/mruby-compiler/core/y.tab.c" break; case 103: -#line 2011 "mrbgems/mruby-compiler/core/parse.y" +#line 2012 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2); } -#line 6641 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6642 "mrbgems/mruby-compiler/core/y.tab.c" break; case 104: -#line 2015 "mrbgems/mruby-compiler/core/parse.y" +#line 2016 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, (yyvsp[-1].num)); } -#line 6649 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6650 "mrbgems/mruby-compiler/core/y.tab.c" break; case 105: -#line 2019 "mrbgems/mruby-compiler/core/parse.y" +#line 2020 "mrbgems/mruby-compiler/core/parse.y" { if (p->in_def || p->in_single) yyerror(p, "dynamic constant assignment"); (yyval.nd) = new_colon2(p, (yyvsp[-2].nd), (yyvsp[0].id)); } -#line 6659 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6660 "mrbgems/mruby-compiler/core/y.tab.c" break; case 106: -#line 2025 "mrbgems/mruby-compiler/core/parse.y" +#line 2026 "mrbgems/mruby-compiler/core/parse.y" { if (p->in_def || p->in_single) yyerror(p, "dynamic constant assignment"); (yyval.nd) = new_colon3(p, (yyvsp[0].id)); } -#line 6669 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6670 "mrbgems/mruby-compiler/core/y.tab.c" break; case 107: -#line 2031 "mrbgems/mruby-compiler/core/parse.y" +#line 2032 "mrbgems/mruby-compiler/core/parse.y" { backref_error(p, (yyvsp[0].nd)); (yyval.nd) = 0; } -#line 6678 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6679 "mrbgems/mruby-compiler/core/y.tab.c" break; case 108: -#line 2036 "mrbgems/mruby-compiler/core/parse.y" +#line 2037 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "can't assign to numbered parameter"); } -#line 6686 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6687 "mrbgems/mruby-compiler/core/y.tab.c" break; case 109: -#line 2042 "mrbgems/mruby-compiler/core/parse.y" +#line 2043 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "class/module name must be CONSTANT"); } -#line 6694 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6695 "mrbgems/mruby-compiler/core/y.tab.c" break; case 111: -#line 2049 "mrbgems/mruby-compiler/core/parse.y" +#line 2050 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = cons((node*)1, nsym((yyvsp[0].id))); + (yyval.nd) = cons(nint(1), nsym((yyvsp[0].id))); } -#line 6702 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6703 "mrbgems/mruby-compiler/core/y.tab.c" break; case 112: -#line 2053 "mrbgems/mruby-compiler/core/parse.y" +#line 2054 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = cons((node*)0, nsym((yyvsp[0].id))); + (yyval.nd) = cons(nint(0), nsym((yyvsp[0].id))); } -#line 6710 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6711 "mrbgems/mruby-compiler/core/y.tab.c" break; case 113: -#line 2057 "mrbgems/mruby-compiler/core/parse.y" +#line 2058 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[-2].nd)); (yyval.nd) = cons((yyvsp[-2].nd), nsym((yyvsp[0].id))); } -#line 6719 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6720 "mrbgems/mruby-compiler/core/y.tab.c" break; case 117: -#line 2067 "mrbgems/mruby-compiler/core/parse.y" +#line 2068 "mrbgems/mruby-compiler/core/parse.y" { p->lstate = EXPR_ENDFN; (yyval.id) = (yyvsp[0].id); } -#line 6728 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6729 "mrbgems/mruby-compiler/core/y.tab.c" break; case 118: -#line 2072 "mrbgems/mruby-compiler/core/parse.y" +#line 2073 "mrbgems/mruby-compiler/core/parse.y" { p->lstate = EXPR_ENDFN; (yyval.id) = (yyvsp[0].id); } -#line 6737 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6738 "mrbgems/mruby-compiler/core/y.tab.c" break; case 121: -#line 2083 "mrbgems/mruby-compiler/core/parse.y" +#line 2084 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_undef(p, (yyvsp[0].id)); } -#line 6745 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6746 "mrbgems/mruby-compiler/core/y.tab.c" break; case 122: -#line 2086 "mrbgems/mruby-compiler/core/parse.y" +#line 2087 "mrbgems/mruby-compiler/core/parse.y" {p->lstate = EXPR_FNAME;} -#line 6751 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6752 "mrbgems/mruby-compiler/core/y.tab.c" break; case 123: -#line 2087 "mrbgems/mruby-compiler/core/parse.y" +#line 2088 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-3].nd), nsym((yyvsp[0].id))); } -#line 6759 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6760 "mrbgems/mruby-compiler/core/y.tab.c" break; case 124: -#line 2092 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(or); } -#line 6765 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2093 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(or); } +#line 6766 "mrbgems/mruby-compiler/core/y.tab.c" break; case 125: -#line 2093 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(xor); } -#line 6771 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2094 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(xor); } +#line 6772 "mrbgems/mruby-compiler/core/y.tab.c" break; case 126: -#line 2094 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(and); } -#line 6777 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2095 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(and); } +#line 6778 "mrbgems/mruby-compiler/core/y.tab.c" break; case 127: -#line 2095 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(cmp); } -#line 6783 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2096 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(cmp); } +#line 6784 "mrbgems/mruby-compiler/core/y.tab.c" break; case 128: -#line 2096 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(eq); } -#line 6789 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2097 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(eq); } +#line 6790 "mrbgems/mruby-compiler/core/y.tab.c" break; case 129: -#line 2097 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(eqq); } -#line 6795 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2098 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(eqq); } +#line 6796 "mrbgems/mruby-compiler/core/y.tab.c" break; case 130: -#line 2098 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(match); } -#line 6801 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2099 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(match); } +#line 6802 "mrbgems/mruby-compiler/core/y.tab.c" break; case 131: -#line 2099 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(nmatch); } -#line 6807 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2100 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(nmatch); } +#line 6808 "mrbgems/mruby-compiler/core/y.tab.c" break; case 132: -#line 2100 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(gt); } -#line 6813 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2101 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(gt); } +#line 6814 "mrbgems/mruby-compiler/core/y.tab.c" break; case 133: -#line 2101 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(ge); } -#line 6819 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2102 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(ge); } +#line 6820 "mrbgems/mruby-compiler/core/y.tab.c" break; case 134: -#line 2102 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(lt); } -#line 6825 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2103 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(lt); } +#line 6826 "mrbgems/mruby-compiler/core/y.tab.c" break; case 135: -#line 2103 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(le); } -#line 6831 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2104 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(le); } +#line 6832 "mrbgems/mruby-compiler/core/y.tab.c" break; case 136: -#line 2104 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(neq); } -#line 6837 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2105 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(neq); } +#line 6838 "mrbgems/mruby-compiler/core/y.tab.c" break; case 137: -#line 2105 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(lshift); } -#line 6843 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2106 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(lshift); } +#line 6844 "mrbgems/mruby-compiler/core/y.tab.c" break; case 138: -#line 2106 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(rshift); } -#line 6849 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2107 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(rshift); } +#line 6850 "mrbgems/mruby-compiler/core/y.tab.c" break; case 139: -#line 2107 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(add); } -#line 6855 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2108 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(add); } +#line 6856 "mrbgems/mruby-compiler/core/y.tab.c" break; case 140: -#line 2108 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(sub); } -#line 6861 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2109 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(sub); } +#line 6862 "mrbgems/mruby-compiler/core/y.tab.c" break; case 141: -#line 2109 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(mul); } -#line 6867 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2110 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(mul); } +#line 6868 "mrbgems/mruby-compiler/core/y.tab.c" break; case 142: -#line 2110 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(mul); } -#line 6873 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2111 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(mul); } +#line 6874 "mrbgems/mruby-compiler/core/y.tab.c" break; case 143: -#line 2111 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(div); } -#line 6879 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2112 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(div); } +#line 6880 "mrbgems/mruby-compiler/core/y.tab.c" break; case 144: -#line 2112 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(mod); } -#line 6885 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2113 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(mod); } +#line 6886 "mrbgems/mruby-compiler/core/y.tab.c" break; case 145: -#line 2113 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(pow); } -#line 6891 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2114 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(pow); } +#line 6892 "mrbgems/mruby-compiler/core/y.tab.c" break; case 146: -#line 2114 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(pow); } -#line 6897 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2115 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(pow); } +#line 6898 "mrbgems/mruby-compiler/core/y.tab.c" break; case 147: -#line 2115 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(not); } -#line 6903 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2116 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(not); } +#line 6904 "mrbgems/mruby-compiler/core/y.tab.c" break; case 148: -#line 2116 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(neg); } -#line 6909 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2117 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(neg); } +#line 6910 "mrbgems/mruby-compiler/core/y.tab.c" break; case 149: -#line 2117 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(plus); } -#line 6915 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2118 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(plus); } +#line 6916 "mrbgems/mruby-compiler/core/y.tab.c" break; case 150: -#line 2118 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(minus); } -#line 6921 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2119 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(minus); } +#line 6922 "mrbgems/mruby-compiler/core/y.tab.c" break; case 151: -#line 2119 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(aref); } -#line 6927 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2120 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(aref); } +#line 6928 "mrbgems/mruby-compiler/core/y.tab.c" break; case 152: -#line 2120 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(aset); } -#line 6933 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2121 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(aset); } +#line 6934 "mrbgems/mruby-compiler/core/y.tab.c" break; case 153: -#line 2121 "mrbgems/mruby-compiler/core/parse.y" - { (yyval.id) = MRB_OPSYM(tick); } -#line 6939 "mrbgems/mruby-compiler/core/y.tab.c" +#line 2122 "mrbgems/mruby-compiler/core/parse.y" + { (yyval.id) = intern_op(tick); } +#line 6940 "mrbgems/mruby-compiler/core/y.tab.c" break; case 194: -#line 2139 "mrbgems/mruby-compiler/core/parse.y" +#line 2140 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_asgn(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 6947 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6948 "mrbgems/mruby-compiler/core/y.tab.c" break; case 195: -#line 2143 "mrbgems/mruby-compiler/core/parse.y" +#line 2144 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, (yyvsp[-2].nd), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6955 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6956 "mrbgems/mruby-compiler/core/y.tab.c" break; case 196: -#line 2147 "mrbgems/mruby-compiler/core/parse.y" +#line 2148 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), MRB_OPSYM(aref), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd)); + (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-5].nd), intern_op(aref), (yyvsp[-3].nd), '.'), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6963 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6964 "mrbgems/mruby-compiler/core/y.tab.c" break; case 197: -#line 2151 "mrbgems/mruby-compiler/core/parse.y" +#line 2152 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6971 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6972 "mrbgems/mruby-compiler/core/y.tab.c" break; case 198: -#line 2155 "mrbgems/mruby-compiler/core/parse.y" +#line 2156 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, (yyvsp[-3].num)), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6979 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6980 "mrbgems/mruby-compiler/core/y.tab.c" break; case 199: -#line 2159 "mrbgems/mruby-compiler/core/parse.y" +#line 2160 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), 0, tCOLON2), (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 6987 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6988 "mrbgems/mruby-compiler/core/y.tab.c" break; case 200: -#line 2163 "mrbgems/mruby-compiler/core/parse.y" +#line 2164 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "constant re-assignment"); (yyval.nd) = new_begin(p, 0); } -#line 6996 "mrbgems/mruby-compiler/core/y.tab.c" +#line 6997 "mrbgems/mruby-compiler/core/y.tab.c" break; case 201: -#line 2168 "mrbgems/mruby-compiler/core/parse.y" +#line 2169 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "constant re-assignment"); (yyval.nd) = new_begin(p, 0); } -#line 7005 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7006 "mrbgems/mruby-compiler/core/y.tab.c" break; case 202: -#line 2173 "mrbgems/mruby-compiler/core/parse.y" +#line 2174 "mrbgems/mruby-compiler/core/parse.y" { backref_error(p, (yyvsp[-2].nd)); (yyval.nd) = new_begin(p, 0); } -#line 7014 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7015 "mrbgems/mruby-compiler/core/y.tab.c" break; case 203: -#line 2178 "mrbgems/mruby-compiler/core/parse.y" +#line 2179 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dot2(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 7022 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7023 "mrbgems/mruby-compiler/core/y.tab.c" break; case 204: -#line 2182 "mrbgems/mruby-compiler/core/parse.y" +#line 2183 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dot2(p, (yyvsp[-1].nd), new_nil(p)); } -#line 7030 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7031 "mrbgems/mruby-compiler/core/y.tab.c" break; case 205: -#line 2186 "mrbgems/mruby-compiler/core/parse.y" +#line 2187 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dot2(p, new_nil(p), (yyvsp[0].nd)); } -#line 7038 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7039 "mrbgems/mruby-compiler/core/y.tab.c" break; case 206: -#line 2190 "mrbgems/mruby-compiler/core/parse.y" +#line 2191 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dot3(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 7046 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7047 "mrbgems/mruby-compiler/core/y.tab.c" break; case 207: -#line 2194 "mrbgems/mruby-compiler/core/parse.y" +#line 2195 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dot3(p, (yyvsp[-1].nd), new_nil(p)); } -#line 7054 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7055 "mrbgems/mruby-compiler/core/y.tab.c" break; case 208: -#line 2198 "mrbgems/mruby-compiler/core/parse.y" +#line 2199 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dot3(p, new_nil(p), (yyvsp[0].nd)); } -#line 7062 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7063 "mrbgems/mruby-compiler/core/y.tab.c" break; case 209: -#line 2202 "mrbgems/mruby-compiler/core/parse.y" +#line 2203 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "+", (yyvsp[0].nd)); } -#line 7070 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7071 "mrbgems/mruby-compiler/core/y.tab.c" break; case 210: -#line 2206 "mrbgems/mruby-compiler/core/parse.y" +#line 2207 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "-", (yyvsp[0].nd)); } -#line 7078 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7079 "mrbgems/mruby-compiler/core/y.tab.c" break; case 211: -#line 2210 "mrbgems/mruby-compiler/core/parse.y" +#line 2211 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "*", (yyvsp[0].nd)); } -#line 7086 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7087 "mrbgems/mruby-compiler/core/y.tab.c" break; case 212: -#line 2214 "mrbgems/mruby-compiler/core/parse.y" +#line 2215 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "/", (yyvsp[0].nd)); } -#line 7094 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7095 "mrbgems/mruby-compiler/core/y.tab.c" break; case 213: -#line 2218 "mrbgems/mruby-compiler/core/parse.y" +#line 2219 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "%", (yyvsp[0].nd)); } -#line 7102 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7103 "mrbgems/mruby-compiler/core/y.tab.c" break; case 214: -#line 2222 "mrbgems/mruby-compiler/core/parse.y" +#line 2223 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)); } -#line 7110 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7111 "mrbgems/mruby-compiler/core/y.tab.c" break; case 215: -#line 2226 "mrbgems/mruby-compiler/core/parse.y" +#line 2227 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@"); } -#line 7118 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7119 "mrbgems/mruby-compiler/core/y.tab.c" break; case 216: -#line 2230 "mrbgems/mruby-compiler/core/parse.y" +#line 2231 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].nd), "**", (yyvsp[0].nd)), "-@"); } -#line 7126 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7127 "mrbgems/mruby-compiler/core/y.tab.c" break; case 217: -#line 2234 "mrbgems/mruby-compiler/core/parse.y" +#line 2235 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, (yyvsp[0].nd), "+@"); } -#line 7134 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7135 "mrbgems/mruby-compiler/core/y.tab.c" break; case 218: -#line 2238 "mrbgems/mruby-compiler/core/parse.y" +#line 2239 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, (yyvsp[0].nd), "-@"); } -#line 7142 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7143 "mrbgems/mruby-compiler/core/y.tab.c" break; case 219: -#line 2242 "mrbgems/mruby-compiler/core/parse.y" +#line 2243 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "|", (yyvsp[0].nd)); } -#line 7150 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7151 "mrbgems/mruby-compiler/core/y.tab.c" break; case 220: -#line 2246 "mrbgems/mruby-compiler/core/parse.y" +#line 2247 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "^", (yyvsp[0].nd)); } -#line 7158 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7159 "mrbgems/mruby-compiler/core/y.tab.c" break; case 221: -#line 2250 "mrbgems/mruby-compiler/core/parse.y" +#line 2251 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "&", (yyvsp[0].nd)); } -#line 7166 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7167 "mrbgems/mruby-compiler/core/y.tab.c" break; case 222: -#line 2254 "mrbgems/mruby-compiler/core/parse.y" +#line 2255 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<=>", (yyvsp[0].nd)); } -#line 7174 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7175 "mrbgems/mruby-compiler/core/y.tab.c" break; case 223: -#line 2258 "mrbgems/mruby-compiler/core/parse.y" +#line 2259 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">", (yyvsp[0].nd)); } -#line 7182 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7183 "mrbgems/mruby-compiler/core/y.tab.c" break; case 224: -#line 2262 "mrbgems/mruby-compiler/core/parse.y" +#line 2263 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">=", (yyvsp[0].nd)); } -#line 7190 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7191 "mrbgems/mruby-compiler/core/y.tab.c" break; case 225: -#line 2266 "mrbgems/mruby-compiler/core/parse.y" +#line 2267 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<", (yyvsp[0].nd)); } -#line 7198 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7199 "mrbgems/mruby-compiler/core/y.tab.c" break; case 226: -#line 2270 "mrbgems/mruby-compiler/core/parse.y" +#line 2271 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<=", (yyvsp[0].nd)); } -#line 7206 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7207 "mrbgems/mruby-compiler/core/y.tab.c" break; case 227: -#line 2274 "mrbgems/mruby-compiler/core/parse.y" +#line 2275 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "==", (yyvsp[0].nd)); } -#line 7214 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7215 "mrbgems/mruby-compiler/core/y.tab.c" break; case 228: -#line 2278 "mrbgems/mruby-compiler/core/parse.y" +#line 2279 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "===", (yyvsp[0].nd)); } -#line 7222 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7223 "mrbgems/mruby-compiler/core/y.tab.c" break; case 229: -#line 2282 "mrbgems/mruby-compiler/core/parse.y" +#line 2283 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "!=", (yyvsp[0].nd)); } -#line 7230 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7231 "mrbgems/mruby-compiler/core/y.tab.c" break; case 230: -#line 2286 "mrbgems/mruby-compiler/core/parse.y" +#line 2287 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "=~", (yyvsp[0].nd)); } -#line 7238 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7239 "mrbgems/mruby-compiler/core/y.tab.c" break; case 231: -#line 2290 "mrbgems/mruby-compiler/core/parse.y" +#line 2291 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "!~", (yyvsp[0].nd)); } -#line 7246 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7247 "mrbgems/mruby-compiler/core/y.tab.c" break; case 232: -#line 2294 "mrbgems/mruby-compiler/core/parse.y" +#line 2295 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "!"); } -#line 7254 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7255 "mrbgems/mruby-compiler/core/y.tab.c" break; case 233: -#line 2298 "mrbgems/mruby-compiler/core/parse.y" +#line 2299 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, cond((yyvsp[0].nd)), "~"); } -#line 7262 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7263 "mrbgems/mruby-compiler/core/y.tab.c" break; case 234: -#line 2302 "mrbgems/mruby-compiler/core/parse.y" +#line 2303 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), "<<", (yyvsp[0].nd)); } -#line 7270 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7271 "mrbgems/mruby-compiler/core/y.tab.c" break; case 235: -#line 2306 "mrbgems/mruby-compiler/core/parse.y" +#line 2307 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_bin_op(p, (yyvsp[-2].nd), ">>", (yyvsp[0].nd)); } -#line 7278 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7279 "mrbgems/mruby-compiler/core/y.tab.c" break; case 236: -#line 2310 "mrbgems/mruby-compiler/core/parse.y" +#line 2311 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_and(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 7286 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7287 "mrbgems/mruby-compiler/core/y.tab.c" break; case 237: -#line 2314 "mrbgems/mruby-compiler/core/parse.y" +#line 2315 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_or(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 7294 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7295 "mrbgems/mruby-compiler/core/y.tab.c" break; case 238: -#line 2318 "mrbgems/mruby-compiler/core/parse.y" +#line 2319 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_if(p, cond((yyvsp[-5].nd)), (yyvsp[-3].nd), (yyvsp[0].nd)); } -#line 7302 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7303 "mrbgems/mruby-compiler/core/y.tab.c" break; case 239: -#line 2322 "mrbgems/mruby-compiler/core/parse.y" +#line 2323 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_if(p, cond((yyvsp[-5].nd)), (yyvsp[-3].nd), (yyvsp[0].nd)); } -#line 7310 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7311 "mrbgems/mruby-compiler/core/y.tab.c" break; case 240: -#line 2326 "mrbgems/mruby-compiler/core/parse.y" +#line 2327 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-3].nd); void_expr_error(p, (yyvsp[0].nd)); @@ -7318,11 +7319,11 @@ yyreduce: nvars_unnest(p); p->in_def--; } -#line 7322 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7323 "mrbgems/mruby-compiler/core/y.tab.c" break; case 241: -#line 2334 "mrbgems/mruby-compiler/core/parse.y" +#line 2335 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-5].nd); void_expr_error(p, (yyvsp[-2].nd)); @@ -7331,11 +7332,11 @@ yyreduce: nvars_unnest(p); p->in_def--; } -#line 7335 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7336 "mrbgems/mruby-compiler/core/y.tab.c" break; case 242: -#line 2343 "mrbgems/mruby-compiler/core/parse.y" +#line 2344 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-3].nd); void_expr_error(p, (yyvsp[0].nd)); @@ -7344,11 +7345,11 @@ yyreduce: p->in_def--; p->in_single--; } -#line 7348 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7349 "mrbgems/mruby-compiler/core/y.tab.c" break; case 243: -#line 2352 "mrbgems/mruby-compiler/core/parse.y" +#line 2353 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-5].nd); void_expr_error(p, (yyvsp[-2].nd)); @@ -7358,103 +7359,103 @@ yyreduce: p->in_def--; p->in_single--; } -#line 7362 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7363 "mrbgems/mruby-compiler/core/y.tab.c" break; case 244: -#line 2362 "mrbgems/mruby-compiler/core/parse.y" +#line 2363 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 7370 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7371 "mrbgems/mruby-compiler/core/y.tab.c" break; case 246: -#line 2369 "mrbgems/mruby-compiler/core/parse.y" +#line 2370 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7379 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7380 "mrbgems/mruby-compiler/core/y.tab.c" break; case 247: -#line 2374 "mrbgems/mruby-compiler/core/parse.y" +#line 2375 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-3].nd), new_kw_hash(p, (yyvsp[-1].nd))); } -#line 7387 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7388 "mrbgems/mruby-compiler/core/y.tab.c" break; case 248: -#line 2378 "mrbgems/mruby-compiler/core/parse.y" +#line 2379 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(new_kw_hash(p, (yyvsp[-1].nd)), 0); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7396 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7397 "mrbgems/mruby-compiler/core/y.tab.c" break; case 249: -#line 2385 "mrbgems/mruby-compiler/core/parse.y" +#line 2386 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 7404 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7405 "mrbgems/mruby-compiler/core/y.tab.c" break; case 250: -#line 2389 "mrbgems/mruby-compiler/core/parse.y" +#line 2390 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[-2].nd)); void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = new_mod_rescue(p, (yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 7414 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7415 "mrbgems/mruby-compiler/core/y.tab.c" break; case 251: -#line 2397 "mrbgems/mruby-compiler/core/parse.y" +#line 2398 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 7422 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7423 "mrbgems/mruby-compiler/core/y.tab.c" break; case 252: -#line 2401 "mrbgems/mruby-compiler/core/parse.y" +#line 2402 "mrbgems/mruby-compiler/core/parse.y" { #if 1 - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); (yyval.nd) = cons(push((yyvsp[-3].nd), new_splat(p, new_lvar(p, r))), new_block_arg(p, new_lvar(p, b))); #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); (yyval.nd) = cons(list2(push((yyvsp[-3].nd), new_splat(p, new_lvar(p, r))), new_kw_hash(p, list1(cons(new_kw_rest_args(p, 0), new_lvar(p, k))))), new_block_arg(p, new_lvar(p, b))); #endif } -#line 7442 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7443 "mrbgems/mruby-compiler/core/y.tab.c" break; case 253: -#line 2417 "mrbgems/mruby-compiler/core/parse.y" +#line 2418 "mrbgems/mruby-compiler/core/parse.y" { #if 1 - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); if (local_var_p(p, r) && local_var_p(p, b)) { (yyval.nd) = cons(list1(new_splat(p, new_lvar(p, r))), new_block_arg(p, new_lvar(p, b))); } #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); if (local_var_p(p, r) && local_var_p(p, k) && local_var_p(p, b)) { (yyval.nd) = cons(list2(new_splat(p, new_lvar(p, r)), new_kw_hash(p, list1(cons(new_kw_rest_args(p, 0), new_lvar(p, k))))), @@ -7466,373 +7467,373 @@ yyreduce: (yyval.nd) = 0; } } -#line 7470 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7471 "mrbgems/mruby-compiler/core/y.tab.c" break; case 258: -#line 2449 "mrbgems/mruby-compiler/core/parse.y" +#line 2450 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons((yyvsp[-1].nd),0); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7479 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7480 "mrbgems/mruby-compiler/core/y.tab.c" break; case 259: -#line 2454 "mrbgems/mruby-compiler/core/parse.y" +#line 2455 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(push((yyvsp[-3].nd), new_kw_hash(p, (yyvsp[-1].nd))), 0); NODE_LINENO((yyval.nd), (yyvsp[-3].nd)); } -#line 7488 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7489 "mrbgems/mruby-compiler/core/y.tab.c" break; case 260: -#line 2459 "mrbgems/mruby-compiler/core/parse.y" +#line 2460 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(list1(new_kw_hash(p, (yyvsp[-1].nd))), 0); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7497 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7498 "mrbgems/mruby-compiler/core/y.tab.c" break; case 261: -#line 2466 "mrbgems/mruby-compiler/core/parse.y" +#line 2467 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons(list1((yyvsp[0].nd)), 0); NODE_LINENO((yyval.nd), (yyvsp[0].nd)); } -#line 7507 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7508 "mrbgems/mruby-compiler/core/y.tab.c" break; case 262: -#line 2472 "mrbgems/mruby-compiler/core/parse.y" +#line 2473 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons((yyvsp[-1].nd), (yyvsp[0].nd)); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7516 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7517 "mrbgems/mruby-compiler/core/y.tab.c" break; case 263: -#line 2477 "mrbgems/mruby-compiler/core/parse.y" +#line 2478 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(list1(new_kw_hash(p, (yyvsp[-1].nd))), (yyvsp[0].nd)); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7525 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7526 "mrbgems/mruby-compiler/core/y.tab.c" break; case 264: -#line 2482 "mrbgems/mruby-compiler/core/parse.y" +#line 2483 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(push((yyvsp[-3].nd), new_kw_hash(p, (yyvsp[-1].nd))), (yyvsp[0].nd)); NODE_LINENO((yyval.nd), (yyvsp[-3].nd)); } -#line 7534 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7535 "mrbgems/mruby-compiler/core/y.tab.c" break; case 265: -#line 2487 "mrbgems/mruby-compiler/core/parse.y" +#line 2488 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(0, (yyvsp[0].nd)); NODE_LINENO((yyval.nd), (yyvsp[0].nd)); } -#line 7543 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7544 "mrbgems/mruby-compiler/core/y.tab.c" break; case 266: -#line 2493 "mrbgems/mruby-compiler/core/parse.y" +#line 2494 "mrbgems/mruby-compiler/core/parse.y" { (yyval.stack) = p->cmdarg_stack; CMDARG_PUSH(1); } -#line 7552 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7553 "mrbgems/mruby-compiler/core/y.tab.c" break; case 267: -#line 2498 "mrbgems/mruby-compiler/core/parse.y" +#line 2499 "mrbgems/mruby-compiler/core/parse.y" { p->cmdarg_stack = (yyvsp[-1].stack); (yyval.nd) = (yyvsp[0].nd); } -#line 7561 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7562 "mrbgems/mruby-compiler/core/y.tab.c" break; case 268: -#line 2505 "mrbgems/mruby-compiler/core/parse.y" +#line 2506 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_block_arg(p, (yyvsp[0].nd)); } -#line 7569 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7570 "mrbgems/mruby-compiler/core/y.tab.c" break; case 269: -#line 2511 "mrbgems/mruby-compiler/core/parse.y" +#line 2512 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 7577 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7578 "mrbgems/mruby-compiler/core/y.tab.c" break; case 270: -#line 2515 "mrbgems/mruby-compiler/core/parse.y" +#line 2516 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = 0; } -#line 7585 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7586 "mrbgems/mruby-compiler/core/y.tab.c" break; case 273: -#line 2525 "mrbgems/mruby-compiler/core/parse.y" +#line 2526 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons((yyvsp[0].nd), 0); NODE_LINENO((yyval.nd), (yyvsp[0].nd)); } -#line 7595 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7596 "mrbgems/mruby-compiler/core/y.tab.c" break; case 274: -#line 2531 "mrbgems/mruby-compiler/core/parse.y" +#line 2532 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons(new_splat(p, (yyvsp[0].nd)), 0); NODE_LINENO((yyval.nd), (yyvsp[0].nd)); } -#line 7605 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7606 "mrbgems/mruby-compiler/core/y.tab.c" break; case 275: -#line 2537 "mrbgems/mruby-compiler/core/parse.y" +#line 2538 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 7614 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7615 "mrbgems/mruby-compiler/core/y.tab.c" break; case 276: -#line 2542 "mrbgems/mruby-compiler/core/parse.y" +#line 2543 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = push((yyvsp[-3].nd), new_splat(p, (yyvsp[0].nd))); } -#line 7623 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7624 "mrbgems/mruby-compiler/core/y.tab.c" break; case 277: -#line 2549 "mrbgems/mruby-compiler/core/parse.y" +#line 2550 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 7632 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7633 "mrbgems/mruby-compiler/core/y.tab.c" break; case 278: -#line 2554 "mrbgems/mruby-compiler/core/parse.y" +#line 2555 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = push((yyvsp[-3].nd), new_splat(p, (yyvsp[0].nd))); } -#line 7641 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7642 "mrbgems/mruby-compiler/core/y.tab.c" break; case 279: -#line 2559 "mrbgems/mruby-compiler/core/parse.y" +#line 2560 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = list1(new_splat(p, (yyvsp[0].nd))); } -#line 7650 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7651 "mrbgems/mruby-compiler/core/y.tab.c" break; case 287: -#line 2573 "mrbgems/mruby-compiler/core/parse.y" +#line 2574 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_nvar(p, (yyvsp[0].num)); } -#line 7658 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7659 "mrbgems/mruby-compiler/core/y.tab.c" break; case 288: -#line 2577 "mrbgems/mruby-compiler/core/parse.y" +#line 2578 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_fcall(p, (yyvsp[0].id), 0); } -#line 7666 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7667 "mrbgems/mruby-compiler/core/y.tab.c" break; case 289: -#line 2581 "mrbgems/mruby-compiler/core/parse.y" +#line 2582 "mrbgems/mruby-compiler/core/parse.y" { (yyval.stack) = p->cmdarg_stack; p->cmdarg_stack = 0; } -#line 7675 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7676 "mrbgems/mruby-compiler/core/y.tab.c" break; case 290: -#line 2587 "mrbgems/mruby-compiler/core/parse.y" +#line 2588 "mrbgems/mruby-compiler/core/parse.y" { p->cmdarg_stack = (yyvsp[-2].stack); (yyval.nd) = (yyvsp[-1].nd); } -#line 7684 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7685 "mrbgems/mruby-compiler/core/y.tab.c" break; case 291: -#line 2592 "mrbgems/mruby-compiler/core/parse.y" +#line 2593 "mrbgems/mruby-compiler/core/parse.y" { (yyval.stack) = p->cmdarg_stack; p->cmdarg_stack = 0; } -#line 7693 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7694 "mrbgems/mruby-compiler/core/y.tab.c" break; case 292: -#line 2596 "mrbgems/mruby-compiler/core/parse.y" +#line 2597 "mrbgems/mruby-compiler/core/parse.y" {p->lstate = EXPR_ENDARG;} -#line 7699 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7700 "mrbgems/mruby-compiler/core/y.tab.c" break; case 293: -#line 2597 "mrbgems/mruby-compiler/core/parse.y" +#line 2598 "mrbgems/mruby-compiler/core/parse.y" { p->cmdarg_stack = (yyvsp[-3].stack); (yyval.nd) = (yyvsp[-2].nd); } -#line 7708 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7709 "mrbgems/mruby-compiler/core/y.tab.c" break; case 294: -#line 2601 "mrbgems/mruby-compiler/core/parse.y" +#line 2602 "mrbgems/mruby-compiler/core/parse.y" {p->lstate = EXPR_ENDARG;} -#line 7714 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7715 "mrbgems/mruby-compiler/core/y.tab.c" break; case 295: -#line 2602 "mrbgems/mruby-compiler/core/parse.y" +#line 2603 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_nil(p); } -#line 7722 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7723 "mrbgems/mruby-compiler/core/y.tab.c" break; case 296: -#line 2606 "mrbgems/mruby-compiler/core/parse.y" +#line 2607 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 7730 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7731 "mrbgems/mruby-compiler/core/y.tab.c" break; case 297: -#line 2610 "mrbgems/mruby-compiler/core/parse.y" +#line 2611 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_colon2(p, (yyvsp[-2].nd), (yyvsp[0].id)); } -#line 7738 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7739 "mrbgems/mruby-compiler/core/y.tab.c" break; case 298: -#line 2614 "mrbgems/mruby-compiler/core/parse.y" +#line 2615 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_colon3(p, (yyvsp[0].id)); } -#line 7746 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7747 "mrbgems/mruby-compiler/core/y.tab.c" break; case 299: -#line 2618 "mrbgems/mruby-compiler/core/parse.y" +#line 2619 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_array(p, (yyvsp[-1].nd)); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7755 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7756 "mrbgems/mruby-compiler/core/y.tab.c" break; case 300: -#line 2623 "mrbgems/mruby-compiler/core/parse.y" +#line 2624 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_hash(p, (yyvsp[-1].nd)); NODE_LINENO((yyval.nd), (yyvsp[-1].nd)); } -#line 7764 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7765 "mrbgems/mruby-compiler/core/y.tab.c" break; case 301: -#line 2628 "mrbgems/mruby-compiler/core/parse.y" +#line 2629 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_return(p, 0); } -#line 7772 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7773 "mrbgems/mruby-compiler/core/y.tab.c" break; case 302: -#line 2632 "mrbgems/mruby-compiler/core/parse.y" +#line 2633 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_yield(p, (yyvsp[0].nd)); } -#line 7780 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7781 "mrbgems/mruby-compiler/core/y.tab.c" break; case 303: -#line 2636 "mrbgems/mruby-compiler/core/parse.y" +#line 2637 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, cond((yyvsp[-1].nd)), "!"); } -#line 7788 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7789 "mrbgems/mruby-compiler/core/y.tab.c" break; case 304: -#line 2640 "mrbgems/mruby-compiler/core/parse.y" +#line 2641 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = call_uni_op(p, new_nil(p), "!"); } -#line 7796 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7797 "mrbgems/mruby-compiler/core/y.tab.c" break; case 305: -#line 2644 "mrbgems/mruby-compiler/core/parse.y" +#line 2645 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_fcall(p, (yyvsp[-1].id), cons(0, (yyvsp[0].nd))); } -#line 7804 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7805 "mrbgems/mruby-compiler/core/y.tab.c" break; case 307: -#line 2649 "mrbgems/mruby-compiler/core/parse.y" +#line 2650 "mrbgems/mruby-compiler/core/parse.y" { call_with_block(p, (yyvsp[-1].nd), (yyvsp[0].nd)); (yyval.nd) = (yyvsp[-1].nd); } -#line 7813 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7814 "mrbgems/mruby-compiler/core/y.tab.c" break; case 308: -#line 2654 "mrbgems/mruby-compiler/core/parse.y" +#line 2655 "mrbgems/mruby-compiler/core/parse.y" { local_nest(p); (yyval.num) = p->lpar_beg; p->lpar_beg = ++p->paren_nest; } -#line 7823 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7824 "mrbgems/mruby-compiler/core/y.tab.c" break; case 309: -#line 2660 "mrbgems/mruby-compiler/core/parse.y" +#line 2661 "mrbgems/mruby-compiler/core/parse.y" { (yyval.stack) = p->cmdarg_stack; p->cmdarg_stack = 0; } -#line 7832 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7833 "mrbgems/mruby-compiler/core/y.tab.c" break; case 310: -#line 2665 "mrbgems/mruby-compiler/core/parse.y" +#line 2666 "mrbgems/mruby-compiler/core/parse.y" { p->lpar_beg = (yyvsp[-3].num); (yyval.nd) = new_lambda(p, (yyvsp[-2].nd), (yyvsp[0].nd)); @@ -7840,149 +7841,149 @@ yyreduce: p->cmdarg_stack = (yyvsp[-1].stack); CMDARG_LEXPOP(); } -#line 7844 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7845 "mrbgems/mruby-compiler/core/y.tab.c" break; case 311: -#line 2676 "mrbgems/mruby-compiler/core/parse.y" +#line 2677 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_if(p, cond((yyvsp[-4].nd)), (yyvsp[-2].nd), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-5].num)); } -#line 7853 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7854 "mrbgems/mruby-compiler/core/y.tab.c" break; case 312: -#line 2684 "mrbgems/mruby-compiler/core/parse.y" +#line 2685 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_unless(p, cond((yyvsp[-4].nd)), (yyvsp[-2].nd), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-5].num)); } -#line 7862 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7863 "mrbgems/mruby-compiler/core/y.tab.c" break; case 313: -#line 2688 "mrbgems/mruby-compiler/core/parse.y" +#line 2689 "mrbgems/mruby-compiler/core/parse.y" {COND_PUSH(1);} -#line 7868 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7869 "mrbgems/mruby-compiler/core/y.tab.c" break; case 314: -#line 2688 "mrbgems/mruby-compiler/core/parse.y" +#line 2689 "mrbgems/mruby-compiler/core/parse.y" {COND_POP();} -#line 7874 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7875 "mrbgems/mruby-compiler/core/y.tab.c" break; case 315: -#line 2691 "mrbgems/mruby-compiler/core/parse.y" +#line 2692 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_while(p, cond((yyvsp[-4].nd)), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-6].num)); } -#line 7883 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7884 "mrbgems/mruby-compiler/core/y.tab.c" break; case 316: -#line 2695 "mrbgems/mruby-compiler/core/parse.y" +#line 2696 "mrbgems/mruby-compiler/core/parse.y" {COND_PUSH(1);} -#line 7889 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7890 "mrbgems/mruby-compiler/core/y.tab.c" break; case 317: -#line 2695 "mrbgems/mruby-compiler/core/parse.y" +#line 2696 "mrbgems/mruby-compiler/core/parse.y" {COND_POP();} -#line 7895 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7896 "mrbgems/mruby-compiler/core/y.tab.c" break; case 318: -#line 2698 "mrbgems/mruby-compiler/core/parse.y" +#line 2699 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_until(p, cond((yyvsp[-4].nd)), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-6].num)); } -#line 7904 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7905 "mrbgems/mruby-compiler/core/y.tab.c" break; case 319: -#line 2705 "mrbgems/mruby-compiler/core/parse.y" +#line 2706 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_case(p, (yyvsp[-3].nd), (yyvsp[-1].nd)); } -#line 7912 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7913 "mrbgems/mruby-compiler/core/y.tab.c" break; case 320: -#line 2709 "mrbgems/mruby-compiler/core/parse.y" +#line 2710 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_case(p, 0, (yyvsp[-1].nd)); } -#line 7920 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7921 "mrbgems/mruby-compiler/core/y.tab.c" break; case 321: -#line 2713 "mrbgems/mruby-compiler/core/parse.y" +#line 2714 "mrbgems/mruby-compiler/core/parse.y" {COND_PUSH(1);} -#line 7926 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7927 "mrbgems/mruby-compiler/core/y.tab.c" break; case 322: -#line 2715 "mrbgems/mruby-compiler/core/parse.y" +#line 2716 "mrbgems/mruby-compiler/core/parse.y" {COND_POP();} -#line 7932 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7933 "mrbgems/mruby-compiler/core/y.tab.c" break; case 323: -#line 2718 "mrbgems/mruby-compiler/core/parse.y" +#line 2719 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_for(p, (yyvsp[-7].nd), (yyvsp[-4].nd), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-8].num)); } -#line 7941 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7942 "mrbgems/mruby-compiler/core/y.tab.c" break; case 324: -#line 2724 "mrbgems/mruby-compiler/core/parse.y" +#line 2725 "mrbgems/mruby-compiler/core/parse.y" { if (p->in_def || p->in_single) yyerror(p, "class definition in method body"); (yyval.nd) = local_switch(p); nvars_block(p); } -#line 7952 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7953 "mrbgems/mruby-compiler/core/y.tab.c" break; case 325: -#line 2732 "mrbgems/mruby-compiler/core/parse.y" +#line 2733 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_class(p, (yyvsp[-4].nd), (yyvsp[-3].nd), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-5].num)); local_resume(p, (yyvsp[-2].nd)); nvars_unnest(p); } -#line 7963 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7964 "mrbgems/mruby-compiler/core/y.tab.c" break; case 326: -#line 2740 "mrbgems/mruby-compiler/core/parse.y" +#line 2741 "mrbgems/mruby-compiler/core/parse.y" { (yyval.num) = p->in_def; p->in_def = 0; } -#line 7972 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7973 "mrbgems/mruby-compiler/core/y.tab.c" break; case 327: -#line 2745 "mrbgems/mruby-compiler/core/parse.y" +#line 2746 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(local_switch(p), nint(p->in_single)); nvars_block(p); p->in_single = 0; } -#line 7982 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7983 "mrbgems/mruby-compiler/core/y.tab.c" break; case 328: -#line 2752 "mrbgems/mruby-compiler/core/parse.y" +#line 2753 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_sclass(p, (yyvsp[-5].nd), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-7].num)); @@ -7991,44 +7992,44 @@ yyreduce: p->in_def = (yyvsp[-4].num); p->in_single = intn((yyvsp[-2].nd)->cdr); } -#line 7995 "mrbgems/mruby-compiler/core/y.tab.c" +#line 7996 "mrbgems/mruby-compiler/core/y.tab.c" break; case 329: -#line 2762 "mrbgems/mruby-compiler/core/parse.y" +#line 2763 "mrbgems/mruby-compiler/core/parse.y" { if (p->in_def || p->in_single) yyerror(p, "module definition in method body"); (yyval.nd) = local_switch(p); nvars_block(p); } -#line 8006 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8007 "mrbgems/mruby-compiler/core/y.tab.c" break; case 330: -#line 2770 "mrbgems/mruby-compiler/core/parse.y" +#line 2771 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_module(p, (yyvsp[-3].nd), (yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-4].num)); local_resume(p, (yyvsp[-2].nd)); nvars_unnest(p); } -#line 8017 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8018 "mrbgems/mruby-compiler/core/y.tab.c" break; case 331: -#line 2780 "mrbgems/mruby-compiler/core/parse.y" +#line 2781 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-3].nd); defn_setup(p, (yyval.nd), (yyvsp[-2].nd), (yyvsp[-1].nd)); nvars_unnest(p); p->in_def--; } -#line 8028 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8029 "mrbgems/mruby-compiler/core/y.tab.c" break; case 332: -#line 2790 "mrbgems/mruby-compiler/core/parse.y" +#line 2791 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-3].nd); defs_setup(p, (yyval.nd), (yyvsp[-2].nd), (yyvsp[-1].nd)); @@ -8036,453 +8037,453 @@ yyreduce: p->in_def--; p->in_single--; } -#line 8040 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8041 "mrbgems/mruby-compiler/core/y.tab.c" break; case 333: -#line 2798 "mrbgems/mruby-compiler/core/parse.y" +#line 2799 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_break(p, 0); } -#line 8048 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8049 "mrbgems/mruby-compiler/core/y.tab.c" break; case 334: -#line 2802 "mrbgems/mruby-compiler/core/parse.y" +#line 2803 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_next(p, 0); } -#line 8056 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8057 "mrbgems/mruby-compiler/core/y.tab.c" break; case 335: -#line 2806 "mrbgems/mruby-compiler/core/parse.y" +#line 2807 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_redo(p); } -#line 8064 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8065 "mrbgems/mruby-compiler/core/y.tab.c" break; case 336: -#line 2810 "mrbgems/mruby-compiler/core/parse.y" +#line 2811 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_retry(p); } -#line 8072 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8073 "mrbgems/mruby-compiler/core/y.tab.c" break; case 337: -#line 2816 "mrbgems/mruby-compiler/core/parse.y" +#line 2817 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); if (!(yyval.nd)) (yyval.nd) = new_nil(p); } -#line 8081 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8082 "mrbgems/mruby-compiler/core/y.tab.c" break; case 344: -#line 2835 "mrbgems/mruby-compiler/core/parse.y" +#line 2836 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_if(p, cond((yyvsp[-3].nd)), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8089 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8090 "mrbgems/mruby-compiler/core/y.tab.c" break; case 346: -#line 2842 "mrbgems/mruby-compiler/core/parse.y" +#line 2843 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8097 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8098 "mrbgems/mruby-compiler/core/y.tab.c" break; case 347: -#line 2848 "mrbgems/mruby-compiler/core/parse.y" +#line 2849 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1(list1((yyvsp[0].nd))); } -#line 8105 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8106 "mrbgems/mruby-compiler/core/y.tab.c" break; case 349: -#line 2855 "mrbgems/mruby-compiler/core/parse.y" +#line 2856 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3((yyvsp[0].nd),0,0); } -#line 8113 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8114 "mrbgems/mruby-compiler/core/y.tab.c" break; case 350: -#line 2859 "mrbgems/mruby-compiler/core/parse.y" +#line 2860 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3((yyvsp[-3].nd), new_arg(p, (yyvsp[0].id)), 0); } -#line 8121 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8122 "mrbgems/mruby-compiler/core/y.tab.c" break; case 351: -#line 2863 "mrbgems/mruby-compiler/core/parse.y" +#line 2864 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3((yyvsp[-5].nd), new_arg(p, (yyvsp[-2].id)), (yyvsp[0].nd)); } -#line 8129 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8130 "mrbgems/mruby-compiler/core/y.tab.c" break; case 352: -#line 2867 "mrbgems/mruby-compiler/core/parse.y" +#line 2868 "mrbgems/mruby-compiler/core/parse.y" { local_add_f(p, 0); - (yyval.nd) = list3((yyvsp[-2].nd), (node*)-1, 0); + (yyval.nd) = list3((yyvsp[-2].nd), nint(-1), 0); } -#line 8138 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8139 "mrbgems/mruby-compiler/core/y.tab.c" break; case 353: -#line 2872 "mrbgems/mruby-compiler/core/parse.y" +#line 2873 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = list3((yyvsp[-4].nd), (node*)-1, (yyvsp[0].nd)); + (yyval.nd) = list3((yyvsp[-4].nd), nint(-1), (yyvsp[0].nd)); } -#line 8146 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8147 "mrbgems/mruby-compiler/core/y.tab.c" break; case 354: -#line 2876 "mrbgems/mruby-compiler/core/parse.y" +#line 2877 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3(0, new_arg(p, (yyvsp[0].id)), 0); } -#line 8154 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8155 "mrbgems/mruby-compiler/core/y.tab.c" break; case 355: -#line 2880 "mrbgems/mruby-compiler/core/parse.y" +#line 2881 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list3(0, new_arg(p, (yyvsp[-2].id)), (yyvsp[0].nd)); } -#line 8162 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8163 "mrbgems/mruby-compiler/core/y.tab.c" break; case 356: -#line 2884 "mrbgems/mruby-compiler/core/parse.y" +#line 2885 "mrbgems/mruby-compiler/core/parse.y" { local_add_f(p, 0); - (yyval.nd) = list3(0, (node*)-1, 0); + (yyval.nd) = list3(0, nint(-1), 0); } -#line 8171 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8172 "mrbgems/mruby-compiler/core/y.tab.c" break; case 357: -#line 2889 "mrbgems/mruby-compiler/core/parse.y" +#line 2890 "mrbgems/mruby-compiler/core/parse.y" { local_add_f(p, 0); } -#line 8179 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8180 "mrbgems/mruby-compiler/core/y.tab.c" break; case 358: -#line 2893 "mrbgems/mruby-compiler/core/parse.y" +#line 2894 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = list3(0, (node*)-1, (yyvsp[0].nd)); + (yyval.nd) = list3(0, nint(-1), (yyvsp[0].nd)); } -#line 8187 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8188 "mrbgems/mruby-compiler/core/y.tab.c" break; case 359: -#line 2899 "mrbgems/mruby-compiler/core/parse.y" +#line 2900 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, (yyvsp[-3].nd), (yyvsp[-1].nd), (yyvsp[0].id)); } -#line 8195 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8196 "mrbgems/mruby-compiler/core/y.tab.c" break; case 360: -#line 2903 "mrbgems/mruby-compiler/core/parse.y" +#line 2904 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, (yyvsp[-1].nd), 0, (yyvsp[0].id)); } -#line 8203 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8204 "mrbgems/mruby-compiler/core/y.tab.c" break; case 361: -#line 2907 "mrbgems/mruby-compiler/core/parse.y" +#line 2908 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, 0, (yyvsp[-1].nd), (yyvsp[0].id)); } -#line 8211 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8212 "mrbgems/mruby-compiler/core/y.tab.c" break; case 362: -#line 2911 "mrbgems/mruby-compiler/core/parse.y" +#line 2912 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, 0, 0, (yyvsp[0].id)); } -#line 8219 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8220 "mrbgems/mruby-compiler/core/y.tab.c" break; case 363: -#line 2917 "mrbgems/mruby-compiler/core/parse.y" +#line 2918 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8227 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8228 "mrbgems/mruby-compiler/core/y.tab.c" break; case 364: -#line 2921 "mrbgems/mruby-compiler/core/parse.y" +#line 2922 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, 0, 0, 0); } -#line 8235 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8236 "mrbgems/mruby-compiler/core/y.tab.c" break; case 365: -#line 2927 "mrbgems/mruby-compiler/core/parse.y" +#line 2928 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 8243 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8244 "mrbgems/mruby-compiler/core/y.tab.c" break; case 366: -#line 2931 "mrbgems/mruby-compiler/core/parse.y" +#line 2932 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-7].nd), (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8251 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8252 "mrbgems/mruby-compiler/core/y.tab.c" break; case 367: -#line 2935 "mrbgems/mruby-compiler/core/parse.y" +#line 2936 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-3].nd), (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd)); } -#line 8259 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8260 "mrbgems/mruby-compiler/core/y.tab.c" break; case 368: -#line 2939 "mrbgems/mruby-compiler/core/parse.y" +#line 2940 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8267 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8268 "mrbgems/mruby-compiler/core/y.tab.c" break; case 369: -#line 2943 "mrbgems/mruby-compiler/core/parse.y" +#line 2944 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 8275 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8276 "mrbgems/mruby-compiler/core/y.tab.c" break; case 370: -#line 2947 "mrbgems/mruby-compiler/core/parse.y" +#line 2948 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-2].nd), 0, 0, 0, (yyvsp[0].nd)); } -#line 8283 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8284 "mrbgems/mruby-compiler/core/y.tab.c" break; case 371: -#line 2951 "mrbgems/mruby-compiler/core/parse.y" +#line 2952 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-5].nd), 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8291 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8292 "mrbgems/mruby-compiler/core/y.tab.c" break; case 372: -#line 2955 "mrbgems/mruby-compiler/core/parse.y" +#line 2956 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-1].nd), 0, 0, 0, (yyvsp[0].nd)); } -#line 8299 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8300 "mrbgems/mruby-compiler/core/y.tab.c" break; case 373: -#line 2959 "mrbgems/mruby-compiler/core/parse.y" +#line 2960 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 8307 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8308 "mrbgems/mruby-compiler/core/y.tab.c" break; case 374: -#line 2963 "mrbgems/mruby-compiler/core/parse.y" +#line 2964 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8315 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8316 "mrbgems/mruby-compiler/core/y.tab.c" break; case 375: -#line 2967 "mrbgems/mruby-compiler/core/parse.y" +#line 2968 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd)); } -#line 8323 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8324 "mrbgems/mruby-compiler/core/y.tab.c" break; case 376: -#line 2971 "mrbgems/mruby-compiler/core/parse.y" +#line 2972 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8331 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8332 "mrbgems/mruby-compiler/core/y.tab.c" break; case 377: -#line 2975 "mrbgems/mruby-compiler/core/parse.y" +#line 2976 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, 0, (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 8339 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8340 "mrbgems/mruby-compiler/core/y.tab.c" break; case 378: -#line 2979 "mrbgems/mruby-compiler/core/parse.y" +#line 2980 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8347 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8348 "mrbgems/mruby-compiler/core/y.tab.c" break; case 379: -#line 2983 "mrbgems/mruby-compiler/core/parse.y" +#line 2984 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[0].nd)); } -#line 8355 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8356 "mrbgems/mruby-compiler/core/y.tab.c" break; case 380: -#line 2989 "mrbgems/mruby-compiler/core/parse.y" +#line 2990 "mrbgems/mruby-compiler/core/parse.y" { local_add_blk(p, 0); (yyval.nd) = 0; } -#line 8364 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8365 "mrbgems/mruby-compiler/core/y.tab.c" break; case 381: -#line 2994 "mrbgems/mruby-compiler/core/parse.y" +#line 2995 "mrbgems/mruby-compiler/core/parse.y" { p->cmd_start = TRUE; (yyval.nd) = (yyvsp[0].nd); } -#line 8373 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8374 "mrbgems/mruby-compiler/core/y.tab.c" break; case 382: -#line 3000 "mrbgems/mruby-compiler/core/parse.y" +#line 3001 "mrbgems/mruby-compiler/core/parse.y" {local_add_blk(p, 0);} -#line 8379 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8380 "mrbgems/mruby-compiler/core/y.tab.c" break; case 383: -#line 3001 "mrbgems/mruby-compiler/core/parse.y" +#line 3002 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = 0; } -#line 8387 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8388 "mrbgems/mruby-compiler/core/y.tab.c" break; case 384: -#line 3005 "mrbgems/mruby-compiler/core/parse.y" +#line 3006 "mrbgems/mruby-compiler/core/parse.y" { local_add_blk(p, 0); (yyval.nd) = 0; } -#line 8396 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8397 "mrbgems/mruby-compiler/core/y.tab.c" break; case 385: -#line 3010 "mrbgems/mruby-compiler/core/parse.y" +#line 3011 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-2].nd); } -#line 8404 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8405 "mrbgems/mruby-compiler/core/y.tab.c" break; case 386: -#line 3017 "mrbgems/mruby-compiler/core/parse.y" +#line 3018 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = 0; } -#line 8412 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8413 "mrbgems/mruby-compiler/core/y.tab.c" break; case 387: -#line 3021 "mrbgems/mruby-compiler/core/parse.y" +#line 3022 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = 0; } -#line 8420 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8421 "mrbgems/mruby-compiler/core/y.tab.c" break; case 390: -#line 3031 "mrbgems/mruby-compiler/core/parse.y" +#line 3032 "mrbgems/mruby-compiler/core/parse.y" { local_add_f(p, (yyvsp[0].id)); new_bv(p, (yyvsp[0].id)); } -#line 8429 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8430 "mrbgems/mruby-compiler/core/y.tab.c" break; case 392: -#line 3039 "mrbgems/mruby-compiler/core/parse.y" +#line 3040 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-2].nd); } -#line 8437 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8438 "mrbgems/mruby-compiler/core/y.tab.c" break; case 393: -#line 3043 "mrbgems/mruby-compiler/core/parse.y" +#line 3044 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8445 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8446 "mrbgems/mruby-compiler/core/y.tab.c" break; case 394: -#line 3049 "mrbgems/mruby-compiler/core/parse.y" +#line 3050 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 8453 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8454 "mrbgems/mruby-compiler/core/y.tab.c" break; case 395: -#line 3053 "mrbgems/mruby-compiler/core/parse.y" +#line 3054 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 8461 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8462 "mrbgems/mruby-compiler/core/y.tab.c" break; case 396: -#line 3059 "mrbgems/mruby-compiler/core/parse.y" +#line 3060 "mrbgems/mruby-compiler/core/parse.y" { local_nest(p); nvars_nest(p); } -#line 8470 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8471 "mrbgems/mruby-compiler/core/y.tab.c" break; case 397: -#line 3066 "mrbgems/mruby-compiler/core/parse.y" +#line 3067 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_block(p,(yyvsp[-2].nd),(yyvsp[-1].nd)); local_unnest(p); nvars_unnest(p); } -#line 8480 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8481 "mrbgems/mruby-compiler/core/y.tab.c" break; case 398: -#line 3074 "mrbgems/mruby-compiler/core/parse.y" +#line 3075 "mrbgems/mruby-compiler/core/parse.y" { - if ((yyvsp[-1].nd)->car == (node*)NODE_YIELD) { + if (typen((yyvsp[-1].nd)->car) == NODE_YIELD) { yyerror(p, "block given to yield"); } else { @@ -8490,159 +8491,159 @@ yyreduce: } (yyval.nd) = (yyvsp[-1].nd); } -#line 8494 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8495 "mrbgems/mruby-compiler/core/y.tab.c" break; case 399: -#line 3084 "mrbgems/mruby-compiler/core/parse.y" +#line 3085 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num)); } -#line 8502 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8503 "mrbgems/mruby-compiler/core/y.tab.c" break; case 400: -#line 3088 "mrbgems/mruby-compiler/core/parse.y" +#line 3089 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), (yyvsp[-3].num)); call_with_block(p, (yyval.nd), (yyvsp[0].nd)); } -#line 8511 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8512 "mrbgems/mruby-compiler/core/y.tab.c" break; case 401: -#line 3093 "mrbgems/mruby-compiler/core/parse.y" +#line 3094 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-4].nd), (yyvsp[-2].id), (yyvsp[-1].nd), (yyvsp[-3].num)); call_with_block(p, (yyval.nd), (yyvsp[0].nd)); } -#line 8520 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8521 "mrbgems/mruby-compiler/core/y.tab.c" break; case 402: -#line 3100 "mrbgems/mruby-compiler/core/parse.y" +#line 3101 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_fcall(p, (yyvsp[-1].id), (yyvsp[0].nd)); } -#line 8528 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8529 "mrbgems/mruby-compiler/core/y.tab.c" break; case 403: -#line 3104 "mrbgems/mruby-compiler/core/parse.y" +#line 3105 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), (yyvsp[-2].num)); } -#line 8536 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8537 "mrbgems/mruby-compiler/core/y.tab.c" break; case 404: -#line 3108 "mrbgems/mruby-compiler/core/parse.y" +#line 3109 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-3].nd), (yyvsp[-1].id), (yyvsp[0].nd), tCOLON2); } -#line 8544 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8545 "mrbgems/mruby-compiler/core/y.tab.c" break; case 405: -#line 3112 "mrbgems/mruby-compiler/core/parse.y" +#line 3113 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_call(p, (yyvsp[-2].nd), (yyvsp[0].id), 0, tCOLON2); } -#line 8552 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8553 "mrbgems/mruby-compiler/core/y.tab.c" break; case 406: -#line 3116 "mrbgems/mruby-compiler/core/parse.y" +#line 3117 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = new_call(p, (yyvsp[-2].nd), MRB_SYM(call), (yyvsp[0].nd), (yyvsp[-1].num)); + (yyval.nd) = new_call(p, (yyvsp[-2].nd), MRB_SYM_2(p->mrb, call), (yyvsp[0].nd), (yyvsp[-1].num)); } -#line 8560 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8561 "mrbgems/mruby-compiler/core/y.tab.c" break; case 407: -#line 3120 "mrbgems/mruby-compiler/core/parse.y" +#line 3121 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = new_call(p, (yyvsp[-2].nd), MRB_SYM(call), (yyvsp[0].nd), tCOLON2); + (yyval.nd) = new_call(p, (yyvsp[-2].nd), MRB_SYM_2(p->mrb, call), (yyvsp[0].nd), tCOLON2); } -#line 8568 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8569 "mrbgems/mruby-compiler/core/y.tab.c" break; case 408: -#line 3124 "mrbgems/mruby-compiler/core/parse.y" +#line 3125 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_super(p, (yyvsp[0].nd)); } -#line 8576 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8577 "mrbgems/mruby-compiler/core/y.tab.c" break; case 409: -#line 3128 "mrbgems/mruby-compiler/core/parse.y" +#line 3129 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_zsuper(p); } -#line 8584 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8585 "mrbgems/mruby-compiler/core/y.tab.c" break; case 410: -#line 3132 "mrbgems/mruby-compiler/core/parse.y" +#line 3133 "mrbgems/mruby-compiler/core/parse.y" { - (yyval.nd) = new_call(p, (yyvsp[-3].nd), MRB_OPSYM(aref), (yyvsp[-1].nd), '.'); + (yyval.nd) = new_call(p, (yyvsp[-3].nd), intern_op(aref), (yyvsp[-1].nd), '.'); } -#line 8592 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8593 "mrbgems/mruby-compiler/core/y.tab.c" break; case 411: -#line 3138 "mrbgems/mruby-compiler/core/parse.y" +#line 3139 "mrbgems/mruby-compiler/core/parse.y" { local_nest(p); nvars_nest(p); (yyval.num) = p->lineno; } -#line 8602 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8603 "mrbgems/mruby-compiler/core/y.tab.c" break; case 412: -#line 3145 "mrbgems/mruby-compiler/core/parse.y" +#line 3146 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_block(p,(yyvsp[-2].nd),(yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-3].num)); local_unnest(p); nvars_unnest(p); } -#line 8613 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8614 "mrbgems/mruby-compiler/core/y.tab.c" break; case 413: -#line 3152 "mrbgems/mruby-compiler/core/parse.y" +#line 3153 "mrbgems/mruby-compiler/core/parse.y" { local_nest(p); nvars_nest(p); (yyval.num) = p->lineno; } -#line 8623 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8624 "mrbgems/mruby-compiler/core/y.tab.c" break; case 414: -#line 3159 "mrbgems/mruby-compiler/core/parse.y" +#line 3160 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_block(p,(yyvsp[-2].nd),(yyvsp[-1].nd)); SET_LINENO((yyval.nd), (yyvsp[-3].num)); local_unnest(p); nvars_unnest(p); } -#line 8634 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8635 "mrbgems/mruby-compiler/core/y.tab.c" break; case 415: -#line 3170 "mrbgems/mruby-compiler/core/parse.y" +#line 3171 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = cons(cons((yyvsp[-3].nd), (yyvsp[-1].nd)), (yyvsp[0].nd)); } -#line 8642 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8643 "mrbgems/mruby-compiler/core/y.tab.c" break; case 416: -#line 3176 "mrbgems/mruby-compiler/core/parse.y" +#line 3177 "mrbgems/mruby-compiler/core/parse.y" { if ((yyvsp[0].nd)) { (yyval.nd) = cons(cons(0, (yyvsp[0].nd)), 0); @@ -8651,383 +8652,383 @@ yyreduce: (yyval.nd) = 0; } } -#line 8655 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8656 "mrbgems/mruby-compiler/core/y.tab.c" break; case 418: -#line 3190 "mrbgems/mruby-compiler/core/parse.y" +#line 3191 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1(list3((yyvsp[-4].nd), (yyvsp[-3].nd), (yyvsp[-1].nd))); if ((yyvsp[0].nd)) (yyval.nd) = append((yyval.nd), (yyvsp[0].nd)); } -#line 8664 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8665 "mrbgems/mruby-compiler/core/y.tab.c" break; case 420: -#line 3198 "mrbgems/mruby-compiler/core/parse.y" +#line 3199 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 8672 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8673 "mrbgems/mruby-compiler/core/y.tab.c" break; case 423: -#line 3206 "mrbgems/mruby-compiler/core/parse.y" +#line 3207 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8680 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8681 "mrbgems/mruby-compiler/core/y.tab.c" break; case 425: -#line 3213 "mrbgems/mruby-compiler/core/parse.y" +#line 3214 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8688 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8689 "mrbgems/mruby-compiler/core/y.tab.c" break; case 432: -#line 3227 "mrbgems/mruby-compiler/core/parse.y" +#line 3228 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = concat_string(p, (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8696 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8697 "mrbgems/mruby-compiler/core/y.tab.c" break; case 435: -#line 3235 "mrbgems/mruby-compiler/core/parse.y" +#line 3236 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8704 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8705 "mrbgems/mruby-compiler/core/y.tab.c" break; case 436: -#line 3239 "mrbgems/mruby-compiler/core/parse.y" +#line 3240 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd))); } -#line 8712 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8713 "mrbgems/mruby-compiler/core/y.tab.c" break; case 438: -#line 3246 "mrbgems/mruby-compiler/core/parse.y" +#line 3247 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = append((yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8720 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8721 "mrbgems/mruby-compiler/core/y.tab.c" break; case 439: -#line 3252 "mrbgems/mruby-compiler/core/parse.y" +#line 3253 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 8728 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8729 "mrbgems/mruby-compiler/core/y.tab.c" break; case 440: -#line 3256 "mrbgems/mruby-compiler/core/parse.y" +#line 3257 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = p->lex_strterm; p->lex_strterm = NULL; } -#line 8737 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8738 "mrbgems/mruby-compiler/core/y.tab.c" break; case 441: -#line 3262 "mrbgems/mruby-compiler/core/parse.y" +#line 3263 "mrbgems/mruby-compiler/core/parse.y" { p->lex_strterm = (yyvsp[-2].nd); (yyval.nd) = list2((yyvsp[-3].nd), (yyvsp[-1].nd)); } -#line 8746 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8747 "mrbgems/mruby-compiler/core/y.tab.c" break; case 442: -#line 3267 "mrbgems/mruby-compiler/core/parse.y" +#line 3268 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1(new_literal_delim(p)); } -#line 8754 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8755 "mrbgems/mruby-compiler/core/y.tab.c" break; case 443: -#line 3271 "mrbgems/mruby-compiler/core/parse.y" +#line 3272 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1(new_literal_delim(p)); } -#line 8762 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8763 "mrbgems/mruby-compiler/core/y.tab.c" break; case 444: -#line 3277 "mrbgems/mruby-compiler/core/parse.y" +#line 3278 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8770 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8771 "mrbgems/mruby-compiler/core/y.tab.c" break; case 445: -#line 3281 "mrbgems/mruby-compiler/core/parse.y" +#line 3282 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dxstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd))); } -#line 8778 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8779 "mrbgems/mruby-compiler/core/y.tab.c" break; case 446: -#line 3287 "mrbgems/mruby-compiler/core/parse.y" +#line 3288 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 8786 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8787 "mrbgems/mruby-compiler/core/y.tab.c" break; case 447: -#line 3291 "mrbgems/mruby-compiler/core/parse.y" +#line 3292 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_dregx(p, (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 8794 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8795 "mrbgems/mruby-compiler/core/y.tab.c" break; case 451: -#line 3304 "mrbgems/mruby-compiler/core/parse.y" +#line 3305 "mrbgems/mruby-compiler/core/parse.y" { parser_heredoc_info * inf = parsing_heredoc_inf(p); inf->doc = push(inf->doc, new_str(p, "", 0)); heredoc_end(p); } -#line 8804 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8805 "mrbgems/mruby-compiler/core/y.tab.c" break; case 452: -#line 3310 "mrbgems/mruby-compiler/core/parse.y" +#line 3311 "mrbgems/mruby-compiler/core/parse.y" { heredoc_end(p); } -#line 8812 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8813 "mrbgems/mruby-compiler/core/y.tab.c" break; case 455: -#line 3320 "mrbgems/mruby-compiler/core/parse.y" +#line 3321 "mrbgems/mruby-compiler/core/parse.y" { parser_heredoc_info * inf = parsing_heredoc_inf(p); inf->doc = push(inf->doc, (yyvsp[0].nd)); heredoc_treat_nextline(p); } -#line 8822 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8823 "mrbgems/mruby-compiler/core/y.tab.c" break; case 456: -#line 3326 "mrbgems/mruby-compiler/core/parse.y" +#line 3327 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = p->lex_strterm; p->lex_strterm = NULL; } -#line 8831 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8832 "mrbgems/mruby-compiler/core/y.tab.c" break; case 457: -#line 3332 "mrbgems/mruby-compiler/core/parse.y" +#line 3333 "mrbgems/mruby-compiler/core/parse.y" { parser_heredoc_info * inf = parsing_heredoc_inf(p); p->lex_strterm = (yyvsp[-2].nd); inf->doc = push(push(inf->doc, (yyvsp[-3].nd)), (yyvsp[-1].nd)); } -#line 8841 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8842 "mrbgems/mruby-compiler/core/y.tab.c" break; case 458: -#line 3340 "mrbgems/mruby-compiler/core/parse.y" +#line 3341 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_words(p, list1((yyvsp[0].nd))); } -#line 8849 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8850 "mrbgems/mruby-compiler/core/y.tab.c" break; case 459: -#line 3344 "mrbgems/mruby-compiler/core/parse.y" +#line 3345 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_words(p, push((yyvsp[-1].nd), (yyvsp[0].nd))); } -#line 8857 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8858 "mrbgems/mruby-compiler/core/y.tab.c" break; case 460: -#line 3351 "mrbgems/mruby-compiler/core/parse.y" +#line 3352 "mrbgems/mruby-compiler/core/parse.y" { p->lstate = EXPR_ENDARG; (yyval.nd) = new_sym(p, (yyvsp[0].id)); } -#line 8866 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8867 "mrbgems/mruby-compiler/core/y.tab.c" break; case 461: -#line 3356 "mrbgems/mruby-compiler/core/parse.y" +#line 3357 "mrbgems/mruby-compiler/core/parse.y" { p->lstate = EXPR_ENDARG; (yyval.nd) = new_dsym(p, new_dstr(p, push((yyvsp[-1].nd), (yyvsp[0].nd)))); } -#line 8875 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8876 "mrbgems/mruby-compiler/core/y.tab.c" break; case 462: -#line 3363 "mrbgems/mruby-compiler/core/parse.y" +#line 3364 "mrbgems/mruby-compiler/core/parse.y" { (yyval.id) = (yyvsp[0].id); } -#line 8883 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8884 "mrbgems/mruby-compiler/core/y.tab.c" break; case 467: -#line 3373 "mrbgems/mruby-compiler/core/parse.y" +#line 3374 "mrbgems/mruby-compiler/core/parse.y" { (yyval.id) = new_strsym(p, (yyvsp[0].nd)); } -#line 8891 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8892 "mrbgems/mruby-compiler/core/y.tab.c" break; case 468: -#line 3377 "mrbgems/mruby-compiler/core/parse.y" +#line 3378 "mrbgems/mruby-compiler/core/parse.y" { (yyval.id) = new_strsym(p, (yyvsp[0].nd)); } -#line 8899 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8900 "mrbgems/mruby-compiler/core/y.tab.c" break; case 469: -#line 3383 "mrbgems/mruby-compiler/core/parse.y" +#line 3384 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_symbols(p, list1((yyvsp[0].nd))); } -#line 8907 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8908 "mrbgems/mruby-compiler/core/y.tab.c" break; case 470: -#line 3387 "mrbgems/mruby-compiler/core/parse.y" +#line 3388 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_symbols(p, push((yyvsp[-1].nd), (yyvsp[0].nd))); } -#line 8915 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8916 "mrbgems/mruby-compiler/core/y.tab.c" break; case 473: -#line 3395 "mrbgems/mruby-compiler/core/parse.y" +#line 3396 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = negate_lit(p, (yyvsp[0].nd)); } -#line 8923 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8924 "mrbgems/mruby-compiler/core/y.tab.c" break; case 474: -#line 3399 "mrbgems/mruby-compiler/core/parse.y" +#line 3400 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = negate_lit(p, (yyvsp[0].nd)); } -#line 8931 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8932 "mrbgems/mruby-compiler/core/y.tab.c" break; case 475: -#line 3405 "mrbgems/mruby-compiler/core/parse.y" +#line 3406 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_lvar(p, (yyvsp[0].id)); } -#line 8939 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8940 "mrbgems/mruby-compiler/core/y.tab.c" break; case 476: -#line 3409 "mrbgems/mruby-compiler/core/parse.y" +#line 3410 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_ivar(p, (yyvsp[0].id)); } -#line 8947 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8948 "mrbgems/mruby-compiler/core/y.tab.c" break; case 477: -#line 3413 "mrbgems/mruby-compiler/core/parse.y" +#line 3414 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_gvar(p, (yyvsp[0].id)); } -#line 8955 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8956 "mrbgems/mruby-compiler/core/y.tab.c" break; case 478: -#line 3417 "mrbgems/mruby-compiler/core/parse.y" +#line 3418 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_cvar(p, (yyvsp[0].id)); } -#line 8963 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8964 "mrbgems/mruby-compiler/core/y.tab.c" break; case 479: -#line 3421 "mrbgems/mruby-compiler/core/parse.y" +#line 3422 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_const(p, (yyvsp[0].id)); } -#line 8971 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8972 "mrbgems/mruby-compiler/core/y.tab.c" break; case 480: -#line 3427 "mrbgems/mruby-compiler/core/parse.y" +#line 3428 "mrbgems/mruby-compiler/core/parse.y" { assignable(p, (yyvsp[0].nd)); } -#line 8979 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8980 "mrbgems/mruby-compiler/core/y.tab.c" break; case 481: -#line 3431 "mrbgems/mruby-compiler/core/parse.y" +#line 3432 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "can't assign to numbered parameter"); } -#line 8987 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8988 "mrbgems/mruby-compiler/core/y.tab.c" break; case 482: -#line 3437 "mrbgems/mruby-compiler/core/parse.y" +#line 3438 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = var_reference(p, (yyvsp[0].nd)); } -#line 8995 "mrbgems/mruby-compiler/core/y.tab.c" +#line 8996 "mrbgems/mruby-compiler/core/y.tab.c" break; case 483: -#line 3441 "mrbgems/mruby-compiler/core/parse.y" +#line 3442 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_nil(p); } -#line 9003 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9004 "mrbgems/mruby-compiler/core/y.tab.c" break; case 484: -#line 3445 "mrbgems/mruby-compiler/core/parse.y" +#line 3446 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_self(p); } -#line 9011 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9012 "mrbgems/mruby-compiler/core/y.tab.c" break; case 485: -#line 3449 "mrbgems/mruby-compiler/core/parse.y" +#line 3450 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_true(p); } -#line 9019 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9020 "mrbgems/mruby-compiler/core/y.tab.c" break; case 486: -#line 3453 "mrbgems/mruby-compiler/core/parse.y" +#line 3454 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_false(p); } -#line 9027 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9028 "mrbgems/mruby-compiler/core/y.tab.c" break; case 487: -#line 3457 "mrbgems/mruby-compiler/core/parse.y" +#line 3458 "mrbgems/mruby-compiler/core/parse.y" { const char *fn = mrb_sym_name_len(p->mrb, p->filename_sym, NULL); if (!fn) { @@ -9035,22 +9036,22 @@ yyreduce: } (yyval.nd) = new_str(p, fn, strlen(fn)); } -#line 9039 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9040 "mrbgems/mruby-compiler/core/y.tab.c" break; case 488: -#line 3465 "mrbgems/mruby-compiler/core/parse.y" +#line 3466 "mrbgems/mruby-compiler/core/parse.y" { char buf[16]; dump_int(p->lineno, buf); (yyval.nd) = new_int(p, buf, 10, 0); } -#line 9050 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9051 "mrbgems/mruby-compiler/core/y.tab.c" break; case 489: -#line 3472 "mrbgems/mruby-compiler/core/parse.y" +#line 3473 "mrbgems/mruby-compiler/core/parse.y" { #ifdef MRB_UTF8_STRING const char *enc = "UTF-8"; @@ -9059,589 +9060,589 @@ yyreduce: #endif (yyval.nd) = new_str(p, enc, strlen(enc)); } -#line 9063 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9064 "mrbgems/mruby-compiler/core/y.tab.c" break; case 492: -#line 3487 "mrbgems/mruby-compiler/core/parse.y" +#line 3488 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = 0; } -#line 9071 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9072 "mrbgems/mruby-compiler/core/y.tab.c" break; case 493: -#line 3491 "mrbgems/mruby-compiler/core/parse.y" +#line 3492 "mrbgems/mruby-compiler/core/parse.y" { p->lstate = EXPR_BEG; p->cmd_start = TRUE; } -#line 9080 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9081 "mrbgems/mruby-compiler/core/y.tab.c" break; case 494: -#line 3496 "mrbgems/mruby-compiler/core/parse.y" +#line 3497 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 9088 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9089 "mrbgems/mruby-compiler/core/y.tab.c" break; case 495: -#line 3507 "mrbgems/mruby-compiler/core/parse.y" +#line 3508 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); p->lstate = EXPR_BEG; p->cmd_start = TRUE; } -#line 9098 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9099 "mrbgems/mruby-compiler/core/y.tab.c" break; case 496: -#line 3513 "mrbgems/mruby-compiler/core/parse.y" +#line 3514 "mrbgems/mruby-compiler/core/parse.y" { #if 1 /* til real keyword args implemented */ - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); local_add_f(p, r); (yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, r, 0, new_args_tail(p, 0, 0, b)); #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); local_add_f(p, r); local_add_f(p, k); (yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, r, 0, new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b)); #endif } -#line 9120 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9121 "mrbgems/mruby-compiler/core/y.tab.c" break; case 497: -#line 3531 "mrbgems/mruby-compiler/core/parse.y" +#line 3532 "mrbgems/mruby-compiler/core/parse.y" { #if 1 /* til real keyword args implemented */ - mrb_sym r = MRB_OPSYM(mul); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym b = intern_op(and); local_add_f(p, r); (yyval.nd) = new_args(p, 0, 0, r, 0, new_args_tail(p, 0, 0, b)); #else - mrb_sym r = MRB_OPSYM(mul); - mrb_sym k = MRB_OPSYM(pow); - mrb_sym b = MRB_OPSYM(and); + mrb_sym r = intern_op(mul); + mrb_sym k = intern_op(pow); + mrb_sym b = intern_op(and); local_add_f(p, r); local_add_f(p, k); (yyval.nd) = new_args(p, 0, 0, r, 0, new_args_tail(p, 0, new_kw_rest_args(p, nsym(k)), b)); #endif } -#line 9142 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9143 "mrbgems/mruby-compiler/core/y.tab.c" break; case 499: -#line 3552 "mrbgems/mruby-compiler/core/parse.y" +#line 3553 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 9150 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9151 "mrbgems/mruby-compiler/core/y.tab.c" break; case 500: -#line 3558 "mrbgems/mruby-compiler/core/parse.y" +#line 3559 "mrbgems/mruby-compiler/core/parse.y" { local_nest(p); } -#line 9158 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9159 "mrbgems/mruby-compiler/core/y.tab.c" break; case 501: -#line 3564 "mrbgems/mruby-compiler/core/parse.y" +#line 3565 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = new_kw_arg(p, (yyvsp[-1].id), cons((yyvsp[0].nd), locals_node(p))); local_unnest(p); } -#line 9168 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9169 "mrbgems/mruby-compiler/core/y.tab.c" break; case 502: -#line 3570 "mrbgems/mruby-compiler/core/parse.y" +#line 3571 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_kw_arg(p, (yyvsp[0].id), 0); local_unnest(p); } -#line 9177 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9178 "mrbgems/mruby-compiler/core/y.tab.c" break; case 503: -#line 3577 "mrbgems/mruby-compiler/core/parse.y" +#line 3578 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_kw_arg(p, (yyvsp[-1].id), cons((yyvsp[0].nd), locals_node(p))); local_unnest(p); } -#line 9186 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9187 "mrbgems/mruby-compiler/core/y.tab.c" break; case 504: -#line 3582 "mrbgems/mruby-compiler/core/parse.y" +#line 3583 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_kw_arg(p, (yyvsp[0].id), 0); local_unnest(p); } -#line 9195 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9196 "mrbgems/mruby-compiler/core/y.tab.c" break; case 505: -#line 3589 "mrbgems/mruby-compiler/core/parse.y" +#line 3590 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 9203 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9204 "mrbgems/mruby-compiler/core/y.tab.c" break; case 506: -#line 3593 "mrbgems/mruby-compiler/core/parse.y" +#line 3594 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 9211 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9212 "mrbgems/mruby-compiler/core/y.tab.c" break; case 507: -#line 3599 "mrbgems/mruby-compiler/core/parse.y" +#line 3600 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 9219 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9220 "mrbgems/mruby-compiler/core/y.tab.c" break; case 508: -#line 3603 "mrbgems/mruby-compiler/core/parse.y" +#line 3604 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 9227 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9228 "mrbgems/mruby-compiler/core/y.tab.c" break; case 511: -#line 3613 "mrbgems/mruby-compiler/core/parse.y" +#line 3614 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_kw_rest_args(p, nsym((yyvsp[0].id))); } -#line 9235 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9236 "mrbgems/mruby-compiler/core/y.tab.c" break; case 512: -#line 3617 "mrbgems/mruby-compiler/core/parse.y" +#line 3618 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_kw_rest_args(p, 0); } -#line 9243 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9244 "mrbgems/mruby-compiler/core/y.tab.c" break; case 513: -#line 3623 "mrbgems/mruby-compiler/core/parse.y" +#line 3624 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, (yyvsp[-3].nd), (yyvsp[-1].nd), (yyvsp[0].id)); } -#line 9251 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9252 "mrbgems/mruby-compiler/core/y.tab.c" break; case 514: -#line 3627 "mrbgems/mruby-compiler/core/parse.y" +#line 3628 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, (yyvsp[-1].nd), 0, (yyvsp[0].id)); } -#line 9259 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9260 "mrbgems/mruby-compiler/core/y.tab.c" break; case 515: -#line 3631 "mrbgems/mruby-compiler/core/parse.y" +#line 3632 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, 0, (yyvsp[-1].nd), (yyvsp[0].id)); } -#line 9267 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9268 "mrbgems/mruby-compiler/core/y.tab.c" break; case 516: -#line 3635 "mrbgems/mruby-compiler/core/parse.y" +#line 3636 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, 0, 0, (yyvsp[0].id)); } -#line 9275 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9276 "mrbgems/mruby-compiler/core/y.tab.c" break; case 517: -#line 3641 "mrbgems/mruby-compiler/core/parse.y" +#line 3642 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); } -#line 9283 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9284 "mrbgems/mruby-compiler/core/y.tab.c" break; case 518: -#line 3645 "mrbgems/mruby-compiler/core/parse.y" +#line 3646 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args_tail(p, 0, 0, 0); } -#line 9291 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9292 "mrbgems/mruby-compiler/core/y.tab.c" break; case 519: -#line 3651 "mrbgems/mruby-compiler/core/parse.y" +#line 3652 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 9299 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9300 "mrbgems/mruby-compiler/core/y.tab.c" break; case 520: -#line 3655 "mrbgems/mruby-compiler/core/parse.y" +#line 3656 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-7].nd), (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 9307 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9308 "mrbgems/mruby-compiler/core/y.tab.c" break; case 521: -#line 3659 "mrbgems/mruby-compiler/core/parse.y" +#line 3660 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-3].nd), (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd)); } -#line 9315 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9316 "mrbgems/mruby-compiler/core/y.tab.c" break; case 522: -#line 3663 "mrbgems/mruby-compiler/core/parse.y" +#line 3664 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-5].nd), (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 9323 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9324 "mrbgems/mruby-compiler/core/y.tab.c" break; case 523: -#line 3667 "mrbgems/mruby-compiler/core/parse.y" +#line 3668 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-3].nd), 0, (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 9331 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9332 "mrbgems/mruby-compiler/core/y.tab.c" break; case 524: -#line 3671 "mrbgems/mruby-compiler/core/parse.y" +#line 3672 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-5].nd), 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 9339 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9340 "mrbgems/mruby-compiler/core/y.tab.c" break; case 525: -#line 3675 "mrbgems/mruby-compiler/core/parse.y" +#line 3676 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, (yyvsp[-1].nd), 0, 0, 0, (yyvsp[0].nd)); } -#line 9347 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9348 "mrbgems/mruby-compiler/core/y.tab.c" break; case 526: -#line 3679 "mrbgems/mruby-compiler/core/parse.y" +#line 3680 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 9355 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9356 "mrbgems/mruby-compiler/core/y.tab.c" break; case 527: -#line 3683 "mrbgems/mruby-compiler/core/parse.y" +#line 3684 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-5].nd), (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 9363 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9364 "mrbgems/mruby-compiler/core/y.tab.c" break; case 528: -#line 3687 "mrbgems/mruby-compiler/core/parse.y" +#line 3688 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-1].nd), 0, 0, (yyvsp[0].nd)); } -#line 9371 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9372 "mrbgems/mruby-compiler/core/y.tab.c" break; case 529: -#line 3691 "mrbgems/mruby-compiler/core/parse.y" +#line 3692 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, (yyvsp[-3].nd), 0, (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 9379 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9380 "mrbgems/mruby-compiler/core/y.tab.c" break; case 530: -#line 3695 "mrbgems/mruby-compiler/core/parse.y" +#line 3696 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, 0, (yyvsp[-1].id), 0, (yyvsp[0].nd)); } -#line 9387 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9388 "mrbgems/mruby-compiler/core/y.tab.c" break; case 531: -#line 3699 "mrbgems/mruby-compiler/core/parse.y" +#line 3700 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, 0, (yyvsp[-3].id), (yyvsp[-1].nd), (yyvsp[0].nd)); } -#line 9395 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9396 "mrbgems/mruby-compiler/core/y.tab.c" break; case 532: -#line 3703 "mrbgems/mruby-compiler/core/parse.y" +#line 3704 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[0].nd)); } -#line 9403 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9404 "mrbgems/mruby-compiler/core/y.tab.c" break; case 533: -#line 3707 "mrbgems/mruby-compiler/core/parse.y" +#line 3708 "mrbgems/mruby-compiler/core/parse.y" { - local_add_f(p, MRB_OPSYM(and)); + local_add_f(p, intern_op(and)); (yyval.nd) = new_args(p, 0, 0, 0, 0, 0); } -#line 9412 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9413 "mrbgems/mruby-compiler/core/y.tab.c" break; case 534: -#line 3714 "mrbgems/mruby-compiler/core/parse.y" +#line 3715 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "formal argument cannot be a constant"); (yyval.nd) = 0; } -#line 9421 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9422 "mrbgems/mruby-compiler/core/y.tab.c" break; case 535: -#line 3719 "mrbgems/mruby-compiler/core/parse.y" +#line 3720 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "formal argument cannot be an instance variable"); (yyval.nd) = 0; } -#line 9430 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9431 "mrbgems/mruby-compiler/core/y.tab.c" break; case 536: -#line 3724 "mrbgems/mruby-compiler/core/parse.y" +#line 3725 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "formal argument cannot be a global variable"); (yyval.nd) = 0; } -#line 9439 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9440 "mrbgems/mruby-compiler/core/y.tab.c" break; case 537: -#line 3729 "mrbgems/mruby-compiler/core/parse.y" +#line 3730 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "formal argument cannot be a class variable"); (yyval.nd) = 0; } -#line 9448 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9449 "mrbgems/mruby-compiler/core/y.tab.c" break; case 538: -#line 3734 "mrbgems/mruby-compiler/core/parse.y" +#line 3735 "mrbgems/mruby-compiler/core/parse.y" { yyerror(p, "formal argument cannot be a numbered parameter"); (yyval.nd) = 0; } -#line 9457 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9458 "mrbgems/mruby-compiler/core/y.tab.c" break; case 539: -#line 3741 "mrbgems/mruby-compiler/core/parse.y" +#line 3742 "mrbgems/mruby-compiler/core/parse.y" { (yyval.id) = 0; } -#line 9465 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9466 "mrbgems/mruby-compiler/core/y.tab.c" break; case 540: -#line 3745 "mrbgems/mruby-compiler/core/parse.y" +#line 3746 "mrbgems/mruby-compiler/core/parse.y" { local_add_f(p, (yyvsp[0].id)); (yyval.id) = (yyvsp[0].id); } -#line 9474 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9475 "mrbgems/mruby-compiler/core/y.tab.c" break; case 541: -#line 3752 "mrbgems/mruby-compiler/core/parse.y" +#line 3753 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_arg(p, (yyvsp[0].id)); } -#line 9482 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9483 "mrbgems/mruby-compiler/core/y.tab.c" break; case 542: -#line 3756 "mrbgems/mruby-compiler/core/parse.y" +#line 3757 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = local_switch(p); } -#line 9490 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9491 "mrbgems/mruby-compiler/core/y.tab.c" break; case 543: -#line 3760 "mrbgems/mruby-compiler/core/parse.y" +#line 3761 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = new_masgn_param(p, (yyvsp[-1].nd), p->locals->car); local_resume(p, (yyvsp[-2].nd)); local_add_f(p, 0); } -#line 9500 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9501 "mrbgems/mruby-compiler/core/y.tab.c" break; case 544: -#line 3768 "mrbgems/mruby-compiler/core/parse.y" +#line 3769 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 9508 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9509 "mrbgems/mruby-compiler/core/y.tab.c" break; case 545: -#line 3772 "mrbgems/mruby-compiler/core/parse.y" +#line 3773 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 9516 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9517 "mrbgems/mruby-compiler/core/y.tab.c" break; case 546: -#line 3778 "mrbgems/mruby-compiler/core/parse.y" +#line 3779 "mrbgems/mruby-compiler/core/parse.y" { local_add_f(p, (yyvsp[-1].id)); local_nest(p); (yyval.id) = (yyvsp[-1].id); } -#line 9526 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9527 "mrbgems/mruby-compiler/core/y.tab.c" break; case 547: -#line 3786 "mrbgems/mruby-compiler/core/parse.y" +#line 3787 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons(nsym((yyvsp[-1].id)), cons((yyvsp[0].nd), locals_node(p))); local_unnest(p); } -#line 9536 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9537 "mrbgems/mruby-compiler/core/y.tab.c" break; case 548: -#line 3794 "mrbgems/mruby-compiler/core/parse.y" +#line 3795 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons(nsym((yyvsp[-1].id)), cons((yyvsp[0].nd), locals_node(p))); local_unnest(p); } -#line 9546 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9547 "mrbgems/mruby-compiler/core/y.tab.c" break; case 549: -#line 3802 "mrbgems/mruby-compiler/core/parse.y" +#line 3803 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 9554 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9555 "mrbgems/mruby-compiler/core/y.tab.c" break; case 550: -#line 3806 "mrbgems/mruby-compiler/core/parse.y" +#line 3807 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 9562 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9563 "mrbgems/mruby-compiler/core/y.tab.c" break; case 551: -#line 3812 "mrbgems/mruby-compiler/core/parse.y" +#line 3813 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); } -#line 9570 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9571 "mrbgems/mruby-compiler/core/y.tab.c" break; case 552: -#line 3816 "mrbgems/mruby-compiler/core/parse.y" +#line 3817 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 9578 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9579 "mrbgems/mruby-compiler/core/y.tab.c" break; case 555: -#line 3826 "mrbgems/mruby-compiler/core/parse.y" +#line 3827 "mrbgems/mruby-compiler/core/parse.y" { local_add_f(p, (yyvsp[0].id)); (yyval.id) = (yyvsp[0].id); } -#line 9587 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9588 "mrbgems/mruby-compiler/core/y.tab.c" break; case 556: -#line 3831 "mrbgems/mruby-compiler/core/parse.y" +#line 3832 "mrbgems/mruby-compiler/core/parse.y" { - local_add_f(p, MRB_OPSYM(mul)); + local_add_f(p, intern_op(mul)); (yyval.id) = -1; } -#line 9596 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9597 "mrbgems/mruby-compiler/core/y.tab.c" break; case 559: -#line 3842 "mrbgems/mruby-compiler/core/parse.y" +#line 3843 "mrbgems/mruby-compiler/core/parse.y" { (yyval.id) = (yyvsp[0].id); } -#line 9604 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9605 "mrbgems/mruby-compiler/core/y.tab.c" break; case 560: -#line 3848 "mrbgems/mruby-compiler/core/parse.y" +#line 3849 "mrbgems/mruby-compiler/core/parse.y" { (yyval.id) = (yyvsp[0].id); } -#line 9612 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9613 "mrbgems/mruby-compiler/core/y.tab.c" break; case 561: -#line 3852 "mrbgems/mruby-compiler/core/parse.y" +#line 3853 "mrbgems/mruby-compiler/core/parse.y" { (yyval.id) = 0; } -#line 9620 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9621 "mrbgems/mruby-compiler/core/y.tab.c" break; case 562: -#line 3858 "mrbgems/mruby-compiler/core/parse.y" +#line 3859 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[0].nd); if (!(yyval.nd)) (yyval.nd) = new_nil(p); } -#line 9629 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9630 "mrbgems/mruby-compiler/core/y.tab.c" break; case 563: -#line 3862 "mrbgems/mruby-compiler/core/parse.y" +#line 3863 "mrbgems/mruby-compiler/core/parse.y" {p->lstate = EXPR_BEG;} -#line 9635 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9636 "mrbgems/mruby-compiler/core/y.tab.c" break; case 564: -#line 3863 "mrbgems/mruby-compiler/core/parse.y" +#line 3864 "mrbgems/mruby-compiler/core/parse.y" { if ((yyvsp[-1].nd) == 0) { yyerror(p, "can't define singleton method for ()."); } else { - switch ((enum node_type)intn((yyvsp[-1].nd)->car)) { + switch (typen((yyvsp[-1].nd)->car)) { case NODE_STR: case NODE_DSTR: case NODE_XSTR: @@ -9658,125 +9659,125 @@ yyreduce: } (yyval.nd) = (yyvsp[-1].nd); } -#line 9662 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9663 "mrbgems/mruby-compiler/core/y.tab.c" break; case 566: -#line 3889 "mrbgems/mruby-compiler/core/parse.y" +#line 3890 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = (yyvsp[-1].nd); } -#line 9670 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9671 "mrbgems/mruby-compiler/core/y.tab.c" break; case 567: -#line 3895 "mrbgems/mruby-compiler/core/parse.y" +#line 3896 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = list1((yyvsp[0].nd)); NODE_LINENO((yyval.nd), (yyvsp[0].nd)); } -#line 9679 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9680 "mrbgems/mruby-compiler/core/y.tab.c" break; case 568: -#line 3900 "mrbgems/mruby-compiler/core/parse.y" +#line 3901 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = push((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 9687 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9688 "mrbgems/mruby-compiler/core/y.tab.c" break; case 571: -#line 3910 "mrbgems/mruby-compiler/core/parse.y" +#line 3911 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[-2].nd)); void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons((yyvsp[-2].nd), (yyvsp[0].nd)); } -#line 9697 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9698 "mrbgems/mruby-compiler/core/y.tab.c" break; case 572: -#line 3916 "mrbgems/mruby-compiler/core/parse.y" +#line 3917 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons(new_sym(p, (yyvsp[-2].id)), (yyvsp[0].nd)); } -#line 9706 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9707 "mrbgems/mruby-compiler/core/y.tab.c" break; case 573: -#line 3921 "mrbgems/mruby-compiler/core/parse.y" +#line 3922 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); - if ((yyvsp[-2].nd)->car == (node*)NODE_DSTR) { + if (typen((yyvsp[-2].nd)->car) == NODE_DSTR) { (yyval.nd) = cons(new_dsym(p, (yyvsp[-2].nd)), (yyvsp[0].nd)); } else { (yyval.nd) = cons(new_sym(p, new_strsym(p, (yyvsp[-2].nd))), (yyvsp[0].nd)); } } -#line 9720 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9721 "mrbgems/mruby-compiler/core/y.tab.c" break; case 574: -#line 3931 "mrbgems/mruby-compiler/core/parse.y" +#line 3932 "mrbgems/mruby-compiler/core/parse.y" { void_expr_error(p, (yyvsp[0].nd)); (yyval.nd) = cons(new_kw_rest_args(p, 0), (yyvsp[0].nd)); } -#line 9729 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9730 "mrbgems/mruby-compiler/core/y.tab.c" break; case 587: -#line 3958 "mrbgems/mruby-compiler/core/parse.y" +#line 3959 "mrbgems/mruby-compiler/core/parse.y" { (yyval.num) = '.'; } -#line 9737 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9738 "mrbgems/mruby-compiler/core/y.tab.c" break; case 588: -#line 3962 "mrbgems/mruby-compiler/core/parse.y" +#line 3963 "mrbgems/mruby-compiler/core/parse.y" { (yyval.num) = 0; } -#line 9745 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9746 "mrbgems/mruby-compiler/core/y.tab.c" break; case 590: -#line 3969 "mrbgems/mruby-compiler/core/parse.y" +#line 3970 "mrbgems/mruby-compiler/core/parse.y" { (yyval.num) = tCOLON2; } -#line 9753 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9754 "mrbgems/mruby-compiler/core/y.tab.c" break; case 599: -#line 3990 "mrbgems/mruby-compiler/core/parse.y" +#line 3991 "mrbgems/mruby-compiler/core/parse.y" {yyerrok;} -#line 9759 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9760 "mrbgems/mruby-compiler/core/y.tab.c" break; case 602: -#line 3996 "mrbgems/mruby-compiler/core/parse.y" +#line 3997 "mrbgems/mruby-compiler/core/parse.y" { p->lineno += (yyvsp[0].num); p->column = 0; } -#line 9768 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9769 "mrbgems/mruby-compiler/core/y.tab.c" break; case 605: -#line 4007 "mrbgems/mruby-compiler/core/parse.y" +#line 4008 "mrbgems/mruby-compiler/core/parse.y" { (yyval.nd) = 0; } -#line 9776 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9777 "mrbgems/mruby-compiler/core/y.tab.c" break; -#line 9780 "mrbgems/mruby-compiler/core/y.tab.c" +#line 9781 "mrbgems/mruby-compiler/core/y.tab.c" default: break; } @@ -10008,7 +10009,7 @@ yyreturn: #endif return yyresult; } -#line 4011 "mrbgems/mruby-compiler/core/parse.y" +#line 4012 "mrbgems/mruby-compiler/core/parse.y" #define pylval (*((YYSTYPE*)(p->ylval))) @@ -10625,6 +10626,93 @@ read_escape(parser_state *p) } } +static void +heredoc_count_indent(parser_heredoc_info *hinf, const char *str, size_t len, size_t *indent, size_t *offset) +{ + *indent = 0; + *offset = 0; + for (size_t i = 0; i < len; i++) { + size_t size; + if (str[i] == '\n') + break; + else if (str[i] == '\t') + size = 8; + else if (ISSPACE(str[i])) + size = 1; + else + break; + if (*indent + size > hinf->indent) + break; + *indent += size; + *offset += 1; + } +} + +static void +heredoc_remove_indent(parser_state *p, parser_heredoc_info *hinf) +{ + if (!hinf->remove_indent) + return; + node *indented, *n, *pair, *escaped; + const char *str; + size_t len, indent, offset, start, end; + indented = hinf->indented; + while (indented) { + n = indented->car; + pair = n->car; + str = (char*)pair->car; + len = (size_t)pair->cdr; + escaped = n->cdr; + if (escaped) { + start = 0; + while (start < len) { + end = escaped ? (size_t)escaped->car : len; + heredoc_count_indent(hinf, str + start, end - start, &indent, &offset); + if (indent < hinf->indent) + hinf->indent = indent; + start = end; + if (escaped) + escaped = escaped->cdr; + } + } + indented = indented->cdr; + } + if (hinf->indent == 0) + return; + indented = hinf->indented; + while (indented) { + n = indented->car; + pair = n->car; + str = (char*)pair->car; + len = (size_t)pair->cdr; + escaped = n->cdr; + if (escaped) { + char *newstr = strndup(str, len); + size_t newlen = 0; + start = 0; + while (start < len) { + end = escaped ? (size_t)escaped->car : len; + size_t esclen = end - start; + heredoc_count_indent(hinf, str + start, esclen, &indent, &offset); + esclen -= offset; + memcpy(newstr + newlen, str + start + offset, esclen); + newlen += esclen; + start = end; + if (escaped) + escaped = escaped->cdr; + } + newstr[newlen] = '\0'; + pair->car = (node*)newstr; + pair->cdr = (node*)newlen; + } else { + heredoc_count_indent(hinf, str, len, &indent, &offset); + pair->car = (node*)(str + offset); + pair->cdr = (node*)(len - offset); + } + indented = indented->cdr; + } +} + static int parse_string(parser_state *p) { @@ -10635,10 +10723,18 @@ parse_string(parser_state *p) int end = intn(p->lex_strterm->cdr->cdr->cdr); parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL; + mrb_bool unindent = hinf && hinf->remove_indent; + mrb_bool head = hinf && hinf->line_head; + mrb_bool empty = TRUE; + size_t spaces = 0; + size_t pos = -1; + node *escaped = NULL; + if (beg == 0) beg = -3; /* should never happen */ if (end == 0) end = -3; newtok(p); while ((c = nextc(p)) != end || nest_level != 0) { + pos++; if (hinf && (c == '\n' || c < 0)) { mrb_bool line_head; tokadd(p, '\n'); @@ -10658,6 +10754,7 @@ parse_string(parser_state *p) } } if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) { + heredoc_remove_indent(p, hinf); return tHEREDOC_END; } } @@ -10676,9 +10773,23 @@ parse_string(parser_state *p) } return 0; } - pylval.nd = new_str(p, tok(p), toklen(p)); + node *nd = new_str(p, tok(p), toklen(p)); + pylval.nd = nd; + if (unindent && head) { + hinf->indented = push(hinf->indented, cons(nd->cdr, escaped)); + if ((hinf->indent == ~0U || spaces < hinf->indent) && (!empty || !line_head)) + hinf->indent = spaces; + } return tHD_STRING_MID; } + if (unindent && head && empty) { + if (c == '\t') + spaces += 8; + else if (ISSPACE(c)) + ++spaces; + else + empty = FALSE; + } if (c < 0) { yyerror(p, "unterminated string meets end of file"); return 0; @@ -10700,6 +10811,10 @@ parse_string(parser_state *p) else if (c == '\n') { p->lineno++; p->column = 0; + if (unindent) { + escaped = push(escaped, (node*)pos); + pos--; + } if (type & STR_FUNC_ARRAY) { tokadd(p, '\n'); } @@ -10749,8 +10864,14 @@ parse_string(parser_state *p) tokfix(p); p->lstate = EXPR_BEG; p->cmd_start = TRUE; - pylval.nd = new_str(p, tok(p), toklen(p)); + node *nd = new_str(p, tok(p), toklen(p)); + pylval.nd = nd; if (hinf) { + if (unindent && head) { + hinf->indented = push(hinf->indented, cons(nd->cdr, escaped)); + if (hinf->indent == ~0U || spaces < hinf->indent) + hinf->indent = spaces; + } hinf->line_head = FALSE; return tHD_STRING_PART; } @@ -10871,7 +10992,7 @@ number_literal_suffix(parser_state *p) int mask = NUM_SUFFIX_R|NUM_SUFFIX_I; while ((c = nextc(p)) != -1) { - list = push(list, (node*)(intptr_t)c); + list = push(list, nint(c)); if ((mask & NUM_SUFFIX_I) && c == 'i') { result |= (mask & NUM_SUFFIX_I); @@ -10907,6 +11028,7 @@ heredoc_identifier(parser_state *p) int c; int type = str_heredoc; mrb_bool indent = FALSE; + mrb_bool squiggly = FALSE; mrb_bool quote = FALSE; node *newnode; parser_heredoc_info *info; @@ -10916,8 +11038,11 @@ heredoc_identifier(parser_state *p) pushback(p, c); return 0; } - if (c == '-') { - indent = TRUE; + if (c == '-' || c == '~') { + if (c == '-') + indent = TRUE; + if (c == '~') + squiggly = TRUE; c = nextc(p); } if (c == '\'' || c == '"') { @@ -10944,6 +11069,7 @@ heredoc_identifier(parser_state *p) if (! identchar(c)) { pushback(p, c); if (indent) pushback(p, '-'); + if (squiggly) pushback(p, '~'); return 0; } newtok(p); @@ -10960,7 +11086,10 @@ heredoc_identifier(parser_state *p) if (! quote) type |= STR_FUNC_EXPAND; info->type = (string_type)type; - info->allow_indent = indent; + info->allow_indent = indent || squiggly; + info->remove_indent = squiggly; + info->indent = ~0U; + info->indented = NULL; info->line_head = TRUE; info->doc = NULL; p->heredocs_from_nextline = push(p->heredocs_from_nextline, newnode); @@ -11087,7 +11216,7 @@ parser_yylex(parser_state *p) case '*': if ((c = nextc(p)) == '*') { if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(pow); + pylval.id = intern_op(pow); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11105,7 +11234,7 @@ parser_yylex(parser_state *p) } else { if (c == '=') { - pylval.id = MRB_OPSYM(mul); + pylval.id = intern_op(mul); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11221,7 +11350,7 @@ parser_yylex(parser_state *p) } if (c == '<') { if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(lshift); + pylval.id = intern_op(lshift); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11243,7 +11372,7 @@ parser_yylex(parser_state *p) } if (c == '>') { if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(rshift); + pylval.id = intern_op(rshift); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11351,7 +11480,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '&') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(andand); + pylval.id = intern_op(andand); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11363,7 +11492,7 @@ parser_yylex(parser_state *p) return tANDDOT; } else if (c == '=') { - pylval.id = MRB_OPSYM(and); + pylval.id = intern_op(and); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11390,7 +11519,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '|') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(oror); + pylval.id = intern_op(oror); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11398,7 +11527,7 @@ parser_yylex(parser_state *p) return tOROP; } if (c == '=') { - pylval.id = MRB_OPSYM(or); + pylval.id = intern_op(or); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11422,7 +11551,7 @@ parser_yylex(parser_state *p) return '+'; } if (c == '=') { - pylval.id = MRB_OPSYM(add); + pylval.id = intern_op(add); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11450,7 +11579,7 @@ parser_yylex(parser_state *p) return '-'; } if (c == '=') { - pylval.id = MRB_OPSYM(sub); + pylval.id = intern_op(sub); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11773,7 +11902,7 @@ parser_yylex(parser_state *p) return tREGEXP_BEG; } if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(div); + pylval.id = intern_op(div); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11792,7 +11921,7 @@ parser_yylex(parser_state *p) case '^': if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(xor); + pylval.id = intern_op(xor); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -11845,6 +11974,7 @@ parser_yylex(parser_state *p) p->paren_nest++; if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { p->lstate = EXPR_ARG; + p->paren_nest--; if ((c = nextc(p)) == ']') { if ((c = nextc(p)) == '=') { return tASET; @@ -11969,7 +12099,7 @@ parser_yylex(parser_state *p) } } if ((c = nextc(p)) == '=') { - pylval.id = MRB_OPSYM(mod); + pylval.id = intern_op(mod); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -13169,7 +13299,7 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) if (n2->car) { dump_prefix(n2, offset+2); printf("rest:\n"); - if (n2->car == (node*)-1) { + if (n2->car == nint(-1)) { dump_prefix(n2, offset+2); printf("(empty)\n"); } @@ -13411,11 +13541,11 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) case NODE_CLASS: printf("NODE_CLASS:\n"); - if (tree->car->car == (node*)0) { + if (tree->car->car == nint(0)) { dump_prefix(tree, offset+1); printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } - else if (tree->car->car == (node*)1) { + else if (tree->car->car == nint(1)) { dump_prefix(tree, offset+1); printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } @@ -13436,11 +13566,11 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) case NODE_MODULE: printf("NODE_MODULE:\n"); - if (tree->car->car == (node*)0) { + if (tree->car->car == nint(0)) { dump_prefix(tree, offset+1); printf(":%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } - else if (tree->car->car == (node*)1) { + else if (tree->car->car == nint(1)) { dump_prefix(tree, offset+1); printf("::%s\n", mrb_sym_name(mrb, sym(tree->car->cdr))); } diff --git a/mrbgems/mruby-compiler/mrbgem.rake b/mrbgems/mruby-compiler/mrbgem.rake index 70f9e19d8..da910537a 100644 --- a/mrbgems/mruby-compiler/mrbgem.rake +++ b/mrbgems/mruby-compiler/mrbgem.rake @@ -5,13 +5,13 @@ MRuby::Gem::Specification.new 'mruby-compiler' do |spec| as_cxx_srcs = %w[codegen y.tab].map{|name| "#{dir}/core/#{name}.c"} objs = Dir.glob("#{dir}/core/*.c").map do |src| - dst = src.pathmap("#{build_dir}/core/%n") if build.cxx_exception_enabled? && as_cxx_srcs.include?(src) - build.compile_as_cxx(src, "#{dst}.cxx") + build.compile_as_cxx(src) else - objfile(dst) + objfile(src.pathmap("#{build_dir}/core/%n")) end end + objs << objfile("#{build_dir}/core/y.tab") build.libmruby_core_objs << objs lex_def = "#{dir}/core/lex.def" diff --git a/mrbgems/mruby-error/mrbgem.rake b/mrbgems/mruby-error/mrbgem.rake index 30a4259a8..ff7334744 100644 --- a/mrbgems/mruby-error/mrbgem.rake +++ b/mrbgems/mruby-error/mrbgem.rake @@ -4,7 +4,7 @@ MRuby::Gem::Specification.new('mruby-error') do |spec| spec.summary = 'extensional error handling' if build.cxx_exception_enabled? - @objs << build.compile_as_cxx("#{spec.dir}/src/exception.c", "#{spec.build_dir}/src/exception.cxx") - @objs.delete_if { |v| v == objfile("#{spec.build_dir}/src/exception") } + objs << build.compile_as_cxx("#{spec.dir}/src/exception.c") + objs.delete_if { |v| v == objfile("#{spec.build_dir}/src/exception") } end end diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index d9df8678f..c7a511fe4 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -39,7 +39,7 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi /* only occur when memory ran out */ if (!p) { - mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state."); + mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state (out of memory)"); } if (0 < p->nerr) { diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index 41fda9eed..5567ed6cf 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -219,8 +219,11 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr while (b<e) { *b++ = *a++; } + if (vmexec) { + c->ci--; /* pop dummy callinfo */ + } c->cibase->argc = (int)len; - value = c->stack[0] = MRB_PROC_ENV(c->ci->proc)->stack[0]; + value = c->stack[0] = MRB_PROC_ENV(c->cibase->proc)->stack[0]; } else { value = fiber_result(mrb, a, len); @@ -228,7 +231,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr if (vmexec) { c->vmexec = TRUE; - value = mrb_vm_exec(mrb, c->ci[-1].proc, c->ci->pc); + value = mrb_vm_exec(mrb, c->ci->proc, c->ci->pc); mrb->c = old_c; } else { @@ -354,6 +357,7 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a) if (c->vmexec) { c->vmexec = FALSE; mrb->c->ci->acc = CI_ACC_RESUMED; + c->ci--; /* pop callinfo for yield */ } MARK_CONTEXT_MODIFY(mrb->c); return fiber_result(mrb, a, len); diff --git a/mrbgems/mruby-hash-ext/src/hash-ext.c b/mrbgems/mruby-hash-ext/src/hash-ext.c index 16e066c73..6345420ed 100644 --- a/mrbgems/mruby-hash-ext/src/hash-ext.c +++ b/mrbgems/mruby-hash-ext/src/hash-ext.c @@ -69,6 +69,31 @@ hash_slice(mrb_state *mrb, mrb_value hash) return result; } +/* + * call-seq: + * hsh.except(*keys) -> a_hash + * + * Returns a hash excluding the given keys and their values. + * + * h = { a: 100, b: 200, c: 300 } + * h.except(:a) #=> {:b=>200, :c=>300} + * h.except(:b, :c, :d) #=> {:a=>100} + */ +static mrb_value +hash_except(mrb_state *mrb, mrb_value hash) +{ + const mrb_value *argv; + mrb_value result; + mrb_int argc, i; + + mrb_get_args(mrb, "*", &argv, &argc); + result = mrb_hash_dup(mrb, hash); + for (i = 0; i < argc; i++) { + mrb_hash_delete_key(mrb, result, argv[i]); + } + return result; +} + void mrb_mruby_hash_ext_gem_init(mrb_state *mrb) { @@ -77,6 +102,7 @@ mrb_mruby_hash_ext_gem_init(mrb_state *mrb) h = mrb->hash_class; mrb_define_method(mrb, h, "values_at", hash_values_at, MRB_ARGS_ANY()); mrb_define_method(mrb, h, "slice", hash_slice, MRB_ARGS_ANY()); + mrb_define_method(mrb, h, "except", hash_except, MRB_ARGS_ANY()); } void diff --git a/mrbgems/mruby-hash-ext/test/hash.rb b/mrbgems/mruby-hash-ext/test/hash.rb index fdf4c57a8..78e8b3a3a 100644 --- a/mrbgems/mruby-hash-ext/test/hash.rb +++ b/mrbgems/mruby-hash-ext/test/hash.rb @@ -288,3 +288,10 @@ assert("Hash#slice") do assert_equal({:a=>100}, h.slice(:a)) assert_equal({:b=>200, :c=>300}, h.slice(:b, :c, :d)) end + +assert("Hash#except") do + h = { a: 100, b: 200, c: 300 } + assert_equal({:b=>200, :c=>300}, h.except(:a)) + assert_equal({:a=>100}, h.except(:b, :c, :d)) + assert_equal(h, h.except) +end diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index 6d94cb21f..deb48ef8a 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -102,9 +102,14 @@ rational_new(mrb_state *mrb, mrb_int numerator, mrb_int denominator) */ #ifdef MRB_INT32 typedef float rat_float; +typedef int32_t rat_int; #else typedef double rat_float; +typedef int64_t rat_int; #endif + +void mrb_check_num_exact(mrb_state *mrb, mrb_float num); + static mrb_value rational_new_f(mrb_state *mrb, mrb_float f0) { @@ -113,9 +118,10 @@ rational_new_f(mrb_state *mrb, mrb_float f0) /* a: continued fraction coefficients. */ mrb_int a, h[3] = { 0, 1, 0 }, k[3] = { 1, 0, 0 }; mrb_int x, d; - int64_t n = 1; + rat_int n = 1; int i, neg = 0; + mrb_check_num_exact(mrb, f0); if (f < 0) { neg = 1; f = -f; } while (f != floor(f)) { n <<= 1; f *= 2; } if (!TYPED_FIXABLE(f, rat_float)) { @@ -192,7 +198,14 @@ static mrb_value rational_to_f(mrb_state *mrb, mrb_value self) { struct mrb_rational *p = rational_ptr(mrb, self); - mrb_float f = (mrb_float)p->numerator / (mrb_float)p->denominator; + mrb_float f; + + if (p->denominator == 0.0) { + f = INFINITY; + } + else { + f = (mrb_float)p->numerator / (mrb_float)p->denominator; + } return mrb_float_value(mrb, f); } diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index 97e821c2f..411aec295 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -75,19 +75,35 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) { char buf[66], *b = buf + sizeof buf; mrb_int num = mrb_integer(x); + const int mask = base -1; + int shift; +#ifdef MRB_INT64 uint64_t val = (uint64_t)num; +#else + uint32_t val = (uint32_t)num; +#endif char d; - if (base != 2) { + switch (base) { + case 2: + shift = 1; + break; + case 8: + shift = 3; + break; + case 16: + shift = 4; + break; + default: mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base); } - if (val == 0) { + if (num == 0) { return mrb_str_new_lit(mrb, "0"); } *--b = '\0'; do { - *--b = mrb_digitmap[(int)(val % base)]; - } while (val /= base); + *--b = mrb_digitmap[(int)(val & mask)]; + } while (val >>= shift); if (num < 0) { b = remove_sign_bits(b, base); @@ -944,21 +960,6 @@ retry: val = mrb_fixnum_to_str(mrb, mrb_int_value(mrb, v), base); } strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-2); - if (v < 0) { - char d; - - s = remove_sign_bits(s, base); - switch (base) { - case 16: d = 'f'; break; - case 8: d = '7'; break; - case 2: d = '1'; break; - default: d = 0; break; - } - - if (d && *s != d) { - *--s = d; - } - } } { size_t size; diff --git a/src/class.c b/src/class.c index 92b58c3ff..85a26d343 100644 --- a/src/class.c +++ b/src/class.c @@ -840,7 +840,7 @@ mrb_get_arg1(mrb_state *mrb) array_argv = ARY_PTR(a); } if (argc != 1) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + mrb_argnum_error(mrb, argc, 1, 1); } return array_argv[0]; } @@ -894,7 +894,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_bool given = TRUE; mrb_value kdict; mrb_bool reqkarg = FALSE; - mrb_int needargc = 0; + int argc_min = 0, argc_max = 0; if (!argv_on_stack) { struct RArray *a = mrb_ary_ptr(*array_argv); @@ -912,6 +912,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) break; case '*': opt_skip = FALSE; + argc_max = -1; if (!reqkarg) reqkarg = strchr(fmt, ':') ? TRUE : FALSE; goto check_exit; case '!': @@ -923,13 +924,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) if (opt) opt_skip = FALSE; break; default: - if (!opt) needargc ++; + if (!opt) argc_min++; + argc_max++; break; } } check_exit: - if (reqkarg && argc > needargc && mrb_hash_p(kdict = ARGV[argc - 1])) { + if (reqkarg && argc > argc_min && mrb_hash_p(kdict = ARGV[argc - 1])) { mrb_hash_check_kdict(mrb, kdict); argc --; } @@ -952,7 +954,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) given = FALSE; } else { - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + mrb_argnum_error(mrb, argc, argc_min, argc_max); } } break; @@ -1315,7 +1317,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) #undef ARGV if (!c && argc > i) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + mrb_argnum_error(mrb, argc, argc_min, argc_max); } finish: @@ -2232,7 +2234,6 @@ mrb_define_alias_id(mrb_state *mrb, struct RClass *klass, mrb_sym a, mrb_sym b) mrb_value mrb_mod_to_s(mrb_state *mrb, mrb_value klass) { - if (mrb_sclass_p(klass)) { mrb_value v = mrb_iv_get(mrb, klass, MRB_SYM(__attached__)); mrb_value str = mrb_str_new_lit(mrb, "#<Class:"); @@ -2791,7 +2792,8 @@ static const mrb_code new_iseq[] = { OP_RETURN, 0x0 /* OP_RETURN R0 */ }; -const mrb_sym new_syms[] = { MRB_SYM(allocate), MRB_SYM(initialize) }; +MRB_PRESYM_DEFINE_VAR_AND_INITER(new_syms, 2, MRB_SYM(allocate), MRB_SYM(initialize)) + static const mrb_irep new_irep = { 3, 6, 0, MRB_IREP_STATIC, new_iseq, NULL, new_syms, NULL, NULL, NULL, @@ -2804,6 +2806,7 @@ init_class_new(mrb_state *mrb, struct RClass *cls) struct RProc *p; mrb_method_t m; + init_new_syms(mrb); p = mrb_proc_new(mrb, &new_irep); MRB_METHOD_FROM_PROC(m, p); mrb_define_method_raw(mrb, cls, MRB_SYM(new), m); diff --git a/src/codedump.c b/src/codedump.c index 576ff6ceb..e6c6e6c3d 100644 --- a/src/codedump.c +++ b/src/codedump.c @@ -172,7 +172,7 @@ codedump(mrb_state *mrb, const mrb_irep *irep) print_lv_a(mrb, irep, a); break; CASE(OP_LOADI32, BSS); - printf("OP_LOADI32\tR%d\t%d\t", a, (int)(((uint32_t)b<<16)+c)); + printf("OP_LOADI32\tR%d\t%d\t", a, (int32_t)(((uint32_t)b<<16)+c)); print_lv_a(mrb, irep, a); break; CASE(OP_LOADI__1, B); @@ -219,7 +219,7 @@ codedump(mrb_state *mrb, const mrb_irep *irep) print_lv_a(mrb, irep, a); break; CASE(OP_SETGV, BB); - printf("OP_SETGV\t;%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a); + printf("OP_SETGV\t:%s\tR%d", mrb_sym_dump(mrb, irep->syms[b]), a); print_lv_a(mrb, irep, a); break; CASE(OP_GETSV, BB); diff --git a/src/debug.c b/src/debug.c index c03c91cf5..2f9320ac9 100644 --- a/src/debug.c +++ b/src/debug.c @@ -66,7 +66,7 @@ mrb_debug_get_filename(mrb_state *mrb, const mrb_irep *irep, uint32_t pc) MRB_API int32_t mrb_debug_get_line(mrb_state *mrb, const mrb_irep *irep, uint32_t pc) { - if (irep && pc < irep->ilen) { + if (irep && pc >= 0 && pc < irep->ilen) { mrb_irep_debug_info_file* f = NULL; if (!irep->debug_info) { return -1; diff --git a/src/dump.c b/src/dump.c index 40f149f5d..3464f08b9 100644 --- a/src/dump.c +++ b/src/dump.c @@ -10,7 +10,6 @@ #include <mruby/dump.h> #include <mruby/string.h> #include <mruby/irep.h> -#include <mruby/numeric.h> #include <mruby/debug.h> #ifndef MRB_NO_FLOAT @@ -24,6 +23,45 @@ static size_t get_irep_record_size_1(mrb_state *mrb, const mrb_irep *irep); # error This code cannot be built on your environment. #endif +#define OPERATOR_SYMBOL(sym_name, name) {name, sym_name, sizeof(sym_name)-1} +struct operator_symbol { + const char *name; + const char *sym_name; + uint16_t sym_name_len; +}; +static const struct operator_symbol operator_table[] = { + OPERATOR_SYMBOL("!", "not"), + OPERATOR_SYMBOL("%", "mod"), + OPERATOR_SYMBOL("&", "and"), + OPERATOR_SYMBOL("*", "mul"), + OPERATOR_SYMBOL("+", "add"), + OPERATOR_SYMBOL("-", "sub"), + OPERATOR_SYMBOL("/", "div"), + OPERATOR_SYMBOL("<", "lt"), + OPERATOR_SYMBOL(">", "gt"), + OPERATOR_SYMBOL("^", "xor"), + OPERATOR_SYMBOL("`", "tick"), + OPERATOR_SYMBOL("|", "or"), + OPERATOR_SYMBOL("~", "neg"), + OPERATOR_SYMBOL("!=", "neq"), + OPERATOR_SYMBOL("!~", "nmatch"), + OPERATOR_SYMBOL("&&", "andand"), + OPERATOR_SYMBOL("**", "pow"), + OPERATOR_SYMBOL("+@", "plus"), + OPERATOR_SYMBOL("-@", "minus"), + OPERATOR_SYMBOL("<<", "lshift"), + OPERATOR_SYMBOL("<=", "le"), + OPERATOR_SYMBOL("==", "eq"), + OPERATOR_SYMBOL("=~", "match"), + OPERATOR_SYMBOL(">=", "ge"), + OPERATOR_SYMBOL(">>", "rshift"), + OPERATOR_SYMBOL("[]", "aref"), + OPERATOR_SYMBOL("||", "oror"), + OPERATOR_SYMBOL("<=>", "cmp"), + OPERATOR_SYMBOL("===", "eqq"), + OPERATOR_SYMBOL("[]=", "aset"), +}; + static size_t get_irep_header_size(mrb_state *mrb) { @@ -888,6 +926,8 @@ mrb_dump_irep_cfunc(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *f return MRB_DUMP_WRITE_FAULT; } if (fprintf(fp, + "#include <mruby.h>\n" + "#include <mruby/proc.h>\n" "#ifdef __cplusplus\n" "extern const uint8_t %s[];\n" "#endif\n" @@ -960,26 +1000,132 @@ dump_pool(mrb_state *mrb, const mrb_pool_value *p, FILE *fp) return MRB_DUMP_OK; } -mrb_bool mrb_sym_static_p(mrb_state *mrb, mrb_sym sym); +static mrb_bool +sym_name_word_p(const char *name, mrb_int len) +{ + if (len == 0) return FALSE; + if (name[0] != '_' && !ISALPHA(name[0])) return FALSE; + for (int i = 1; i < len; i++) { + if (name[i] != '_' && !ISALNUM(name[i])) return FALSE; + } + return TRUE; +} + +static mrb_bool +sym_name_with_equal_p(const char *name, mrb_int len) +{ + return len >= 2 && name[len-1] == '=' && sym_name_word_p(name, len-1); +} + +static mrb_bool +sym_name_with_question_mark_p(const char *name, mrb_int len) +{ + return len >= 2 && name[len-1] == '?' && sym_name_word_p(name, len-1); +} + +static mrb_bool +sym_name_with_bang_p(const char *name, mrb_int len) +{ + return len >= 2 && name[len-1] == '!' && sym_name_word_p(name, len-1); +} + +static mrb_bool +sym_name_ivar_p(const char *name, mrb_int len) +{ + return len >= 2 && name[0] == '@' && sym_name_word_p(name+1, len-1); +} + +static mrb_bool +sym_name_cvar_p(const char *name, mrb_int len) +{ + return len >= 3 && name[0] == '@' && sym_name_ivar_p(name+1, len-1); +} + +const char * +sym_operator_p(const char *name, mrb_int len) +{ + mrb_sym start, idx; + mrb_sym table_size = sizeof(operator_table)/sizeof(struct operator_symbol); + int cmp; + const struct operator_symbol *op_sym; + for (start = 0; table_size != 0; table_size/=2) { + idx = start+table_size/2; + op_sym = &operator_table[idx]; + cmp = len-op_sym->sym_name_len; + if (cmp == 0) { + cmp = memcmp(name, op_sym->sym_name, len); + if (cmp == 0) return op_sym->name; + } + if (0 < cmp) { + start = ++idx; + --table_size; + } + } + return NULL; +} static int -dump_sym(mrb_state *mrb, mrb_sym sym, FILE *fp) +dump_sym(mrb_state *mrb, mrb_sym sym, const char *var_name, int idx, mrb_value init_syms_code, FILE *fp, mrb_bool *presymp) { - const char *name; if (sym == 0) return MRB_DUMP_INVALID_ARGUMENT; - name = mrb_sym_name(mrb, sym); - if (!name) { - fprintf(stderr, "undefined symbol (%d) - define presym\n", sym); + + mrb_int len; + const char *name = mrb_sym_name_len(mrb, sym, &len), *op_name; + if (!name) return MRB_DUMP_INVALID_ARGUMENT; + if (presymp) *presymp = TRUE; + if (sym_name_word_p(name, len)) { + fprintf(fp, "MRB_SYM(%s)", name); + } + else if (sym_name_with_equal_p(name, len)) { + fprintf(fp, "MRB_SYM_E(%.*s)", (int)(len-1), name); + } + else if (sym_name_with_question_mark_p(name, len)) { + fprintf(fp, "MRB_SYM_Q(%.*s)", (int)(len-1), name); + } + else if (sym_name_with_bang_p(name, len)) { + fprintf(fp, "MRB_SYM_B(%.*s)", (int)(len-1), name); } - if (!mrb_sym_static_p(mrb, sym)) { - fprintf(stderr, "no static symbol (%s) - define presym\n", name); + else if (sym_name_ivar_p(name, len)) { + fprintf(fp, "MRB_IVSYM(%s)", name+1); } - fprintf(fp, "%d /* %s */,", sym, name); + else if (sym_name_cvar_p(name, len)) { + fprintf(fp, "MRB_CVSYM(%s)", name+2); + } + else if ((op_name = sym_operator_p(name, len))) { + fprintf(fp, "MRB_OPSYM(%s)", op_name); + } + else { + mrb_assert(var_name); + char buf[32]; + mrb_str_cat_lit(mrb, init_syms_code, " "); + mrb_str_cat_cstr(mrb, init_syms_code, var_name); + snprintf(buf, sizeof(buf), "[%d] = ", idx); + mrb_str_cat_cstr(mrb, init_syms_code, buf); + mrb_str_cat_lit(mrb, init_syms_code, "mrb_intern_lit(mrb, \""); + mrb_str_cat_cstr(mrb, init_syms_code, mrb_sym_dump(mrb, sym)); + mrb_str_cat_lit(mrb, init_syms_code, "\");\n"); + *presymp = FALSE; + fputs("0", fp); + } + fputs(", ", fp); return MRB_DUMP_OK; } +static const char* +sym_var_name(mrb_state *mrb, const char *initname, const char *key, int n) +{ + char buf[32]; + mrb_value s = mrb_str_new_cstr(mrb, initname); + mrb_str_cat_lit(mrb, s, "_"); + mrb_str_cat_cstr(mrb, s, key); + mrb_str_cat_lit(mrb, s, "_"); + snprintf(buf, sizeof(buf), "%d", n); + mrb_str_cat_cstr(mrb, s, buf); + return RSTRING_PTR(s); +} + static int -dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *name, int n, int *mp) +dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *name, int n, mrb_value init_syms_code, int *mp) { int i, len; int max = *mp; @@ -988,7 +1134,7 @@ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, if (irep->reps) { for (i=0,len=irep->rlen; i<len; i++) { *mp += len; - if (dump_irep_struct(mrb, irep->reps[i], flags, fp, name, max+i, mp) != MRB_DUMP_OK) + if (dump_irep_struct(mrb, irep->reps[i], flags, fp, name, max+i, init_syms_code, mp) != MRB_DUMP_OK) return MRB_DUMP_INVALID_ARGUMENT; } fprintf(fp, "static const mrb_irep *%s_reps_%d[%d] = {\n", name, n, len); @@ -1009,12 +1155,19 @@ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, } /* dump syms */ if (irep->syms) { + int ai = mrb_gc_arena_save(mrb); + const char *var_name = sym_var_name(mrb, name, "syms", n); + mrb_bool all_presym = TRUE, presym; len=irep->slen; - fprintf(fp, "static const mrb_sym %s_syms_%d[%d] = {", name, n, len); + fprintf(fp, "mrb_DEFINE_SYMS_VAR(%s, %d, (", var_name, len); for (i=0; i<len; i++) { - dump_sym(mrb, irep->syms[i], fp); + dump_sym(mrb, irep->syms[i], var_name, i, init_syms_code, fp, &presym); + all_presym &= presym; } - fputs("};\n", fp); + fputs("), ", fp); + if (all_presym) fputs("const", fp); + fputs(");\n", fp); + mrb_gc_arena_restore(mrb, ai); } /* dump iseq */ len=irep->ilen+sizeof(struct mrb_irep_catch_handler)*irep->clen; @@ -1029,7 +1182,7 @@ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, len=irep->nlocals; fprintf(fp, "static const mrb_sym %s_lv_%d[%d] = {", name, n, len-1); for (i=0; i+1<len; i++) { - fprintf(fp, "%uU, ", irep->lv[i]); + dump_sym(mrb, irep->lv[i], NULL, 0, mrb_nil_value(), fp, NULL); } fputs("};\n", fp); } @@ -1070,20 +1223,28 @@ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, int mrb_dump_irep_cstruct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, const char *initname) { - int max = 1; - int n; - if (fp == NULL || initname == NULL || initname[0] == '\0') { return MRB_DUMP_INVALID_ARGUMENT; } if (fprintf(fp, "#include <mruby.h>\n" "#include <mruby/proc.h>\n\n") < 0) { return MRB_DUMP_WRITE_FAULT; } - n = dump_irep_struct(mrb, irep, flags, fp, initname, 0, &max); + fputs("#define mrb_BRACED(...) {__VA_ARGS__}\n", fp); + fputs("#define mrb_DEFINE_SYMS_VAR(name, len, syms, qualifier) \\\n", fp); + fputs(" static qualifier mrb_sym name[len] = mrb_BRACED syms\n", fp); + fputs("\n", fp); + mrb_value init_syms_code = mrb_str_new_capa(mrb, 0); + int max = 1; + int n = dump_irep_struct(mrb, irep, flags, fp, initname, 0, init_syms_code, &max); if (n != MRB_DUMP_OK) return n; fprintf(fp, "#ifdef __cplusplus\nextern const struct RProc %s[];\n#endif\n", initname); fprintf(fp, "const struct RProc %s[] = {{\n", initname); fprintf(fp, "NULL,NULL,MRB_TT_PROC,7,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname); + fputs("static void\n", fp); + fprintf(fp, "%s_init_syms(mrb_state *mrb)\n", initname); + fputs("{\n", fp); + fputs(RSTRING_PTR(init_syms_code), fp); + fputs("}\n", fp); return MRB_DUMP_OK; } diff --git a/src/fmt_fp.c b/src/fmt_fp.c index c46baabbc..448c20df8 100644 --- a/src/fmt_fp.c +++ b/src/fmt_fp.c @@ -443,7 +443,6 @@ mrb_float_to_cstr(mrb_state *mrb, char *buf, size_t len, const char *fmt, mrb_fl return (int)(cstr.buf - buf); } #else /* MRB_NO_STDIO || _WIN32 || _WIN64 */ -#include <mruby.h> #include <stdio.h> MRB_API mrb_value @@ -1614,11 +1614,6 @@ mrb_objspace_page_slot_size(void) return sizeof(RVALUE); } -#ifdef GC_TEST -#ifdef GC_DEBUG -static mrb_value gc_test(mrb_state *, mrb_value); -#endif -#endif void mrb_init_gc(mrb_state *mrb) @@ -1639,9 +1634,4 @@ mrb_init_gc(mrb_state *mrb) mrb_define_class_method(mrb, gc, "step_ratio=", gc_step_ratio_set, MRB_ARGS_REQ(1)); mrb_define_class_method(mrb, gc, "generational_mode=", gc_generational_mode_set, MRB_ARGS_REQ(1)); mrb_define_class_method(mrb, gc, "generational_mode", gc_generational_mode_get, MRB_ARGS_NONE()); -#ifdef GC_TEST -#ifdef GC_DEBUG - mrb_define_class_method(mrb, gc, "test", gc_test, MRB_ARGS_NONE()); -#endif -#endif } diff --git a/src/hash.c b/src/hash.c index b800a251a..fe14865cf 100644 --- a/src/hash.c +++ b/src/hash.c @@ -251,7 +251,6 @@ HT_ASSERT_SAFE_READ(ea_capa); } while (0) #define U32(v) ((uint32_t)(v)) -#define U64(v) ((uint64_t)(v)) #define h_ar_p(h) (!h_ht_p(h)) #define h_ar_on(h) h_ht_off(h) #define lesser(a, b) ((a) < (b) ? (a) : (b)) @@ -360,7 +359,13 @@ ea_next_capa_for(uint32_t size, uint32_t max_capa) return AR_DEFAULT_CAPA; } else { - uint64_t capa = U64(size) * EA_INCREASE_RATIO, inc = capa - size; + /* + * For 32-bit CPU, the theoretical value of max EA capa is + * `UINT32_MAX / sizeof (hash_entry)`. At this time, if + * `EA_INCREASE_RATIO` is the current value, 32-bit range will not be + * exceeded during the calculation of `capa`, so `size_t` is used. + */ + size_t capa = size * EA_INCREASE_RATIO, inc = capa - size; if (EA_MAX_INCREASE < inc) capa = size + EA_MAX_INCREASE; return capa <= max_capa ? U32(capa) : max_capa; } @@ -621,10 +626,13 @@ ib_it_next(index_buckets_iter *it) * \ `-- bit_pos(34) * `-- bit(5) */ - uint64_t bit_pos; - bit_pos = U64(it->bit) * (it->pos + 1) - 1; - it->ary_index = U32(bit_pos / IB_TYPE_BIT); - it->shift2 = U32((U64(it->ary_index) + 1) * IB_TYPE_BIT - bit_pos - 1); + + /* Slide to handle as `capa == 32` to avoid 64-bit operations */ + uint32_t slid_pos = it->pos & (IB_TYPE_BIT - 1); + uint32_t slid_bit_pos = it->bit * (slid_pos + 1) - 1; + uint32_t slid_ary_index = slid_bit_pos / IB_TYPE_BIT; + it->ary_index = slid_ary_index + it->pos / IB_TYPE_BIT * it->bit; + it->shift2 = (slid_ary_index + 1) * IB_TYPE_BIT - slid_bit_pos - 1; it->ea_index = (ht_ib(it->h)[it->ary_index] >> it->shift2) & it->mask; if (IB_TYPE_BIT - it->bit < it->shift2) { it->shift1 = IB_TYPE_BIT - it->shift2; @@ -707,7 +715,9 @@ ib_bit_for(uint32_t size) static uint32_t ib_byte_size_for(uint32_t ib_bit) { - uint64_t ary_size = (U64(1) << ib_bit) * ib_bit / IB_TYPE_BIT; + uint32_t ary_size = IB_INIT_BIT == 4 ? + ib_bit_to_capa(ib_bit) * 2 / IB_TYPE_BIT * ib_bit / 2 : + ib_bit_to_capa(ib_bit) / IB_TYPE_BIT * ib_bit; return U32(sizeof(uint32_t) * ary_size); } diff --git a/src/numeric.c b/src/numeric.c index 2eb5e0ff1..117f447e5 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -484,7 +484,12 @@ value_int64(mrb_state *mrb, mrb_value x) case MRB_TT_INTEGER: return (int64_t)mrb_integer(x); case MRB_TT_FLOAT: - return (int64_t)mrb_float(x); + { + double f = mrb_float(x); + + if ((mrb_float)INT64_MAX >= f && f >= (mrb_float)INT64_MIN) + return (int64_t)f; + } default: mrb_raise(mrb, E_TYPE_ERROR, "cannot convert to Integer"); break; @@ -496,17 +501,16 @@ value_int64(mrb_state *mrb, mrb_value x) static mrb_value int64_value(mrb_state *mrb, int64_t v) { - if (TYPED_FIXABLE(v,int64_t)) { - return mrb_fixnum_value((mrb_int)v); + if (!TYPED_FIXABLE(v,int64_t)) { + int_overflow(mrb, "bit operation"); } - return mrb_float_value(mrb, (mrb_float)v); + return mrb_fixnum_value((mrb_int)v); } static mrb_value flo_rev(mrb_state *mrb, mrb_value x) { - int64_t v1; - v1 = (int64_t)mrb_float(x); + int64_t v1 = value_int64(mrb, x); return int64_value(mrb, ~v1); } @@ -516,7 +520,7 @@ flo_and(mrb_state *mrb, mrb_value x) mrb_value y = mrb_get_arg1(mrb); int64_t v1, v2; - v1 = (int64_t)mrb_float(x); + v1 = value_int64(mrb, x); v2 = value_int64(mrb, y); return int64_value(mrb, v1 & v2); } @@ -527,7 +531,7 @@ flo_or(mrb_state *mrb, mrb_value x) mrb_value y = mrb_get_arg1(mrb); int64_t v1, v2; - v1 = (int64_t)mrb_float(x); + v1 = value_int64(mrb, x); v2 = value_int64(mrb, y); return int64_value(mrb, v1 | v2); } @@ -538,7 +542,7 @@ flo_xor(mrb_state *mrb, mrb_value x) mrb_value y = mrb_get_arg1(mrb); int64_t v1, v2; - v1 = (int64_t)mrb_float(x); + v1 = value_int64(mrb, x); v2 = value_int64(mrb, y); return int64_value(mrb, v1 ^ v2); } diff --git a/src/string.c b/src/string.c index 4d09c7eab..946dc8be1 100644 --- a/src/string.c +++ b/src/string.c @@ -1752,13 +1752,17 @@ mrb_str_hash(mrb_state *mrb, mrb_value str) struct RString *s = mrb_str_ptr(str); mrb_int len = RSTR_LEN(s); char *p = RSTR_PTR(s); - uint64_t key = 0; + uint32_t hash = 0; - while (len--) { - key = key*65599 + *p; - p++; + for(int i = 0; i < len; ++i) { + hash += p[i]; + hash += (hash << 10); + hash ^= (hash >> 6); } - return (uint32_t)(key + (key>>5)); + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; } /* 15.2.10.5.20 */ @@ -2216,7 +2220,7 @@ mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, i const char *pend = str + len; char sign = 1; int c; - uint64_t n = 0; + mrb_int n = 0; mrb_int val; #define conv_digit(c) \ @@ -2343,19 +2347,17 @@ mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, i if (c < 0 || c >= base) { break; } - n *= base; - n += c; - if (n > (uint64_t)MRB_INT_MAX + (sign ? 0 : 1)) { -#ifndef MRB_NO_FLOAT - if (base == 10) { - return mrb_float_value(mrb, mrb_str_to_dbl(mrb, mrb_str_new(mrb, str, len), badcheck)); - } - else -#endif - { - mrb_raisef(mrb, E_RANGE_ERROR, "string (%l) too big for integer", str, pend-str); + if (mrb_int_mul_overflow(n, base, &n)) goto overflow; + if (MRB_INT_MAX - c < n) { + if (sign == 0 && MRB_INT_MAX - n == c - 1) { + n = MRB_INT_MIN; + sign = 1; + break; } + overflow: + mrb_raisef(mrb, E_RANGE_ERROR, "string (%l) too big for integer", str, pend-str); } + n += c; } val = (mrb_int)n; if (badcheck) { diff --git a/src/symbol.c b/src/symbol.c index c78f41f63..58decc1f1 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -12,15 +12,19 @@ #include <mruby/dump.h> #include <mruby/class.h> -#undef MRB_PRESYM_MAX -#define MRB_PRESYM_NAMED(lit, num, type, name) {lit, sizeof(lit)-1}, -#define MRB_PRESYM_UNNAMED(lit, num) {lit, sizeof(lit)-1}, +#ifndef MRB_NO_PRESYM + +# undef MRB_PRESYM_MAX +# define MRB_PRESYM_NAMED(lit, num, type, name) {lit, sizeof(lit)-1}, +# define MRB_PRESYM_UNNAMED(lit, num) {lit, sizeof(lit)-1}, static const struct { const char *name; uint16_t len; } presym_table[] = { -#include <../build/presym.inc> +#ifndef MRB_PRESYM_SCANNING +# include <mruby/presym.inc> +#endif }; static mrb_sym @@ -51,6 +55,8 @@ presym_sym2name(mrb_sym sym, mrb_int *lenp) return presym_table[sym-1].name; } +#endif /* MRB_NO_PRESYM */ + /* ------------------------------------------------------ */ typedef struct symbol_name { mrb_bool lit : 1; @@ -147,9 +153,11 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) symbol_name *sname; uint8_t hash; +#ifndef MRB_NO_PRESYM /* presym */ i = presym_find(name, len); if (i > 0) return i<<SYMBOL_SHIFT; +#endif /* inline symbol */ i = sym_inline_pack(name, len); @@ -306,10 +314,12 @@ sym2name_len(mrb_state *mrb, mrb_sym sym, char *buf, mrb_int *lenp) if (SYMBOL_INLINE_P(sym)) return sym_inline_unpack(sym, buf, lenp); sym >>= SYMBOL_SHIFT; +#ifndef MRB_NO_PRESYM { const char *name = presym_sym2name(sym, lenp); if (name) return name; } +#endif sym -= MRB_PRESYM_MAX; if (sym == 0 || mrb->symidx < sym) { @@ -1134,7 +1134,7 @@ RETRY_TRY_BLOCK: } CASE(OP_LOADI32, BSS) { - SET_INT_VALUE(mrb, regs[a], (mrb_int)(((uint32_t)b<<16)+c)); + SET_INT_VALUE(mrb, regs[a], (int32_t)(((uint32_t)b<<16)+c)); NEXT; } @@ -2074,7 +2074,7 @@ RETRY_TRY_BLOCK: regs[irep->nlocals] = v; goto CHECKPOINT_LABEL_MAKE(RBREAK_TAG_STOP); } - if (c->prev->ci == c->prev->cibase) { + if (!c->vmexec && c->prev->ci == c->prev->cibase) { mrb_value exc = mrb_exc_new_lit(mrb, E_FIBER_ERROR, "double resume"); mrb_exc_set(mrb, exc); goto L_RAISE; @@ -2089,8 +2089,14 @@ RETRY_TRY_BLOCK: /* automatic yield at the end */ c->status = MRB_FIBER_TERMINATED; mrb->c = c->prev; - c->prev = NULL; mrb->c->status = MRB_FIBER_RUNNING; + c->prev = NULL; + if (c->vmexec) { + mrb_gc_arena_restore(mrb, ai); + c->vmexec = FALSE; + mrb->jmp = prev_jmp; + return v; + } ci = mrb->c->ci; } CHECKPOINT_RESTORE(RBREAK_TAG_RETURN) { diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake index 6f0b0ef6a..12e0d4602 100644 --- a/tasks/benchmark.rake +++ b/tasks/benchmark.rake @@ -50,7 +50,7 @@ end MRuby.each_target do |target| - next if target.name == 'host' + next if target.name == 'host' || target.internal? mruby_bin = "#{target.build_dir}/bin/mruby" bm_files.each do |bm_file| diff --git a/tasks/bin.rake b/tasks/bin.rake new file mode 100644 index 000000000..afef065a1 --- /dev/null +++ b/tasks/bin.rake @@ -0,0 +1,35 @@ +install_task = ->(src) do + dst = "#{MRuby::Build.install_dir}/#{File.basename(src)}" + file dst => src do + install_D src, dst + end + dst +end + +MRuby.each_target do |build| + if build.host? && build.mrbc_build && !build.gems["mruby-bin-mrbc"] + exe = build.exefile("#{build.mrbc_build.build_dir}/bin/mrbc") + build.products << install_task.(exe) + end + + build.bins.each do |bin| + exe = build.exefile("#{build.build_dir}/bin/#{bin}") + build.products << (build.host? ? install_task.(exe) : exe) + end + + linker_attrs = build.gems.map{|gem| gem.linker.run_attrs}.transpose + build.gems.each do |gem| + gem.bins.each do |bin| + exe = build.exefile("#{build.build_dir}/bin/#{bin}") + objs = Dir["#{gem.dir}/tools/#{bin}/*.{c,cpp,cxx,cc}"].map do |f| + build.objfile(f.pathmap("#{gem.build_dir}/tools/#{bin}/%n")) + end + + file exe => objs.concat(build.libraries) do |t| + build.linker.run t.name, t.prerequisites, *linker_attrs + end + + build.products << (build.host? ? install_task.(exe) : exe) + end + end +end diff --git a/tasks/core.rake b/tasks/core.rake index aca5faed8..a47722e8b 100644 --- a/tasks/core.rake +++ b/tasks/core.rake @@ -2,11 +2,10 @@ as_cxx_srcs = %w[vm error gc].map{|name| "#{MRUBY_ROOT}/src/#{name}.c"} MRuby.each_target do objs = Dir.glob("#{MRUBY_ROOT}/src/*.c").map do |src| - dst = src.pathmap("#{build_dir}/src/%n") if cxx_exception_enabled? && as_cxx_srcs.include?(src) - compile_as_cxx(src, "#{dst}.cxx") + compile_as_cxx(src) else - objfile(dst) + objfile(src.pathmap("#{build_dir}/src/%n")) end end self.libmruby_core_objs << objs diff --git a/tasks/libmruby.rake b/tasks/libmruby.rake index c73b25d3b..23cd992ff 100644 --- a/tasks/libmruby.rake +++ b/tasks/libmruby.rake @@ -3,6 +3,8 @@ MRuby.each_target do archiver.run t.name, t.prerequisites end + products << libmruby_core_static + next unless libmruby_enabled? file libmruby_static => libmruby_objs.flatten do |t| @@ -27,4 +29,6 @@ MRuby.each_target do f.puts "MRUBY_LIBMRUBY_PATH = #{libmruby_static}" end end + + products << libmruby_static end diff --git a/tasks/mrblib.rake b/tasks/mrblib.rake index a7f592593..5567515d6 100644 --- a/tasks/mrblib.rake +++ b/tasks/mrblib.rake @@ -2,13 +2,18 @@ MRuby.each_target do next unless libmruby_enabled? src = "#{build_dir}/mrblib/mrblib.c" - obj = objfile(src.ext) rbfiles = Dir["#{MRUBY_ROOT}/mrblib/*.rb"].sort! - self.libmruby_objs << obj + self.libmruby_objs << objfile(src.ext) - file obj => src file src => [mrbcfile, __FILE__, *rbfiles] do |t| + if presym_enabled? + cdump = true + suffix = "proc" + else + cdump = false + suffix = "irep" + end mkdir_p File.dirname(t.name) File.open(t.name, 'w') do |f| _pp "GEN", "mrblib/*.rb", "#{t.name.relative_path}" @@ -19,14 +24,17 @@ MRuby.each_target do f.puts %Q[ * This file was generated!] f.puts %Q[ * All manual changes will get lost.] f.puts %Q[ */] - mrbc.run f, rbfiles, 'mrblib_proc' - f.puts <<INIT_END -void -mrb_init_mrblib(mrb_state *mrb) -{ - mrb_load_proc(mrb, mrblib_proc); -} -INIT_END + unless presym_enabled? + f.puts %Q[#include <mruby.h>] + f.puts %Q[#include <mruby/irep.h>] + end + mrbc.run f, rbfiles, "mrblib_#{suffix}", cdump + f.puts %Q[void] + f.puts %Q[mrb_init_mrblib(mrb_state *mrb)] + f.puts %Q[{] + f.puts %Q[ mrblib_#{suffix}_init_syms(mrb);] if cdump + f.puts %Q[ mrb_load_#{suffix}(mrb, mrblib_#{suffix});] + f.puts %Q[}] end end end diff --git a/tasks/presym.rake b/tasks/presym.rake new file mode 100644 index 000000000..f3a076ac6 --- /dev/null +++ b/tasks/presym.rake @@ -0,0 +1,41 @@ +all_prerequisites = ->(task_name, prereqs) do + Rake::Task[task_name].prerequisites.each do |prereq_name| + next if prereqs[prereq_name] + prereqs[prereq_name] = true + all_prerequisites.(Rake::Task[prereq_name].name, prereqs) + end +end + +MRuby.each_target do |build| + gensym_task = task(:gensym) + next unless build.presym_enabled? + + presym = build.presym + + include_dir = "#{build.build_dir}/include" + build.compilers.each{|c| c.include_paths << include_dir} + build.gems.each{|gem| gem.compilers.each{|c| c.include_paths << include_dir}} + + prereqs = {} + pps = [] + mrbtest = "#{build.class.install_dir}/mrbtest" + mrbc_build_dir = "#{build.mrbc_build.build_dir}/" if build.mrbc_build + build.products.each do |product| + all_prerequisites.(product, prereqs) unless product == mrbtest + end + prereqs.each_key do |prereq| + next unless File.extname(prereq) == build.exts.object + next if mrbc_build_dir && prereq.start_with?(mrbc_build_dir) + pps << prereq.ext(build.exts.preprocessed) + end + + file presym.list_path => pps do + presyms = presym.scan(pps) + current_presyms = presym.read_list if File.exist?(presym.list_path) + update = presyms != current_presyms + presym.write_list(presyms) if update + presym.write_header(presyms) if update || !File.exist?(presym.header_path) + end + + gensym_task.enhance([presym.list_path]) +end diff --git a/tasks/toolchains/gcc.rake b/tasks/toolchains/gcc.rake index 316d2d9a1..8714e1854 100644 --- a/tasks/toolchains/gcc.rake +++ b/tasks/toolchains/gcc.rake @@ -3,6 +3,7 @@ MRuby::Toolchain.new(:gcc) do |conf, params| compiler_flags = %w(-g -O3 -Wall -Wundef) c_mandatory_flags = %w(-std=gnu99) cxx_invalid_flags = %w(-Werror-implicit-function-declaration) + compile_opt = '%{flags} -MMD -MF "%{outfile}.d" -o "%{outfile}" "%{infile}"' [conf.cc, conf.objc, conf.asm, conf.cxx].each do |compiler| if compiler == conf.cxx @@ -14,7 +15,8 @@ MRuby::Toolchain.new(:gcc) do |conf, params| end compiler.option_include_path = %q[-I"%s"] compiler.option_define = '-D%s' - compiler.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] + compiler.compile_options = "-c #{compile_opt}" + compiler.preprocess_options = "-E -P #{compile_opt}" compiler.cxx_compile_flag = '-x c++ -std=gnu++03' compiler.cxx_exception_flag = '-fexceptions' compiler.cxx_invalid_flags = c_mandatory_flags + cxx_invalid_flags diff --git a/tasks/toolchains/openwrt.rake b/tasks/toolchains/openwrt.rake index c376d96ec..d5763d8de 100644 --- a/tasks/toolchains/openwrt.rake +++ b/tasks/toolchains/openwrt.rake @@ -1,24 +1,19 @@ # usage of environmental variables to set the # cross compiling toolchain proper MRuby::Toolchain.new(:openwrt) do |conf| - [conf.cc, conf.objc, conf.asm].each do |cc| - cc.command = ENV['TARGET_CC'] - cc.flags = ENV['TARGET_CFLAGS'] - cc.include_paths = ["#{MRUBY_ROOT}/include"] + [conf.cc, conf.cxx, conf.objc, conf.asm].each do |cc| + if cc == conf.cxx + cc.command = ENV['TARGET_CXX'] + cc.flags = ENV['TARGET_CXXFLAGS'] + else + cc.command = ENV['TARGET_CC'] + cc.flags = ENV['TARGET_CFLAGS'] + end cc.option_include_path = %q[-I"%s"] cc.option_define = '-D%s' - cc.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] + cc.compile_options = %q[%{flags} -MMD -MF "%{outfile}.d" -o "%{outfile}" -c "%{infile}"] end - [conf.cxx].each do |cxx| - cxx.command = ENV['TARGET_CXX'] - cxx.flags = ENV['TARGET_CXXFLAGS'] - cxx.include_paths = ["#{MRUBY_ROOT}/include"] - cxx.option_include_path = %q[-I"%s"] - cxx.option_define = '-D%s' - cxx.compile_options = %q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"] - end - conf.linker do |linker| linker.command = ENV['TARGET_CC'] linker.flags = ENV['TARGET_LDFLAGS'] diff --git a/tasks/toolchains/visualcpp.rake b/tasks/toolchains/visualcpp.rake index 5094495e3..00e364082 100644 --- a/tasks/toolchains/visualcpp.rake +++ b/tasks/toolchains/visualcpp.rake @@ -1,25 +1,21 @@ MRuby::Toolchain.new(:visualcpp) do |conf, _params| - conf.cc do |cc| - cc.command = ENV['CC'] || 'cl.exe' - # C4013: implicit function declaration - cc.flags = [ENV['CFLAGS'] || %w(/c /nologo /W3 /we4013 /Zi /MD /O2 /D_CRT_SECURE_NO_WARNINGS)] - cc.defines = %w(MRB_STACK_EXTEND_DOUBLING) - cc.option_include_path = %q[/I"%s"] - cc.option_define = '/D%s' - cc.compile_options = %Q[%{flags} /Fo"%{outfile}" "%{infile}"] - cc.cxx_compile_flag = '/TP' - cc.cxx_exception_flag = '/EHs' - end - - conf.cxx do |cxx| - cxx.command = ENV['CXX'] || 'cl.exe' - cxx.flags = [ENV['CXXFLAGS'] || ENV['CFLAGS'] || %w(/c /nologo /W3 /Zi /MD /O2 /EHs /D_CRT_SECURE_NO_WARNINGS)] - cxx.defines = %w(MRB_STACK_EXTEND_DOUBLING) - cxx.option_include_path = %q[/I"%s"] - cxx.option_define = '/D%s' - cxx.compile_options = %Q[%{flags} /Fo"%{outfile}" "%{infile}"] - cxx.cxx_compile_flag = '/TP' - cxx.cxx_exception_flag = '/EHs' + compiler_flags = %w(/nologo /W3 /MD /O2 /D_CRT_SECURE_NO_WARNINGS) + [conf.cc, conf.cxx].each do |compiler| + if compiler == conf.cc + compiler.command = ENV['CC'] || 'cl.exe' + # C4013: implicit function declaration + compiler.flags = [*(ENV['CFLAGS'] || compiler_flags + %w(/we4013))] + else + compiler.command = ENV['CXX'] || 'cl.exe' + compiler.flags = [*(ENV['CXXFLAGS'] || ENV['CFLAGS'] || compiler_flags + %w(/EHs))] + end + compiler.defines = %w(MRB_STACK_EXTEND_DOUBLING) + compiler.option_include_path = %q[/I"%s"] + compiler.option_define = '/D%s' + compiler.compile_options = %Q[/Zi /c /Fo"%{outfile}" %{flags} "%{infile}"] + compiler.preprocess_options = %Q[/EP %{flags} "%{infile}" > "%{outfile}"] + compiler.cxx_compile_flag = '/TP' + compiler.cxx_exception_flag = '/EHs' end conf.linker do |linker| diff --git a/test/bintest.rb b/test/bintest.rb index 4a3f161ba..a6888c9fb 100644 --- a/test/bintest.rb +++ b/test/bintest.rb @@ -4,7 +4,8 @@ require 'test/assert.rb' GEMNAME = "" def cmd(s) - path = "#{ENV['BUILD_DIR']}/bin/#{s}" + path = s == "mrbc" ? ENV['MRBCFILE'] : "#{ENV['BUILD_DIR']}/bin/#{s}" + path = path.sub(/\.exe\z/, "") if /mswin(?!ce)|mingw|bccwin/ =~ RbConfig::CONFIG['host_os'] path = "#{path}.exe".tr("/", "\\") end diff --git a/test/t/argumenterror.rb b/test/t/argumenterror.rb index abb53429b..3dcb29a4b 100644 --- a/test/t/argumenterror.rb +++ b/test/t/argumenterror.rb @@ -1,6 +1,13 @@ ## # ArgumentError ISO Test +def assert_argnum_error(given, expected, &block) + assert("wrong number of arguments") do + message = "wrong number of arguments (given #{given}, expected #{expected})" + assert_raise_with_message(ArgumentError, message, &block) + end +end + assert('ArgumentError', '15.2.24') do e2 = nil a = [] @@ -14,3 +21,12 @@ assert('ArgumentError', '15.2.24') do assert_equal(Class, ArgumentError.class) assert_equal(ArgumentError, e2.class) end + +assert("'wrong number of arguments' from mrb_get_args") do + assert_argnum_error(0, "1+"){__send__} + assert_argnum_error(0, 1..2){Object.const_defined?} + assert_argnum_error(3, 1..2){Object.const_defined?(:A, true, 2)} + assert_argnum_error(2, 0..1){{}.default(1, 2)} + assert_argnum_error(1, 2){Object.const_set(:B)} + assert_argnum_error(3, 2){Object.const_set(:C, 1, 2)} +end diff --git a/test/t/literals.rb b/test/t/literals.rb index 6344219aa..b7b07cd9d 100644 --- a/test/t/literals.rb +++ b/test/t/literals.rb @@ -162,6 +162,47 @@ qq QQ2 "o") + r = <<~RRR + rrr + rrr + RRR + s = <<~"SSS" + sss + sss + SSS + t = <<~'TTT' + ttt + ttt + TTT + u = [<<~UUU1 , <<~"UUU2" , <<~'UUU3' ] + u#{1}u + UUU1 + u#{2}u + UUU2 + u#{3}u + UUU3 + v1 = <<~VVV + + vvv + #{"vvv"} + VVV + v2 = <<~VVV +\tvvv + vvv + VVV + v3 = <<~VVV + v v v + vvv + VVV + v4 = <<~VVV + vvv \ + vvv + VVV + v5 = <<~VVV + vvv \ + vvv + VVV + w = %W( 1 #{<<WWW} 3 www WWW @@ -197,6 +238,15 @@ ZZZ assert_equal [1, "nn1\n", 3, 4], n assert_equal "a $ q\n $ c $ d", q1 assert_equal "l $ mqq\nn $ o", q2 + assert_equal "rrr\n rrr\n", r + assert_equal "sss\n sss\n", s + assert_equal "ttt\n ttt\n", t + assert_equal ["u1u\n", "u2u\n", "u\#{3}u\n"], u + assert_equal "\nvvv\nvvv\n", v1 + assert_equal "\tvvv\n vvv\n", v2 + assert_equal "v v v\n vvv\n", v3 + assert_equal "vvv vvv\n", v4 + assert_equal " vvv vvv\n", v5 assert_equal ["1", "www\n", "3", "4", "5"], w assert_equal [1, "foo 222 333\n 444\n5\n bar\n6\n", 9], x assert_equal "", z |
