diff --git a/racket/src/racket/src/fun.c b/racket/src/racket/src/fun.c index 7de6aba075..5053cb3115 100644 --- a/racket/src/racket/src/fun.c +++ b/racket/src/racket/src/fun.c @@ -3750,7 +3750,20 @@ Scheme_Object *scheme_apply_chaperone(Scheme_Object *o, int argc, Scheme_Object /* communicate `self_proc` to the next layer: */ scheme_current_thread->self_for_proc_chaperone = self_proc; } - return _scheme_tail_apply(px->prev, argc, argv); + if (checks) { + /* cannot return a tail call */ + MZ_CONT_MARK_POS -= 2; + if (checks & 0x1) { + v = _scheme_apply(px->prev, argc, argv); + } else if (SAME_TYPE(SCHEME_TYPE(px->prev), scheme_native_closure_type)) { + v = _apply_native(px->prev, argc, argv); + } else { + v = _scheme_apply_multi(px->prev, argc, argv); + } + MZ_CONT_MARK_POS += 2; + return v; + } else + return _scheme_tail_apply(px->prev, argc, argv); } /* Ensure that the original procedure accepts `argc' arguments: */ diff --git a/racket/src/racket/src/schnapp.inc b/racket/src/racket/src/schnapp.inc index 31a4fc6d82..a3d585406d 100644 --- a/racket/src/racket/src/schnapp.inc +++ b/racket/src/racket/src/schnapp.inc @@ -62,8 +62,9 @@ Scheme_Object *PRIM_APPLY_NAME(Scheme_Object *rator, if (t == scheme_prim_type) { return PRIM_APPLY_NAME_FAST(rator, argc, argv); - } if ((t == scheme_proc_chaperone_type) - && SCHEME_MPAIRP(((Scheme_Chaperone *)rator)->redirects)) { + } else if ((t == scheme_proc_chaperone_type) + && SCHEME_VECTORP(((Scheme_Chaperone *)rator)->redirects) + && (SCHEME_VEC_SIZE(((Scheme_Chaperone *)rator)->redirects) & 0x1)) { return scheme_apply_chaperone(rator, argc, argv, NULL, PRIM_CHECK_MULTI | (PRIM_CHECK_VALUE << 1)); } }