2020-12-26 09:32:21 +09:00
|
|
|
#pragma once
|
|
|
|
|
2020-12-29 15:26:45 +09:00
|
|
|
#include <stdarg.h>
|
2020-12-29 18:51:03 +09:00
|
|
|
#include <sys/types.h>
|
2020-12-26 09:32:21 +09:00
|
|
|
#include "kuroko.h"
|
|
|
|
#include "value.h"
|
2020-12-26 14:33:34 +09:00
|
|
|
#include "table.h"
|
2020-12-27 09:33:28 +09:00
|
|
|
#include "object.h"
|
|
|
|
|
|
|
|
#define FRAMES_MAX 64
|
2020-12-26 09:32:21 +09:00
|
|
|
|
|
|
|
typedef struct {
|
2020-12-27 13:02:26 +09:00
|
|
|
KrkClosure * closure;
|
2020-12-26 09:32:21 +09:00
|
|
|
uint8_t * ip;
|
2020-12-27 22:40:35 +09:00
|
|
|
size_t slots;
|
2020-12-30 22:30:09 +09:00
|
|
|
int isInlined;
|
2020-12-27 09:33:28 +09:00
|
|
|
} CallFrame;
|
|
|
|
|
2020-12-27 22:40:35 +09:00
|
|
|
typedef enum {
|
|
|
|
METHOD_INIT,
|
|
|
|
METHOD_STR,
|
2020-12-28 19:01:28 +09:00
|
|
|
METHOD_GET,
|
|
|
|
METHOD_SET,
|
|
|
|
METHOD_CLASS,
|
|
|
|
METHOD_NAME,
|
|
|
|
METHOD_FILE,
|
2020-12-29 16:40:42 +09:00
|
|
|
METHOD_INT,
|
|
|
|
METHOD_FLOAT,
|
|
|
|
METHOD_CHR,
|
2020-12-30 15:50:26 +09:00
|
|
|
METHOD_LEN,
|
2020-12-30 16:59:21 +09:00
|
|
|
METHOD_DOC,
|
2020-12-31 09:15:53 +09:00
|
|
|
METHOD_BASE,
|
2020-12-31 18:14:20 +09:00
|
|
|
METHOD_GETSLICE,
|
2020-12-27 22:40:35 +09:00
|
|
|
|
|
|
|
METHOD__MAX,
|
|
|
|
} KrkSpecialMethods;
|
|
|
|
|
2020-12-27 09:33:28 +09:00
|
|
|
typedef struct {
|
|
|
|
CallFrame frames[FRAMES_MAX];
|
|
|
|
size_t frameCount;
|
2020-12-26 09:32:21 +09:00
|
|
|
size_t stackSize;
|
|
|
|
KrkValue * stack;
|
|
|
|
KrkValue * stackTop;
|
2020-12-26 16:53:15 +09:00
|
|
|
KrkTable globals;
|
2020-12-26 14:33:34 +09:00
|
|
|
KrkTable strings;
|
2020-12-27 18:55:52 +09:00
|
|
|
KrkTable modules;
|
2020-12-27 13:02:26 +09:00
|
|
|
KrkUpvalue * openUpvalues;
|
2020-12-26 09:32:21 +09:00
|
|
|
KrkObj * objects;
|
2020-12-27 15:58:32 +09:00
|
|
|
size_t bytesAllocated;
|
|
|
|
size_t nextGC;
|
|
|
|
size_t grayCount;
|
|
|
|
size_t grayCapacity;
|
2020-12-29 13:19:22 +09:00
|
|
|
ssize_t exitOnFrame;
|
2020-12-27 15:58:32 +09:00
|
|
|
KrkObj** grayStack;
|
2020-12-27 22:40:35 +09:00
|
|
|
KrkValue specialMethodNames[METHOD__MAX];
|
2020-12-28 09:08:35 +09:00
|
|
|
|
2021-01-01 12:04:58 +09:00
|
|
|
KrkClass * objectClass;
|
2020-12-28 19:01:28 +09:00
|
|
|
KrkInstance * builtins;
|
|
|
|
|
2021-01-01 12:04:58 +09:00
|
|
|
struct {
|
|
|
|
KrkClass * baseException;
|
|
|
|
KrkClass * typeError;
|
|
|
|
KrkClass * argumentError;
|
|
|
|
KrkClass * indexError;
|
|
|
|
KrkClass * keyError;
|
|
|
|
KrkClass * attributeError;
|
|
|
|
KrkClass * nameError;
|
|
|
|
KrkClass * importError;
|
|
|
|
KrkClass * ioError;
|
|
|
|
} exceptions;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
KrkClass * typeClass; /* Class */
|
|
|
|
KrkClass * intClass; /* Integer */
|
|
|
|
KrkClass * floatClass; /* Floating */
|
|
|
|
KrkClass * boolClass; /* Boolean */
|
|
|
|
KrkClass * noneTypeClass; /* None */
|
|
|
|
KrkClass * strClass; /* String */
|
|
|
|
KrkClass * functionClass; /* Functions, Closures */
|
|
|
|
KrkClass * methodClass; /* BoundMethod */
|
|
|
|
} baseClasses;
|
|
|
|
|
2020-12-29 11:00:12 +09:00
|
|
|
KrkValue currentException;
|
2020-12-28 20:38:26 +09:00
|
|
|
int flags;
|
2020-12-26 09:32:21 +09:00
|
|
|
} KrkVM;
|
|
|
|
|
2020-12-28 20:38:26 +09:00
|
|
|
#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)
|
|
|
|
|
2020-12-28 22:02:39 +09:00
|
|
|
#define KRK_GC_PAUSED (1 << 10)
|
2020-12-29 11:00:12 +09:00
|
|
|
#define KRK_HAS_EXCEPTION (1 << 11)
|
2020-12-28 22:02:39 +09:00
|
|
|
|
2020-12-31 14:46:02 +09:00
|
|
|
extern KrkVM krk_vm;
|
|
|
|
#define vm krk_vm
|
2020-12-26 09:32:21 +09:00
|
|
|
|
2020-12-28 20:38:26 +09:00
|
|
|
extern void krk_initVM(int flags);
|
2020-12-26 09:32:21 +09:00
|
|
|
extern void krk_freeVM(void);
|
2020-12-28 10:54:25 +09:00
|
|
|
extern KrkValue krk_interpret(const char * src, int newScope, char *, char *);
|
|
|
|
extern KrkValue krk_runfile(const char * fileName, int newScope, char *, char *);
|
2020-12-26 09:32:21 +09:00
|
|
|
extern void krk_push(KrkValue value);
|
|
|
|
extern KrkValue krk_pop(void);
|
2020-12-28 11:11:50 +09:00
|
|
|
extern const char * krk_typeName(KrkValue value);
|
2020-12-28 19:01:28 +09:00
|
|
|
extern void krk_defineNative(KrkTable * table, const char * name, NativeFn function);
|
2020-12-28 19:25:33 +09:00
|
|
|
extern void krk_attachNamedObject(KrkTable * table, const char name[], KrkObj * obj);
|
2020-12-31 15:48:39 +09:00
|
|
|
extern void krk_attachNamedValue(KrkTable * table, const char name[], KrkValue obj);
|
2021-01-01 12:04:58 +09:00
|
|
|
extern void krk_runtimeError(KrkClass * type, const char * fmt, ...);
|
2020-12-28 22:02:39 +09:00
|
|
|
|
|
|
|
#define KRK_PAUSE_GC() do { vm.flags |= KRK_GC_PAUSED; } while (0)
|
|
|
|
#define KRK_RESUME_GC() do { vm.flags &= ~(KRK_GC_PAUSED); } while (0)
|
2020-12-29 18:51:03 +09:00
|
|
|
|
|
|
|
extern KrkValue krk_dictGet(KrkValue dictClass, KrkInstance * dict, KrkValue key);
|
|
|
|
extern void krk_dictSet(KrkValue dictClass, KrkInstance * dict, KrkValue key, KrkValue value);
|
|
|
|
extern KrkInstance * krk_dictCreate(KrkValue * outClass);
|
2020-12-29 20:25:34 +09:00
|
|
|
extern KrkValue krk_runNext(void);
|