Right, I'm committing this session because I'm too cold and tired to go on.
It does not at present build (and it's going to take a good bit more work before it does).
This commit is contained in:
parent
f05d1af9d6
commit
6148d3699f
32 changed files with 364 additions and 309 deletions
|
|
@ -24,8 +24,8 @@
|
|||
|
||||
#include "payloads/character.h"
|
||||
|
||||
struct pso_pointer make_character( wint_t c ) {
|
||||
struct pso_pointer result = allocate( CHARACTERTAG, 2 );
|
||||
struct pso_pointer make_character( struct pso4 *frame_pointer, wint_t c ) {
|
||||
struct pso_pointer result = allocate( frame_pointer, CHARACTERTAG, 2 );
|
||||
|
||||
if ( !nilp( result ) ) {
|
||||
pointer_to_object( result )->payload.character.character =
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
#include "memory/pso4.h"
|
||||
|
||||
#define CHARTAG "CHR"
|
||||
#define CHARTV 5392451
|
||||
|
|
@ -37,5 +38,5 @@ struct character_payload {
|
|||
char32_t character;
|
||||
};
|
||||
|
||||
struct pso_pointer make_character( wint_t c );
|
||||
struct pso_pointer make_character( struct pso4 *frame_pointer, wint_t c );
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -30,9 +30,11 @@
|
|||
* @param cdr the pointer which should form the cdr of this cons cell.
|
||||
* @return struct pso_pointer a pointer to the newly allocated cons cell.
|
||||
*/
|
||||
struct pso_pointer make_cons(struct pso_pointer car, struct pso_pointer cdr) {
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
struct pso_pointer result = allocate( CONSTAG, 2 );
|
||||
struct pso_pointer make_cons( struct pso4 *frame_pointer,
|
||||
struct pso_pointer car,
|
||||
struct pso_pointer cdr ) {
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
struct pso_pointer result = allocate( frame_pointer, CONSTAG, 2 );
|
||||
|
||||
struct pso2 *object = pointer_to_object( result );
|
||||
object->payload.cons.car = inc_ref( car );
|
||||
|
|
@ -68,8 +70,8 @@ struct pso_pointer c_car( struct pso_pointer cons ) {
|
|||
* @return the cdr of the indicated cell.
|
||||
* @exception if the pointer does not indicate a cons cell.
|
||||
*/
|
||||
struct pso_pointer c_cdr(struct pso_pointer p) {
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
struct pso_pointer c_cdr( struct pso4 *stack_pointer, struct pso_pointer p ) {
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
struct pso_pointer result = nil;
|
||||
struct pso2 *object = pointer_to_object( p );
|
||||
|
||||
|
|
@ -85,8 +87,8 @@ struct pso_pointer c_cdr(struct pso_pointer p) {
|
|||
default:
|
||||
result =
|
||||
make_exception( make_cons
|
||||
( c_string_to_lisp_string
|
||||
( L"Invalid type for cdr" ),
|
||||
( stack_pointer, c_string_to_lisp_string
|
||||
( stack_pointer, L"Invalid type for cdr" ),
|
||||
get_tag_string( p ) ), nil, nil, nil );
|
||||
break;
|
||||
}
|
||||
|
|
@ -109,6 +111,6 @@ struct pso_pointer destroy_cons( struct pso_pointer fp,
|
|||
struct pso4 *frame = pointer_to_pso4( fp );
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
dec_ref( c_car( p ) );
|
||||
dec_ref( c_cdr( p ) );
|
||||
dec_ref( c_cdr( frame, p ) );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <stdbool.h>
|
||||
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso4.h"
|
||||
|
||||
#define CONS_SIZE_CLASS 2
|
||||
|
||||
|
|
@ -28,10 +29,12 @@ struct cons_payload {
|
|||
|
||||
struct pso_pointer c_car( struct pso_pointer cons );
|
||||
|
||||
struct pso_pointer c_cdr( struct pso_pointer cons );
|
||||
struct pso_pointer c_cdr( struct pso4 *stack_pointer,
|
||||
struct pso_pointer cons );
|
||||
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
struct pso_pointer make_cons( struct pso_pointer car, struct pso_pointer cdr );
|
||||
struct pso_pointer make_cons( struct pso4 *stack_pointer,
|
||||
struct pso_pointer car, struct pso_pointer cdr );
|
||||
|
||||
struct pso_pointer destroy_cons( struct pso_pointer fp,
|
||||
struct pso_pointer env );
|
||||
|
|
|
|||
|
|
@ -38,7 +38,8 @@ struct pso_pointer make_exception( struct pso_pointer message,
|
|||
struct pso_pointer frame,
|
||||
struct pso_pointer meta,
|
||||
struct pso_pointer cause ) {
|
||||
struct pso_pointer result = allocate( EXCEPTIONTAG, 3 );
|
||||
struct pso_pointer result =
|
||||
allocate( pointer_to_pso4( frame ), EXCEPTIONTAG, 3 );
|
||||
|
||||
if ( !nilp( result ) && !exceptionp( result ) ) {
|
||||
struct pso3 *object = ( struct pso3 * ) pointer_to_object( result );
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "debug.h"
|
||||
|
|
@ -24,11 +25,11 @@
|
|||
* @param more `nil`, or a pointer to the more significant cell(s) of this number.
|
||||
* *NOTE* that if `more` is not `nil`, `value` *must not* exceed `MAX_INTEGER`.
|
||||
*/
|
||||
struct pso_pointer make_integer( int64_t value ) {
|
||||
struct pso_pointer make_integer( struct pso4 *frame_pointer, int64_t value ) {
|
||||
struct pso_pointer result = nil;
|
||||
debug_print( L"Entering make_integer\n", DEBUG_ALLOC, 0 );
|
||||
|
||||
result = allocate( INTEGERTAG, 2 );
|
||||
result = allocate( frame_pointer, INTEGERTAG, 2 );
|
||||
struct pso2 *cell = pointer_to_object( result );
|
||||
cell->payload.integer.value = value;
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "memory/pso4.h"
|
||||
|
||||
/**
|
||||
* @brief An integer .
|
||||
*
|
||||
|
|
@ -23,6 +25,6 @@ struct integer_payload {
|
|||
__int128_t value;
|
||||
};
|
||||
|
||||
struct pso_pointer make_integer( int64_t value );
|
||||
struct pso_pointer make_integer( struct pso4 *frame_pointer, int64_t value );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -8,23 +8,19 @@
|
|||
*/
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* wide characters
|
||||
*/
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "ops/string_ops.h"
|
||||
#include "ops/truth.h"
|
||||
#include "payloads/cons.h"
|
||||
|
||||
|
||||
/**
|
||||
* @brief When an string is freed, its cdr pointer must be decremented.
|
||||
|
|
@ -38,7 +34,7 @@ struct pso_pointer destroy_string( struct pso_pointer fp,
|
|||
struct pso4 *frame = pointer_to_pso4( fp );
|
||||
struct pso_pointer p = frame->payload.stack_frame.arg[0];
|
||||
|
||||
dec_ref( c_cdr( p ) );
|
||||
dec_ref( c_cdr( frame, p ) );
|
||||
}
|
||||
|
||||
return nil;
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
|
||||
|
|
@ -24,9 +25,10 @@
|
|||
* @param metadata a pointer to an associaton containing metadata on the stream.
|
||||
* @return a pointer to the new read stream.
|
||||
*/
|
||||
struct pso_pointer make_read_stream( URL_FILE *input,
|
||||
struct pso_pointer make_read_stream( struct pso4 *frame_pointer,
|
||||
URL_FILE *input,
|
||||
struct pso_pointer metadata ) {
|
||||
struct pso_pointer pointer = allocate( READTAG, 2 );
|
||||
struct pso_pointer pointer = allocate( frame_pointer, READTAG, 2 );
|
||||
struct pso2 *cell = pointer_to_object( pointer );
|
||||
|
||||
cell->payload.stream.stream = input;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,8 @@ struct stream_payload {
|
|||
struct pso_pointer meta;
|
||||
};
|
||||
|
||||
struct pso_pointer make_read_stream( URL_FILE * input,
|
||||
struct pso_pointer make_read_stream( struct pso4 *frame_pointer,
|
||||
URL_FILE * input,
|
||||
struct pso_pointer metadata );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -33,12 +33,13 @@
|
|||
*/
|
||||
struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
|
||||
... ) {
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
// todo: issue #21: must have stack frame passed in.
|
||||
va_list args;
|
||||
va_start( args, previous );
|
||||
|
||||
struct pso_pointer frame_pointer = allocate( STACKTAG, 4 );
|
||||
struct pso4 *frame = ( struct pso4 * ) pointer_to_object( frame_pointer );
|
||||
struct pso4 *frame = pointer_to_pso4( previous );
|
||||
struct pso_pointer frame_pointer =
|
||||
allocate( pointer_to_pso4( previous ), STACKTAG, 4 );
|
||||
|
||||
#ifdef DEBUG
|
||||
debug_printf( DEBUG_ALLOC, 0,
|
||||
|
|
@ -72,7 +73,8 @@ struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
|
|||
|
||||
for ( ; cursor < arg_count; cursor++ ) {
|
||||
more_args =
|
||||
make_cons( va_arg( args, struct pso_pointer ), more_args );
|
||||
make_cons( frame, va_arg( args, struct pso_pointer ),
|
||||
more_args );
|
||||
}
|
||||
|
||||
frame->payload.stack_frame.more = c_reverse( more_args );
|
||||
|
|
@ -103,6 +105,8 @@ struct pso_pointer destroy_stack_frame( struct pso_pointer fp,
|
|||
dec_ref( frame->payload.stack_frame.previous );
|
||||
dec_ref( frame->payload.stack_frame.function );
|
||||
dec_ref( frame->payload.stack_frame.more );
|
||||
dec_ref( frame->payload.stack_frame.locals );
|
||||
dec_ref( frame->payload.stack_frame.env );
|
||||
|
||||
for ( int i = 0; i < args_in_frame; i++ ) {
|
||||
dec_ref( frame->payload.stack_frame.arg[i] );
|
||||
|
|
|
|||
|
|
@ -31,10 +31,10 @@ struct stack_frame_payload {
|
|||
struct pso_pointer more;
|
||||
/** the function to be called. */
|
||||
struct pso_pointer function;
|
||||
/** the execute-time environment */
|
||||
struct pso_pointer env;
|
||||
/** a list of objects created in the context of this frame */
|
||||
struct pso_pointer locals;
|
||||
/** the execute-time environment */
|
||||
struct pso_pointer env;
|
||||
/** a list of objects created in the context of this frame */
|
||||
struct pso_pointer locals;
|
||||
/** the number of arguments provided. */
|
||||
uint32_t args;
|
||||
/** the depth of the stack below this frame */
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include "memory/pointer.h"
|
||||
#include "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
|
||||
|
|
@ -24,9 +25,10 @@
|
|||
* @param metadata a pointer to an associaton containing metadata on the stream.
|
||||
* @return a pointer to the new read stream.
|
||||
*/
|
||||
struct pso_pointer make_write_stream( URL_FILE *output,
|
||||
struct pso_pointer make_write_stream( struct pso4 *frame_pointer,
|
||||
URL_FILE *output,
|
||||
struct pso_pointer metadata ) {
|
||||
struct pso_pointer pointer = allocate( WRITETAG, 2 );
|
||||
struct pso_pointer pointer = allocate( frame_pointer, WRITETAG, 2 );
|
||||
struct pso2 *cell = pointer_to_object( pointer );
|
||||
|
||||
cell->payload.stream.stream = output;
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
/* write stream shares a payload with /see read_streem.h */
|
||||
|
||||
#include "io/fopen.h"
|
||||
struct pso_pointer make_write_stream( URL_FILE * output,
|
||||
struct pso_pointer make_write_stream( struct pso4 *frame_pointer,
|
||||
URL_FILE * output,
|
||||
struct pso_pointer metadata );
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue