diff options
| author | KOBAYASHI Shuji <[email protected]> | 2021-02-14 11:55:53 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2021-02-14 11:55:53 +0900 |
| commit | a6a76d8fd2d7bb89c6034302bb416beb50ef5346 (patch) | |
| tree | eff2694cd146350690d1c47b6ac7f101f42af32b | |
| parent | c3ec5861ac4a94c78d6c0c3c510bc2b0451f5a7f (diff) | |
| download | mruby-a6a76d8fd2d7bb89c6034302bb416beb50ef5346.tar.gz mruby-a6a76d8fd2d7bb89c6034302bb416beb50ef5346.zip | |
Add `-s` option to `mrbc` for make variable static
| -rw-r--r-- | include/mruby/dump.h | 5 | ||||
| -rw-r--r-- | lib/mruby/build/command.rb | 7 | ||||
| -rw-r--r-- | lib/mruby/gem.rb | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c | 14 | ||||
| -rw-r--r-- | mrbgems/mruby-test/mrbgem.rake | 6 | ||||
| -rw-r--r-- | src/dump.c | 24 | ||||
| -rw-r--r-- | tasks/mrblib.rake | 2 |
7 files changed, 41 insertions, 22 deletions
diff --git a/include/mruby/dump.h b/include/mruby/dump.h index ed0c64b1a..3c48866d9 100644 --- a/include/mruby/dump.h +++ b/include/mruby/dump.h @@ -16,7 +16,10 @@ */ MRB_BEGIN_DECL -#define DUMP_DEBUG_INFO 1 +/* flags for mrb_dump_irep{,_binary,_cfunc,_cstruct} */ +#define MRB_DUMP_DEBUG_INFO 1 +#define MRB_DUMP_STATIC 2 +#define DUMP_DEBUG_INFO MRB_DUMP_DEBUG_INFO /* deprecated */ int mrb_dump_irep(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size); #ifndef MRB_NO_STDIO diff --git a/lib/mruby/build/command.rb b/lib/mruby/build/command.rb index 9d70ac086..dbe3763d9 100644 --- a/lib/mruby/build/command.rb +++ b/lib/mruby/build/command.rb @@ -328,13 +328,16 @@ module MRuby @compile_options = "-B%{funcname} -o-" end - def run(out, infiles, funcname, cdump = true) + def run(out, infiles, funcname, cdump: true, static: false) @command ||= @build.mrbcfile infiles = [infiles].flatten infiles.each_with_index do |f, i| _pp i == 0 ? "MRBC" : "", f.relative_path, indent: 2 end - cmd = %Q["#{filename @command}" #{cdump ? "-S" : ""} #{@compile_options % {:funcname => funcname}} #{filename(infiles).map{|f| %Q["#{f}"]}.join(' ')}] + opt = @compile_options % {funcname: funcname} + opt << " -S" if cdump + opt << " -s" if static + cmd = %["#{filename @command}" #{opt} #{filename(infiles).map{|f| %["#{f}"]}.join(' ')}] puts cmd if Rake.verbose IO.popen(cmd, 'r+') do |io| out.puts io.read diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb index 3a40fbbfc..716f21286 100644 --- a/lib/mruby/gem.rb +++ b/lib/mruby/gem.rb @@ -198,10 +198,11 @@ module MRuby open(fname, 'w') do |f| print_gem_init_header f unless rbfiles.empty? + opts = {cdump: cdump?, static: true} if cdump? - build.mrbc.run f, rbfiles, "gem_mrblib_#{funcname}_proc" + build.mrbc.run f, rbfiles, "gem_mrblib_#{funcname}_proc", **opts else - build.mrbc.run f, rbfiles, "gem_mrblib_irep_#{funcname}", false + build.mrbc.run f, rbfiles, "gem_mrblib_irep_#{funcname}", **opts end end f.puts %Q[void mrb_#{funcname}_gem_init(mrb_state *mrb);] diff --git a/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c b/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c index 31a4e6fa1..e17f32a2e 100644 --- a/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +++ b/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c @@ -14,17 +14,17 @@ #define C_EXT ".c" struct mrbc_args { - int argc; - char **argv; - int idx; const char *prog; const char *outfile; const char *initname; + char **argv; + int argc; + int idx; mrb_bool dump_struct : 1; mrb_bool check_syntax : 1; mrb_bool verbose : 1; mrb_bool remove_lv : 1; - unsigned int flags : 4; + uint8_t flags : 4; }; static void @@ -38,6 +38,7 @@ usage(const char *name) "-g produce debugging information", "-B<symbol> binary <symbol> output in C language format", "-S dump C struct (requires -B)", + "-s define <symbol> as static variable", "--remove-lv remove local variables", "--verbose run at verbose mode", "--version print the version", @@ -131,7 +132,10 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args) args->verbose = TRUE; break; case 'g': - args->flags |= DUMP_DEBUG_INFO; + args->flags |= MRB_DUMP_DEBUG_INFO; + break; + case 's': + args->flags |= MRB_DUMP_STATIC; break; case 'E': case 'e': diff --git a/mrbgems/mruby-test/mrbgem.rake b/mrbgems/mruby-test/mrbgem.rake index 421108e0b..927447b4f 100644 --- a/mrbgems/mruby-test/mrbgem.rake +++ b/mrbgems/mruby-test/mrbgem.rake @@ -20,7 +20,7 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| _pp "GEN", t.name.relative_path mkdir_p File.dirname(t.name) open(t.name, 'w') do |f| - mrbc.run f, assert_rb, 'mrbtest_assert_irep', false + mrbc.run f, assert_rb, 'mrbtest_assert_irep', cdump: false end end @@ -52,10 +52,10 @@ MRuby::Gem::Specification.new('mruby-test') do |spec| if test_preload.nil? f.puts %Q[extern const uint8_t mrbtest_assert_irep[];] else - g.build.mrbc.run f, test_preload, "gem_test_irep_#{g.funcname}_preload", false + g.build.mrbc.run f, test_preload, "gem_test_irep_#{g.funcname}_preload", cdump: false end g.test_rbfiles.flatten.each_with_index do |rbfile, i| - g.build.mrbc.run f, rbfile, "gem_test_irep_#{g.funcname}_#{i}", false + g.build.mrbc.run f, rbfile, "gem_test_irep_#{g.funcname}_#{i}", cdump: false, static: true end f.puts %Q[void mrb_#{g.funcname}_gem_test(mrb_state *mrb);] if g.custom_test_init? dep_list.each do |d| diff --git a/src/dump.c b/src/dump.c index 5173b88e5..e3f3320ea 100644 --- a/src/dump.c +++ b/src/dump.c @@ -806,7 +806,7 @@ dump_irep(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, uint8_t **bin, si section_irep_size += get_irep_record_size(mrb, irep); /* DEBUG section size */ - if (flags & DUMP_DEBUG_INFO) { + if (flags & MRB_DUMP_DEBUG_INFO) { if (debug_info_defined) { section_lineno_size += sizeof(struct rite_section_debug_header); /* filename table */ @@ -842,7 +842,7 @@ dump_irep(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, uint8_t **bin, si sizeof(struct rite_binary_footer); /* write DEBUG section */ - if (flags & DUMP_DEBUG_INFO) { + if (flags & MRB_DUMP_DEBUG_INFO) { if (debug_info_defined) { result = write_section_debug(mrb, irep, cur, filenames, filenames_len); if (result != MRB_DUMP_OK) { @@ -920,11 +920,13 @@ mrb_dump_irep_cfunc(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE *f return MRB_DUMP_WRITE_FAULT; } if (fprintf(fp, - "#ifdef __cplusplus\n" - "extern const uint8_t %s[];\n" - "#endif\n" + "%s\n" "const uint8_t %s[] = {", - initname, initname) < 0) { + (flags & MRB_DUMP_STATIC) ? "static" + : "#ifdef __cplusplus\n" + "extern\n" + "#endif", + initname) < 0) { mrb_free(mrb, bin); return MRB_DUMP_WRITE_FAULT; } @@ -1232,8 +1234,14 @@ mrb_dump_irep_cstruct(mrb_state *mrb, const mrb_irep *irep, uint8_t flags, FILE 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, + "%s\n" + "const struct RProc %s[] = {{\n", + (flags & MRB_DUMP_STATIC) ? "static" + : "#ifdef __cplusplus\n" + "extern\n" + "#endif", + initname); fprintf(fp, "NULL,NULL,MRB_TT_PROC,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); diff --git a/tasks/mrblib.rake b/tasks/mrblib.rake index 5567515d6..485375e55 100644 --- a/tasks/mrblib.rake +++ b/tasks/mrblib.rake @@ -28,7 +28,7 @@ MRuby.each_target do f.puts %Q[#include <mruby.h>] f.puts %Q[#include <mruby/irep.h>] end - mrbc.run f, rbfiles, "mrblib_#{suffix}", cdump + mrbc.run f, rbfiles, "mrblib_#{suffix}", cdump: cdump, static: true f.puts %Q[void] f.puts %Q[mrb_init_mrblib(mrb_state *mrb)] f.puts %Q[{] |
