Converted everything to the new lisp calling convention.

Fixes #19
This commit is contained in:
Simon Brooke 2026-04-01 17:11:10 +01:00
parent f3a26bc02e
commit b6480aebd5
53 changed files with 590 additions and 520 deletions

View file

@ -25,44 +25,44 @@
*
* @return a pso_pointer to the stack frame.
*/
struct pso_pointer make_frame( struct pso_pointer previous, ...) {
va_list args;
va_start(args, previous);
int count = va_arg(args, int);
struct pso_pointer make_frame( struct pso_pointer previous, ... ) {
va_list args;
va_start( args, previous );
int count = va_arg( args, int );
struct pso_pointer frame_pointer = allocate( STACKTAG, 4);
struct pso4* frame = (struct pso4*)pointer_to_object( frame_pointer);
struct pso_pointer frame_pointer = allocate( STACKTAG, 4 );
struct pso4 *frame = ( struct pso4 * ) pointer_to_object( frame_pointer );
frame->payload.stack_frame.previous = previous;
frame->payload.stack_frame.previous = previous;
// I *think* the count starts with the number of args, so there are
// one fewer actual args. Need to test to verify this!
count --;
int cursor = 0;
frame->payload.stack_frame.args = count;
// I *think* the count starts with the number of args, so there are
// one fewer actual args. Need to test to verify this!
count--;
int cursor = 0;
frame->payload.stack_frame.args = count;
for ( ; cursor < count && cursor < args_in_frame; cursor++) {
struct pso_pointer argument = va_arg( args, struct pso_pointer);
for ( ; cursor < count && cursor < args_in_frame; cursor++ ) {
struct pso_pointer argument = va_arg( args, struct pso_pointer );
frame->payload.stack_frame.arg[cursor] = inc_ref( argument);
}
if ( cursor < count) {
struct pso_pointer more_args = nil;
frame->payload.stack_frame.arg[cursor] = inc_ref( argument );
}
if ( cursor < count ) {
struct pso_pointer more_args = nil;
for (; cursor < count; cursor++) {
more_args = cons( va_arg( args, struct pso_pointer), more_args);
}
for ( ; cursor < count; cursor++ ) {
more_args = cons( va_arg( args, struct pso_pointer ), more_args );
}
// should be frame->payload.stack_frame.more = reverse( more_args), but
// we don't have reverse yet. TODO: fix.
frame->payload.stack_frame.more = more_args;
} else {
for (; cursor < args_in_frame; cursor++) {
frame->payload.stack_frame.arg[cursor] = nil;
}
}
// should be frame->payload.stack_frame.more = reverse( more_args), but
// we don't have reverse yet. TODO: fix.
frame->payload.stack_frame.more = more_args;
} else {
for ( ; cursor < args_in_frame; cursor++ ) {
frame->payload.stack_frame.arg[cursor] = nil;
}
}
return frame_pointer;
return frame_pointer;
}
/**
@ -72,23 +72,23 @@ struct pso_pointer make_frame( struct pso_pointer previous, ...) {
* be destroyed.
*/
struct pso_pointer destroy_stack_frame( struct pso_pointer fp,
struct pso_pointer env) {
if (stackp(fp)) {
struct pso4 *frame = pointer_to_pso4( fp);
struct pso4 * casualty =
pointer_to_pso4( frame->payload.stack_frame.arg[0]);
struct pso_pointer env ) {
if ( stackp( fp ) ) {
struct pso4 *frame = pointer_to_pso4( fp );
struct pso4 *casualty =
pointer_to_pso4( frame->payload.stack_frame.arg[0] );
dec_ref( casualty->payload.stack_frame.previous);
dec_ref( casualty->payload.stack_frame.function);
dec_ref( casualty->payload.stack_frame.more);
dec_ref( casualty->payload.stack_frame.previous );
dec_ref( casualty->payload.stack_frame.function );
dec_ref( casualty->payload.stack_frame.more );
for (int i = 0; i < args_in_frame; i++) {
dec_ref( casualty->payload.stack_frame.arg[0]);
}
for ( int i = 0; i < args_in_frame; i++ ) {
dec_ref( casualty->payload.stack_frame.arg[0] );
}
casualty->payload.stack_frame.args = 0;
casualty->payload.stack_frame.depth = 0;
}
casualty->payload.stack_frame.args = 0;
casualty->payload.stack_frame.depth = 0;
}
return nil;
return nil;
}