/** * payloads/stack.h * * a Lisp stack frame. * * Sits in a pso4. * * (c) 2026 Simon Brooke * 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