From 1a489aafafe8d22b697dc7d2f2949ec3a706cfa6 Mon Sep 17 00:00:00 2001 From: Jonas Kulla Date: Fri, 24 Oct 2014 18:29:08 +0200 Subject: [PATCH] Bindings: Fix inconsistency in Viewport dispose (RGSS1) As noted, on Viewport dispose, RMXP always calls the core dispose method for child objects regardless of whether user scripts override it in sub classes. Implement this behavior in mkxp to prevent infinite recursion. --- binding-mri/disposable-binding.h | 7 +++++-- binding-mruby/binding-util.cpp | 2 +- binding-mruby/binding-util.h | 2 +- binding-mruby/disposable-binding.h | 5 ++++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/binding-mri/disposable-binding.h b/binding-mri/disposable-binding.h index 7dfe9281..fa057a40 100644 --- a/binding-mri/disposable-binding.h +++ b/binding-mri/disposable-binding.h @@ -52,9 +52,8 @@ disposableDisposeChildren(VALUE disp) if (NIL_P(children)) return; - ID dispFun = rb_intern("dispose"); + ID dispFun = rb_intern("_mkxp_dispose_alias"); - /* Note: RMXP doesn't call overridden 'dispose' methods here */ for (long i = 0; i < RARRAY_LEN(children); ++i) rb_funcall2(rb_ary_entry(children, i), dispFun, 0, 0); } @@ -98,6 +97,10 @@ static void disposableBindingInit(VALUE klass) { _rb_define_method(klass, "dispose", disposableDispose); _rb_define_method(klass, "disposed?", disposableIsDisposed); + + /* Make sure we always have access to the original method, even + * if it is overridden by user scripts */ + rb_define_alias(klass, "_mkxp_dispose_alias", "dispose"); } template diff --git a/binding-mruby/binding-util.cpp b/binding-mruby/binding-util.cpp index 49c25634..c062eec2 100644 --- a/binding-mruby/binding-util.cpp +++ b/binding-mruby/binding-util.cpp @@ -55,7 +55,7 @@ struct SYMD(default_color), SYMD(default_out_color), SYMD(children), - SYMD(dispose) + SYMD(_mkxp_dispose_alias) }; static elementsN(symData); diff --git a/binding-mruby/binding-util.h b/binding-mruby/binding-util.h index 5dd5cd75..142a386b 100644 --- a/binding-mruby/binding-util.h +++ b/binding-mruby/binding-util.h @@ -56,7 +56,7 @@ enum CommonSymbol CSdefault_color, CSdefault_out_color, CSchildren, - CSdispose, + CS_mkxp_dispose_alias, CommonSymbolsMax }; diff --git a/binding-mruby/disposable-binding.h b/binding-mruby/disposable-binding.h index 9b1895ca..7cf80cb0 100644 --- a/binding-mruby/disposable-binding.h +++ b/binding-mruby/disposable-binding.h @@ -60,7 +60,7 @@ disposableDisposeChildren(mrb_state *mrb, mrb_value disp) for (mrb_int i = 0; i < RARRAY_LEN(children); ++i) mrb_funcall_argv(mrb, mrb_ary_entry(children, i), - mrbData->symbols[CSdispose], 0, 0); + mrbData->symbols[CS_mkxp_dispose_alias], 0, 0); } template @@ -99,6 +99,9 @@ static void disposableBindingInit(mrb_state *mrb, RClass *klass) { mrb_define_method(mrb, klass, "dispose", disposableDispose, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "disposed?", disposableIsDisposed, MRB_ARGS_NONE()); + + mrb_alias_method(mrb, klass, getMrbData(mrb)->symbols[CS_mkxp_dispose_alias], + mrb_intern_lit(mrb, "dispose")); } template