]> git.lizzy.rs Git - uwu-lang.git/blob - api/vm.h
94103d5c5a610c908d6a4ceddabd312865d1bbb9
[uwu-lang.git] / api / vm.h
1 #ifndef _API_VM_H_
2 #define _API_VM_H_
3
4 #include <stddef.h>
5 #include <stdbool.h>
6 #include "../src/expression.h"
7
8 typedef enum
9 {
10         MODULE_PLAIN,
11         MODULE_NATIVE,
12 } UwUVMModuleType;
13
14 typedef struct
15 {
16         void *(*copy  )(void *data);
17         void  (*delete)(void *data);
18         char *(*print )(void *data);
19 } UwUVMNativeType;
20
21 typedef struct
22 {
23         void *data;
24         UwUVMNativeType *type;
25 } UwUVMNativeValue;
26
27 typedef struct UwUVMArgs
28 {
29         size_t num;
30         struct UwUVMValue       **evaluated;
31         struct UwUVMExpression *unevaluated;
32         struct UwUVMArgs *super;
33 } UwUVMArgs;
34
35 typedef struct UwUVMValue (*UwUVMNativeFunction)(UwUVMArgs *args);
36
37 typedef struct
38 {
39         UwUVMModuleType type;
40         union
41         {
42                 struct UwUVMExpression *plain;
43                 UwUVMNativeFunction native;
44         } value;
45 } UwUVMFunction;
46
47 typedef struct UwUVMValue
48 {
49         enum
50         {
51                 VT_INT,
52                 VT_STR,
53                 VT_REF,
54                 VT_NAT,
55         } type;
56         union
57         {
58                 int           int_value;
59                 char         *str_value;
60                 UwUVMFunction   *ref_value;
61                 UwUVMNativeValue nat_value;
62         } value;
63 } UwUVMValue;
64
65 typedef struct UwUVMExpression
66 {
67         ExpressionType type;
68         union
69         {
70                 struct
71                 {
72                         UwUVMFunction *function;
73                         struct UwUVMExpression *args;
74                         size_t           num_args;
75                 }           cll_value;
76                 int         int_value;
77                 char       *str_value;
78                 UwUVMFunction *ref_value;
79         } value;
80 } UwUVMExpression;
81
82 typedef struct
83 {
84         void *api_library;
85         UwUVMFunction *main_function;
86         UwUVMFunction **functions;
87         size_t   num_functions;
88         void     **libraries;
89         size_t num_libraries;
90 } UwUVMProgram;
91
92 void uwuvm_free_value(UwUVMValue value);
93 void uwuvm_free_args(UwUVMArgs *args);
94 UwUVMValue uwuvm_copy_value(UwUVMValue value);
95 UwUVMValue uwuvm_get_arg(UwUVMArgs *args, size_t i);
96 UwUVMValue uwuvm_evaluate_expression(UwUVMExpression *expression, UwUVMArgs *args);
97 UwUVMValue uwuvm_run_function(UwUVMFunction *function, UwUVMArgs args);
98
99 #endif