diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-29 17:21:24 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-29 22:52:29 +0900 |
| commit | a5d05ea8b712ffd51e9518a5604815f10e89bee7 (patch) | |
| tree | 7325a94a4908967225952d7e46a7ef0e92021d3e | |
| parent | 86981dafb12eec0aa43802c7a1995aad3b071772 (diff) | |
| download | mruby-a5d05ea8b712ffd51e9518a5604815f10e89bee7.tar.gz mruby-a5d05ea8b712ffd51e9518a5604815f10e89bee7.zip | |
Use `mrb` dump format for non core mrbgems by default.
If you confirm the gem is cdump safe, add `spec.enable_cdump` in
`mrbgem.rake` file. Some external gems e.g. `mruby-mgem-template` do
not work with cdump.
| -rw-r--r-- | lib/mruby/gem.rb | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb index 2605ab3e7..46ef1901e 100644 --- a/lib/mruby/gem.rb +++ b/lib/mruby/gem.rb @@ -81,6 +81,12 @@ module MRuby @generate_functions = !(@rbfiles.empty? && @objs.empty?) @objs << objfile("#{build_dir}/gem_init") if @generate_functions + root = MRUBY_ROOT + if @dir[0,root.size] == root + @cdump = true # OK to cdump core mrbgems + else + @cdump = false # use mrb dump by default + end if !name || !licenses || !authors fail "#{name || dir} required to set name, license(s) and author(s)" @@ -113,6 +119,10 @@ module MRuby return false end + def enable_cdump + @cdump = true + end + def add_dependency(name, *requirements) default_gem = requirements.last.kind_of?(Hash) ? requirements.pop : nil requirements = ['>= 0.0.0'] if requirements.empty? @@ -172,7 +182,13 @@ module MRuby def generate_gem_init(fname) open(fname, 'w') do |f| print_gem_init_header f - build.mrbc.run f, rbfiles, "gem_mrblib_#{funcname}_proc" unless rbfiles.empty? + unless rbfiles.empty? + if @cdump + build.mrbc.run f, rbfiles, "gem_mrblib_#{funcname}_proc" + else + build.mrbc.run f, rbfiles, "gem_mrblib_irep_#{funcname}", false + end + end 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[] @@ -181,7 +197,11 @@ 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_proc(mrb, gem_mrblib_#{funcname}_proc);] + 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});] + end f.puts %Q[ if (mrb->exc) {] f.puts %Q[ mrb_print_error(mrb);] f.puts %Q[ mrb_close(mrb);] |
