mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 12:20:26 +02:00
Fixed a stack leak. Now observing actual performance.
* src/*.[ch]: Replaced `scm_mem2symbol' by `scm_from_locale_symboln' and `scm_ulong2num' by `scm_from_ulong'. * src/vm_system.c (tail-call): Fixed stack leak (SP lacked decrement by one more Scheme object in the tail-recursive case). * benchmark/measure.scm (measure): Make sure we are using the compiled procedure (i.e. a program object) when measuring. This yields better results than before. :-) * doc/guile-vm.texi: Augmented the instruction set documentation with branch instructions, `call' and `tail-call'. git-archimport-id: lcourtes@laas.fr--2004-libre/guile-vm--revival--0.6--patch-7
This commit is contained in:
parent
2d80426a3e
commit
f41cb00ce2
10 changed files with 149 additions and 38 deletions
|
@ -376,7 +376,10 @@ VM_DEFINE_INSTRUCTION (call, "call", 1, -1, 1)
|
|||
*/
|
||||
if (!SCM_FALSEP (scm_procedure_p (x)))
|
||||
{
|
||||
/* At this point, the stack contains the procedure and each one of its
|
||||
arguments. */
|
||||
SCM args;
|
||||
|
||||
POP_LIST (nargs);
|
||||
POP (args);
|
||||
*sp = scm_apply (x, args, SCM_EOL);
|
||||
|
@ -407,7 +410,7 @@ VM_DEFINE_INSTRUCTION (call, "call", 1, -1, 1)
|
|||
|
||||
VM_DEFINE_INSTRUCTION (tail_call, "tail-call", 1, -1, 1)
|
||||
{
|
||||
SCM x;
|
||||
register SCM x;
|
||||
nargs = FETCH ();
|
||||
x = sp[-nargs];
|
||||
|
||||
|
@ -425,7 +428,9 @@ VM_DEFINE_INSTRUCTION (tail_call, "tail-call", 1, -1, 1)
|
|||
sp -= bp->nargs - 1;
|
||||
for (i = 0; i < bp->nargs; i++)
|
||||
LOCAL_SET (i, sp[i]);
|
||||
sp--;
|
||||
|
||||
/* Drop the first argument and the program itself. */
|
||||
sp -= 2;
|
||||
|
||||
/* Call itself */
|
||||
ip = bp->base;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue