MBED port of https://github.com/ys1382/filagree . The only change is adding #define MBED
vm.h@0:1a89e28dea91, 2012-05-30 (annotated)
- Committer:
- yusufx
- Date:
- Wed May 30 21:13:01 2012 +0000
- Revision:
- 0:1a89e28dea91
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yusufx | 0:1a89e28dea91 | 1 | #ifndef VM_H |
yusufx | 0:1a89e28dea91 | 2 | #define VM_H |
yusufx | 0:1a89e28dea91 | 3 | |
yusufx | 0:1a89e28dea91 | 4 | |
yusufx | 0:1a89e28dea91 | 5 | #include <stdint.h> |
yusufx | 0:1a89e28dea91 | 6 | #include <inttypes.h> |
yusufx | 0:1a89e28dea91 | 7 | #include "struct.h" |
yusufx | 0:1a89e28dea91 | 8 | #include "util.h" |
yusufx | 0:1a89e28dea91 | 9 | #include "variable.h" |
yusufx | 0:1a89e28dea91 | 10 | |
yusufx | 0:1a89e28dea91 | 11 | #define ERROR_NULL "null pointer" |
yusufx | 0:1a89e28dea91 | 12 | #define ERROR_INDEX "index out of bounds" |
yusufx | 0:1a89e28dea91 | 13 | |
yusufx | 0:1a89e28dea91 | 14 | struct Context { |
yusufx | 0:1a89e28dea91 | 15 | struct program_state *vm_state; |
yusufx | 0:1a89e28dea91 | 16 | struct stack *program_stack; |
yusufx | 0:1a89e28dea91 | 17 | struct stack *operand_stack; |
yusufx | 0:1a89e28dea91 | 18 | struct stack *rhs; |
yusufx | 0:1a89e28dea91 | 19 | struct variable *vm_exception; |
yusufx | 0:1a89e28dea91 | 20 | bridge *callback2c; |
yusufx | 0:1a89e28dea91 | 21 | bool runtime; |
yusufx | 0:1a89e28dea91 | 22 | uint32_t num_vars; |
yusufx | 0:1a89e28dea91 | 23 | struct variable* error; |
yusufx | 0:1a89e28dea91 | 24 | uint8_t indent; |
yusufx | 0:1a89e28dea91 | 25 | }; |
yusufx | 0:1a89e28dea91 | 26 | |
yusufx | 0:1a89e28dea91 | 27 | enum Opcode { |
yusufx | 0:1a89e28dea91 | 28 | VM_NIL, // push nil |
yusufx | 0:1a89e28dea91 | 29 | VM_INT, // push an integer |
yusufx | 0:1a89e28dea91 | 30 | VM_FLT, // push a float |
yusufx | 0:1a89e28dea91 | 31 | VM_BOOL,// push a boolean |
yusufx | 0:1a89e28dea91 | 32 | VM_STR, // push a string |
yusufx | 0:1a89e28dea91 | 33 | VM_VAR, // push a variable |
yusufx | 0:1a89e28dea91 | 34 | VM_FNC, // push a function |
yusufx | 0:1a89e28dea91 | 35 | VM_DST, // done with assignment |
yusufx | 0:1a89e28dea91 | 36 | VM_SET, // set a variable |
yusufx | 0:1a89e28dea91 | 37 | VM_SRC, // push a set of values |
yusufx | 0:1a89e28dea91 | 38 | VM_LST, // push a list |
yusufx | 0:1a89e28dea91 | 39 | VM_MAP, // push a map |
yusufx | 0:1a89e28dea91 | 40 | VM_GET, // get an item from a list or map |
yusufx | 0:1a89e28dea91 | 41 | VM_PUT, // put an item in a list or map |
yusufx | 0:1a89e28dea91 | 42 | VM_ADD, // add two values |
yusufx | 0:1a89e28dea91 | 43 | VM_SUB, // subtract two values |
yusufx | 0:1a89e28dea91 | 44 | VM_MUL, // multiply two values |
yusufx | 0:1a89e28dea91 | 45 | VM_DIV, // divide two values |
yusufx | 0:1a89e28dea91 | 46 | VM_MOD, // modulo |
yusufx | 0:1a89e28dea91 | 47 | VM_BND, // bitwise and |
yusufx | 0:1a89e28dea91 | 48 | VM_BOR, // bitwise or |
yusufx | 0:1a89e28dea91 | 49 | VM_INV, // bitwise inverse |
yusufx | 0:1a89e28dea91 | 50 | VM_XOR, // xor |
yusufx | 0:1a89e28dea91 | 51 | VM_LSF, // left shift |
yusufx | 0:1a89e28dea91 | 52 | VM_RSF, // right shift |
yusufx | 0:1a89e28dea91 | 53 | VM_NEG, // arithmetic negate a value |
yusufx | 0:1a89e28dea91 | 54 | VM_NOT, // boolean negate a value |
yusufx | 0:1a89e28dea91 | 55 | VM_EQU, // compare |
yusufx | 0:1a89e28dea91 | 56 | VM_NEQ, // diff |
yusufx | 0:1a89e28dea91 | 57 | VM_GTN, // greater than |
yusufx | 0:1a89e28dea91 | 58 | VM_LTN, // less than |
yusufx | 0:1a89e28dea91 | 59 | VM_AND, // logical and |
yusufx | 0:1a89e28dea91 | 60 | VM_OR, // logical or |
yusufx | 0:1a89e28dea91 | 61 | VM_IFF, // if then |
yusufx | 0:1a89e28dea91 | 62 | VM_JMP, // jump the program counter |
yusufx | 0:1a89e28dea91 | 63 | VM_CAL, // call a function |
yusufx | 0:1a89e28dea91 | 64 | VM_MET, // call an object method |
yusufx | 0:1a89e28dea91 | 65 | VM_RET, // return from a function, |
yusufx | 0:1a89e28dea91 | 66 | VM_ITR, // iteration loop |
yusufx | 0:1a89e28dea91 | 67 | VM_COM, // comprehension |
yusufx | 0:1a89e28dea91 | 68 | VM_TRY, // try.catch |
yusufx | 0:1a89e28dea91 | 69 | VM_TRO, // throw |
yusufx | 0:1a89e28dea91 | 70 | }; |
yusufx | 0:1a89e28dea91 | 71 | |
yusufx | 0:1a89e28dea91 | 72 | #define ERROR_OPCODE "unknown opcode" |
yusufx | 0:1a89e28dea91 | 73 | |
yusufx | 0:1a89e28dea91 | 74 | #ifdef DEBUG |
yusufx | 0:1a89e28dea91 | 75 | void display_program(struct byte_array* program); |
yusufx | 0:1a89e28dea91 | 76 | #endif |
yusufx | 0:1a89e28dea91 | 77 | struct Context *vm_init(); |
yusufx | 0:1a89e28dea91 | 78 | struct variable *execute(struct byte_array *program, |
yusufx | 0:1a89e28dea91 | 79 | bool in_context, |
yusufx | 0:1a89e28dea91 | 80 | bridge *callback_to_c); |
yusufx | 0:1a89e28dea91 | 81 | void garbage_collect(struct Context *context); |
yusufx | 0:1a89e28dea91 | 82 | |
yusufx | 0:1a89e28dea91 | 83 | void vm_call(struct Context *context); |
yusufx | 0:1a89e28dea91 | 84 | void *vm_exit_message(struct Context *context, const char *format, ...); |
yusufx | 0:1a89e28dea91 | 85 | void vm_null_check(struct Context *context, const void* p); |
yusufx | 0:1a89e28dea91 | 86 | void vm_assert(struct Context *context, bool assertion, const char *format, ...); |
yusufx | 0:1a89e28dea91 | 87 | |
yusufx | 0:1a89e28dea91 | 88 | #endif // VM_H |