Commit 310b0dce authored by Yuichiro MASUI's avatar Yuichiro MASUI

Added finalizer of mrbgems

parent cc2e4e73
...@@ -106,6 +106,21 @@ mrb_c_extension_example_gem_init(mrb_state* mrb) { ...@@ -106,6 +106,21 @@ mrb_c_extension_example_gem_init(mrb_state* mrb) {
} }
``` ```
### Finalize
mrbgems expects that you have implemented a C method called
```mrb_YOURGEMNAME_gem_final(mrb_state)```. ```YOURGEMNAME``` will be replaced
by the name of your GEM. If you call your GEM *c_extension_example*, your
finalizer method could look like this:
```
void
mrb_c_extension_example_gem_final(mrb_state* mrb) {
free(someone);
}
```
### Example ### Example
``` ```
......
...@@ -13,3 +13,8 @@ mrb_c_and_ruby_extension_example_gem_init(mrb_state* mrb) { ...@@ -13,3 +13,8 @@ mrb_c_and_ruby_extension_example_gem_init(mrb_state* mrb) {
struct RClass *class_cextension = mrb_define_module(mrb, "CRubyExtension"); struct RClass *class_cextension = mrb_define_module(mrb, "CRubyExtension");
mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, ARGS_NONE()); mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, ARGS_NONE());
} }
void
mrb_c_and_ruby_extension_example_gem_final(mrb_state* mrb) {
// finalizer
}
...@@ -13,3 +13,8 @@ mrb_c_extension_example_gem_init(mrb_state* mrb) { ...@@ -13,3 +13,8 @@ mrb_c_extension_example_gem_init(mrb_state* mrb) {
struct RClass *class_cextension = mrb_define_module(mrb, "CExtension"); struct RClass *class_cextension = mrb_define_module(mrb, "CExtension");
mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, ARGS_NONE()); mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, ARGS_NONE());
} }
void
mrb_c_extension_example_gem_final(mrb_state* mrb) {
// finalizer
}
...@@ -28,6 +28,7 @@ void mrb_init_time(mrb_state*); ...@@ -28,6 +28,7 @@ void mrb_init_time(mrb_state*);
void mrb_init_math(mrb_state*); void mrb_init_math(mrb_state*);
void mrb_init_mrblib(mrb_state*); void mrb_init_mrblib(mrb_state*);
void mrb_init_mrbgems(mrb_state*); void mrb_init_mrbgems(mrb_state*);
void mrb_final_mrbgems(mrb_state*);
#define DONE mrb_gc_arena_restore(mrb, 0); #define DONE mrb_gc_arena_restore(mrb, 0);
void void
...@@ -70,3 +71,11 @@ mrb_init_core(mrb_state *mrb) ...@@ -70,3 +71,11 @@ mrb_init_core(mrb_state *mrb)
mrb_init_mrbgems(mrb); DONE; mrb_init_mrbgems(mrb); DONE;
#endif #endif
} }
void
mrb_final_core(mrb_state *mrb)
{
#ifndef DISABLE_GEMS
mrb_final_mrbgems(mrb); DONE;
#endif
}
\ No newline at end of file
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
void mrb_init_heap(mrb_state*); void mrb_init_heap(mrb_state*);
void mrb_init_core(mrb_state*); void mrb_init_core(mrb_state*);
void mrb_init_ext(mrb_state*); void mrb_init_ext(mrb_state*);
void mrb_final_core(mrb_state*);
mrb_state* mrb_state*
mrb_open_allocf(mrb_allocf f, void *ud) mrb_open_allocf(mrb_allocf f, void *ud)
...@@ -88,6 +89,8 @@ mrb_close(mrb_state *mrb) ...@@ -88,6 +89,8 @@ mrb_close(mrb_state *mrb)
{ {
int i; int i;
mrb_final_core(mrb);
/* free */ /* free */
mrb_gc_free_gv(mrb); mrb_gc_free_gv(mrb);
mrb_free(mrb, mrb->stbase); mrb_free(mrb, mrb->stbase);
......
...@@ -105,6 +105,8 @@ module MRuby ...@@ -105,6 +105,8 @@ module MRuby
print_gem_init_header 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_irep_#{funcname}" unless rbfiles.empty?
f.puts %Q[void mrb_#{funcname}_gem_init(mrb_state *mrb);] 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[]
f.puts %Q[void GENERATED_TMP_mrb_#{funcname}_gem_init(mrb_state *mrb) {] 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[ int ai = mrb_gc_arena_save(mrb);]
f.puts %Q[ mrb_#{funcname}_gem_init(mrb);] if objs != [objfile("#{build_dir}/gem_init")] f.puts %Q[ mrb_#{funcname}_gem_init(mrb);] if objs != [objfile("#{build_dir}/gem_init")]
...@@ -117,6 +119,10 @@ module MRuby ...@@ -117,6 +119,10 @@ module MRuby
end end
f.puts %Q[ mrb_gc_arena_restore(mrb, ai);] f.puts %Q[ mrb_gc_arena_restore(mrb, ai);]
f.puts %Q[}] f.puts %Q[}]
f.puts %Q[]
f.puts %Q[void GENERATED_TMP_mrb_#{funcname}_gem_final(mrb_state *mrb) {]
f.puts %Q[ mrb_#{funcname}_gem_final(mrb);] if objs != [objfile("#{build_dir}/gem_init")]
f.puts %Q[}]
end end
end # generate_gem_init end # generate_gem_init
......
...@@ -24,10 +24,18 @@ MRuby.each_target do ...@@ -24,10 +24,18 @@ MRuby.each_target do
f.puts %Q[#include "mruby.h"] f.puts %Q[#include "mruby.h"]
f.puts %Q[] f.puts %Q[]
f.puts %Q[#{gems.map{|g| "void GENERATED_TMP_mrb_%s_gem_init(mrb_state* mrb);" % g.funcname}.join("\n")}] f.puts %Q[#{gems.map{|g| "void GENERATED_TMP_mrb_%s_gem_init(mrb_state* mrb);" % g.funcname}.join("\n")}]
f.puts %Q[]
f.puts %Q[#{gems.map{|g| "void GENERATED_TMP_mrb_%s_gem_final(mrb_state* mrb);" % g.funcname}.join("\n")}]
f.puts %Q[]
f.puts %Q[void] f.puts %Q[void]
f.puts %Q[mrb_init_mrbgems(mrb_state *mrb) {] f.puts %Q[mrb_init_mrbgems(mrb_state *mrb) {]
f.puts %Q[#{gems.map{|g| "GENERATED_TMP_mrb_%s_gem_init(mrb);" % g.funcname}.join("\n")}] f.puts %Q[#{gems.map{|g| "GENERATED_TMP_mrb_%s_gem_init(mrb);" % g.funcname}.join("\n")}]
f.puts %Q[}] f.puts %Q[}]
f.puts %Q[]
f.puts %Q[void]
f.puts %Q[mrb_final_mrbgems(mrb_state *mrb) {]
f.puts %Q[#{gems.map{|g| "GENERATED_TMP_mrb_%s_gem_final(mrb);" % g.funcname}.join("\n")}]
f.puts %Q[}]
end end
end end
end end
......
...@@ -231,4 +231,9 @@ void ...@@ -231,4 +231,9 @@ void
mrb_init_mrbgems(mrb_state *mrb) mrb_init_mrbgems(mrb_state *mrb)
{ {
} }
void
mrb_final_mrbgems(mrb_state *mrb)
{
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment