kuroko/vm.h

81 lines
1.8 KiB
C
Raw Normal View History

#pragma once
#include <stdarg.h>
#include "kuroko.h"
#include "value.h"
#include "table.h"
#include "object.h"
#define FRAMES_MAX 64
typedef struct {
KrkClosure * closure;
uint8_t * ip;
size_t slots;
} CallFrame;
typedef enum {
METHOD_INIT,
METHOD_STR,
2020-12-28 13:01:28 +03:00
METHOD_GET,
METHOD_SET,
METHOD_CLASS,
METHOD_NAME,
METHOD_FILE,
METHOD_INT,
METHOD_FLOAT,
METHOD_CHR,
METHOD__MAX,
} KrkSpecialMethods;
typedef struct {
CallFrame frames[FRAMES_MAX];
size_t frameCount;
size_t stackSize;
KrkValue * stack;
KrkValue * stackTop;
2020-12-26 10:53:15 +03:00
KrkTable globals;
KrkTable strings;
KrkTable modules;
KrkUpvalue * openUpvalues;
KrkObj * objects;
size_t bytesAllocated;
size_t nextGC;
size_t grayCount;
size_t grayCapacity;
ssize_t exitOnFrame;
KrkObj** grayStack;
KrkValue specialMethodNames[METHOD__MAX];
2020-12-28 13:01:28 +03:00
KrkClass * object_class;
KrkInstance * builtins;
2020-12-29 05:00:12 +03:00
KrkValue currentException;
int flags;
} KrkVM;
#define KRK_ENABLE_TRACING (1 << 0)
#define KRK_ENABLE_DEBUGGING (1 << 1)
#define KRK_ENABLE_SCAN_TRACING (1 << 2)
#define KRK_ENABLE_STRESS_GC (1 << 3)
#define KRK_GC_PAUSED (1 << 10)
2020-12-29 05:00:12 +03:00
#define KRK_HAS_EXCEPTION (1 << 11)
extern KrkVM vm;
extern void krk_initVM(int flags);
extern void krk_freeVM(void);
2020-12-28 04:54:25 +03:00
extern KrkValue krk_interpret(const char * src, int newScope, char *, char *);
extern KrkValue krk_runfile(const char * fileName, int newScope, char *, char *);
extern void krk_push(KrkValue value);
extern KrkValue krk_pop(void);
2020-12-28 05:11:50 +03:00
extern const char * krk_typeName(KrkValue value);
2020-12-28 13:01:28 +03:00
extern void krk_defineNative(KrkTable * table, const char * name, NativeFn function);
2020-12-28 13:25:33 +03:00
extern void krk_attachNamedObject(KrkTable * table, const char name[], KrkObj * obj);
extern void krk_runtimeError(const char * fmt, ...);
#define KRK_PAUSE_GC() do { vm.flags |= KRK_GC_PAUSED; } while (0)
#define KRK_RESUME_GC() do { vm.flags &= ~(KRK_GC_PAUSED); } while (0)