GitHub

@@ -708,6 +708,11 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc

708708

cipop(mrb);

709709

}

710710

else {

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+

}

711716

ci->cci = CINFO_SKIP;

712717

val = mrb_run(mrb, ci->proc, self);

713718

}

@@ -739,7 +744,7 @@ check_method_noarg(mrb_state *mrb, const mrb_callinfo *ci)

739744

}

740745741746

static 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

{

744749

mrb_callinfo *ci = mrb->c->ci;

745750

mrb_int keep, nregs;

@@ -869,18 +874,23 @@ mrb_f_send(mrb_state *mrb, mrb_value self)

869874

ci->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+

}

872887

if (MRB_METHOD_CFUNC_P(m)) {

873888

if (MRB_METHOD_NOARG_P(m) && (ci->n > 0 || ci->nk > 0)) {

874889

check_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-

}

881891

return 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

}

885895886896

static void

@@ -1853,6 +1863,11 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)

18531863

else {

18541864

/* setup environment for calling method */

18551865

proc = 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+

}

18561871

CI_PROC_SET(ci, proc);

18571872

irep = proc->body.irep;

18581873

pool = irep->pool;

@@ -1866,14 +1881,19 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)

18661881

CASE(OP_CALL, Z) {

18671882

mrb_callinfo *ci = mrb->c->ci;

18681883

mrb_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 */

18721895

ci->u.target_class = MRB_PROC_TARGET_CLASS(p);

18731896

CI_PROC_SET(ci, p);

1874-

if (MRB_PROC_ENV_P(p)) {

1875-

ci->mid = MRB_PROC_ENV(p)->mid;

1876-

}

1877189718781898

/* prepare stack */

18791899

if (MRB_PROC_CFUNC_P(p)) {

@@ -1914,14 +1934,9 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)

19141934

CASE(OP_SUPER, BB) {

19151935

mrb_callinfo *ci = mrb->c->ci;

19161936

mrb_value recv;

1917-

const struct RProc *p = ci->proc;

19181937

struct RClass* target_class = CI_TARGET_CLASS(ci);

1919193819201939

mid = 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-19251940

if (mid == 0 || !target_class) {

19261941

RAISE_LIT(mrb, E_NOMETHOD_ERROR, "super called outside of method");

19271942

}

Read the original on github.com ↗