1 /*
2  * This file is part of the MicroPython 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 #ifndef MICROPY_INCLUDED_PY_MPCONFIG_H
27 #define MICROPY_INCLUDED_PY_MPCONFIG_H
28 
29 // Current version of MicroPython
30 #define MICROPY_VERSION_MAJOR 1
31 #define MICROPY_VERSION_MINOR 17
32 #define MICROPY_VERSION_MICRO 0
33 
34 // Combined version as a 32-bit number for convenience
35 #define MICROPY_VERSION ( \
36     MICROPY_VERSION_MAJOR << 16 \
37         | MICROPY_VERSION_MINOR << 8 \
38         | MICROPY_VERSION_MICRO)
39 
40 // String version
41 #define MICROPY_VERSION_STRING \
42     MP_STRINGIFY(MICROPY_VERSION_MAJOR) "." \
43     MP_STRINGIFY(MICROPY_VERSION_MINOR) "." \
44     MP_STRINGIFY(MICROPY_VERSION_MICRO)
45 
46 // This file contains default configuration settings for MicroPython.
47 // You can override any of the options below using mpconfigport.h file
48 // located in a directory of your port.
49 
50 // mpconfigport.h is a file containing configuration settings for a
51 // particular port. mpconfigport.h is actually a default name for
52 // such config, and it can be overridden using MP_CONFIGFILE preprocessor
53 // define (you can do that by passing CFLAGS_EXTRA='-DMP_CONFIGFILE="<file.h>"'
54 // argument to make when using standard MicroPython makefiles).
55 // This is useful to have more than one config per port, for example,
56 // release vs debug configs, etc. Note that if you switch from one config
57 // to another, you must rebuild from scratch using "-B" switch to make.
58 
59 #ifdef MP_CONFIGFILE
60 #include MP_CONFIGFILE
61 #else
62 #include <mpconfigport.h>
63 #endif
64 
65 // Any options not explicitly set in mpconfigport.h will get default
66 // values below.
67 
68 /*****************************************************************************/
69 /* Object representation                                                     */
70 
71 // A MicroPython object is a machine word having the following form:
72 //  - xxxx...xxx1 : a small int, bits 1 and above are the value
73 //  - xxxx...x010 : a qstr, bits 3 and above are the value
74 //  - xxxx...x110 : an immediate object, bits 3 and above are the value
75 //  - xxxx...xx00 : a pointer to an mp_obj_base_t (unless a fake object)
76 #define MICROPY_OBJ_REPR_A (0)
77 
78 // A MicroPython object is a machine word having the following form:
79 //  - xxxx...xx01 : a small int, bits 2 and above are the value
80 //  - xxxx...x011 : a qstr, bits 3 and above are the value
81 //  - xxxx...x111 : an immediate object, bits 3 and above are the value
82 //  - xxxx...xxx0 : a pointer to an mp_obj_base_t (unless a fake object)
83 #define MICROPY_OBJ_REPR_B (1)
84 
85 // A MicroPython object is a machine word having the following form (called R):
86 //  - iiiiiiii iiiiiiii iiiiiiii iiiiiii1 small int with 31-bit signed value
87 //  - 01111111 1qqqqqqq qqqqqqqq qqqq0110 str with 19-bit qstr value
88 //  - 01111111 10000000 00000000 ssss1110 immediate object with 4-bit value
89 //  - s1111111 10000000 00000000 00000010 +/- inf
90 //  - s1111111 1xxxxxxx xxxxxxxx xxxxx010 nan, x != 0
91 //  - seeeeeee efffffff ffffffff ffffff10 30-bit fp, e != 0xff
92 //  - pppppppp pppppppp pppppppp pppppp00 ptr (4 byte alignment)
93 // Str, immediate and float stored as O = R + 0x80800000, retrieved as R = O - 0x80800000.
94 // This makes strs/immediates easier to encode/decode as they have zeros in the top 9 bits.
95 // This scheme only works with 32-bit word size and float enabled.
96 #define MICROPY_OBJ_REPR_C (2)
97 
98 // A MicroPython object is a 64-bit word having the following form (called R):
99 //  - seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 64-bit fp, e != 0x7ff
100 //  - s1111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000 +/- inf
101 //  - 01111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000 normalised nan
102 //  - 01111111 11111101 iiiiiiii iiiiiiii iiiiiiii iiiiiiii iiiiiiii iiiiiii1 small int
103 //  - 01111111 11111110 00000000 00000000 qqqqqqqq qqqqqqqq qqqqqqqq qqqqqqq1 str
104 //  - 01111111 11111111 ss000000 00000000 00000000 00000000 00000000 00000000 immediate object
105 //  - 01111111 11111100 00000000 00000000 pppppppp pppppppp pppppppp pppppp00 ptr (4 byte alignment)
106 // Stored as O = R + 0x8004000000000000, retrieved as R = O - 0x8004000000000000.
107 // This makes pointers have all zeros in the top 32 bits.
108 // Small-ints and strs have 1 as LSB to make sure they don't look like pointers
109 // to the garbage collector.
110 #define MICROPY_OBJ_REPR_D (3)
111 
112 #ifndef MICROPY_OBJ_REPR
113 #define MICROPY_OBJ_REPR (MICROPY_OBJ_REPR_A)
114 #endif
115 
116 // Whether to encode None/False/True as immediate objects instead of pointers to
117 // real objects.  Reduces code size by a decent amount without hurting
118 // performance, for all representations except D on some architectures.
119 #ifndef MICROPY_OBJ_IMMEDIATE_OBJS
120 #define MICROPY_OBJ_IMMEDIATE_OBJS (MICROPY_OBJ_REPR != MICROPY_OBJ_REPR_D)
121 #endif
122 
123 /*****************************************************************************/
124 /* Memory allocation policy                                                  */
125 
126 // Number of bytes in memory allocation/GC block. Any size allocated will be
127 // rounded up to be multiples of this.
128 #ifndef MICROPY_BYTES_PER_GC_BLOCK
129 #define MICROPY_BYTES_PER_GC_BLOCK (4 * MP_BYTES_PER_OBJ_WORD)
130 #endif
131 
132 // Number of words allocated (in BSS) to the GC stack (minimum is 1)
133 #ifndef MICROPY_ALLOC_GC_STACK_SIZE
134 #define MICROPY_ALLOC_GC_STACK_SIZE (64)
135 #endif
136 
137 // The C-type to use for entries in the GC stack.  By default it allows the
138 // heap to be as large as the address space, but the bit-width of this type can
139 // be reduced to save memory when the heap is small enough.  The type must be
140 // big enough to index all blocks in the heap, which is set by
141 // heap-size-in-bytes / MICROPY_BYTES_PER_GC_BLOCK.
142 #ifndef MICROPY_GC_STACK_ENTRY_TYPE
143 #define MICROPY_GC_STACK_ENTRY_TYPE size_t
144 #endif
145 
146 // Be conservative and always clear to zero newly (re)allocated memory in the GC.
147 // This helps eliminate stray pointers that hold on to memory that's no longer
148 // used.  It decreases performance due to unnecessary memory clearing.
149 // A memory manager which always clears memory can set this to 0.
150 // TODO Do analysis to understand why some memory is not properly cleared and
151 // find a more efficient way to clear it.
152 #ifndef MICROPY_GC_CONSERVATIVE_CLEAR
153 #define MICROPY_GC_CONSERVATIVE_CLEAR (MICROPY_ENABLE_GC)
154 #endif
155 
156 // Support automatic GC when reaching allocation threshold,
157 // configurable by gc.threshold().
158 #ifndef MICROPY_GC_ALLOC_THRESHOLD
159 #define MICROPY_GC_ALLOC_THRESHOLD (1)
160 #endif
161 
162 // Number of bytes to allocate initially when creating new chunks to store
163 // interned string data.  Smaller numbers lead to more chunks being needed
164 // and more wastage at the end of the chunk.  Larger numbers lead to wasted
165 // space at the end when no more strings need interning.
166 #ifndef MICROPY_ALLOC_QSTR_CHUNK_INIT
167 #define MICROPY_ALLOC_QSTR_CHUNK_INIT (128)
168 #endif
169 
170 // Initial amount for lexer indentation level
171 #ifndef MICROPY_ALLOC_LEXER_INDENT_INIT
172 #define MICROPY_ALLOC_LEXER_INDENT_INIT (10)
173 #endif
174 
175 // Increment for lexer indentation level
176 #ifndef MICROPY_ALLOC_LEXEL_INDENT_INC
177 #define MICROPY_ALLOC_LEXEL_INDENT_INC (8)
178 #endif
179 
180 // Initial amount for parse rule stack
181 #ifndef MICROPY_ALLOC_PARSE_RULE_INIT
182 #define MICROPY_ALLOC_PARSE_RULE_INIT (64)
183 #endif
184 
185 // Increment for parse rule stack
186 #ifndef MICROPY_ALLOC_PARSE_RULE_INC
187 #define MICROPY_ALLOC_PARSE_RULE_INC (16)
188 #endif
189 
190 // Initial amount for parse result stack
191 #ifndef MICROPY_ALLOC_PARSE_RESULT_INIT
192 #define MICROPY_ALLOC_PARSE_RESULT_INIT (32)
193 #endif
194 
195 // Increment for parse result stack
196 #ifndef MICROPY_ALLOC_PARSE_RESULT_INC
197 #define MICROPY_ALLOC_PARSE_RESULT_INC (16)
198 #endif
199 
200 // Strings this length or less will be interned by the parser
201 #ifndef MICROPY_ALLOC_PARSE_INTERN_STRING_LEN
202 #define MICROPY_ALLOC_PARSE_INTERN_STRING_LEN (10)
203 #endif
204 
205 // Number of bytes to allocate initially when creating new chunks to store
206 // parse nodes.  Small leads to fragmentation, large leads to excess use.
207 #ifndef MICROPY_ALLOC_PARSE_CHUNK_INIT
208 #define MICROPY_ALLOC_PARSE_CHUNK_INIT (128)
209 #endif
210 
211 // Initial amount for ids in a scope
212 #ifndef MICROPY_ALLOC_SCOPE_ID_INIT
213 #define MICROPY_ALLOC_SCOPE_ID_INIT (4)
214 #endif
215 
216 // Increment for ids in a scope
217 #ifndef MICROPY_ALLOC_SCOPE_ID_INC
218 #define MICROPY_ALLOC_SCOPE_ID_INC (6)
219 #endif
220 
221 // Maximum length of a path in the filesystem
222 // So we can allocate a buffer on the stack for path manipulation in import
223 #ifndef MICROPY_ALLOC_PATH_MAX
224 #define MICROPY_ALLOC_PATH_MAX (512)
225 #endif
226 
227 // Initial size of module dict
228 #ifndef MICROPY_MODULE_DICT_SIZE
229 #define MICROPY_MODULE_DICT_SIZE (1)
230 #endif
231 
232 // Initial size of sys.modules dict
233 #ifndef MICROPY_LOADED_MODULES_DICT_SIZE
234 #define MICROPY_LOADED_MODULES_DICT_SIZE (3)
235 #endif
236 
237 // Whether realloc/free should be passed allocated memory region size
238 // You must enable this if MICROPY_MEM_STATS is enabled
239 #ifndef MICROPY_MALLOC_USES_ALLOCATED_SIZE
240 #define MICROPY_MALLOC_USES_ALLOCATED_SIZE (0)
241 #endif
242 
243 // Number of bytes used to store qstr length
244 // Dictates hard limit on maximum Python identifier length, but 1 byte
245 // (limit of 255 bytes in an identifier) should be enough for everyone
246 #ifndef MICROPY_QSTR_BYTES_IN_LEN
247 #define MICROPY_QSTR_BYTES_IN_LEN (1)
248 #endif
249 
250 // Number of bytes used to store qstr hash
251 #ifndef MICROPY_QSTR_BYTES_IN_HASH
252 #define MICROPY_QSTR_BYTES_IN_HASH (2)
253 #endif
254 
255 // Avoid using C stack when making Python function calls. C stack still
256 // may be used if there's no free heap.
257 #ifndef MICROPY_STACKLESS
258 #define MICROPY_STACKLESS (0)
259 #endif
260 
261 // Never use C stack when making Python function calls. This may break
262 // testsuite as will subtly change which exception is thrown in case
263 // of too deep recursion and other similar cases.
264 #ifndef MICROPY_STACKLESS_STRICT
265 #define MICROPY_STACKLESS_STRICT (0)
266 #endif
267 
268 // Don't use alloca calls. As alloca() is not part of ANSI C, this
269 // workaround option is provided for compilers lacking this de-facto
270 // standard function. The way it works is allocating from heap, and
271 // relying on garbage collection to free it eventually. This is of
272 // course much less optimal than real alloca().
273 #if defined(MICROPY_NO_ALLOCA) && MICROPY_NO_ALLOCA
274 #undef alloca
275 #define alloca(x) m_malloc(x)
276 #endif
277 
278 /*****************************************************************************/
279 /* MicroPython emitters                                                     */
280 
281 // Whether to support loading of persistent code
282 #ifndef MICROPY_PERSISTENT_CODE_LOAD
283 #define MICROPY_PERSISTENT_CODE_LOAD (0)
284 #endif
285 
286 // Whether to support saving of persistent code
287 #ifndef MICROPY_PERSISTENT_CODE_SAVE
288 #define MICROPY_PERSISTENT_CODE_SAVE (0)
289 #endif
290 
291 // Whether to support saving persistent code to a file via mp_raw_code_save_file
292 #ifndef MICROPY_PERSISTENT_CODE_SAVE_FILE
293 #define MICROPY_PERSISTENT_CODE_SAVE_FILE (0)
294 #endif
295 
296 // Whether generated code can persist independently of the VM/runtime instance
297 // This is enabled automatically when needed by other features
298 #ifndef MICROPY_PERSISTENT_CODE
299 #define MICROPY_PERSISTENT_CODE (MICROPY_PERSISTENT_CODE_LOAD || MICROPY_PERSISTENT_CODE_SAVE || MICROPY_MODULE_FROZEN_MPY)
300 #endif
301 
302 // Whether to emit x64 native code
303 #ifndef MICROPY_EMIT_X64
304 #define MICROPY_EMIT_X64 (0)
305 #endif
306 
307 // Whether to emit x86 native code
308 #ifndef MICROPY_EMIT_X86
309 #define MICROPY_EMIT_X86 (0)
310 #endif
311 
312 // Whether to emit thumb native code
313 #ifndef MICROPY_EMIT_THUMB
314 #define MICROPY_EMIT_THUMB (0)
315 #endif
316 
317 // Whether to emit ARMv7-M instruction support in thumb native code
318 #ifndef MICROPY_EMIT_THUMB_ARMV7M
319 #define MICROPY_EMIT_THUMB_ARMV7M (1)
320 #endif
321 
322 // Whether to enable the thumb inline assembler
323 #ifndef MICROPY_EMIT_INLINE_THUMB
324 #define MICROPY_EMIT_INLINE_THUMB (0)
325 #endif
326 
327 // Whether to enable ARMv7-M instruction support in the Thumb2 inline assembler
328 #ifndef MICROPY_EMIT_INLINE_THUMB_ARMV7M
329 #define MICROPY_EMIT_INLINE_THUMB_ARMV7M (1)
330 #endif
331 
332 // Whether to enable float support in the Thumb2 inline assembler
333 #ifndef MICROPY_EMIT_INLINE_THUMB_FLOAT
334 #define MICROPY_EMIT_INLINE_THUMB_FLOAT (1)
335 #endif
336 
337 // Whether to emit ARM native code
338 #ifndef MICROPY_EMIT_ARM
339 #define MICROPY_EMIT_ARM (0)
340 #endif
341 
342 // Whether to emit Xtensa native code
343 #ifndef MICROPY_EMIT_XTENSA
344 #define MICROPY_EMIT_XTENSA (0)
345 #endif
346 
347 // Whether to enable the Xtensa inline assembler
348 #ifndef MICROPY_EMIT_INLINE_XTENSA
349 #define MICROPY_EMIT_INLINE_XTENSA (0)
350 #endif
351 
352 // Whether to emit Xtensa-Windowed native code
353 #ifndef MICROPY_EMIT_XTENSAWIN
354 #define MICROPY_EMIT_XTENSAWIN (0)
355 #endif
356 
357 // Convenience definition for whether any native emitter is enabled
358 #define MICROPY_EMIT_NATIVE (MICROPY_EMIT_X64 || MICROPY_EMIT_X86 || MICROPY_EMIT_THUMB || MICROPY_EMIT_ARM || MICROPY_EMIT_XTENSA || MICROPY_EMIT_XTENSAWIN)
359 
360 // Select prelude-as-bytes-object for certain emitters
361 #define MICROPY_EMIT_NATIVE_PRELUDE_AS_BYTES_OBJ (MICROPY_EMIT_XTENSAWIN)
362 
363 // Convenience definition for whether any inline assembler emitter is enabled
364 #define MICROPY_EMIT_INLINE_ASM (MICROPY_EMIT_INLINE_THUMB || MICROPY_EMIT_INLINE_XTENSA)
365 
366 // Convenience definition for whether any native or inline assembler emitter is enabled
367 #define MICROPY_EMIT_MACHINE_CODE (MICROPY_EMIT_NATIVE || MICROPY_EMIT_INLINE_ASM)
368 
369 // Whether native relocatable code loaded from .mpy files is explicitly tracked
370 // so that the GC cannot reclaim it.  Needed on architectures that allocate
371 // executable memory on the MicroPython heap and don't explicitly track this
372 // data some other way.
373 #ifndef MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE
374 #if !MICROPY_EMIT_MACHINE_CODE || defined(MP_PLAT_ALLOC_EXEC) || defined(MP_PLAT_COMMIT_EXEC)
375 #define MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE (0)
376 #else
377 #define MICROPY_PERSISTENT_CODE_TRACK_RELOC_CODE (1)
378 #endif
379 #endif
380 
381 /*****************************************************************************/
382 /* Compiler configuration                                                    */
383 
384 // Whether to include the compiler
385 #ifndef MICROPY_ENABLE_COMPILER
386 #define MICROPY_ENABLE_COMPILER (1)
387 #endif
388 
389 // Whether the compiler is dynamically configurable (ie at runtime)
390 // This will disable the ability to execute native/viper code
391 #ifndef MICROPY_DYNAMIC_COMPILER
392 #define MICROPY_DYNAMIC_COMPILER (0)
393 #endif
394 
395 // Configure dynamic compiler macros
396 #if MICROPY_DYNAMIC_COMPILER
397 #define MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE_DYNAMIC (mp_dynamic_compiler.opt_cache_map_lookup_in_bytecode)
398 #define MICROPY_PY_BUILTINS_STR_UNICODE_DYNAMIC (mp_dynamic_compiler.py_builtins_str_unicode)
399 #else
400 #define MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE_DYNAMIC MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE
401 #define MICROPY_PY_BUILTINS_STR_UNICODE_DYNAMIC MICROPY_PY_BUILTINS_STR_UNICODE
402 #endif
403 
404 // Whether to enable constant folding; eg 1+2 rewritten as 3
405 #ifndef MICROPY_COMP_CONST_FOLDING
406 #define MICROPY_COMP_CONST_FOLDING (1)
407 #endif
408 
409 // Whether to enable optimisations for constant literals, eg OrderedDict
410 #ifndef MICROPY_COMP_CONST_LITERAL
411 #define MICROPY_COMP_CONST_LITERAL (1)
412 #endif
413 
414 // Whether to enable lookup of constants in modules; eg module.CONST
415 #ifndef MICROPY_COMP_MODULE_CONST
416 #define MICROPY_COMP_MODULE_CONST (0)
417 #endif
418 
419 // Whether to enable constant optimisation; id = const(value)
420 #ifndef MICROPY_COMP_CONST
421 #define MICROPY_COMP_CONST (1)
422 #endif
423 
424 // Whether to enable optimisation of: a, b = c, d
425 // Costs 124 bytes (Thumb2)
426 #ifndef MICROPY_COMP_DOUBLE_TUPLE_ASSIGN
427 #define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN (1)
428 #endif
429 
430 // Whether to enable optimisation of: a, b, c = d, e, f
431 // Requires MICROPY_COMP_DOUBLE_TUPLE_ASSIGN and costs 68 bytes (Thumb2)
432 #ifndef MICROPY_COMP_TRIPLE_TUPLE_ASSIGN
433 #define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (0)
434 #endif
435 
436 // Whether to enable optimisation of: return a if b else c
437 // Costs about 80 bytes (Thumb2) and saves 2 bytes of bytecode for each use
438 #ifndef MICROPY_COMP_RETURN_IF_EXPR
439 #define MICROPY_COMP_RETURN_IF_EXPR (0)
440 #endif
441 
442 /*****************************************************************************/
443 /* Internal debugging stuff                                                  */
444 
445 // Whether to collect memory allocation stats
446 #ifndef MICROPY_MEM_STATS
447 #define MICROPY_MEM_STATS (0)
448 #endif
449 
450 // The mp_print_t printer used for debugging output
451 #ifndef MICROPY_DEBUG_PRINTER
452 #define MICROPY_DEBUG_PRINTER (&mp_plat_print)
453 #endif
454 
455 // Whether to build functions that print debugging info:
456 //   mp_bytecode_print
457 //   mp_parse_node_print
458 #ifndef MICROPY_DEBUG_PRINTERS
459 #define MICROPY_DEBUG_PRINTERS (0)
460 #endif
461 
462 // Whether to enable all debugging outputs (it will be extremely verbose)
463 #ifndef MICROPY_DEBUG_VERBOSE
464 #define MICROPY_DEBUG_VERBOSE (0)
465 #endif
466 
467 // Whether to enable debugging versions of MP_OBJ_NULL/STOP_ITERATION/SENTINEL
468 #ifndef MICROPY_DEBUG_MP_OBJ_SENTINELS
469 #define MICROPY_DEBUG_MP_OBJ_SENTINELS (0)
470 #endif
471 
472 // Whether to print parse rule names (rather than integers) in mp_parse_node_print
473 #ifndef MICROPY_DEBUG_PARSE_RULE_NAME
474 #define MICROPY_DEBUG_PARSE_RULE_NAME (0)
475 #endif
476 
477 // Whether to enable a simple VM stack overflow check
478 #ifndef MICROPY_DEBUG_VM_STACK_OVERFLOW
479 #define MICROPY_DEBUG_VM_STACK_OVERFLOW (0)
480 #endif
481 
482 /*****************************************************************************/
483 /* Optimisations                                                             */
484 
485 // Whether to use computed gotos in the VM, or a switch
486 // Computed gotos are roughly 10% faster, and increase VM code size by a little,
487 // e.g. ~1kiB on Cortex M4.
488 // Note: enabling this will use the gcc-specific extensions of ranged designated
489 // initialisers and addresses of labels, which are not part of the C99 standard.
490 #ifndef MICROPY_OPT_COMPUTED_GOTO
491 #define MICROPY_OPT_COMPUTED_GOTO (0)
492 #endif
493 
494 // Whether to cache result of map lookups in LOAD_NAME, LOAD_GLOBAL, LOAD_ATTR,
495 // STORE_ATTR bytecodes.  Uses 1 byte extra RAM for each of these opcodes and
496 // uses a bit of extra code ROM, but greatly improves lookup speed.
497 #ifndef MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE
498 #define MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE (0)
499 #endif
500 
501 // Whether to use fast versions of bitwise operations (and, or, xor) when the
502 // arguments are both positive.  Increases Thumb2 code size by about 250 bytes.
503 #ifndef MICROPY_OPT_MPZ_BITWISE
504 #define MICROPY_OPT_MPZ_BITWISE (0)
505 #endif
506 
507 
508 // Whether math.factorial is large, fast and recursive (1) or small and slow (0).
509 #ifndef MICROPY_OPT_MATH_FACTORIAL
510 #define MICROPY_OPT_MATH_FACTORIAL (0)
511 #endif
512 
513 /*****************************************************************************/
514 /* Python internal features                                                  */
515 
516 // Whether to enable import of external modules
517 // When disabled, only importing of built-in modules is supported
518 // When enabled, a port must implement mp_import_stat (among other things)
519 #ifndef MICROPY_ENABLE_EXTERNAL_IMPORT
520 #define MICROPY_ENABLE_EXTERNAL_IMPORT (1)
521 #endif
522 
523 // Whether to use the POSIX reader for importing files
524 #ifndef MICROPY_READER_POSIX
525 #define MICROPY_READER_POSIX (0)
526 #endif
527 
528 // Whether to use the VFS reader for importing files
529 #ifndef MICROPY_READER_VFS
530 #define MICROPY_READER_VFS (0)
531 #endif
532 
533 // Whether any readers have been defined
534 #ifndef MICROPY_HAS_FILE_READER
535 #define MICROPY_HAS_FILE_READER (MICROPY_READER_POSIX || MICROPY_READER_VFS)
536 #endif
537 
538 // Hook for the VM at the start of the opcode loop (can contain variable
539 // definitions usable by the other hook functions)
540 #ifndef MICROPY_VM_HOOK_INIT
541 #define MICROPY_VM_HOOK_INIT
542 #endif
543 
544 // Hook for the VM during the opcode loop (but only after jump opcodes)
545 #ifndef MICROPY_VM_HOOK_LOOP
546 #define MICROPY_VM_HOOK_LOOP
547 #endif
548 
549 // Hook for the VM just before return opcode is finished being interpreted
550 #ifndef MICROPY_VM_HOOK_RETURN
551 #define MICROPY_VM_HOOK_RETURN
552 #endif
553 
554 // Hook for mp_sched_schedule when a function gets scheduled on sched_queue
555 // (this macro executes within an atomic section)
556 #ifndef MICROPY_SCHED_HOOK_SCHEDULED
557 #define MICROPY_SCHED_HOOK_SCHEDULED
558 #endif
559 
560 // Whether to include the garbage collector
561 #ifndef MICROPY_ENABLE_GC
562 #define MICROPY_ENABLE_GC (0)
563 #endif
564 
565 // Whether to enable finalisers in the garbage collector (ie call __del__)
566 #ifndef MICROPY_ENABLE_FINALISER
567 #define MICROPY_ENABLE_FINALISER (0)
568 #endif
569 
570 // Whether to enable a separate allocator for the Python stack.
571 // If enabled then the code must call mp_pystack_init before mp_init.
572 #ifndef MICROPY_ENABLE_PYSTACK
573 #define MICROPY_ENABLE_PYSTACK (0)
574 #endif
575 
576 // Number of bytes that memory returned by mp_pystack_alloc will be aligned by.
577 #ifndef MICROPY_PYSTACK_ALIGN
578 #define MICROPY_PYSTACK_ALIGN (8)
579 #endif
580 
581 // Whether to check C stack usage. C stack used for calling Python functions,
582 // etc. Not checking means segfault on overflow.
583 #ifndef MICROPY_STACK_CHECK
584 #define MICROPY_STACK_CHECK (0)
585 #endif
586 
587 // Whether to have an emergency exception buffer
588 #ifndef MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
589 #define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (0)
590 #endif
591 #if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF
592 #ifndef MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE
593 #define MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE (0)      // 0 - implies dynamic allocation
594 #endif
595 #endif
596 
597 // Whether to provide the mp_kbd_exception object, and micropython.kbd_intr function
598 #ifndef MICROPY_KBD_EXCEPTION
599 #define MICROPY_KBD_EXCEPTION (0)
600 #endif
601 
602 // Prefer to raise KeyboardInterrupt asynchronously (from signal or interrupt
603 // handler) - if supported by a particular port.
604 #ifndef MICROPY_ASYNC_KBD_INTR
605 #define MICROPY_ASYNC_KBD_INTR (0)
606 #endif
607 
608 // Whether to include REPL helper function
609 #ifndef MICROPY_HELPER_REPL
610 #define MICROPY_HELPER_REPL (0)
611 #endif
612 
613 // Allow enabling debug prints after each REPL line
614 #ifndef MICROPY_REPL_INFO
615 #define MICROPY_REPL_INFO (0)
616 #endif
617 
618 // Whether to include emacs-style readline behavior in REPL
619 #ifndef MICROPY_REPL_EMACS_KEYS
620 #define MICROPY_REPL_EMACS_KEYS (0)
621 #endif
622 
623 // Whether to include emacs-style word movement/kill readline behavior in REPL.
624 // This adds Alt+F, Alt+B, Alt+D and Alt+Backspace for forward-word, backward-word, forward-kill-word
625 // and backward-kill-word, respectively.
626 #ifndef MICROPY_REPL_EMACS_WORDS_MOVE
627 #define MICROPY_REPL_EMACS_WORDS_MOVE (0)
628 #endif
629 
630 // Whether to include extra convenience keys for word movement/kill in readline REPL.
631 // This adds Ctrl+Right, Ctrl+Left and Ctrl+W for forward-word, backward-word and backward-kill-word
632 // respectively. Ctrl+Delete is not implemented because it's a very different escape sequence.
633 // Depends on MICROPY_REPL_EMACS_WORDS_MOVE.
634 #ifndef MICROPY_REPL_EMACS_EXTRA_WORDS_MOVE
635 #define MICROPY_REPL_EMACS_EXTRA_WORDS_MOVE (0)
636 #endif
637 
638 // Whether to implement auto-indent in REPL
639 #ifndef MICROPY_REPL_AUTO_INDENT
640 #define MICROPY_REPL_AUTO_INDENT (0)
641 #endif
642 
643 // Whether port requires event-driven REPL functions
644 #ifndef MICROPY_REPL_EVENT_DRIVEN
645 #define MICROPY_REPL_EVENT_DRIVEN (0)
646 #endif
647 
648 // Whether to include lexer helper function for unix
649 #ifndef MICROPY_HELPER_LEXER_UNIX
650 #define MICROPY_HELPER_LEXER_UNIX (0)
651 #endif
652 
653 // Long int implementation
654 #define MICROPY_LONGINT_IMPL_NONE (0)
655 #define MICROPY_LONGINT_IMPL_LONGLONG (1)
656 #define MICROPY_LONGINT_IMPL_MPZ (2)
657 
658 #ifndef MICROPY_LONGINT_IMPL
659 #define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_NONE)
660 #endif
661 
662 #if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_LONGLONG
663 typedef long long mp_longint_impl_t;
664 #endif
665 
666 // Whether to include information in the byte code to determine source
667 // line number (increases RAM usage, but doesn't slow byte code execution)
668 #ifndef MICROPY_ENABLE_SOURCE_LINE
669 #define MICROPY_ENABLE_SOURCE_LINE (0)
670 #endif
671 
672 // Whether to include doc strings (increases RAM usage)
673 #ifndef MICROPY_ENABLE_DOC_STRING
674 #define MICROPY_ENABLE_DOC_STRING (0)
675 #endif
676 
677 // Exception messages are removed (requires disabling MICROPY_ROM_TEXT_COMPRESSION)
678 #define MICROPY_ERROR_REPORTING_NONE     (0)
679 // Exception messages are short static strings
680 #define MICROPY_ERROR_REPORTING_TERSE    (1)
681 // Exception messages provide basic error details
682 #define MICROPY_ERROR_REPORTING_NORMAL   (2)
683 // Exception messages provide full info, e.g. object names
684 #define MICROPY_ERROR_REPORTING_DETAILED (3)
685 
686 #ifndef MICROPY_ERROR_REPORTING
687 #define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_NORMAL)
688 #endif
689 
690 // Whether issue warnings during compiling/execution
691 #ifndef MICROPY_WARNINGS
692 #define MICROPY_WARNINGS (0)
693 #endif
694 
695 // Whether to support warning categories
696 #ifndef MICROPY_WARNINGS_CATEGORY
697 #define MICROPY_WARNINGS_CATEGORY (0)
698 #endif
699 
700 // This macro is used when printing runtime warnings and errors
701 #ifndef MICROPY_ERROR_PRINTER
702 #define MICROPY_ERROR_PRINTER (&mp_plat_print)
703 #endif
704 
705 // Float and complex implementation
706 #define MICROPY_FLOAT_IMPL_NONE (0)
707 #define MICROPY_FLOAT_IMPL_FLOAT (1)
708 #define MICROPY_FLOAT_IMPL_DOUBLE (2)
709 
710 #ifndef MICROPY_FLOAT_IMPL
711 #define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_NONE)
712 #endif
713 
714 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT
715 #define MICROPY_PY_BUILTINS_FLOAT (1)
716 #define MICROPY_FLOAT_CONST(x) x##F
717 #define MICROPY_FLOAT_C_FUN(fun) fun##f
718 typedef float mp_float_t;
719 #elif MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_DOUBLE
720 #define MICROPY_PY_BUILTINS_FLOAT (1)
721 #define MICROPY_FLOAT_CONST(x) x
722 #define MICROPY_FLOAT_C_FUN(fun) fun
723 typedef double mp_float_t;
724 #else
725 #define MICROPY_PY_BUILTINS_FLOAT (0)
726 #endif
727 
728 #ifndef MICROPY_PY_BUILTINS_COMPLEX
729 #define MICROPY_PY_BUILTINS_COMPLEX (MICROPY_PY_BUILTINS_FLOAT)
730 #endif
731 
732 // Whether to provide a high-quality hash for float and complex numbers.
733 // Otherwise the default is a very simple but correct hashing function.
734 #ifndef MICROPY_FLOAT_HIGH_QUALITY_HASH
735 #define MICROPY_FLOAT_HIGH_QUALITY_HASH (0)
736 #endif
737 
738 // Enable features which improve CPython compatibility
739 // but may lead to more code size/memory usage.
740 // TODO: Originally intended as generic category to not
741 // add bunch of once-off options. May need refactoring later
742 #ifndef MICROPY_CPYTHON_COMPAT
743 #define MICROPY_CPYTHON_COMPAT (1)
744 #endif
745 
746 // Perform full checks as done by CPython. Disabling this
747 // may produce incorrect results, if incorrect data is fed,
748 // but should not lead to MicroPython crashes or similar
749 // grave issues (in other words, only user app should be,
750 // affected, not system).
751 #ifndef MICROPY_FULL_CHECKS
752 #define MICROPY_FULL_CHECKS (1)
753 #endif
754 
755 // Whether POSIX-semantics non-blocking streams are supported
756 #ifndef MICROPY_STREAMS_NON_BLOCK
757 #define MICROPY_STREAMS_NON_BLOCK (0)
758 #endif
759 
760 // Whether to provide stream functions with POSIX-like signatures
761 // (useful for porting existing libraries to MicroPython).
762 #ifndef MICROPY_STREAMS_POSIX_API
763 #define MICROPY_STREAMS_POSIX_API (0)
764 #endif
765 
766 // Whether to call __init__ when importing builtin modules for the first time
767 #ifndef MICROPY_MODULE_BUILTIN_INIT
768 #define MICROPY_MODULE_BUILTIN_INIT (0)
769 #endif
770 
771 // Whether to support module-level __getattr__ (see PEP 562)
772 #ifndef MICROPY_MODULE_GETATTR
773 #define MICROPY_MODULE_GETATTR (1)
774 #endif
775 
776 // Whether module weak links are supported
777 #ifndef MICROPY_MODULE_WEAK_LINKS
778 #define MICROPY_MODULE_WEAK_LINKS (0)
779 #endif
780 
781 // Whether frozen modules are supported in the form of strings
782 #ifndef MICROPY_MODULE_FROZEN_STR
783 #define MICROPY_MODULE_FROZEN_STR (0)
784 #endif
785 
786 // Whether frozen modules are supported in the form of .mpy files
787 #ifndef MICROPY_MODULE_FROZEN_MPY
788 #define MICROPY_MODULE_FROZEN_MPY (0)
789 #endif
790 
791 // Convenience macro for whether frozen modules are supported
792 #ifndef MICROPY_MODULE_FROZEN
793 #define MICROPY_MODULE_FROZEN (MICROPY_MODULE_FROZEN_STR || MICROPY_MODULE_FROZEN_MPY)
794 #endif
795 
796 // Whether you can override builtins in the builtins module
797 #ifndef MICROPY_CAN_OVERRIDE_BUILTINS
798 #define MICROPY_CAN_OVERRIDE_BUILTINS (0)
799 #endif
800 
801 // Whether to check that the "self" argument of a builtin method has the
802 // correct type.  Such an explicit check is only needed if a builtin
803 // method escapes to Python land without a first argument, eg
804 // list.append([], 1).  Without this check such calls will have undefined
805 // behaviour (usually segfault) if the first argument is the wrong type.
806 #ifndef MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG
807 #define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (1)
808 #endif
809 
810 // Whether to use internally defined errno's (otherwise system provided ones)
811 #ifndef MICROPY_USE_INTERNAL_ERRNO
812 #define MICROPY_USE_INTERNAL_ERRNO (0)
813 #endif
814 
815 // Whether to use internally defined *printf() functions (otherwise external ones)
816 #ifndef MICROPY_USE_INTERNAL_PRINTF
817 #define MICROPY_USE_INTERNAL_PRINTF (1)
818 #endif
819 
820 // Support for internal scheduler
821 #ifndef MICROPY_ENABLE_SCHEDULER
822 #define MICROPY_ENABLE_SCHEDULER (0)
823 #endif
824 
825 // Maximum number of entries in the scheduler
826 #ifndef MICROPY_SCHEDULER_DEPTH
827 #define MICROPY_SCHEDULER_DEPTH (4)
828 #endif
829 
830 // Support for generic VFS sub-system
831 #ifndef MICROPY_VFS
832 #define MICROPY_VFS (0)
833 #endif
834 
835 // Support for VFS POSIX component, to mount a POSIX filesystem within VFS
836 #ifndef MICROPY_VFS
837 #define MICROPY_VFS_POSIX (0)
838 #endif
839 
840 // Support for VFS FAT component, to mount a FAT filesystem within VFS
841 #ifndef MICROPY_VFS
842 #define MICROPY_VFS_FAT (0)
843 #endif
844 
845 /*****************************************************************************/
846 /* Fine control over Python builtins, classes, modules, etc                  */
847 
848 // Whether to support multiple inheritance of Python classes.  Multiple
849 // inheritance makes some C functions inherently recursive, and adds a bit of
850 // code overhead.
851 #ifndef MICROPY_MULTIPLE_INHERITANCE
852 #define MICROPY_MULTIPLE_INHERITANCE (1)
853 #endif
854 
855 // Whether to implement attributes on functions
856 #ifndef MICROPY_PY_FUNCTION_ATTRS
857 #define MICROPY_PY_FUNCTION_ATTRS (0)
858 #endif
859 
860 // Whether to support the descriptors __get__, __set__, __delete__
861 // This costs some code size and makes load/store/delete of instance
862 // attributes slower for the classes that use this feature
863 #ifndef MICROPY_PY_DESCRIPTORS
864 #define MICROPY_PY_DESCRIPTORS (0)
865 #endif
866 
867 // Whether to support class __delattr__ and __setattr__ methods
868 // This costs some code size and makes store/delete of instance
869 // attributes slower for the classes that use this feature
870 #ifndef MICROPY_PY_DELATTR_SETATTR
871 #define MICROPY_PY_DELATTR_SETATTR (0)
872 #endif
873 
874 // Support for async/await/async for/async with
875 #ifndef MICROPY_PY_ASYNC_AWAIT
876 #define MICROPY_PY_ASYNC_AWAIT (1)
877 #endif
878 
879 // Support for literal string interpolation, f-strings (see PEP 498, Python 3.6+)
880 #ifndef MICROPY_PY_FSTRINGS
881 #define MICROPY_PY_FSTRINGS (0)
882 #endif
883 
884 // Support for assignment expressions with := (see PEP 572, Python 3.8+)
885 #ifndef MICROPY_PY_ASSIGN_EXPR
886 #define MICROPY_PY_ASSIGN_EXPR (1)
887 #endif
888 
889 // Non-standard .pend_throw() method for generators, allowing for
890 // Future-like behavior with respect to exception handling: an
891 // exception set with .pend_throw() will activate on the next call
892 // to generator's .send() or .__next__(). (This is useful to implement
893 // async schedulers.)
894 #ifndef MICROPY_PY_GENERATOR_PEND_THROW
895 #define MICROPY_PY_GENERATOR_PEND_THROW (1)
896 #endif
897 
898 // Issue a warning when comparing str and bytes objects
899 #ifndef MICROPY_PY_STR_BYTES_CMP_WARN
900 #define MICROPY_PY_STR_BYTES_CMP_WARN (0)
901 #endif
902 
903 // Whether str object is proper unicode
904 #ifndef MICROPY_PY_BUILTINS_STR_UNICODE
905 #define MICROPY_PY_BUILTINS_STR_UNICODE (0)
906 #endif
907 
908 // Whether to check for valid UTF-8 when converting bytes to str
909 #ifndef MICROPY_PY_BUILTINS_STR_UNICODE_CHECK
910 #define MICROPY_PY_BUILTINS_STR_UNICODE_CHECK (MICROPY_PY_BUILTINS_STR_UNICODE)
911 #endif
912 
913 // Whether str.center() method provided
914 #ifndef MICROPY_PY_BUILTINS_STR_CENTER
915 #define MICROPY_PY_BUILTINS_STR_CENTER (0)
916 #endif
917 
918 // Whether str.count() method provided
919 #ifndef MICROPY_PY_BUILTINS_STR_COUNT
920 #define MICROPY_PY_BUILTINS_STR_COUNT (1)
921 #endif
922 
923 // Whether str % (...) formatting operator provided
924 #ifndef MICROPY_PY_BUILTINS_STR_OP_MODULO
925 #define MICROPY_PY_BUILTINS_STR_OP_MODULO (1)
926 #endif
927 
928 // Whether str.partition()/str.rpartition() method provided
929 #ifndef MICROPY_PY_BUILTINS_STR_PARTITION
930 #define MICROPY_PY_BUILTINS_STR_PARTITION (0)
931 #endif
932 
933 // Whether str.splitlines() method provided
934 #ifndef MICROPY_PY_BUILTINS_STR_SPLITLINES
935 #define MICROPY_PY_BUILTINS_STR_SPLITLINES (0)
936 #endif
937 
938 // Whether to support bytearray object
939 #ifndef MICROPY_PY_BUILTINS_BYTEARRAY
940 #define MICROPY_PY_BUILTINS_BYTEARRAY (1)
941 #endif
942 
943 // Whether to support dict.fromkeys() class method
944 #ifndef MICROPY_PY_BUILTINS_DICT_FROMKEYS
945 #define MICROPY_PY_BUILTINS_DICT_FROMKEYS (1)
946 #endif
947 
948 // Whether to support memoryview object
949 #ifndef MICROPY_PY_BUILTINS_MEMORYVIEW
950 #define MICROPY_PY_BUILTINS_MEMORYVIEW (0)
951 #endif
952 
953 // Whether to support memoryview.itemsize attribute
954 #ifndef MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE
955 #define MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE (0)
956 #endif
957 
958 // Whether to support set object
959 #ifndef MICROPY_PY_BUILTINS_SET
960 #define MICROPY_PY_BUILTINS_SET (1)
961 #endif
962 
963 // Whether to support slice subscript operators and slice object
964 #ifndef MICROPY_PY_BUILTINS_SLICE
965 #define MICROPY_PY_BUILTINS_SLICE (1)
966 #endif
967 
968 // Whether to support slice attribute read access,
969 // i.e. slice.start, slice.stop, slice.step
970 #ifndef MICROPY_PY_BUILTINS_SLICE_ATTRS
971 #define MICROPY_PY_BUILTINS_SLICE_ATTRS (0)
972 #endif
973 
974 // Whether to support the .indices(len) method on slice objects
975 #ifndef MICROPY_PY_BUILTINS_SLICE_INDICES
976 #define MICROPY_PY_BUILTINS_SLICE_INDICES (0)
977 #endif
978 
979 // Whether to support frozenset object
980 #ifndef MICROPY_PY_BUILTINS_FROZENSET
981 #define MICROPY_PY_BUILTINS_FROZENSET (0)
982 #endif
983 
984 // Whether to support property object
985 #ifndef MICROPY_PY_BUILTINS_PROPERTY
986 #define MICROPY_PY_BUILTINS_PROPERTY (1)
987 #endif
988 
989 // Whether to implement the start/stop/step attributes (readback) on
990 // the "range" builtin type. Rarely used, and costs ~60 bytes (x86).
991 #ifndef MICROPY_PY_BUILTINS_RANGE_ATTRS
992 #define MICROPY_PY_BUILTINS_RANGE_ATTRS (1)
993 #endif
994 
995 // Whether to support binary ops [only (in)equality is defined] between range
996 // objects.  With this option disabled all range objects that are not exactly
997 // the same object will compare as not-equal.  With it enabled the semantics
998 // match CPython and ranges are equal if they yield the same sequence of items.
999 #ifndef MICROPY_PY_BUILTINS_RANGE_BINOP
1000 #define MICROPY_PY_BUILTINS_RANGE_BINOP (0)
1001 #endif
1002 
1003 // Support for callling next() with second argument
1004 #ifndef MICROPY_PY_BUILTINS_NEXT2
1005 #define MICROPY_PY_BUILTINS_NEXT2 (0)
1006 #endif
1007 
1008 // Whether to support rounding of integers (incl bignum); eg round(123,-1)=120
1009 #ifndef MICROPY_PY_BUILTINS_ROUND_INT
1010 #define MICROPY_PY_BUILTINS_ROUND_INT (0)
1011 #endif
1012 
1013 // Whether to support complete set of special methods for user
1014 // classes, or only the most used ones. "Inplace" methods are
1015 // controlled by MICROPY_PY_ALL_INPLACE_SPECIAL_METHODS below.
1016 // "Reverse" methods are controlled by
1017 // MICROPY_PY_REVERSE_SPECIAL_METHODS below.
1018 #ifndef MICROPY_PY_ALL_SPECIAL_METHODS
1019 #define MICROPY_PY_ALL_SPECIAL_METHODS (0)
1020 #endif
1021 
1022 // Whether to support all inplace arithmetic operarion methods
1023 // (__imul__, etc.)
1024 #ifndef MICROPY_PY_ALL_INPLACE_SPECIAL_METHODS
1025 #define MICROPY_PY_ALL_INPLACE_SPECIAL_METHODS (0)
1026 #endif
1027 
1028 // Whether to support reverse arithmetic operarion methods
1029 // (__radd__, etc.). Additionally gated by
1030 // MICROPY_PY_ALL_SPECIAL_METHODS.
1031 #ifndef MICROPY_PY_REVERSE_SPECIAL_METHODS
1032 #define MICROPY_PY_REVERSE_SPECIAL_METHODS (0)
1033 #endif
1034 
1035 // Whether to support compile function
1036 #ifndef MICROPY_PY_BUILTINS_COMPILE
1037 #define MICROPY_PY_BUILTINS_COMPILE (0)
1038 #endif
1039 
1040 // Whether to support enumerate function(type)
1041 #ifndef MICROPY_PY_BUILTINS_ENUMERATE
1042 #define MICROPY_PY_BUILTINS_ENUMERATE (1)
1043 #endif
1044 
1045 // Whether to support eval and exec functions
1046 // By default they are supported if the compiler is enabled
1047 #ifndef MICROPY_PY_BUILTINS_EVAL_EXEC
1048 #define MICROPY_PY_BUILTINS_EVAL_EXEC (MICROPY_ENABLE_COMPILER)
1049 #endif
1050 
1051 // Whether to support the Python 2 execfile function
1052 #ifndef MICROPY_PY_BUILTINS_EXECFILE
1053 #define MICROPY_PY_BUILTINS_EXECFILE (0)
1054 #endif
1055 
1056 // Whether to support filter function(type)
1057 #ifndef MICROPY_PY_BUILTINS_FILTER
1058 #define MICROPY_PY_BUILTINS_FILTER (1)
1059 #endif
1060 
1061 // Whether to support reversed function(type)
1062 #ifndef MICROPY_PY_BUILTINS_REVERSED
1063 #define MICROPY_PY_BUILTINS_REVERSED (1)
1064 #endif
1065 
1066 // Whether to define "NotImplemented" special constant
1067 #ifndef MICROPY_PY_BUILTINS_NOTIMPLEMENTED
1068 #define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (0)
1069 #endif
1070 
1071 // Whether to provide the built-in input() function. The implementation of this
1072 // uses shared/readline, so can only be enabled if the port uses this readline.
1073 #ifndef MICROPY_PY_BUILTINS_INPUT
1074 #define MICROPY_PY_BUILTINS_INPUT (0)
1075 #endif
1076 
1077 // Whether to support min/max functions
1078 #ifndef MICROPY_PY_BUILTINS_MIN_MAX
1079 #define MICROPY_PY_BUILTINS_MIN_MAX (1)
1080 #endif
1081 
1082 // Support for calls to pow() with 3 integer arguments
1083 #ifndef MICROPY_PY_BUILTINS_POW3
1084 #define MICROPY_PY_BUILTINS_POW3 (0)
1085 #endif
1086 
1087 // Whether to provide the help function
1088 #ifndef MICROPY_PY_BUILTINS_HELP
1089 #define MICROPY_PY_BUILTINS_HELP (0)
1090 #endif
1091 
1092 // Use this to configure the help text shown for help().  It should be a
1093 // variable with the type "const char*".  A sensible default is provided.
1094 #ifndef MICROPY_PY_BUILTINS_HELP_TEXT
1095 #define MICROPY_PY_BUILTINS_HELP_TEXT mp_help_default_text
1096 #endif
1097 
1098 // Add the ability to list the available modules when executing help('modules')
1099 #ifndef MICROPY_PY_BUILTINS_HELP_MODULES
1100 #define MICROPY_PY_BUILTINS_HELP_MODULES (0)
1101 #endif
1102 
1103 // Whether to set __file__ for imported modules
1104 #ifndef MICROPY_PY___FILE__
1105 #define MICROPY_PY___FILE__ (1)
1106 #endif
1107 
1108 // Whether to provide mem-info related functions in micropython module
1109 #ifndef MICROPY_PY_MICROPYTHON_MEM_INFO
1110 #define MICROPY_PY_MICROPYTHON_MEM_INFO (0)
1111 #endif
1112 
1113 // Whether to provide "micropython.stack_use" function
1114 #ifndef MICROPY_PY_MICROPYTHON_STACK_USE
1115 #define MICROPY_PY_MICROPYTHON_STACK_USE (MICROPY_PY_MICROPYTHON_MEM_INFO)
1116 #endif
1117 
1118 // Whether to provide the "micropython.heap_locked" function
1119 #ifndef MICROPY_PY_MICROPYTHON_HEAP_LOCKED
1120 #define MICROPY_PY_MICROPYTHON_HEAP_LOCKED (0)
1121 #endif
1122 
1123 // Whether to provide "array" module. Note that large chunk of the
1124 // underlying code is shared with "bytearray" builtin type, so to
1125 // get real savings, it should be disabled too.
1126 #ifndef MICROPY_PY_ARRAY
1127 #define MICROPY_PY_ARRAY (1)
1128 #endif
1129 
1130 // Whether to support slice assignments for array (and bytearray).
1131 // This is rarely used, but adds ~0.5K of code.
1132 #ifndef MICROPY_PY_ARRAY_SLICE_ASSIGN
1133 #define MICROPY_PY_ARRAY_SLICE_ASSIGN (0)
1134 #endif
1135 
1136 // Whether to support attrtuple type (MicroPython extension)
1137 // It provides space-efficient tuples with attribute access
1138 #ifndef MICROPY_PY_ATTRTUPLE
1139 #define MICROPY_PY_ATTRTUPLE (1)
1140 #endif
1141 
1142 // Whether to provide "collections" module
1143 #ifndef MICROPY_PY_COLLECTIONS
1144 #define MICROPY_PY_COLLECTIONS (1)
1145 #endif
1146 
1147 // Whether to provide "ucollections.deque" type
1148 #ifndef MICROPY_PY_COLLECTIONS_DEQUE
1149 #define MICROPY_PY_COLLECTIONS_DEQUE (0)
1150 #endif
1151 
1152 // Whether to provide "collections.OrderedDict" type
1153 #ifndef MICROPY_PY_COLLECTIONS_ORDEREDDICT
1154 #define MICROPY_PY_COLLECTIONS_ORDEREDDICT (0)
1155 #endif
1156 
1157 // Whether to provide the _asdict function for namedtuple
1158 #ifndef MICROPY_PY_COLLECTIONS_NAMEDTUPLE__ASDICT
1159 #define MICROPY_PY_COLLECTIONS_NAMEDTUPLE__ASDICT (0)
1160 #endif
1161 
1162 // Whether to provide "math" module
1163 #ifndef MICROPY_PY_MATH
1164 #define MICROPY_PY_MATH (1)
1165 #endif
1166 
1167 // Whether to provide special math functions: math.{erf,erfc,gamma,lgamma}
1168 #ifndef MICROPY_PY_MATH_SPECIAL_FUNCTIONS
1169 #define MICROPY_PY_MATH_SPECIAL_FUNCTIONS (0)
1170 #endif
1171 
1172 // Whether to provide math.factorial function
1173 #ifndef MICROPY_PY_MATH_FACTORIAL
1174 #define MICROPY_PY_MATH_FACTORIAL (0)
1175 #endif
1176 
1177 // Whether to provide math.isclose function
1178 #ifndef MICROPY_PY_MATH_ISCLOSE
1179 #define MICROPY_PY_MATH_ISCLOSE (0)
1180 #endif
1181 
1182 // Whether to provide fix for atan2 Inf handling.
1183 #ifndef MICROPY_PY_MATH_ATAN2_FIX_INFNAN
1184 #define MICROPY_PY_MATH_ATAN2_FIX_INFNAN (0)
1185 #endif
1186 
1187 // Whether to provide fix for fmod Inf handling.
1188 #ifndef MICROPY_PY_MATH_FMOD_FIX_INFNAN
1189 #define MICROPY_PY_MATH_FMOD_FIX_INFNAN (0)
1190 #endif
1191 
1192 // Whether to provide fix for modf negative zero handling.
1193 #ifndef MICROPY_PY_MATH_MODF_FIX_NEGZERO
1194 #define MICROPY_PY_MATH_MODF_FIX_NEGZERO (0)
1195 #endif
1196 
1197 // Whether to provide fix for pow(1, NaN) and pow(NaN, 0), which both should be 1 not NaN.
1198 #ifndef MICROPY_PY_MATH_POW_FIX_NAN
1199 #define MICROPY_PY_MATH_POW_FIX_NAN (0)
1200 #endif
1201 
1202 // Whether to provide "cmath" module
1203 #ifndef MICROPY_PY_CMATH
1204 #define MICROPY_PY_CMATH (0)
1205 #endif
1206 
1207 // Whether to provide "gc" module
1208 #ifndef MICROPY_PY_GC
1209 #define MICROPY_PY_GC (1)
1210 #endif
1211 
1212 // Whether to return number of collected objects from gc.collect()
1213 #ifndef MICROPY_PY_GC_COLLECT_RETVAL
1214 #define MICROPY_PY_GC_COLLECT_RETVAL (0)
1215 #endif
1216 
1217 // Whether to provide "io" module
1218 #ifndef MICROPY_PY_IO
1219 #define MICROPY_PY_IO (1)
1220 #endif
1221 
1222 // Whether to provide "io.IOBase" class to support user streams
1223 #ifndef MICROPY_PY_IO_IOBASE
1224 #define MICROPY_PY_IO_IOBASE (0)
1225 #endif
1226 
1227 // Whether to provide "uio.resource_stream()" function with
1228 // the semantics of CPython's pkg_resources.resource_stream()
1229 // (allows to access binary resources in frozen source packages).
1230 // Note that the same functionality can be achieved in "pure
1231 // Python" by prepocessing binary resources into Python source
1232 // and bytecode-freezing it (with a simple helper module available
1233 // e.g. in micropython-lib).
1234 #ifndef MICROPY_PY_IO_RESOURCE_STREAM
1235 #define MICROPY_PY_IO_RESOURCE_STREAM (0)
1236 #endif
1237 
1238 // Whether to provide "io.FileIO" class
1239 #ifndef MICROPY_PY_IO_FILEIO
1240 #define MICROPY_PY_IO_FILEIO (0)
1241 #endif
1242 
1243 // Whether to provide "io.BytesIO" class
1244 #ifndef MICROPY_PY_IO_BYTESIO
1245 #define MICROPY_PY_IO_BYTESIO (1)
1246 #endif
1247 
1248 // Whether to provide "io.BufferedWriter" class
1249 #ifndef MICROPY_PY_IO_BUFFEREDWRITER
1250 #define MICROPY_PY_IO_BUFFEREDWRITER (0)
1251 #endif
1252 
1253 // Whether to provide "struct" module
1254 #ifndef MICROPY_PY_STRUCT
1255 #define MICROPY_PY_STRUCT (1)
1256 #endif
1257 
1258 // Whether to provide "sys" module
1259 #ifndef MICROPY_PY_SYS
1260 #define MICROPY_PY_SYS (1)
1261 #endif
1262 
1263 // Whether to provide "sys.maxsize" constant
1264 #ifndef MICROPY_PY_SYS_MAXSIZE
1265 #define MICROPY_PY_SYS_MAXSIZE (0)
1266 #endif
1267 
1268 // Whether to provide "sys.modules" dictionary
1269 #ifndef MICROPY_PY_SYS_MODULES
1270 #define MICROPY_PY_SYS_MODULES (1)
1271 #endif
1272 
1273 // Whether to provide "sys.exc_info" function
1274 // Avoid enabling this, this function is Python2 heritage
1275 #ifndef MICROPY_PY_SYS_EXC_INFO
1276 #define MICROPY_PY_SYS_EXC_INFO (0)
1277 #endif
1278 
1279 // Whether to provide "sys.exit" function
1280 #ifndef MICROPY_PY_SYS_EXIT
1281 #define MICROPY_PY_SYS_EXIT (1)
1282 #endif
1283 
1284 // Whether to provide "sys.atexit" function (MicroPython extension)
1285 #ifndef MICROPY_PY_SYS_ATEXIT
1286 #define MICROPY_PY_SYS_ATEXIT (0)
1287 #endif
1288 
1289 // Whether to provide "sys.settrace" function
1290 #ifndef MICROPY_PY_SYS_SETTRACE
1291 #define MICROPY_PY_SYS_SETTRACE (0)
1292 #endif
1293 
1294 // Whether to provide "sys.getsizeof" function
1295 #ifndef MICROPY_PY_SYS_GETSIZEOF
1296 #define MICROPY_PY_SYS_GETSIZEOF (0)
1297 #endif
1298 
1299 // Whether to provide sys.{stdin,stdout,stderr} objects
1300 #ifndef MICROPY_PY_SYS_STDFILES
1301 #define MICROPY_PY_SYS_STDFILES (0)
1302 #endif
1303 
1304 // Whether to provide sys.{stdin,stdout,stderr}.buffer object
1305 // This is implemented per-port
1306 #ifndef MICROPY_PY_SYS_STDIO_BUFFER
1307 #define MICROPY_PY_SYS_STDIO_BUFFER (0)
1308 #endif
1309 
1310 // Whether to provide "uerrno" module
1311 #ifndef MICROPY_PY_UERRNO
1312 #define MICROPY_PY_UERRNO (0)
1313 #endif
1314 
1315 // Whether to provide the uerrno.errorcode dict
1316 #ifndef MICROPY_PY_UERRNO_ERRORCODE
1317 #define MICROPY_PY_UERRNO_ERRORCODE (1)
1318 #endif
1319 
1320 // Whether to provide "uselect" module (baremetal implementation)
1321 #ifndef MICROPY_PY_USELECT
1322 #define MICROPY_PY_USELECT (0)
1323 #endif
1324 
1325 // Whether to enable the select() function in the "uselect" module (baremetal
1326 // implementation). This is present for compatibility but can be disabled to
1327 // save space.
1328 #ifndef MICROPY_PY_USELECT_SELECT
1329 #define MICROPY_PY_USELECT_SELECT (1)
1330 #endif
1331 
1332 // Whether to provide "utime" module functions implementation
1333 // in terms of mp_hal_* functions.
1334 #ifndef MICROPY_PY_UTIME_MP_HAL
1335 #define MICROPY_PY_UTIME_MP_HAL (0)
1336 #endif
1337 
1338 // Period of values returned by utime.ticks_ms(), ticks_us(), ticks_cpu()
1339 // functions. Should be power of two. All functions above use the same
1340 // period, so if underlying hardware/API has different periods, the
1341 // minimum of them should be used. The value below is the maximum value
1342 // this parameter can take (corresponding to 30 bit tick values on 32-bit
1343 // system).
1344 #ifndef MICROPY_PY_UTIME_TICKS_PERIOD
1345 #define MICROPY_PY_UTIME_TICKS_PERIOD (MP_SMALL_INT_POSITIVE_MASK + 1)
1346 #endif
1347 
1348 // Whether to provide "_thread" module
1349 #ifndef MICROPY_PY_THREAD
1350 #define MICROPY_PY_THREAD (0)
1351 #endif
1352 
1353 // Whether to make the VM/runtime thread-safe using a global lock
1354 // If not enabled then thread safety must be provided at the Python level
1355 #ifndef MICROPY_PY_THREAD_GIL
1356 #define MICROPY_PY_THREAD_GIL (MICROPY_PY_THREAD)
1357 #endif
1358 
1359 // Number of VM jump-loops to do before releasing the GIL.
1360 // Set this to 0 to disable the divisor.
1361 #ifndef MICROPY_PY_THREAD_GIL_VM_DIVISOR
1362 #define MICROPY_PY_THREAD_GIL_VM_DIVISOR (32)
1363 #endif
1364 
1365 // Extended modules
1366 
1367 #ifndef MICROPY_PY_UASYNCIO
1368 #define MICROPY_PY_UASYNCIO (0)
1369 #endif
1370 
1371 #ifndef MICROPY_PY_UCTYPES
1372 #define MICROPY_PY_UCTYPES (0)
1373 #endif
1374 
1375 // Whether to provide SHORT, INT, LONG, etc. types in addition to
1376 // exact-bitness types like INT16, INT32, etc.
1377 #ifndef MICROPY_PY_UCTYPES_NATIVE_C_TYPES
1378 #define MICROPY_PY_UCTYPES_NATIVE_C_TYPES (1)
1379 #endif
1380 
1381 #ifndef MICROPY_PY_UZLIB
1382 #define MICROPY_PY_UZLIB (0)
1383 #endif
1384 
1385 #ifndef MICROPY_PY_UJSON
1386 #define MICROPY_PY_UJSON (0)
1387 #endif
1388 
1389 // Whether to support the "separators" argument to dump, dumps
1390 #ifndef MICROPY_PY_UJSON_SEPARATORS
1391 #define MICROPY_PY_UJSON_SEPARATORS (1)
1392 #endif
1393 
1394 #ifndef MICROPY_PY_URE
1395 #define MICROPY_PY_URE (0)
1396 #endif
1397 
1398 #ifndef MICROPY_PY_URE_DEBUG
1399 #define MICROPY_PY_URE_DEBUG (0)
1400 #endif
1401 
1402 #ifndef MICROPY_PY_URE_MATCH_GROUPS
1403 #define MICROPY_PY_URE_MATCH_GROUPS (0)
1404 #endif
1405 
1406 #ifndef MICROPY_PY_URE_MATCH_SPAN_START_END
1407 #define MICROPY_PY_URE_MATCH_SPAN_START_END (0)
1408 #endif
1409 
1410 #ifndef MICROPY_PY_URE_SUB
1411 #define MICROPY_PY_URE_SUB (0)
1412 #endif
1413 
1414 #ifndef MICROPY_PY_UHEAPQ
1415 #define MICROPY_PY_UHEAPQ (0)
1416 #endif
1417 
1418 // Optimized heap queue for relative timestamps
1419 #ifndef MICROPY_PY_UTIMEQ
1420 #define MICROPY_PY_UTIMEQ (0)
1421 #endif
1422 
1423 #ifndef MICROPY_PY_UHASHLIB
1424 #define MICROPY_PY_UHASHLIB (0)
1425 #endif
1426 
1427 #ifndef MICROPY_PY_UHASHLIB_MD5
1428 #define MICROPY_PY_UHASHLIB_MD5 (0)
1429 #endif
1430 
1431 #ifndef MICROPY_PY_UHASHLIB_SHA1
1432 #define MICROPY_PY_UHASHLIB_SHA1  (0)
1433 #endif
1434 
1435 #ifndef MICROPY_PY_UHASHLIB_SHA256
1436 #define MICROPY_PY_UHASHLIB_SHA256 (1)
1437 #endif
1438 
1439 #ifndef MICROPY_PY_UCRYPTOLIB
1440 #define MICROPY_PY_UCRYPTOLIB (0)
1441 #endif
1442 
1443 // Depends on MICROPY_PY_UCRYPTOLIB
1444 #ifndef MICROPY_PY_UCRYPTOLIB_CTR
1445 #define MICROPY_PY_UCRYPTOLIB_CTR (0)
1446 #endif
1447 
1448 #ifndef MICROPY_PY_UCRYPTOLIB_CONSTS
1449 #define MICROPY_PY_UCRYPTOLIB_CONSTS (0)
1450 #endif
1451 
1452 #ifndef MICROPY_PY_UBINASCII
1453 #define MICROPY_PY_UBINASCII (0)
1454 #endif
1455 
1456 // Depends on MICROPY_PY_UZLIB
1457 #ifndef MICROPY_PY_UBINASCII_CRC32
1458 #define MICROPY_PY_UBINASCII_CRC32 (0)
1459 #endif
1460 
1461 #ifndef MICROPY_PY_URANDOM
1462 #define MICROPY_PY_URANDOM (0)
1463 #endif
1464 
1465 // Whether to include: randrange, randint, choice, random, uniform
1466 #ifndef MICROPY_PY_URANDOM_EXTRA_FUNCS
1467 #define MICROPY_PY_URANDOM_EXTRA_FUNCS (0)
1468 #endif
1469 
1470 #ifndef MICROPY_PY_MACHINE
1471 #define MICROPY_PY_MACHINE (0)
1472 #endif
1473 
1474 // Whether to include: bitstream
1475 #ifndef MICROPY_PY_MACHINE_BITSTREAM
1476 #define MICROPY_PY_MACHINE_BITSTREAM (0)
1477 #endif
1478 
1479 // Whether to include: time_pulse_us
1480 #ifndef MICROPY_PY_MACHINE_PULSE
1481 #define MICROPY_PY_MACHINE_PULSE (0)
1482 #endif
1483 
1484 #ifndef MICROPY_PY_MACHINE_I2C
1485 #define MICROPY_PY_MACHINE_I2C (0)
1486 #endif
1487 
1488 #ifndef MICROPY_PY_MACHINE_SPI
1489 #define MICROPY_PY_MACHINE_SPI (0)
1490 #endif
1491 
1492 #ifndef MICROPY_PY_USSL
1493 #define MICROPY_PY_USSL (0)
1494 // Whether to add finaliser code to ussl objects
1495 #define MICROPY_PY_USSL_FINALISER (0)
1496 #endif
1497 
1498 #ifndef MICROPY_PY_UWEBSOCKET
1499 #define MICROPY_PY_UWEBSOCKET (0)
1500 #endif
1501 
1502 #ifndef MICROPY_PY_FRAMEBUF
1503 #define MICROPY_PY_FRAMEBUF (1)
1504 #endif
1505 
1506 #ifndef MICROPY_PY_BTREE
1507 #define MICROPY_PY_BTREE (0)
1508 #endif
1509 
1510 /*****************************************************************************/
1511 /* Hooks for a port to add builtins                                          */
1512 
1513 // Additional builtin function definitions - see modbuiltins.c:mp_module_builtins_globals_table for format.
1514 #ifndef MICROPY_PORT_BUILTINS
1515 #define MICROPY_PORT_BUILTINS
1516 #endif
1517 
1518 // Additional builtin module definitions - see objmodule.c:mp_builtin_module_table for format.
1519 #ifndef MICROPY_PORT_BUILTIN_MODULES
1520 #define MICROPY_PORT_BUILTIN_MODULES
1521 #endif
1522 
1523 // Additional constant definitions for the compiler - see compile.c:mp_constants_table.
1524 #ifndef MICROPY_PORT_CONSTANTS
1525 #define MICROPY_PORT_CONSTANTS
1526 #endif
1527 
1528 // Any root pointers for GC scanning - see mpstate.c
1529 #ifndef MICROPY_PORT_ROOT_POINTERS
1530 #define MICROPY_PORT_ROOT_POINTERS
1531 #endif
1532 
1533 /*****************************************************************************/
1534 /* Hooks for a port to wrap functions with attributes                        */
1535 
1536 #ifndef MICROPY_WRAP_MP_SCHED_EXCEPTION
1537 #define MICROPY_WRAP_MP_SCHED_EXCEPTION(f) f
1538 #endif
1539 
1540 #ifndef MICROPY_WRAP_MP_SCHED_KEYBOARD_INTERRUPT
1541 #define MICROPY_WRAP_MP_SCHED_KEYBOARD_INTERRUPT(f) f
1542 #endif
1543 
1544 #ifndef MICROPY_WRAP_MP_SCHED_SCHEDULE
1545 #define MICROPY_WRAP_MP_SCHED_SCHEDULE(f) f
1546 #endif
1547 
1548 /*****************************************************************************/
1549 /* Miscellaneous settings                                                    */
1550 
1551 // All uPy objects in ROM must be aligned on at least a 4 byte boundary
1552 // so that the small-int/qstr/pointer distinction can be made.  For machines
1553 // that don't do this (eg 16-bit CPU), define the following macro to something
1554 // like __attribute__((aligned(4))).
1555 #ifndef MICROPY_OBJ_BASE_ALIGNMENT
1556 #define MICROPY_OBJ_BASE_ALIGNMENT
1557 #endif
1558 
1559 // On embedded platforms, these will typically enable/disable irqs.
1560 #ifndef MICROPY_BEGIN_ATOMIC_SECTION
1561 #define MICROPY_BEGIN_ATOMIC_SECTION() (0)
1562 #endif
1563 #ifndef MICROPY_END_ATOMIC_SECTION
1564 #define MICROPY_END_ATOMIC_SECTION(state) (void)(state)
1565 #endif
1566 
1567 // Allow to override static modifier for global objects, e.g. to use with
1568 // object code analysis tools which don't support static symbols.
1569 #ifndef STATIC
1570 #define STATIC static
1571 #endif
1572 
1573 // Number of bytes in an object word: mp_obj_t, mp_uint_t, mp_uint_t
1574 #ifndef MP_BYTES_PER_OBJ_WORD
1575 #define MP_BYTES_PER_OBJ_WORD (sizeof(mp_uint_t))
1576 #endif
1577 
1578 // Number of bits in a byte
1579 #ifndef MP_BITS_PER_BYTE
1580 #define MP_BITS_PER_BYTE (8)
1581 #endif
1582 // mp_int_t value with most significant bit set
1583 #define MP_OBJ_WORD_MSBIT_HIGH (((mp_uint_t)1) << (MP_BYTES_PER_OBJ_WORD * MP_BITS_PER_BYTE - 1))
1584 
1585 // Make sure both MP_ENDIANNESS_LITTLE and MP_ENDIANNESS_BIG are
1586 // defined and that they are the opposite of each other.
1587 #if defined(MP_ENDIANNESS_LITTLE)
1588 #define MP_ENDIANNESS_BIG (!MP_ENDIANNESS_LITTLE)
1589 #elif defined(MP_ENDIANNESS_BIG)
1590 #define MP_ENDIANNESS_LITTLE (!MP_ENDIANNESS_BIG)
1591 #else
1592 // Endianness not defined by port so try to autodetect it.
1593   #if defined(__BYTE_ORDER__)
1594     #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1595       #define MP_ENDIANNESS_LITTLE (1)
1596     #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
1597       #define MP_ENDIANNESS_LITTLE (0)
1598     #endif
1599   #else
1600     #include <endian.h>
1601       #if defined(__BYTE_ORDER)
1602         #if __BYTE_ORDER == __LITTLE_ENDIAN
1603           #define MP_ENDIANNESS_LITTLE (1)
1604         #elif __BYTE_ORDER == __BIG_ENDIAN
1605           #define MP_ENDIANNESS_LITTLE (0)
1606         #endif
1607       #endif
1608   #endif
1609   #ifndef MP_ENDIANNESS_LITTLE
1610     #error endianness not defined and cannot detect it
1611   #endif
1612   #define MP_ENDIANNESS_BIG (!MP_ENDIANNESS_LITTLE)
1613 #endif
1614 
1615 // Make a pointer to RAM callable (eg set lower bit for Thumb code)
1616 // (This scheme won't work if we want to mix Thumb and normal ARM code.)
1617 #ifndef MICROPY_MAKE_POINTER_CALLABLE
1618 #define MICROPY_MAKE_POINTER_CALLABLE(p) (p)
1619 #endif
1620 
1621 // If these MP_PLAT_*_EXEC macros are overridden then the memory allocated by them
1622 // must be somehow reachable for marking by the GC, since the native code
1623 // generators store pointers to GC managed memory in the code.
1624 #ifndef MP_PLAT_ALLOC_EXEC
1625 #define MP_PLAT_ALLOC_EXEC(min_size, ptr, size) do { *ptr = m_new(byte, min_size); *size = min_size; } while (0)
1626 #endif
1627 
1628 #ifndef MP_PLAT_FREE_EXEC
1629 #define MP_PLAT_FREE_EXEC(ptr, size) m_del(byte, ptr, size)
1630 #endif
1631 
1632 // This macro is used to do all output (except when MICROPY_PY_IO is defined)
1633 #ifndef MP_PLAT_PRINT_STRN
1634 #define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len)
1635 #endif
1636 
1637 #ifndef MP_SSIZE_MAX
1638 #define MP_SSIZE_MAX SSIZE_MAX
1639 #endif
1640 
1641 // printf format spec to use for mp_int_t and friends
1642 #ifndef INT_FMT
1643 #if defined(__LP64__)
1644 // Archs where mp_int_t == long, long != int
1645 #define UINT_FMT "%lu"
1646 #define INT_FMT "%ld"
1647 #elif defined(_WIN64)
1648 #define UINT_FMT "%llu"
1649 #define INT_FMT "%lld"
1650 #else
1651 // Archs where mp_int_t == int
1652 #define UINT_FMT "%u"
1653 #define INT_FMT "%d"
1654 #endif
1655 #endif // INT_FMT
1656 
1657 // Modifier for function which doesn't return
1658 #ifndef NORETURN
1659 #define NORETURN __attribute__((noreturn))
1660 #endif
1661 
1662 // Modifier for weak functions
1663 #ifndef MP_WEAK
1664 #define MP_WEAK __attribute__((weak))
1665 #endif
1666 
1667 // Modifier for functions which should be never inlined
1668 #ifndef MP_NOINLINE
1669 #define MP_NOINLINE __attribute__((noinline))
1670 #endif
1671 
1672 // Modifier for functions which should be always inlined
1673 #ifndef MP_ALWAYSINLINE
1674 #define MP_ALWAYSINLINE __attribute__((always_inline))
1675 #endif
1676 
1677 // Condition is likely to be true, to help branch prediction
1678 #ifndef MP_LIKELY
1679 #define MP_LIKELY(x) __builtin_expect((x), 1)
1680 #endif
1681 
1682 // Condition is likely to be false, to help branch prediction
1683 #ifndef MP_UNLIKELY
1684 #define MP_UNLIKELY(x) __builtin_expect((x), 0)
1685 #endif
1686 
1687 // To annotate that code is unreachable
1688 #ifndef MP_UNREACHABLE
1689 #if defined(__GNUC__)
1690 #define MP_UNREACHABLE __builtin_unreachable();
1691 #else
1692 #define MP_UNREACHABLE for (;;);
1693 #endif
1694 #endif
1695 
1696 // Explicitly annotate switch case fall throughs
1697 #if defined(__GNUC__) && __GNUC__ >= 7
1698 #define MP_FALLTHROUGH __attribute__((fallthrough));
1699 #else
1700 #define MP_FALLTHROUGH
1701 #endif
1702 
1703 #ifndef MP_HTOBE16
1704 #if MP_ENDIANNESS_LITTLE
1705 #define MP_HTOBE16(x) ((uint16_t)((((x) & 0xff) << 8) | (((x) >> 8) & 0xff)))
1706 #define MP_BE16TOH(x) MP_HTOBE16(x)
1707 #else
1708 #define MP_HTOBE16(x) (x)
1709 #define MP_BE16TOH(x) (x)
1710 #endif
1711 #endif
1712 
1713 #ifndef MP_HTOBE32
1714 #if MP_ENDIANNESS_LITTLE
1715 #define MP_HTOBE32(x) ((uint32_t)((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) | (((x) >> 8) & 0xff00) | (((x) >> 24) & 0xff)))
1716 #define MP_BE32TOH(x) MP_HTOBE32(x)
1717 #else
1718 #define MP_HTOBE32(x) (x)
1719 #define MP_BE32TOH(x) (x)
1720 #endif
1721 #endif
1722 
1723 // Warning categories are by default implemented as strings, though
1724 // hook is left for a port to define them as something else.
1725 #if MICROPY_WARNINGS_CATEGORY
1726 #ifndef MP_WARN_CAT
1727 #define MP_WARN_CAT(x) #x
1728 #endif
1729 #else
1730 #undef MP_WARN_CAT
1731 #define MP_WARN_CAT(x) (NULL)
1732 #endif
1733 
1734 // Feature dependency check.
1735 #if MICROPY_PY_SYS_SETTRACE
1736 #if !MICROPY_PERSISTENT_CODE_SAVE
1737 #error "MICROPY_PY_SYS_SETTRACE requires MICROPY_PERSISTENT_CODE_SAVE to be enabled"
1738 #endif
1739 #if MICROPY_COMP_CONST
1740 #error "MICROPY_PY_SYS_SETTRACE requires MICROPY_COMP_CONST to be disabled"
1741 #endif
1742 #endif
1743 
1744 #endif // MICROPY_INCLUDED_PY_MPCONFIG_H
1745