2020-10-28 05:16:30 +00:00
# ifndef CSTATE_H
# define CSTATE_H
# include "cosmo.h"
# include "cobj.h"
2021-01-08 01:50:36 +00:00
# include "cvalue.h"
2020-10-28 05:16:30 +00:00
# include "ctable.h"
2021-02-15 22:20:04 +00:00
struct CCallFrame {
2020-10-28 05:16:30 +00:00
CObjClosure * closure ;
INSTRUCTION * pc ;
CValue * base ;
2021-02-15 22:20:04 +00:00
} ;
2020-10-28 05:16:30 +00:00
2020-11-17 01:58:16 +00:00
typedef enum IStringEnum {
2020-12-16 03:21:51 +00:00
ISTRING_INIT , // __init
2021-01-03 23:33:10 +00:00
ISTRING_TOSTRING , // __tostring
2021-01-23 21:30:30 +00:00
ISTRING_TONUMBER , // __tonumber
2021-02-20 18:42:13 +00:00
ISTRING_EQUAL , // __equals
2020-12-16 03:21:51 +00:00
ISTRING_INDEX , // __index
ISTRING_NEWINDEX , // __newindex
2021-01-22 21:22:30 +00:00
ISTRING_COUNT , // __count
2020-12-16 03:21:51 +00:00
ISTRING_GETTER , // __getter
ISTRING_SETTER , // __setter
ISTRING_ITER , // __iter
ISTRING_NEXT , // __next
2020-12-18 01:44:04 +00:00
ISTRING_RESERVED , // __reserved
2020-11-17 01:58:16 +00:00
ISTRING_MAX
} IStringEnum ;
2020-11-12 22:52:56 +00:00
2020-12-07 20:35:14 +00:00
typedef struct ArrayCObj {
CObj * * array ;
int count ;
int capacity ;
} ArrayCObj ;
2021-02-15 22:20:04 +00:00
struct CState {
2020-10-28 05:16:30 +00:00
bool panic ;
int freezeGC ; // when > 0, GC events will be ignored (for internal use)
2021-01-02 01:20:24 +00:00
int frameCount ;
Added CObjError, cosmoV_throw(), pcall(), and cosmoV_printError()
Errors are now handled very differently, parser errors and VM errors are now treated the same.
When cosmoV_error is called, cosmoV_throw is also called, which formats the error object and sets the panic state.
state->error now points to the latest CObjError when state->panic is true. To get a nice formatted Objection message, use
cosmoV_printError() and pass the state->error. pcall() was added to the standard base library. When called, the first argument
passed is called with the subsequent arguments given. If the call completed successfully, `true`,`nil` is returned. However
when an error occurs during the call, `false`,`<error>` is returned. Simply print the `<error>` to retrieve the error string.
2021-01-06 04:27:59 +00:00
CObjError * error ; // NULL, unless panic is true
2020-10-28 05:16:30 +00:00
CObj * objects ; // tracks all of our allocated objects
2020-12-07 21:53:23 +00:00
CObj * userRoots ; // user definable roots, this holds CObjs that should be considered "roots", lets the VM know you are holding a reference to a CObj in your code
2020-12-07 20:35:14 +00:00
ArrayCObj grayStack ; // keeps track of which objects *haven't yet* been traversed in our GC, but *have been* found
2020-10-28 05:16:30 +00:00
size_t allocatedBytes ;
size_t nextGC ; // when allocatedBytes reaches this threshhold, trigger a GC event
CObjUpval * openUpvalues ; // tracks all of our still open (meaning still on the stack) upvalues
CTable strings ;
2021-01-25 22:14:51 +00:00
CObjTable * globals ;
2020-10-28 05:16:30 +00:00
CValue * top ; // top of the stack
2021-01-08 01:50:36 +00:00
CObjObject * protoObjects [ COBJ_MAX ] ; // proto object for each COBJ type [NULL = no default proto]
2020-11-17 01:58:16 +00:00
CObjString * iStrings [ ISTRING_MAX ] ; // strings used internally by the VM, eg. __init, __index & friends
2021-01-02 01:20:24 +00:00
CCallFrame callFrame [ FRAME_MAX ] ; // call frames
CValue stack [ STACK_MAX ] ; // stack
2021-02-15 22:20:04 +00:00
} ;
2020-10-28 05:16:30 +00:00
COSMO_API CState * cosmoV_newState ( ) ;
2020-12-20 03:15:12 +00:00
// expects 2*pairs values on the stack, each pair should consist of 1 key and 1 value
COSMO_API void cosmoV_register ( CState * state , int pairs ) ;
2020-10-28 05:16:30 +00:00
COSMO_API void cosmoV_freeState ( CState * state ) ;
COSMO_API void cosmoV_printStack ( CState * state ) ;
2021-01-02 05:06:24 +00:00
# endif