don't cons in call-with-values
This commit is contained in:
+7
-4
@@ -289,16 +289,19 @@ static pic_value
|
||||
pic_cont_call_with_values(pic_state *pic)
|
||||
{
|
||||
struct pic_proc *producer, *consumer;
|
||||
size_t argc;
|
||||
pic_value args[256];
|
||||
|
||||
pic_get_args(pic, "ll", &producer, &consumer);
|
||||
|
||||
pic_apply(pic, producer, pic_nil_value());
|
||||
|
||||
argc = pic_receive(pic, 256, args);
|
||||
do {
|
||||
size_t argc = pic_receive(pic, 0, NULL);
|
||||
pic_value args[argc];
|
||||
|
||||
return pic_apply_trampoline(pic, consumer, pic_list_by_array(pic, argc, args));
|
||||
pic_receive(pic, argc, args);
|
||||
|
||||
return pic_apply_trampoline(pic, consumer, argc, args);
|
||||
} while (0);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -201,7 +201,8 @@ pic_value pic_apply2(pic_state *, struct pic_proc *, pic_value, pic_value);
|
||||
pic_value pic_apply3(pic_state *, struct pic_proc *, pic_value, pic_value, pic_value);
|
||||
pic_value pic_apply4(pic_state *, struct pic_proc *, pic_value, pic_value, pic_value, pic_value);
|
||||
pic_value pic_apply5(pic_state *, struct pic_proc *, pic_value, pic_value, pic_value, pic_value, pic_value);
|
||||
pic_value pic_apply_trampoline(pic_state *, struct pic_proc *, pic_value);
|
||||
pic_value pic_apply_trampoline(pic_state *, struct pic_proc *, size_t, pic_value *);
|
||||
pic_value pic_apply_trampoline_list(pic_state *, struct pic_proc *, pic_value);
|
||||
pic_value pic_eval(pic_state *, pic_value, struct pic_env *);
|
||||
struct pic_proc *pic_compile(pic_state *, pic_value, struct pic_env *);
|
||||
|
||||
|
||||
+1
-1
@@ -86,7 +86,7 @@ pic_proc_apply(pic_state *pic)
|
||||
arg_list = pic_cons(pic, args[argc], arg_list);
|
||||
}
|
||||
|
||||
return pic_apply_trampoline(pic, proc, arg_list);
|
||||
return pic_apply_trampoline_list(pic, proc, arg_list);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
+21
-6
@@ -957,10 +957,11 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||
pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, size_t argc, pic_value *args)
|
||||
{
|
||||
pic_value v, it, *sp;
|
||||
pic_value *sp;
|
||||
pic_callinfo *ci;
|
||||
size_t i;
|
||||
|
||||
PIC_INIT_CODE_I(pic->iseq[0], OP_NOP, 0);
|
||||
PIC_INIT_CODE_I(pic->iseq[1], OP_TAILCALL, -1);
|
||||
@@ -968,22 +969,36 @@ pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||
*pic->sp++ = pic_obj_value(proc);
|
||||
|
||||
sp = pic->sp;
|
||||
pic_for_each (v, args, it) {
|
||||
*sp++ = v;
|
||||
for (i = 0; i < argc; ++i) {
|
||||
*sp++ = args[i];
|
||||
}
|
||||
|
||||
ci = PUSHCI();
|
||||
ci->ip = pic->iseq;
|
||||
ci->fp = pic->sp;
|
||||
ci->retc = (int)pic_length(pic, args);
|
||||
ci->retc = (int)argc;
|
||||
|
||||
if (ci->retc == 0) {
|
||||
return pic_undef_value();
|
||||
} else {
|
||||
return pic_car(pic, args);
|
||||
return args[0];
|
||||
}
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_apply_trampoline_list(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||
{
|
||||
size_t i, argc = pic_length(pic, args);
|
||||
pic_value val, it, argv[argc];
|
||||
|
||||
i = 0;
|
||||
pic_for_each (val, args, it) {
|
||||
argv[i++] = val;
|
||||
}
|
||||
|
||||
return pic_apply_trampoline(pic, proc, argc, argv);
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_apply0(pic_state *pic, struct pic_proc *proc)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user