aboutsummaryrefslogtreecommitdiff
path: root/include/bytecode.h
blob: 06ebf193e92e7583c422c76fb2cf17af48525cd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifndef TSL_BYTECODE_H
#define TSL_BYTECODE_H

#include "std/buffer.h"
#include "std/string_view.h"
#include "value.h"
#include <stdint.h>

typedef uint8_t TslOpcodeType;

typedef enum {
    TSL_OPCODE_LOADN,           /* load number */
    TSL_OPCODE_LOADB,           /* load bool */
    TSL_OPCODE_LOADS,           /* load string */
    TSL_OPCODE_LOADF,           /* load function */
    TSL_OPCODE_LOADV,           /* load variable */
    TSL_OPCODE_LOADNULL,        /* load null */
    TSL_OPCODE_SETV,            /* set variable to the value at the top of the stack */
    TSL_OPCODE_LIST,            /* create a list using values from the stack */
    TSL_OPCODE_MAP,             /* create a map using values from the stack */
    TSL_OPCODE_MINDEX,          /* map index. pop two values from stack, where the first value will be a map and the second a key */
    TSL_OPCODE_CALLF,           /* call the function at the top of the stack using the next N values at the top of the stack as arguments */
    TSL_OPCODE_ADD,
    TSL_OPCODE_SUB,
    TSL_OPCODE_MUL,
    TSL_OPCODE_DIV,
    TSL_OPCODE_LOADCA,          /* add command argument to stack */
    TSL_OPCODE_CALLC            /* run a program using N arguments from the stack, where the bottom value is the name of the program */
} TslOpcode;

typedef struct {
    TslBuffer /*TslInstruction*/ buffer;
} TslBytecode;

typedef struct {
    TslOpcode opcode;
    int value;
} TslInstructionType1;

typedef struct {
    TslOpcode opcode;
    double value;
} TslInstructionType2;

typedef struct {
    TslOpcode opcode;
    TslBool value;
} TslInstructionType3;

typedef struct {
    TslOpcode opcode;
    TslStringView value;
} TslInstructionType4;

typedef struct {
    TslOpcode opcode;
} TslInstructionType5;

const char* tsl_opcode_to_string(TslOpcode opcode);

void tsl_bytecode_init(TslBytecode *self);
void tsl_bytecode_deinit(TslBytecode *self);

int tsl_bytecode_add_ins1(TslBytecode *self, TslOpcode opcode, int value);
int tsl_bytecode_add_ins2(TslBytecode *self, TslOpcode opcode, double value);
int tsl_bytecode_add_ins3(TslBytecode *self, TslOpcode opcode, TslBool value);
int tsl_bytecode_add_ins4(TslBytecode *self, TslOpcode opcode, TslStringView *value);
int tsl_bytecode_add_ins5(TslBytecode *self, TslOpcode opcode);

#endif /* TSL_BYTECODE_H */