@@ -708,6 +708,11 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
708708cipop(mrb);
709709 }
710710else {
711+/* handle alias */
712+if (MRB_PROC_ALIAS_P(ci->proc)) {
713+ci->mid = ci->proc->body.mid;
714+ci->proc = ci->proc->upper;
715+ }
711716ci->cci = CINFO_SKIP;
712717val = mrb_run(mrb, ci->proc, self);
713718 }
@@ -739,7 +744,7 @@ check_method_noarg(mrb_state *mrb, const mrb_callinfo *ci)
739744}
740745741746static mrb_value
742-exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
747+exec_irep(mrb_state *mrb, mrb_value self, const struct RProc *p)
743748{
744749mrb_callinfo *ci = mrb->c->ci;
745750mrb_int keep, nregs;
@@ -869,18 +874,23 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
869874ci->n--;
870875 }
871876877+const struct RProc *p;
878+if (MRB_METHOD_PROC_P(m)) {
879+p = MRB_METHOD_PROC(m);
880+/* handle alias */
881+if (MRB_PROC_ALIAS_P(p)) {
882+ci->mid = p->body.mid;
883+p = p->upper;
884+ }
885+CI_PROC_SET(ci, p);
886+ }
872887if (MRB_METHOD_CFUNC_P(m)) {
873888if (MRB_METHOD_NOARG_P(m) && (ci->n > 0 || ci->nk > 0)) {
874889check_method_noarg(mrb, ci);
875890 }
876-877-if (MRB_METHOD_PROC_P(m)) {
878-const struct RProc *p = MRB_METHOD_PROC(m);
879-CI_PROC_SET(ci, p);
880- }
881891return MRB_METHOD_CFUNC(m)(mrb, self);
882892 }
883-return exec_irep(mrb, self, MRB_METHOD_PROC(m));
893+return exec_irep(mrb, self, p);
884894}
885895886896static void
@@ -1853,6 +1863,11 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)
18531863else {
18541864/* setup environment for calling method */
18551865proc = MRB_METHOD_PROC(m);
1866+/* handle alias */
1867+if (MRB_PROC_ALIAS_P(proc)) {
1868+ci->mid = proc->body.mid;
1869+proc = proc->upper;
1870+ }
18561871CI_PROC_SET(ci, proc);
18571872irep = proc->body.irep;
18581873pool = irep->pool;
@@ -1866,14 +1881,19 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)
18661881CASE(OP_CALL, Z) {
18671882mrb_callinfo *ci = mrb->c->ci;
18681883mrb_value recv = ci->stack[0];
1869-struct RProc *p = mrb_proc_ptr(recv);
1884+const struct RProc *p = mrb_proc_ptr(recv);
187018851886+/* handle alias */
1887+if (MRB_PROC_ALIAS_P(p)) {
1888+ci->mid = p->body.mid;
1889+p = p->upper;
1890+ }
1891+else if (MRB_PROC_ENV_P(p)) {
1892+ci->mid = MRB_PROC_ENV(p)->mid;
1893+ }
18711894/* replace callinfo */
18721895ci->u.target_class = MRB_PROC_TARGET_CLASS(p);
18731896CI_PROC_SET(ci, p);
1874-if (MRB_PROC_ENV_P(p)) {
1875-ci->mid = MRB_PROC_ENV(p)->mid;
1876- }
1877189718781898/* prepare stack */
18791899if (MRB_PROC_CFUNC_P(p)) {
@@ -1914,14 +1934,9 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)
19141934CASE(OP_SUPER, BB) {
19151935mrb_callinfo *ci = mrb->c->ci;
19161936mrb_value recv;
1917-const struct RProc *p = ci->proc;
19181937struct RClass* target_class = CI_TARGET_CLASS(ci);
1919193819201939mid = ci->mid;
1921-if (MRB_PROC_ALIAS_P(p) && MRB_PROC_ENV_P(p) && p->e.env->mid && p->e.env->mid != mid) { /* alias support */
1922-mid = p->e.env->mid; /* restore old mid */
1923- }
1924-19251940if (mid == 0 || !target_class) {
19261941RAISE_LIT(mrb, E_NOMETHOD_ERROR, "super called outside of method");
19271942 }