2020-12-26 09:32:21 +09:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "kuroko.h"
|
|
|
|
#include "value.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Opcodes
|
|
|
|
*
|
|
|
|
* These are pretty much entirely based on the clox opcodes from the book.
|
|
|
|
* There's not really much else to add here, since the VM is sufficient for
|
|
|
|
* our needs. Most of the interesting changes happen in the compiler.
|
|
|
|
*/
|
|
|
|
typedef enum {
|
2020-12-29 06:13:30 +09:00
|
|
|
OP_CONSTANT = 1,
|
2020-12-26 09:32:21 +09:00
|
|
|
OP_NEGATE,
|
|
|
|
OP_RETURN,
|
|
|
|
OP_ADD,
|
|
|
|
OP_SUBTRACT,
|
|
|
|
OP_MULTIPLY,
|
|
|
|
OP_DIVIDE,
|
2020-12-28 16:32:27 +09:00
|
|
|
OP_MODULO,
|
2020-12-26 09:32:21 +09:00
|
|
|
OP_NONE,
|
|
|
|
OP_TRUE,
|
|
|
|
OP_FALSE,
|
|
|
|
OP_NOT,
|
2020-12-26 16:53:15 +09:00
|
|
|
OP_POP,
|
2020-12-26 09:32:21 +09:00
|
|
|
OP_EQUAL,
|
|
|
|
OP_GREATER,
|
|
|
|
OP_LESS,
|
2020-12-26 16:53:15 +09:00
|
|
|
OP_PRINT,
|
|
|
|
OP_DEFINE_GLOBAL,
|
|
|
|
OP_GET_GLOBAL,
|
|
|
|
OP_SET_GLOBAL,
|
2020-12-26 18:39:29 +09:00
|
|
|
OP_SET_LOCAL,
|
|
|
|
OP_GET_LOCAL,
|
2020-12-26 20:39:47 +09:00
|
|
|
OP_JUMP_IF_FALSE,
|
|
|
|
OP_JUMP_IF_TRUE,
|
|
|
|
OP_JUMP,
|
|
|
|
OP_LOOP,
|
2020-12-27 09:33:28 +09:00
|
|
|
OP_CALL,
|
2020-12-27 13:02:26 +09:00
|
|
|
OP_CLOSURE,
|
|
|
|
OP_GET_UPVALUE,
|
|
|
|
OP_SET_UPVALUE,
|
|
|
|
OP_CLOSE_UPVALUE,
|
2020-12-27 16:45:34 +09:00
|
|
|
OP_CLASS,
|
|
|
|
OP_SET_PROPERTY,
|
|
|
|
OP_GET_PROPERTY,
|
2020-12-27 17:53:46 +09:00
|
|
|
OP_METHOD,
|
2020-12-27 18:55:52 +09:00
|
|
|
OP_IMPORT,
|
2020-12-27 22:40:35 +09:00
|
|
|
OP_INHERIT,
|
|
|
|
OP_GET_SUPER,
|
2020-12-29 11:00:12 +09:00
|
|
|
OP_PUSH_TRY,
|
|
|
|
OP_RAISE,
|
2020-12-30 16:59:21 +09:00
|
|
|
OP_DOCSTRING,
|
2020-12-30 21:56:02 +09:00
|
|
|
OP_CALL_STACK,
|
|
|
|
OP_INC,
|
2020-12-29 06:13:30 +09:00
|
|
|
|
|
|
|
OP_CONSTANT_LONG = 128,
|
|
|
|
OP_PRINT_LONG,
|
|
|
|
OP_DEFINE_GLOBAL_LONG,
|
|
|
|
OP_GET_GLOBAL_LONG,
|
|
|
|
OP_SET_GLOBAL_LONG,
|
|
|
|
OP_SET_LOCAL_LONG,
|
|
|
|
OP_GET_LOCAL_LONG,
|
|
|
|
OP_CALL_LONG,
|
|
|
|
OP_CLOSURE_LONG,
|
|
|
|
OP_GET_UPVALUE_LONG,
|
|
|
|
OP_SET_UPVALUE_LONG,
|
|
|
|
OP_CLASS_LONG,
|
|
|
|
OP_SET_PROPERTY_LONG,
|
|
|
|
OP_GET_PROPERTY_LONG,
|
|
|
|
OP_METHOD_LONG,
|
|
|
|
OP_IMPORT_LONG,
|
|
|
|
OP_GET_SUPER_LONG,
|
2020-12-30 21:56:02 +09:00
|
|
|
OP_INC_LONG,
|
2020-12-26 09:32:21 +09:00
|
|
|
} KrkOpCode;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Bytecode chunks
|
|
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
size_t count;
|
|
|
|
size_t capacity;
|
|
|
|
uint8_t * code;
|
|
|
|
size_t * lines;
|
2020-12-28 10:54:25 +09:00
|
|
|
KrkString * filename;
|
2020-12-26 09:32:21 +09:00
|
|
|
KrkValueArray constants;
|
|
|
|
} KrkChunk;
|
|
|
|
|
|
|
|
extern void krk_initChunk(KrkChunk * chunk);
|
|
|
|
extern void krk_writeChunk(KrkChunk * chunk, uint8_t byte, size_t line);
|
|
|
|
extern void krk_freeChunk(KrkChunk * chunk);
|
|
|
|
extern size_t krk_addConstant(KrkChunk * chunk, KrkValue value);
|
2020-12-27 09:33:28 +09:00
|
|
|
extern void krk_emitConstant(KrkChunk * chunk, size_t ind, size_t line);
|
2020-12-26 09:32:21 +09:00
|
|
|
extern size_t krk_writeConstant(KrkChunk * chunk, KrkValue value, size_t line);
|