post-scarcity/src/c/payloads/stack.h

63 lines
1.9 KiB
C

/**
* payloads/stack.h
*
* a Lisp stack frame.
*
* Sits in a pso4.
*
* (c) 2026 Simon Brooke <simon@journeyman.cc>
* Licensed under GPL version 2.0, or, at your option, any later version.
*/
#ifndef __psse_payloads_stack_h
#define __psse_payloads_stack_h
#include "memory/pointer.h"
/*
* number of arguments stored in a stack frame
*/
#define args_in_frame 8
/**
* A stack frame.
*/
struct stack_frame_payload {
/** the previous frame. */
struct pso_pointer previous;
/** first 8 arument bindings. */
struct pso_pointer arg[args_in_frame];
/** list of any further argument bindings. */
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 number of arguments provided. */
uint32_t args;
/** the depth of the stack below this frame */
uint32_t depth;
};
struct pso_pointer make_frame( int arg_count, struct pso_pointer previous,
... );
struct pso_pointer make_frame_with_env( int arg_count,
struct pso_pointer previous,
struct pso_pointer env, ... );
struct pso_pointer make_frame_with_arglist_and_env( struct pso_pointer
previous,
struct pso_pointer
argvalues,
struct pso_pointer env );
struct pso_pointer make_frame_with_arglist( struct pso_pointer previous,
struct pso_pointer argvalues );
struct pso_pointer destroy_stack_frame( struct pso_pointer fp,
struct pso_pointer env );
#endif