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 49 unum = (unum << 7) | (val & 0x7f);
50 }
while ((val & 0x80) != 0);
68 while ((*ptr++) & 0x80) {
74 #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE 80 #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL 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",
94 for (
size_t i = 0; i < sz; i++) {
100 #define dump_args(...) (void)0 116 code_state->
ip =
self->bytecode + (
size_t)code_state->
ip;
119 code_state->prev =
NULL;
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++;
130 code_state->
sp = &code_state->
state[0] - 1;
139 mp_obj_t *var_pos_kw_args = &code_state->
state[n_state - 1 - n_pos_args - n_kwonly_args];
143 if (n_args > n_pos_args) {
159 if (n_args >= (
size_t)(n_pos_args - n_def_pos_args)) {
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)];
171 for (
size_t i = 0; i < n_args; i++) {
172 code_state->
state[n_state - 1 - i] =
args[i];
179 dump_args(code_state->
state + n_state - n_pos_args - n_kwonly_args, n_pos_args + n_kwonly_args);
184 *var_pos_kw_args = dict;
190 for (
size_t i = 0; i < n_kw; i++) {
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]) {
197 "function got multiple values for argument '%q'",
MP_OBJ_QSTR_VALUE(wanted_arg_name)));
199 code_state->
state[n_state - 1 - j] = kwargs[2 * i + 1];
217 dump_args(code_state->
state + n_state - n_pos_args - n_kwonly_args, n_pos_args + n_kwonly_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--) {
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);
232 while (d < &code_state->state[n_state]) {
235 "function missing required positional argument #%d", &code_state->
state[n_state] - d));
241 for (
size_t i = 0; i < n_kwonly_args; i++) {
248 code_state->
state[n_state - 1 - n_pos_args - i] = elem->
value;
251 "function missing required keyword argument '%q'",
MP_OBJ_QSTR_VALUE(arg_names[n_pos_args + i])));
258 if (n_kwonly_args != 0) {
267 const byte *ip = code_state->
ip;
274 while ((local_num = *ip++) != 255) {
275 code_state->
state[n_state - 1 - local_num] =
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);
287 #if MICROPY_PERSISTENT_CODE_LOAD || MICROPY_PERSISTENT_CODE_SAVE 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 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) {
395 #if MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE 403 if (f == MP_OPCODE_VAR_UINT) {
404 while ((*ip++ & 0x80) != 0) {
406 }
else if (f == MP_OPCODE_OFFSET) {
411 *opcode_size = ip - ip_start;
415 #endif // MICROPY_PERSISTENT_CODE_LOAD || MICROPY_PERSISTENT_CODE_SAVE
mp_obj_t mp_obj_new_cell(mp_obj_t obj)
void * memset(void *b, int c, size_t len)
#define MP_BC_RAISE_VARARGS
mp_obj_t mp_obj_new_tuple(size_t n, const mp_obj_t *items)
#define MICROPY_ERROR_REPORTING_TERSE
#define MP_SCOPE_FLAG_VARKEYWORDS
const mp_obj_type_t mp_type_TypeError
mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char *fmt,...)
#define MP_OBJ_QSTR_VALUE(o)
#define MP_SCOPE_FLAG_VARARGS
#define MP_OBJ_FROM_PTR(p)
#define MP_BC_MAKE_CLOSURE_DEFARGS
#define MP_BC_LOAD_GLOBAL
#define MP_BC_MAKE_CLOSURE
mp_obj_t mp_obj_new_dict(size_t n_args)
mp_map_elem_t * mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t lookup_kind)
#define MICROPY_ERROR_REPORTING
qstr mp_obj_fun_get_name(mp_const_obj_t fun)
#define DEBUG_printf(...)
mp_uint_t mp_decode_uint_value(const byte *ptr)
STATIC NORETURN void fun_pos_args_mismatch(mp_obj_fun_bc_t *f, size_t expected, size_t given)
void mp_setup_code_state(mp_code_state_t *code_state, size_t n_args, size_t n_kw, const mp_obj_t *args)
mp_uint_t mp_decode_uint(const byte **ptr)
mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value)
#define mp_const_empty_tuple
const byte * mp_decode_uint_skip(const byte *ptr)
#define MICROPY_STACKLESS
NORETURN void mp_arg_error_terse_mismatch(void)
NORETURN void mp_raise_TypeError(const char *msg)
#define MP_SCOPE_FLAG_DEFKWARGS
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(