From fdbfeaf533fd75143f5d3af3ec6c585b9da746c4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 1 May 2020 07:40:38 +0900 Subject: Build process updated: You have to specify `TARGET` to specify a configuration, e.g. ``` rake TARGET=host-debug all test ``` When you port `mruby` to a new configuration: 1. copy an existing configuration under `target` directory 2. modify the new configuration file 3. build using the new configuration 4. send PR if you please --- lib/mruby/lockfile.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/mruby/lockfile.rb b/lib/mruby/lockfile.rb index 0d2455b4c..ee16e2ad8 100644 --- a/lib/mruby/lockfile.rb +++ b/lib/mruby/lockfile.rb @@ -26,7 +26,7 @@ module MRuby end def instance - @instance ||= new("#{MRUBY_CONFIG}.lock") + @instance ||= new("#{MRUBY_ROOT}/build/#{MRUBY_TARGET}.lock") end end -- cgit v1.2.3 From 9712379e0f9918f89ff741978f542dfd2dad3492 Mon Sep 17 00:00:00 2001 From: Takeshi Watanabe Date: Sat, 14 Dec 2019 00:39:54 +0900 Subject: Start GitHub Actions; close #4903 --- .github/workflows/build.yml | 31 ++++++++++++++++++++++++------- lib/mruby/build.rb | 8 ++++++++ target/travis.rb | 18 ++++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 335c0cdf6..2f8b69da7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: Ubuntu-1604: runs-on: ubuntu-16.04 env: - MRUBY_CONFIG: travis_config.rb + MRUBY_TARGET: travis steps: - uses: actions/checkout@v1 - name: apt @@ -19,7 +19,7 @@ jobs: Ubuntu-1804-gcc: runs-on: ubuntu-18.04 env: - MRUBY_CONFIG: travis_config.rb + MRUBY_TARGET: travis CC: gcc CXX: g++ steps: @@ -34,7 +34,7 @@ jobs: Ubuntu-1804-clang: runs-on: ubuntu-18.04 env: - MRUBY_CONFIG: travis_config.rb + MRUBY_TARGET: travis CC: clang CXX: clang++ steps: @@ -49,7 +49,7 @@ jobs: macOS: runs-on: macos-latest env: - MRUBY_CONFIG: travis_config.rb + MRUBY_TARGET: travis steps: - uses: actions/checkout@v1 - name: brew @@ -68,7 +68,7 @@ jobs: - name: build run: rake -E 'STDOUT.sync=true' test env: - MRUBY_CONFIG: travis_config.rb + MRUBY_TARGET: travis CFLAGS: -g -O1 -Wall -Wundef Windows-Cygwin: @@ -94,9 +94,26 @@ jobs: shell: cmd run: C:\tools\cygwin\bin\ruby.exe /usr/bin/rake -E 'STDOUT.sync=true' -m env: - MRUBY_CONFIG: travis_config.rb + MRUBY_TARGET: travis - name: test shell: cmd run: C:\tools\cygwin\bin\ruby.exe /usr/bin/rake -E 'STDOUT.sync=true' test env: - MRUBY_CONFIG: travis_config.rb + MRUBY_TARGET: travis + + Windows-VC: + runs-on: windows-latest + steps: + - uses: actions/checkout@v1 + - name: chocolatey + run: choco install -y ruby gperf + - name: build and test + shell: cmd + run: | + call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + rake -E "STDOUT.sync=true" -m -j4 -v test + env: + MRUBY_TARGET: appveyor + # TODO(take-cheeze): Re-enable /O2 + CFLAGS: "/c /nologo /W3 /we4013 /Zi /MD /D_CRT_SECURE_NO_WARNINGS" + CXXFLAGS: "/c /nologo /W3 /Zi /MD /EHs /D_CRT_SECURE_NO_WARNINGS" diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index 9ba136cf3..78465fee6 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -276,6 +276,14 @@ EOS end end + def cygwin_filename(name) + if name.is_a?(Array) + name.flatten.map { |n| cygwin_filename(n) } + else + `cygpath -w "#{filename(name)}"`.strip + end + end + def exefile(name) if name.is_a?(Array) name.flatten.map { |n| exefile(n) } diff --git a/target/travis.rb b/target/travis.rb index f4bef0a52..6af9c98d2 100644 --- a/target/travis.rb +++ b/target/travis.rb @@ -1,5 +1,21 @@ +MRuby::Build.new('debug') do |conf| + toolchain :gcc + yacc.command = ENV['YACC'] || 'bison' + enable_debug + + # include all core GEMs + conf.gembox 'full-core' + conf.cc.flags += %w(-Werror=declaration-after-statement) + conf.compilers.each do |c| + c.defines += %w(MRB_GC_STRESS MRB_GC_FIXED_ARENA MRB_METHOD_CACHE) + end + + build_mrbc_exec +end + MRuby::Build.new('full-debug') do |conf| toolchain :gcc + yacc.command = ENV['YACC'] || 'bison' enable_debug # include all core GEMs @@ -12,6 +28,7 @@ end MRuby::Build.new do |conf| toolchain :gcc + yacc.command = ENV['YACC'] || 'bison' # include all core GEMs conf.gembox 'full-core' @@ -25,6 +42,7 @@ end MRuby::Build.new('cxx_abi') do |conf| toolchain :gcc + yacc.command = ENV['YACC'] || 'bison' conf.gembox 'full-core' conf.cc.flags += %w(-fpermissive) -- cgit v1.2.3 From 1122124f9774210650f66cae2b6f2baa67aff581 Mon Sep 17 00:00:00 2001 From: KOBAYASHI Shuji Date: Tue, 26 May 2020 11:48:42 +0900 Subject: Revert part of "Start GitHub Actions" (4ce3997c) Because some changes have been overridden. --- lib/mruby/build.rb | 8 -------- target/travis.rb | 18 ------------------ 2 files changed, 26 deletions(-) (limited to 'lib') diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index 78465fee6..9ba136cf3 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -276,14 +276,6 @@ EOS end end - def cygwin_filename(name) - if name.is_a?(Array) - name.flatten.map { |n| cygwin_filename(n) } - else - `cygpath -w "#{filename(name)}"`.strip - end - end - def exefile(name) if name.is_a?(Array) name.flatten.map { |n| exefile(n) } diff --git a/target/travis.rb b/target/travis.rb index 6af9c98d2..f4bef0a52 100644 --- a/target/travis.rb +++ b/target/travis.rb @@ -1,21 +1,5 @@ -MRuby::Build.new('debug') do |conf| - toolchain :gcc - yacc.command = ENV['YACC'] || 'bison' - enable_debug - - # include all core GEMs - conf.gembox 'full-core' - conf.cc.flags += %w(-Werror=declaration-after-statement) - conf.compilers.each do |c| - c.defines += %w(MRB_GC_STRESS MRB_GC_FIXED_ARENA MRB_METHOD_CACHE) - end - - build_mrbc_exec -end - MRuby::Build.new('full-debug') do |conf| toolchain :gcc - yacc.command = ENV['YACC'] || 'bison' enable_debug # include all core GEMs @@ -28,7 +12,6 @@ end MRuby::Build.new do |conf| toolchain :gcc - yacc.command = ENV['YACC'] || 'bison' # include all core GEMs conf.gembox 'full-core' @@ -42,7 +25,6 @@ end MRuby::Build.new('cxx_abi') do |conf| toolchain :gcc - yacc.command = ENV['YACC'] || 'bison' conf.gembox 'full-core' conf.cc.flags += %w(-fpermissive) -- cgit v1.2.3 From 52507b1083ba1c562ae506d63a07a51a26815c21 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 11 Jun 2020 15:37:49 +0900 Subject: Generate C struct from `irep` instead of binary dump. --- Rakefile | 58 ++++++++---- include/mruby.h | 8 +- include/mruby/compile.h | 4 +- include/mruby/error.h | 4 +- include/mruby/proc.h | 7 +- lib/mruby/build/command.rb | 2 +- lib/mruby/gem.rb | 17 ++-- mrbgems/mruby-compiler/core/codegen.c | 2 +- mrbgems/mruby-compiler/core/parse.y | 4 +- mrbgems/mruby-compiler/core/y.tab.c | 4 +- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 1 + mrbgems/mruby-metaprog/src/metaprog.c | 7 +- mrbgems/mruby-socket/src/socket.c | 4 +- mrbgems/mruby-symbol-ext/test/symbol.rb | 6 +- mrbgems/mruby-test/driver.c | 4 +- mrbgems/mruby-test/mrbgem.rake | 14 +-- mrblib/init_mrblib.c | 11 --- mrblib/mrblib.rake | 17 +++- src/class.c | 3 + src/dump.c | 123 +++++++++----------------- src/gc.c | 11 ++- src/kernel.c | 4 +- src/load.c | 6 ++ src/proc.c | 4 +- src/symbol.c | 9 ++ src/variable.c | 12 +-- src/vm.c | 26 +++--- test/presym | 4 + 28 files changed, 201 insertions(+), 175 deletions(-) create mode 100644 test/presym (limited to 'lib') diff --git a/Rakefile b/Rakefile index 75ed5c905..2198b27fd 100644 --- a/Rakefile +++ b/Rakefile @@ -106,11 +106,17 @@ end mkdir_p "#{MRUBY_ROOT}/build" cfiles = (Dir.glob("#{MRUBY_ROOT}/src/*.c")+ - Dir.glob("#{MRUBY_ROOT}/mrbgems/*/{core,src}/*.c")+ - Dir.glob("#{MRUBY_ROOT}/build/*/mrbgems/**/{src,core}/*.c")).uniq -rbfiles = (Dir.glob("#{MRUBY_ROOT}/mrblib/*.rb")+ - Dir.glob("#{MRUBY_ROOT}/mrbgems/*/mrblib/*.rb")+ - Dir.glob("#{MRUBY_ROOT}/build/*/mrbgems/**/mrblib/*.rb")).uniq + Dir.glob("#{MRUBY_ROOT}/mrbgems/**/*.c")+ + Dir.glob("#{MRUBY_ROOT}/build/*/mrbgems/**/{src,test,core}/*.c")).uniq +rbfiles = (Dir.glob("#{MRUBY_ROOT}/{mrblib,test,test/t}/*.rb")+ + Dir.glob("#{MRUBY_ROOT}/mrbgems/*/{mrblib,test}/*.rb")+ + Dir.glob("#{MRUBY_ROOT}/build/*/mrbgems/**/{mrblib,test}/*.rb")).uniq +psfiles = Dir.glob("#{MRUBY_ROOT}/{mrblib,mrbgems,test}/**/presym") +symbols = [] +psfiles.each do |file| + symbols += File.readlines(file).grep_v(/^# /) +end +symbols.each{|x| x.chomp!} presym_file="#{MRUBY_ROOT}/build/presym" op_table = { "!" => "not", @@ -145,30 +151,42 @@ op_table = { "~" => "neg", } -file presym_file => cfiles+rbfiles+[__FILE__] do +file presym_file => cfiles+rbfiles+psfiles+[__FILE__] do csymbols = cfiles.map do |f| src = File.read(f) [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(/MRB_SYM\((\w+)\)/), src.scan(/MRB_QSYM\((\w+)\)/).map{|x,| - x.sub!(/_p$/, "?") || x.sub!(/_b$/, "!") || x.sub!(/_e$/, "=") || x.sub!(/^a_/, "@") || x.sub!(/^d_/, "$") + x.sub!(/_p$/, "?") || x.sub!(/_b$/, "!") || x.sub!(/_e$/, "=") || x.sub!(/^0_/, "@") || x.sub!(/^00_/, "@@") }.compact] end 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(/\bdef +(\w+[!?=]?)/), src.scan(/\balias +(\w+[!?]?)/), - src.scan(/\b([A-Z]\w+) *=/), - src.scan(/(@\w+)/), - src.scan(/:(\w+)/)] + src.scan(/\b([A-Z]\w*) *=[^=]/), + src.scan(/(\$[a-zA-Z_]\w*)/), + src.scan(/(\$[$!?]\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 = (csymbols+rbsymbols+op_table.keys).flatten.compact.uniq.sort + symbols = (symbols+csymbols+rbsymbols+op_table.keys).flatten.compact.uniq.sort.map{|x| x.gsub("\n", '\n')} presyms = File.readlines(presym_file) rescue [] presyms.each{|x| x.chomp!} if presyms != symbols @@ -182,10 +200,12 @@ file presym_inc => presym_file do presyms.each{|x| x.chomp!} File.open(presym_inc, "w") do |f| f.print "/* MRB_PRESYM_CSYM(sym, num) - symbol which is valid C id name */\n" - f.print "/* MRB_PRESYM_QSYM(sym, name, num) - symbol with alias name */\n" - f.print "/* MRB_PRESYM_SYM(sym, num) - symbol which is not valid C id */\n\n" + f.print "/* MRB_PRESYM_QSYM(name, sym, num) - symbol with alias name */\n" + f.print "/* MRB_PRESYM_SYM(name, num) - symbol which is not valid C id */\n" presyms.each.with_index do |sym,i| - if /\A\w+\Z/ =~ sym + if sym.bytes.detect{|x|x>0x80} || /\A\$/ =~ sym + f.print "MRB_PRESYM_SYM(\"#{sym}\", #{i+1})\n" + elsif /\A\w+\Z/ =~ sym f.print "MRB_PRESYM_CSYM(#{sym}, #{i+1})\n" elsif op_table.key?(sym) f.print "MRB_PRESYM_QSYM(\"#{sym}\", #{op_table[sym]}, #{i+1})\n" @@ -198,11 +218,11 @@ file presym_inc => presym_file do elsif /\=\Z/ =~ sym s = sym.dup; s[-1] = "_e" f.print "MRB_PRESYM_QSYM(\"#{sym}\", #{s}, #{i+1})\n" - elsif /\A@/ =~ sym - s = sym.dup; s[0] = "a_" + elsif /\A@@/ =~ sym + s = sym.dup; s[0,2] = "00_" f.print "MRB_PRESYM_QSYM(\"#{sym}\", #{s}, #{i+1})\n" - elsif /\A$/ =~ sym - s = sym.dup; s[0] = "d_" + elsif /\A@/ =~ sym + s = sym.dup; s[0] = "0_" f.print "MRB_PRESYM_QSYM(\"#{sym}\", #{s}, #{i+1})\n" else f.print "MRB_PRESYM_SYM(\"#{sym}\", #{i+1})\n" diff --git a/include/mruby.h b/include/mruby.h index 59188e6b5..27c428e85 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -147,7 +147,7 @@ typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud); typedef struct { mrb_sym mid; - struct RProc *proc; + const struct RProc *proc; mrb_value *stackent; uint16_t ridx; uint16_t epos; @@ -1202,9 +1202,9 @@ MRB_API void mrb_close(mrb_state *mrb); MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*); MRB_API mrb_value mrb_top_self(mrb_state *mrb); -MRB_API mrb_value mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep); -MRB_API mrb_value mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep); -MRB_API mrb_value mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *iseq); +MRB_API mrb_value mrb_top_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, unsigned int stack_keep); +MRB_API mrb_value mrb_vm_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, unsigned int stack_keep); +MRB_API mrb_value mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *iseq); /* compatibility macros */ #define mrb_toplevel_run_keep(m,p,k) mrb_top_run((m),(p),mrb_top_self(m),(k)) #define mrb_toplevel_run(m,p) mrb_toplevel_run_keep((m),(p),0) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index e8ab91eb9..36adf5a32 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -33,7 +33,7 @@ typedef struct mrbc_context { mrb_bool no_exec:1; mrb_bool keep_lv:1; mrb_bool no_optimize:1; - struct RProc *upper; + const struct RProc *upper; size_t parser_nerr; } mrbc_context; @@ -153,7 +153,7 @@ struct mrb_parser_state { mrb_bool no_optimize:1; mrb_bool capture_errors:1; - struct RProc *upper; + const struct RProc *upper; struct mrb_parser_message error_buffer[10]; struct mrb_parser_message warn_buffer[10]; diff --git a/include/mruby/error.h b/include/mruby/error.h index d24b5b0c3..72f6c5f3d 100644 --- a/include/mruby/error.h +++ b/include/mruby/error.h @@ -35,7 +35,7 @@ MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value); #if defined(MRB_64BIT) || defined(MRB_USE_FLOAT) || defined(MRB_NAN_BOXING) || defined(MRB_WORD_BOXING) struct RBreak { MRB_OBJECT_HEADER; - struct RProc *proc; + const struct RProc *proc; mrb_value val; }; #define mrb_break_value_get(brk) ((brk)->val) @@ -43,7 +43,7 @@ struct RBreak { #else struct RBreak { MRB_OBJECT_HEADER; - struct RProc *proc; + const struct RProc *proc; union mrb_value_union value; }; #define RBREAK_VALUE_TT_MASK ((1 << 8) - 1) diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 2d06210ef..fe0cf2eb0 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -44,7 +44,7 @@ struct RProc { const mrb_irep *irep; mrb_func_t func; } body; - struct RProc *upper; + const struct RProc *upper; union { struct RClass *target_class; struct REnv *env; @@ -93,9 +93,6 @@ MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int void mrb_proc_copy(struct RProc *a, struct RProc *b); mrb_int mrb_proc_arity(const struct RProc *p); -/* implementation of #send method */ -mrb_value mrb_f_send(mrb_state *mrb, mrb_value self); - /* following functions are defined in mruby-proc-ext so please include it when using */ MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv); MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); @@ -137,6 +134,8 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #include KHASH_DECLARE(mt, mrb_sym, mrb_method_t, TRUE) +MRB_API mrb_value mrb_load_proc(mrb_state *mrb, const struct RProc *proc); + MRB_END_DECL #endif /* MRUBY_PROC_H */ diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 84ce78cb9..39981cc32 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -310,7 +310,7 @@ module MRuby def initialize(build) super @command = nil - @compile_options = "-B%{funcname} -o-" + @compile_options = "-S -B%{funcname} -o-" end def run(out, infiles, funcname) diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb index 6fcaad9c1..d6b1a6851 100644 --- a/lib/mruby/gem.rb +++ b/lib/mruby/gem.rb @@ -174,7 +174,7 @@ module MRuby def generate_gem_init(fname) open(fname, 'w') do |f| print_gem_init_header f - build.mrbc.run f, rbfiles, "gem_mrblib_irep_#{funcname}" unless rbfiles.empty? + build.mrbc.run f, rbfiles, "gem_mrblib_#{funcname}_proc" unless rbfiles.empty? f.puts %Q[void mrb_#{funcname}_gem_init(mrb_state *mrb);] f.puts %Q[void mrb_#{funcname}_gem_final(mrb_state *mrb);] f.puts %Q[] @@ -183,7 +183,7 @@ module MRuby f.puts %Q[ struct REnv *e;] unless rbfiles.empty? f.puts %Q[ mrb_#{funcname}_gem_init(mrb);] if objs != [objfile("#{build_dir}/gem_init")] unless rbfiles.empty? - f.puts %Q[ mrb_load_irep(mrb, gem_mrblib_irep_#{funcname});] + f.puts %Q[ mrb_load_proc(mrb, gem_mrblib_#{funcname}_proc);] f.puts %Q[ if (mrb->exc) {] f.puts %Q[ mrb_print_error(mrb);] f.puts %Q[ mrb_close(mrb);] @@ -215,10 +215,13 @@ module MRuby def print_gem_init_header(f) print_gem_comment(f) - f.puts %Q[#include ] unless rbfiles.empty? - f.puts %Q[#include ] - f.puts %Q[#include ] unless rbfiles.empty? - f.puts %Q[#include ] unless rbfiles.empty? + unless rbfiles.empty? + f.puts %Q[#include ] + f.puts %Q[#include ] + f.puts %Q[#include ] + else + f.puts %Q[#include ] + end end def print_gem_test_header(f) @@ -226,7 +229,7 @@ module MRuby f.puts %Q[#include ] f.puts %Q[#include ] f.puts %Q[#include ] - f.puts %Q[#include ] + f.puts %Q[#include ] f.puts %Q[#include ] f.puts %Q[#include ] unless test_args.empty? end diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 0000e6dbe..5d29dcb2d 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -706,7 +706,7 @@ lv_idx(codegen_scope *s, mrb_sym id) static int search_upvar(codegen_scope *s, mrb_sym id, int *idx) { - struct RProc *u; + const struct RProc *u; int lv = 0; codegen_scope *up = s->prev; diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index cb4126713..c7c3d2a2f 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -265,7 +265,7 @@ local_unnest(parser_state *p) static mrb_bool local_var_p(parser_state *p, mrb_sym sym) { - struct RProc *u; + const struct RProc *u; node *l = p->locals; while (l) { @@ -282,7 +282,7 @@ local_var_p(parser_state *p, mrb_sym sym) const struct mrb_irep *ir = u->body.irep; uint_fast16_t n = ir->nlocals; const struct mrb_lvinfo *v = ir->lv; - for (; n > 1; n --, v ++) { + for (; v && n > 1; n--, v++) { if (v->name == sym) return TRUE; } if (MRB_PROC_SCOPE_P(u)) break; diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 504ec6d04..dbcc6a5bd 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -328,7 +328,7 @@ local_unnest(parser_state *p) static mrb_bool local_var_p(parser_state *p, mrb_sym sym) { - struct RProc *u; + const struct RProc *u; node *l = p->locals; while (l) { @@ -345,7 +345,7 @@ local_var_p(parser_state *p, mrb_sym sym) const struct mrb_irep *ir = u->body.irep; uint_fast16_t n = ir->nlocals; const struct mrb_lvinfo *v = ir->lv; - for (; n > 1; n --, v ++) { + for (; v && n > 1; n--, v++) { if (v->name == sym) return TRUE; } if (MRB_PROC_SCOPE_P(u)) break; diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 5a98dc964..f007b8553 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -130,6 +130,7 @@ class Enumerator @feedvalue = nil @stop_exc = false end + attr_accessor :obj, :meth, :args attr_reader :fib diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c index 8a4a6dc69..7a7639410 100644 --- a/mrbgems/mruby-metaprog/src/metaprog.c +++ b/mrbgems/mruby-metaprog/src/metaprog.c @@ -132,7 +132,7 @@ mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) static mrb_value mrb_local_variables(mrb_state *mrb, mrb_value self) { - struct RProc *proc; + const struct RProc *proc; const mrb_irep *irep; mrb_value vars; size_t i; @@ -664,7 +664,7 @@ mrb_mod_s_constants(mrb_state *mrb, mrb_value mod) static mrb_value mrb_mod_s_nesting(mrb_state *mrb, mrb_value mod) { - struct RProc *proc; + const struct RProc *proc; mrb_value ary; struct RClass *c = NULL; @@ -684,6 +684,9 @@ mrb_mod_s_nesting(mrb_state *mrb, mrb_value mod) return ary; } +/* implementation of #send method */ +mrb_value mrb_f_send(mrb_state *mrb, mrb_value self); + void mrb_mruby_metaprog_gem_init(mrb_state* mrb) { diff --git a/mrbgems/mruby-socket/src/socket.c b/mrbgems/mruby-socket/src/socket.c index f158959a7..001021b81 100644 --- a/mrbgems/mruby-socket/src/socket.c +++ b/mrbgems/mruby-socket/src/socket.c @@ -200,7 +200,7 @@ mrb_addrinfo_getnameinfo(mrb_state *mrb, mrb_value self) host = mrb_str_buf_new(mrb, NI_MAXHOST); serv = mrb_str_buf_new(mrb, NI_MAXSERV); - sastr = mrb_iv_get(mrb, self, MRB_QSYM(a_sockaddr)); + sastr = mrb_iv_get(mrb, self, MRB_QSYM(0_sockaddr)); if (!mrb_string_p(sastr)) { mrb_raise(mrb, E_SOCKET_ERROR, "invalid sockaddr"); } @@ -222,7 +222,7 @@ mrb_addrinfo_unix_path(mrb_state *mrb, mrb_value self) { mrb_value sastr; - sastr = mrb_iv_get(mrb, self, MRB_QSYM(a_sockaddr)); + sastr = mrb_iv_get(mrb, self, MRB_QSYM(0_sockaddr)); if (((struct sockaddr *)RSTRING_PTR(sastr))->sa_family != AF_UNIX) mrb_raise(mrb, E_SOCKET_ERROR, "need AF_UNIX address"); if (RSTRING_LEN(sastr) < (mrb_int)offsetof(struct sockaddr_un, sun_path) + 1) { diff --git a/mrbgems/mruby-symbol-ext/test/symbol.rb b/mrbgems/mruby-symbol-ext/test/symbol.rb index db686e5f4..34c3c6ba5 100644 --- a/mrbgems/mruby-symbol-ext/test/symbol.rb +++ b/mrbgems/mruby-symbol-ext/test/symbol.rb @@ -13,13 +13,13 @@ end %w[size length].each do |n| assert("Symbol##{n}") do assert_equal 5, :hello.__send__(n) - assert_equal 4, :"aA\0b".__send__(n) + assert_equal 4, :"aA b".__send__(n) if __ENCODING__ == "UTF-8" assert_equal 8, :"こんにちは世界!".__send__(n) - assert_equal 4, :"aあ\0b".__send__(n) + assert_equal 4, :"aあ b".__send__(n) else assert_equal 22, :"こんにちは世界!".__send__(n) - assert_equal 6, :"aあ\0b".__send__(n) + assert_equal 6, :"aあ b".__send__(n) end end end diff --git a/mrbgems/mruby-test/driver.c b/mrbgems/mruby-test/driver.c index a5f723927..fe1a475d5 100644 --- a/mrbgems/mruby-test/driver.c +++ b/mrbgems/mruby-test/driver.c @@ -18,7 +18,7 @@ #include #include -extern const uint8_t mrbtest_assert_irep[]; +extern const struct RProc mrbtest_assert_proc[]; void mrbgemtest_init(mrb_state* mrb); void mrb_init_test_vformat(mrb_state* mrb); @@ -300,7 +300,7 @@ main(int argc, char **argv) } mrb_init_test_driver(mrb, verbose); - mrb_load_irep(mrb, mrbtest_assert_irep); + mrb_load_proc(mrb, mrbtest_assert_proc); mrbgemtest_init(mrb); ret = eval_test(mrb); mrb_close(mrb); diff --git a/mrbgems/mruby-test/mrbgem.rake b/mrbgems/mruby-test/mrbgem.rake index ced252ae6..9e8e4041f 100644 --- a/mrbgems/mruby-test/mrbgem.rake +++ b/mrbgems/mruby-test/mrbgem.rake @@ -28,7 +28,7 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| file assert_c => [assert_rb, build.mrbcfile] do |t| mkdir_p File.dirname(t.name) open(t.name, 'w') do |f| - mrbc.run f, assert_rb, 'mrbtest_assert_irep' + mrbc.run f, assert_rb, 'mrbtest_assert_proc' end end @@ -56,12 +56,12 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| f.puts %Q[ * All manual changes will get lost.] f.puts %Q[ */] if test_preload.nil? - f.puts %Q[extern const uint8_t mrbtest_assert_irep[];] + f.puts %Q[extern const struct RProc mrbtest_assert_proc[];] else - g.build.mrbc.run f, test_preload, "gem_test_irep_#{g.funcname}_preload" + g.build.mrbc.run f, test_preload, "gem_test_#{g.funcname}_preload" end g.test_rbfiles.flatten.each_with_index do |rbfile, i| - g.build.mrbc.run f, rbfile, "gem_test_irep_#{g.funcname}_#{i}" + g.build.mrbc.run f, rbfile, "gem_test_#{g.funcname}_#{i}_proc" end f.puts %Q[void mrb_#{g.funcname}_gem_test(mrb_state *mrb);] unless g.test_objs.empty? dep_list.each do |d| @@ -90,9 +90,9 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| end f.puts %Q[ mrb_init_test_driver(mrb2, mrb_test(mrb_gv_get(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose"))));] if test_preload.nil? - f.puts %Q[ mrb_load_irep(mrb2, mrbtest_assert_irep);] + f.puts %Q[ mrb_load_proc(mrb2, mrbtest_assert_proc);] else - f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_preload);] + f.puts %Q[ mrb_load_proc(mrb2, gem_test_#{g.funcname}_preload);] end f.puts %Q[ if (mrb2->exc) {] f.puts %Q[ mrb_print_error(mrb2);] @@ -113,7 +113,7 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| f.puts %Q[ mrb_#{g.funcname}_gem_test(mrb2);] if g.custom_test_init? - f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_#{i});] + f.puts %Q[ mrb_load_proc(mrb2, gem_test_#{g.funcname}_#{i}_proc);] f.puts %Q[ ] f.puts %Q[ mrb_t_pass_result(mrb, mrb2);] diff --git a/mrblib/init_mrblib.c b/mrblib/init_mrblib.c index 4d4bcd25a..e69de29bb 100644 --- a/mrblib/init_mrblib.c +++ b/mrblib/init_mrblib.c @@ -1,11 +0,0 @@ -#include -#include - -extern const uint8_t mrblib_irep[]; - -void -mrb_init_mrblib(mrb_state *mrb) -{ - mrb_load_irep(mrb, mrblib_irep); -} - diff --git a/mrblib/mrblib.rake b/mrblib/mrblib.rake index 6fba0adc1..724d328fa 100644 --- a/mrblib/mrblib.rake +++ b/mrblib/mrblib.rake @@ -11,8 +11,21 @@ MRuby.each_target do mkdir_p File.dirname(t.name) open(t.name, 'w') do |f| _pp "GEN", "*.rb", "#{t.name.relative_path}" - f.puts File.read("#{current_dir}/init_mrblib.c") - mrbc.run f, rbfiles, 'mrblib_irep' + f.puts %Q[/*] + f.puts %Q[ * This file is loading the mrblib] + f.puts %Q[ *] + f.puts %Q[ * IMPORTANT:] + 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 <u.i64); break; case IREP_TT_FLOAT: - fprintf(fp, "{IREP_TT_FLOAT, {.f="MRB_FLOAT_FMT"}},\n", p->u.f); + if (p->u.f == 0) { + fprintf(fp, "{IREP_TT_FLOAT, {.f=%#.1f}},\n", p->u.f); + } + else { + fprintf(fp, "{IREP_TT_FLOAT, {.f="MRB_FLOAT_FMT"}},\n", p->u.f); + } break; } } @@ -951,83 +956,28 @@ dump_pool(mrb_state *mrb, const mrb_pool_value *p, FILE *fp) const char *s = p->u.str; fprintf(fp, "{IREP_TT_STR|(%d<<2), {.str=\"", len); for (i=0; i", "cmp"}, - {"==", "eq"}, - {"===", "eqq"}, - {"=~", "match"}, - {">", "gt"}, - {">=", "ge"}, - {">>", "rshift"}, - {"[]", "aref"}, - {"[]=", "aset"}, - {"^", "xor"}, - {"`", "tick"}, - {"|", "or"}, - {"||", "oror"}, - {"~", "neg"}, - {0}, -}; - +mrb_bool mrb_sym_static_p(mrb_state *mrb, mrb_sym sym); + static int dump_sym(mrb_state *mrb, mrb_sym sym, FILE *fp) { - mrb_int len; - const char *name = mrb_sym_name_len(mrb, sym, &len); - int i; - - if (len == 0 || len != strlen(name)) - return MRB_DUMP_INVALID_ARGUMENT; - for (i=0; op_table[i].op; i++) { - if (strcmp(name, op_table[i].op) == 0) { - fprintf(fp, "MRB_QSYM(%s),", op_table[i].name); - return MRB_DUMP_OK; - } - } - if (name[0] == '@') { - fprintf(fp, "MRB_QSYM(a_%s),", name+1); - } - else if (name[0] == '$') { - fprintf(fp, "MRB_QSYM(d_%s),", name+1); - } - else if (name[len-1] == '!') { - fprintf(fp, "MRB_QSYM(%.*s_b),", (int)len-1, name); - } - else if (name[len-1] == '?') { - fprintf(fp, "MRB_QSYM(%.*s_p),", (int)len-1, name); - } - else if (name[len-1] == '=') { - fprintf(fp, "MRB_QSYM(%.*s_e),", (int)len-1, name); + 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); } - else { - fprintf(fp, "MRB_SYM(%s),", name); + if (!mrb_sym_static_p(mrb, sym)) { + fprintf(stderr, "no static symbol (%s) - define presym\n", name); } + fprintf(fp, "%d /* %s */,", sym, name); return MRB_DUMP_OK; } @@ -1065,8 +1015,7 @@ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, len=irep->slen; fprintf(fp, "static const mrb_sym %s_syms_%d[%d] = {", name, n, len); for (i=0; isyms[i], fp) != MRB_DUMP_OK) - return MRB_DUMP_INVALID_ARGUMENT; + dump_sym(mrb, irep->syms[i], fp); } fputs("};\n", fp); } @@ -1078,13 +1027,17 @@ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, fprintf(fp, "0x%02x,", irep->iseq[i]); } fputs("};\n", fp); - /* dump irep */ - if (n == 0) { /* topleve irep */ - fprintf(fp, "static const mrb_irep %s = {\n", name); - } - else { - fprintf(fp, "static const mrb_irep %s_irep_%d = {\n", name, n); + /* dump lv */ + if (irep->lv) { + len=irep->nlocals; + fprintf(fp, "static const struct mrb_lvinfo %s_lv_%d[%d] = {", name, n, len); + for (i=0; i+1lv[i].name, irep->lv[i].r); + } + fputs("};\n", fp); } + /* dump irep */ + fprintf(fp, "static const mrb_irep %s_irep_%d = {\n", name, n); fprintf(fp, " %d,%d,\n", irep->nlocals, irep->nregs); fprintf(fp, " MRB_IREP_STATIC,%s_iseq_%d,\n", name, n); if (irep->pool) { @@ -1105,9 +1058,14 @@ dump_irep_struct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *fp, else { fputs( "NULL,\n", fp); } - fputs( " NULL,\t\t\t\t\t/* lv */\n", fp); + if (irep->lv) { + fprintf(fp, "%s_lv_%d,\n", name, n); + } + else { + fputs( " NULL,\t\t\t\t\t/* lv */\n", fp); + } fputs( " NULL,\t\t\t\t\t/* debug_info */\n", fp); - fprintf(fp, " %d,%d,%d,%d,0\n};", irep->ilen, irep->plen, irep->slen, irep->rlen); + fprintf(fp, " %d,%d,%d,%d,0\n};\n", irep->ilen, irep->plen, irep->slen, irep->rlen); return MRB_DUMP_OK; } @@ -1116,13 +1074,20 @@ 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 \n" "#include \n\n") < 0) { + if (fprintf(fp, "#include \n" "#include \n\n") < 0) { return MRB_DUMP_WRITE_FAULT; } - return dump_irep_struct(mrb, irep, flags, fp, initname, 0, &max); + n = dump_irep_struct(mrb, irep, flags, fp, initname, 0, &max); + if (n != MRB_DUMP_OK) return n; + fprintf(fp, "#ifdef __cplusplus\nextern struct RProc %s[];\n#endif\n", initname); + fprintf(fp, "struct RProc %s[] = {{\n", initname); + fprintf(fp, "NULL,NULL,MRB_TT_PROC,7,0,{&%s_irep_0},NULL,{NULL},\n}};\n", initname); + return MRB_DUMP_OK; } #endif /* MRB_DISABLE_STDIO */ diff --git a/src/gc.c b/src/gc.c index 897fa256f..4bee82364 100644 --- a/src/gc.c +++ b/src/gc.c @@ -35,6 +35,11 @@ * Gray - Marked, But the child objects are unmarked. * Black - Marked, the child objects are also marked. + Extra color + + * Red - Static (ROM object) no need to be collected. + - All child objects should be Red as well. + == Two White Types There're two white color types in a flip-flop fashion: White-A and White-B, @@ -185,6 +190,7 @@ gettimeofday_time(void) #define GC_WHITE_A 1 #define GC_WHITE_B (1 << 1) #define GC_BLACK (1 << 2) +#define GC_RED 7 #define GC_WHITES (GC_WHITE_A | GC_WHITE_B) #define GC_COLOR_MASK 7 @@ -194,7 +200,8 @@ gettimeofday_time(void) #define paint_partial_white(s, o) ((o)->color = (s)->current_white_part) #define is_gray(o) ((o)->color == GC_GRAY) #define is_white(o) ((o)->color & GC_WHITES) -#define is_black(o) ((o)->color & GC_BLACK) +#define is_black(o) ((o)->color == GC_BLACK) +#define is_red(o) ((o)->color == GC_RED) #define flip_white_part(s) ((s)->current_white_part = other_white_part(s)) #define other_white_part(s) ((s)->current_white_part ^ GC_WHITES) #define is_dead(s, o) (((o)->color & other_white_part(s) & GC_WHITES) || (o)->tt == MRB_TT_FREE) @@ -584,7 +591,7 @@ add_gray_list(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) static int ci_nregs(mrb_callinfo *ci) { - struct RProc *p = ci->proc; + const struct RProc *p = ci->proc; int n = 0; if (!p) { diff --git a/src/kernel.c b/src/kernel.c index 519052f4b..e4948143d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -19,7 +19,7 @@ mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func) { struct RClass *c = mrb_class(mrb, obj); mrb_method_t m = mrb_method_search_vm(mrb, &c, mid); - struct RProc *p; + const struct RProc *p; if (MRB_METHOD_UNDEF_P(m)) return FALSE; if (MRB_METHOD_FUNC_P(m)) @@ -143,7 +143,7 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self) mrb_value *bp; int bidx; struct REnv *e = NULL; - struct RProc *p; + const struct RProc *p; if (ci <= cibase) { /* toplevel does not have block */ diff --git a/src/load.c b/src/load.c index 39644c34b..31059e833 100644 --- a/src/load.c +++ b/src/load.c @@ -676,6 +676,12 @@ mrb_load_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize) return mrb_load_irep_buf_cxt(mrb, buf, bufsize, NULL); } +MRB_API mrb_value +mrb_load_proc(mrb_state *mrb, const struct RProc *proc) +{ + return mrb_vm_run(mrb, proc, mrb_top_self(mrb), 0); +} + #ifndef MRB_DISABLE_STDIO mrb_irep* diff --git a/src/proc.c b/src/proc.c index 2da2ec77e..14ba407d8 100644 --- a/src/proc.c +++ b/src/proc.c @@ -80,7 +80,7 @@ static void closure_setup(mrb_state *mrb, struct RProc *p) { mrb_callinfo *ci = mrb->c->ci; - struct RProc *up = p->upper; + const struct RProc *up = p->upper; struct REnv *e = NULL; if (ci && ci->env) { @@ -170,7 +170,7 @@ mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals) MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx) { - struct RProc *p = mrb->c->ci->proc; + const struct RProc *p = mrb->c->ci->proc; struct REnv *e; if (!p || !MRB_PROC_CFUNC_P(p)) { diff --git a/src/symbol.c b/src/symbol.c index 9981bad7c..3723335cd 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -330,6 +330,15 @@ mrb_sym_name_len(mrb_state *mrb, mrb_sym sym, mrb_int *lenp) return sym2name_len(mrb, sym, mrb->symbuf, lenp); } +mrb_bool +mrb_sym_static_p(mrb_state *mrb, mrb_sym sym) +{ + if (SYMBOL_INLINE_P(sym)) return TRUE; + sym >>= SYMBOL_NORMAL_SHIFT; + if (sym > MRB_PRESYM_MAX) return FALSE; + return TRUE; +} + void mrb_free_symtbl(mrb_state *mrb) { diff --git a/src/variable.c b/src/variable.c index 8fcbd6427..526d88c80 100644 --- a/src/variable.c +++ b/src/variable.c @@ -741,11 +741,11 @@ mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) { struct RClass *c; - struct RProc *p = mrb->c->ci->proc; + const struct RProc *p = mrb->c->ci->proc; for (;;) { c = MRB_PROC_TARGET_CLASS(p); - if (c->tt != MRB_TT_SCLASS) break; + if (c && c->tt != MRB_TT_SCLASS) break; p = p->upper; } return mrb_mod_cv_get(mrb, c, sym); @@ -755,11 +755,11 @@ void mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) { struct RClass *c; - struct RProc *p = mrb->c->ci->proc; + const struct RProc *p = mrb->c->ci->proc; for (;;) { c = MRB_PROC_TARGET_CLASS(p); - if (c->tt != MRB_TT_SCLASS) break; + if (c && c->tt != MRB_TT_SCLASS) break; p = p->upper; } mrb_mod_cv_set(mrb, c, sym, v); @@ -817,9 +817,10 @@ mrb_vm_const_get(mrb_state *mrb, mrb_sym sym) struct RClass *c; struct RClass *c2; mrb_value v; - struct RProc *proc; + const struct RProc *proc; c = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); + if (!c) c = mrb->object_class; if (iv_get(mrb, c->iv, sym, &v)) { return v; } @@ -862,6 +863,7 @@ mrb_vm_const_set(mrb_state *mrb, mrb_sym sym, mrb_value v) struct RClass *c; c = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); + if (!c) c = mrb->object_class; mrb_obj_iv_set(mrb, (struct RObject*)c, sym, v); } diff --git a/src/vm.c b/src/vm.c index c3fa12d3d..62805b7ed 100644 --- a/src/vm.c +++ b/src/vm.c @@ -224,7 +224,7 @@ mrb_stack_extend(mrb_state *mrb, mrb_int room) static inline struct REnv* uvenv(mrb_state *mrb, int up) { - struct RProc *proc = mrb->c->ci->proc; + const struct RProc *proc = mrb->c->ci->proc; struct REnv *e; while (up--) { @@ -247,8 +247,8 @@ uvenv(mrb_state *mrb, int up) return NULL; } -static inline struct RProc* -top_proc(mrb_state *mrb, struct RProc *proc) +static inline const struct RProc* +top_proc(mrb_state *mrb, const struct RProc *proc) { while (proc->upper) { if (MRB_PROC_SCOPE_P(proc) || MRB_PROC_STRICT_P(proc)) @@ -327,7 +327,7 @@ cipop(mrb_state *mrb) } void mrb_exc_set(mrb_state *mrb, mrb_value exc); -static mrb_value mrb_run(mrb_state *mrb, struct RProc* proc, mrb_value self); +static mrb_value mrb_run(mrb_state *mrb, const struct RProc* proc, mrb_value self); static void ecall(mrb_state *mrb) @@ -423,7 +423,7 @@ mrb_funcall_id(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, ...) static int ci_nregs(mrb_callinfo *ci) { - struct RProc *p; + const struct RProc *p; int n = 0; if (!ci) return 3; @@ -821,7 +821,7 @@ mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const } static struct RBreak* -break_new(mrb_state *mrb, struct RProc *p, mrb_value val) +break_new(mrb_state *mrb, const struct RProc *p, mrb_value val) { struct RBreak *brk; @@ -918,7 +918,7 @@ argnum_error(mrb_state *mrb, mrb_int num) #endif MRB_API mrb_value -mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) +mrb_vm_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, unsigned int stack_keep) { const mrb_irep *irep = proc->body.irep; mrb_value result; @@ -961,7 +961,7 @@ check_target_class(mrb_state *mrb) void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self); MRB_API mrb_value -mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *pc) +mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc) { /* mrb_assert(MRB_PROC_CFUNC_P(proc)) */ const mrb_code *pc0 = pc; @@ -1534,7 +1534,7 @@ RETRY_TRY_BLOCK: struct RClass *cls; mrb_callinfo *ci = mrb->c->ci; mrb_value recv, blk; - struct RProc *p = ci->proc; + const struct RProc *p = ci->proc; mrb_sym mid = ci->mid; struct RClass* target_class = MRB_PROC_TARGET_CLASS(p); @@ -1975,7 +1975,7 @@ RETRY_TRY_BLOCK: else { int acc; mrb_value v; - struct RProc *dst; + const struct RProc *dst; ci = mrb->c->ci; v = regs[a]; @@ -2612,6 +2612,7 @@ RETRY_TRY_BLOCK: super = regs[a+1]; if (mrb_nil_p(base)) { baseclass = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); + if (!baseclass) baseclass = mrb->object_class; base = mrb_obj_value(baseclass); } c = mrb_vm_define_class(mrb, base, super, id); @@ -2628,6 +2629,7 @@ RETRY_TRY_BLOCK: base = regs[a]; if (mrb_nil_p(base)) { baseclass = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc); + if (!baseclass) baseclass = mrb->object_class; base = mrb_obj_value(baseclass); } cls = mrb_vm_define_module(mrb, base, id); @@ -2782,7 +2784,7 @@ RETRY_TRY_BLOCK: } static mrb_value -mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) +mrb_run(mrb_state *mrb, const struct RProc *proc, mrb_value self) { if (mrb->c->ci->argc < 0) { return mrb_vm_run(mrb, proc, self, 3); /* receiver, args and block) */ @@ -2793,7 +2795,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } MRB_API mrb_value -mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) +mrb_top_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, unsigned int stack_keep) { mrb_value v; diff --git a/test/presym b/test/presym new file mode 100644 index 000000000..1e551143b --- /dev/null +++ b/test/presym @@ -0,0 +1,4 @@ +# List of symbols that cannot be detected by Rakefile +# Those symbols are not defined (to cause exceptions) +doesNotExistAsAMethodNameForVerySure +UnknownConstant -- cgit v1.2.3 From 84a68ca5aeb5fa29543fb23eeda717bcb8a131fe Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 4 Aug 2020 10:39:33 +0900 Subject: Make sure `bintest` only works with `host` target. --- lib/mruby/build.rb | 1 + target/boxing.rb | 3 --- target/host-debug.rb | 1 - target/travis.rb | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index 9ba136cf3..40fd0f9fe 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -196,6 +196,7 @@ EOS end def enable_bintest + raise "bintest works only on 'host' target" unless name == "host" @enable_bintest = true end diff --git a/target/boxing.rb b/target/boxing.rb index 19e6e64f8..6720a3b50 100644 --- a/target/boxing.rb +++ b/target/boxing.rb @@ -7,7 +7,6 @@ MRuby::Build.new('no_boxing') do |conf| conf.gembox 'default' conf.enable_test - conf.enable_bintest end MRuby::Build.new('word_boxing') do |conf| @@ -18,7 +17,6 @@ MRuby::Build.new('word_boxing') do |conf| c.defines += %w(MRB_WORD_BOXING) end conf.enable_test - conf.enable_bintest end MRuby::Build.new('nan_boxing') do |conf| @@ -29,6 +27,5 @@ MRuby::Build.new('nan_boxing') do |conf| c.defines += %w(MRB_NAN_BOXING) end conf.enable_test - conf.enable_bintest end diff --git a/target/host-debug.rb b/target/host-debug.rb index 4e89d162c..44eccacf6 100644 --- a/target/host-debug.rb +++ b/target/host-debug.rb @@ -20,5 +20,4 @@ MRuby::Build.new('host-debug') do |conf| conf.gem :core => "mruby-bin-debugger" # bintest - # conf.enable_bintest end diff --git a/target/travis.rb b/target/travis.rb index b8b04da18..58a739ce6 100644 --- a/target/travis.rb +++ b/target/travis.rb @@ -31,7 +31,6 @@ MRuby::Build.new('cxx_abi') do |conf| conf.compilers.each do |c| c.defines += %w(MRB_GC_FIXED_ARENA) end - conf.enable_bintest conf.enable_test enable_cxx_abi -- cgit v1.2.3 From 1520c97e172484af7cbd0f51512cd3ac0025e228 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sun, 16 Aug 2020 17:56:50 +0900 Subject: Add default `host` target for cross compiling. You don't have to define explicit `host` build target any more. --- lib/mruby/build.rb | 11 +++++++++++ target/ArduinoDue.rb | 16 ---------------- target/IntelGalileo.rb | 17 ----------------- target/RX630.rb | 16 ---------------- target/android_arm64-v8a.rb | 15 --------------- target/android_armeabi.rb | 15 --------------- target/android_armeabi_v7a_neon_hard.rb | 15 --------------- target/chipKITMax32.rb | 16 ---------------- target/cross-32bit.rb | 7 ++++--- target/dreamcast_shelf.rb | 14 -------------- 10 files changed, 15 insertions(+), 127 deletions(-) (limited to 'lib') diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index 40fd0f9fe..c101a237f 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -370,6 +370,17 @@ EOS attr_accessor :host_target, :build_target def initialize(name, build_dir=nil, &block) + unless MRuby.targets['host'] + # add minimal 'host' + MRuby::Build.new('host') do |conf| + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + toolchain :visualcpp + else + toolchain :gcc + end + conf.gem :core => 'mruby-bin-mrbc' + end + end @endian = nil @test_runner = Command::CrossTestRunner.new(self) super diff --git a/target/ArduinoDue.rb b/target/ArduinoDue.rb index 09646a700..5859f8508 100644 --- a/target/ArduinoDue.rb +++ b/target/ArduinoDue.rb @@ -1,19 +1,3 @@ -MRuby::Build.new do |conf| - - # Gets set by the VS command prompts. - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # include the default GEMs - conf.gembox 'default' - -end - # Cross Compiling configuration for Arduino Due # http://arduino.cc/en/Main/ArduinoBoardDue # diff --git a/target/IntelGalileo.rb b/target/IntelGalileo.rb index 42f39c456..e996efa5b 100644 --- a/target/IntelGalileo.rb +++ b/target/IntelGalileo.rb @@ -1,20 +1,3 @@ -MRuby::Build.new do |conf| - - # Gets set by the VS command prompts. - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # include the default GEMs - conf.gembox 'default' - -end - - # Cross Compiling configuration for Intel Galileo on Arduino environment # http://arduino.cc/en/ArduinoCertified/IntelGalileo # diff --git a/target/RX630.rb b/target/RX630.rb index 1b1f425c1..01c883958 100644 --- a/target/RX630.rb +++ b/target/RX630.rb @@ -1,19 +1,3 @@ -MRuby::Build.new do |conf| - - # Gets set by the VS command prompts. - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # include the default GEMs - conf.gembox 'default' - -end - # Cross Compiling configuration for RX630 # http://gadget.renesas.com/ # diff --git a/target/android_arm64-v8a.rb b/target/android_arm64-v8a.rb index 70b0f4b97..7fab2f063 100644 --- a/target/android_arm64-v8a.rb +++ b/target/android_arm64-v8a.rb @@ -1,18 +1,3 @@ -MRuby::Build.new do |conf| - - # Gets set by the VS command prompts. - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # include the default GEMs - conf.gembox 'default' -end - # Requires Android NDK r13 or later. MRuby::CrossBuild.new('android-arm64-v8a') do |conf| params = { diff --git a/target/android_armeabi.rb b/target/android_armeabi.rb index 17330242a..41a657c3b 100644 --- a/target/android_armeabi.rb +++ b/target/android_armeabi.rb @@ -1,18 +1,3 @@ -MRuby::Build.new do |conf| - - # Gets set by the VS command prompts. - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # include the default GEMs - conf.gembox 'default' -end - # Requires Android NDK r13 or later. MRuby::CrossBuild.new('android-armeabi') do |conf| params = { diff --git a/target/android_armeabi_v7a_neon_hard.rb b/target/android_armeabi_v7a_neon_hard.rb index 3788bba7f..6129b238e 100644 --- a/target/android_armeabi_v7a_neon_hard.rb +++ b/target/android_armeabi_v7a_neon_hard.rb @@ -1,18 +1,3 @@ -MRuby::Build.new do |conf| - - # Gets set by the VS command prompts. - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # include the default GEMs - conf.gembox 'default' -end - # Requires Android NDK r13 or later. MRuby::CrossBuild.new('android-armeabi-v7a-neon-hard') do |conf| params = { diff --git a/target/chipKITMax32.rb b/target/chipKITMax32.rb index 8617d8d10..bbee221f5 100644 --- a/target/chipKITMax32.rb +++ b/target/chipKITMax32.rb @@ -1,19 +1,3 @@ -MRuby::Build.new do |conf| - - # Gets set by the VS command prompts. - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # include the default GEMs - conf.gembox 'default' - -end - # Cross Compiling configuration for Digilent chipKIT Max32 # http://www.digilentinc.com/Products/Detail.cfm?Prod=CHIPKIT-MAX32 # diff --git a/target/cross-32bit.rb b/target/cross-32bit.rb index 310ffc833..82d5d023f 100644 --- a/target/cross-32bit.rb +++ b/target/cross-32bit.rb @@ -1,13 +1,14 @@ # Define cross build settings -MRuby::CrossBuild.new('32bit') do |conf| +MRuby::CrossBuild.new('cross-32bit') do |conf| toolchain :gcc conf.cc.flags << "-m32" conf.linker.flags << "-m32" - conf.build_mrbtest_lib_only + # conf.build_mrbtest_lib_only - conf.gem 'examples/mrbgems/c_and_ruby_extension_example' + conf.gem :core => "mruby-bin-mruby" + conf.gem "#{MRUBY_ROOT}/examples/mrbgems/c_and_ruby_extension_example" conf.test_runner.command = 'env' end diff --git a/target/dreamcast_shelf.rb b/target/dreamcast_shelf.rb index 85b2ff20d..3ae53184d 100644 --- a/target/dreamcast_shelf.rb +++ b/target/dreamcast_shelf.rb @@ -1,17 +1,3 @@ -MRuby::Build.new do |conf| - # Gets set by the VS command prompts - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end - - enable_debug - - # Include the default GEMs - conf.gembox 'default' -end - # Cross Compiling configuration for the Sega Dreamcast # This configuration requires KallistiOS (KOS) # https://dreamcast.wiki -- cgit v1.2.3 From c45674aff07045517cc4c4333457ea87b9f6a305 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 18 Aug 2020 17:05:08 +0900 Subject: Rename `mruby_version` in the lockfile to `mruby`; close #4658 --- lib/mruby/lockfile.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/mruby/lockfile.rb b/lib/mruby/lockfile.rb index ee16e2ad8..5d4313649 100644 --- a/lib/mruby/lockfile.rb +++ b/lib/mruby/lockfile.rb @@ -39,7 +39,7 @@ module MRuby end def write - locks = {"mruby_version" => mruby} + locks = {"mruby" => mruby} locks["builds"] = @builds if @builds File.write(@filename, YAML.dump(locks)) end -- cgit v1.2.3 From b7fe929232544120cb81615851b0315ec1a8b360 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 20 Aug 2020 15:11:10 +0900 Subject: Update `Rakefile`. So that you can omit `host` target. Now `host-debug` works. --- Rakefile | 20 ++++++++++++-------- lib/mruby/build.rb | 10 ++++++---- 2 files changed, 18 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/Rakefile b/Rakefile index 52b4c75c1..9a0a69ec6 100644 --- a/Rakefile +++ b/Rakefile @@ -52,15 +52,19 @@ task :default => :all bin_path = ENV['INSTALL_DIR'] || "#{MRUBY_ROOT}/bin" -depfiles = MRuby.targets['host'].bins.map do |bin| - install_path = MRuby.targets['host'].exefile("#{bin_path}/#{bin}") - source_path = MRuby.targets['host'].exefile("#{MRuby.targets['host'].build_dir}/bin/#{bin}") - - file install_path => source_path do |t| - install_D t.prerequisites.first, t.name +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 - - install_path +else + depfiles = [] end MRuby.each_target do |target| diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index c101a237f..3ad7f3c4c 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -247,9 +247,10 @@ EOS def mrbcfile return @mrbcfile if @mrbcfile - mrbc_build = MRuby.targets['host'] - gems.each { |v| mrbc_build = self if v.name == 'mruby-bin-mrbc' } - @mrbcfile = mrbc_build.exefile("#{mrbc_build.build_dir}/bin/mrbc") + unless gems.detect { |v| v.name == 'mruby-bin-mrbc' } + gem :core => "mruby-bin-mrbc" + end + @mrbcfile = self.exefile("#{self.build_dir}/bin/mrbc") end def compilers @@ -387,7 +388,8 @@ EOS end def mrbcfile - MRuby.targets['host'].exefile("#{MRuby.targets['host'].build_dir}/bin/mrbc") + host = MRuby.targets['host'] + host.exefile("#{host.build_dir}/bin/mrbc") end def run_test -- cgit v1.2.3 From 2bb84f1f1ae4bfca49bd92d8d0102a5773d3270f Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 26 Aug 2020 17:38:58 +0900 Subject: Update build process for both host and cross compile. --- lib/mruby/build.rb | 17 +++++++++-------- lib/mruby/build/load_gems.rb | 13 +++++++------ lib/mruby/gem.rb | 5 +++-- 3 files changed, 19 insertions(+), 16 deletions(-) (limited to 'lib') diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index 3ad7f3c4c..fa3853342 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -81,7 +81,8 @@ module MRuby @mrbc = Command::Mrbc.new(self) @bins = [] - @gems, @libmruby_objs = MRuby::Gem::List.new, [] + @gems = MRuby::Gem::List.new + @libmruby_objs = [] @build_mrbtest_lib_only = false @cxx_exception_enabled = false @cxx_exception_disabled = false @@ -95,11 +96,10 @@ module MRuby MRuby.targets[@name] = self end - MRuby::Build.current = MRuby.targets[@name] - MRuby.targets[@name].instance_eval(&block) - - build_mrbc_exec if name == 'host' - build_mrbtest if test_enabled? + current = MRuby.targets[@name] + MRuby::Build.current = current + current.instance_eval(&block) + current.build_mrbtest if current.test_enabled? end def debug_enabled? @@ -247,8 +247,9 @@ EOS def mrbcfile return @mrbcfile if @mrbcfile - unless gems.detect { |v| v.name == 'mruby-bin-mrbc' } - gem :core => "mruby-bin-mrbc" + unless gems.detect {|v| v.name == 'mruby-bin-mrbc' } + build_mrbc_exec + gems.detect {|v| v.name == 'mruby-bin-mrbc' }.setup end @mrbcfile = self.exefile("#{self.build_dir}/bin/mrbc") end diff --git a/lib/mruby/build/load_gems.rb b/lib/mruby/build/load_gems.rb index 522b8a17e..4f5bde7af 100644 --- a/lib/mruby/build/load_gems.rb +++ b/lib/mruby/build/load_gems.rb @@ -28,18 +28,19 @@ module MRuby Gem.current = nil load gemrake return nil unless Gem.current + current = Gem.current - Gem.current.dir = gemdir - Gem.current.build = self.is_a?(MRuby::Build) ? self : MRuby::Build.current - Gem.current.build_config_initializer = block - gems << Gem.current + current.dir = gemdir + current.build = self.is_a?(MRuby::Build) ? self : MRuby::Build.current + current.build_config_initializer = block + gems << current cxx_srcs = ['src', 'test', 'tools'].map do |subdir| - Dir.glob("#{Gem.current.dir}/#{subdir}/*.{cpp,cxx,cc}") + Dir.glob("#{current.dir}/#{subdir}/*.{cpp,cxx,cc}") end.flatten enable_cxx_exception unless cxx_srcs.empty? - Gem.current + current end def load_special_path_gem(params) diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb index d6b1a6851..d4b43b094 100644 --- a/lib/mruby/gem.rb +++ b/lib/mruby/gem.rb @@ -47,12 +47,14 @@ module MRuby @version = "0.0.0" @mrblib_dir = "mrblib" @objs_dir = "src" + @dependencies = [] + @conflicts = [] MRuby::Gem.current = self end def setup return if defined?(@linker) # return if already set up - + MRuby::Gem.current = self MRuby::Build::COMMANDS.each do |command| instance_variable_set("@#{command}", @build.send(command).clone) @@ -75,7 +77,6 @@ module MRuby @bins = [] @requirements = [] - @dependencies, @conflicts = [], [] @export_include_paths = [] @export_include_paths << "#{dir}/include" if File.directory? "#{dir}/include" -- cgit v1.2.3 From cfe8b0c81ddf1d221e4e1c6bb41d7e4c50d59fad Mon Sep 17 00:00:00 2001 From: Rory OConnell <19547+RoryO@users.noreply.github.com> Date: Sat, 29 Aug 2020 17:19:32 -0700 Subject: Add methods for asking about compiler features --- lib/mruby/build/command.rb | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'lib') diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 39981cc32..80c01b38f 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -1,4 +1,5 @@ require 'forwardable' +require 'tempfile' module MRuby class Command @@ -126,6 +127,31 @@ module MRuby end end + def compiles?(source_text) + infile = Tempfile.new ['', '.c'] + infile.write source_text + infile.close + cwd = Dir.pwd + is_success = false + # Change to a tmp dir when compiling so we don't litter compiler artifacts + Dir.mktmpdir do |tmpdir| + Dir.chdir tmpdir + sh(command, infile.path, verbose: false) { |retval, _| is_success = retval } + end + infile.delete + Dir.chdir cwd + + return is_success + end + + def has_header?(header_name) + compiles? test_code_template header: header_name + end + + def has_function?(function_name, with_header: nil) + compiles? test_code_template function: function_name, header: with_header + end + private # @@ -165,6 +191,46 @@ module MRuby end.flatten.uniq deps << MRUBY_CONFIG end + + def test_code_template(function: nil, header: nil) + preamble = '' + body = '' + + if header + preamble += <<-TEMPLATE +#if defined __has_include +#if !__has_include("#{header}") +#error "Header #{header} not found" +#endif +#endif +#include <#{header}> + TEMPLATE + end + + if function + preamble += <<-TEMPLATE +#if defined __stub_#{function} || defined __stub___#{function} +#{function} unavailable +#endif + TEMPLATE + + # This is how autoconf works when using a function prototype. + body += <<-TEMPLATE + void *a = (void*) &#{function}; + long long b = (long long) a; + return (int) b; + TEMPLATE + else + body = 'return 0;' + end + + <<-TEMPLATE +#{preamble} +int main(void) {{ +#{body} +}} + TEMPLATE + end end class Command::Linker < Command -- cgit v1.2.3 From 2b05cf48d05e8be79853458e881075b38c1171e3 Mon Sep 17 00:00:00 2001 From: Rory OConnell <19547+RoryO@users.noreply.github.com> Date: Sat, 29 Aug 2020 18:28:41 -0700 Subject: Work around removing tmp dir --- lib/mruby/build/command.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 80c01b38f..2aaa14239 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -134,13 +134,13 @@ module MRuby cwd = Dir.pwd is_success = false # Change to a tmp dir when compiling so we don't litter compiler artifacts - Dir.mktmpdir do |tmpdir| - Dir.chdir tmpdir - sh(command, infile.path, verbose: false) { |retval, _| is_success = retval } - end + tmpdir = Dir.mktmpdir + Dir.chdir tmpdir + sh(command, infile.path, verbose: false) { |retval, _| is_success = retval } infile.delete Dir.chdir cwd - + # Some systems strangely do not allow removing a temp dir after creation + FileUtils.remove_entry(tmpdir) rescue Errno::EACCES return is_success end -- cgit v1.2.3 From 5592c7413a22c605ae3acaa71c36947b43f78ac6 Mon Sep 17 00:00:00 2001 From: Rory OConnell <19547+RoryO@users.noreply.github.com> Date: Tue, 1 Sep 2020 16:15:45 -0700 Subject: Remove compiler feature detection --- lib/mruby/build/command.rb | 66 ---------------------------------------------- tasks/toolchains/gcc.rake | 2 -- 2 files changed, 68 deletions(-) (limited to 'lib') diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 2aaa14239..39981cc32 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -1,5 +1,4 @@ require 'forwardable' -require 'tempfile' module MRuby class Command @@ -127,31 +126,6 @@ module MRuby end end - def compiles?(source_text) - infile = Tempfile.new ['', '.c'] - infile.write source_text - infile.close - cwd = Dir.pwd - is_success = false - # Change to a tmp dir when compiling so we don't litter compiler artifacts - tmpdir = Dir.mktmpdir - Dir.chdir tmpdir - sh(command, infile.path, verbose: false) { |retval, _| is_success = retval } - infile.delete - Dir.chdir cwd - # Some systems strangely do not allow removing a temp dir after creation - FileUtils.remove_entry(tmpdir) rescue Errno::EACCES - return is_success - end - - def has_header?(header_name) - compiles? test_code_template header: header_name - end - - def has_function?(function_name, with_header: nil) - compiles? test_code_template function: function_name, header: with_header - end - private # @@ -191,46 +165,6 @@ module MRuby end.flatten.uniq deps << MRUBY_CONFIG end - - def test_code_template(function: nil, header: nil) - preamble = '' - body = '' - - if header - preamble += <<-TEMPLATE -#if defined __has_include -#if !__has_include("#{header}") -#error "Header #{header} not found" -#endif -#endif -#include <#{header}> - TEMPLATE - end - - if function - preamble += <<-TEMPLATE -#if defined __stub_#{function} || defined __stub___#{function} -#{function} unavailable -#endif - TEMPLATE - - # This is how autoconf works when using a function prototype. - body += <<-TEMPLATE - void *a = (void*) &#{function}; - long long b = (long long) a; - return (int) b; - TEMPLATE - else - body = 'return 0;' - end - - <<-TEMPLATE -#{preamble} -int main(void) {{ -#{body} -}} - TEMPLATE - end end class Command::Linker < Command diff --git a/tasks/toolchains/gcc.rake b/tasks/toolchains/gcc.rake index 3d55e6171..810f23b7a 100644 --- a/tasks/toolchains/gcc.rake +++ b/tasks/toolchains/gcc.rake @@ -31,8 +31,6 @@ MRuby::Toolchain.new(:gcc) do |conf, params| end [[conf.cc, 'c'], [conf.cxx, 'c++']].each do |cc, lang| - cc.defines += %w(HAS_MALLOC_TRIM) if cc.has_function? 'malloc_trim', with_header: 'malloc.h' - cc.instance_variable_set :@header_search_language, lang def cc.header_search_paths if @header_search_command != command -- cgit v1.2.3 From 5b40bb8d159c1432bb87973b2b5f42473dd0c623 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 14 Oct 2020 15:52:14 +0900 Subject: Avoid using C struct dump for test Ruby code. Files under `test/t` and `mrbgem/*/test` are for tests, not for actual execution. So symbols in those files need not to be pre-allocated. This change slightly reduce the memory consumption. --- Rakefile | 10 +++++----- lib/mruby/build/command.rb | 6 +++--- mrbgems/mruby-test/driver.c | 4 ++-- mrbgems/mruby-test/mrbgem.rake | 14 +++++++------- test/presym | 4 ---- 5 files changed, 17 insertions(+), 21 deletions(-) delete mode 100644 test/presym (limited to 'lib') diff --git a/Rakefile b/Rakefile index 1234daf66..5c5a6e8eb 100644 --- a/Rakefile +++ b/Rakefile @@ -108,14 +108,14 @@ mkdir_p "#{MRUBY_ROOT}/build" cfiles = ( Dir.glob("#{MRUBY_ROOT}/src/*.c")+ Dir.glob("#{MRUBY_ROOT}/mrbgems/**/*.c")+ - Dir.glob("#{MRUBY_ROOT}/build/repos/**/{src,test,core}/*.c") + Dir.glob("#{MRUBY_ROOT}/build/repos/**/{src,core}/*.c") ).uniq rbfiles = ( - Dir.glob("#{MRUBY_ROOT}/{mrblib,test,test/t}/**/*.rb")+ - Dir.glob("#{MRUBY_ROOT}/mrbgems/*/{mrblib,test}/**/*.rb")+ - Dir.glob("#{MRUBY_ROOT}/build/repos/**/{mrblib,test}/**/*.rb") + Dir.glob("#{MRUBY_ROOT}/mrblib/**/*.rb")+ + Dir.glob("#{MRUBY_ROOT}/mrbgems/*/mrblib/**/*.rb")+ + Dir.glob("#{MRUBY_ROOT}/build/repos/**/mrblib/**/*.rb") ).uniq -psfiles = Dir.glob("#{MRUBY_ROOT}/{mrblib,mrbgems,test,build/repos}/**/presym") +psfiles = Dir.glob("#{MRUBY_ROOT}/{mrblib,mrbgems,build/repos}/**/presym") symbols = [] psfiles.each do |file| symbols += File.readlines(file).grep_v(/^# /) diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 39981cc32..3d47c304f 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -310,16 +310,16 @@ module MRuby def initialize(build) super @command = nil - @compile_options = "-S -B%{funcname} -o-" + @compile_options = "-B%{funcname} -o-" end - def run(out, infiles, funcname) + def run(out, infiles, funcname, cdump = true) @command ||= @build.mrbcfile infiles = [infiles].flatten infiles.each do |f| _pp "MRBC", f.relative_path, nil, :indent => 2 end - cmd = %Q["#{filename @command}" #{@compile_options % {:funcname => funcname}} #{filename(infiles).map{|f| %Q["#{f}"]}.join(' ')}] + cmd = %Q["#{filename @command}" #{cdump ? "-S" : ""} #{@compile_options % {:funcname => funcname}} #{filename(infiles).map{|f| %Q["#{f}"]}.join(' ')}] puts cmd if Rake.verbose IO.popen(cmd, 'r+') do |io| out.puts io.read diff --git a/mrbgems/mruby-test/driver.c b/mrbgems/mruby-test/driver.c index 3bd52e175..f780e7e57 100644 --- a/mrbgems/mruby-test/driver.c +++ b/mrbgems/mruby-test/driver.c @@ -18,7 +18,7 @@ #include #include -extern const struct RProc mrbtest_assert_proc[]; +extern const uint8_t mrbtest_assert_irep[]; void mrbgemtest_init(mrb_state* mrb); void mrb_init_test_vformat(mrb_state* mrb); @@ -300,7 +300,7 @@ main(int argc, char **argv) } mrb_init_test_driver(mrb, verbose); - mrb_load_proc(mrb, mrbtest_assert_proc); + mrb_load_irep(mrb, mrbtest_assert_irep); mrbgemtest_init(mrb); ret = eval_test(mrb); mrb_close(mrb); diff --git a/mrbgems/mruby-test/mrbgem.rake b/mrbgems/mruby-test/mrbgem.rake index 9e8e4041f..0df683f7f 100644 --- a/mrbgems/mruby-test/mrbgem.rake +++ b/mrbgems/mruby-test/mrbgem.rake @@ -28,7 +28,7 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| file assert_c => [assert_rb, build.mrbcfile] do |t| mkdir_p File.dirname(t.name) open(t.name, 'w') do |f| - mrbc.run f, assert_rb, 'mrbtest_assert_proc' + mrbc.run f, assert_rb, 'mrbtest_assert_irep', false end end @@ -56,12 +56,12 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| f.puts %Q[ * All manual changes will get lost.] f.puts %Q[ */] if test_preload.nil? - f.puts %Q[extern const struct RProc mrbtest_assert_proc[];] + f.puts %Q[extern const uint8_t mrbtest_assert_irep[];] else - g.build.mrbc.run f, test_preload, "gem_test_#{g.funcname}_preload" + g.build.mrbc.run f, test_preload, "gem_test_irep_#{g.funcname}_preload", false end g.test_rbfiles.flatten.each_with_index do |rbfile, i| - g.build.mrbc.run f, rbfile, "gem_test_#{g.funcname}_#{i}_proc" + g.build.mrbc.run f, rbfile, "gem_test_irep_#{g.funcname}_#{i}", false end f.puts %Q[void mrb_#{g.funcname}_gem_test(mrb_state *mrb);] unless g.test_objs.empty? dep_list.each do |d| @@ -90,9 +90,9 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| end f.puts %Q[ mrb_init_test_driver(mrb2, mrb_test(mrb_gv_get(mrb, mrb_intern_lit(mrb, "$mrbtest_verbose"))));] if test_preload.nil? - f.puts %Q[ mrb_load_proc(mrb2, mrbtest_assert_proc);] + f.puts %Q[ mrb_load_irep(mrb2, mrbtest_assert_irep);] else - f.puts %Q[ mrb_load_proc(mrb2, gem_test_#{g.funcname}_preload);] + f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_preload);] end f.puts %Q[ if (mrb2->exc) {] f.puts %Q[ mrb_print_error(mrb2);] @@ -113,7 +113,7 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| f.puts %Q[ mrb_#{g.funcname}_gem_test(mrb2);] if g.custom_test_init? - f.puts %Q[ mrb_load_proc(mrb2, gem_test_#{g.funcname}_#{i}_proc);] + f.puts %Q[ mrb_load_irep(mrb2, gem_test_irep_#{g.funcname}_#{i});] f.puts %Q[ ] f.puts %Q[ mrb_t_pass_result(mrb, mrb2);] diff --git a/test/presym b/test/presym deleted file mode 100644 index 1e551143b..000000000 --- a/test/presym +++ /dev/null @@ -1,4 +0,0 @@ -# List of symbols that cannot be detected by Rakefile -# Those symbols are not defined (to cause exceptions) -doesNotExistAsAMethodNameForVerySure -UnknownConstant -- cgit v1.2.3