parent
f3a26bc02e
commit
b6480aebd5
53 changed files with 590 additions and 520 deletions
|
|
@ -23,12 +23,13 @@
|
|||
|
||||
#include "payloads/character.h"
|
||||
|
||||
struct pso_pointer make_character( wint_t c) {
|
||||
struct pso_pointer result = allocate( CHARACTERTAG, 2 );
|
||||
struct pso_pointer make_character( wint_t c ) {
|
||||
struct pso_pointer result = allocate( CHARACTERTAG, 2 );
|
||||
|
||||
if (!nilp(result)) {
|
||||
pointer_to_object(result)->payload.character.character = (wchar_t) c;
|
||||
}
|
||||
if ( !nilp( result ) ) {
|
||||
pointer_to_object( result )->payload.character.character =
|
||||
( wchar_t ) c;
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,5 +36,5 @@ struct character_payload {
|
|||
wchar_t character;
|
||||
};
|
||||
|
||||
struct pso_pointer make_character( wint_t c);
|
||||
struct pso_pointer make_character( wint_t c );
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "payloads/cons.h"
|
||||
#include "payloads/exception.h"
|
||||
|
|
@ -70,17 +70,21 @@ struct pso_pointer cdr( struct pso_pointer p ) {
|
|||
struct pso_pointer result = nil;
|
||||
struct pso2 *object = pointer_to_object( result );
|
||||
|
||||
switch (get_tag_value( p)) {
|
||||
case CONSTV : result = object->payload.cons.cdr; break;
|
||||
case KEYTV :
|
||||
case STRINGTV :
|
||||
case SYMBOLTV :
|
||||
result = object->payload.string.cdr; break;
|
||||
default :
|
||||
result = make_exception(
|
||||
cons(c_string_to_lisp_string(L"Invalid type for cdr"), p),
|
||||
nil, nil);
|
||||
break;
|
||||
switch ( get_tag_value( p ) ) {
|
||||
case CONSTV:
|
||||
result = object->payload.cons.cdr;
|
||||
break;
|
||||
case KEYTV:
|
||||
case STRINGTV:
|
||||
case SYMBOLTV:
|
||||
result = object->payload.string.cdr;
|
||||
break;
|
||||
default:
|
||||
result =
|
||||
make_exception( cons
|
||||
( c_string_to_lisp_string
|
||||
( L"Invalid type for cdr" ), p ), nil, nil );
|
||||
break;
|
||||
}
|
||||
|
||||
// TODO: else throw an exception
|
||||
|
|
@ -95,11 +99,12 @@ struct pso_pointer cdr( struct pso_pointer p ) {
|
|||
* Lisp calling conventions; one expected arg, the pointer to the cell to
|
||||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp, struct pso_pointer env) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp);
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
dec_ref( car( p));
|
||||
dec_ref( cdr( p));
|
||||
}
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp,
|
||||
struct pso_pointer env ) {
|
||||
if ( stackp( fp ) ) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp );
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
dec_ref( car( p ) );
|
||||
dec_ref( cdr( p ) );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ struct pso_pointer cdr( struct pso_pointer cons );
|
|||
|
||||
struct pso_pointer cons( struct pso_pointer car, struct pso_pointer cdr );
|
||||
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp, struct pso_pointer env);
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp,
|
||||
struct pso_pointer env );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@
|
|||
#include "payloads/exception.h"
|
||||
|
||||
struct pso_pointer make_exception( struct pso_pointer message,
|
||||
struct pso_pointer frame_pointer, struct pso_pointer cause) {
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer cause ) {
|
||||
// TODO: not yet implemented
|
||||
return nil;
|
||||
}
|
||||
|
|
@ -29,13 +30,13 @@ struct pso_pointer make_exception( struct pso_pointer message,
|
|||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_exception( struct pso_pointer fp,
|
||||
struct pso_pointer env) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp);
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
struct pso_pointer env ) {
|
||||
if ( stackp( fp ) ) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp );
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
|
||||
// TODO: decrement every pointer indicated by an exception.
|
||||
}
|
||||
// TODO: decrement every pointer indicated by an exception.
|
||||
}
|
||||
|
||||
return nil;
|
||||
return nil;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,9 +25,10 @@ struct exception_payload {
|
|||
};
|
||||
|
||||
struct pso_pointer make_exception( struct pso_pointer message,
|
||||
struct pso_pointer frame_pointer, struct pso_pointer cause);
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer cause );
|
||||
|
||||
struct pso_pointer destroy_exception( struct pso_pointer fp,
|
||||
struct pso_pointer env);
|
||||
struct pso_pointer env );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -26,13 +26,13 @@
|
|||
*/
|
||||
struct pso_pointer make_integer( int64_t value ) {
|
||||
struct pso_pointer result = nil;
|
||||
debug_print( L"Entering make_integer\n", DEBUG_ALLOC , 0);
|
||||
debug_print( L"Entering make_integer\n", DEBUG_ALLOC, 0 );
|
||||
|
||||
result = allocate( INTEGERTAG, 2);
|
||||
struct pso2 *cell = pointer_to_object( result );
|
||||
cell->payload.integer.value = value;
|
||||
result = allocate( INTEGERTAG, 2 );
|
||||
struct pso2 *cell = pointer_to_object( result );
|
||||
cell->payload.integer.value = value;
|
||||
|
||||
debug_print( L"make_integer: returning\n", DEBUG_ALLOC , 0);
|
||||
debug_print( L"make_integer: returning\n", DEBUG_ALLOC, 0 );
|
||||
debug_dump_object( result, DEBUG_ALLOC, 0 );
|
||||
|
||||
return result;
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@
|
|||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* wide characters
|
||||
*/
|
||||
* wide characters
|
||||
*/
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
|
|
@ -33,13 +33,13 @@
|
|||
* be destroyed.
|
||||
*/
|
||||
struct pso_pointer destroy_string( struct pso_pointer fp,
|
||||
struct pso_pointer env) {
|
||||
if (stackp(fp)) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp);
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
struct pso_pointer env ) {
|
||||
if ( stackp( fp ) ) {
|
||||
struct pso4 *frame = pointer_to_pso4( fp );
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
|
||||
dec_ref( cdr(p));
|
||||
}
|
||||
dec_ref( cdr( p ) );
|
||||
}
|
||||
|
||||
return nil;
|
||||
return nil;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,6 @@ struct string_payload {
|
|||
struct pso_pointer make_string( wint_t c, struct pso_pointer tail );
|
||||
|
||||
struct pso_pointer destroy_string( struct pso_pointer fp,
|
||||
struct pso_pointer env);
|
||||
struct pso_pointer env );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@
|
|||
* @return a pointer to the new read stream.
|
||||
*/
|
||||
struct pso_pointer make_read_stream( URL_FILE *input,
|
||||
struct pso_pointer metadata ) {
|
||||
struct pso_pointer pointer = allocate( READTAG, 2);
|
||||
struct pso_pointer metadata ) {
|
||||
struct pso_pointer pointer = allocate( READTAG, 2 );
|
||||
struct pso2 *cell = pointer_to_object( pointer );
|
||||
|
||||
cell->payload.stream.stream = input;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ struct stream_payload {
|
|||
struct pso_pointer meta;
|
||||
};
|
||||
|
||||
struct pso_pointer make_read_stream( URL_FILE *input,
|
||||
struct pso_pointer metadata );
|
||||
struct pso_pointer make_read_stream( URL_FILE * input,
|
||||
struct pso_pointer metadata );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ struct stack_frame_payload {
|
|||
uint32_t depth;
|
||||
};
|
||||
|
||||
struct pso_pointer make_frame( struct pso_pointer previous, ...);
|
||||
struct pso_pointer make_frame( struct pso_pointer previous, ... );
|
||||
|
||||
struct pso_pointer destroy_stack_frame( struct pso_pointer fp,
|
||||
struct pso_pointer env);
|
||||
struct pso_pointer env );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue