Numworks Epsilon  1.4.1
Graphing Calculator Operating System
bc.c
Go to the documentation of this file.
1 /*
2  * This file is part of the MicroPython project, http://micropython.org/
3  *
4  * The MIT License (MIT)
5  *
6  * Copyright (c) 2014 Damien P. George
7  * Copyright (c) 2014 Paul Sokolovsky
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining a copy
10  * of this software and associated documentation files (the "Software"), to deal
11  * in the Software without restriction, including without limitation the rights
12  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13  * copies of the Software, and to permit persons to whom the Software is
14  * furnished to do so, subject to the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be included in
17  * all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25  * THE SOFTWARE.
26  */
27 
28 #include <stdbool.h>
29 #include <string.h>
30 #include <assert.h>
31 
32 #include "py/runtime.h"
33 #include "py/bc0.h"
34 #include "py/bc.h"
35 
36 #if MICROPY_DEBUG_VERBOSE // print debugging info
37 #define DEBUG_PRINT (1)
38 #else // don't print debugging info
39 #define DEBUG_PRINT (0)
40 #define DEBUG_printf(...) (void)0
41 #endif
42 
44  mp_uint_t unum = 0;
45  byte val;
46  const byte *p = *ptr;
47  do {
48  val = *p++;
49  unum = (unum << 7) | (val & 0x7f);
50  } while ((val & 0x80) != 0);
51  *ptr = p;
52  return unum;
53 }
54 
55 // This function is used to help reduce stack usage at the caller, for the case when
56 // the caller doesn't need to increase the ptr argument. If ptr is a local variable
57 // and the caller uses mp_decode_uint(&ptr) instead of this function, then the compiler
58 // must allocate a slot on the stack for ptr, and this slot cannot be reused for
59 // anything else in the function because the pointer may have been stored in a global
60 // and reused later in the function.
62  return mp_decode_uint(&ptr);
63 }
64 
65 // This function is used to help reduce stack usage at the caller, for the case when
66 // the caller doesn't need the actual value and just wants to skip over it.
67 const byte *mp_decode_uint_skip(const byte *ptr) {
68  while ((*ptr++) & 0x80) {
69  }
70  return ptr;
71 }
72 
73 STATIC NORETURN void fun_pos_args_mismatch(mp_obj_fun_bc_t *f, size_t expected, size_t given) {
74 #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
75  // generic message, used also for other argument issues
76  (void)f;
77  (void)expected;
78  (void)given;
80 #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL
81  (void)f;
83  "function takes %d positional arguments but %d were given", expected, given));
84 #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_DETAILED
86  "%q() takes %d positional arguments but %d were given",
87  mp_obj_fun_get_name(MP_OBJ_FROM_PTR(f)), expected, given));
88 #endif
89 }
90 
91 #if DEBUG_PRINT
92 STATIC void dump_args(const mp_obj_t *a, size_t sz) {
93  DEBUG_printf("%p: ", a);
94  for (size_t i = 0; i < sz; i++) {
95  DEBUG_printf("%p ", a[i]);
96  }
97  DEBUG_printf("\n");
98 }
99 #else
100 #define dump_args(...) (void)0
101 #endif
102 
103 // On entry code_state should be allocated somewhere (stack/heap) and
104 // contain the following valid entries:
105 // - code_state->fun_bc should contain a pointer to the function object
106 // - code_state->ip should contain the offset in bytes from the pointer
107 // code_state->fun_bc->bytecode to the entry n_state (0 for bytecode, non-zero for native)
108 void mp_setup_code_state(mp_code_state_t *code_state, size_t n_args, size_t n_kw, const mp_obj_t *args) {
109  // This function is pretty complicated. It's main aim is to be efficient in speed and RAM
110  // usage for the common case of positional only args.
111 
112  // get the function object that we want to set up (could be bytecode or native code)
113  mp_obj_fun_bc_t *self = code_state->fun_bc;
114 
115  // ip comes in as an offset into bytecode, so turn it into a true pointer
116  code_state->ip = self->bytecode + (size_t)code_state->ip;
117 
119  code_state->prev = NULL;
120  #endif
121 
122  // get params
123  size_t n_state = mp_decode_uint(&code_state->ip);
124  code_state->ip = mp_decode_uint_skip(code_state->ip); // skip n_exc_stack
125  size_t scope_flags = *code_state->ip++;
126  size_t n_pos_args = *code_state->ip++;
127  size_t n_kwonly_args = *code_state->ip++;
128  size_t n_def_pos_args = *code_state->ip++;
129 
130  code_state->sp = &code_state->state[0] - 1;
131  code_state->exc_sp = (mp_exc_stack_t*)(code_state->state + n_state) - 1;
132 
133  // zero out the local stack to begin with
134  memset(code_state->state, 0, n_state * sizeof(*code_state->state));
135 
136  const mp_obj_t *kwargs = args + n_args;
137 
138  // var_pos_kw_args points to the stack where the var-args tuple, and var-kw dict, should go (if they are needed)
139  mp_obj_t *var_pos_kw_args = &code_state->state[n_state - 1 - n_pos_args - n_kwonly_args];
140 
141  // check positional arguments
142 
143  if (n_args > n_pos_args) {
144  // given more than enough arguments
145  if ((scope_flags & MP_SCOPE_FLAG_VARARGS) == 0) {
146  fun_pos_args_mismatch(self, n_pos_args, n_args);
147  }
148  // put extra arguments in varargs tuple
149  *var_pos_kw_args-- = mp_obj_new_tuple(n_args - n_pos_args, args + n_pos_args);
150  n_args = n_pos_args;
151  } else {
152  if ((scope_flags & MP_SCOPE_FLAG_VARARGS) != 0) {
153  DEBUG_printf("passing empty tuple as *args\n");
154  *var_pos_kw_args-- = mp_const_empty_tuple;
155  }
156  // Apply processing and check below only if we don't have kwargs,
157  // otherwise, kw handling code below has own extensive checks.
158  if (n_kw == 0 && (scope_flags & MP_SCOPE_FLAG_DEFKWARGS) == 0) {
159  if (n_args >= (size_t)(n_pos_args - n_def_pos_args)) {
160  // given enough arguments, but may need to use some default arguments
161  for (size_t i = n_args; i < n_pos_args; i++) {
162  code_state->state[n_state - 1 - i] = self->extra_args[i - (n_pos_args - n_def_pos_args)];
163  }
164  } else {
165  fun_pos_args_mismatch(self, n_pos_args - n_def_pos_args, n_args);
166  }
167  }
168  }
169 
170  // copy positional args into state
171  for (size_t i = 0; i < n_args; i++) {
172  code_state->state[n_state - 1 - i] = args[i];
173  }
174 
175  // check keyword arguments
176 
177  if (n_kw != 0 || (scope_flags & MP_SCOPE_FLAG_DEFKWARGS) != 0) {
178  DEBUG_printf("Initial args: ");
179  dump_args(code_state->state + n_state - n_pos_args - n_kwonly_args, n_pos_args + n_kwonly_args);
180 
181  mp_obj_t dict = MP_OBJ_NULL;
182  if ((scope_flags & MP_SCOPE_FLAG_VARKEYWORDS) != 0) {
183  dict = mp_obj_new_dict(n_kw); // TODO: better go conservative with 0?
184  *var_pos_kw_args = dict;
185  }
186 
187  // get pointer to arg_names array
188  const mp_obj_t *arg_names = (const mp_obj_t*)self->const_table;
189 
190  for (size_t i = 0; i < n_kw; i++) {
191  // the keys in kwargs are expected to be qstr objects
192  mp_obj_t wanted_arg_name = kwargs[2 * i];
193  for (size_t j = 0; j < n_pos_args + n_kwonly_args; j++) {
194  if (wanted_arg_name == arg_names[j]) {
195  if (code_state->state[n_state - 1 - j] != MP_OBJ_NULL) {
197  "function got multiple values for argument '%q'", MP_OBJ_QSTR_VALUE(wanted_arg_name)));
198  }
199  code_state->state[n_state - 1 - j] = kwargs[2 * i + 1];
200  goto continue2;
201  }
202  }
203  // Didn't find name match with positional args
204  if ((scope_flags & MP_SCOPE_FLAG_VARKEYWORDS) == 0) {
206  mp_raise_TypeError("unexpected keyword argument");
207  } else {
209  "unexpected keyword argument '%q'", MP_OBJ_QSTR_VALUE(wanted_arg_name)));
210  }
211  }
212  mp_obj_dict_store(dict, kwargs[2 * i], kwargs[2 * i + 1]);
213 continue2:;
214  }
215 
216  DEBUG_printf("Args with kws flattened: ");
217  dump_args(code_state->state + n_state - n_pos_args - n_kwonly_args, n_pos_args + n_kwonly_args);
218 
219  // fill in defaults for positional args
220  mp_obj_t *d = &code_state->state[n_state - n_pos_args];
221  mp_obj_t *s = &self->extra_args[n_def_pos_args - 1];
222  for (size_t i = n_def_pos_args; i > 0; i--, d++, s--) {
223  if (*d == MP_OBJ_NULL) {
224  *d = *s;
225  }
226  }
227 
228  DEBUG_printf("Args after filling default positional: ");
229  dump_args(code_state->state + n_state - n_pos_args - n_kwonly_args, n_pos_args + n_kwonly_args);
230 
231  // Check that all mandatory positional args are specified
232  while (d < &code_state->state[n_state]) {
233  if (*d++ == MP_OBJ_NULL) {
235  "function missing required positional argument #%d", &code_state->state[n_state] - d));
236  }
237  }
238 
239  // Check that all mandatory keyword args are specified
240  // Fill in default kw args if we have them
241  for (size_t i = 0; i < n_kwonly_args; i++) {
242  if (code_state->state[n_state - 1 - n_pos_args - i] == MP_OBJ_NULL) {
243  mp_map_elem_t *elem = NULL;
244  if ((scope_flags & MP_SCOPE_FLAG_DEFKWARGS) != 0) {
245  elem = mp_map_lookup(&((mp_obj_dict_t*)MP_OBJ_TO_PTR(self->extra_args[n_def_pos_args]))->map, arg_names[n_pos_args + i], MP_MAP_LOOKUP);
246  }
247  if (elem != NULL) {
248  code_state->state[n_state - 1 - n_pos_args - i] = elem->value;
249  } else {
251  "function missing required keyword argument '%q'", MP_OBJ_QSTR_VALUE(arg_names[n_pos_args + i])));
252  }
253  }
254  }
255 
256  } else {
257  // no keyword arguments given
258  if (n_kwonly_args != 0) {
259  mp_raise_TypeError("function missing keyword-only argument");
260  }
261  if ((scope_flags & MP_SCOPE_FLAG_VARKEYWORDS) != 0) {
262  *var_pos_kw_args = mp_obj_new_dict(0);
263  }
264  }
265 
266  // get the ip and skip argument names
267  const byte *ip = code_state->ip;
268 
269  // jump over code info (source file and line-number mapping)
270  ip += mp_decode_uint_value(ip);
271 
272  // bytecode prelude: initialise closed over variables
273  size_t local_num;
274  while ((local_num = *ip++) != 255) {
275  code_state->state[n_state - 1 - local_num] =
276  mp_obj_new_cell(code_state->state[n_state - 1 - local_num]);
277  }
278 
279  // now that we skipped over the prelude, set the ip for the VM
280  code_state->ip = ip;
281 
282  DEBUG_printf("Calling: n_pos_args=%d, n_kwonly_args=%d\n", n_pos_args, n_kwonly_args);
283  dump_args(code_state->state + n_state - n_pos_args - n_kwonly_args, n_pos_args + n_kwonly_args);
284  dump_args(code_state->state, n_state);
285 }
286 
287 #if MICROPY_PERSISTENT_CODE_LOAD || MICROPY_PERSISTENT_CODE_SAVE
288 
289 // The following table encodes the number of bytes that a specific opcode
290 // takes up. There are 3 special opcodes that always have an extra byte:
291 // MP_BC_MAKE_CLOSURE
292 // MP_BC_MAKE_CLOSURE_DEFARGS
293 // MP_BC_RAISE_VARARGS
294 // There are 4 special opcodes that have an extra byte only when
295 // MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE is enabled:
296 // MP_BC_LOAD_NAME
297 // MP_BC_LOAD_GLOBAL
298 // MP_BC_LOAD_ATTR
299 // MP_BC_STORE_ATTR
300 #define OC4(a, b, c, d) (a | (b << 2) | (c << 4) | (d << 6))
301 #define U (0) // undefined opcode
302 #define B (MP_OPCODE_BYTE) // single byte
303 #define Q (MP_OPCODE_QSTR) // single byte plus 2-byte qstr
304 #define V (MP_OPCODE_VAR_UINT) // single byte plus variable encoded unsigned int
305 #define O (MP_OPCODE_OFFSET) // single byte plus 2-byte bytecode offset
306 STATIC const byte opcode_format_table[64] = {
307  OC4(U, U, U, U), // 0x00-0x03
308  OC4(U, U, U, U), // 0x04-0x07
309  OC4(U, U, U, U), // 0x08-0x0b
310  OC4(U, U, U, U), // 0x0c-0x0f
311  OC4(B, B, B, U), // 0x10-0x13
312  OC4(V, U, Q, V), // 0x14-0x17
313  OC4(B, V, V, Q), // 0x18-0x1b
314  OC4(Q, Q, Q, Q), // 0x1c-0x1f
315  OC4(B, B, V, V), // 0x20-0x23
316  OC4(Q, Q, Q, B), // 0x24-0x27
317  OC4(V, V, Q, Q), // 0x28-0x2b
318  OC4(U, U, U, U), // 0x2c-0x2f
319  OC4(B, B, B, B), // 0x30-0x33
320  OC4(B, O, O, O), // 0x34-0x37
321  OC4(O, O, U, U), // 0x38-0x3b
322  OC4(U, O, B, O), // 0x3c-0x3f
323  OC4(O, B, B, O), // 0x40-0x43
324  OC4(B, B, O, B), // 0x44-0x47
325  OC4(U, U, U, U), // 0x48-0x4b
326  OC4(U, U, U, U), // 0x4c-0x4f
327  OC4(V, V, U, V), // 0x50-0x53
328  OC4(B, U, V, V), // 0x54-0x57
329  OC4(V, V, V, B), // 0x58-0x5b
330  OC4(B, B, B, U), // 0x5c-0x5f
331  OC4(V, V, V, V), // 0x60-0x63
332  OC4(V, V, V, V), // 0x64-0x67
333  OC4(Q, Q, B, U), // 0x68-0x6b
334  OC4(U, U, U, U), // 0x6c-0x6f
335 
336  OC4(B, B, B, B), // 0x70-0x73
337  OC4(B, B, B, B), // 0x74-0x77
338  OC4(B, B, B, B), // 0x78-0x7b
339  OC4(B, B, B, B), // 0x7c-0x7f
340  OC4(B, B, B, B), // 0x80-0x83
341  OC4(B, B, B, B), // 0x84-0x87
342  OC4(B, B, B, B), // 0x88-0x8b
343  OC4(B, B, B, B), // 0x8c-0x8f
344  OC4(B, B, B, B), // 0x90-0x93
345  OC4(B, B, B, B), // 0x94-0x97
346  OC4(B, B, B, B), // 0x98-0x9b
347  OC4(B, B, B, B), // 0x9c-0x9f
348  OC4(B, B, B, B), // 0xa0-0xa3
349  OC4(B, B, B, B), // 0xa4-0xa7
350  OC4(B, B, B, B), // 0xa8-0xab
351  OC4(B, B, B, B), // 0xac-0xaf
352 
353  OC4(B, B, B, B), // 0xb0-0xb3
354  OC4(B, B, B, B), // 0xb4-0xb7
355  OC4(B, B, B, B), // 0xb8-0xbb
356  OC4(B, B, B, B), // 0xbc-0xbf
357 
358  OC4(B, B, B, B), // 0xc0-0xc3
359  OC4(B, B, B, B), // 0xc4-0xc7
360  OC4(B, B, B, B), // 0xc8-0xcb
361  OC4(B, B, B, B), // 0xcc-0xcf
362 
363  OC4(B, B, B, B), // 0xd0-0xd3
364  OC4(U, U, U, B), // 0xd4-0xd7
365  OC4(B, B, B, B), // 0xd8-0xdb
366  OC4(B, B, B, B), // 0xdc-0xdf
367 
368  OC4(B, B, B, B), // 0xe0-0xe3
369  OC4(B, B, B, B), // 0xe4-0xe7
370  OC4(B, B, B, B), // 0xe8-0xeb
371  OC4(B, B, B, B), // 0xec-0xef
372 
373  OC4(B, B, B, B), // 0xf0-0xf3
374  OC4(B, B, B, B), // 0xf4-0xf7
375  OC4(U, U, U, U), // 0xf8-0xfb
376  OC4(U, U, U, U), // 0xfc-0xff
377 };
378 #undef OC4
379 #undef U
380 #undef B
381 #undef Q
382 #undef V
383 #undef O
384 
385 uint mp_opcode_format(const byte *ip, size_t *opcode_size) {
386  uint f = (opcode_format_table[*ip >> 2] >> (2 * (*ip & 3))) & 3;
387  const byte *ip_start = ip;
388  if (f == MP_OPCODE_QSTR) {
389  ip += 3;
390  } else {
391  int extra_byte = (
392  *ip == MP_BC_RAISE_VARARGS
393  || *ip == MP_BC_MAKE_CLOSURE
395  #if MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE
396  || *ip == MP_BC_LOAD_NAME
397  || *ip == MP_BC_LOAD_GLOBAL
398  || *ip == MP_BC_LOAD_ATTR
399  || *ip == MP_BC_STORE_ATTR
400  #endif
401  );
402  ip += 1;
403  if (f == MP_OPCODE_VAR_UINT) {
404  while ((*ip++ & 0x80) != 0) {
405  }
406  } else if (f == MP_OPCODE_OFFSET) {
407  ip += 2;
408  }
409  ip += extra_byte;
410  }
411  *opcode_size = ip - ip_start;
412  return f;
413 }
414 
415 #endif // MICROPY_PERSISTENT_CODE_LOAD || MICROPY_PERSISTENT_CODE_SAVE
#define dump_args(...)
Definition: bc.c:100
mp_obj_t mp_obj_new_cell(mp_obj_t obj)
Definition: objcell.c:66
#define MP_BC_LOAD_NAME
Definition: bc0.h:42
uintptr_t mp_uint_t
Definition: mpconfigport.h:74
void * memset(void *b, int c, size_t len)
Definition: memset.c:3
const byte * ip
Definition: bc.h:78
#define MP_BC_RAISE_VARARGS
Definition: bc0.h:96
mp_obj_t state[0]
Definition: bc.h:87
mp_obj_t mp_obj_new_tuple(size_t n, const mp_obj_t *items)
Definition: objtuple.c:235
#define MICROPY_ERROR_REPORTING_TERSE
Definition: mpconfig.h:521
#define MP_SCOPE_FLAG_VARKEYWORDS
Definition: runtime0.h:31
const mp_obj_type_t mp_type_TypeError
#define MP_BC_STORE_ATTR
Definition: bc0.h:54
mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char *fmt,...)
Definition: objexcept.c:380
mp_exc_stack_t * exc_sp
Definition: bc.h:81
#define MP_OBJ_QSTR_VALUE(o)
Definition: obj.h:91
unsigned int size_t
Definition: stddef.h:7
#define U()
Definition: events.cpp:25
#define MP_SCOPE_FLAG_VARARGS
Definition: runtime0.h:30
#define MP_OBJ_FROM_PTR(p)
Definition: obj.h:233
mp_obj_fun_bc_t * fun_bc
Definition: bc.h:77
#define MP_BC_MAKE_CLOSURE_DEFARGS
Definition: bc0.h:103
#define STATIC
Definition: mpconfig.h:1178
#define MP_BC_LOAD_GLOBAL
Definition: bc0.h:43
#define MP_BC_MAKE_CLOSURE
Definition: bc0.h:102
mp_obj_t mp_obj_new_dict(size_t n_args)
Definition: objdict.c:584
mp_map_elem_t * mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t lookup_kind)
Definition: map.c:138
#define MICROPY_ERROR_REPORTING
Definition: mpconfigport.h:32
qstr mp_obj_fun_get_name(mp_const_obj_t fun)
Definition: objfun.c:154
#define NULL
Definition: stddef.h:4
#define MP_OBJ_NULL
Definition: obj.h:73
#define MP_BC_LOAD_ATTR
Definition: bc0.h:44
#define DEBUG_printf(...)
Definition: bc.c:40
mp_uint_t mp_decode_uint_value(const byte *ptr)
Definition: bc.c:61
mp_obj_t value
Definition: obj.h:343
args
Definition: i18n.py:175
mp_obj_t * sp
Definition: bc.h:79
#define NORETURN
Definition: mpconfig.h:1268
STATIC NORETURN void fun_pos_args_mismatch(mp_obj_fun_bc_t *f, size_t expected, size_t given)
Definition: bc.c:73
void mp_setup_code_state(mp_code_state_t *code_state, size_t n_args, size_t n_kw, const mp_obj_t *args)
Definition: bc.c:108
unsigned char byte
Definition: misc.h:37
mp_uint_t mp_decode_uint(const byte **ptr)
Definition: bc.c:43
mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value)
Definition: objdict.c:595
#define mp_const_empty_tuple
Definition: obj.h:618
#define MP_OBJ_TO_PTR(o)
Definition: obj.h:228
#define nlr_raise(val)
Definition: nlr.h:89
const byte * mp_decode_uint_skip(const byte *ptr)
Definition: bc.c:67
#define MICROPY_STACKLESS
Definition: mpconfig.h:216
NORETURN void mp_arg_error_terse_mismatch(void)
Definition: argcheck.c:136
uint64_t mp_obj_t
Definition: obj.h:39
NORETURN void mp_raise_TypeError(const char *msg)
Definition: runtime.c:1460
#define MP_SCOPE_FLAG_DEFKWARGS
Definition: runtime0.h:33
Q(color) Q(draw_string) Q(get_pixel) Q(set_pixel) Q(%Q(%Q() Q(*) Q(/) Q(< dictcomp >) Q(< genexpr >) Q(< lambda >) Q(< listcomp >) Q(< module >) Q(< setcomp >) Q(< stdin >) Q(< string >) Q(ArithmeticError) Q(AssertionError) Q(AttributeError) Q(BaseException) Q(BufferError) Q(EOFError) Q(Ellipsis) Q(Exception) Q(FileExistsError) Q(FileNotFoundError) Q(FloatingPointError) Q(GeneratorExit) Q(ImportError) Q(IndentationError) Q(IndexError) Q(KeyError) Q(KeyboardInterrupt) Q(LookupError) Q(MemoryError) Q(NameError) Q(NoneType) Q(NotImplementedError) Q(OSError) Q(OverflowError) Q(RuntimeError) Q(StopIteration) Q(SyntaxError) Q(SystemExit) Q(TypeError) Q(UnboundLocalError) Q(ValueError) Q(ZeroDivisionError) Q(\n) Q(_) Q(__add__) Q(__bool__) Q(__build_class__) Q(__call__) Q(__class__) Q(__contains__) Q(__delitem__) Q(__enter__) Q(__eq__) Q(__exit__) Q(__ge__) Q(__getattr__) Q(__getitem__) Q(__gt__) Q(__hash__) Q(__iadd__) Q(__import__) Q(__init__) Q(__isub__) Q(__iter__) Q(__le__) Q(__len__) Q(__locals__) Q(__lt__) Q(__main__) Q(__module__) Q(__name__) Q(__new__) Q(__next__) Q(__path__) Q(__qualname__) Q(__repl_print__) Q(__repr__) Q(__setitem__) Q(__str__) Q(__sub__) Q(__traceback__) Q(__brace_open__colon__hash_b_brace_close_) Q(_lt_dictcomp_gt_) Q(_lt_genexpr_gt_) Q(_lt_lambda_gt_) Q(_lt_listcomp_gt_) Q(_lt_module_gt_) Q(_lt_setcomp_gt_) Q(_lt_string_gt_) Q(_percent__hash_o) Q(_percent__hash_x) Q(_star_) Q(abs) Q(acos) Q(acosh) Q(all) Q(any) Q(append) Q(args) Q(asin) Q(asinh) Q(atan) Q(atan2) Q(atanh) Q(bin) Q(bool) Q(bound_method) Q(builtins) Q(bytecode) Q(bytes) Q(callable) Q(ceil) Q(chr) Q(classmethod) Q(clear) Q(close) Q(closure) Q(cmath) Q(complex) Q(const) Q(copy) Q(copysign) Q(cos) Q(cosh) Q(count) Q(default) Q(degrees) Q(dict) Q(dict_view) Q(dir) Q(divmod) Q(e) Q(end) Q(endswith) Q(erf) Q(erfc) Q(eval) Q(exec) Q(exp) Q(expm1) Q(extend) Q(fabs) Q(find) Q(float) Q(floor) Q(fmod) Q(format) Q(frexp) Q(from_bytes) Q(fromkeys) Q(function) Q(gamma) Q(generator) Q(get) Q(getattr) Q(globals) Q(hasattr) Q(hash) Q(heap_lock) Q(heap_unlock) Q(hex) Q(id) Q(imag) Q(index) Q(input) Q(insert) Q(int) Q(isalpha) Q(isdigit) Q(isfinite) Q(isinf) Q(isinstance) Q(islower) Q(isnan) Q(isspace) Q(issubclass) Q(isupper) Q(items) Q(iter) Q(iterator) Q(join) Q(kandinsky) Q(kbd_intr) Q(key) Q(keys) Q(ldexp) Q(len) Q(lgamma) Q(list) Q(little) Q(locals) Q(log) Q(log10) Q(log2) Q(lower) Q(lstrip) Q(map) Q(math) Q(max) Q(maximum recursion depth exceeded) Q(micropython) Q(min) Q(modf) Q(module) Q(next) Q(object) Q(oct) Q(open) Q(opt_level) Q(ord) Q(phase) Q(pi) Q(polar) Q(pop) Q(popitem) Q(pow) Q(print) Q(radians) Q(range) Q(real) Q(rect) Q(remove) Q(replace) Q(repr) Q(reverse) Q(rfind) Q(rindex) Q(round) Q(rsplit) Q(rstrip) Q(send) Q(sep) Q(setattr) Q(setdefault) Q(sin) Q(sinh) Q(slice) Q(sort) Q(sorted) Q(split) Q(sqrt) Q(start) Q(startswith) Q(staticmethod) Q(step) Q(stop) Q(str) Q(strip) Q(sum) Q(super) Q(tan) Q(tanh) Q(throw) Q(to_bytes) Q(trunc) Q(tuple) Q(type) Q(update) Q(upper) Q(utf-8) Q(value) Q(values) Q(zip) Q(
Definition: qstrdefs.in.h:9
unsigned int uint
Definition: misc.h:38