From 69bc477b434b6d1ac990178ca0e3cfbbf28b90d9 Mon Sep 17 00:00:00 2001 From: Rory OConnell <19547+RoryO@users.noreply.github.com> Date: Tue, 19 May 2020 01:07:49 -0700 Subject: Adding warnings for mrb_load functions leaking RProc objects --- include/mruby/compile.h | 10 +++++++++- include/mruby/irep.h | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 69dfd1d50..5e73e66a6 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -180,7 +180,15 @@ MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*); MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c); -/* program load functions */ +/** program load functions +* Please note! Currently due to interactions with the GC calling these functions will +* leak one RProc object per function call. +* To prevent this save the current memory arena before calling and restore the arena +* right after, like so +* int ai = mrb_gc_arena_save(mrb); +* mrb_value status = mrb_load_string(mrb, buffer); +* mrb_gc_arena_restore(mrb, ai); +*/ #ifndef MRB_DISABLE_STDIO MRB_API mrb_value mrb_load_file(mrb_state*,FILE*); MRB_API mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt); diff --git a/include/mruby/irep.h b/include/mruby/irep.h index 4393129c7..661ef2b48 100644 --- a/include/mruby/irep.h +++ b/include/mruby/irep.h @@ -49,6 +49,16 @@ typedef struct mrb_irep { MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb); +/** load mruby bytecode functions +* Please note! Currently due to interactions with the GC calling these functions will +* leak one RProc object per function call. +* To prevent this save the current memory arena before calling and restore the arena +* right after, like so +* int ai = mrb_gc_arena_save(mrb); +* mrb_value status = mrb_load_irep(mrb, buffer); +* mrb_gc_arena_restore(mrb, ai); +*/ + /* @param [const uint8_t*] irep code, expected as a literal */ MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*); -- cgit v1.2.3