]> git.lizzy.rs Git - uwu-lang.git/blob - api/vm.h
uwuint: use long instead of int to prevent YEAR2038 problem in nolambda time library
[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
7 typedef enum
8 {
9         MODULE_PLAIN,
10         MODULE_NATIVE,
11 } UwUVMModuleType;
12
13 typedef enum
14 {
15         EX_UNINIT,
16         EX_INTLIT,
17         EX_STRLIT,
18         EX_ARGNUM,
19         EX_FNNAME,
20         EX_FNCALL,
21 } UwUVMExpressionType;
22
23 typedef struct
24 {
25         void *(*clone)(void *data);
26         void  (*delet)(void *data);
27         char *(*print)(void *data);
28 } UwUVMType;
29
30 typedef struct
31 {
32         void *data;
33         UwUVMType *type;
34 } UwUVMValue;
35
36 typedef struct UwUVMArgs
37 {
38         size_t num;
39         UwUVMValue              **evaluated;
40         struct UwUVMExpression *unevaluated;
41         struct UwUVMArgs *super;
42 } UwUVMArgs;
43
44 typedef UwUVMValue (*UwUVMNativeFunction)(UwUVMArgs *args);
45
46 typedef struct
47 {
48         UwUVMModuleType type;
49         union
50         {
51                 struct UwUVMExpression *plain;
52                 UwUVMNativeFunction native;
53         } value;
54 } UwUVMFunction;
55
56 typedef struct UwUVMExpression
57 {
58         UwUVMExpressionType type;
59         union
60         {
61                 struct
62                 {
63                         UwUVMFunction *function;
64                         struct UwUVMExpression *args;
65                         size_t           num_args;
66                 }           cll_value;
67                 long        int_value;
68                 char       *str_value;
69                 UwUVMFunction *ref_value;
70         } value;
71 } UwUVMExpression;
72
73 UwUVMValue uwuvm_clone_value(UwUVMValue value);
74 void       uwuvm_delet_value(UwUVMValue value);
75 char      *uwuvm_print_value(UwUVMValue value);
76 UwUVMValue uwuvm_get_arg(UwUVMArgs *args, size_t i);
77 UwUVMValue uwuvm_evaluate_expression(UwUVMExpression *expression, UwUVMArgs *args);
78 UwUVMValue uwuvm_call_function(UwUVMFunction *function, size_t num_args, UwUVMExpression *unevaluated_args, UwUVMArgs *super_args);
79
80 #endif