diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 489b4c95e..f6cddf0e5 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -114,6 +114,8 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #define MRB_METHOD_PUBLIC_FL 0 #define MRB_METHOD_PRIVATE_FL 1 #define MRB_METHOD_PROTECTED_FL 2 +#define MRB_METHOD_VDEFAULT_FL 3 +#define MRB_METHOD_VISIBILITY_MASK 3 #define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL) #define MRB_METHOD_NOARG_P(m) (((m).flags&MRB_METHOD_NOARG_FL)?1:0) @@ -124,6 +126,8 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m)) #define MRB_METHOD_PROC(m) ((m).as.proc) #define MRB_METHOD_UNDEF_P(m) ((m).as.proc==NULL) +#define MRB_METHOD_VISIBILITY(m) ((m).flags & MRB_METHOD_VISIBILITY_MASK) +#define MRB_METHOD_SET_VISIBILITY(m,v) ((m).flags=(((m).flags&~MRB_METHOD_VISIBILITY_MASK)|(v))) #define MRB_METHOD_CFUNC_P(m) (MRB_METHOD_FUNC_P(m) || (MRB_METHOD_PROC(m)?(MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m))):FALSE)) /* use MRB_METHOD_CFUNC(m) only when MRB_METHOD_CFUNC_P(m) is true */ diff --git a/src/class.c b/src/class.c index e71fe6d4a..65b00c48d 100644 --- a/src/class.c +++ b/src/class.c @@ -34,7 +34,8 @@ union mt_ptr { #define MT_PUBLIC MRB_METHOD_PUBLIC_FL #define MT_PRIVATE MRB_METHOD_PRIVATE_FL #define MT_PROTECTED MRB_METHOD_PROTECTED_FL -#define MT_VMASK 3 +#define MT_VDEFAULT MRB_METHOD_VDEFAULT_FL +#define MT_VMASK MRB_METHOD_VISIBILITY_MASK #define MT_EMPTY 0 #define MT_DELETED 1 @@ -2302,12 +2303,14 @@ mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b) const struct RProc *p = MRB_METHOD_PROC(m); if (!MRB_PROC_CFUNC_P(p) && !MRB_PROC_ALIAS_P(p)) { struct RProc *pnew = MRB_OBJ_ALLOC(mrb, MRB_TT_PROC, mrb->proc_class); + int vis = MRB_METHOD_VISIBILITY(m); pnew->body.mid = b; pnew->upper = p; pnew->e.env = NULL; pnew->flags |= MRB_PROC_ALIAS; MRB_METHOD_FROM_PROC(m, pnew); + MRB_METHOD_SET_VISIBILITY(m,vis); } } mrb_define_method_raw(mrb, c, a, m);