Tail call optimization (close #437)
This commit is contained in:
1 parent
233e32208c
commit
4b7c701fdd
1 file changed
+14
-3
@@ -654,10 +654,21 @@ jv jq_next(jq_state *jq) {
|
|||||||
case CALL_JQ: {
|
case CALL_JQ: {
|
||||||
jv input = stack_pop(jq);
|
jv input = stack_pop(jq);
|
||||||
uint16_t nclosures = *pc++;
|
uint16_t nclosures = *pc++;
|
||||||
uint16_t* retaddr = pc + 2 + nclosures*2;
|
uint16_t* retaddr;
|
||||||
struct frame* new_frame = frame_push(jq, make_closure(jq, pc),
|
struct frame* new_frame;
|
||||||
pc + 2, nclosures);
|
struct closure cl = make_closure(jq, pc);
|
||||||
|
if (nclosures == 0 && *(pc + 2) == RET && frame_current(jq)->bc == cl.bc) {
|
||||||
|
// TCO
|
||||||
|
retaddr = frame_current(jq)->retaddr;
|
||||||
|
stack_ptr retdata = frame_current(jq)->retdata;
|
||||||
|
frame_pop(jq);
|
||||||
|
new_frame = frame_push(jq, cl, pc + 2, 0);
|
||||||
|
new_frame->retdata = retdata;
|
||||||
|
} else {
|
||||||
|
retaddr = pc + 2 + nclosures*2;
|
||||||
|
new_frame = frame_push(jq, cl, pc + 2, nclosures);
|
||||||
new_frame->retdata = jq->stk_top;
|
new_frame->retdata = jq->stk_top;
|
||||||
|
}
|
||||||
new_frame->retaddr = retaddr;
|
new_frame->retaddr = retaddr;
|
||||||
pc = new_frame->bc->code;
|
pc = new_frame->bc->code;
|
||||||
stack_push(jq, input);
|
stack_push(jq, input);
|
||||||
|
|||||||
Reference in new issue
Block a user