Damien George | 04b9147 | 2014-05-03 23:27:38 +0100 | [diff] [blame] | 1 | /* |
Alexander Steffen | 55f3324 | 2017-06-30 09:22:17 +0200 | [diff] [blame] | 2 | * This file is part of the MicroPython project, http://micropython.org/ |
Damien George | 04b9147 | 2014-05-03 23:27:38 +0100 | [diff] [blame] | 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 | */ |
Alexander Steffen | 299bc62 | 2017-06-29 23:14:58 +0200 | [diff] [blame] | 26 | #ifndef MICROPY_INCLUDED_PY_RUNTIME0_H |
| 27 | #define MICROPY_INCLUDED_PY_RUNTIME0_H |
Damien George | 04b9147 | 2014-05-03 23:27:38 +0100 | [diff] [blame] | 28 | |
Damien George | 78035b9 | 2014-04-09 12:27:39 +0100 | [diff] [blame] | 29 | // These must fit in 8 bits; see scope.h |
Damien George | 7f70b60 | 2015-08-17 22:39:03 +0100 | [diff] [blame] | 30 | #define MP_SCOPE_FLAG_VARARGS (0x01) |
| 31 | #define MP_SCOPE_FLAG_VARKEYWORDS (0x02) |
| 32 | #define MP_SCOPE_FLAG_GENERATOR (0x04) |
Damien George | 3a3db4d | 2015-10-22 23:45:37 +0100 | [diff] [blame] | 33 | #define MP_SCOPE_FLAG_DEFKWARGS (0x08) |
Damien George | 8725f8f | 2014-02-15 19:33:11 +0000 | [diff] [blame] | 34 | |
Damien George | 2ac4af6 | 2014-08-15 16:45:41 +0100 | [diff] [blame] | 35 | // types for native (viper) function signature |
| 36 | #define MP_NATIVE_TYPE_OBJ (0x00) |
| 37 | #define MP_NATIVE_TYPE_BOOL (0x01) |
| 38 | #define MP_NATIVE_TYPE_INT (0x02) |
| 39 | #define MP_NATIVE_TYPE_UINT (0x03) |
Damien George | 5f3e005 | 2016-02-02 23:16:05 +0000 | [diff] [blame] | 40 | #define MP_NATIVE_TYPE_PTR (0x04) |
| 41 | #define MP_NATIVE_TYPE_PTR8 (0x05) |
| 42 | #define MP_NATIVE_TYPE_PTR16 (0x06) |
| 43 | #define MP_NATIVE_TYPE_PTR32 (0x07) |
Damien George | 2ac4af6 | 2014-08-15 16:45:41 +0100 | [diff] [blame] | 44 | |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 45 | typedef enum { |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 46 | MP_UNARY_OP_BOOL, // __bool__ |
| 47 | MP_UNARY_OP_LEN, // __len__ |
Damien George | c2a4e4e | 2015-05-11 12:25:19 +0000 | [diff] [blame] | 48 | MP_UNARY_OP_HASH, // __hash__; must return a small int |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 49 | MP_UNARY_OP_POSITIVE, |
| 50 | MP_UNARY_OP_NEGATIVE, |
| 51 | MP_UNARY_OP_INVERT, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 52 | MP_UNARY_OP_NOT, |
Paul Sokolovsky | bfc2092 | 2017-08-11 09:42:39 +0300 | [diff] [blame] | 53 | MP_UNARY_OP_SIZEOF, // for sys.getsizeof() |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 54 | } mp_unary_op_t; |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 55 | |
| 56 | typedef enum { |
Paul Sokolovsky | d4d1c45 | 2017-09-07 10:55:43 +0300 | [diff] [blame] | 57 | // Relational operations, should return a bool |
| 58 | MP_BINARY_OP_LESS, |
| 59 | MP_BINARY_OP_MORE, |
| 60 | MP_BINARY_OP_EQUAL, |
| 61 | MP_BINARY_OP_LESS_EQUAL, |
| 62 | MP_BINARY_OP_MORE_EQUAL, |
Paul Sokolovsky | d4d1c45 | 2017-09-07 10:55:43 +0300 | [diff] [blame] | 63 | MP_BINARY_OP_NOT_EQUAL, |
Paul Sokolovsky | c460f6f | 2017-09-07 13:37:33 +0300 | [diff] [blame] | 64 | |
Paul Sokolovsky | d4d1c45 | 2017-09-07 10:55:43 +0300 | [diff] [blame] | 65 | MP_BINARY_OP_IN, |
| 66 | MP_BINARY_OP_IS, |
| 67 | MP_BINARY_OP_EXCEPTION_MATCH, |
| 68 | // these are not supported by the runtime and must be synthesised by the emitter |
| 69 | MP_BINARY_OP_NOT_IN, |
| 70 | MP_BINARY_OP_IS_NOT, |
| 71 | |
| 72 | // Arithmetic operations |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 73 | MP_BINARY_OP_INPLACE_OR, |
| 74 | MP_BINARY_OP_INPLACE_XOR, |
Damien George | c5029bc | 2015-06-13 22:00:10 +0100 | [diff] [blame] | 75 | MP_BINARY_OP_INPLACE_AND, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 76 | MP_BINARY_OP_INPLACE_LSHIFT, |
| 77 | MP_BINARY_OP_INPLACE_RSHIFT, |
| 78 | MP_BINARY_OP_INPLACE_ADD, |
Paul Sokolovsky | 070c78a | 2014-05-10 04:24:22 +0300 | [diff] [blame] | 79 | |
Paul Sokolovsky | c460f6f | 2017-09-07 13:37:33 +0300 | [diff] [blame] | 80 | MP_BINARY_OP_INPLACE_SUBTRACT, |
Damien George | c5029bc | 2015-06-13 22:00:10 +0100 | [diff] [blame] | 81 | MP_BINARY_OP_INPLACE_MULTIPLY, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 82 | MP_BINARY_OP_INPLACE_FLOOR_DIVIDE, |
| 83 | MP_BINARY_OP_INPLACE_TRUE_DIVIDE, |
| 84 | MP_BINARY_OP_INPLACE_MODULO, |
| 85 | MP_BINARY_OP_INPLACE_POWER, |
Paul Sokolovsky | 50b9329 | 2017-09-07 11:26:42 +0300 | [diff] [blame] | 86 | |
Paul Sokolovsky | b8ee7ab | 2017-09-08 00:10:10 +0300 | [diff] [blame] | 87 | MP_BINARY_OP_OR, |
| 88 | MP_BINARY_OP_XOR, |
| 89 | MP_BINARY_OP_AND, |
| 90 | MP_BINARY_OP_LSHIFT, |
| 91 | MP_BINARY_OP_RSHIFT, |
| 92 | MP_BINARY_OP_ADD, |
| 93 | |
| 94 | MP_BINARY_OP_SUBTRACT, |
| 95 | MP_BINARY_OP_MULTIPLY, |
| 96 | MP_BINARY_OP_FLOOR_DIVIDE, |
| 97 | MP_BINARY_OP_TRUE_DIVIDE, |
| 98 | MP_BINARY_OP_MODULO, |
| 99 | MP_BINARY_OP_POWER, |
| 100 | |
Paul Sokolovsky | 50b9329 | 2017-09-07 11:26:42 +0300 | [diff] [blame] | 101 | // Operations below this line don't appear in bytecode, they |
| 102 | // just identify special methods. |
| 103 | |
Paul Sokolovsky | eb84a83 | 2017-09-10 17:05:20 +0300 | [diff] [blame^] | 104 | // MP_BINARY_OP_REVERSE_* must follow immediately after MP_BINARY_OP_* |
| 105 | #if MICROPY_PY_REVERSE_SPECIAL_METHODS |
| 106 | MP_BINARY_OP_REVERSE_OR, |
| 107 | MP_BINARY_OP_REVERSE_XOR, |
| 108 | MP_BINARY_OP_REVERSE_AND, |
| 109 | MP_BINARY_OP_REVERSE_LSHIFT, |
| 110 | MP_BINARY_OP_REVERSE_RSHIFT, |
| 111 | MP_BINARY_OP_REVERSE_ADD, |
| 112 | |
| 113 | MP_BINARY_OP_REVERSE_SUBTRACT, |
| 114 | MP_BINARY_OP_REVERSE_MULTIPLY, |
| 115 | MP_BINARY_OP_REVERSE_FLOOR_DIVIDE, |
| 116 | MP_BINARY_OP_REVERSE_TRUE_DIVIDE, |
| 117 | MP_BINARY_OP_REVERSE_MODULO, |
| 118 | MP_BINARY_OP_REVERSE_POWER, |
| 119 | #endif |
| 120 | |
Paul Sokolovsky | 50b9329 | 2017-09-07 11:26:42 +0300 | [diff] [blame] | 121 | MP_BINARY_OP_DIVMOD, // not emitted by the compiler but supported by the runtime |
Paul Sokolovsky | 6d4cac0 | 2017-09-07 12:54:58 +0300 | [diff] [blame] | 122 | |
| 123 | MP_BINARY_OP_LAST, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 124 | } mp_binary_op_t; |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 125 | |
| 126 | typedef enum { |
Damien George | e6c0dff | 2014-08-15 23:47:59 +0100 | [diff] [blame] | 127 | MP_F_CONVERT_OBJ_TO_NATIVE = 0, |
| 128 | MP_F_CONVERT_NATIVE_TO_OBJ, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 129 | MP_F_LOAD_NAME, |
| 130 | MP_F_LOAD_GLOBAL, |
| 131 | MP_F_LOAD_BUILD_CLASS, |
| 132 | MP_F_LOAD_ATTR, |
| 133 | MP_F_LOAD_METHOD, |
Damien George | dd11af2 | 2017-04-19 09:45:59 +1000 | [diff] [blame] | 134 | MP_F_LOAD_SUPER_METHOD, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 135 | MP_F_STORE_NAME, |
Damien George | e6c0dff | 2014-08-15 23:47:59 +0100 | [diff] [blame] | 136 | MP_F_STORE_GLOBAL, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 137 | MP_F_STORE_ATTR, |
Damien George | 729f7b4 | 2014-04-17 22:10:53 +0100 | [diff] [blame] | 138 | MP_F_OBJ_SUBSCR, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 139 | MP_F_OBJ_IS_TRUE, |
| 140 | MP_F_UNARY_OP, |
| 141 | MP_F_BINARY_OP, |
| 142 | MP_F_BUILD_TUPLE, |
| 143 | MP_F_BUILD_LIST, |
| 144 | MP_F_LIST_APPEND, |
| 145 | MP_F_BUILD_MAP, |
| 146 | MP_F_STORE_MAP, |
Damien George | 3ebd4d0 | 2014-06-01 13:46:47 +0100 | [diff] [blame] | 147 | #if MICROPY_PY_BUILTINS_SET |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 148 | MP_F_BUILD_SET, |
| 149 | MP_F_STORE_SET, |
Damien George | 3ebd4d0 | 2014-06-01 13:46:47 +0100 | [diff] [blame] | 150 | #endif |
Damien George | df8127a | 2014-04-13 11:04:33 +0100 | [diff] [blame] | 151 | MP_F_MAKE_FUNCTION_FROM_RAW_CODE, |
Damien George | 86de21b | 2014-08-16 22:06:11 +0100 | [diff] [blame] | 152 | MP_F_NATIVE_CALL_FUNCTION_N_KW, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 153 | MP_F_CALL_METHOD_N_KW, |
Damien George | 78772ad | 2015-04-06 22:48:21 +0100 | [diff] [blame] | 154 | MP_F_CALL_METHOD_N_KW_VAR, |
Damien George | 088740e | 2017-01-17 15:27:37 +1100 | [diff] [blame] | 155 | MP_F_NATIVE_GETITER, |
| 156 | MP_F_NATIVE_ITERNEXT, |
Damien George | 7fe2191 | 2014-08-16 22:31:57 +0100 | [diff] [blame] | 157 | MP_F_NLR_PUSH, |
| 158 | MP_F_NLR_POP, |
Damien George | 86de21b | 2014-08-16 22:06:11 +0100 | [diff] [blame] | 159 | MP_F_NATIVE_RAISE, |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 160 | MP_F_IMPORT_NAME, |
Damien George | 7fe2191 | 2014-08-16 22:31:57 +0100 | [diff] [blame] | 161 | MP_F_IMPORT_FROM, |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 162 | MP_F_IMPORT_ALL, |
Damien George | c49ddb9 | 2014-06-01 13:49:35 +0100 | [diff] [blame] | 163 | #if MICROPY_PY_BUILTINS_SLICE |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 164 | MP_F_NEW_SLICE, |
Damien George | c49ddb9 | 2014-06-01 13:49:35 +0100 | [diff] [blame] | 165 | #endif |
Damien George | cdd96df | 2014-04-06 12:58:40 +0100 | [diff] [blame] | 166 | MP_F_UNPACK_SEQUENCE, |
Damien George | a32c1e4 | 2014-05-07 18:30:52 +0100 | [diff] [blame] | 167 | MP_F_UNPACK_EX, |
Damien George | e6ce10a | 2014-09-06 18:38:20 +0100 | [diff] [blame] | 168 | MP_F_DELETE_NAME, |
| 169 | MP_F_DELETE_GLOBAL, |
Damien George | 4cd9ced | 2015-01-15 14:41:41 +0000 | [diff] [blame] | 170 | MP_F_NEW_CELL, |
| 171 | MP_F_MAKE_CLOSURE_FROM_RAW_CODE, |
Damien George | 9988618 | 2015-04-06 22:38:53 +0100 | [diff] [blame] | 172 | MP_F_SETUP_CODE_STATE, |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 173 | MP_F_NUMBER_OF, |
| 174 | } mp_fun_kind_t; |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 175 | |
Damien George | d17926d | 2014-03-30 13:35:08 +0100 | [diff] [blame] | 176 | extern void *const mp_fun_table[MP_F_NUMBER_OF]; |
Paul Sokolovsky | 8ab6f90 | 2014-12-25 23:29:19 +0200 | [diff] [blame] | 177 | |
Alexander Steffen | 299bc62 | 2017-06-29 23:14:58 +0200 | [diff] [blame] | 178 | #endif // MICROPY_INCLUDED_PY_RUNTIME0_H |