Damien George | 04b9147 | 2014-05-03 23:27:38 +0100 | [diff] [blame] | 1 | /* |
| 2 | * This file is part of the Micro Python project, http://micropython.org/ |
| 3 | * |
| 4 | * The MIT License (MIT) |
| 5 | * |
| 6 | * Copyright (c) 2013, 2014 Damien P. George |
| 7 | * |
| 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 9 | * of this software and associated documentation files (the "Software"), to deal |
| 10 | * in the Software without restriction, including without limitation the rights |
| 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 12 | * copies of the Software, and to permit persons to whom the Software is |
| 13 | * furnished to do so, subject to the following conditions: |
| 14 | * |
| 15 | * The above copyright notice and this permission notice shall be included in |
| 16 | * all copies or substantial portions of the Software. |
| 17 | * |
| 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 24 | * THE SOFTWARE. |
| 25 | */ |
| 26 | |
Damien George | 8725f8f | 2014-02-15 19:33:11 +0000 | [diff] [blame] | 27 | // taken from python source, Include/code.h |
Damien George | 78035b9 | 2014-04-09 12:27:39 +0100 | [diff] [blame] | 28 | // These must fit in 8 bits; see scope.h |
Damien George | 8725f8f | 2014-02-15 19:33:11 +0000 | [diff] [blame] | 29 | #define MP_SCOPE_FLAG_OPTIMISED 0x01 |
| 30 | #define MP_SCOPE_FLAG_NEWLOCALS 0x02 |
| 31 | #define MP_SCOPE_FLAG_VARARGS 0x04 |
| 32 | #define MP_SCOPE_FLAG_VARKEYWORDS 0x08 |
| 33 | #define MP_SCOPE_FLAG_NESTED 0x10 |
| 34 | #define MP_SCOPE_FLAG_GENERATOR 0x20 |
| 35 | /* The MP_SCOPE_FLAG_NOFREE flag is set if there are no free or cell variables. |
| 36 | This information is redundant, but it allows a single flag test |
| 37 | to determine whether there is any extra work to be done when the |
| 38 | call frame is setup. |
| 39 | */ |
| 40 | #define MP_SCOPE_FLAG_NOFREE 0x40 |
| 41 | |
Damien George | 2ac4af6 | 2014-08-15 16:45:41 +0100 | [diff] [blame] | 42 | // types for native (viper) function signature |
| 43 | #define MP_NATIVE_TYPE_OBJ (0x00) |
| 44 | #define MP_NATIVE_TYPE_BOOL (0x01) |
| 45 | #define MP_NATIVE_TYPE_INT (0x02) |
| 46 | #define MP_NATIVE_TYPE_UINT (0x03) |
| 47 | |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 48 | typedef enum { |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 49 | MP_UNARY_OP_BOOL, // __bool__ |
| 50 | MP_UNARY_OP_LEN, // __len__ |
| 51 | MP_UNARY_OP_POSITIVE, |
| 52 | MP_UNARY_OP_NEGATIVE, |
| 53 | MP_UNARY_OP_INVERT, |
Damien George | 9aa2a52 | 2014-02-01 23:04:09 +0000 | [diff] [blame] | 54 | // these are not supported by the runtime and must be synthesised by the emitter |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 55 | MP_UNARY_OP_NOT, |
| 56 | } mp_unary_op_t; |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 57 | |
| 58 | typedef enum { |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 59 | MP_BINARY_OP_OR, |
| 60 | MP_BINARY_OP_XOR, |
| 61 | MP_BINARY_OP_AND, |
| 62 | MP_BINARY_OP_LSHIFT, |
| 63 | MP_BINARY_OP_RSHIFT, |
Paul Sokolovsky | 070c78a | 2014-05-10 04:24:22 +0300 | [diff] [blame] | 64 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 65 | MP_BINARY_OP_ADD, |
| 66 | MP_BINARY_OP_SUBTRACT, |
| 67 | MP_BINARY_OP_MULTIPLY, |
| 68 | MP_BINARY_OP_FLOOR_DIVIDE, |
| 69 | MP_BINARY_OP_TRUE_DIVIDE, |
Paul Sokolovsky | 070c78a | 2014-05-10 04:24:22 +0300 | [diff] [blame] | 70 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 71 | MP_BINARY_OP_MODULO, |
| 72 | MP_BINARY_OP_POWER, |
| 73 | MP_BINARY_OP_INPLACE_OR, |
| 74 | MP_BINARY_OP_INPLACE_XOR, |
| 75 | MP_BINARY_OP_INPLACE_AND, |
Paul Sokolovsky | 070c78a | 2014-05-10 04:24:22 +0300 | [diff] [blame] | 76 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 77 | MP_BINARY_OP_INPLACE_LSHIFT, |
| 78 | MP_BINARY_OP_INPLACE_RSHIFT, |
| 79 | MP_BINARY_OP_INPLACE_ADD, |
| 80 | MP_BINARY_OP_INPLACE_SUBTRACT, |
| 81 | MP_BINARY_OP_INPLACE_MULTIPLY, |
Paul Sokolovsky | 070c78a | 2014-05-10 04:24:22 +0300 | [diff] [blame] | 82 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 83 | MP_BINARY_OP_INPLACE_FLOOR_DIVIDE, |
| 84 | MP_BINARY_OP_INPLACE_TRUE_DIVIDE, |
| 85 | MP_BINARY_OP_INPLACE_MODULO, |
| 86 | MP_BINARY_OP_INPLACE_POWER, |
Damien George | 9aa2a52 | 2014-02-01 23:04:09 +0000 | [diff] [blame] | 87 | // these should return a bool |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 88 | MP_BINARY_OP_LESS, |
Paul Sokolovsky | 070c78a | 2014-05-10 04:24:22 +0300 | [diff] [blame] | 89 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 90 | MP_BINARY_OP_MORE, |
| 91 | MP_BINARY_OP_EQUAL, |
| 92 | MP_BINARY_OP_LESS_EQUAL, |
| 93 | MP_BINARY_OP_MORE_EQUAL, |
| 94 | MP_BINARY_OP_NOT_EQUAL, |
Paul Sokolovsky | 070c78a | 2014-05-10 04:24:22 +0300 | [diff] [blame] | 95 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 96 | MP_BINARY_OP_IN, |
| 97 | MP_BINARY_OP_IS, |
| 98 | MP_BINARY_OP_EXCEPTION_MATCH, |
Damien George | 9aa2a52 | 2014-02-01 23:04:09 +0000 | [diff] [blame] | 99 | // these are not supported by the runtime and must be synthesised by the emitter |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 100 | MP_BINARY_OP_NOT_IN, |
| 101 | MP_BINARY_OP_IS_NOT, |
| 102 | } mp_binary_op_t; |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 103 | |
| 104 | typedef enum { |
Damien George | e6c0dff | 2014-08-15 23:47:59 +0100 | [diff] [blame] | 105 | MP_F_CONVERT_OBJ_TO_NATIVE = 0, |
| 106 | MP_F_CONVERT_NATIVE_TO_OBJ, |
| 107 | MP_F_LOAD_CONST_INT, |
Damien George | 503d611 | 2014-05-28 14:07:21 +0100 | [diff] [blame] | 108 | MP_F_LOAD_CONST_DEC, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 109 | MP_F_LOAD_CONST_STR, |
Damien George | 7fe2191 | 2014-08-16 22:31:57 +0100 | [diff] [blame] | 110 | MP_F_LOAD_CONST_BYTES, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 111 | MP_F_LOAD_NAME, |
| 112 | MP_F_LOAD_GLOBAL, |
| 113 | MP_F_LOAD_BUILD_CLASS, |
| 114 | MP_F_LOAD_ATTR, |
| 115 | MP_F_LOAD_METHOD, |
| 116 | MP_F_STORE_NAME, |
Damien George | e6c0dff | 2014-08-15 23:47:59 +0100 | [diff] [blame] | 117 | MP_F_STORE_GLOBAL, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 118 | MP_F_STORE_ATTR, |
Damien George | 729f7b4 | 2014-04-17 22:10:53 +0100 | [diff] [blame] | 119 | MP_F_OBJ_SUBSCR, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 120 | MP_F_OBJ_IS_TRUE, |
| 121 | MP_F_UNARY_OP, |
| 122 | MP_F_BINARY_OP, |
| 123 | MP_F_BUILD_TUPLE, |
| 124 | MP_F_BUILD_LIST, |
| 125 | MP_F_LIST_APPEND, |
| 126 | MP_F_BUILD_MAP, |
| 127 | MP_F_STORE_MAP, |
Damien George | 3ebd4d0 | 2014-06-01 13:46:47 +0100 | [diff] [blame] | 128 | #if MICROPY_PY_BUILTINS_SET |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 129 | MP_F_BUILD_SET, |
| 130 | MP_F_STORE_SET, |
Damien George | 3ebd4d0 | 2014-06-01 13:46:47 +0100 | [diff] [blame] | 131 | #endif |
Damien George | df8127a | 2014-04-13 11:04:33 +0100 | [diff] [blame] | 132 | MP_F_MAKE_FUNCTION_FROM_RAW_CODE, |
Damien George | 86de21b | 2014-08-16 22:06:11 +0100 | [diff] [blame] | 133 | MP_F_NATIVE_CALL_FUNCTION_N_KW, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 134 | MP_F_CALL_METHOD_N_KW, |
| 135 | MP_F_GETITER, |
| 136 | MP_F_ITERNEXT, |
Damien George | 7fe2191 | 2014-08-16 22:31:57 +0100 | [diff] [blame] | 137 | MP_F_NLR_PUSH, |
| 138 | MP_F_NLR_POP, |
Damien George | 86de21b | 2014-08-16 22:06:11 +0100 | [diff] [blame] | 139 | MP_F_NATIVE_RAISE, |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 140 | MP_F_IMPORT_NAME, |
Damien George | 7fe2191 | 2014-08-16 22:31:57 +0100 | [diff] [blame] | 141 | MP_F_IMPORT_FROM, |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 142 | MP_F_IMPORT_ALL, |
Damien George | c49ddb9 | 2014-06-01 13:49:35 +0100 | [diff] [blame] | 143 | #if MICROPY_PY_BUILTINS_SLICE |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 144 | MP_F_NEW_SLICE, |
Damien George | c49ddb9 | 2014-06-01 13:49:35 +0100 | [diff] [blame] | 145 | #endif |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 146 | MP_F_UNPACK_SEQUENCE, |
Damien George | a32c1e4 | 2014-05-07 18:30:52 +0100 | [diff] [blame] | 147 | MP_F_UNPACK_EX, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 148 | MP_F_NUMBER_OF, |
| 149 | } mp_fun_kind_t; |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 150 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 151 | extern void *const mp_fun_table[MP_F_NUMBER_OF]; |