From 7a16fadbf843ca5d49fb20b5f5785ffccfd9019f Mon Sep 17 00:00:00 2001 From: ian-v Date: Mon, 6 Jan 2014 09:52:29 -0800 Subject: [PATCH 1/8] Co-exist with C++ (issue #85) --- py/asmthumb.c | 8 +- py/asmthumb.h | 2 +- py/asmx64.c | 12 +-- py/asmx64.h | 2 +- py/bc.h | 2 +- py/builtinimport.c | 2 +- py/compile.c | 224 +++++++++++++++++++++---------------------- py/compile.h | 2 +- py/emit.h | 10 +- py/emitbc.c | 18 ++-- py/emitcpy.c | 32 +++---- py/emitinlinethumb.c | 6 +- py/emitnative.c | 30 +++--- py/emitpass1.c | 4 +- py/lexer.c | 80 ++++++++-------- py/lexer.h | 14 +-- py/lexerunix.c | 6 +- py/lexerunix.h | 2 +- py/map.c | 12 +-- py/map.h | 6 +- py/misc.h | 18 ++-- py/obj.c | 20 ++-- py/obj.h | 31 +++--- py/objbool.c | 8 +- py/objboundmeth.c | 2 +- py/objcell.c | 2 +- py/objclass.c | 4 +- py/objclosure.c | 2 +- py/objcomplex.c | 2 +- py/objdict.c | 10 +- py/objexcept.c | 2 +- py/objfloat.c | 2 +- py/objfun.c | 12 +-- py/objgenerator.c | 6 +- py/objinstance.c | 16 ++-- py/objint.c | 2 +- py/objlist.c | 28 +++--- py/objmodule.c | 2 +- py/objnone.c | 2 +- py/objrange.c | 4 +- py/objset.c | 10 +- py/objslice.c | 4 +- py/objstr.c | 13 +-- py/objtuple.c | 12 ++- py/objtype.c | 2 +- py/parse.c | 44 ++++----- py/repl.c | 8 +- py/repl.h | 2 +- py/runtime.c | 142 ++++++++++++++------------- py/runtime0.h | 2 +- py/scope.c | 14 +-- py/scope.h | 4 +- py/unicode.c | 14 +-- py/vm.c | 8 +- py/vstr.c | 18 ++-- stm/audio.c | 2 +- stm/cc3k/pybcc3k.c | 6 +- stm/i2c.c | 83 ++++++++-------- stm/led.c | 11 ++- stm/lexerstm.c | 2 +- stm/lexerstm.h | 4 +- stm/main.c | 47 ++++----- stm/printf.c | 10 +- stm/pybwlan.c | 2 +- stm/servo.c | 9 +- stm/storage.c | 30 +++--- stm/storage.h | 6 +- stm/systick.c | 2 +- stm/systick.h | 2 +- stm/usart.c | 8 +- stm/usart.h | 4 +- stm/usb.c | 2 +- stm/usb.h | 2 +- unix-cpy/main.c | 2 +- unix/main.c | 8 +- 75 files changed, 599 insertions(+), 589 deletions(-) diff --git a/py/asmthumb.c b/py/asmthumb.c index ba95d80c6..76a93b9a3 100644 --- a/py/asmthumb.c +++ b/py/asmthumb.c @@ -45,7 +45,7 @@ asm_thumb_t *asm_thumb_new(uint max_num_labels) { return as; } -void asm_thumb_free(asm_thumb_t *as, bool free_code) { +void asm_thumb_free(asm_thumb_t *as, MP_BOOL free_code) { if (free_code) { m_del(byte, as->code_base, as->code_size); } @@ -56,9 +56,9 @@ void asm_thumb_free(asm_thumb_t *as, bool free_code) { { Label *lab = &g_array_index(as->label, Label, i); if (lab->unresolved != NULL) - g_array_free(lab->unresolved, true); + g_array_free(lab->unresolved, MP_TRUE); } - g_array_free(as->label, true); + g_array_free(as->label, MP_TRUE); } */ m_del_obj(asm_thumb_t, as); @@ -87,7 +87,7 @@ void asm_thumb_end_pass(asm_thumb_t *as) { int i; for (i = 0; i < as->label->len; ++i) if (g_array_index(as->label, Label, i).unresolved != NULL) - return false; + return MP_FALSE; } */ } diff --git a/py/asmthumb.h b/py/asmthumb.h index dcd9c2e3a..c6ebcb4c4 100644 --- a/py/asmthumb.h +++ b/py/asmthumb.h @@ -44,7 +44,7 @@ typedef struct _asm_thumb_t asm_thumb_t; asm_thumb_t *asm_thumb_new(uint max_num_labels); -void asm_thumb_free(asm_thumb_t *as, bool free_code); +void asm_thumb_free(asm_thumb_t *as, MP_BOOL free_code); void asm_thumb_start_pass(asm_thumb_t *as, int pass); void asm_thumb_end_pass(asm_thumb_t *as); uint asm_thumb_get_code_size(asm_thumb_t *as); diff --git a/py/asmx64.c b/py/asmx64.c index ed9ca80f5..054f41188 100644 --- a/py/asmx64.c +++ b/py/asmx64.c @@ -94,7 +94,7 @@ struct _asm_x64_t { }; // for allocating memory, see src/v8/src/platform-linux.cc -void *alloc_mem(uint req_size, uint *alloc_size, bool is_exec) { +void *alloc_mem(uint req_size, uint *alloc_size, MP_BOOL is_exec) { req_size = (req_size + 0xfff) & (~0xfff); int prot = PROT_READ | PROT_WRITE | (is_exec ? PROT_EXEC : 0); void *ptr = mmap(NULL, req_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); @@ -119,7 +119,7 @@ asm_x64_t* asm_x64_new(uint max_num_labels) { return as; } -void asm_x64_free(asm_x64_t* as, bool free_code) { +void asm_x64_free(asm_x64_t* as, MP_BOOL free_code) { if (free_code) { // need to un-mmap //m_free(as->code_base); @@ -131,9 +131,9 @@ void asm_x64_free(asm_x64_t* as, bool free_code) { { Label* lab = &g_array_index(as->label, Label, i); if (lab->unresolved != NULL) - g_array_free(lab->unresolved, true); + g_array_free(lab->unresolved, MP_TRUE); } - g_array_free(as->label, true); + g_array_free(as->label, MP_TRUE); } */ m_del_obj(asm_x64_t, as); @@ -154,7 +154,7 @@ void asm_x64_end_pass(asm_x64_t *as) { as->code_size = as->code_offset; //as->code_base = m_new(byte, as->code_size); need to allocale executable memory uint actual_alloc; - as->code_base = alloc_mem(as->code_size, &actual_alloc, true); + as->code_base = alloc_mem(as->code_size, &actual_alloc, MP_TRUE); printf("code_size: %u\n", as->code_size); } @@ -165,7 +165,7 @@ void asm_x64_end_pass(asm_x64_t *as) { int i; for (i = 0; i < as->label->len; ++i) if (g_array_index(as->label, Label, i).unresolved != NULL) - return false; + return MP_FALSE; } */ } diff --git a/py/asmx64.h b/py/asmx64.h index 16cc3b211..1ee39a3b2 100644 --- a/py/asmx64.h +++ b/py/asmx64.h @@ -27,7 +27,7 @@ typedef struct _asm_x64_t asm_x64_t; asm_x64_t* asm_x64_new(uint max_num_labels); -void asm_x64_free(asm_x64_t* as, bool free_code); +void asm_x64_free(asm_x64_t* as, MP_BOOL free_code); void asm_x64_start_pass(asm_x64_t *as, int pass); void asm_x64_end_pass(asm_x64_t *as); uint asm_x64_get_code_size(asm_x64_t* as); diff --git a/py/bc.h b/py/bc.h index 35847f458..b1fdb3aa1 100644 --- a/py/bc.h +++ b/py/bc.h @@ -1,2 +1,2 @@ mp_obj_t mp_execute_byte_code(const byte *code, const mp_obj_t *args, uint n_args, uint n_state); -bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out); +MP_BOOL mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out); diff --git a/py/builtinimport.c b/py/builtinimport.c index 90a0fc339..ba191ddd7 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -58,7 +58,7 @@ mp_obj_t mp_builtin___import__(int n, mp_obj_t *args) { return mp_const_none; } - mp_obj_t module_fun = mp_compile(pn, false); + mp_obj_t module_fun = mp_compile(pn, MP_FALSE); if (module_fun == mp_const_none) { // TODO handle compile error correctly diff --git a/py/compile.c b/py/compile.c index 0e1989031..d388ad809 100644 --- a/py/compile.c +++ b/py/compile.c @@ -39,9 +39,9 @@ typedef enum { #define EMIT_OPT_ASM_THUMB (4) typedef struct _compiler_t { - bool is_repl; + MP_BOOL is_repl; pass_kind_t pass; - bool had_error; // try to keep compiler clean from nlr + MP_BOOL had_error; // try to keep compiler clean from nlr int next_label; @@ -50,9 +50,9 @@ typedef struct _compiler_t { int except_nest_level; int n_arg_keyword; - bool have_star_arg; - bool have_dbl_star_arg; - bool have_bare_star; + MP_BOOL have_star_arg; + MP_BOOL have_dbl_star_arg; + MP_BOOL have_bare_star; int param_pass; int param_pass_num_dict_params; int param_pass_num_default_params; @@ -261,36 +261,36 @@ void compile_generic_all_nodes(compiler_t *comp, mp_parse_node_struct_t *pns) { } #if MICROPY_EMIT_CPYTHON -static bool cpython_c_tuple_is_const(mp_parse_node_t pn) { +static MP_BOOL cpython_c_tuple_is_const(mp_parse_node_t pn) { if (!MP_PARSE_NODE_IS_LEAF(pn)) { - return false; + return MP_FALSE; } if (MP_PARSE_NODE_IS_ID(pn)) { - return false; + return MP_FALSE; } - return true; + return MP_TRUE; } -static void cpython_c_print_quoted_str(vstr_t *vstr, qstr qstr, bool bytes) { +static void cpython_c_print_quoted_str(vstr_t *vstr, qstr qstr, MP_BOOL bytes) { const char *str = qstr_str(qstr); int len = strlen(str); - bool has_single_quote = false; - bool has_double_quote = false; + MP_BOOL has_single_quote = MP_FALSE; + MP_BOOL has_double_quote = MP_FALSE; for (int i = 0; i < len; i++) { if (str[i] == '\'') { - has_single_quote = true; + has_single_quote = MP_TRUE; } else if (str[i] == '"') { - has_double_quote = true; + has_double_quote = MP_TRUE; } } if (bytes) { vstr_printf(vstr, "b"); } - bool quote_single = false; + MP_BOOL quote_single = MP_FALSE; if (has_single_quote && !has_double_quote) { vstr_printf(vstr, "\""); } else { - quote_single = true; + quote_single = MP_TRUE; vstr_printf(vstr, "'"); } for (int i = 0; i < len; i++) { @@ -319,8 +319,8 @@ static void cpython_c_tuple_emit_const(compiler_t *comp, mp_parse_node_t pn, vst case MP_PARSE_NODE_SMALL_INT: vstr_printf(vstr, "%d", arg); break; case MP_PARSE_NODE_INTEGER: vstr_printf(vstr, "%s", qstr_str(arg)); break; case MP_PARSE_NODE_DECIMAL: vstr_printf(vstr, "%s", qstr_str(arg)); break; - case MP_PARSE_NODE_STRING: cpython_c_print_quoted_str(vstr, arg, false); break; - case MP_PARSE_NODE_BYTES: cpython_c_print_quoted_str(vstr, arg, true); break; + case MP_PARSE_NODE_STRING: cpython_c_print_quoted_str(vstr, arg, MP_FALSE); break; + case MP_PARSE_NODE_BYTES: cpython_c_print_quoted_str(vstr, arg, MP_TRUE); break; case MP_PARSE_NODE_TOKEN: switch (arg) { case MP_TOKEN_KW_FALSE: vstr_printf(vstr, "False"); break; @@ -339,33 +339,33 @@ static void cpython_c_tuple(compiler_t *comp, mp_parse_node_t pn, mp_parse_node_ n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns_list); } int total = n; - bool is_const = true; + MP_BOOL is_const = MP_TRUE; if (!MP_PARSE_NODE_IS_NULL(pn)) { total += 1; if (!cpython_c_tuple_is_const(pn)) { - is_const = false; + is_const = MP_FALSE; } } for (int i = 0; i < n; i++) { if (!cpython_c_tuple_is_const(pns_list->nodes[i])) { - is_const = false; + is_const = MP_FALSE; break; } } if (total > 0 && is_const) { - bool need_comma = false; + MP_BOOL need_comma = MP_FALSE; vstr_t *vstr = vstr_new(); vstr_printf(vstr, "("); if (!MP_PARSE_NODE_IS_NULL(pn)) { cpython_c_tuple_emit_const(comp, pn, vstr); - need_comma = true; + need_comma = MP_TRUE; } for (int i = 0; i < n; i++) { if (need_comma) { vstr_printf(vstr, ", "); } cpython_c_tuple_emit_const(comp, pns_list->nodes[i], vstr); - need_comma = true; + need_comma = MP_TRUE; } if (total == 1) { vstr_printf(vstr, ",)"); @@ -412,25 +412,25 @@ void compile_generic_tuple(compiler_t *comp, mp_parse_node_struct_t *pns) { c_tuple(comp, MP_PARSE_NODE_NULL, pns); } -static bool node_is_const_false(mp_parse_node_t pn) { +static MP_BOOL node_is_const_false(mp_parse_node_t pn) { return MP_PARSE_NODE_IS_TOKEN_KIND(pn, MP_TOKEN_KW_FALSE); // untested: || (MP_PARSE_NODE_IS_SMALL_INT(pn) && MP_PARSE_NODE_LEAF_ARG(pn) == 1); } -static bool node_is_const_true(mp_parse_node_t pn) { +static MP_BOOL node_is_const_true(mp_parse_node_t pn) { return MP_PARSE_NODE_IS_TOKEN_KIND(pn, MP_TOKEN_KW_TRUE) || (MP_PARSE_NODE_IS_SMALL_INT(pn) && MP_PARSE_NODE_LEAF_ARG(pn) == 1); } #if MICROPY_EMIT_CPYTHON // the is_nested variable is purely to match with CPython, which doesn't fully optimise not's -static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if, int label, bool is_nested) { +static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump_if, int label, MP_BOOL is_nested) { if (node_is_const_false(pn)) { - if (jump_if == false) { + if (jump_if == MP_FALSE) { EMIT(jump, label); } return; } else if (node_is_const_true(pn)) { - if (jump_if == true) { + if (jump_if == MP_TRUE) { EMIT(jump, label); } return; @@ -438,42 +438,42 @@ static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; int n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns); if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_or_test) { - if (jump_if == false) { + if (jump_if == MP_FALSE) { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - cpython_c_if_cond(comp, pns->nodes[i], true, label2, true); + cpython_c_if_cond(comp, pns->nodes[i], MP_TRUE, label2, MP_TRUE); } - cpython_c_if_cond(comp, pns->nodes[n - 1], false, label, true); + cpython_c_if_cond(comp, pns->nodes[n - 1], MP_FALSE, label, MP_TRUE); EMIT(label_assign, label2); } else { for (int i = 0; i < n; i++) { - cpython_c_if_cond(comp, pns->nodes[i], true, label, true); + cpython_c_if_cond(comp, pns->nodes[i], MP_TRUE, label, MP_TRUE); } } return; } else if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_and_test) { - if (jump_if == false) { + if (jump_if == MP_FALSE) { for (int i = 0; i < n; i++) { - cpython_c_if_cond(comp, pns->nodes[i], false, label, true); + cpython_c_if_cond(comp, pns->nodes[i], MP_FALSE, label, MP_TRUE); } } else { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - cpython_c_if_cond(comp, pns->nodes[i], false, label2, true); + cpython_c_if_cond(comp, pns->nodes[i], MP_FALSE, label2, MP_TRUE); } - cpython_c_if_cond(comp, pns->nodes[n - 1], true, label, true); + cpython_c_if_cond(comp, pns->nodes[n - 1], MP_TRUE, label, MP_TRUE); EMIT(label_assign, label2); } return; } else if (!is_nested && MP_PARSE_NODE_STRUCT_KIND(pns) == PN_not_test_2) { - cpython_c_if_cond(comp, pns->nodes[0], !jump_if, label, true); + cpython_c_if_cond(comp, pns->nodes[0], !jump_if, label, MP_TRUE); return; } } // nothing special, fall back to default compiling for node and jump compile_node(comp, pn); - if (jump_if == false) { + if (jump_if == MP_FALSE) { EMIT(pop_jump_if_false, label); } else { EMIT(pop_jump_if_true, label); @@ -481,17 +481,17 @@ static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if } #endif -static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if, int label) { +static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump_if, int label) { #if MICROPY_EMIT_CPYTHON - cpython_c_if_cond(comp, pn, jump_if, label, false); + cpython_c_if_cond(comp, pn, jump_if, label, MP_FALSE); #else if (node_is_const_false(pn)) { - if (jump_if == false) { + if (jump_if == MP_FALSE) { EMIT(jump, label); } return; } else if (node_is_const_true(pn)) { - if (jump_if == true) { + if (jump_if == MP_TRUE) { EMIT(jump, label); } return; @@ -499,30 +499,30 @@ static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if, int la mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; int n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns); if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_or_test) { - if (jump_if == false) { + if (jump_if == MP_FALSE) { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - c_if_cond(comp, pns->nodes[i], true, label2); + c_if_cond(comp, pns->nodes[i], MP_TRUE, label2); } - c_if_cond(comp, pns->nodes[n - 1], false, label); + c_if_cond(comp, pns->nodes[n - 1], MP_FALSE, label); EMIT(label_assign, label2); } else { for (int i = 0; i < n; i++) { - c_if_cond(comp, pns->nodes[i], true, label); + c_if_cond(comp, pns->nodes[i], MP_TRUE, label); } } return; } else if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_and_test) { - if (jump_if == false) { + if (jump_if == MP_FALSE) { for (int i = 0; i < n; i++) { - c_if_cond(comp, pns->nodes[i], false, label); + c_if_cond(comp, pns->nodes[i], MP_FALSE, label); } } else { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - c_if_cond(comp, pns->nodes[i], false, label2); + c_if_cond(comp, pns->nodes[i], MP_FALSE, label2); } - c_if_cond(comp, pns->nodes[n - 1], true, label); + c_if_cond(comp, pns->nodes[n - 1], MP_TRUE, label); EMIT(label_assign, label2); } return; @@ -534,7 +534,7 @@ static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if, int la // nothing special, fall back to default compiling for node and jump compile_node(comp, pn); - if (jump_if == false) { + if (jump_if == MP_FALSE) { EMIT(pop_jump_if_false, label); } else { EMIT(pop_jump_if_true, label); @@ -803,7 +803,7 @@ void compile_funcdef_param(compiler_t *comp, mp_parse_node_t pn) { mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; if (MP_PARSE_NODE_IS_NULL(pns->nodes[0])) { // bare star - comp->have_bare_star = true; + comp->have_bare_star = MP_TRUE; } } } @@ -819,18 +819,18 @@ qstr compile_funcdef_helper(compiler_t *comp, mp_parse_node_struct_t *pns, uint } // save variables (probably don't need to do this, since we can't have nested definitions..?) - bool old_have_bare_star = comp->have_bare_star; + MP_BOOL old_have_bare_star = comp->have_bare_star; int old_param_pass = comp->param_pass; int old_param_pass_num_dict_params = comp->param_pass_num_dict_params; int old_param_pass_num_default_params = comp->param_pass_num_default_params; // compile default parameters - comp->have_bare_star = false; + comp->have_bare_star = MP_FALSE; comp->param_pass = 1; // pass 1 does any default parameters after bare star comp->param_pass_num_dict_params = 0; comp->param_pass_num_default_params = 0; apply_to_single_or_list(comp, pns->nodes[1], PN_typedargslist, compile_funcdef_param); - comp->have_bare_star = false; + comp->have_bare_star = MP_FALSE; comp->param_pass = 2; // pass 2 does any default parameters before bare star comp->param_pass_num_dict_params = 0; comp->param_pass_num_default_params = 0; @@ -876,12 +876,12 @@ qstr compile_classdef_helper(compiler_t *comp, mp_parse_node_struct_t *pns, uint // nodes[1] has parent classes, if any if (MP_PARSE_NODE_IS_NULL(pns->nodes[1])) { // no parent classes - EMIT(call_function, 2, 0, false, false); + EMIT(call_function, 2, 0, MP_FALSE, MP_FALSE); } else { // have a parent class or classes // TODO what if we have, eg, *a or **a in the parent list? compile_node(comp, pns->nodes[1]); - EMIT(call_function, 2 + list_len(pns->nodes[1], PN_arglist), 0, false, false); + EMIT(call_function, 2 + list_len(pns->nodes[1], PN_arglist), 0, MP_FALSE, MP_FALSE); } // return its name (the 'C' in class C(...):") @@ -889,14 +889,14 @@ qstr compile_classdef_helper(compiler_t *comp, mp_parse_node_struct_t *pns, uint } // returns true if it was a built-in decorator (even if the built-in had an error) -static bool compile_built_in_decorator(compiler_t *comp, int name_len, mp_parse_node_t *name_nodes, uint *emit_options) { +static MP_BOOL compile_built_in_decorator(compiler_t *comp, int name_len, mp_parse_node_t *name_nodes, uint *emit_options) { if (MP_PARSE_NODE_LEAF_ARG(name_nodes[0]) != MP_QSTR_micropython) { - return false; + return MP_FALSE; } if (name_len != 2) { printf("SyntaxError: invalid micropython decorator\n"); - return true; + return MP_TRUE; } qstr attr = MP_PARSE_NODE_LEAF_ARG(name_nodes[1]); @@ -916,7 +916,7 @@ static bool compile_built_in_decorator(compiler_t *comp, int name_len, mp_parse_ printf("SyntaxError: invalid micropython decorator '%s'\n", qstr_str(attr)); } - return true; + return MP_TRUE; } void compile_decorated(compiler_t *comp, mp_parse_node_struct_t *pns) { @@ -974,7 +974,7 @@ void compile_decorated(compiler_t *comp, mp_parse_node_struct_t *pns) { // call each decorator for (int i = 0; i < n - num_built_in_decorators; i++) { - EMIT(call_function, 1, 0, false, false); + EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); } // store func/class object into name @@ -1094,7 +1094,7 @@ void compile_continue_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { void compile_return_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { if (comp->scope_cur->kind != SCOPE_FUNCTION) { printf("SyntaxError: 'return' outside function\n"); - comp->had_error = true; + comp->had_error = MP_TRUE; return; } if (MP_PARSE_NODE_IS_NULL(pns->nodes[0])) { @@ -1106,7 +1106,7 @@ void compile_return_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { mp_parse_node_struct_t *pns_test_if_else = (mp_parse_node_struct_t*)pns_test_if_expr->nodes[1]; int l_fail = comp_next_label(comp); - c_if_cond(comp, pns_test_if_else->nodes[0], false, l_fail); // condition + c_if_cond(comp, pns_test_if_else->nodes[0], MP_FALSE, l_fail); // condition compile_node(comp, pns_test_if_expr->nodes[0]); // success value EMIT(return_value); EMIT(label_assign, l_fail); @@ -1143,13 +1143,13 @@ void compile_raise_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { // eg a -> q1=q2=a // a.b.c -> q1=a, q2=a.b.c void do_import_name(compiler_t *comp, mp_parse_node_t pn, qstr *q1, qstr *q2) { - bool is_as = false; + MP_BOOL is_as = MP_FALSE; if (MP_PARSE_NODE_IS_STRUCT_KIND(pn, PN_dotted_as_name)) { mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; // a name of the form x as y; unwrap it *q1 = MP_PARSE_NODE_LEAF_ARG(pns->nodes[1]); pn = pns->nodes[0]; - is_as = true; + is_as = MP_TRUE; } if (MP_PARSE_NODE_IS_ID(pn)) { // just a simple name @@ -1220,7 +1220,7 @@ void compile_import_from(compiler_t *comp, mp_parse_node_struct_t *pns) { #if MICROPY_EMIT_CPYTHON EMIT(load_const_verbatim_str, "('*',)"); #else - EMIT(load_const_str, qstr_from_str_static("*"), false); + EMIT(load_const_str, qstr_from_str_static("*"), MP_FALSE); EMIT(build_tuple, 1); #endif @@ -1262,7 +1262,7 @@ void compile_import_from(compiler_t *comp, mp_parse_node_struct_t *pns) { assert(MP_PARSE_NODE_IS_STRUCT_KIND(pn_nodes[i], PN_import_as_name)); mp_parse_node_struct_t *pns3 = (mp_parse_node_struct_t*)pn_nodes[i]; qstr id2 = MP_PARSE_NODE_LEAF_ARG(pns3->nodes[0]); // should be id - EMIT(load_const_str, id2, false); + EMIT(load_const_str, id2, MP_FALSE); } EMIT(build_tuple, n); #endif @@ -1315,12 +1315,12 @@ void compile_nonlocal_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { void compile_assert_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { int l_end = comp_next_label(comp); - c_if_cond(comp, pns->nodes[0], true, l_end); + c_if_cond(comp, pns->nodes[0], MP_TRUE, l_end); EMIT(load_id, MP_QSTR_AssertionError); if (!MP_PARSE_NODE_IS_NULL(pns->nodes[1])) { // assertion message compile_node(comp, pns->nodes[1]); - EMIT(call_function, 1, 0, false, false); + EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); } EMIT(raise_varargs, 1); EMIT(label_assign, l_end); @@ -1332,7 +1332,7 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { int l_end = comp_next_label(comp); int l_fail = comp_next_label(comp); - c_if_cond(comp, pns->nodes[0], false, l_fail); // if condition + c_if_cond(comp, pns->nodes[0], MP_FALSE, l_fail); // if condition compile_node(comp, pns->nodes[1]); // if block //if (!(MP_PARSE_NODE_IS_NULL(pns->nodes[2]) && MP_PARSE_NODE_IS_NULL(pns->nodes[3]))) { // optimisation; doesn't align with CPython @@ -1355,7 +1355,7 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { for (int i = 0; i < n; i++) { mp_parse_node_struct_t *pns_elif2 = (mp_parse_node_struct_t*)pns_elif->nodes[i]; l_fail = comp_next_label(comp); - c_if_cond(comp, pns_elif2->nodes[0], false, l_fail); // elif condition + c_if_cond(comp, pns_elif2->nodes[0], MP_FALSE, l_fail); // elif condition compile_node(comp, pns_elif2->nodes[1]); // elif block if (!EMIT(last_emit_was_return_value)) { // simple optimisation to align with CPython @@ -1368,7 +1368,7 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { // a single elif block l_fail = comp_next_label(comp); - c_if_cond(comp, pns_elif->nodes[0], false, l_fail); // elif condition + c_if_cond(comp, pns_elif->nodes[0], MP_FALSE, l_fail); // elif condition compile_node(comp, pns_elif->nodes[1]); // elif block if (!EMIT(last_emit_was_return_value)) { // simple optimisation to align with CPython @@ -1399,7 +1399,7 @@ void compile_while_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { int done_label = comp_next_label(comp); EMIT(setup_loop, break_label); EMIT(label_assign, continue_label); - c_if_cond(comp, pns->nodes[0], false, done_label); // condition + c_if_cond(comp, pns->nodes[0], MP_FALSE, done_label); // condition compile_node(comp, pns->nodes[1]); // body if (!EMIT(last_emit_was_return_value)) { EMIT(jump, continue_label); @@ -1416,7 +1416,7 @@ void compile_while_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { EMIT(label_assign, top_label); compile_node(comp, pns->nodes[1]); // body EMIT(label_assign, continue_label); - c_if_cond(comp, pns->nodes[0], true, top_label); // condition + c_if_cond(comp, pns->nodes[0], MP_TRUE, top_label); // condition #endif // break/continue apply to outer loop (if any) in the else block @@ -1732,7 +1732,7 @@ void compile_expr_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { // for REPL, evaluate then print the expression EMIT(load_id, MP_QSTR___repl_print__); compile_node(comp, pns->nodes[0]); - EMIT(call_function, 1, 0, false, false); + EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); EMIT(pop_top); } else { @@ -1837,7 +1837,7 @@ void compile_test_if_expr(compiler_t *comp, mp_parse_node_struct_t *pns) { int stack_size = EMIT(get_stack_size); int l_fail = comp_next_label(comp); int l_end = comp_next_label(comp); - c_if_cond(comp, pns_test_if_else->nodes[0], false, l_fail); // condition + c_if_cond(comp, pns_test_if_else->nodes[0], MP_FALSE, l_fail); // condition compile_node(comp, pns->nodes[0]); // success value EMIT(jump, l_end); EMIT(label_assign, l_fail); @@ -1898,7 +1898,7 @@ void compile_comparison(compiler_t *comp, mp_parse_node_struct_t *pns) { int stack_size = EMIT(get_stack_size); int num_nodes = MP_PARSE_NODE_STRUCT_NUM_NODES(pns); compile_node(comp, pns->nodes[0]); - bool multi = (num_nodes > 3); + MP_BOOL multi = (num_nodes > 3); int l_fail = 0; if (multi) { l_fail = comp_next_label(comp); @@ -2042,15 +2042,15 @@ void compile_factor_2(compiler_t *comp, mp_parse_node_struct_t *pns) { } } -void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_struct_t *pns, bool is_method_call) { +void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_struct_t *pns, MP_BOOL is_method_call) { // function to call is on top of stack int old_n_arg_keyword = comp->n_arg_keyword; - bool old_have_star_arg = comp->have_star_arg; - bool old_have_dbl_star_arg = comp->have_dbl_star_arg; + MP_BOOL old_have_star_arg = comp->have_star_arg; + MP_BOOL old_have_dbl_star_arg = comp->have_dbl_star_arg; comp->n_arg_keyword = 0; - comp->have_star_arg = false; - comp->have_dbl_star_arg = false; + comp->have_star_arg = MP_FALSE; + comp->have_dbl_star_arg = MP_FALSE; compile_node(comp, pns->nodes[0]); // arguments to function call; can be null @@ -2082,7 +2082,7 @@ void compile_power_trailers(compiler_t *comp, mp_parse_node_struct_t *pns) { mp_parse_node_struct_t *pns_period = (mp_parse_node_struct_t*)pns->nodes[i]; mp_parse_node_struct_t *pns_paren = (mp_parse_node_struct_t*)pns->nodes[i + 1]; EMIT(load_method, MP_PARSE_NODE_LEAF_ARG(pns_period->nodes[0])); // get the method - compile_trailer_paren_helper(comp, pns_paren, true); + compile_trailer_paren_helper(comp, pns_paren, MP_TRUE); i += 1; } else { compile_node(comp, pns->nodes[i]); @@ -2153,7 +2153,7 @@ void compile_comprehension(compiler_t *comp, mp_parse_node_struct_t *pns, scope_ compile_node(comp, pns_comp_for->nodes[1]); // source of the iterator EMIT(get_iter); - EMIT(call_function, 1, 0, false, false); + EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); } void compile_atom_paren(compiler_t *comp, mp_parse_node_struct_t *pns) { @@ -2252,23 +2252,23 @@ void compile_atom_brace(compiler_t *comp, mp_parse_node_struct_t *pns) { int n = list_get(&pns1->nodes[0], PN_dictorsetmaker_list2, &nodes); // first element sets whether it's a dict or set - bool is_dict; + MP_BOOL is_dict; if (MP_PARSE_NODE_IS_STRUCT_KIND(pns->nodes[0], PN_dictorsetmaker_item)) { // a dictionary EMIT(build_map, 1 + n); compile_node(comp, pns->nodes[0]); EMIT(store_map); - is_dict = true; + is_dict = MP_TRUE; } else { // a set compile_node(comp, pns->nodes[0]); // 1st value of set - is_dict = false; + is_dict = MP_FALSE; } // process rest of elements for (int i = 0; i < n; i++) { mp_parse_node_t pn = nodes[i]; - bool is_key_value = MP_PARSE_NODE_IS_STRUCT_KIND(pn, PN_dictorsetmaker_item); + MP_BOOL is_key_value = MP_PARSE_NODE_IS_STRUCT_KIND(pn, PN_dictorsetmaker_item); compile_node(comp, pn); if (is_dict) { if (!is_key_value) { @@ -2314,7 +2314,7 @@ void compile_atom_brace(compiler_t *comp, mp_parse_node_struct_t *pns) { } void compile_trailer_paren(compiler_t *comp, mp_parse_node_struct_t *pns) { - compile_trailer_paren_helper(comp, pns, false); + compile_trailer_paren_helper(comp, pns, MP_FALSE); } void compile_trailer_bracket(compiler_t *comp, mp_parse_node_struct_t *pns) { @@ -2401,7 +2401,7 @@ void compile_arglist_star(compiler_t *comp, mp_parse_node_struct_t *pns) { printf("SyntaxError?: can't have multiple *x\n"); return; } - comp->have_star_arg = true; + comp->have_star_arg = MP_TRUE; compile_node(comp, pns->nodes[0]); } @@ -2410,7 +2410,7 @@ void compile_arglist_dbl_star(compiler_t *comp, mp_parse_node_struct_t *pns) { printf("SyntaxError?: can't have multiple **x\n"); return; } - comp->have_dbl_star_arg = true; + comp->have_dbl_star_arg = MP_TRUE; compile_node(comp, pns->nodes[0]); } @@ -2475,8 +2475,8 @@ void compile_node(compiler_t *comp, mp_parse_node_t pn) { case MP_PARSE_NODE_SMALL_INT: EMIT(load_const_small_int, arg); break; case MP_PARSE_NODE_INTEGER: EMIT(load_const_int, arg); break; case MP_PARSE_NODE_DECIMAL: EMIT(load_const_dec, arg); break; - case MP_PARSE_NODE_STRING: EMIT(load_const_str, arg, false); break; - case MP_PARSE_NODE_BYTES: EMIT(load_const_str, arg, true); break; + case MP_PARSE_NODE_STRING: EMIT(load_const_str, arg, MP_FALSE); break; + case MP_PARSE_NODE_BYTES: EMIT(load_const_str, arg, MP_TRUE); break; case MP_PARSE_NODE_TOKEN: if (arg == MP_TOKEN_NEWLINE) { // this can occur when file_input lets through a NEWLINE (eg if file starts with a newline) @@ -2501,7 +2501,7 @@ void compile_node(compiler_t *comp, mp_parse_node_t pn) { } } -void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_kind_t pn_name, pn_kind_t pn_star, pn_kind_t pn_dbl_star, bool allow_annotations) { +void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_kind_t pn_name, pn_kind_t pn_star, pn_kind_t pn_dbl_star, MP_BOOL allow_annotations) { // TODO verify that *k and **k are last etc qstr param_name = 0; mp_parse_node_t pn_annotation = MP_PARSE_NODE_NULL; @@ -2544,7 +2544,7 @@ void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_ki if (MP_PARSE_NODE_IS_NULL(pns->nodes[0])) { // bare star // TODO see http://www.python.org/dev/peps/pep-3102/ - comp->have_bare_star = true; + comp->have_bare_star = MP_TRUE; //assert(comp->scope_cur->num_dict_params == 0); } else if (MP_PARSE_NODE_IS_ID(pns->nodes[0])) { // named star @@ -2577,23 +2577,23 @@ void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_ki if (!MP_PARSE_NODE_IS_NULL(pn_annotation)) { // TODO this parameter has an annotation } - bool added; + MP_BOOL added; id_info_t *id_info = scope_find_or_add_id(comp->scope_cur, param_name, &added); if (!added) { printf("SyntaxError?: same name used for parameter; %s\n", qstr_str(param_name)); return; } - id_info->param = true; + id_info->param = MP_TRUE; id_info->kind = ID_INFO_KIND_LOCAL; } } void compile_scope_func_param(compiler_t *comp, mp_parse_node_t pn) { - compile_scope_func_lambda_param(comp, pn, PN_typedargslist_name, PN_typedargslist_star, PN_typedargslist_dbl_star, true); + compile_scope_func_lambda_param(comp, pn, PN_typedargslist_name, PN_typedargslist_star, PN_typedargslist_dbl_star, MP_TRUE); } void compile_scope_lambda_param(compiler_t *comp, mp_parse_node_t pn) { - compile_scope_func_lambda_param(comp, pn, PN_varargslist_name, PN_varargslist_star, PN_varargslist_dbl_star, false); + compile_scope_func_lambda_param(comp, pn, PN_varargslist_name, PN_varargslist_star, PN_varargslist_dbl_star, MP_FALSE); } void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_t pn_iter, mp_parse_node_t pn_inner_expr, int l_top, int for_depth) { @@ -2614,7 +2614,7 @@ void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_t pn_iter, mp_parse } else if (MP_PARSE_NODE_IS_STRUCT_KIND(pn_iter, PN_comp_if)) { // if condition mp_parse_node_struct_t *pns_comp_if = (mp_parse_node_struct_t*)pn_iter; - c_if_cond(comp, pns_comp_if->nodes[0], false, l_top); + c_if_cond(comp, pns_comp_if->nodes[0], MP_FALSE, l_top); pn_iter = pns_comp_if->nodes[1]; goto tail_recursion; } else if (MP_PARSE_NODE_IS_STRUCT_KIND(pn_iter, PN_comp_for)) { @@ -2708,7 +2708,7 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { // work out number of parameters, keywords and default parameters, and add them to the id_info array // must be done before compiling the body so that arguments are numbered first (for LOAD_FAST etc) if (comp->pass == PASS_1) { - comp->have_bare_star = false; + comp->have_bare_star = MP_FALSE; apply_to_single_or_list(comp, pns->nodes[1], PN_typedargslist, compile_scope_func_param); } @@ -2728,7 +2728,7 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { // work out number of parameters, keywords and default parameters, and add them to the id_info array // must be done before compiling the body so that arguments are numbered first (for LOAD_FAST etc) if (comp->pass == PASS_1) { - comp->have_bare_star = false; + comp->have_bare_star = MP_FALSE; apply_to_single_or_list(comp, pns->nodes[0], PN_varargslist, compile_scope_lambda_param); } @@ -2745,7 +2745,7 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { qstr qstr_arg = qstr_from_str_static(".0"); if (comp->pass == PASS_1) { - bool added; + MP_BOOL added; id_info_t *id_info = scope_find_or_add_id(comp->scope_cur, qstr_arg, &added); assert(added); id_info->kind = ID_INFO_KIND_LOCAL; @@ -2782,14 +2782,14 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { assert(MP_PARSE_NODE_STRUCT_KIND(pns) == PN_classdef); if (comp->pass == PASS_1) { - bool added; + MP_BOOL added; id_info_t *id_info = scope_find_or_add_id(scope, MP_QSTR___class__, &added); assert(added); id_info->kind = ID_INFO_KIND_LOCAL; id_info = scope_find_or_add_id(scope, MP_QSTR___locals__, &added); assert(added); id_info->kind = ID_INFO_KIND_LOCAL; - id_info->param = true; + id_info->param = MP_TRUE; scope->num_params = 1; // __locals__ is the parameter } @@ -3005,11 +3005,11 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) { } } -mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { +mp_obj_t mp_compile(mp_parse_node_t pn, MP_BOOL is_repl) { compiler_t *comp = m_new(compiler_t, 1); comp->is_repl = is_repl; - comp->had_error = false; + comp->had_error = MP_FALSE; comp->break_label = 0; comp->continue_label = 0; @@ -3030,7 +3030,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { comp->emit_inline_asm_method_table = NULL; uint max_num_labels = 0; for (scope_t *s = comp->scope_head; s != NULL && !comp->had_error; s = s->next) { - if (false) { + if (MP_FALSE) { #if MICROPY_EMIT_INLINE_THUMB } else if (s->emit_options == EMIT_OPT_ASM_THUMB) { compile_scope_inline_asm(comp, s, PASS_1); @@ -3064,7 +3064,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { #endif #endif // !MICROPY_EMIT_CPYTHON for (scope_t *s = comp->scope_head; s != NULL && !comp->had_error; s = s->next) { - if (false) { + if (MP_FALSE) { // dummy #if MICROPY_EMIT_INLINE_THUMB @@ -3126,7 +3126,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { } } - bool had_error = comp->had_error; + MP_BOOL had_error = comp->had_error; m_del_obj(compiler_t, comp); if (had_error) { diff --git a/py/compile.h b/py/compile.h index 770c2524d..27e47f2f1 100644 --- a/py/compile.h +++ b/py/compile.h @@ -1 +1 @@ -mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl); +mp_obj_t mp_compile(mp_parse_node_t pn, MP_BOOL is_repl); diff --git a/py/emit.h b/py/emit.h index ea6573103..156643859 100644 --- a/py/emit.h +++ b/py/emit.h @@ -17,10 +17,10 @@ typedef enum { typedef struct _emit_t emit_t; typedef struct _emit_method_table_t { - void (*set_native_types)(emit_t *emit, bool do_native_types); + void (*set_native_types)(emit_t *emit, MP_BOOL do_native_types); void (*start_pass)(emit_t *emit, pass_kind_t pass, scope_t *scope); void (*end_pass)(emit_t *emit); - bool (*last_emit_was_return_value)(emit_t *emit); + MP_BOOL (*last_emit_was_return_value)(emit_t *emit); int (*get_stack_size)(emit_t *emit); void (*set_stack_size)(emit_t *emit, int size); @@ -37,7 +37,7 @@ typedef struct _emit_method_table_t { void (*load_const_int)(emit_t *emit, qstr qstr); void (*load_const_dec)(emit_t *emit, qstr qstr); void (*load_const_id)(emit_t *emit, qstr qstr); - void (*load_const_str)(emit_t *emit, qstr qstr, bool bytes); + void (*load_const_str)(emit_t *emit, qstr qstr, MP_BOOL bytes); void (*load_const_verbatim_str)(emit_t *emit, const char *str); // only needed for emitcpy void (*load_fast)(emit_t *emit, qstr qstr, int local_num); void (*load_deref)(emit_t *emit, qstr qstr, int local_num); @@ -99,8 +99,8 @@ typedef struct _emit_method_table_t { void (*unpack_ex)(emit_t *emit, int n_left, int n_right); void (*make_function)(emit_t *emit, scope_t *scope, int n_dict_params, int n_default_params); void (*make_closure)(emit_t *emit, scope_t *scope, int n_dict_params, int n_default_params); - void (*call_function)(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg); - void (*call_method)(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg); + void (*call_function)(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg); + void (*call_method)(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg); void (*return_value)(emit_t *emit); void (*raise_varargs)(emit_t *emit, int n_args); void (*yield_value)(emit_t *emit); diff --git a/py/emitbc.c b/py/emitbc.c index c0ec2469a..93c92f41f 100644 --- a/py/emitbc.c +++ b/py/emitbc.c @@ -17,7 +17,7 @@ struct _emit_t { pass_kind_t pass; int stack_size; - bool last_emit_was_return_value; + MP_BOOL last_emit_was_return_value; scope_t *scope; @@ -135,13 +135,13 @@ static void emit_write_byte_1_signed_label(emit_t* emit, byte b1, int label) { c[2] = code_offset >> 8; } -static void emit_bc_set_native_types(emit_t *emit, bool do_native_types) { +static void emit_bc_set_native_types(emit_t *emit, MP_BOOL do_native_types) { } static void emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) { emit->pass = pass; emit->stack_size = 0; - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; emit->scope = scope; if (pass == PASS_2) { memset(emit->label_offsets, -1, emit->max_num_labels * sizeof(uint)); @@ -182,7 +182,7 @@ static void emit_bc_end_pass(emit_t *emit) { } } -bool emit_bc_last_emit_was_return_value(emit_t *emit) { +MP_BOOL emit_bc_last_emit_was_return_value(emit_t *emit) { return emit->last_emit_was_return_value; } @@ -211,7 +211,7 @@ static void emit_pre(emit_t *emit, int stack_size_delta) { if (emit->stack_size > emit->scope->stack_size) { emit->scope->stack_size = emit->stack_size; } - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; } static void emit_bc_label_assign(emit_t *emit, int l) { @@ -274,7 +274,7 @@ static void emit_bc_load_const_id(emit_t *emit, qstr qstr) { emit_write_byte_1_qstr(emit, MP_BC_LOAD_CONST_ID, qstr); } -static void emit_bc_load_const_str(emit_t *emit, qstr qstr, bool bytes) { +static void emit_bc_load_const_str(emit_t *emit, qstr qstr, MP_BOOL bytes) { emit_pre(emit, 1); if (bytes) { emit_write_byte_1_qstr(emit, MP_BC_LOAD_CONST_BYTES, qstr); @@ -613,7 +613,7 @@ static void emit_bc_make_closure(emit_t *emit, scope_t *scope, int n_dict_params emit_write_byte_1_uint(emit, MP_BC_MAKE_CLOSURE, scope->unique_code_id); } -static void emit_bc_call_function(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { +static void emit_bc_call_function(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { int s = 0; if (have_star_arg) { s += 1; @@ -639,7 +639,7 @@ static void emit_bc_call_function(emit_t *emit, int n_positional, int n_keyword, emit_write_byte_1_uint(emit, op, (n_keyword << 8) | n_positional); // TODO make it 2 separate uints } -static void emit_bc_call_method(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { +static void emit_bc_call_method(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { int s = 0; if (have_star_arg) { s += 1; @@ -667,7 +667,7 @@ static void emit_bc_call_method(emit_t *emit, int n_positional, int n_keyword, b static void emit_bc_return_value(emit_t *emit) { emit_pre(emit, -1); - emit->last_emit_was_return_value = true; + emit->last_emit_was_return_value = MP_TRUE; emit_write_byte_1(emit, MP_BC_RETURN_VALUE); } diff --git a/py/emitcpy.c b/py/emitcpy.c index 7b2d50fb7..ff44609d5 100644 --- a/py/emitcpy.c +++ b/py/emitcpy.c @@ -20,7 +20,7 @@ struct _emit_t { int pass; int byte_code_offset; int stack_size; - bool last_emit_was_return_value; + MP_BOOL last_emit_was_return_value; scope_t *scope; @@ -35,14 +35,14 @@ emit_t *emit_cpython_new(uint max_num_labels) { return emit; } -static void emit_cpy_set_native_types(emit_t *emit, bool do_native_types) { +static void emit_cpy_set_native_types(emit_t *emit, MP_BOOL do_native_types) { } static void emit_cpy_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) { emit->pass = pass; emit->byte_code_offset = 0; emit->stack_size = 0; - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; emit->scope = scope; if (pass == PASS_2) { memset(emit->label_offsets, -1, emit->max_num_labels * sizeof(int)); @@ -56,7 +56,7 @@ static void emit_cpy_end_pass(emit_t *emit) { } } -static bool emit_cpy_last_emit_was_return_value(emit_t *emit) { +static MP_BOOL emit_cpy_last_emit_was_return_value(emit_t *emit) { return emit->last_emit_was_return_value; } @@ -85,7 +85,7 @@ static void emit_pre(emit_t *emit, int stack_size_delta, int byte_code_size) { if (emit->stack_size > emit->scope->stack_size) { emit->scope->stack_size = emit->stack_size; } - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; if (emit->pass == PASS_3 && byte_code_size > 0) { if (emit->byte_code_offset >= 1000) { printf("%d ", emit->byte_code_offset); @@ -173,26 +173,26 @@ static void emit_cpy_load_const_id(emit_t *emit, qstr qstr) { } } -static void print_quoted_str(qstr qstr, bool bytes) { +static void print_quoted_str(qstr qstr, MP_BOOL bytes) { const char *str = qstr_str(qstr); int len = strlen(str); - bool has_single_quote = false; - bool has_double_quote = false; + MP_BOOL has_single_quote = MP_FALSE; + MP_BOOL has_double_quote = MP_FALSE; for (int i = 0; i < len; i++) { if (str[i] == '\'') { - has_single_quote = true; + has_single_quote = MP_TRUE; } else if (str[i] == '"') { - has_double_quote = true; + has_double_quote = MP_TRUE; } } if (bytes) { printf("b"); } - bool quote_single = false; + MP_BOOL quote_single = MP_FALSE; if (has_single_quote && !has_double_quote) { printf("\""); } else { - quote_single = true; + quote_single = MP_TRUE; printf("'"); } for (int i = 0; i < len; i++) { @@ -213,7 +213,7 @@ static void print_quoted_str(qstr qstr, bool bytes) { } } -static void emit_cpy_load_const_str(emit_t *emit, qstr qstr, bool bytes) { +static void emit_cpy_load_const_str(emit_t *emit, qstr qstr, MP_BOOL bytes) { emit_pre(emit, 1, 3); if (emit->pass == PASS_3) { printf("LOAD_CONST "); @@ -681,7 +681,7 @@ static void emit_cpy_unpack_ex(emit_t *emit, int n_left, int n_right) { } } -static void emit_cpy_call_function(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { +static void emit_cpy_call_function(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { int s = 0; if (have_star_arg) { s += 1; @@ -708,13 +708,13 @@ static void emit_cpy_call_function(emit_t *emit, int n_positional, int n_keyword } } -static void emit_cpy_call_method(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { +static void emit_cpy_call_method(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { emit_cpy_call_function(emit, n_positional, n_keyword, have_star_arg, have_dbl_star_arg); } static void emit_cpy_return_value(emit_t *emit) { emit_pre(emit, -1, 1); - emit->last_emit_was_return_value = true; + emit->last_emit_was_return_value = MP_TRUE; if (emit->pass == PASS_3) { printf("RETURN_VALUE\n"); } diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c index 073dfa060..9dc9a7a79 100644 --- a/py/emitinlinethumb.c +++ b/py/emitinlinethumb.c @@ -75,12 +75,12 @@ static void emit_inline_thumb_label(emit_inline_asm_t *emit, int label_num, qstr asm_thumb_label_assign(emit->as, label_num); } -static bool check_n_arg(qstr op, int n_args, int wanted_n_args) { +static MP_BOOL check_n_arg(qstr op, int n_args, int wanted_n_args) { if (wanted_n_args == n_args) { - return true; + return MP_TRUE; } else { printf("SyntaxError: '%s' expects %d arguments'\n", qstr_str(op), wanted_n_args); - return false; + return MP_FALSE; } } diff --git a/py/emitnative.c b/py/emitnative.c index cc00c5731..fd2ee5708 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -52,7 +52,7 @@ #define REG_TEMP2 (REG_RSI) #define ASM_MOV_REG_TO_LOCAL(reg, local_num) asm_x64_mov_r64_to_local(emit->as, (reg), (local_num)) #define ASM_MOV_IMM_TO_REG(imm, reg) asm_x64_mov_i64_to_r64_optimised(emit->as, (imm), (reg)) -#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_x64_mov_i64_to_r64_optimised(emit->as, (imm), (reg_temp)); asm_x64_mov_r64_to_local(emit->as, (reg_temp), (local_num)); } while (false) +#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_x64_mov_i64_to_r64_optimised(emit->as, (imm), (reg_temp)); asm_x64_mov_r64_to_local(emit->as, (reg_temp), (local_num)); } while (MP_FALSE) #define ASM_MOV_LOCAL_TO_REG(local_num, reg) asm_x64_mov_local_to_r64(emit->as, (local_num), (reg)) #define ASM_MOV_REG_TO_REG(reg_src, reg_dest) asm_x64_mov_r64_to_r64(emit->as, (reg_src), (reg_dest)) #define ASM_MOV_LOCAL_ADDR_TO_REG(local_num, reg) asm_x64_mov_local_addr_to_r64(emit->as, (local_num), (reg)) @@ -75,7 +75,7 @@ #define REG_TEMP2 (REG_R2) #define ASM_MOV_REG_TO_LOCAL(reg, local_num) asm_thumb_mov_local_reg(emit->as, (local_num), (reg)) #define ASM_MOV_IMM_TO_REG(imm, reg) asm_thumb_mov_reg_i32_optimised(emit->as, (reg), (imm)) -#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_thumb_mov_reg_i32_optimised(emit->as, (reg_temp), (imm)); asm_thumb_mov_local_reg(emit->as, (local_num), (reg_temp)); } while (false) +#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_thumb_mov_reg_i32_optimised(emit->as, (reg_temp), (imm)); asm_thumb_mov_local_reg(emit->as, (local_num), (reg_temp)); } while (MP_FALSE) #define ASM_MOV_LOCAL_TO_REG(local_num, reg) asm_thumb_mov_reg_local(emit->as, (reg), (local_num)) #define ASM_MOV_REG_TO_REG(reg_src, reg_dest) asm_thumb_mov_reg_reg(emit->as, (reg_dest), (reg_src)) #define ASM_MOV_LOCAL_ADDR_TO_REG(local_num, reg) asm_thumb_mov_reg_local_addr(emit->as, (reg), (local_num)) @@ -110,7 +110,7 @@ typedef struct _stack_info_t { struct _emit_t { int pass; - bool do_viper_types; + MP_BOOL do_viper_types; int local_vtype_alloc; vtype_kind_t *local_vtype; @@ -121,7 +121,7 @@ struct _emit_t { int stack_start; int stack_size; - bool last_emit_was_return_value; + MP_BOOL last_emit_was_return_value; scope_t *scope; @@ -134,7 +134,7 @@ struct _emit_t { emit_t *EXPORT_FUN(new)(uint max_num_labels) { emit_t *emit = m_new(emit_t, 1); - emit->do_viper_types = false; + emit->do_viper_types = MP_FALSE; emit->local_vtype = NULL; emit->stack_info = NULL; #if N_X64 @@ -145,7 +145,7 @@ emit_t *EXPORT_FUN(new)(uint max_num_labels) { return emit; } -static void emit_native_set_viper_types(emit_t *emit, bool do_viper_types) { +static void emit_native_set_viper_types(emit_t *emit, MP_BOOL do_viper_types) { emit->do_viper_types = do_viper_types; } @@ -153,7 +153,7 @@ static void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop emit->pass = pass; emit->stack_start = 0; emit->stack_size = 0; - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; emit->scope = scope; if (emit->local_vtype == NULL) { @@ -269,7 +269,7 @@ static void emit_native_end_pass(emit_t *emit) { } } -static bool emit_native_last_emit_was_return_value(emit_t *emit) { +static MP_BOOL emit_native_last_emit_was_return_value(emit_t *emit) { return emit->last_emit_was_return_value; } @@ -292,13 +292,13 @@ static void adjust_stack(emit_t *emit, int stack_size_delta) { /* static void emit_pre_raw(emit_t *emit, int stack_size_delta) { adjust_stack(emit, stack_size_delta); - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; } */ // this must be called at start of emit functions static void emit_pre(emit_t *emit) { - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; // settle the stack /* if (regs_needed != 0) { @@ -391,7 +391,7 @@ static void emit_access_stack(emit_t *emit, int pos, vtype_kind_t *vtype, int re } static void emit_pre_pop_reg(emit_t *emit, vtype_kind_t *vtype, int reg_dest) { - emit->last_emit_was_return_value = false; + emit->last_emit_was_return_value = MP_FALSE; emit_access_stack(emit, 1, vtype, reg_dest); adjust_stack(emit, -1); } @@ -618,7 +618,7 @@ static void emit_native_load_const_id(emit_t *emit, qstr qstr) { } } -static void emit_native_load_const_str(emit_t *emit, qstr qstr, bool bytes) { +static void emit_native_load_const_str(emit_t *emit, qstr qstr, MP_BOOL bytes) { emit_pre(emit); if (emit->do_viper_types) { // not implemented properly @@ -1134,7 +1134,7 @@ static void emit_native_make_closure(emit_t *emit, scope_t *scope, int n_dict_pa assert(0); } -static void emit_native_call_function(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { +static void emit_native_call_function(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { // call special viper runtime routine with type info for args, and wanted type info for return assert(n_keyword == 0 && !have_star_arg && !have_dbl_star_arg); /* @@ -1170,7 +1170,7 @@ static void emit_native_call_function(emit_t *emit, int n_positional, int n_keyw emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); } -static void emit_native_call_method(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { +static void emit_native_call_method(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { assert(n_keyword == 0 && !have_star_arg && !have_dbl_star_arg); /* if (n_positional == 0) { @@ -1205,7 +1205,7 @@ static void emit_native_return_value(emit_t *emit) { } else { assert(vtype == VTYPE_PYOBJ); } - emit->last_emit_was_return_value = true; + emit->last_emit_was_return_value = MP_TRUE; #if N_X64 //asm_x64_call_ind(emit->as, 0, REG_RAX); to seg fault for debugging with gdb asm_x64_exit(emit->as); diff --git a/py/emitpass1.c b/py/emitpass1.c index f78ec7e27..45197cb41 100644 --- a/py/emitpass1.c +++ b/py/emitpass1.c @@ -42,7 +42,7 @@ static void emit_pass1_end_pass(emit_t *emit) { static void emit_pass1_load_id(emit_t *emit, qstr qstr) { // name adding/lookup - bool added; + MP_BOOL added; id_info_t *id = scope_find_or_add_id(emit->scope, qstr, &added); if (added) { if (qstr == MP_QSTR_AssertionError) { @@ -73,7 +73,7 @@ static void emit_pass1_load_id(emit_t *emit, qstr qstr) { static id_info_t *get_id_for_modification(scope_t *scope, qstr qstr) { // name adding/lookup - bool added; + MP_BOOL added; id_info_t *id = scope_find_or_add_id(scope, qstr, &added); if (added) { if (scope->kind == SCOPE_MODULE || scope->kind == SCOPE_CLASS) { diff --git a/py/lexer.c b/py/lexer.c index d4205236c..7e18792b5 100644 --- a/py/lexer.c +++ b/py/lexer.c @@ -35,7 +35,7 @@ struct _mp_lexer_t { mp_token_t tok_cur; }; -bool str_strn_equal(const char *str, const char *strn, int len) { +MP_BOOL str_strn_equal(const char *str, const char *strn, int len) { uint i = 0; while (i < len && *str == *strn) { @@ -70,74 +70,74 @@ void mp_token_show_error_prefix(const mp_token_t *tok) { printf("(%s:%d:%d) ", tok->src_name, tok->src_line, tok->src_column); } -bool mp_token_show_error(const mp_token_t *tok, const char *msg) { +MP_BOOL mp_token_show_error(const mp_token_t *tok, const char *msg) { printf("(%s:%d:%d) %s\n", tok->src_name, tok->src_line, tok->src_column, msg); - return false; + return MP_FALSE; } #define CUR_CHAR(lex) ((lex)->chr0) -static bool is_end(mp_lexer_t *lex) { +static MP_BOOL is_end(mp_lexer_t *lex) { return lex->chr0 == MP_LEXER_CHAR_EOF; } -static bool is_physical_newline(mp_lexer_t *lex) { +static MP_BOOL is_physical_newline(mp_lexer_t *lex) { return lex->chr0 == '\n' || lex->chr0 == '\r'; } -static bool is_char(mp_lexer_t *lex, char c) { +static MP_BOOL is_char(mp_lexer_t *lex, char c) { return lex->chr0 == c; } -static bool is_char_or(mp_lexer_t *lex, char c1, char c2) { +static MP_BOOL is_char_or(mp_lexer_t *lex, char c1, char c2) { return lex->chr0 == c1 || lex->chr0 == c2; } -static bool is_char_or3(mp_lexer_t *lex, char c1, char c2, char c3) { +static MP_BOOL is_char_or3(mp_lexer_t *lex, char c1, char c2, char c3) { return lex->chr0 == c1 || lex->chr0 == c2 || lex->chr0 == c3; } /* -static bool is_char_following(mp_lexer_t *lex, char c) { +static MP_BOOL is_char_following(mp_lexer_t *lex, char c) { return lex->chr1 == c; } */ -static bool is_char_following_or(mp_lexer_t *lex, char c1, char c2) { +static MP_BOOL is_char_following_or(mp_lexer_t *lex, char c1, char c2) { return lex->chr1 == c1 || lex->chr1 == c2; } -static bool is_char_following_following_or(mp_lexer_t *lex, char c1, char c2) { +static MP_BOOL is_char_following_following_or(mp_lexer_t *lex, char c1, char c2) { return lex->chr2 == c1 || lex->chr2 == c2; } -static bool is_char_and(mp_lexer_t *lex, char c1, char c2) { +static MP_BOOL is_char_and(mp_lexer_t *lex, char c1, char c2) { return lex->chr0 == c1 && lex->chr1 == c2; } -static bool is_whitespace(mp_lexer_t *lex) { +static MP_BOOL is_whitespace(mp_lexer_t *lex) { return unichar_isspace(lex->chr0); } -static bool is_letter(mp_lexer_t *lex) { +static MP_BOOL is_letter(mp_lexer_t *lex) { return unichar_isalpha(lex->chr0); } -static bool is_digit(mp_lexer_t *lex) { +static MP_BOOL is_digit(mp_lexer_t *lex) { return unichar_isdigit(lex->chr0); } -static bool is_following_digit(mp_lexer_t *lex) { +static MP_BOOL is_following_digit(mp_lexer_t *lex) { return unichar_isdigit(lex->chr1); } // TODO UNICODE include unicode characters in definition of identifiers -static bool is_head_of_identifier(mp_lexer_t *lex) { +static MP_BOOL is_head_of_identifier(mp_lexer_t *lex) { return is_letter(lex) || lex->chr0 == '_'; } // TODO UNICODE include unicode characters in definition of identifiers -static bool is_tail_of_identifier(mp_lexer_t *lex) { +static MP_BOOL is_tail_of_identifier(mp_lexer_t *lex) { return is_head_of_identifier(lex) || is_digit(lex); } @@ -280,12 +280,12 @@ static const char *tok_kw[] = { NULL, }; -static void mp_lexer_next_token_into(mp_lexer_t *lex, mp_token_t *tok, bool first_token) { +static void mp_lexer_next_token_into(mp_lexer_t *lex, mp_token_t *tok, MP_BOOL first_token) { // skip white space and comments - bool had_physical_newline = false; + MP_BOOL had_physical_newline = MP_FALSE; while (!is_end(lex)) { if (is_physical_newline(lex)) { - had_physical_newline = true; + had_physical_newline = MP_TRUE; next_char(lex); } else if (is_whitespace(lex)) { next_char(lex); @@ -369,22 +369,22 @@ static void mp_lexer_next_token_into(mp_lexer_t *lex, mp_token_t *tok, bool firs // a string or bytes literal // parse type codes - bool is_raw = false; - bool is_bytes = false; + MP_BOOL is_raw = MP_FALSE; + MP_BOOL is_bytes = MP_FALSE; if (is_char(lex, 'u')) { next_char(lex); } else if (is_char(lex, 'b')) { - is_bytes = true; + is_bytes = MP_TRUE; next_char(lex); if (is_char(lex, 'r')) { - is_raw = true; + is_raw = MP_TRUE; next_char(lex); } } else if (is_char(lex, 'r')) { - is_raw = true; + is_raw = MP_TRUE; next_char(lex); if (is_char(lex, 'b')) { - is_bytes = true; + is_bytes = MP_TRUE; next_char(lex); } } @@ -628,7 +628,7 @@ mp_lexer_t *mp_lexer_new(const char *src_name, void *stream_data, mp_lexer_strea } // preload first token - mp_lexer_next_token_into(lex, &lex->tok_cur, true); + mp_lexer_next_token_into(lex, &lex->tok_cur, MP_TRUE); return lex; } @@ -644,44 +644,44 @@ void mp_lexer_free(mp_lexer_t *lex) { } void mp_lexer_to_next(mp_lexer_t *lex) { - mp_lexer_next_token_into(lex, &lex->tok_cur, false); + mp_lexer_next_token_into(lex, &lex->tok_cur, MP_FALSE); } const mp_token_t *mp_lexer_cur(const mp_lexer_t *lex) { return &lex->tok_cur; } -bool mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind) { +MP_BOOL mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind) { return lex->tok_cur.kind == kind; } /* -bool mp_lexer_is_str(mp_lexer_t *lex, const char *str) { +MP_BOOL mp_lexer_is_str(mp_lexer_t *lex, const char *str) { return mp_token_is_str(&lex->tok_cur, str); } -bool mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind) { +MP_BOOL mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind) { if (mp_lexer_is_kind(lex, kind)) { mp_lexer_to_next(lex); - return true; + return MP_TRUE; } - return false; + return MP_FALSE; } -bool mp_lexer_opt_str(mp_lexer_t *lex, const char *str) { +MP_BOOL mp_lexer_opt_str(mp_lexer_t *lex, const char *str) { if (mp_lexer_is_str(lex, str)) { mp_lexer_to_next(lex); - return true; + return MP_TRUE; } - return false; + return MP_FALSE; } */ -bool mp_lexer_show_error(mp_lexer_t *lex, const char *msg) { +MP_BOOL mp_lexer_show_error(mp_lexer_t *lex, const char *msg) { return mp_token_show_error(&lex->tok_cur, msg); } -bool mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg) { +MP_BOOL mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg) { printf(" File \"%s\", line %d column %d\n%s\n", lex->tok_cur.src_name, lex->tok_cur.src_line, lex->tok_cur.src_column, msg); - return false; + return MP_FALSE; } diff --git a/py/lexer.h b/py/lexer.h index 3cb48ce9e..9cc3e70c6 100644 --- a/py/lexer.h +++ b/py/lexer.h @@ -124,20 +124,20 @@ typedef struct _mp_lexer_t mp_lexer_t; void mp_token_show(const mp_token_t *tok); void mp_token_show_error_prefix(const mp_token_t *tok); -bool mp_token_show_error(const mp_token_t *tok, const char *msg); +MP_BOOL mp_token_show_error(const mp_token_t *tok, const char *msg); mp_lexer_t *mp_lexer_new(const char *src_name, void *stream_data, mp_lexer_stream_next_char_t stream_next_char, mp_lexer_stream_close_t stream_close); void mp_lexer_free(mp_lexer_t *lex); void mp_lexer_to_next(mp_lexer_t *lex); const mp_token_t *mp_lexer_cur(const mp_lexer_t *lex); -bool mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind); +MP_BOOL mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind); /* unused -bool mp_lexer_is_str(mp_lexer_t *lex, const char *str); -bool mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind); -bool mp_lexer_opt_str(mp_lexer_t *lex, const char *str); +MP_BOOL mp_lexer_is_str(mp_lexer_t *lex, const char *str); +MP_BOOL mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind); +MP_BOOL mp_lexer_opt_str(mp_lexer_t *lex, const char *str); */ -bool mp_lexer_show_error(mp_lexer_t *lex, const char *msg); -bool mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg); +MP_BOOL mp_lexer_show_error(mp_lexer_t *lex, const char *msg); +MP_BOOL mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg); // used to import a module; must be implemented for a specific port mp_lexer_t *mp_import_open_file(qstr mod_name); diff --git a/py/lexerunix.c b/py/lexerunix.c index 14c28c16d..935fed0d3 100644 --- a/py/lexerunix.c +++ b/py/lexerunix.c @@ -7,7 +7,7 @@ #include "lexer.h" typedef struct _str_buf_t { - bool free; // free src_beg when done + MP_BOOL free; // free src_beg when done const char *src_beg; // beginning of source const char *src_cur; // current location in source const char *src_end; // end (exclusive) of source @@ -30,7 +30,7 @@ void str_buf_free(str_buf_t *sb) { } } -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str) { +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str) { str_buf_t *sb = m_new(str_buf_t, 1); sb->free = free_str; sb->src_beg = str; @@ -56,7 +56,7 @@ mp_lexer_t *mp_lexer_new_from_file(const char *filename) { return NULL; } - return mp_lexer_new_from_str_len(filename, data, size, true); + return mp_lexer_new_from_str_len(filename, data, size, MP_TRUE); } /******************************************************************************/ diff --git a/py/lexerunix.h b/py/lexerunix.h index b422a4306..3054ecd8a 100644 --- a/py/lexerunix.h +++ b/py/lexerunix.h @@ -1,4 +1,4 @@ -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str); +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str); mp_lexer_t *mp_lexer_new_from_file(const char *filename); void mp_import_set_directory(const char *dir); diff --git a/py/map.c b/py/map.c index 01209c9b7..558599f97 100644 --- a/py/map.c +++ b/py/map.c @@ -38,8 +38,8 @@ mp_map_t *mp_map_new(mp_map_kind_t kind, int n) { return map; } -mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, bool add_if_not_found) { - bool is_map_mp_obj = (map->kind == MP_MAP_OBJ); +mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, MP_BOOL add_if_not_found) { + MP_BOOL is_map_mp_obj = (map->kind == MP_MAP_OBJ); machine_uint_t hash; if (is_map_mp_obj) { hash = mp_obj_hash(index); @@ -61,7 +61,7 @@ mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, bool add_if_n map->table = m_new0(mp_map_elem_t, map->alloc); for (int i = 0; i < old_alloc; i++) { if (old_table[i].key != NULL) { - mp_map_lookup_helper(map, old_table[i].key, true)->value = old_table[i].value; + mp_map_lookup_helper(map, old_table[i].key, MP_TRUE)->value = old_table[i].value; } } m_del(mp_map_elem_t, old_table, old_alloc); @@ -90,7 +90,7 @@ mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, bool add_if_n } } -mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, bool add_if_not_found) { +mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, MP_BOOL add_if_not_found) { mp_obj_t o = (mp_obj_t)(machine_uint_t)index; return mp_map_lookup_helper(map, o, add_if_not_found); } @@ -104,7 +104,7 @@ void mp_set_init(mp_set_t *set, int n) { set->table = m_new0(mp_obj_t, set->alloc); } -mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, bool add_if_not_found) { +mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, MP_BOOL add_if_not_found) { int hash = mp_obj_hash(index); int pos = hash % set->alloc; for (;;) { @@ -121,7 +121,7 @@ mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, bool add_if_not_found) { set->table = m_new(mp_obj_t, set->alloc); for (int i = 0; i < old_alloc; i++) { if (old_table[i] != NULL) { - mp_set_lookup(set, old_table[i], true); + mp_set_lookup(set, old_table[i], MP_TRUE); } } m_del(mp_obj_t, old_table, old_alloc); diff --git a/py/map.h b/py/map.h index f8ca886aa..31ce39b71 100644 --- a/py/map.h +++ b/py/map.h @@ -26,8 +26,8 @@ typedef struct _mp_set_t { int get_doubling_prime_greater_or_equal_to(int x); void mp_map_init(mp_map_t *map, mp_map_kind_t kind, int n); mp_map_t *mp_map_new(mp_map_kind_t kind, int n); -mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, bool add_if_not_found); -mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, bool add_if_not_found); +mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, MP_BOOL add_if_not_found); +mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, MP_BOOL add_if_not_found); void mp_set_init(mp_set_t *set, int n); -mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, bool add_if_not_found); +mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, MP_BOOL add_if_not_found); diff --git a/py/misc.h b/py/misc.h index 153218ba2..149ca8a51 100644 --- a/py/misc.h +++ b/py/misc.h @@ -5,10 +5,10 @@ /** types *******************************************************/ -typedef int bool; +typedef int MP_BOOL; enum { - false = 0, - true = 1 + MP_FALSE = 0, + MP_TRUE = 1 }; typedef unsigned char byte; @@ -42,10 +42,10 @@ typedef int unichar; // TODO unichar utf8_get_char(const char *s); char *utf8_next_char(const char *s); -bool unichar_isspace(unichar c); -bool unichar_isalpha(unichar c); -bool unichar_isprint(unichar c); -bool unichar_isdigit(unichar c); +MP_BOOL unichar_isspace(unichar c); +MP_BOOL unichar_isalpha(unichar c); +MP_BOOL unichar_isprint(unichar c); +MP_BOOL unichar_isdigit(unichar c); /** string ******************************************************/ @@ -59,7 +59,7 @@ typedef struct _vstr_t { int alloc; int len; char *buf; - bool had_error; + MP_BOOL had_error; } vstr_t; void vstr_init(vstr_t *vstr); @@ -67,7 +67,7 @@ void vstr_clear(vstr_t *vstr); vstr_t *vstr_new(void); void vstr_free(vstr_t *vstr); void vstr_reset(vstr_t *vstr); -bool vstr_had_error(vstr_t *vstr); +MP_BOOL vstr_had_error(vstr_t *vstr); char *vstr_str(vstr_t *vstr); int vstr_len(vstr_t *vstr); void vstr_hint_size(vstr_t *vstr, int size); diff --git a/py/obj.c b/py/obj.c index 77580e1fe..e28076b2c 100644 --- a/py/obj.c +++ b/py/obj.c @@ -46,9 +46,9 @@ void mp_obj_print(mp_obj_t o_in) { mp_obj_print_helper(printf_wrapper, NULL, o_in); } -bool mp_obj_is_callable(mp_obj_t o_in) { +MP_BOOL mp_obj_is_callable(mp_obj_t o_in) { if (MP_OBJ_IS_SMALL_INT(o_in)) { - return false; + return MP_FALSE; } else { mp_obj_base_t *o = o_in; return o->type->call_n != NULL; @@ -77,13 +77,13 @@ machine_int_t mp_obj_hash(mp_obj_t o_in) { // "The objects need not have the same type. If both are numbers, they are converted // to a common type. Otherwise, the == and != operators always consider objects of // different types to be unequal." -// note also that False==0 and True==1 are true expressions -bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { +// note also that False==0 and True==1 are MP_TRUE expressions +MP_BOOL mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { if (o1 == o2) { - return true; + return MP_TRUE; } else if (MP_OBJ_IS_SMALL_INT(o1) || MP_OBJ_IS_SMALL_INT(o2)) { if (MP_OBJ_IS_SMALL_INT(o1) && MP_OBJ_IS_SMALL_INT(o2)) { - return false; + return MP_FALSE; } else { if (MP_OBJ_IS_SMALL_INT(o2)) { mp_obj_t temp = o1; o1 = o2; o2 = temp; @@ -95,25 +95,25 @@ bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { } else if (o2 == mp_const_true) { return val == 1; } else { - return false; + return MP_FALSE; } } } else if (MP_OBJ_IS_TYPE(o1, &str_type) && MP_OBJ_IS_TYPE(o2, &str_type)) { return mp_obj_str_get(o1) == mp_obj_str_get(o2); } else { assert(0); - return false; + return MP_FALSE; } } -bool mp_obj_less(mp_obj_t o1, mp_obj_t o2) { +MP_BOOL mp_obj_less(mp_obj_t o1, mp_obj_t o2) { if (MP_OBJ_IS_SMALL_INT(o1) && MP_OBJ_IS_SMALL_INT(o2)) { mp_small_int_t i1 = MP_OBJ_SMALL_INT_VALUE(o1); mp_small_int_t i2 = MP_OBJ_SMALL_INT_VALUE(o2); return i1 < i2; } else { assert(0); - return false; + return MP_FALSE; } } diff --git a/py/obj.h b/py/obj.h index 88a611ba7..b8ddb4ea8 100644 --- a/py/obj.h +++ b/py/obj.h @@ -18,12 +18,11 @@ typedef machine_float_t mp_float_t; // Anything that wants to be a Micro Python object must // have mp_obj_base_t as its first member (except NULL and small ints) -typedef struct _mp_obj_base_t mp_obj_base_t; -typedef struct _mp_obj_type_t mp_obj_type_t; - +struct _mp_obj_type_t; struct _mp_obj_base_t { - const mp_obj_type_t *type; + const struct _mp_obj_type_t *type; }; +typedef struct _mp_obj_base_t mp_obj_base_t; // The NULL object is used to indicate the absence of an object // It *cannot* be used when an mp_obj_t is expected, except where explicitly allowed @@ -43,12 +42,13 @@ struct _mp_obj_base_t { #define MP_DECLARE_CONST_FUN_OBJ(obj_name) extern const mp_obj_fun_native_t obj_name -#define MP_DEFINE_CONST_FUN_OBJ_0(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 0, 0, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_1(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 1, 1, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_2(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 2, 2, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_3(obj_name, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, 3, 3, fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_VAR(obj_name, n_args_min, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, n_args_min, (~((machine_uint_t)0)), fun_name} -#define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(obj_name, n_args_min, n_args_max, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, n_args_min, n_args_max, fun_name} +#define MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, n_args_min, n_args_max, fun_name) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, n_args_min, n_args_max, (void *)fun_name} +#define MP_DEFINE_CONST_FUN_OBJ_0(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 0, 0, (mp_fun_0_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_1(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 1, 1, (mp_fun_1_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_2(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 2, 2, (mp_fun_2_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_3(obj_name, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 3, 3, (mp_fun_3_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_VAR(obj_name, n_args_min, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, n_args_min, (~((machine_uint_t)0)), (mp_fun_var_t)fun_name) +#define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(obj_name, n_args_min, n_args_max, fun_name) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, n_args_min, n_args_max, (mp_fun_var_t)fun_name) // Type definitions for methods @@ -83,7 +83,7 @@ struct _mp_obj_type_t { mp_fun_1_t getiter; mp_fun_1_t iternext; - const mp_method_t methods[]; + const mp_method_t *methods; /* What we might need to add here: @@ -107,6 +107,7 @@ struct _mp_obj_type_t { __next__ gen-instance */ }; +typedef struct _mp_obj_type_t mp_obj_type_t; // Constant objects, globally accessible @@ -125,7 +126,7 @@ struct _mp_map_t; // General API for objects mp_obj_t mp_obj_new_none(void); -mp_obj_t mp_obj_new_bool(bool value); +mp_obj_t mp_obj_new_bool(MP_BOOL value); mp_obj_t mp_obj_new_cell(mp_obj_t obj); mp_obj_t mp_obj_new_int(machine_int_t value); mp_obj_t mp_obj_new_str(qstr qstr); @@ -161,10 +162,10 @@ const char *mp_obj_get_type_str(mp_obj_t o_in); void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in); void mp_obj_print(mp_obj_t o); -bool mp_obj_is_callable(mp_obj_t o_in); +MP_BOOL mp_obj_is_callable(mp_obj_t o_in); machine_int_t mp_obj_hash(mp_obj_t o_in); -bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2); -bool mp_obj_less(mp_obj_t o1, mp_obj_t o2); +MP_BOOL mp_obj_equal(mp_obj_t o1, mp_obj_t o2); +MP_BOOL mp_obj_less(mp_obj_t o1, mp_obj_t o2); machine_int_t mp_obj_get_int(mp_obj_t arg); #if MICROPY_ENABLE_FLOAT diff --git a/py/objbool.c b/py/objbool.c index 77394dab9..b03c56924 100644 --- a/py/objbool.c +++ b/py/objbool.c @@ -10,7 +10,7 @@ typedef struct _mp_obj_bool_t { mp_obj_base_t base; - bool value; + MP_BOOL value; } mp_obj_bool_t; static void bool_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { @@ -41,11 +41,11 @@ const mp_obj_type_t bool_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; -static const mp_obj_bool_t false_obj = {{&bool_type}, false}; -static const mp_obj_bool_t true_obj = {{&bool_type}, true}; +static const mp_obj_bool_t false_obj = {{&bool_type}, MP_FALSE}; +static const mp_obj_bool_t true_obj = {{&bool_type}, MP_TRUE}; const mp_obj_t mp_const_false = (mp_obj_t)&false_obj; const mp_obj_t mp_const_true = (mp_obj_t)&true_obj; diff --git a/py/objboundmeth.c b/py/objboundmeth.c index 4e6d2e010..f4f306ae0 100644 --- a/py/objboundmeth.c +++ b/py/objboundmeth.c @@ -43,7 +43,7 @@ const mp_obj_type_t bound_meth_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_bound_meth(mp_obj_t self, mp_obj_t meth) { diff --git a/py/objcell.c b/py/objcell.c index 3465f9919..628a289d5 100644 --- a/py/objcell.c +++ b/py/objcell.c @@ -33,7 +33,7 @@ const mp_obj_type_t cell_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_cell(mp_obj_t obj) { diff --git a/py/objclass.c b/py/objclass.c index 536abdf7e..c2638bc87 100644 --- a/py/objclass.c +++ b/py/objclass.c @@ -26,7 +26,7 @@ mp_obj_t class_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { mp_obj_t o = mp_obj_new_instance(self_in); // look for __init__ function - mp_map_elem_t *init_fn = mp_qstr_map_lookup(self->locals, MP_QSTR___init__, false); + mp_map_elem_t *init_fn = mp_qstr_map_lookup(self->locals, MP_QSTR___init__, MP_FALSE); if (init_fn != NULL) { // call __init__ function @@ -70,7 +70,7 @@ const mp_obj_type_t class_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_class(mp_map_t *class_locals) { diff --git a/py/objclosure.c b/py/objclosure.c index 3317eb86f..347f7a79f 100644 --- a/py/objclosure.c +++ b/py/objclosure.c @@ -42,7 +42,7 @@ const mp_obj_type_t closure_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_closure(mp_obj_t fun, mp_obj_t closure_tuple) { diff --git a/py/objcomplex.c b/py/objcomplex.c index fc32f9667..9a814980c 100644 --- a/py/objcomplex.c +++ b/py/objcomplex.c @@ -125,7 +125,7 @@ const mp_obj_type_t complex_type = { complex_binary_op, // binary_op NULL, // getiter NULL, // iternext - .methods = { { NULL, NULL }, }, + .methods = NULL, }; mp_obj_t mp_obj_new_complex(mp_float_t real, mp_float_t imag) { diff --git a/py/objdict.c b/py/objdict.c index b3e21aedd..bac010ce8 100644 --- a/py/objdict.c +++ b/py/objdict.c @@ -19,14 +19,14 @@ typedef struct _mp_obj_dict_t { static void dict_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { mp_obj_dict_t *self = self_in; - bool first = true; + MP_BOOL first = MP_TRUE; print(env, "{"); for (int i = 0; i < self->map.alloc; i++) { if (self->map.table[i].key != NULL) { if (!first) { print(env, ", "); } - first = false; + first = MP_FALSE; mp_obj_print_helper(print, env, self->map.table[i].key); print(env, ": "); mp_obj_print_helper(print, env, self->map.table[i].value); @@ -47,7 +47,7 @@ static mp_obj_t dict_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { case RT_BINARY_OP_SUBSCR: { // dict load - mp_map_elem_t *elem = mp_map_lookup_helper(&o->map, rhs_in, false); + mp_map_elem_t *elem = mp_map_lookup_helper(&o->map, rhs_in, MP_FALSE); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg(MP_QSTR_KeyError, "")); } else { @@ -67,7 +67,7 @@ const mp_obj_type_t dict_type = { .make_new = dict_make_new, .binary_op = dict_binary_op, .getiter = NULL, - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_dict(int n_args) { @@ -91,6 +91,6 @@ uint mp_obj_dict_len(mp_obj_t self_in) { mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value) { assert(MP_OBJ_IS_TYPE(self_in, &dict_type)); mp_obj_dict_t *self = self_in; - mp_map_lookup_helper(&self->map, key, true)->value = value; + mp_map_lookup_helper(&self->map, key, MP_TRUE)->value = value; return self_in; } diff --git a/py/objexcept.c b/py/objexcept.c index 22b8c5812..8414fb0f6 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -45,7 +45,7 @@ const mp_obj_type_t exception_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_exception(qstr id) { diff --git a/py/objfloat.c b/py/objfloat.c index 0250172ad..1176a1671 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -83,7 +83,7 @@ const mp_obj_type_t float_type = { .make_new = float_make_new, .unary_op = float_unary_op, .binary_op = float_binary_op, - .methods = { { NULL, NULL }, }, + .methods = NULL, }; mp_obj_t mp_obj_new_float(mp_float_t value) { diff --git a/py/objfun.c b/py/objfun.c index 0db6459a3..494546281 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -79,9 +79,7 @@ const mp_obj_type_t fun_native_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = { - {NULL, NULL}, // end-of-list sentinel - }, + .methods = NULL, }; mp_obj_t rt_make_function_0(mp_fun_0_t fun) { @@ -181,9 +179,7 @@ const mp_obj_type_t fun_bc_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = { - {NULL, NULL}, // end-of-list sentinel - }, + .methods = NULL, }; mp_obj_t mp_obj_new_fun_bc(int n_args, uint n_state, const byte *code) { @@ -295,9 +291,7 @@ static const mp_obj_type_t fun_asm_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = { - {NULL, NULL}, // end-of-list sentinel - }, + .methods = NULL, }; mp_obj_t mp_obj_new_fun_asm(uint n_args, void *fun) { diff --git a/py/objgenerator.c b/py/objgenerator.c index a91b0d6fc..7eee3a8fc 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -46,7 +46,7 @@ const mp_obj_type_t gen_wrap_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_gen_wrap(uint n_locals, uint n_stack, mp_obj_t fun) { @@ -78,7 +78,7 @@ mp_obj_t gen_instance_getiter(mp_obj_t self_in) { mp_obj_t gen_instance_iternext(mp_obj_t self_in) { mp_obj_gen_instance_t *self = self_in; - bool yield = mp_execute_byte_code_2(&self->ip, &self->state[0], &self->sp); + MP_BOOL yield = mp_execute_byte_code_2(&self->ip, &self->state[0], &self->sp); if (yield) { return *self->sp; } else { @@ -101,7 +101,7 @@ const mp_obj_type_t gen_instance_type = { NULL, // binary_op gen_instance_getiter, // getiter gen_instance_iternext, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; // args are in reverse order in the array diff --git a/py/objinstance.c b/py/objinstance.c index 8ef2773fd..00ae05816 100644 --- a/py/objinstance.c +++ b/py/objinstance.c @@ -21,7 +21,7 @@ typedef struct _mp_obj_instance_t { type needs to be specified dynamically case O_OBJ: { - py_map_elem_t *qn = py_qstr_map_lookup(o->u_obj.class->u_class.locals, qstr_from_str_static("__qualname__"), false); assert(qn != NULL); + py_map_elem_t *qn = py_qstr_map_lookup(o->u_obj.class->u_class.locals, qstr_from_str_static("__qualname__"), MP_FALSE); assert(qn != NULL); assert(IS_O(qn->value, O_STR)); return qstr_str(((py_obj_base_t*)qn->value)->u_str); } @@ -30,12 +30,12 @@ type needs to be specified dynamically mp_obj_t mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr) { // logic: look in obj members then class locals (TODO check this against CPython) mp_obj_instance_t *self = self_in; - mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, MP_FALSE); if (elem != NULL) { // object member, always treated as a value return elem->value; } - elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, false); + elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, MP_FALSE); if (elem != NULL) { if (mp_obj_is_callable(elem->value)) { // class member is callable so build a bound method @@ -51,14 +51,14 @@ mp_obj_t mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr) { void mp_obj_instance_load_method(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { // logic: look in obj members then class locals (TODO check this against CPython) mp_obj_instance_t *self = self_in; - mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, MP_FALSE); if (elem != NULL) { // object member, always treated as a value dest[1] = elem->value; dest[0] = NULL; return; } - elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, false); + elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, MP_FALSE); if (elem != NULL) { if (mp_obj_is_callable(elem->value)) { // class member is callable so build a bound method @@ -81,11 +81,11 @@ void mp_obj_instance_load_method(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { void mp_obj_instance_store_attr(mp_obj_t self_in, qstr attr, mp_obj_t value) { // logic: look in class locals (no add) then obj members (add) (TODO check this against CPython) mp_obj_instance_t *self = self_in; - mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, MP_FALSE); if (elem != NULL) { elem->value = value; } else { - mp_qstr_map_lookup(self->members, attr, true)->value = value; + mp_qstr_map_lookup(self->members, attr, MP_TRUE)->value = value; } } @@ -99,7 +99,7 @@ const mp_obj_type_t instance_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_instance(mp_obj_t class) { diff --git a/py/objint.c b/py/objint.c index 8d69c4e7a..0ba42d10c 100644 --- a/py/objint.c +++ b/py/objint.c @@ -34,7 +34,7 @@ const mp_obj_type_t int_type = { { &mp_const_type }, "int", .make_new = int_make_new, - .methods = { { NULL, NULL }, }, + .methods = NULL, }; mp_obj_t mp_obj_new_int(machine_int_t value) { diff --git a/py/objlist.c b/py/objlist.c index 02a6b1525..3e5a15fce 100644 --- a/py/objlist.c +++ b/py/objlist.c @@ -260,6 +260,18 @@ static MP_DEFINE_CONST_FUN_OBJ_2(list_remove_obj, list_remove); static MP_DEFINE_CONST_FUN_OBJ_1(list_reverse_obj, list_reverse); static MP_DEFINE_CONST_FUN_OBJ_2(list_sort_obj, list_sort); +const mp_method_t list_type_methods[] = { + { "append", &list_append_obj }, + { "clear", &list_clear_obj }, + { "copy", &list_copy_obj }, + { "count", &list_count_obj }, + { "index", &list_index_obj }, + { "pop", &list_pop_obj }, + { "remove", &list_remove_obj }, + { "reverse", &list_reverse_obj }, + { "sort", &list_sort_obj }, + { NULL, NULL }, // end-of-list sentinel +}; const mp_obj_type_t list_type = { { &mp_const_type }, "list", @@ -268,19 +280,7 @@ const mp_obj_type_t list_type = { .unary_op = NULL, .binary_op = list_binary_op, .getiter = list_getiter, - .methods = { - { "append", &list_append_obj }, - { "clear", &list_clear_obj }, - { "copy", &list_copy_obj }, - { "count", &list_count_obj }, - { "index", &list_index_obj }, - { "insert", &list_insert_obj }, - { "pop", &list_pop_obj }, - { "remove", &list_remove_obj }, - { "reverse", &list_reverse_obj }, - { "sort", &list_sort_obj }, - { NULL, NULL }, // end-of-list sentinel - }, + .methods = list_type_methods, }; static mp_obj_list_t *list_new(uint n) { @@ -344,7 +344,7 @@ static const mp_obj_type_t list_it_type = { { &mp_const_type }, "list_iterator", .iternext = list_it_iternext, - .methods = { { NULL, NULL }, }, + .methods = NULL, }; mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, int cur) { diff --git a/py/objmodule.c b/py/objmodule.c index 2d6f9555e..3412573eb 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -31,7 +31,7 @@ const mp_obj_type_t module_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_module(qstr module_name) { diff --git a/py/objnone.c b/py/objnone.c index 877e61fe5..173817a4d 100644 --- a/py/objnone.c +++ b/py/objnone.c @@ -18,7 +18,7 @@ const mp_obj_type_t none_type = { { &mp_const_type }, "NoneType", .print = none_print, - .methods = {{NULL, NULL},}, + .methods = NULL, }; static const mp_obj_none_t none_obj = {{&none_type}}; diff --git a/py/objrange.c b/py/objrange.c index 1ef42673f..5c51656e8 100644 --- a/py/objrange.c +++ b/py/objrange.c @@ -32,7 +32,7 @@ static const mp_obj_type_t range_type = { NULL, // binary_op range_getiter, NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; // range is a class and instances are immutable sequence objects @@ -77,7 +77,7 @@ static const mp_obj_type_t range_it_type = { NULL, // binary_op NULL, // getiter range_it_iternext, - .methods = {{NULL, NULL},}, + .methods = NULL, }; mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step) { diff --git a/py/objset.c b/py/objset.c index dd9a4d1e1..6a02ba120 100644 --- a/py/objset.c +++ b/py/objset.c @@ -17,14 +17,14 @@ typedef struct _mp_obj_set_t { void set_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { mp_obj_set_t *self = self_in; - bool first = true; + MP_BOOL first = MP_TRUE; print(env, "{"); for (int i = 0; i < self->set.alloc; i++) { if (self->set.table[i] != MP_OBJ_NULL) { if (!first) { print(env, ", "); } - first = false; + first = MP_FALSE; mp_obj_print_helper(print, env, self->set.table[i]); } } @@ -64,7 +64,7 @@ const mp_obj_type_t set_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = { { NULL, NULL }, }, + .methods = NULL, }; mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) { @@ -72,7 +72,7 @@ mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) { o->base.type = &set_type; mp_set_init(&o->set, n_args); for (int i = 0; i < n_args; i++) { - mp_set_lookup(&o->set, items[i], true); + mp_set_lookup(&o->set, items[i], MP_TRUE); } return o; } @@ -80,5 +80,5 @@ mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) { void mp_obj_set_store(mp_obj_t self_in, mp_obj_t item) { assert(MP_OBJ_IS_TYPE(self_in, &set_type)); mp_obj_set_t *self = self_in; - mp_set_lookup(&self->set, item, true); + mp_set_lookup(&self->set, item, MP_TRUE); } diff --git a/py/objslice.c b/py/objslice.c index da69b92af..360869a49 100644 --- a/py/objslice.c +++ b/py/objslice.c @@ -30,7 +30,7 @@ const mp_obj_type_t ellipsis_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = {{NULL, NULL},}, + .methods = NULL, }; static const mp_obj_ellipsis_t ellipsis_obj = {{&ellipsis_type}}; @@ -58,7 +58,7 @@ const mp_obj_type_t slice_type = { { &mp_const_type }, "slice", .print = slice_print, - .methods = { { NULL, NULL }, }, + .methods = NULL, }; // TODO: Make sure to handle "empty" values, which are signified by None in CPython diff --git a/py/objstr.c b/py/objstr.c index db3e0beca..08e379391 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -184,17 +184,18 @@ mp_obj_t str_format(int n_args, const mp_obj_t *args) { static MP_DEFINE_CONST_FUN_OBJ_2(str_join_obj, str_join); static MP_DEFINE_CONST_FUN_OBJ_VAR(str_format_obj, 1, str_format); +const mp_method_t str_type_methods[] = { + { "join", &str_join_obj }, + { "format", &str_format_obj }, + { NULL, NULL }, // end-of-list sentinel +}; const mp_obj_type_t str_type = { { &mp_const_type }, "str", .print = str_print, .binary_op = str_binary_op, .getiter = str_getiter, - .methods = { - { "join", &str_join_obj }, - { "format", &str_format_obj }, - { NULL, NULL }, // end-of-list sentinel - }, + .methods = str_type_methods, }; mp_obj_t mp_obj_new_str(qstr qstr) { @@ -235,7 +236,7 @@ static const mp_obj_type_t str_it_type = { { &mp_const_type }, "str_iterator", .iternext = str_it_iternext, - .methods = { { NULL, NULL }, }, + .methods = NULL, }; mp_obj_t mp_obj_new_str_iterator(mp_obj_str_t *str, int cur) { diff --git a/py/objtuple.c b/py/objtuple.c index ceca4200e..a8ecc3a4f 100644 --- a/py/objtuple.c +++ b/py/objtuple.c @@ -103,7 +103,7 @@ const mp_obj_type_t tuple_type = { .make_new = tuple_make_new, .binary_op = tuple_binary_op, .getiter = tuple_getiter, - .methods = {{NULL, NULL},}, + .methods = NULL, }; // the zero-length tuple @@ -165,8 +165,14 @@ static mp_obj_t tuple_it_iternext(mp_obj_t self_in) { static const mp_obj_type_t tuple_it_type = { { &mp_const_type }, "tuple_iterator", - .iternext = tuple_it_iternext, - .methods = {{NULL, NULL},}, + NULL, // print + NULL, // make_new + NULL, // call_n + NULL, // unary_op + NULL, // binary_op + NULL, // getiter + tuple_it_iternext, + NULL, // method list }; static mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, int cur) { diff --git a/py/objtype.c b/py/objtype.c index 37d40b38f..993de040b 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -27,5 +27,5 @@ const mp_obj_type_t mp_const_type = { "type", .print = type_print, .call_n = type_call_n, - .methods = {{NULL, NULL},}, + .methods = NULL, }; diff --git a/py/parse.c b/py/parse.c index d3786ba95..1d3badbc3 100644 --- a/py/parse.c +++ b/py/parse.c @@ -189,8 +189,8 @@ static void push_result_token(parser_t *parser, const mp_lexer_t *lex) { if (tok->kind == MP_TOKEN_NAME) { pn = mp_parse_node_new_leaf(MP_PARSE_NODE_ID, qstr_from_strn_copy(tok->str, tok->len)); } else if (tok->kind == MP_TOKEN_NUMBER) { - bool dec = false; - bool small_int = true; + MP_BOOL dec = MP_FALSE; + MP_BOOL small_int = MP_TRUE; int int_val = 0; int len = tok->len; const char *str = tok->str; @@ -219,10 +219,10 @@ static void push_result_token(parser_t *parser, const mp_lexer_t *lex) { } else if (base == 16 && 'A' <= str[i] && str[i] <= 'F') { int_val = base * int_val + str[i] - 'A' + 10; } else if (str[i] == '.' || str[i] == 'e' || str[i] == 'E' || str[i] == 'j' || str[i] == 'J') { - dec = true; + dec = MP_TRUE; break; } else { - small_int = false; + small_int = MP_FALSE; break; } } @@ -269,11 +269,11 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { push_rule(parser, rules[top_level_rule], 0); uint n, i; - bool backtrack = false; + MP_BOOL backtrack = MP_FALSE; const rule_t *rule; mp_token_kind_t tok_kind; - bool emit_rule; - bool had_trailing_sep; + MP_BOOL emit_rule; + MP_BOOL had_trailing_sep; for (;;) { next_rule: @@ -298,7 +298,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { if (i > 0 && !backtrack) { goto next_rule; } else { - backtrack = false; + backtrack = MP_FALSE; } for (; i < n - 1; ++i) { switch (rule->arg[i] & RULE_ARG_KIND_MASK) { @@ -322,7 +322,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { push_result_token(parser, lex); mp_lexer_to_next(lex); } else { - backtrack = true; + backtrack = MP_TRUE; goto next_rule; } } else { @@ -338,7 +338,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { if ((rule->arg[i - 1] & RULE_ARG_KIND_MASK) == RULE_ARG_OPT_RULE) { // an optional rule that failed, so continue with next arg push_result_node(parser, MP_PARSE_NODE_NULL); - backtrack = false; + backtrack = MP_FALSE; } else { // a mandatory rule that failed, so propagate backtrack if (i > 1) { @@ -369,7 +369,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { goto syntax_error; } else { // this rule failed, so backtrack - backtrack = true; + backtrack = MP_TRUE; goto next_rule; } } @@ -395,12 +395,12 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // count number of arguments for the parse_node i = 0; - emit_rule = false; + emit_rule = MP_FALSE; for (int x = 0; x < n; ++x) { if ((rule->arg[x] & RULE_ARG_KIND_MASK) == RULE_ARG_TOK) { tok_kind = rule->arg[x] & RULE_ARG_ARG_MASK; if (tok_kind >= MP_TOKEN_NAME) { - emit_rule = true; + emit_rule = MP_TRUE; } if (tok_kind == MP_TOKEN_NAME) { // only tokens which were names are pushed to stack @@ -414,19 +414,19 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // always emit these rules, even if they have only 1 argument if (rule->rule_id == RULE_expr_stmt || rule->rule_id == RULE_yield_stmt) { - emit_rule = true; + emit_rule = MP_TRUE; } // never emit these rules if they have only 1 argument // NOTE: can't put atom_paren here because we need it to distinguisg, for example, [a,b] from [(a,b)] // TODO possibly put varargslist_name, varargslist_equal here as well if (rule->rule_id == RULE_else_stmt || rule->rule_id == RULE_testlist_comp_3b || rule->rule_id == RULE_import_as_names_paren || rule->rule_id == RULE_typedargslist_name || rule->rule_id == RULE_typedargslist_colon || rule->rule_id == RULE_typedargslist_equal || rule->rule_id == RULE_dictorsetmaker_colon || rule->rule_id == RULE_classdef_2 || rule->rule_id == RULE_with_item_as || rule->rule_id == RULE_assert_stmt_extra || rule->rule_id == RULE_as_name || rule->rule_id == RULE_raise_stmt_from || rule->rule_id == RULE_vfpdef) { - emit_rule = false; + emit_rule = MP_FALSE; } // always emit these rules, and add an extra blank node at the end (to be used by the compiler to store data) if (rule->rule_id == RULE_funcdef || rule->rule_id == RULE_classdef || rule->rule_id == RULE_comp_for || rule->rule_id == RULE_lambdef || rule->rule_id == RULE_lambdef_nocond) { - emit_rule = true; + emit_rule = MP_TRUE; push_result_node(parser, MP_PARSE_NODE_NULL); i += 1; } @@ -465,14 +465,14 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // n=3 is: item (sep item)* [sep] if (backtrack) { list_backtrack: - had_trailing_sep = false; + had_trailing_sep = MP_FALSE; if (n == 2) { if (i == 1) { // fail on item, first time round; propagate backtrack goto next_rule; } else { // fail on item, in later rounds; finish with this rule - backtrack = false; + backtrack = MP_FALSE; } } else { if (i == 1) { @@ -482,15 +482,15 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // fail on item, in later rounds; have eaten tokens so can't backtrack if (n == 3) { // list allows trailing separator; finish parsing list - had_trailing_sep = true; - backtrack = false; + had_trailing_sep = MP_TRUE; + backtrack = MP_FALSE; } else { // list doesn't allowing trailing separator; fail goto syntax_error; } } else { // fail on separator; finish parsing list - backtrack = false; + backtrack = MP_FALSE; } } } else { @@ -510,7 +510,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { } else { // couldn't get element of list i += 1; - backtrack = true; + backtrack = MP_TRUE; goto list_backtrack; } break; diff --git a/py/repl.c b/py/repl.c index 4241ef0e4..2127a28df 100644 --- a/py/repl.c +++ b/py/repl.c @@ -1,17 +1,17 @@ #include "misc.h" #include "repl.h" -bool str_startswith_word(const char *str, const char *head) { +MP_BOOL str_startswith_word(const char *str, const char *head) { int i; for (i = 0; str[i] && head[i]; i++) { if (str[i] != head[i]) { - return false; + return MP_FALSE; } } return head[i] == '\0' && (str[i] == '\0' || !unichar_isalpha(str[i])); } -bool mp_repl_is_compound_stmt(const char *line) { +MP_BOOL mp_repl_is_compound_stmt(const char *line) { // compound if line starts with a certain keyword if ( str_startswith_word(line, "if") @@ -23,7 +23,7 @@ bool mp_repl_is_compound_stmt(const char *line) { || str_startswith_word(line, "class") || str_startswith_word(line, "@") ) { - return true; + return MP_TRUE; } // also "compound" if unmatched open bracket diff --git a/py/repl.h b/py/repl.h index 02fe523ed..db082f07a 100644 --- a/py/repl.h +++ b/py/repl.h @@ -1 +1 @@ -bool mp_repl_is_compound_stmt(const char *line); +MP_BOOL mp_repl_is_compound_stmt(const char *line); diff --git a/py/runtime.c b/py/runtime.c index 197c08b55..86e297d7b 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -45,7 +45,7 @@ typedef struct _mp_code_t { int n_args; int n_locals; int n_stack; - bool is_generator; + MP_BOOL is_generator; union { struct { byte *code; @@ -70,60 +70,60 @@ FILE *fp_write_code = NULL; void rt_init(void) { // locals = globals for outer module (see Objects/frameobject.c/PyFrame_New()) map_locals = map_globals = mp_map_new(MP_MAP_QSTR, 1); - mp_qstr_map_lookup(map_globals, MP_QSTR___name__, true)->value = mp_obj_new_str(MP_QSTR___main__); + mp_qstr_map_lookup(map_globals, MP_QSTR___name__, MP_TRUE)->value = mp_obj_new_str(MP_QSTR___main__); // init built-in hash table mp_map_init(&map_builtins, MP_MAP_QSTR, 3); // built-in exceptions (TODO, make these proper classes) - mp_qstr_map_lookup(&map_builtins, MP_QSTR_AttributeError, true)->value = mp_obj_new_exception(MP_QSTR_AttributeError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_IndexError, true)->value = mp_obj_new_exception(MP_QSTR_IndexError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_KeyError, true)->value = mp_obj_new_exception(MP_QSTR_KeyError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_NameError, true)->value = mp_obj_new_exception(MP_QSTR_NameError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_TypeError, true)->value = mp_obj_new_exception(MP_QSTR_TypeError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_SyntaxError, true)->value = mp_obj_new_exception(MP_QSTR_SyntaxError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_ValueError, true)->value = mp_obj_new_exception(MP_QSTR_ValueError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_AttributeError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_AttributeError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_IndexError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_IndexError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_KeyError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_KeyError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_NameError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_NameError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_TypeError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_TypeError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_SyntaxError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_SyntaxError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_ValueError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_ValueError); // built-in objects - mp_qstr_map_lookup(&map_builtins, MP_QSTR_Ellipsis, true)->value = mp_const_ellipsis; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_Ellipsis, MP_TRUE)->value = mp_const_ellipsis; // built-in core functions - mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, true)->value = rt_make_function_2(mp_builtin___build_class__); - mp_qstr_map_lookup(&map_builtins, MP_QSTR___repl_print__, true)->value = rt_make_function_1(mp_builtin___repl_print__); + mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, MP_TRUE)->value = rt_make_function_2(mp_builtin___build_class__); + mp_qstr_map_lookup(&map_builtins, MP_QSTR___repl_print__, MP_TRUE)->value = rt_make_function_1(mp_builtin___repl_print__); // built-in types - mp_qstr_map_lookup(&map_builtins, MP_QSTR_bool, true)->value = (mp_obj_t)&bool_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_bool, MP_TRUE)->value = (mp_obj_t)&bool_type; #if MICROPY_ENABLE_FLOAT - mp_qstr_map_lookup(&map_builtins, MP_QSTR_complex, true)->value = (mp_obj_t)&complex_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_complex, MP_TRUE)->value = (mp_obj_t)&complex_type; #endif - mp_qstr_map_lookup(&map_builtins, MP_QSTR_dict, true)->value = (mp_obj_t)&dict_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_dict, MP_TRUE)->value = (mp_obj_t)&dict_type; #if MICROPY_ENABLE_FLOAT - mp_qstr_map_lookup(&map_builtins, MP_QSTR_float, true)->value = (mp_obj_t)&float_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_float, MP_TRUE)->value = (mp_obj_t)&float_type; #endif - mp_qstr_map_lookup(&map_builtins, MP_QSTR_int, true)->value = (mp_obj_t)&int_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_list, true)->value = (mp_obj_t)&list_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_set, true)->value = (mp_obj_t)&set_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_tuple, true)->value = (mp_obj_t)&tuple_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_type, true)->value = (mp_obj_t)&mp_builtin_type_obj; // TODO + mp_qstr_map_lookup(&map_builtins, MP_QSTR_int, MP_TRUE)->value = (mp_obj_t)&int_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_list, MP_TRUE)->value = (mp_obj_t)&list_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_set, MP_TRUE)->value = (mp_obj_t)&set_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_tuple, MP_TRUE)->value = (mp_obj_t)&tuple_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_type, MP_TRUE)->value = (mp_obj_t)&mp_builtin_type_obj; // TODO // built-in user functions; TODO covert all to &mp_builtin_xxx's - mp_qstr_map_lookup(&map_builtins, MP_QSTR_abs, true)->value = rt_make_function_1(mp_builtin_abs); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_all, true)->value = rt_make_function_1(mp_builtin_all); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_any, true)->value = rt_make_function_1(mp_builtin_any); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_callable, true)->value = rt_make_function_1(mp_builtin_callable); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_chr, true)->value = rt_make_function_1(mp_builtin_chr); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_divmod, true)->value = rt_make_function_2(mp_builtin_divmod); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_hash, true)->value = (mp_obj_t)&mp_builtin_hash_obj; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_iter, true)->value = (mp_obj_t)&mp_builtin_iter_obj; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_len, true)->value = rt_make_function_1(mp_builtin_len); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_max, true)->value = rt_make_function_var(1, mp_builtin_max); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_min, true)->value = rt_make_function_var(1, mp_builtin_min); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_next, true)->value = (mp_obj_t)&mp_builtin_next_obj; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_ord, true)->value = rt_make_function_1(mp_builtin_ord); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_pow, true)->value = rt_make_function_var(2, mp_builtin_pow); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_print, true)->value = rt_make_function_var(0, mp_builtin_print); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_range, true)->value = rt_make_function_var(1, mp_builtin_range); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_sum, true)->value = rt_make_function_var(1, mp_builtin_sum); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_abs, MP_TRUE)->value = rt_make_function_1(mp_builtin_abs); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_all, MP_TRUE)->value = rt_make_function_1(mp_builtin_all); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_any, MP_TRUE)->value = rt_make_function_1(mp_builtin_any); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_callable, MP_TRUE)->value = rt_make_function_1(mp_builtin_callable); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_chr, MP_TRUE)->value = rt_make_function_1(mp_builtin_chr); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_divmod, MP_TRUE)->value = rt_make_function_2(mp_builtin_divmod); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_hash, MP_TRUE)->value = (mp_obj_t)&mp_builtin_hash_obj; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_iter, MP_TRUE)->value = (mp_obj_t)&mp_builtin_iter_obj; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_len, MP_TRUE)->value = rt_make_function_1(mp_builtin_len); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_max, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_max); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_min, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_min); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_next, MP_TRUE)->value = (mp_obj_t)&mp_builtin_next_obj; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_ord, MP_TRUE)->value = rt_make_function_1(mp_builtin_ord); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_pow, MP_TRUE)->value = rt_make_function_var(2, mp_builtin_pow); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_print, MP_TRUE)->value = rt_make_function_var(0, mp_builtin_print); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_range, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_range); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_sum, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_sum); next_unique_code_id = 1; // 0 indicates "no code" unique_codes = NULL; @@ -154,7 +154,7 @@ static void alloc_unique_codes(void) { } } -void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, bool is_generator) { +void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, MP_BOOL is_generator) { alloc_unique_codes(); assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); @@ -197,7 +197,7 @@ void rt_assign_native_code(int unique_code_id, void *fun, uint len, int n_args) unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; unique_codes[unique_code_id].n_stack = 0; - unique_codes[unique_code_id].is_generator = false; + unique_codes[unique_code_id].is_generator = MP_FALSE; unique_codes[unique_code_id].u_native.fun = fun; //printf("native code: %d bytes\n", len); @@ -230,7 +230,7 @@ void rt_assign_inline_asm_code(int unique_code_id, void *fun, uint len, int n_ar unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; unique_codes[unique_code_id].n_stack = 0; - unique_codes[unique_code_id].is_generator = false; + unique_codes[unique_code_id].is_generator = MP_FALSE; unique_codes[unique_code_id].u_inline_asm.fun = fun; #ifdef DEBUG_PRINT @@ -252,8 +252,8 @@ void rt_assign_inline_asm_code(int unique_code_id, void *fun, uint len, int n_ar #endif } -static bool fit_small_int(mp_small_int_t o) { - return true; +static MP_BOOL fit_small_int(mp_small_int_t o) { + return MP_TRUE; } int rt_is_true(mp_obj_t arg) { @@ -290,10 +290,10 @@ mp_obj_t rt_load_const_dec(qstr qstr) { const char *s = qstr_str(qstr); int in = PARSE_DEC_IN_INTG; mp_float_t dec_val = 0; - bool exp_neg = false; + MP_BOOL exp_neg = MP_FALSE; int exp_val = 0; int exp_extra = 0; - bool imag = false; + MP_BOOL imag = MP_FALSE; for (; *s; s++) { int dig = *s; if ('0' <= dig && dig <= '9') { @@ -314,11 +314,11 @@ mp_obj_t rt_load_const_dec(qstr qstr) { s++; } else if (s[1] == '-') { s++; - exp_neg = true; + exp_neg = MP_TRUE; } } else if (dig == 'J' || dig == 'j') { s++; - imag = true; + imag = MP_TRUE; break; } else { // unknown character @@ -356,11 +356,11 @@ mp_obj_t rt_load_const_str(qstr qstr) { mp_obj_t rt_load_name(qstr qstr) { // logic: search locals, globals, builtins DEBUG_OP_printf("load name %s\n", qstr_str(qstr)); - mp_map_elem_t *elem = mp_qstr_map_lookup(map_locals, qstr, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(map_locals, qstr, MP_FALSE); if (elem == NULL) { - elem = mp_qstr_map_lookup(map_globals, qstr, false); + elem = mp_qstr_map_lookup(map_globals, qstr, MP_FALSE); if (elem == NULL) { - elem = mp_qstr_map_lookup(&map_builtins, qstr, false); + elem = mp_qstr_map_lookup(&map_builtins, qstr, MP_FALSE); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_NameError, "name '%s' is not defined", qstr_str(qstr))); } @@ -372,9 +372,9 @@ mp_obj_t rt_load_name(qstr qstr) { mp_obj_t rt_load_global(qstr qstr) { // logic: search globals, builtins DEBUG_OP_printf("load global %s\n", qstr_str(qstr)); - mp_map_elem_t *elem = mp_qstr_map_lookup(map_globals, qstr, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(map_globals, qstr, MP_FALSE); if (elem == NULL) { - elem = mp_qstr_map_lookup(&map_builtins, qstr, false); + elem = mp_qstr_map_lookup(&map_builtins, qstr, MP_FALSE); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_NameError, "name '%s' is not defined", qstr_str(qstr))); } @@ -384,7 +384,7 @@ mp_obj_t rt_load_global(qstr qstr) { mp_obj_t rt_load_build_class(void) { DEBUG_OP_printf("load_build_class\n"); - mp_map_elem_t *elem = mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, MP_FALSE); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg(MP_QSTR_NameError, "name '__build_class__' is not defined")); } @@ -401,12 +401,12 @@ void rt_set_cell(mp_obj_t cell, mp_obj_t val) { void rt_store_name(qstr qstr, mp_obj_t obj) { DEBUG_OP_printf("store name %s <- %p\n", qstr_str(qstr), obj); - mp_qstr_map_lookup(map_locals, qstr, true)->value = obj; + mp_qstr_map_lookup(map_locals, qstr, MP_TRUE)->value = obj; } void rt_store_global(qstr qstr, mp_obj_t obj) { DEBUG_OP_printf("store global %s <- %p\n", qstr_str(qstr), obj); - mp_qstr_map_lookup(map_globals, qstr, true)->value = obj; + mp_qstr_map_lookup(map_globals, qstr, MP_TRUE)->value = obj; } mp_obj_t rt_unary_op(int op, mp_obj_t arg) { @@ -750,7 +750,7 @@ mp_obj_t rt_store_map(mp_obj_t map, mp_obj_t key, mp_obj_t value) { mp_obj_t rt_load_attr(mp_obj_t base, qstr attr) { DEBUG_OP_printf("load attr %s\n", qstr_str(attr)); if (MP_OBJ_IS_TYPE(base, &class_type)) { - mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(base), attr, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(base), attr, MP_FALSE); if (elem == NULL) { // TODO what about generic method lookup? goto no_attr; @@ -760,7 +760,7 @@ mp_obj_t rt_load_attr(mp_obj_t base, qstr attr) { return mp_obj_instance_load_attr(base, attr); } else if (MP_OBJ_IS_TYPE(base, &module_type)) { DEBUG_OP_printf("lookup module map %p\n", mp_obj_module_get_globals(base)); - mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_module_get_globals(base), attr, false); + mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_module_get_globals(base), attr, MP_FALSE); if (elem == NULL) { // TODO what about generic method lookup? goto no_attr; @@ -769,10 +769,12 @@ mp_obj_t rt_load_attr(mp_obj_t base, qstr attr) { } else if (MP_OBJ_IS_OBJ(base)) { // generic method lookup mp_obj_base_t *o = base; - const mp_method_t *meth = &o->type->methods[0]; - for (; meth->name != NULL; meth++) { - if (strcmp(meth->name, qstr_str(attr)) == 0) { - return mp_obj_new_bound_meth(base, (mp_obj_t)meth->fun); + const mp_method_t *meth = o->type->methods; + if (meth != NULL) { + for (; meth->name != NULL; meth++) { + if (strcmp(meth->name, qstr_str(attr)) == 0) { + return mp_obj_new_bound_meth(base, (mp_obj_t)meth->fun); + } } } } @@ -793,12 +795,14 @@ void rt_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest) { } else if (MP_OBJ_IS_OBJ(base)) { // generic method lookup mp_obj_base_t *o = base; - const mp_method_t *meth = &o->type->methods[0]; - for (; meth->name != NULL; meth++) { - if (strcmp(meth->name, qstr_str(attr)) == 0) { - dest[1] = (mp_obj_t)meth->fun; - dest[0] = base; - return; + const mp_method_t *meth = o->type->methods; + if (meth != NULL) { + for (; meth->name != NULL; meth++) { + if (strcmp(meth->name, qstr_str(attr)) == 0) { + dest[1] = (mp_obj_t)meth->fun; + dest[0] = base; + return; + } } } } @@ -813,13 +817,13 @@ void rt_store_attr(mp_obj_t base, qstr attr, mp_obj_t value) { if (MP_OBJ_IS_TYPE(base, &class_type)) { // TODO CPython allows STORE_ATTR to a class, but is this the correct implementation? mp_map_t *locals = mp_obj_class_get_locals(base); - mp_qstr_map_lookup(locals, attr, true)->value = value; + mp_qstr_map_lookup(locals, attr, MP_TRUE)->value = value; } else if (MP_OBJ_IS_TYPE(base, &instance_type)) { mp_obj_instance_store_attr(base, attr, value); } else if (MP_OBJ_IS_TYPE(base, &module_type)) { // TODO CPython allows STORE_ATTR to a module, but is this the correct implementation? mp_map_t *globals = mp_obj_module_get_globals(base); - mp_qstr_map_lookup(globals, attr, true)->value = value; + mp_qstr_map_lookup(globals, attr, MP_TRUE)->value = value; } else { nlr_jump(mp_obj_new_exception_msg_2_args(MP_QSTR_AttributeError, "'%s' object has no attribute '%s'", mp_obj_get_type_str(base), qstr_str(attr))); } diff --git a/py/runtime0.h b/py/runtime0.h index 97dbe5ddb..19c2f63ed 100644 --- a/py/runtime0.h +++ b/py/runtime0.h @@ -82,6 +82,6 @@ extern void *const rt_fun_table[RT_F_NUMBER_OF]; void rt_init(void); void rt_deinit(void); int rt_get_unique_code_id(void); -void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, bool is_generator); +void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, MP_BOOL is_generator); void rt_assign_native_code(int unique_code_id, void *f, uint len, int n_args); void rt_assign_inline_asm_code(int unique_code_id, void *f, uint len, int n_args); diff --git a/py/scope.c b/py/scope.c index 5d97393ae..110e63afa 100644 --- a/py/scope.c +++ b/py/scope.c @@ -58,10 +58,10 @@ scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, uint unique_code_id, u return scope; } -id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added) { +id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, MP_BOOL *added) { for (int i = 0; i < scope->id_info_len; i++) { if (scope->id_info[i].qstr == qstr) { - *added = false; + *added = MP_FALSE; return &scope->id_info[i]; } } @@ -100,11 +100,11 @@ id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added) { id_info = &scope->id_info[scope->id_info_len++]; } - id_info->param = false; + id_info->param = MP_FALSE; id_info->kind = 0; id_info->qstr = qstr; id_info->local_num = 0; - *added = true; + *added = MP_TRUE; return id_info; } @@ -155,7 +155,7 @@ void scope_close_over_in_parents(scope_t *scope, qstr qstr) { } if (id == NULL) { // variable not declared in this scope, so declare it as free and keep searching parents - bool added; + MP_BOOL added; id = scope_find_or_add_id(s, qstr, &added); assert(added); id->kind = ID_INFO_KIND_FREE; @@ -178,7 +178,7 @@ void scope_declare_global(scope_t *scope, qstr qstr) { printf("SyntaxError?: can't declare global in outer code\n"); return; } - bool added; + MP_BOOL added; id_info_t *id_info = scope_find_or_add_id(scope, qstr, &added); if (!added) { printf("SyntaxError?: identifier already declared something\n"); @@ -198,7 +198,7 @@ void scope_declare_nonlocal(scope_t *scope, qstr qstr) { printf("SyntaxError?: can't declare nonlocal in outer code\n"); return; } - bool added; + MP_BOOL added; id_info_t *id_info = scope_find_or_add_id(scope, qstr, &added); if (!added) { printf("SyntaxError?: identifier already declared something\n"); diff --git a/py/scope.h b/py/scope.h index 761a4d711..8cdcacaaf 100644 --- a/py/scope.h +++ b/py/scope.h @@ -8,7 +8,7 @@ enum { typedef struct _id_info_t { // TODO compress this info to make structure smaller in memory - bool param; + MP_BOOL param; int kind; qstr qstr; @@ -55,7 +55,7 @@ typedef struct _scope_t { } scope_t; scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, uint unique_code_id, uint emit_options); -id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added); +id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, MP_BOOL *added); id_info_t *scope_find(scope_t *scope, qstr qstr); id_info_t *scope_find_global(scope_t *scope, qstr qstr); id_info_t *scope_find_local_in_parent(scope_t *scope, qstr qstr); diff --git a/py/unicode.c b/py/unicode.c index 58c860a0e..345061885 100644 --- a/py/unicode.c +++ b/py/unicode.c @@ -46,32 +46,32 @@ char *utf8_next_char(const char *s) { return (char*)(s + 1); } -bool unichar_isspace(unichar c) { +MP_BOOL unichar_isspace(unichar c) { return c < 128 && (attr[c] & FL_SPACE) != 0; } -bool unichar_isalpha(unichar c) { +MP_BOOL unichar_isalpha(unichar c) { return c < 128 && (attr[c] & FL_ALPHA) != 0; } -bool unichar_isprint(unichar c) { +MP_BOOL unichar_isprint(unichar c) { return c < 128 && (attr[c] & FL_PRINT) != 0; } -bool unichar_isdigit(unichar c) { +MP_BOOL unichar_isdigit(unichar c) { return c < 128 && (attr[c] & FL_DIGIT) != 0; } /* -bool char_is_alpha_or_digit(unichar c) { +MP_BOOL char_is_alpha_or_digit(unichar c) { return c < 128 && (attr[c] & (FL_ALPHA | FL_DIGIT)) != 0; } -bool char_is_upper(unichar c) { +MP_BOOL char_is_upper(unichar c) { return c < 128 && (attr[c] & FL_UPPER) != 0; } -bool char_is_lower(unichar c) { +MP_BOOL char_is_lower(unichar c) { return c < 128 && (attr[c] & FL_LOWER) != 0; } */ diff --git a/py/vm.c b/py/vm.c index 8e7ef7485..02f3add75 100644 --- a/py/vm.c +++ b/py/vm.c @@ -65,7 +65,7 @@ mp_obj_t mp_execute_byte_code(const byte *code, const mp_obj_t *args, uint n_arg // fastn has items in normal order // sp points to top of stack which grows down -bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out) { +MP_BOOL mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out) { // careful: be sure to declare volatile any variables read in the exception handler (written is ok, I think) const byte *ip = *ip_in_out; @@ -472,7 +472,7 @@ bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t ** nlr_pop(); *sp_in_out = sp; assert(exc_sp == &exc_stack[0] - 1); - return false; + return MP_FALSE; case MP_BC_YIELD_VALUE: nlr_pop(); @@ -481,7 +481,7 @@ bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t ** fastn[1] = fast1; fastn[2] = fast2; *sp_in_out = sp; - return true; + return MP_TRUE; case MP_BC_IMPORT_NAME: DECODE_QSTR; @@ -499,7 +499,7 @@ bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t ** printf("code %p, byte code 0x%02x not implemented\n", ip, op); assert(0); nlr_pop(); - return false; + return MP_FALSE; } } diff --git a/py/vstr.c b/py/vstr.c index 80841b24c..76232cc10 100644 --- a/py/vstr.c +++ b/py/vstr.c @@ -11,11 +11,11 @@ void vstr_init(vstr_t *vstr) { vstr->len = 0; vstr->buf = m_new(char, vstr->alloc); if (vstr->buf == NULL) { - vstr->had_error = true; + vstr->had_error = MP_TRUE; return; } vstr->buf[0] = 0; - vstr->had_error = false; + vstr->had_error = MP_FALSE; } void vstr_clear(vstr_t *vstr) { @@ -42,10 +42,10 @@ void vstr_free(vstr_t *vstr) { void vstr_reset(vstr_t *vstr) { vstr->len = 0; vstr->buf[0] = 0; - vstr->had_error = false; + vstr->had_error = MP_FALSE; } -bool vstr_had_error(vstr_t *vstr) { +MP_BOOL vstr_had_error(vstr_t *vstr) { return vstr->had_error; } @@ -63,23 +63,23 @@ int vstr_len(vstr_t *vstr) { return vstr->len; } -bool vstr_ensure_extra(vstr_t *vstr, int size) { +MP_BOOL vstr_ensure_extra(vstr_t *vstr, int size) { if (vstr->len + size + 1 > vstr->alloc) { int new_alloc = ROUND_ALLOC((vstr->len + size + 1) * 2); char *new_buf = m_renew(char, vstr->buf, vstr->alloc, new_alloc); if (new_buf == NULL) { - vstr->had_error = true; - return false; + vstr->had_error = MP_TRUE; + return MP_FALSE; } vstr->alloc = new_alloc; vstr->buf = new_buf; } - return true; + return MP_TRUE; } void vstr_hint_size(vstr_t *vstr, int size) { // it's not an error if we fail to allocate for the size hint - bool er = vstr->had_error; + MP_BOOL er = vstr->had_error; vstr_ensure_extra(vstr, size); vstr->had_error = er; } diff --git a/stm/audio.c b/stm/audio.c index 34adefbcd..829bd6dfd 100644 --- a/stm/audio.c +++ b/stm/audio.c @@ -22,7 +22,7 @@ int sample_buf_in; int sample_buf_out; byte sample_buf[SAMPLE_BUF_SIZE]; -bool audio_is_full(void) { +MP_BOOL audio_is_full(void) { return ((sample_buf_in + 1) % SAMPLE_BUF_SIZE) == sample_buf_out; } diff --git a/stm/cc3k/pybcc3k.c b/stm/cc3k/pybcc3k.c index 9b7113869..aa83d4a27 100644 --- a/stm/cc3k/pybcc3k.c +++ b/stm/cc3k/pybcc3k.c @@ -165,11 +165,11 @@ void pyb_cc3000_spi_init(void) { /* // WLAN CS, EN and WALN IRQ Configuration - jshSetPinStateIsManual(WLAN_CS_PIN, false); + jshSetPinStateIsManual(WLAN_CS_PIN, MP_FALSE); jshPinOutput(WLAN_CS_PIN, 1); // de-assert CS - jshSetPinStateIsManual(WLAN_EN_PIN, false); + jshSetPinStateIsManual(WLAN_EN_PIN, MP_FALSE); jshPinOutput(WLAN_EN_PIN, 0); // disable WLAN - jshSetPinStateIsManual(WLAN_IRQ_PIN, true); + jshSetPinStateIsManual(WLAN_IRQ_PIN, MP_TRUE); jshPinSetState(WLAN_IRQ_PIN, JSHPINSTATE_GPIO_IN_PULLUP); // flip into read mode with pullup */ // configure wlan CS and EN pins diff --git a/stm/i2c.c b/stm/i2c.c index 9e25ff983..6456a1579 100644 --- a/stm/i2c.c +++ b/stm/i2c.c @@ -20,9 +20,9 @@ typedef enum { I2C_STATE_READ = 2, } i2c_state_t; -// set to true if the port has already been initialized -bool i2c1_port_initialized = false; -bool i2c2_port_initialized = false; +// set to MP_TRUE if the port has already been initialized +MP_BOOL i2c1_port_initialized = MP_FALSE; +MP_BOOL i2c2_port_initialized = MP_FALSE; static I2C_TypeDef * _i2c_port_addr(pyb_i2c_t i2c_port) { if (i2c_port == PYB_I2C_1) { @@ -37,17 +37,17 @@ static I2C_TypeDef * _i2c_port_addr(pyb_i2c_t i2c_port) { // todo - perhaps there should be some global resource management for gpio // this function would fail if the i2c pins have already been defined for // use by another python object -// as it is, this always returns true (unless i2c_port is invalid) -static bool _i2c_init(pyb_i2c_t i2c_port) { +// as it is, this always returns MP_TRUE (unless i2c_port is invalid) +static MP_BOOL _i2c_init(pyb_i2c_t i2c_port) { GPIO_InitTypeDef GPIO_InitStructure; I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); if (i2c == NULL) - return false; + return MP_FALSE; if (i2c_port == PYB_I2C_1) { - if (i2c1_port_initialized == true) { - return true; + if (i2c1_port_initialized == MP_TRUE) { + return MP_TRUE; } RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // enable I2C1 @@ -64,12 +64,12 @@ static bool _i2c_init(pyb_i2c_t i2c_port) { GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); - i2c1_port_initialized = true; + i2c1_port_initialized = MP_TRUE; } if (i2c_port == PYB_I2C_2) { - if (i2c2_port_initialized == true) { - return true; + if (i2c2_port_initialized == MP_TRUE) { + return MP_TRUE; } RCC->APB1ENR |= RCC_APB1ENR_I2C2EN; // enable I2C2 @@ -85,7 +85,7 @@ static bool _i2c_init(pyb_i2c_t i2c_port) { GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2); - i2c2_port_initialized = true; + i2c2_port_initialized = MP_TRUE; } // get clock speeds @@ -108,7 +108,7 @@ static bool _i2c_init(pyb_i2c_t i2c_port) { // enable the I2C peripheral i2c->CR1 |= I2C_CR1_PE; - return true; + return MP_TRUE; } static uint32_t _i2c_get_sr(pyb_i2c_t i2c_port) { @@ -121,9 +121,9 @@ static uint32_t _i2c_get_sr(pyb_i2c_t i2c_port) { return (sr2 << 16) | sr1; } -static bool _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { +static MP_BOOL _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); - if (i2c == NULL) return false; + if (i2c == NULL) return MP_FALSE; // send start condition i2c->CR1 |= I2C_CR1_START; @@ -133,7 +133,7 @@ static bool _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { while ((_i2c_get_sr(i2c_port) & 0x00030001) != 0x00030001) { if (--timeout == 0) { //printf("timeout in _i2c_restart\n"); - return false; + return MP_FALSE; } } @@ -145,7 +145,7 @@ static bool _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { while ((_i2c_get_sr(i2c_port) & 0x00070082) != 0x00070082) { if (--timeout == 0) { //printf("timeout in _i2c_restart write\n"); - return false; + return MP_FALSE; } } } else { @@ -156,16 +156,16 @@ static bool _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { while ((_i2c_get_sr(i2c_port) & 0x00030002) != 0x00030002) { if (--timeout == 0) { //printf("timeout in _i2c_restart read\n"); - return false; + return MP_FALSE; } } } - return true; + return MP_TRUE; } -static bool _i2c_send_byte(pyb_i2c_t i2c_port, uint8_t data) { +static MP_BOOL _i2c_send_byte(pyb_i2c_t i2c_port, uint8_t data) { I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); - if (i2c == NULL) return false; + if (i2c == NULL) return MP_FALSE; // send byte i2c->DR = data; @@ -174,10 +174,10 @@ static bool _i2c_send_byte(pyb_i2c_t i2c_port, uint8_t data) { while ((_i2c_get_sr(i2c_port) & 0x00070084) != 0x00070084) { if (--timeout == 0) { //printf("timeout in _i2c_send_byte\n"); - return false; + return MP_FALSE; } } - return true; + return MP_TRUE; } static uint8_t _i2c_read_ack(pyb_i2c_t i2c_port) { @@ -220,18 +220,18 @@ static uint8_t _i2c_read_nack(pyb_i2c_t i2c_port) { return data; } -static bool _i2c_start(pyb_i2c_t i2c_port) { +static MP_BOOL _i2c_start(pyb_i2c_t i2c_port) { I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); - if (i2c == NULL) return false; + if (i2c == NULL) return MP_FALSE; // wait until I2C is not busy uint32_t timeout = 1000000; while (i2c->SR2 & I2C_SR2_BUSY) { if (--timeout == 0) { - return false; + return MP_FALSE; } } - return true; + return MP_TRUE; } static void _i2c_stop(pyb_i2c_t i2c_port) { @@ -264,7 +264,7 @@ mp_obj_t i2c_obj_start(mp_obj_t self_in) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; } - if (_i2c_start(self->i2c_port) == true) + if (_i2c_start(self->i2c_port) == MP_TRUE) return mp_const_true; return mp_const_false; } @@ -272,7 +272,7 @@ mp_obj_t i2c_obj_start(mp_obj_t self_in) { mp_obj_t i2c_obj_write(mp_obj_t self_in, mp_obj_t data_in) { pyb_i2c_obj_t *self = self_in; if (self->i2c_state != I2C_STATE_WRITE) { - if (_i2c_restart(self->i2c_port, self->i2c_addr, 1) == false) { + if (_i2c_restart(self->i2c_port, self->i2c_addr, 1) == MP_FALSE) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; return mp_const_false; @@ -280,7 +280,7 @@ mp_obj_t i2c_obj_write(mp_obj_t self_in, mp_obj_t data_in) { self->i2c_state = I2C_STATE_WRITE; } uint8_t data = mp_obj_get_int(data_in); - if (_i2c_send_byte(self->i2c_port, data) == false) + if (_i2c_send_byte(self->i2c_port, data) == MP_FALSE) return mp_const_false; return mp_const_true; } @@ -288,7 +288,7 @@ mp_obj_t i2c_obj_write(mp_obj_t self_in, mp_obj_t data_in) { mp_obj_t i2c_obj_read(mp_obj_t self_in) { pyb_i2c_obj_t *self = self_in; if (self->i2c_state != I2C_STATE_READ) { - if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == false) { + if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == MP_FALSE) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; return mp_const_false; @@ -302,7 +302,7 @@ mp_obj_t i2c_obj_read(mp_obj_t self_in) { mp_obj_t i2c_obj_readAndStop(mp_obj_t self_in) { pyb_i2c_obj_t *self = self_in; if (self->i2c_state != I2C_STATE_READ) { - if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == false) { + if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == MP_FALSE) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; return mp_const_false; @@ -326,18 +326,19 @@ static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_read_obj, i2c_obj_read); static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_readAndStop_obj, i2c_obj_readAndStop); static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_stop_obj, i2c_obj_stop); +static const mp_method_t i2c_obj_type_type_methods[] = { + { "start", &i2c_obj_start_obj }, + { "write", &i2c_obj_write_obj }, + { "read", &i2c_obj_read_obj }, + { "readAndStop", &i2c_obj_readAndStop_obj }, + { "stop", &i2c_obj_stop_obj }, + { NULL, NULL }, +}; static const mp_obj_type_t i2c_obj_type = { { &mp_const_type }, "I2C", .print = i2c_obj_print, - .methods = { - { "start", &i2c_obj_start_obj }, - { "write", &i2c_obj_write_obj }, - { "read", &i2c_obj_read_obj }, - { "readAndStop", &i2c_obj_readAndStop_obj }, - { "stop", &i2c_obj_stop_obj }, - { NULL, NULL }, - } + .methods = i2c_obj_type_type_methods, }; // create the I2C object @@ -350,7 +351,7 @@ mp_obj_t pyb_I2C(mp_obj_t i2c_id, mp_obj_t i2c_addr) { case 1: i2c_port = PYB_I2C_2; break; default: return mp_const_none; } - if (_i2c_init(i2c_port) == false) { + if (_i2c_init(i2c_port) == MP_FALSE) { return mp_const_none; } pyb_i2c_obj_t *o = m_new_obj(pyb_i2c_obj_t); diff --git a/stm/led.c b/stm/led.c index 9809c2177..e89adbb78 100644 --- a/stm/led.c +++ b/stm/led.c @@ -176,15 +176,16 @@ mp_obj_t led_obj_off(mp_obj_t self_in) { static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on); static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off); +static const mp_method_t led_obj_type_methods[] = { + { "on", &led_obj_on_obj }, + { "off", &led_obj_off_obj }, + { NULL, NULL }, +}; static const mp_obj_type_t led_obj_type = { { &mp_const_type }, "Led", .print = led_obj_print, - .methods = { - { "on", &led_obj_on_obj }, - { "off", &led_obj_off_obj }, - { NULL, NULL }, - } + .methods = led_obj_type_methods, }; mp_obj_t pyb_Led(mp_obj_t led_id) { diff --git a/stm/lexerstm.c b/stm/lexerstm.c index 661dfb016..6de908317 100644 --- a/stm/lexerstm.c +++ b/stm/lexerstm.c @@ -21,7 +21,7 @@ void str_buf_free(mp_lexer_str_buf_t *sb) { } } -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, mp_lexer_str_buf_t *sb) { +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str, mp_lexer_str_buf_t *sb) { sb->free = free_str; sb->src_beg = str; sb->src_cur = str; diff --git a/stm/lexerstm.h b/stm/lexerstm.h index 7e090898a..99c270a71 100644 --- a/stm/lexerstm.h +++ b/stm/lexerstm.h @@ -1,5 +1,5 @@ typedef struct _py_lexer_str_buf_t { - bool free; // free src_beg when done + MP_BOOL free; // free src_beg when done const char *src_beg; // beginning of source const char *src_cur; // current location in source const char *src_end; // end (exclusive) of source @@ -12,5 +12,5 @@ typedef struct _py_lexer_file_buf_t { uint16_t pos; } mp_lexer_file_buf_t; -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, mp_lexer_str_buf_t *sb); +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str, mp_lexer_str_buf_t *sb); mp_lexer_t *mp_lexer_new_from_file(const char *filename, mp_lexer_file_buf_t *fb); diff --git a/stm/main.c b/stm/main.c index 07c974eff..e1b695167 100644 --- a/stm/main.c +++ b/stm/main.c @@ -359,7 +359,7 @@ int readline(vstr_t *line, const char *prompt) { readline_hist[0] = strdup(vstr_str(line)); return 1; } else if (c == 27) { - escape = true; + escape = MP_TRUE; } else if (c == 127) { if (vstr_len(line) > len) { vstr_cut_tail(line, 1); @@ -432,12 +432,12 @@ void do_repl(void) { } mp_lexer_str_buf_t sb; - mp_lexer_t *lex = mp_lexer_new_from_str_len("", vstr_str(&line), vstr_len(&line), false, &sb); + mp_lexer_t *lex = mp_lexer_new_from_str_len("", vstr_str(&line), vstr_len(&line), MP_FALSE, &sb); mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT); mp_lexer_free(lex); if (pn != MP_PARSE_NODE_NULL) { - mp_obj_t module_fun = mp_compile(pn, true); + mp_obj_t module_fun = mp_compile(pn, MP_TRUE); if (module_fun != mp_const_none) { nlr_buf_t nlr; uint32_t start = sys_tick_counter; @@ -461,37 +461,37 @@ void do_repl(void) { stdout_tx_str("\r\n"); } -bool do_file(const char *filename) { +MP_BOOL do_file(const char *filename) { mp_lexer_file_buf_t fb; mp_lexer_t *lex = mp_lexer_new_from_file(filename, &fb); if (lex == NULL) { printf("could not open file '%s' for reading\n", filename); - return false; + return MP_FALSE; } mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT); mp_lexer_free(lex); if (pn == MP_PARSE_NODE_NULL) { - return false; + return MP_FALSE; } - mp_obj_t module_fun = mp_compile(pn, false); + mp_obj_t module_fun = mp_compile(pn, MP_FALSE); if (module_fun == mp_const_none) { - return false; + return MP_FALSE; } nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { rt_call_function_0(module_fun); nlr_pop(); - return true; + return MP_TRUE; } else { // uncaught exception mp_obj_print((mp_obj_t)nlr.ret_val); printf("\n"); - return false; + return MP_FALSE; } } @@ -689,6 +689,12 @@ static MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close); // TODO gc hook to close the file if not already closed +static const mp_method_t file_obj_type_methods[] = { + { "read", &file_obj_read_obj }, + { "write", &file_obj_write_obj }, + { "close", &file_obj_close_obj }, + { NULL, NULL }, +}; static const mp_obj_type_t file_obj_type = { { &mp_const_type }, "File", @@ -699,12 +705,7 @@ static const mp_obj_type_t file_obj_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = { - { "read", &file_obj_read_obj }, - { "write", &file_obj_write_obj }, - { "close", &file_obj_close_obj }, - {NULL, NULL}, - } + .methods = file_obj_type_methods, }; mp_obj_t pyb_io_open(mp_obj_t o_filename, mp_obj_t o_mode) { @@ -778,7 +779,7 @@ int main(void) { //usart_init(); disabled while wi-fi is enabled - int first_soft_reset = true; + int first_soft_reset = MP_TRUE; soft_reset: @@ -847,12 +848,12 @@ soft_reset: lcd_print_str(" micro py board\n"); // check if user switch held (initiates reset of filesystem) - bool reset_filesystem = false; + MP_BOOL reset_filesystem = MP_FALSE; if (switch_get()) { - reset_filesystem = true; + reset_filesystem = MP_TRUE; for (int i = 0; i < 50; i++) { if (!switch_get()) { - reset_filesystem = false; + reset_filesystem = MP_FALSE; break; } sys_tick_delay_ms(10); @@ -1063,7 +1064,7 @@ soft_reset: "f()\n"; mp_lexer_str_buf_t mp_lexer_str_buf; - mp_lexer_t *lex = mp_lexer_new_from_str_len("", pysrc, strlen(pysrc), false, &mp_lexer_str_buf); + mp_lexer_t *lex = mp_lexer_new_from_str_len("", pysrc, strlen(pysrc), MP_FALSE, &mp_lexer_str_buf); // nalloc=1740;6340;6836 -> 140;4600;496 bytes for lexer, parser, compiler printf("lex; al=%u\n", m_get_total_bytes_allocated()); @@ -1074,7 +1075,7 @@ soft_reset: printf("pars;al=%u\n", m_get_total_bytes_allocated()); sys_tick_delay_ms(1000); //parse_node_show(pn, 0); - mp_obj_t module_fun = mp_compile(pn, false); + mp_obj_t module_fun = mp_compile(pn, MP_FALSE); printf("comp;al=%u\n", m_get_total_bytes_allocated()); sys_tick_delay_ms(1000); @@ -1171,7 +1172,7 @@ soft_reset: printf("PYB: soft reboot\n"); - first_soft_reset = false; + first_soft_reset = MP_FALSE; goto soft_reset; } diff --git a/stm/printf.c b/stm/printf.c index 8a59f8a98..7ada626bd 100644 --- a/stm/printf.c +++ b/stm/printf.c @@ -152,10 +152,10 @@ int pfenv_printf(const pfenv_t *pfenv, const char *fmt, va_list args) { } // parse long specifiers (current not used) - //bool long_arg = false; + //MP_BOOL long_arg = MP_FALSE; if (*fmt == 'l') { ++fmt; - //long_arg = true; + //long_arg = MP_TRUE; } if (*fmt == '\0') { @@ -215,14 +215,14 @@ int pfenv_printf(const pfenv_t *pfenv, const char *fmt, va_list args) { void stdout_print_strn(void *data, const char *str, unsigned int len) { // send stdout to USART, USB CDC VCP, and LCD if nothing else - bool any = false; + MP_BOOL any = MP_FALSE; if (usart_is_enabled()) { usart_tx_strn_cooked(str, len); - any = true; + any = MP_TRUE; } if (usb_vcp_is_enabled()) { usb_vcp_send_strn_cooked(str, len); - any = true; + any = MP_TRUE; } if (!any) { lcd_print_strn(str, len); diff --git a/stm/pybwlan.c b/stm/pybwlan.c index 6988f1c84..cffa01684 100644 --- a/stm/pybwlan.c +++ b/stm/pybwlan.c @@ -336,7 +336,7 @@ void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length) socketnum = data[0]; //PRINT_F("TCP Close wait #"); printDec(socketnum); if (socketnum < MAX_SOCKETS) - closed_sockets[socketnum] = true; + closed_sockets[socketnum] = MP_TRUE; */ } } diff --git a/stm/servo.c b/stm/servo.c index 31190ce79..7facce745 100644 --- a/stm/servo.c +++ b/stm/servo.c @@ -137,14 +137,15 @@ static mp_obj_t servo_obj_angle(mp_obj_t self_in, mp_obj_t angle) { static MP_DEFINE_CONST_FUN_OBJ_2(servo_obj_angle_obj, servo_obj_angle); +static const mp_method_t servo_obj_type_methods[] = { + { "angle", &servo_obj_angle_obj }, + { NULL, NULL }, +}; static const mp_obj_type_t servo_obj_type = { { &mp_const_type }, "Servo", .print = servo_obj_print, - .methods = { - { "angle", &servo_obj_angle_obj }, - { NULL, NULL }, - } + .methods = servo_obj_type_methods, }; mp_obj_t pyb_Servo(mp_obj_t servo_id) { diff --git a/stm/storage.c b/stm/storage.c index daee4adb5..f1ec9f652 100644 --- a/stm/storage.c +++ b/stm/storage.c @@ -15,18 +15,18 @@ #define FLASH_PART1_NUM_BLOCKS (224) // 16k+16k+16k+64k=112k #define FLASH_MEM_START_ADDR (0x08004000) // sector 1, 16k -static bool is_initialised = false; +static MP_BOOL is_initialised = MP_FALSE; static uint32_t cache_flash_sector_id; static uint32_t cache_flash_sector_start; static uint32_t cache_flash_sector_size; -static bool cache_dirty; +static MP_BOOL cache_dirty; static uint32_t sys_tick_counter_last_write; static void cache_flush(void) { if (cache_dirty) { // sync the cache RAM buffer by writing it to the flash page flash_write(cache_flash_sector_start, (const uint32_t*)CACHE_MEM_START_ADDR, cache_flash_sector_size / 4); - cache_dirty = false; + cache_dirty = MP_FALSE; // indicate a clean cache with LED off led_state(PYB_LED_R1, 0); } @@ -43,7 +43,7 @@ static uint8_t *cache_get_addr_for_write(uint32_t flash_addr) { cache_flash_sector_start = flash_sector_start; cache_flash_sector_size = flash_sector_size; } - cache_dirty = true; + cache_dirty = MP_TRUE; // indicate a dirty cache with LED on led_state(PYB_LED_R1, 1); return (uint8_t*)CACHE_MEM_START_ADDR + flash_addr - flash_sector_start; @@ -64,8 +64,8 @@ static uint8_t *cache_get_addr_for_read(uint32_t flash_addr) { void storage_init(void) { if (!is_initialised) { cache_flash_sector_id = 0; - cache_dirty = false; - is_initialised = true; + cache_dirty = MP_FALSE; + is_initialised = MP_TRUE; sys_tick_counter_last_write = 0; } } @@ -78,7 +78,7 @@ uint32_t storage_get_block_count(void) { return FLASH_PART1_START_BLOCK + FLASH_PART1_NUM_BLOCKS; } -bool storage_needs_flush(void) { +MP_BOOL storage_needs_flush(void) { // wait 2 seconds after last write to flush return cache_dirty && sys_tick_has_passed(sys_tick_counter_last_write, 2000); } @@ -123,7 +123,7 @@ static void build_partition(uint8_t *buf, int boot, int type, uint32_t start_blo buf[15] = num_blocks >> 24; } -bool storage_read_block(uint8_t *dest, uint32_t block) { +MP_BOOL storage_read_block(uint8_t *dest, uint32_t block) { //printf("RD %u\n", block); if (block == 0) { // fake the MBR so we can decide on our own partition table @@ -140,26 +140,26 @@ bool storage_read_block(uint8_t *dest, uint32_t block) { dest[510] = 0x55; dest[511] = 0xaa; - return true; + return MP_TRUE; } else if (FLASH_PART1_START_BLOCK <= block && block < FLASH_PART1_START_BLOCK + FLASH_PART1_NUM_BLOCKS) { // non-MBR block, get data from flash memory, possibly via cache uint32_t flash_addr = FLASH_MEM_START_ADDR + (block - FLASH_PART1_START_BLOCK) * BLOCK_SIZE; uint8_t *src = cache_get_addr_for_read(flash_addr); memcpy(dest, src, BLOCK_SIZE); - return true; + return MP_TRUE; } else { // bad block number - return false; + return MP_FALSE; } } -bool storage_write_block(const uint8_t *src, uint32_t block) { +MP_BOOL storage_write_block(const uint8_t *src, uint32_t block) { //printf("WR %u\n", block); if (block == 0) { // can't write MBR, but pretend we did - return true; + return MP_TRUE; } else if (FLASH_PART1_START_BLOCK <= block && block < FLASH_PART1_START_BLOCK + FLASH_PART1_NUM_BLOCKS) { // non-MBR block, copy to cache @@ -167,10 +167,10 @@ bool storage_write_block(const uint8_t *src, uint32_t block) { uint8_t *dest = cache_get_addr_for_write(flash_addr); memcpy(dest, src, BLOCK_SIZE); sys_tick_counter_last_write = sys_tick_counter; - return true; + return MP_TRUE; } else { // bad block number - return false; + return MP_FALSE; } } diff --git a/stm/storage.h b/stm/storage.h index fe37e8b27..7bdcfc7cc 100644 --- a/stm/storage.h +++ b/stm/storage.h @@ -1,7 +1,7 @@ void storage_init(void); uint32_t storage_get_block_size(void); uint32_t storage_get_block_count(void); -bool storage_needs_flush(void); +MP_BOOL storage_needs_flush(void); void storage_flush(void); -bool storage_read_block(uint8_t *dest, uint32_t block); -bool storage_write_block(const uint8_t *src, uint32_t block); +MP_BOOL storage_read_block(uint8_t *dest, uint32_t block); +MP_BOOL storage_write_block(const uint8_t *src, uint32_t block); diff --git a/stm/systick.c b/stm/systick.c index 40ae53279..f9def4a02 100644 --- a/stm/systick.c +++ b/stm/systick.c @@ -43,7 +43,7 @@ void sys_tick_wait_at_least(uint32_t stc, uint32_t delay_ms) { } } -bool sys_tick_has_passed(uint32_t stc, uint32_t delay_ms) { +MP_BOOL sys_tick_has_passed(uint32_t stc, uint32_t delay_ms) { // stc_wait is the value of sys_tick_counter that we wait for uint32_t stc_wait = stc + delay_ms; if (stc_wait < stc) { diff --git a/stm/systick.h b/stm/systick.h index 7d2deed11..518d872c2 100644 --- a/stm/systick.h +++ b/stm/systick.h @@ -4,4 +4,4 @@ void sys_tick_init(void); void SysTick_Handler(void); void sys_tick_delay_ms(uint32_t delay_ms); void sys_tick_wait_at_least(uint32_t stc, uint32_t delay_ms); -bool sys_tick_has_passed(uint32_t stc, uint32_t delay_ms); +MP_BOOL sys_tick_has_passed(uint32_t stc, uint32_t delay_ms); diff --git a/stm/usart.c b/stm/usart.c index 307aff166..6e300a29e 100644 --- a/stm/usart.c +++ b/stm/usart.c @@ -5,7 +5,7 @@ #include "misc.h" #include "usart.h" -static bool is_enabled; +static MP_BOOL is_enabled; // USART6 on PC6 (TX), PC7 (RX) void usart_init(void) { @@ -33,14 +33,14 @@ void usart_init(void) { USART_Cmd(USART6, ENABLE); - is_enabled = true; + is_enabled = MP_TRUE; } -bool usart_is_enabled(void) { +MP_BOOL usart_is_enabled(void) { return is_enabled; } -bool usart_rx_any(void) { +MP_BOOL usart_rx_any(void) { return USART_GetFlagStatus(USART6, USART_FLAG_RXNE) == SET; } diff --git a/stm/usart.h b/stm/usart.h index 9d92e59f5..ad57587ce 100644 --- a/stm/usart.h +++ b/stm/usart.h @@ -1,6 +1,6 @@ void usart_init(void); -bool usart_is_enabled(void); -bool usart_rx_any(void); +MP_BOOL usart_is_enabled(void); +MP_BOOL usart_rx_any(void); int usart_rx_char(void); void usart_tx_char(int c); void usart_tx_str(const char *str); diff --git a/stm/usb.c b/stm/usb.c index b0fbfa194..6b553914e 100644 --- a/stm/usb.c +++ b/stm/usb.c @@ -30,7 +30,7 @@ void usb_init(void) { is_enabled = 1; } -bool usb_vcp_is_enabled(void) { +MP_BOOL usb_vcp_is_enabled(void) { return is_enabled; } diff --git a/stm/usb.h b/stm/usb.h index c4b3b151f..6f8172a3f 100644 --- a/stm/usb.h +++ b/stm/usb.h @@ -1,5 +1,5 @@ void usb_init(void); -bool usb_vcp_is_enabled(void); +MP_BOOL usb_vcp_is_enabled(void); int usb_vcp_rx_any(void); char usb_vcp_rx_get(void); void usb_vcp_send_str(const char* str); diff --git a/unix-cpy/main.c b/unix-cpy/main.c index eba97f527..b1e99ac12 100644 --- a/unix-cpy/main.c +++ b/unix-cpy/main.c @@ -37,7 +37,7 @@ void do_file(const char *file) { //printf("----------------\n"); //parse_node_show(pn, 0); //printf("----------------\n"); - mp_obj_t module_fun = mp_compile(pn, false); + mp_obj_t module_fun = mp_compile(pn, MP_FALSE); //printf("----------------\n"); if (module_fun == mp_const_none) { diff --git a/unix/main.c b/unix/main.c index a06dc3679..e3873489d 100644 --- a/unix/main.c +++ b/unix/main.c @@ -79,13 +79,13 @@ static void do_repl(void) { } } - mp_lexer_t *lex = mp_lexer_new_from_str_len("", line, strlen(line), false); + mp_lexer_t *lex = mp_lexer_new_from_str_len("", line, strlen(line), MP_FALSE); mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT); mp_lexer_free(lex); if (pn != MP_PARSE_NODE_NULL) { //mp_parse_node_show(pn, 0); - mp_obj_t module_fun = mp_compile(pn, true); + mp_obj_t module_fun = mp_compile(pn, MP_TRUE); if (module_fun != mp_const_none) { nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { @@ -139,7 +139,7 @@ void do_file(const char *file) { //printf("----------------\n"); //parse_node_show(pn, 0); //printf("----------------\n"); - mp_obj_t module_fun = mp_compile(pn, false); + mp_obj_t module_fun = mp_compile(pn, MP_FALSE); //printf("----------------\n"); #if MICROPY_EMIT_CPYTHON @@ -166,7 +166,7 @@ void do_file(const char *file) { typedef struct _test_obj_t { mp_obj_base_t base; - bool value; + MP_BOOL value; } test_obj_t; static void test_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { From 5fd8fd2c16076f683b629b513e8865e461d4c9a8 Mon Sep 17 00:00:00 2001 From: ian-v Date: Mon, 6 Jan 2014 13:51:53 -0800 Subject: [PATCH 2/8] Revert MP_BOOL, etc. and use instead --- py/asmthumb.c | 8 +- py/asmthumb.h | 2 +- py/asmx64.c | 12 +-- py/asmx64.h | 2 +- py/bc.h | 2 +- py/builtinimport.c | 2 +- py/compile.c | 224 +++++++++++++++++++++---------------------- py/compile.h | 2 +- py/emit.h | 10 +- py/emitbc.c | 18 ++-- py/emitcpy.c | 32 +++---- py/emitinlinethumb.c | 6 +- py/emitnative.c | 30 +++--- py/emitpass1.c | 4 +- py/lexer.c | 80 ++++++++-------- py/lexer.h | 14 +-- py/lexerunix.c | 6 +- py/lexerunix.h | 2 +- py/map.c | 12 +-- py/map.h | 6 +- py/misc.h | 18 ++-- py/obj.c | 20 ++-- py/obj.h | 8 +- py/objbool.c | 6 +- py/objclass.c | 2 +- py/objdict.c | 8 +- py/objgenerator.c | 2 +- py/objinstance.c | 14 +-- py/objlist.c | 2 + py/objset.c | 8 +- py/objtuple.c | 10 +- py/parse.c | 44 ++++----- py/repl.c | 8 +- py/repl.h | 2 +- py/runtime.c | 118 +++++++++++------------ py/runtime0.h | 2 +- py/scope.c | 14 +-- py/scope.h | 4 +- py/unicode.c | 14 +-- py/vm.c | 8 +- py/vstr.c | 18 ++-- stm/audio.c | 2 +- stm/cc3k/pybcc3k.c | 6 +- stm/i2c.c | 83 ++++++++-------- stm/led.c | 11 +-- stm/lexerstm.c | 2 +- stm/lexerstm.h | 4 +- stm/main.c | 47 +++++---- stm/printf.c | 10 +- stm/pybwlan.c | 2 +- stm/servo.c | 9 +- stm/storage.c | 30 +++--- stm/storage.h | 6 +- stm/systick.c | 2 +- stm/systick.h | 2 +- stm/usart.c | 8 +- stm/usart.h | 4 +- stm/usb.c | 2 +- stm/usb.h | 2 +- unix-cpy/main.c | 2 +- unix/main.c | 8 +- 61 files changed, 517 insertions(+), 529 deletions(-) diff --git a/py/asmthumb.c b/py/asmthumb.c index 76a93b9a3..ba95d80c6 100644 --- a/py/asmthumb.c +++ b/py/asmthumb.c @@ -45,7 +45,7 @@ asm_thumb_t *asm_thumb_new(uint max_num_labels) { return as; } -void asm_thumb_free(asm_thumb_t *as, MP_BOOL free_code) { +void asm_thumb_free(asm_thumb_t *as, bool free_code) { if (free_code) { m_del(byte, as->code_base, as->code_size); } @@ -56,9 +56,9 @@ void asm_thumb_free(asm_thumb_t *as, MP_BOOL free_code) { { Label *lab = &g_array_index(as->label, Label, i); if (lab->unresolved != NULL) - g_array_free(lab->unresolved, MP_TRUE); + g_array_free(lab->unresolved, true); } - g_array_free(as->label, MP_TRUE); + g_array_free(as->label, true); } */ m_del_obj(asm_thumb_t, as); @@ -87,7 +87,7 @@ void asm_thumb_end_pass(asm_thumb_t *as) { int i; for (i = 0; i < as->label->len; ++i) if (g_array_index(as->label, Label, i).unresolved != NULL) - return MP_FALSE; + return false; } */ } diff --git a/py/asmthumb.h b/py/asmthumb.h index c6ebcb4c4..dcd9c2e3a 100644 --- a/py/asmthumb.h +++ b/py/asmthumb.h @@ -44,7 +44,7 @@ typedef struct _asm_thumb_t asm_thumb_t; asm_thumb_t *asm_thumb_new(uint max_num_labels); -void asm_thumb_free(asm_thumb_t *as, MP_BOOL free_code); +void asm_thumb_free(asm_thumb_t *as, bool free_code); void asm_thumb_start_pass(asm_thumb_t *as, int pass); void asm_thumb_end_pass(asm_thumb_t *as); uint asm_thumb_get_code_size(asm_thumb_t *as); diff --git a/py/asmx64.c b/py/asmx64.c index 054f41188..ed9ca80f5 100644 --- a/py/asmx64.c +++ b/py/asmx64.c @@ -94,7 +94,7 @@ struct _asm_x64_t { }; // for allocating memory, see src/v8/src/platform-linux.cc -void *alloc_mem(uint req_size, uint *alloc_size, MP_BOOL is_exec) { +void *alloc_mem(uint req_size, uint *alloc_size, bool is_exec) { req_size = (req_size + 0xfff) & (~0xfff); int prot = PROT_READ | PROT_WRITE | (is_exec ? PROT_EXEC : 0); void *ptr = mmap(NULL, req_size, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); @@ -119,7 +119,7 @@ asm_x64_t* asm_x64_new(uint max_num_labels) { return as; } -void asm_x64_free(asm_x64_t* as, MP_BOOL free_code) { +void asm_x64_free(asm_x64_t* as, bool free_code) { if (free_code) { // need to un-mmap //m_free(as->code_base); @@ -131,9 +131,9 @@ void asm_x64_free(asm_x64_t* as, MP_BOOL free_code) { { Label* lab = &g_array_index(as->label, Label, i); if (lab->unresolved != NULL) - g_array_free(lab->unresolved, MP_TRUE); + g_array_free(lab->unresolved, true); } - g_array_free(as->label, MP_TRUE); + g_array_free(as->label, true); } */ m_del_obj(asm_x64_t, as); @@ -154,7 +154,7 @@ void asm_x64_end_pass(asm_x64_t *as) { as->code_size = as->code_offset; //as->code_base = m_new(byte, as->code_size); need to allocale executable memory uint actual_alloc; - as->code_base = alloc_mem(as->code_size, &actual_alloc, MP_TRUE); + as->code_base = alloc_mem(as->code_size, &actual_alloc, true); printf("code_size: %u\n", as->code_size); } @@ -165,7 +165,7 @@ void asm_x64_end_pass(asm_x64_t *as) { int i; for (i = 0; i < as->label->len; ++i) if (g_array_index(as->label, Label, i).unresolved != NULL) - return MP_FALSE; + return false; } */ } diff --git a/py/asmx64.h b/py/asmx64.h index 1ee39a3b2..16cc3b211 100644 --- a/py/asmx64.h +++ b/py/asmx64.h @@ -27,7 +27,7 @@ typedef struct _asm_x64_t asm_x64_t; asm_x64_t* asm_x64_new(uint max_num_labels); -void asm_x64_free(asm_x64_t* as, MP_BOOL free_code); +void asm_x64_free(asm_x64_t* as, bool free_code); void asm_x64_start_pass(asm_x64_t *as, int pass); void asm_x64_end_pass(asm_x64_t *as); uint asm_x64_get_code_size(asm_x64_t* as); diff --git a/py/bc.h b/py/bc.h index b1fdb3aa1..35847f458 100644 --- a/py/bc.h +++ b/py/bc.h @@ -1,2 +1,2 @@ mp_obj_t mp_execute_byte_code(const byte *code, const mp_obj_t *args, uint n_args, uint n_state); -MP_BOOL mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out); +bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out); diff --git a/py/builtinimport.c b/py/builtinimport.c index ba191ddd7..90a0fc339 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -58,7 +58,7 @@ mp_obj_t mp_builtin___import__(int n, mp_obj_t *args) { return mp_const_none; } - mp_obj_t module_fun = mp_compile(pn, MP_FALSE); + mp_obj_t module_fun = mp_compile(pn, false); if (module_fun == mp_const_none) { // TODO handle compile error correctly diff --git a/py/compile.c b/py/compile.c index d388ad809..0e1989031 100644 --- a/py/compile.c +++ b/py/compile.c @@ -39,9 +39,9 @@ typedef enum { #define EMIT_OPT_ASM_THUMB (4) typedef struct _compiler_t { - MP_BOOL is_repl; + bool is_repl; pass_kind_t pass; - MP_BOOL had_error; // try to keep compiler clean from nlr + bool had_error; // try to keep compiler clean from nlr int next_label; @@ -50,9 +50,9 @@ typedef struct _compiler_t { int except_nest_level; int n_arg_keyword; - MP_BOOL have_star_arg; - MP_BOOL have_dbl_star_arg; - MP_BOOL have_bare_star; + bool have_star_arg; + bool have_dbl_star_arg; + bool have_bare_star; int param_pass; int param_pass_num_dict_params; int param_pass_num_default_params; @@ -261,36 +261,36 @@ void compile_generic_all_nodes(compiler_t *comp, mp_parse_node_struct_t *pns) { } #if MICROPY_EMIT_CPYTHON -static MP_BOOL cpython_c_tuple_is_const(mp_parse_node_t pn) { +static bool cpython_c_tuple_is_const(mp_parse_node_t pn) { if (!MP_PARSE_NODE_IS_LEAF(pn)) { - return MP_FALSE; + return false; } if (MP_PARSE_NODE_IS_ID(pn)) { - return MP_FALSE; + return false; } - return MP_TRUE; + return true; } -static void cpython_c_print_quoted_str(vstr_t *vstr, qstr qstr, MP_BOOL bytes) { +static void cpython_c_print_quoted_str(vstr_t *vstr, qstr qstr, bool bytes) { const char *str = qstr_str(qstr); int len = strlen(str); - MP_BOOL has_single_quote = MP_FALSE; - MP_BOOL has_double_quote = MP_FALSE; + bool has_single_quote = false; + bool has_double_quote = false; for (int i = 0; i < len; i++) { if (str[i] == '\'') { - has_single_quote = MP_TRUE; + has_single_quote = true; } else if (str[i] == '"') { - has_double_quote = MP_TRUE; + has_double_quote = true; } } if (bytes) { vstr_printf(vstr, "b"); } - MP_BOOL quote_single = MP_FALSE; + bool quote_single = false; if (has_single_quote && !has_double_quote) { vstr_printf(vstr, "\""); } else { - quote_single = MP_TRUE; + quote_single = true; vstr_printf(vstr, "'"); } for (int i = 0; i < len; i++) { @@ -319,8 +319,8 @@ static void cpython_c_tuple_emit_const(compiler_t *comp, mp_parse_node_t pn, vst case MP_PARSE_NODE_SMALL_INT: vstr_printf(vstr, "%d", arg); break; case MP_PARSE_NODE_INTEGER: vstr_printf(vstr, "%s", qstr_str(arg)); break; case MP_PARSE_NODE_DECIMAL: vstr_printf(vstr, "%s", qstr_str(arg)); break; - case MP_PARSE_NODE_STRING: cpython_c_print_quoted_str(vstr, arg, MP_FALSE); break; - case MP_PARSE_NODE_BYTES: cpython_c_print_quoted_str(vstr, arg, MP_TRUE); break; + case MP_PARSE_NODE_STRING: cpython_c_print_quoted_str(vstr, arg, false); break; + case MP_PARSE_NODE_BYTES: cpython_c_print_quoted_str(vstr, arg, true); break; case MP_PARSE_NODE_TOKEN: switch (arg) { case MP_TOKEN_KW_FALSE: vstr_printf(vstr, "False"); break; @@ -339,33 +339,33 @@ static void cpython_c_tuple(compiler_t *comp, mp_parse_node_t pn, mp_parse_node_ n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns_list); } int total = n; - MP_BOOL is_const = MP_TRUE; + bool is_const = true; if (!MP_PARSE_NODE_IS_NULL(pn)) { total += 1; if (!cpython_c_tuple_is_const(pn)) { - is_const = MP_FALSE; + is_const = false; } } for (int i = 0; i < n; i++) { if (!cpython_c_tuple_is_const(pns_list->nodes[i])) { - is_const = MP_FALSE; + is_const = false; break; } } if (total > 0 && is_const) { - MP_BOOL need_comma = MP_FALSE; + bool need_comma = false; vstr_t *vstr = vstr_new(); vstr_printf(vstr, "("); if (!MP_PARSE_NODE_IS_NULL(pn)) { cpython_c_tuple_emit_const(comp, pn, vstr); - need_comma = MP_TRUE; + need_comma = true; } for (int i = 0; i < n; i++) { if (need_comma) { vstr_printf(vstr, ", "); } cpython_c_tuple_emit_const(comp, pns_list->nodes[i], vstr); - need_comma = MP_TRUE; + need_comma = true; } if (total == 1) { vstr_printf(vstr, ",)"); @@ -412,25 +412,25 @@ void compile_generic_tuple(compiler_t *comp, mp_parse_node_struct_t *pns) { c_tuple(comp, MP_PARSE_NODE_NULL, pns); } -static MP_BOOL node_is_const_false(mp_parse_node_t pn) { +static bool node_is_const_false(mp_parse_node_t pn) { return MP_PARSE_NODE_IS_TOKEN_KIND(pn, MP_TOKEN_KW_FALSE); // untested: || (MP_PARSE_NODE_IS_SMALL_INT(pn) && MP_PARSE_NODE_LEAF_ARG(pn) == 1); } -static MP_BOOL node_is_const_true(mp_parse_node_t pn) { +static bool node_is_const_true(mp_parse_node_t pn) { return MP_PARSE_NODE_IS_TOKEN_KIND(pn, MP_TOKEN_KW_TRUE) || (MP_PARSE_NODE_IS_SMALL_INT(pn) && MP_PARSE_NODE_LEAF_ARG(pn) == 1); } #if MICROPY_EMIT_CPYTHON // the is_nested variable is purely to match with CPython, which doesn't fully optimise not's -static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump_if, int label, MP_BOOL is_nested) { +static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if, int label, bool is_nested) { if (node_is_const_false(pn)) { - if (jump_if == MP_FALSE) { + if (jump_if == false) { EMIT(jump, label); } return; } else if (node_is_const_true(pn)) { - if (jump_if == MP_TRUE) { + if (jump_if == true) { EMIT(jump, label); } return; @@ -438,42 +438,42 @@ static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; int n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns); if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_or_test) { - if (jump_if == MP_FALSE) { + if (jump_if == false) { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - cpython_c_if_cond(comp, pns->nodes[i], MP_TRUE, label2, MP_TRUE); + cpython_c_if_cond(comp, pns->nodes[i], true, label2, true); } - cpython_c_if_cond(comp, pns->nodes[n - 1], MP_FALSE, label, MP_TRUE); + cpython_c_if_cond(comp, pns->nodes[n - 1], false, label, true); EMIT(label_assign, label2); } else { for (int i = 0; i < n; i++) { - cpython_c_if_cond(comp, pns->nodes[i], MP_TRUE, label, MP_TRUE); + cpython_c_if_cond(comp, pns->nodes[i], true, label, true); } } return; } else if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_and_test) { - if (jump_if == MP_FALSE) { + if (jump_if == false) { for (int i = 0; i < n; i++) { - cpython_c_if_cond(comp, pns->nodes[i], MP_FALSE, label, MP_TRUE); + cpython_c_if_cond(comp, pns->nodes[i], false, label, true); } } else { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - cpython_c_if_cond(comp, pns->nodes[i], MP_FALSE, label2, MP_TRUE); + cpython_c_if_cond(comp, pns->nodes[i], false, label2, true); } - cpython_c_if_cond(comp, pns->nodes[n - 1], MP_TRUE, label, MP_TRUE); + cpython_c_if_cond(comp, pns->nodes[n - 1], true, label, true); EMIT(label_assign, label2); } return; } else if (!is_nested && MP_PARSE_NODE_STRUCT_KIND(pns) == PN_not_test_2) { - cpython_c_if_cond(comp, pns->nodes[0], !jump_if, label, MP_TRUE); + cpython_c_if_cond(comp, pns->nodes[0], !jump_if, label, true); return; } } // nothing special, fall back to default compiling for node and jump compile_node(comp, pn); - if (jump_if == MP_FALSE) { + if (jump_if == false) { EMIT(pop_jump_if_false, label); } else { EMIT(pop_jump_if_true, label); @@ -481,17 +481,17 @@ static void cpython_c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump } #endif -static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump_if, int label) { +static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, bool jump_if, int label) { #if MICROPY_EMIT_CPYTHON - cpython_c_if_cond(comp, pn, jump_if, label, MP_FALSE); + cpython_c_if_cond(comp, pn, jump_if, label, false); #else if (node_is_const_false(pn)) { - if (jump_if == MP_FALSE) { + if (jump_if == false) { EMIT(jump, label); } return; } else if (node_is_const_true(pn)) { - if (jump_if == MP_TRUE) { + if (jump_if == true) { EMIT(jump, label); } return; @@ -499,30 +499,30 @@ static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump_if, int mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; int n = MP_PARSE_NODE_STRUCT_NUM_NODES(pns); if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_or_test) { - if (jump_if == MP_FALSE) { + if (jump_if == false) { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - c_if_cond(comp, pns->nodes[i], MP_TRUE, label2); + c_if_cond(comp, pns->nodes[i], true, label2); } - c_if_cond(comp, pns->nodes[n - 1], MP_FALSE, label); + c_if_cond(comp, pns->nodes[n - 1], false, label); EMIT(label_assign, label2); } else { for (int i = 0; i < n; i++) { - c_if_cond(comp, pns->nodes[i], MP_TRUE, label); + c_if_cond(comp, pns->nodes[i], true, label); } } return; } else if (MP_PARSE_NODE_STRUCT_KIND(pns) == PN_and_test) { - if (jump_if == MP_FALSE) { + if (jump_if == false) { for (int i = 0; i < n; i++) { - c_if_cond(comp, pns->nodes[i], MP_FALSE, label); + c_if_cond(comp, pns->nodes[i], false, label); } } else { int label2 = comp_next_label(comp); for (int i = 0; i < n - 1; i++) { - c_if_cond(comp, pns->nodes[i], MP_FALSE, label2); + c_if_cond(comp, pns->nodes[i], false, label2); } - c_if_cond(comp, pns->nodes[n - 1], MP_TRUE, label); + c_if_cond(comp, pns->nodes[n - 1], true, label); EMIT(label_assign, label2); } return; @@ -534,7 +534,7 @@ static void c_if_cond(compiler_t *comp, mp_parse_node_t pn, MP_BOOL jump_if, int // nothing special, fall back to default compiling for node and jump compile_node(comp, pn); - if (jump_if == MP_FALSE) { + if (jump_if == false) { EMIT(pop_jump_if_false, label); } else { EMIT(pop_jump_if_true, label); @@ -803,7 +803,7 @@ void compile_funcdef_param(compiler_t *comp, mp_parse_node_t pn) { mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; if (MP_PARSE_NODE_IS_NULL(pns->nodes[0])) { // bare star - comp->have_bare_star = MP_TRUE; + comp->have_bare_star = true; } } } @@ -819,18 +819,18 @@ qstr compile_funcdef_helper(compiler_t *comp, mp_parse_node_struct_t *pns, uint } // save variables (probably don't need to do this, since we can't have nested definitions..?) - MP_BOOL old_have_bare_star = comp->have_bare_star; + bool old_have_bare_star = comp->have_bare_star; int old_param_pass = comp->param_pass; int old_param_pass_num_dict_params = comp->param_pass_num_dict_params; int old_param_pass_num_default_params = comp->param_pass_num_default_params; // compile default parameters - comp->have_bare_star = MP_FALSE; + comp->have_bare_star = false; comp->param_pass = 1; // pass 1 does any default parameters after bare star comp->param_pass_num_dict_params = 0; comp->param_pass_num_default_params = 0; apply_to_single_or_list(comp, pns->nodes[1], PN_typedargslist, compile_funcdef_param); - comp->have_bare_star = MP_FALSE; + comp->have_bare_star = false; comp->param_pass = 2; // pass 2 does any default parameters before bare star comp->param_pass_num_dict_params = 0; comp->param_pass_num_default_params = 0; @@ -876,12 +876,12 @@ qstr compile_classdef_helper(compiler_t *comp, mp_parse_node_struct_t *pns, uint // nodes[1] has parent classes, if any if (MP_PARSE_NODE_IS_NULL(pns->nodes[1])) { // no parent classes - EMIT(call_function, 2, 0, MP_FALSE, MP_FALSE); + EMIT(call_function, 2, 0, false, false); } else { // have a parent class or classes // TODO what if we have, eg, *a or **a in the parent list? compile_node(comp, pns->nodes[1]); - EMIT(call_function, 2 + list_len(pns->nodes[1], PN_arglist), 0, MP_FALSE, MP_FALSE); + EMIT(call_function, 2 + list_len(pns->nodes[1], PN_arglist), 0, false, false); } // return its name (the 'C' in class C(...):") @@ -889,14 +889,14 @@ qstr compile_classdef_helper(compiler_t *comp, mp_parse_node_struct_t *pns, uint } // returns true if it was a built-in decorator (even if the built-in had an error) -static MP_BOOL compile_built_in_decorator(compiler_t *comp, int name_len, mp_parse_node_t *name_nodes, uint *emit_options) { +static bool compile_built_in_decorator(compiler_t *comp, int name_len, mp_parse_node_t *name_nodes, uint *emit_options) { if (MP_PARSE_NODE_LEAF_ARG(name_nodes[0]) != MP_QSTR_micropython) { - return MP_FALSE; + return false; } if (name_len != 2) { printf("SyntaxError: invalid micropython decorator\n"); - return MP_TRUE; + return true; } qstr attr = MP_PARSE_NODE_LEAF_ARG(name_nodes[1]); @@ -916,7 +916,7 @@ static MP_BOOL compile_built_in_decorator(compiler_t *comp, int name_len, mp_par printf("SyntaxError: invalid micropython decorator '%s'\n", qstr_str(attr)); } - return MP_TRUE; + return true; } void compile_decorated(compiler_t *comp, mp_parse_node_struct_t *pns) { @@ -974,7 +974,7 @@ void compile_decorated(compiler_t *comp, mp_parse_node_struct_t *pns) { // call each decorator for (int i = 0; i < n - num_built_in_decorators; i++) { - EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); + EMIT(call_function, 1, 0, false, false); } // store func/class object into name @@ -1094,7 +1094,7 @@ void compile_continue_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { void compile_return_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { if (comp->scope_cur->kind != SCOPE_FUNCTION) { printf("SyntaxError: 'return' outside function\n"); - comp->had_error = MP_TRUE; + comp->had_error = true; return; } if (MP_PARSE_NODE_IS_NULL(pns->nodes[0])) { @@ -1106,7 +1106,7 @@ void compile_return_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { mp_parse_node_struct_t *pns_test_if_else = (mp_parse_node_struct_t*)pns_test_if_expr->nodes[1]; int l_fail = comp_next_label(comp); - c_if_cond(comp, pns_test_if_else->nodes[0], MP_FALSE, l_fail); // condition + c_if_cond(comp, pns_test_if_else->nodes[0], false, l_fail); // condition compile_node(comp, pns_test_if_expr->nodes[0]); // success value EMIT(return_value); EMIT(label_assign, l_fail); @@ -1143,13 +1143,13 @@ void compile_raise_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { // eg a -> q1=q2=a // a.b.c -> q1=a, q2=a.b.c void do_import_name(compiler_t *comp, mp_parse_node_t pn, qstr *q1, qstr *q2) { - MP_BOOL is_as = MP_FALSE; + bool is_as = false; if (MP_PARSE_NODE_IS_STRUCT_KIND(pn, PN_dotted_as_name)) { mp_parse_node_struct_t *pns = (mp_parse_node_struct_t*)pn; // a name of the form x as y; unwrap it *q1 = MP_PARSE_NODE_LEAF_ARG(pns->nodes[1]); pn = pns->nodes[0]; - is_as = MP_TRUE; + is_as = true; } if (MP_PARSE_NODE_IS_ID(pn)) { // just a simple name @@ -1220,7 +1220,7 @@ void compile_import_from(compiler_t *comp, mp_parse_node_struct_t *pns) { #if MICROPY_EMIT_CPYTHON EMIT(load_const_verbatim_str, "('*',)"); #else - EMIT(load_const_str, qstr_from_str_static("*"), MP_FALSE); + EMIT(load_const_str, qstr_from_str_static("*"), false); EMIT(build_tuple, 1); #endif @@ -1262,7 +1262,7 @@ void compile_import_from(compiler_t *comp, mp_parse_node_struct_t *pns) { assert(MP_PARSE_NODE_IS_STRUCT_KIND(pn_nodes[i], PN_import_as_name)); mp_parse_node_struct_t *pns3 = (mp_parse_node_struct_t*)pn_nodes[i]; qstr id2 = MP_PARSE_NODE_LEAF_ARG(pns3->nodes[0]); // should be id - EMIT(load_const_str, id2, MP_FALSE); + EMIT(load_const_str, id2, false); } EMIT(build_tuple, n); #endif @@ -1315,12 +1315,12 @@ void compile_nonlocal_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { void compile_assert_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { int l_end = comp_next_label(comp); - c_if_cond(comp, pns->nodes[0], MP_TRUE, l_end); + c_if_cond(comp, pns->nodes[0], true, l_end); EMIT(load_id, MP_QSTR_AssertionError); if (!MP_PARSE_NODE_IS_NULL(pns->nodes[1])) { // assertion message compile_node(comp, pns->nodes[1]); - EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); + EMIT(call_function, 1, 0, false, false); } EMIT(raise_varargs, 1); EMIT(label_assign, l_end); @@ -1332,7 +1332,7 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { int l_end = comp_next_label(comp); int l_fail = comp_next_label(comp); - c_if_cond(comp, pns->nodes[0], MP_FALSE, l_fail); // if condition + c_if_cond(comp, pns->nodes[0], false, l_fail); // if condition compile_node(comp, pns->nodes[1]); // if block //if (!(MP_PARSE_NODE_IS_NULL(pns->nodes[2]) && MP_PARSE_NODE_IS_NULL(pns->nodes[3]))) { // optimisation; doesn't align with CPython @@ -1355,7 +1355,7 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { for (int i = 0; i < n; i++) { mp_parse_node_struct_t *pns_elif2 = (mp_parse_node_struct_t*)pns_elif->nodes[i]; l_fail = comp_next_label(comp); - c_if_cond(comp, pns_elif2->nodes[0], MP_FALSE, l_fail); // elif condition + c_if_cond(comp, pns_elif2->nodes[0], false, l_fail); // elif condition compile_node(comp, pns_elif2->nodes[1]); // elif block if (!EMIT(last_emit_was_return_value)) { // simple optimisation to align with CPython @@ -1368,7 +1368,7 @@ void compile_if_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { // a single elif block l_fail = comp_next_label(comp); - c_if_cond(comp, pns_elif->nodes[0], MP_FALSE, l_fail); // elif condition + c_if_cond(comp, pns_elif->nodes[0], false, l_fail); // elif condition compile_node(comp, pns_elif->nodes[1]); // elif block if (!EMIT(last_emit_was_return_value)) { // simple optimisation to align with CPython @@ -1399,7 +1399,7 @@ void compile_while_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { int done_label = comp_next_label(comp); EMIT(setup_loop, break_label); EMIT(label_assign, continue_label); - c_if_cond(comp, pns->nodes[0], MP_FALSE, done_label); // condition + c_if_cond(comp, pns->nodes[0], false, done_label); // condition compile_node(comp, pns->nodes[1]); // body if (!EMIT(last_emit_was_return_value)) { EMIT(jump, continue_label); @@ -1416,7 +1416,7 @@ void compile_while_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { EMIT(label_assign, top_label); compile_node(comp, pns->nodes[1]); // body EMIT(label_assign, continue_label); - c_if_cond(comp, pns->nodes[0], MP_TRUE, top_label); // condition + c_if_cond(comp, pns->nodes[0], true, top_label); // condition #endif // break/continue apply to outer loop (if any) in the else block @@ -1732,7 +1732,7 @@ void compile_expr_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) { // for REPL, evaluate then print the expression EMIT(load_id, MP_QSTR___repl_print__); compile_node(comp, pns->nodes[0]); - EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); + EMIT(call_function, 1, 0, false, false); EMIT(pop_top); } else { @@ -1837,7 +1837,7 @@ void compile_test_if_expr(compiler_t *comp, mp_parse_node_struct_t *pns) { int stack_size = EMIT(get_stack_size); int l_fail = comp_next_label(comp); int l_end = comp_next_label(comp); - c_if_cond(comp, pns_test_if_else->nodes[0], MP_FALSE, l_fail); // condition + c_if_cond(comp, pns_test_if_else->nodes[0], false, l_fail); // condition compile_node(comp, pns->nodes[0]); // success value EMIT(jump, l_end); EMIT(label_assign, l_fail); @@ -1898,7 +1898,7 @@ void compile_comparison(compiler_t *comp, mp_parse_node_struct_t *pns) { int stack_size = EMIT(get_stack_size); int num_nodes = MP_PARSE_NODE_STRUCT_NUM_NODES(pns); compile_node(comp, pns->nodes[0]); - MP_BOOL multi = (num_nodes > 3); + bool multi = (num_nodes > 3); int l_fail = 0; if (multi) { l_fail = comp_next_label(comp); @@ -2042,15 +2042,15 @@ void compile_factor_2(compiler_t *comp, mp_parse_node_struct_t *pns) { } } -void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_struct_t *pns, MP_BOOL is_method_call) { +void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_struct_t *pns, bool is_method_call) { // function to call is on top of stack int old_n_arg_keyword = comp->n_arg_keyword; - MP_BOOL old_have_star_arg = comp->have_star_arg; - MP_BOOL old_have_dbl_star_arg = comp->have_dbl_star_arg; + bool old_have_star_arg = comp->have_star_arg; + bool old_have_dbl_star_arg = comp->have_dbl_star_arg; comp->n_arg_keyword = 0; - comp->have_star_arg = MP_FALSE; - comp->have_dbl_star_arg = MP_FALSE; + comp->have_star_arg = false; + comp->have_dbl_star_arg = false; compile_node(comp, pns->nodes[0]); // arguments to function call; can be null @@ -2082,7 +2082,7 @@ void compile_power_trailers(compiler_t *comp, mp_parse_node_struct_t *pns) { mp_parse_node_struct_t *pns_period = (mp_parse_node_struct_t*)pns->nodes[i]; mp_parse_node_struct_t *pns_paren = (mp_parse_node_struct_t*)pns->nodes[i + 1]; EMIT(load_method, MP_PARSE_NODE_LEAF_ARG(pns_period->nodes[0])); // get the method - compile_trailer_paren_helper(comp, pns_paren, MP_TRUE); + compile_trailer_paren_helper(comp, pns_paren, true); i += 1; } else { compile_node(comp, pns->nodes[i]); @@ -2153,7 +2153,7 @@ void compile_comprehension(compiler_t *comp, mp_parse_node_struct_t *pns, scope_ compile_node(comp, pns_comp_for->nodes[1]); // source of the iterator EMIT(get_iter); - EMIT(call_function, 1, 0, MP_FALSE, MP_FALSE); + EMIT(call_function, 1, 0, false, false); } void compile_atom_paren(compiler_t *comp, mp_parse_node_struct_t *pns) { @@ -2252,23 +2252,23 @@ void compile_atom_brace(compiler_t *comp, mp_parse_node_struct_t *pns) { int n = list_get(&pns1->nodes[0], PN_dictorsetmaker_list2, &nodes); // first element sets whether it's a dict or set - MP_BOOL is_dict; + bool is_dict; if (MP_PARSE_NODE_IS_STRUCT_KIND(pns->nodes[0], PN_dictorsetmaker_item)) { // a dictionary EMIT(build_map, 1 + n); compile_node(comp, pns->nodes[0]); EMIT(store_map); - is_dict = MP_TRUE; + is_dict = true; } else { // a set compile_node(comp, pns->nodes[0]); // 1st value of set - is_dict = MP_FALSE; + is_dict = false; } // process rest of elements for (int i = 0; i < n; i++) { mp_parse_node_t pn = nodes[i]; - MP_BOOL is_key_value = MP_PARSE_NODE_IS_STRUCT_KIND(pn, PN_dictorsetmaker_item); + bool is_key_value = MP_PARSE_NODE_IS_STRUCT_KIND(pn, PN_dictorsetmaker_item); compile_node(comp, pn); if (is_dict) { if (!is_key_value) { @@ -2314,7 +2314,7 @@ void compile_atom_brace(compiler_t *comp, mp_parse_node_struct_t *pns) { } void compile_trailer_paren(compiler_t *comp, mp_parse_node_struct_t *pns) { - compile_trailer_paren_helper(comp, pns, MP_FALSE); + compile_trailer_paren_helper(comp, pns, false); } void compile_trailer_bracket(compiler_t *comp, mp_parse_node_struct_t *pns) { @@ -2401,7 +2401,7 @@ void compile_arglist_star(compiler_t *comp, mp_parse_node_struct_t *pns) { printf("SyntaxError?: can't have multiple *x\n"); return; } - comp->have_star_arg = MP_TRUE; + comp->have_star_arg = true; compile_node(comp, pns->nodes[0]); } @@ -2410,7 +2410,7 @@ void compile_arglist_dbl_star(compiler_t *comp, mp_parse_node_struct_t *pns) { printf("SyntaxError?: can't have multiple **x\n"); return; } - comp->have_dbl_star_arg = MP_TRUE; + comp->have_dbl_star_arg = true; compile_node(comp, pns->nodes[0]); } @@ -2475,8 +2475,8 @@ void compile_node(compiler_t *comp, mp_parse_node_t pn) { case MP_PARSE_NODE_SMALL_INT: EMIT(load_const_small_int, arg); break; case MP_PARSE_NODE_INTEGER: EMIT(load_const_int, arg); break; case MP_PARSE_NODE_DECIMAL: EMIT(load_const_dec, arg); break; - case MP_PARSE_NODE_STRING: EMIT(load_const_str, arg, MP_FALSE); break; - case MP_PARSE_NODE_BYTES: EMIT(load_const_str, arg, MP_TRUE); break; + case MP_PARSE_NODE_STRING: EMIT(load_const_str, arg, false); break; + case MP_PARSE_NODE_BYTES: EMIT(load_const_str, arg, true); break; case MP_PARSE_NODE_TOKEN: if (arg == MP_TOKEN_NEWLINE) { // this can occur when file_input lets through a NEWLINE (eg if file starts with a newline) @@ -2501,7 +2501,7 @@ void compile_node(compiler_t *comp, mp_parse_node_t pn) { } } -void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_kind_t pn_name, pn_kind_t pn_star, pn_kind_t pn_dbl_star, MP_BOOL allow_annotations) { +void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_kind_t pn_name, pn_kind_t pn_star, pn_kind_t pn_dbl_star, bool allow_annotations) { // TODO verify that *k and **k are last etc qstr param_name = 0; mp_parse_node_t pn_annotation = MP_PARSE_NODE_NULL; @@ -2544,7 +2544,7 @@ void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_ki if (MP_PARSE_NODE_IS_NULL(pns->nodes[0])) { // bare star // TODO see http://www.python.org/dev/peps/pep-3102/ - comp->have_bare_star = MP_TRUE; + comp->have_bare_star = true; //assert(comp->scope_cur->num_dict_params == 0); } else if (MP_PARSE_NODE_IS_ID(pns->nodes[0])) { // named star @@ -2577,23 +2577,23 @@ void compile_scope_func_lambda_param(compiler_t *comp, mp_parse_node_t pn, pn_ki if (!MP_PARSE_NODE_IS_NULL(pn_annotation)) { // TODO this parameter has an annotation } - MP_BOOL added; + bool added; id_info_t *id_info = scope_find_or_add_id(comp->scope_cur, param_name, &added); if (!added) { printf("SyntaxError?: same name used for parameter; %s\n", qstr_str(param_name)); return; } - id_info->param = MP_TRUE; + id_info->param = true; id_info->kind = ID_INFO_KIND_LOCAL; } } void compile_scope_func_param(compiler_t *comp, mp_parse_node_t pn) { - compile_scope_func_lambda_param(comp, pn, PN_typedargslist_name, PN_typedargslist_star, PN_typedargslist_dbl_star, MP_TRUE); + compile_scope_func_lambda_param(comp, pn, PN_typedargslist_name, PN_typedargslist_star, PN_typedargslist_dbl_star, true); } void compile_scope_lambda_param(compiler_t *comp, mp_parse_node_t pn) { - compile_scope_func_lambda_param(comp, pn, PN_varargslist_name, PN_varargslist_star, PN_varargslist_dbl_star, MP_FALSE); + compile_scope_func_lambda_param(comp, pn, PN_varargslist_name, PN_varargslist_star, PN_varargslist_dbl_star, false); } void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_t pn_iter, mp_parse_node_t pn_inner_expr, int l_top, int for_depth) { @@ -2614,7 +2614,7 @@ void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_t pn_iter, mp_parse } else if (MP_PARSE_NODE_IS_STRUCT_KIND(pn_iter, PN_comp_if)) { // if condition mp_parse_node_struct_t *pns_comp_if = (mp_parse_node_struct_t*)pn_iter; - c_if_cond(comp, pns_comp_if->nodes[0], MP_FALSE, l_top); + c_if_cond(comp, pns_comp_if->nodes[0], false, l_top); pn_iter = pns_comp_if->nodes[1]; goto tail_recursion; } else if (MP_PARSE_NODE_IS_STRUCT_KIND(pn_iter, PN_comp_for)) { @@ -2708,7 +2708,7 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { // work out number of parameters, keywords and default parameters, and add them to the id_info array // must be done before compiling the body so that arguments are numbered first (for LOAD_FAST etc) if (comp->pass == PASS_1) { - comp->have_bare_star = MP_FALSE; + comp->have_bare_star = false; apply_to_single_or_list(comp, pns->nodes[1], PN_typedargslist, compile_scope_func_param); } @@ -2728,7 +2728,7 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { // work out number of parameters, keywords and default parameters, and add them to the id_info array // must be done before compiling the body so that arguments are numbered first (for LOAD_FAST etc) if (comp->pass == PASS_1) { - comp->have_bare_star = MP_FALSE; + comp->have_bare_star = false; apply_to_single_or_list(comp, pns->nodes[0], PN_varargslist, compile_scope_lambda_param); } @@ -2745,7 +2745,7 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { qstr qstr_arg = qstr_from_str_static(".0"); if (comp->pass == PASS_1) { - MP_BOOL added; + bool added; id_info_t *id_info = scope_find_or_add_id(comp->scope_cur, qstr_arg, &added); assert(added); id_info->kind = ID_INFO_KIND_LOCAL; @@ -2782,14 +2782,14 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) { assert(MP_PARSE_NODE_STRUCT_KIND(pns) == PN_classdef); if (comp->pass == PASS_1) { - MP_BOOL added; + bool added; id_info_t *id_info = scope_find_or_add_id(scope, MP_QSTR___class__, &added); assert(added); id_info->kind = ID_INFO_KIND_LOCAL; id_info = scope_find_or_add_id(scope, MP_QSTR___locals__, &added); assert(added); id_info->kind = ID_INFO_KIND_LOCAL; - id_info->param = MP_TRUE; + id_info->param = true; scope->num_params = 1; // __locals__ is the parameter } @@ -3005,11 +3005,11 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) { } } -mp_obj_t mp_compile(mp_parse_node_t pn, MP_BOOL is_repl) { +mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl) { compiler_t *comp = m_new(compiler_t, 1); comp->is_repl = is_repl; - comp->had_error = MP_FALSE; + comp->had_error = false; comp->break_label = 0; comp->continue_label = 0; @@ -3030,7 +3030,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, MP_BOOL is_repl) { comp->emit_inline_asm_method_table = NULL; uint max_num_labels = 0; for (scope_t *s = comp->scope_head; s != NULL && !comp->had_error; s = s->next) { - if (MP_FALSE) { + if (false) { #if MICROPY_EMIT_INLINE_THUMB } else if (s->emit_options == EMIT_OPT_ASM_THUMB) { compile_scope_inline_asm(comp, s, PASS_1); @@ -3064,7 +3064,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, MP_BOOL is_repl) { #endif #endif // !MICROPY_EMIT_CPYTHON for (scope_t *s = comp->scope_head; s != NULL && !comp->had_error; s = s->next) { - if (MP_FALSE) { + if (false) { // dummy #if MICROPY_EMIT_INLINE_THUMB @@ -3126,7 +3126,7 @@ mp_obj_t mp_compile(mp_parse_node_t pn, MP_BOOL is_repl) { } } - MP_BOOL had_error = comp->had_error; + bool had_error = comp->had_error; m_del_obj(compiler_t, comp); if (had_error) { diff --git a/py/compile.h b/py/compile.h index 27e47f2f1..770c2524d 100644 --- a/py/compile.h +++ b/py/compile.h @@ -1 +1 @@ -mp_obj_t mp_compile(mp_parse_node_t pn, MP_BOOL is_repl); +mp_obj_t mp_compile(mp_parse_node_t pn, bool is_repl); diff --git a/py/emit.h b/py/emit.h index 156643859..ea6573103 100644 --- a/py/emit.h +++ b/py/emit.h @@ -17,10 +17,10 @@ typedef enum { typedef struct _emit_t emit_t; typedef struct _emit_method_table_t { - void (*set_native_types)(emit_t *emit, MP_BOOL do_native_types); + void (*set_native_types)(emit_t *emit, bool do_native_types); void (*start_pass)(emit_t *emit, pass_kind_t pass, scope_t *scope); void (*end_pass)(emit_t *emit); - MP_BOOL (*last_emit_was_return_value)(emit_t *emit); + bool (*last_emit_was_return_value)(emit_t *emit); int (*get_stack_size)(emit_t *emit); void (*set_stack_size)(emit_t *emit, int size); @@ -37,7 +37,7 @@ typedef struct _emit_method_table_t { void (*load_const_int)(emit_t *emit, qstr qstr); void (*load_const_dec)(emit_t *emit, qstr qstr); void (*load_const_id)(emit_t *emit, qstr qstr); - void (*load_const_str)(emit_t *emit, qstr qstr, MP_BOOL bytes); + void (*load_const_str)(emit_t *emit, qstr qstr, bool bytes); void (*load_const_verbatim_str)(emit_t *emit, const char *str); // only needed for emitcpy void (*load_fast)(emit_t *emit, qstr qstr, int local_num); void (*load_deref)(emit_t *emit, qstr qstr, int local_num); @@ -99,8 +99,8 @@ typedef struct _emit_method_table_t { void (*unpack_ex)(emit_t *emit, int n_left, int n_right); void (*make_function)(emit_t *emit, scope_t *scope, int n_dict_params, int n_default_params); void (*make_closure)(emit_t *emit, scope_t *scope, int n_dict_params, int n_default_params); - void (*call_function)(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg); - void (*call_method)(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg); + void (*call_function)(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg); + void (*call_method)(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg); void (*return_value)(emit_t *emit); void (*raise_varargs)(emit_t *emit, int n_args); void (*yield_value)(emit_t *emit); diff --git a/py/emitbc.c b/py/emitbc.c index 93c92f41f..c0ec2469a 100644 --- a/py/emitbc.c +++ b/py/emitbc.c @@ -17,7 +17,7 @@ struct _emit_t { pass_kind_t pass; int stack_size; - MP_BOOL last_emit_was_return_value; + bool last_emit_was_return_value; scope_t *scope; @@ -135,13 +135,13 @@ static void emit_write_byte_1_signed_label(emit_t* emit, byte b1, int label) { c[2] = code_offset >> 8; } -static void emit_bc_set_native_types(emit_t *emit, MP_BOOL do_native_types) { +static void emit_bc_set_native_types(emit_t *emit, bool do_native_types) { } static void emit_bc_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) { emit->pass = pass; emit->stack_size = 0; - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; emit->scope = scope; if (pass == PASS_2) { memset(emit->label_offsets, -1, emit->max_num_labels * sizeof(uint)); @@ -182,7 +182,7 @@ static void emit_bc_end_pass(emit_t *emit) { } } -MP_BOOL emit_bc_last_emit_was_return_value(emit_t *emit) { +bool emit_bc_last_emit_was_return_value(emit_t *emit) { return emit->last_emit_was_return_value; } @@ -211,7 +211,7 @@ static void emit_pre(emit_t *emit, int stack_size_delta) { if (emit->stack_size > emit->scope->stack_size) { emit->scope->stack_size = emit->stack_size; } - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; } static void emit_bc_label_assign(emit_t *emit, int l) { @@ -274,7 +274,7 @@ static void emit_bc_load_const_id(emit_t *emit, qstr qstr) { emit_write_byte_1_qstr(emit, MP_BC_LOAD_CONST_ID, qstr); } -static void emit_bc_load_const_str(emit_t *emit, qstr qstr, MP_BOOL bytes) { +static void emit_bc_load_const_str(emit_t *emit, qstr qstr, bool bytes) { emit_pre(emit, 1); if (bytes) { emit_write_byte_1_qstr(emit, MP_BC_LOAD_CONST_BYTES, qstr); @@ -613,7 +613,7 @@ static void emit_bc_make_closure(emit_t *emit, scope_t *scope, int n_dict_params emit_write_byte_1_uint(emit, MP_BC_MAKE_CLOSURE, scope->unique_code_id); } -static void emit_bc_call_function(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { +static void emit_bc_call_function(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { int s = 0; if (have_star_arg) { s += 1; @@ -639,7 +639,7 @@ static void emit_bc_call_function(emit_t *emit, int n_positional, int n_keyword, emit_write_byte_1_uint(emit, op, (n_keyword << 8) | n_positional); // TODO make it 2 separate uints } -static void emit_bc_call_method(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { +static void emit_bc_call_method(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { int s = 0; if (have_star_arg) { s += 1; @@ -667,7 +667,7 @@ static void emit_bc_call_method(emit_t *emit, int n_positional, int n_keyword, M static void emit_bc_return_value(emit_t *emit) { emit_pre(emit, -1); - emit->last_emit_was_return_value = MP_TRUE; + emit->last_emit_was_return_value = true; emit_write_byte_1(emit, MP_BC_RETURN_VALUE); } diff --git a/py/emitcpy.c b/py/emitcpy.c index ff44609d5..7b2d50fb7 100644 --- a/py/emitcpy.c +++ b/py/emitcpy.c @@ -20,7 +20,7 @@ struct _emit_t { int pass; int byte_code_offset; int stack_size; - MP_BOOL last_emit_was_return_value; + bool last_emit_was_return_value; scope_t *scope; @@ -35,14 +35,14 @@ emit_t *emit_cpython_new(uint max_num_labels) { return emit; } -static void emit_cpy_set_native_types(emit_t *emit, MP_BOOL do_native_types) { +static void emit_cpy_set_native_types(emit_t *emit, bool do_native_types) { } static void emit_cpy_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scope) { emit->pass = pass; emit->byte_code_offset = 0; emit->stack_size = 0; - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; emit->scope = scope; if (pass == PASS_2) { memset(emit->label_offsets, -1, emit->max_num_labels * sizeof(int)); @@ -56,7 +56,7 @@ static void emit_cpy_end_pass(emit_t *emit) { } } -static MP_BOOL emit_cpy_last_emit_was_return_value(emit_t *emit) { +static bool emit_cpy_last_emit_was_return_value(emit_t *emit) { return emit->last_emit_was_return_value; } @@ -85,7 +85,7 @@ static void emit_pre(emit_t *emit, int stack_size_delta, int byte_code_size) { if (emit->stack_size > emit->scope->stack_size) { emit->scope->stack_size = emit->stack_size; } - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; if (emit->pass == PASS_3 && byte_code_size > 0) { if (emit->byte_code_offset >= 1000) { printf("%d ", emit->byte_code_offset); @@ -173,26 +173,26 @@ static void emit_cpy_load_const_id(emit_t *emit, qstr qstr) { } } -static void print_quoted_str(qstr qstr, MP_BOOL bytes) { +static void print_quoted_str(qstr qstr, bool bytes) { const char *str = qstr_str(qstr); int len = strlen(str); - MP_BOOL has_single_quote = MP_FALSE; - MP_BOOL has_double_quote = MP_FALSE; + bool has_single_quote = false; + bool has_double_quote = false; for (int i = 0; i < len; i++) { if (str[i] == '\'') { - has_single_quote = MP_TRUE; + has_single_quote = true; } else if (str[i] == '"') { - has_double_quote = MP_TRUE; + has_double_quote = true; } } if (bytes) { printf("b"); } - MP_BOOL quote_single = MP_FALSE; + bool quote_single = false; if (has_single_quote && !has_double_quote) { printf("\""); } else { - quote_single = MP_TRUE; + quote_single = true; printf("'"); } for (int i = 0; i < len; i++) { @@ -213,7 +213,7 @@ static void print_quoted_str(qstr qstr, MP_BOOL bytes) { } } -static void emit_cpy_load_const_str(emit_t *emit, qstr qstr, MP_BOOL bytes) { +static void emit_cpy_load_const_str(emit_t *emit, qstr qstr, bool bytes) { emit_pre(emit, 1, 3); if (emit->pass == PASS_3) { printf("LOAD_CONST "); @@ -681,7 +681,7 @@ static void emit_cpy_unpack_ex(emit_t *emit, int n_left, int n_right) { } } -static void emit_cpy_call_function(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { +static void emit_cpy_call_function(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { int s = 0; if (have_star_arg) { s += 1; @@ -708,13 +708,13 @@ static void emit_cpy_call_function(emit_t *emit, int n_positional, int n_keyword } } -static void emit_cpy_call_method(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { +static void emit_cpy_call_method(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { emit_cpy_call_function(emit, n_positional, n_keyword, have_star_arg, have_dbl_star_arg); } static void emit_cpy_return_value(emit_t *emit) { emit_pre(emit, -1, 1); - emit->last_emit_was_return_value = MP_TRUE; + emit->last_emit_was_return_value = true; if (emit->pass == PASS_3) { printf("RETURN_VALUE\n"); } diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c index 9dc9a7a79..073dfa060 100644 --- a/py/emitinlinethumb.c +++ b/py/emitinlinethumb.c @@ -75,12 +75,12 @@ static void emit_inline_thumb_label(emit_inline_asm_t *emit, int label_num, qstr asm_thumb_label_assign(emit->as, label_num); } -static MP_BOOL check_n_arg(qstr op, int n_args, int wanted_n_args) { +static bool check_n_arg(qstr op, int n_args, int wanted_n_args) { if (wanted_n_args == n_args) { - return MP_TRUE; + return true; } else { printf("SyntaxError: '%s' expects %d arguments'\n", qstr_str(op), wanted_n_args); - return MP_FALSE; + return false; } } diff --git a/py/emitnative.c b/py/emitnative.c index fd2ee5708..cc00c5731 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -52,7 +52,7 @@ #define REG_TEMP2 (REG_RSI) #define ASM_MOV_REG_TO_LOCAL(reg, local_num) asm_x64_mov_r64_to_local(emit->as, (reg), (local_num)) #define ASM_MOV_IMM_TO_REG(imm, reg) asm_x64_mov_i64_to_r64_optimised(emit->as, (imm), (reg)) -#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_x64_mov_i64_to_r64_optimised(emit->as, (imm), (reg_temp)); asm_x64_mov_r64_to_local(emit->as, (reg_temp), (local_num)); } while (MP_FALSE) +#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_x64_mov_i64_to_r64_optimised(emit->as, (imm), (reg_temp)); asm_x64_mov_r64_to_local(emit->as, (reg_temp), (local_num)); } while (false) #define ASM_MOV_LOCAL_TO_REG(local_num, reg) asm_x64_mov_local_to_r64(emit->as, (local_num), (reg)) #define ASM_MOV_REG_TO_REG(reg_src, reg_dest) asm_x64_mov_r64_to_r64(emit->as, (reg_src), (reg_dest)) #define ASM_MOV_LOCAL_ADDR_TO_REG(local_num, reg) asm_x64_mov_local_addr_to_r64(emit->as, (local_num), (reg)) @@ -75,7 +75,7 @@ #define REG_TEMP2 (REG_R2) #define ASM_MOV_REG_TO_LOCAL(reg, local_num) asm_thumb_mov_local_reg(emit->as, (local_num), (reg)) #define ASM_MOV_IMM_TO_REG(imm, reg) asm_thumb_mov_reg_i32_optimised(emit->as, (reg), (imm)) -#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_thumb_mov_reg_i32_optimised(emit->as, (reg_temp), (imm)); asm_thumb_mov_local_reg(emit->as, (local_num), (reg_temp)); } while (MP_FALSE) +#define ASM_MOV_IMM_TO_LOCAL_USING(imm, local_num, reg_temp) do { asm_thumb_mov_reg_i32_optimised(emit->as, (reg_temp), (imm)); asm_thumb_mov_local_reg(emit->as, (local_num), (reg_temp)); } while (false) #define ASM_MOV_LOCAL_TO_REG(local_num, reg) asm_thumb_mov_reg_local(emit->as, (reg), (local_num)) #define ASM_MOV_REG_TO_REG(reg_src, reg_dest) asm_thumb_mov_reg_reg(emit->as, (reg_dest), (reg_src)) #define ASM_MOV_LOCAL_ADDR_TO_REG(local_num, reg) asm_thumb_mov_reg_local_addr(emit->as, (reg), (local_num)) @@ -110,7 +110,7 @@ typedef struct _stack_info_t { struct _emit_t { int pass; - MP_BOOL do_viper_types; + bool do_viper_types; int local_vtype_alloc; vtype_kind_t *local_vtype; @@ -121,7 +121,7 @@ struct _emit_t { int stack_start; int stack_size; - MP_BOOL last_emit_was_return_value; + bool last_emit_was_return_value; scope_t *scope; @@ -134,7 +134,7 @@ struct _emit_t { emit_t *EXPORT_FUN(new)(uint max_num_labels) { emit_t *emit = m_new(emit_t, 1); - emit->do_viper_types = MP_FALSE; + emit->do_viper_types = false; emit->local_vtype = NULL; emit->stack_info = NULL; #if N_X64 @@ -145,7 +145,7 @@ emit_t *EXPORT_FUN(new)(uint max_num_labels) { return emit; } -static void emit_native_set_viper_types(emit_t *emit, MP_BOOL do_viper_types) { +static void emit_native_set_viper_types(emit_t *emit, bool do_viper_types) { emit->do_viper_types = do_viper_types; } @@ -153,7 +153,7 @@ static void emit_native_start_pass(emit_t *emit, pass_kind_t pass, scope_t *scop emit->pass = pass; emit->stack_start = 0; emit->stack_size = 0; - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; emit->scope = scope; if (emit->local_vtype == NULL) { @@ -269,7 +269,7 @@ static void emit_native_end_pass(emit_t *emit) { } } -static MP_BOOL emit_native_last_emit_was_return_value(emit_t *emit) { +static bool emit_native_last_emit_was_return_value(emit_t *emit) { return emit->last_emit_was_return_value; } @@ -292,13 +292,13 @@ static void adjust_stack(emit_t *emit, int stack_size_delta) { /* static void emit_pre_raw(emit_t *emit, int stack_size_delta) { adjust_stack(emit, stack_size_delta); - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; } */ // this must be called at start of emit functions static void emit_pre(emit_t *emit) { - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; // settle the stack /* if (regs_needed != 0) { @@ -391,7 +391,7 @@ static void emit_access_stack(emit_t *emit, int pos, vtype_kind_t *vtype, int re } static void emit_pre_pop_reg(emit_t *emit, vtype_kind_t *vtype, int reg_dest) { - emit->last_emit_was_return_value = MP_FALSE; + emit->last_emit_was_return_value = false; emit_access_stack(emit, 1, vtype, reg_dest); adjust_stack(emit, -1); } @@ -618,7 +618,7 @@ static void emit_native_load_const_id(emit_t *emit, qstr qstr) { } } -static void emit_native_load_const_str(emit_t *emit, qstr qstr, MP_BOOL bytes) { +static void emit_native_load_const_str(emit_t *emit, qstr qstr, bool bytes) { emit_pre(emit); if (emit->do_viper_types) { // not implemented properly @@ -1134,7 +1134,7 @@ static void emit_native_make_closure(emit_t *emit, scope_t *scope, int n_dict_pa assert(0); } -static void emit_native_call_function(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { +static void emit_native_call_function(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { // call special viper runtime routine with type info for args, and wanted type info for return assert(n_keyword == 0 && !have_star_arg && !have_dbl_star_arg); /* @@ -1170,7 +1170,7 @@ static void emit_native_call_function(emit_t *emit, int n_positional, int n_keyw emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); } -static void emit_native_call_method(emit_t *emit, int n_positional, int n_keyword, MP_BOOL have_star_arg, MP_BOOL have_dbl_star_arg) { +static void emit_native_call_method(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg) { assert(n_keyword == 0 && !have_star_arg && !have_dbl_star_arg); /* if (n_positional == 0) { @@ -1205,7 +1205,7 @@ static void emit_native_return_value(emit_t *emit) { } else { assert(vtype == VTYPE_PYOBJ); } - emit->last_emit_was_return_value = MP_TRUE; + emit->last_emit_was_return_value = true; #if N_X64 //asm_x64_call_ind(emit->as, 0, REG_RAX); to seg fault for debugging with gdb asm_x64_exit(emit->as); diff --git a/py/emitpass1.c b/py/emitpass1.c index 45197cb41..f78ec7e27 100644 --- a/py/emitpass1.c +++ b/py/emitpass1.c @@ -42,7 +42,7 @@ static void emit_pass1_end_pass(emit_t *emit) { static void emit_pass1_load_id(emit_t *emit, qstr qstr) { // name adding/lookup - MP_BOOL added; + bool added; id_info_t *id = scope_find_or_add_id(emit->scope, qstr, &added); if (added) { if (qstr == MP_QSTR_AssertionError) { @@ -73,7 +73,7 @@ static void emit_pass1_load_id(emit_t *emit, qstr qstr) { static id_info_t *get_id_for_modification(scope_t *scope, qstr qstr) { // name adding/lookup - MP_BOOL added; + bool added; id_info_t *id = scope_find_or_add_id(scope, qstr, &added); if (added) { if (scope->kind == SCOPE_MODULE || scope->kind == SCOPE_CLASS) { diff --git a/py/lexer.c b/py/lexer.c index 7e18792b5..d4205236c 100644 --- a/py/lexer.c +++ b/py/lexer.c @@ -35,7 +35,7 @@ struct _mp_lexer_t { mp_token_t tok_cur; }; -MP_BOOL str_strn_equal(const char *str, const char *strn, int len) { +bool str_strn_equal(const char *str, const char *strn, int len) { uint i = 0; while (i < len && *str == *strn) { @@ -70,74 +70,74 @@ void mp_token_show_error_prefix(const mp_token_t *tok) { printf("(%s:%d:%d) ", tok->src_name, tok->src_line, tok->src_column); } -MP_BOOL mp_token_show_error(const mp_token_t *tok, const char *msg) { +bool mp_token_show_error(const mp_token_t *tok, const char *msg) { printf("(%s:%d:%d) %s\n", tok->src_name, tok->src_line, tok->src_column, msg); - return MP_FALSE; + return false; } #define CUR_CHAR(lex) ((lex)->chr0) -static MP_BOOL is_end(mp_lexer_t *lex) { +static bool is_end(mp_lexer_t *lex) { return lex->chr0 == MP_LEXER_CHAR_EOF; } -static MP_BOOL is_physical_newline(mp_lexer_t *lex) { +static bool is_physical_newline(mp_lexer_t *lex) { return lex->chr0 == '\n' || lex->chr0 == '\r'; } -static MP_BOOL is_char(mp_lexer_t *lex, char c) { +static bool is_char(mp_lexer_t *lex, char c) { return lex->chr0 == c; } -static MP_BOOL is_char_or(mp_lexer_t *lex, char c1, char c2) { +static bool is_char_or(mp_lexer_t *lex, char c1, char c2) { return lex->chr0 == c1 || lex->chr0 == c2; } -static MP_BOOL is_char_or3(mp_lexer_t *lex, char c1, char c2, char c3) { +static bool is_char_or3(mp_lexer_t *lex, char c1, char c2, char c3) { return lex->chr0 == c1 || lex->chr0 == c2 || lex->chr0 == c3; } /* -static MP_BOOL is_char_following(mp_lexer_t *lex, char c) { +static bool is_char_following(mp_lexer_t *lex, char c) { return lex->chr1 == c; } */ -static MP_BOOL is_char_following_or(mp_lexer_t *lex, char c1, char c2) { +static bool is_char_following_or(mp_lexer_t *lex, char c1, char c2) { return lex->chr1 == c1 || lex->chr1 == c2; } -static MP_BOOL is_char_following_following_or(mp_lexer_t *lex, char c1, char c2) { +static bool is_char_following_following_or(mp_lexer_t *lex, char c1, char c2) { return lex->chr2 == c1 || lex->chr2 == c2; } -static MP_BOOL is_char_and(mp_lexer_t *lex, char c1, char c2) { +static bool is_char_and(mp_lexer_t *lex, char c1, char c2) { return lex->chr0 == c1 && lex->chr1 == c2; } -static MP_BOOL is_whitespace(mp_lexer_t *lex) { +static bool is_whitespace(mp_lexer_t *lex) { return unichar_isspace(lex->chr0); } -static MP_BOOL is_letter(mp_lexer_t *lex) { +static bool is_letter(mp_lexer_t *lex) { return unichar_isalpha(lex->chr0); } -static MP_BOOL is_digit(mp_lexer_t *lex) { +static bool is_digit(mp_lexer_t *lex) { return unichar_isdigit(lex->chr0); } -static MP_BOOL is_following_digit(mp_lexer_t *lex) { +static bool is_following_digit(mp_lexer_t *lex) { return unichar_isdigit(lex->chr1); } // TODO UNICODE include unicode characters in definition of identifiers -static MP_BOOL is_head_of_identifier(mp_lexer_t *lex) { +static bool is_head_of_identifier(mp_lexer_t *lex) { return is_letter(lex) || lex->chr0 == '_'; } // TODO UNICODE include unicode characters in definition of identifiers -static MP_BOOL is_tail_of_identifier(mp_lexer_t *lex) { +static bool is_tail_of_identifier(mp_lexer_t *lex) { return is_head_of_identifier(lex) || is_digit(lex); } @@ -280,12 +280,12 @@ static const char *tok_kw[] = { NULL, }; -static void mp_lexer_next_token_into(mp_lexer_t *lex, mp_token_t *tok, MP_BOOL first_token) { +static void mp_lexer_next_token_into(mp_lexer_t *lex, mp_token_t *tok, bool first_token) { // skip white space and comments - MP_BOOL had_physical_newline = MP_FALSE; + bool had_physical_newline = false; while (!is_end(lex)) { if (is_physical_newline(lex)) { - had_physical_newline = MP_TRUE; + had_physical_newline = true; next_char(lex); } else if (is_whitespace(lex)) { next_char(lex); @@ -369,22 +369,22 @@ static void mp_lexer_next_token_into(mp_lexer_t *lex, mp_token_t *tok, MP_BOOL f // a string or bytes literal // parse type codes - MP_BOOL is_raw = MP_FALSE; - MP_BOOL is_bytes = MP_FALSE; + bool is_raw = false; + bool is_bytes = false; if (is_char(lex, 'u')) { next_char(lex); } else if (is_char(lex, 'b')) { - is_bytes = MP_TRUE; + is_bytes = true; next_char(lex); if (is_char(lex, 'r')) { - is_raw = MP_TRUE; + is_raw = true; next_char(lex); } } else if (is_char(lex, 'r')) { - is_raw = MP_TRUE; + is_raw = true; next_char(lex); if (is_char(lex, 'b')) { - is_bytes = MP_TRUE; + is_bytes = true; next_char(lex); } } @@ -628,7 +628,7 @@ mp_lexer_t *mp_lexer_new(const char *src_name, void *stream_data, mp_lexer_strea } // preload first token - mp_lexer_next_token_into(lex, &lex->tok_cur, MP_TRUE); + mp_lexer_next_token_into(lex, &lex->tok_cur, true); return lex; } @@ -644,44 +644,44 @@ void mp_lexer_free(mp_lexer_t *lex) { } void mp_lexer_to_next(mp_lexer_t *lex) { - mp_lexer_next_token_into(lex, &lex->tok_cur, MP_FALSE); + mp_lexer_next_token_into(lex, &lex->tok_cur, false); } const mp_token_t *mp_lexer_cur(const mp_lexer_t *lex) { return &lex->tok_cur; } -MP_BOOL mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind) { +bool mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind) { return lex->tok_cur.kind == kind; } /* -MP_BOOL mp_lexer_is_str(mp_lexer_t *lex, const char *str) { +bool mp_lexer_is_str(mp_lexer_t *lex, const char *str) { return mp_token_is_str(&lex->tok_cur, str); } -MP_BOOL mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind) { +bool mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind) { if (mp_lexer_is_kind(lex, kind)) { mp_lexer_to_next(lex); - return MP_TRUE; + return true; } - return MP_FALSE; + return false; } -MP_BOOL mp_lexer_opt_str(mp_lexer_t *lex, const char *str) { +bool mp_lexer_opt_str(mp_lexer_t *lex, const char *str) { if (mp_lexer_is_str(lex, str)) { mp_lexer_to_next(lex); - return MP_TRUE; + return true; } - return MP_FALSE; + return false; } */ -MP_BOOL mp_lexer_show_error(mp_lexer_t *lex, const char *msg) { +bool mp_lexer_show_error(mp_lexer_t *lex, const char *msg) { return mp_token_show_error(&lex->tok_cur, msg); } -MP_BOOL mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg) { +bool mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg) { printf(" File \"%s\", line %d column %d\n%s\n", lex->tok_cur.src_name, lex->tok_cur.src_line, lex->tok_cur.src_column, msg); - return MP_FALSE; + return false; } diff --git a/py/lexer.h b/py/lexer.h index 9cc3e70c6..3cb48ce9e 100644 --- a/py/lexer.h +++ b/py/lexer.h @@ -124,20 +124,20 @@ typedef struct _mp_lexer_t mp_lexer_t; void mp_token_show(const mp_token_t *tok); void mp_token_show_error_prefix(const mp_token_t *tok); -MP_BOOL mp_token_show_error(const mp_token_t *tok, const char *msg); +bool mp_token_show_error(const mp_token_t *tok, const char *msg); mp_lexer_t *mp_lexer_new(const char *src_name, void *stream_data, mp_lexer_stream_next_char_t stream_next_char, mp_lexer_stream_close_t stream_close); void mp_lexer_free(mp_lexer_t *lex); void mp_lexer_to_next(mp_lexer_t *lex); const mp_token_t *mp_lexer_cur(const mp_lexer_t *lex); -MP_BOOL mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind); +bool mp_lexer_is_kind(mp_lexer_t *lex, mp_token_kind_t kind); /* unused -MP_BOOL mp_lexer_is_str(mp_lexer_t *lex, const char *str); -MP_BOOL mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind); -MP_BOOL mp_lexer_opt_str(mp_lexer_t *lex, const char *str); +bool mp_lexer_is_str(mp_lexer_t *lex, const char *str); +bool mp_lexer_opt_kind(mp_lexer_t *lex, mp_token_kind_t kind); +bool mp_lexer_opt_str(mp_lexer_t *lex, const char *str); */ -MP_BOOL mp_lexer_show_error(mp_lexer_t *lex, const char *msg); -MP_BOOL mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg); +bool mp_lexer_show_error(mp_lexer_t *lex, const char *msg); +bool mp_lexer_show_error_pythonic(mp_lexer_t *lex, const char *msg); // used to import a module; must be implemented for a specific port mp_lexer_t *mp_import_open_file(qstr mod_name); diff --git a/py/lexerunix.c b/py/lexerunix.c index 935fed0d3..14c28c16d 100644 --- a/py/lexerunix.c +++ b/py/lexerunix.c @@ -7,7 +7,7 @@ #include "lexer.h" typedef struct _str_buf_t { - MP_BOOL free; // free src_beg when done + bool free; // free src_beg when done const char *src_beg; // beginning of source const char *src_cur; // current location in source const char *src_end; // end (exclusive) of source @@ -30,7 +30,7 @@ void str_buf_free(str_buf_t *sb) { } } -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str) { +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str) { str_buf_t *sb = m_new(str_buf_t, 1); sb->free = free_str; sb->src_beg = str; @@ -56,7 +56,7 @@ mp_lexer_t *mp_lexer_new_from_file(const char *filename) { return NULL; } - return mp_lexer_new_from_str_len(filename, data, size, MP_TRUE); + return mp_lexer_new_from_str_len(filename, data, size, true); } /******************************************************************************/ diff --git a/py/lexerunix.h b/py/lexerunix.h index 3054ecd8a..b422a4306 100644 --- a/py/lexerunix.h +++ b/py/lexerunix.h @@ -1,4 +1,4 @@ -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str); +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str); mp_lexer_t *mp_lexer_new_from_file(const char *filename); void mp_import_set_directory(const char *dir); diff --git a/py/map.c b/py/map.c index 558599f97..01209c9b7 100644 --- a/py/map.c +++ b/py/map.c @@ -38,8 +38,8 @@ mp_map_t *mp_map_new(mp_map_kind_t kind, int n) { return map; } -mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, MP_BOOL add_if_not_found) { - MP_BOOL is_map_mp_obj = (map->kind == MP_MAP_OBJ); +mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, bool add_if_not_found) { + bool is_map_mp_obj = (map->kind == MP_MAP_OBJ); machine_uint_t hash; if (is_map_mp_obj) { hash = mp_obj_hash(index); @@ -61,7 +61,7 @@ mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, MP_BOOL add_i map->table = m_new0(mp_map_elem_t, map->alloc); for (int i = 0; i < old_alloc; i++) { if (old_table[i].key != NULL) { - mp_map_lookup_helper(map, old_table[i].key, MP_TRUE)->value = old_table[i].value; + mp_map_lookup_helper(map, old_table[i].key, true)->value = old_table[i].value; } } m_del(mp_map_elem_t, old_table, old_alloc); @@ -90,7 +90,7 @@ mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, MP_BOOL add_i } } -mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, MP_BOOL add_if_not_found) { +mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, bool add_if_not_found) { mp_obj_t o = (mp_obj_t)(machine_uint_t)index; return mp_map_lookup_helper(map, o, add_if_not_found); } @@ -104,7 +104,7 @@ void mp_set_init(mp_set_t *set, int n) { set->table = m_new0(mp_obj_t, set->alloc); } -mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, MP_BOOL add_if_not_found) { +mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, bool add_if_not_found) { int hash = mp_obj_hash(index); int pos = hash % set->alloc; for (;;) { @@ -121,7 +121,7 @@ mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, MP_BOOL add_if_not_found) set->table = m_new(mp_obj_t, set->alloc); for (int i = 0; i < old_alloc; i++) { if (old_table[i] != NULL) { - mp_set_lookup(set, old_table[i], MP_TRUE); + mp_set_lookup(set, old_table[i], true); } } m_del(mp_obj_t, old_table, old_alloc); diff --git a/py/map.h b/py/map.h index 31ce39b71..f8ca886aa 100644 --- a/py/map.h +++ b/py/map.h @@ -26,8 +26,8 @@ typedef struct _mp_set_t { int get_doubling_prime_greater_or_equal_to(int x); void mp_map_init(mp_map_t *map, mp_map_kind_t kind, int n); mp_map_t *mp_map_new(mp_map_kind_t kind, int n); -mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, MP_BOOL add_if_not_found); -mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, MP_BOOL add_if_not_found); +mp_map_elem_t* mp_map_lookup_helper(mp_map_t *map, mp_obj_t index, bool add_if_not_found); +mp_map_elem_t* mp_qstr_map_lookup(mp_map_t *map, qstr index, bool add_if_not_found); void mp_set_init(mp_set_t *set, int n); -mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, MP_BOOL add_if_not_found); +mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, bool add_if_not_found); diff --git a/py/misc.h b/py/misc.h index 149ca8a51..1bf4d8f29 100644 --- a/py/misc.h +++ b/py/misc.h @@ -5,11 +5,7 @@ /** types *******************************************************/ -typedef int MP_BOOL; -enum { - MP_FALSE = 0, - MP_TRUE = 1 -}; +#include typedef unsigned char byte; typedef unsigned int uint; @@ -42,10 +38,10 @@ typedef int unichar; // TODO unichar utf8_get_char(const char *s); char *utf8_next_char(const char *s); -MP_BOOL unichar_isspace(unichar c); -MP_BOOL unichar_isalpha(unichar c); -MP_BOOL unichar_isprint(unichar c); -MP_BOOL unichar_isdigit(unichar c); +bool unichar_isspace(unichar c); +bool unichar_isalpha(unichar c); +bool unichar_isprint(unichar c); +bool unichar_isdigit(unichar c); /** string ******************************************************/ @@ -59,7 +55,7 @@ typedef struct _vstr_t { int alloc; int len; char *buf; - MP_BOOL had_error; + bool had_error; } vstr_t; void vstr_init(vstr_t *vstr); @@ -67,7 +63,7 @@ void vstr_clear(vstr_t *vstr); vstr_t *vstr_new(void); void vstr_free(vstr_t *vstr); void vstr_reset(vstr_t *vstr); -MP_BOOL vstr_had_error(vstr_t *vstr); +bool vstr_had_error(vstr_t *vstr); char *vstr_str(vstr_t *vstr); int vstr_len(vstr_t *vstr); void vstr_hint_size(vstr_t *vstr, int size); diff --git a/py/obj.c b/py/obj.c index e28076b2c..77580e1fe 100644 --- a/py/obj.c +++ b/py/obj.c @@ -46,9 +46,9 @@ void mp_obj_print(mp_obj_t o_in) { mp_obj_print_helper(printf_wrapper, NULL, o_in); } -MP_BOOL mp_obj_is_callable(mp_obj_t o_in) { +bool mp_obj_is_callable(mp_obj_t o_in) { if (MP_OBJ_IS_SMALL_INT(o_in)) { - return MP_FALSE; + return false; } else { mp_obj_base_t *o = o_in; return o->type->call_n != NULL; @@ -77,13 +77,13 @@ machine_int_t mp_obj_hash(mp_obj_t o_in) { // "The objects need not have the same type. If both are numbers, they are converted // to a common type. Otherwise, the == and != operators always consider objects of // different types to be unequal." -// note also that False==0 and True==1 are MP_TRUE expressions -MP_BOOL mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { +// note also that False==0 and True==1 are true expressions +bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { if (o1 == o2) { - return MP_TRUE; + return true; } else if (MP_OBJ_IS_SMALL_INT(o1) || MP_OBJ_IS_SMALL_INT(o2)) { if (MP_OBJ_IS_SMALL_INT(o1) && MP_OBJ_IS_SMALL_INT(o2)) { - return MP_FALSE; + return false; } else { if (MP_OBJ_IS_SMALL_INT(o2)) { mp_obj_t temp = o1; o1 = o2; o2 = temp; @@ -95,25 +95,25 @@ MP_BOOL mp_obj_equal(mp_obj_t o1, mp_obj_t o2) { } else if (o2 == mp_const_true) { return val == 1; } else { - return MP_FALSE; + return false; } } } else if (MP_OBJ_IS_TYPE(o1, &str_type) && MP_OBJ_IS_TYPE(o2, &str_type)) { return mp_obj_str_get(o1) == mp_obj_str_get(o2); } else { assert(0); - return MP_FALSE; + return false; } } -MP_BOOL mp_obj_less(mp_obj_t o1, mp_obj_t o2) { +bool mp_obj_less(mp_obj_t o1, mp_obj_t o2) { if (MP_OBJ_IS_SMALL_INT(o1) && MP_OBJ_IS_SMALL_INT(o2)) { mp_small_int_t i1 = MP_OBJ_SMALL_INT_VALUE(o1); mp_small_int_t i2 = MP_OBJ_SMALL_INT_VALUE(o2); return i1 < i2; } else { assert(0); - return MP_FALSE; + return false; } } diff --git a/py/obj.h b/py/obj.h index b8ddb4ea8..351310afa 100644 --- a/py/obj.h +++ b/py/obj.h @@ -126,7 +126,7 @@ struct _mp_map_t; // General API for objects mp_obj_t mp_obj_new_none(void); -mp_obj_t mp_obj_new_bool(MP_BOOL value); +mp_obj_t mp_obj_new_bool(bool value); mp_obj_t mp_obj_new_cell(mp_obj_t obj); mp_obj_t mp_obj_new_int(machine_int_t value); mp_obj_t mp_obj_new_str(qstr qstr); @@ -162,10 +162,10 @@ const char *mp_obj_get_type_str(mp_obj_t o_in); void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in); void mp_obj_print(mp_obj_t o); -MP_BOOL mp_obj_is_callable(mp_obj_t o_in); +bool mp_obj_is_callable(mp_obj_t o_in); machine_int_t mp_obj_hash(mp_obj_t o_in); -MP_BOOL mp_obj_equal(mp_obj_t o1, mp_obj_t o2); -MP_BOOL mp_obj_less(mp_obj_t o1, mp_obj_t o2); +bool mp_obj_equal(mp_obj_t o1, mp_obj_t o2); +bool mp_obj_less(mp_obj_t o1, mp_obj_t o2); machine_int_t mp_obj_get_int(mp_obj_t arg); #if MICROPY_ENABLE_FLOAT diff --git a/py/objbool.c b/py/objbool.c index b03c56924..54f2b5da1 100644 --- a/py/objbool.c +++ b/py/objbool.c @@ -10,7 +10,7 @@ typedef struct _mp_obj_bool_t { mp_obj_base_t base; - MP_BOOL value; + bool value; } mp_obj_bool_t; static void bool_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { @@ -44,8 +44,8 @@ const mp_obj_type_t bool_type = { .methods = NULL, }; -static const mp_obj_bool_t false_obj = {{&bool_type}, MP_FALSE}; -static const mp_obj_bool_t true_obj = {{&bool_type}, MP_TRUE}; +static const mp_obj_bool_t false_obj = {{&bool_type}, false}; +static const mp_obj_bool_t true_obj = {{&bool_type}, true}; const mp_obj_t mp_const_false = (mp_obj_t)&false_obj; const mp_obj_t mp_const_true = (mp_obj_t)&true_obj; diff --git a/py/objclass.c b/py/objclass.c index c2638bc87..086645cbb 100644 --- a/py/objclass.c +++ b/py/objclass.c @@ -26,7 +26,7 @@ mp_obj_t class_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) { mp_obj_t o = mp_obj_new_instance(self_in); // look for __init__ function - mp_map_elem_t *init_fn = mp_qstr_map_lookup(self->locals, MP_QSTR___init__, MP_FALSE); + mp_map_elem_t *init_fn = mp_qstr_map_lookup(self->locals, MP_QSTR___init__, false); if (init_fn != NULL) { // call __init__ function diff --git a/py/objdict.c b/py/objdict.c index bac010ce8..a00d172cf 100644 --- a/py/objdict.c +++ b/py/objdict.c @@ -19,14 +19,14 @@ typedef struct _mp_obj_dict_t { static void dict_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { mp_obj_dict_t *self = self_in; - MP_BOOL first = MP_TRUE; + bool first = true; print(env, "{"); for (int i = 0; i < self->map.alloc; i++) { if (self->map.table[i].key != NULL) { if (!first) { print(env, ", "); } - first = MP_FALSE; + first = false; mp_obj_print_helper(print, env, self->map.table[i].key); print(env, ": "); mp_obj_print_helper(print, env, self->map.table[i].value); @@ -47,7 +47,7 @@ static mp_obj_t dict_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { case RT_BINARY_OP_SUBSCR: { // dict load - mp_map_elem_t *elem = mp_map_lookup_helper(&o->map, rhs_in, MP_FALSE); + mp_map_elem_t *elem = mp_map_lookup_helper(&o->map, rhs_in, false); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg(MP_QSTR_KeyError, "")); } else { @@ -91,6 +91,6 @@ uint mp_obj_dict_len(mp_obj_t self_in) { mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value) { assert(MP_OBJ_IS_TYPE(self_in, &dict_type)); mp_obj_dict_t *self = self_in; - mp_map_lookup_helper(&self->map, key, MP_TRUE)->value = value; + mp_map_lookup_helper(&self->map, key, true)->value = value; return self_in; } diff --git a/py/objgenerator.c b/py/objgenerator.c index 7eee3a8fc..cc3d90de1 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -78,7 +78,7 @@ mp_obj_t gen_instance_getiter(mp_obj_t self_in) { mp_obj_t gen_instance_iternext(mp_obj_t self_in) { mp_obj_gen_instance_t *self = self_in; - MP_BOOL yield = mp_execute_byte_code_2(&self->ip, &self->state[0], &self->sp); + bool yield = mp_execute_byte_code_2(&self->ip, &self->state[0], &self->sp); if (yield) { return *self->sp; } else { diff --git a/py/objinstance.c b/py/objinstance.c index 00ae05816..a1d71093a 100644 --- a/py/objinstance.c +++ b/py/objinstance.c @@ -21,7 +21,7 @@ typedef struct _mp_obj_instance_t { type needs to be specified dynamically case O_OBJ: { - py_map_elem_t *qn = py_qstr_map_lookup(o->u_obj.class->u_class.locals, qstr_from_str_static("__qualname__"), MP_FALSE); assert(qn != NULL); + py_map_elem_t *qn = py_qstr_map_lookup(o->u_obj.class->u_class.locals, qstr_from_str_static("__qualname__"), false); assert(qn != NULL); assert(IS_O(qn->value, O_STR)); return qstr_str(((py_obj_base_t*)qn->value)->u_str); } @@ -30,12 +30,12 @@ type needs to be specified dynamically mp_obj_t mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr) { // logic: look in obj members then class locals (TODO check this against CPython) mp_obj_instance_t *self = self_in; - mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, false); if (elem != NULL) { // object member, always treated as a value return elem->value; } - elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, MP_FALSE); + elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, false); if (elem != NULL) { if (mp_obj_is_callable(elem->value)) { // class member is callable so build a bound method @@ -51,14 +51,14 @@ mp_obj_t mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr) { void mp_obj_instance_load_method(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { // logic: look in obj members then class locals (TODO check this against CPython) mp_obj_instance_t *self = self_in; - mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(self->members, attr, false); if (elem != NULL) { // object member, always treated as a value dest[1] = elem->value; dest[0] = NULL; return; } - elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, MP_FALSE); + elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, false); if (elem != NULL) { if (mp_obj_is_callable(elem->value)) { // class member is callable so build a bound method @@ -81,11 +81,11 @@ void mp_obj_instance_load_method(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { void mp_obj_instance_store_attr(mp_obj_t self_in, qstr attr, mp_obj_t value) { // logic: look in class locals (no add) then obj members (add) (TODO check this against CPython) mp_obj_instance_t *self = self_in; - mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(self->class), attr, false); if (elem != NULL) { elem->value = value; } else { - mp_qstr_map_lookup(self->members, attr, MP_TRUE)->value = value; + mp_qstr_map_lookup(self->members, attr, true)->value = value; } } diff --git a/py/objlist.c b/py/objlist.c index 3e5a15fce..52eb48837 100644 --- a/py/objlist.c +++ b/py/objlist.c @@ -57,6 +57,7 @@ static mp_obj_t list_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *args default: nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_TypeError, "list takes at most 1 argument, %d given", (void*)(machine_int_t)n_args)); } + return NULL; } static mp_obj_t list_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) { @@ -266,6 +267,7 @@ const mp_method_t list_type_methods[] = { { "copy", &list_copy_obj }, { "count", &list_count_obj }, { "index", &list_index_obj }, + { "insert", &list_insert_obj }, { "pop", &list_pop_obj }, { "remove", &list_remove_obj }, { "reverse", &list_reverse_obj }, diff --git a/py/objset.c b/py/objset.c index 6a02ba120..264e14237 100644 --- a/py/objset.c +++ b/py/objset.c @@ -17,14 +17,14 @@ typedef struct _mp_obj_set_t { void set_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { mp_obj_set_t *self = self_in; - MP_BOOL first = MP_TRUE; + bool first = true; print(env, "{"); for (int i = 0; i < self->set.alloc; i++) { if (self->set.table[i] != MP_OBJ_NULL) { if (!first) { print(env, ", "); } - first = MP_FALSE; + first = false; mp_obj_print_helper(print, env, self->set.table[i]); } } @@ -72,7 +72,7 @@ mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) { o->base.type = &set_type; mp_set_init(&o->set, n_args); for (int i = 0; i < n_args; i++) { - mp_set_lookup(&o->set, items[i], MP_TRUE); + mp_set_lookup(&o->set, items[i], true); } return o; } @@ -80,5 +80,5 @@ mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) { void mp_obj_set_store(mp_obj_t self_in, mp_obj_t item) { assert(MP_OBJ_IS_TYPE(self_in, &set_type)); mp_obj_set_t *self = self_in; - mp_set_lookup(&self->set, item, MP_TRUE); + mp_set_lookup(&self->set, item, true); } diff --git a/py/objtuple.c b/py/objtuple.c index a8ecc3a4f..a59e674b1 100644 --- a/py/objtuple.c +++ b/py/objtuple.c @@ -165,14 +165,8 @@ static mp_obj_t tuple_it_iternext(mp_obj_t self_in) { static const mp_obj_type_t tuple_it_type = { { &mp_const_type }, "tuple_iterator", - NULL, // print - NULL, // make_new - NULL, // call_n - NULL, // unary_op - NULL, // binary_op - NULL, // getiter - tuple_it_iternext, - NULL, // method list + .iternext = tuple_it_iternext, + .methods = NULL, }; static mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, int cur) { diff --git a/py/parse.c b/py/parse.c index 1d3badbc3..d3786ba95 100644 --- a/py/parse.c +++ b/py/parse.c @@ -189,8 +189,8 @@ static void push_result_token(parser_t *parser, const mp_lexer_t *lex) { if (tok->kind == MP_TOKEN_NAME) { pn = mp_parse_node_new_leaf(MP_PARSE_NODE_ID, qstr_from_strn_copy(tok->str, tok->len)); } else if (tok->kind == MP_TOKEN_NUMBER) { - MP_BOOL dec = MP_FALSE; - MP_BOOL small_int = MP_TRUE; + bool dec = false; + bool small_int = true; int int_val = 0; int len = tok->len; const char *str = tok->str; @@ -219,10 +219,10 @@ static void push_result_token(parser_t *parser, const mp_lexer_t *lex) { } else if (base == 16 && 'A' <= str[i] && str[i] <= 'F') { int_val = base * int_val + str[i] - 'A' + 10; } else if (str[i] == '.' || str[i] == 'e' || str[i] == 'E' || str[i] == 'j' || str[i] == 'J') { - dec = MP_TRUE; + dec = true; break; } else { - small_int = MP_FALSE; + small_int = false; break; } } @@ -269,11 +269,11 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { push_rule(parser, rules[top_level_rule], 0); uint n, i; - MP_BOOL backtrack = MP_FALSE; + bool backtrack = false; const rule_t *rule; mp_token_kind_t tok_kind; - MP_BOOL emit_rule; - MP_BOOL had_trailing_sep; + bool emit_rule; + bool had_trailing_sep; for (;;) { next_rule: @@ -298,7 +298,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { if (i > 0 && !backtrack) { goto next_rule; } else { - backtrack = MP_FALSE; + backtrack = false; } for (; i < n - 1; ++i) { switch (rule->arg[i] & RULE_ARG_KIND_MASK) { @@ -322,7 +322,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { push_result_token(parser, lex); mp_lexer_to_next(lex); } else { - backtrack = MP_TRUE; + backtrack = true; goto next_rule; } } else { @@ -338,7 +338,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { if ((rule->arg[i - 1] & RULE_ARG_KIND_MASK) == RULE_ARG_OPT_RULE) { // an optional rule that failed, so continue with next arg push_result_node(parser, MP_PARSE_NODE_NULL); - backtrack = MP_FALSE; + backtrack = false; } else { // a mandatory rule that failed, so propagate backtrack if (i > 1) { @@ -369,7 +369,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { goto syntax_error; } else { // this rule failed, so backtrack - backtrack = MP_TRUE; + backtrack = true; goto next_rule; } } @@ -395,12 +395,12 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // count number of arguments for the parse_node i = 0; - emit_rule = MP_FALSE; + emit_rule = false; for (int x = 0; x < n; ++x) { if ((rule->arg[x] & RULE_ARG_KIND_MASK) == RULE_ARG_TOK) { tok_kind = rule->arg[x] & RULE_ARG_ARG_MASK; if (tok_kind >= MP_TOKEN_NAME) { - emit_rule = MP_TRUE; + emit_rule = true; } if (tok_kind == MP_TOKEN_NAME) { // only tokens which were names are pushed to stack @@ -414,19 +414,19 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // always emit these rules, even if they have only 1 argument if (rule->rule_id == RULE_expr_stmt || rule->rule_id == RULE_yield_stmt) { - emit_rule = MP_TRUE; + emit_rule = true; } // never emit these rules if they have only 1 argument // NOTE: can't put atom_paren here because we need it to distinguisg, for example, [a,b] from [(a,b)] // TODO possibly put varargslist_name, varargslist_equal here as well if (rule->rule_id == RULE_else_stmt || rule->rule_id == RULE_testlist_comp_3b || rule->rule_id == RULE_import_as_names_paren || rule->rule_id == RULE_typedargslist_name || rule->rule_id == RULE_typedargslist_colon || rule->rule_id == RULE_typedargslist_equal || rule->rule_id == RULE_dictorsetmaker_colon || rule->rule_id == RULE_classdef_2 || rule->rule_id == RULE_with_item_as || rule->rule_id == RULE_assert_stmt_extra || rule->rule_id == RULE_as_name || rule->rule_id == RULE_raise_stmt_from || rule->rule_id == RULE_vfpdef) { - emit_rule = MP_FALSE; + emit_rule = false; } // always emit these rules, and add an extra blank node at the end (to be used by the compiler to store data) if (rule->rule_id == RULE_funcdef || rule->rule_id == RULE_classdef || rule->rule_id == RULE_comp_for || rule->rule_id == RULE_lambdef || rule->rule_id == RULE_lambdef_nocond) { - emit_rule = MP_TRUE; + emit_rule = true; push_result_node(parser, MP_PARSE_NODE_NULL); i += 1; } @@ -465,14 +465,14 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // n=3 is: item (sep item)* [sep] if (backtrack) { list_backtrack: - had_trailing_sep = MP_FALSE; + had_trailing_sep = false; if (n == 2) { if (i == 1) { // fail on item, first time round; propagate backtrack goto next_rule; } else { // fail on item, in later rounds; finish with this rule - backtrack = MP_FALSE; + backtrack = false; } } else { if (i == 1) { @@ -482,15 +482,15 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { // fail on item, in later rounds; have eaten tokens so can't backtrack if (n == 3) { // list allows trailing separator; finish parsing list - had_trailing_sep = MP_TRUE; - backtrack = MP_FALSE; + had_trailing_sep = true; + backtrack = false; } else { // list doesn't allowing trailing separator; fail goto syntax_error; } } else { // fail on separator; finish parsing list - backtrack = MP_FALSE; + backtrack = false; } } } else { @@ -510,7 +510,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { } else { // couldn't get element of list i += 1; - backtrack = MP_TRUE; + backtrack = true; goto list_backtrack; } break; diff --git a/py/repl.c b/py/repl.c index 2127a28df..4241ef0e4 100644 --- a/py/repl.c +++ b/py/repl.c @@ -1,17 +1,17 @@ #include "misc.h" #include "repl.h" -MP_BOOL str_startswith_word(const char *str, const char *head) { +bool str_startswith_word(const char *str, const char *head) { int i; for (i = 0; str[i] && head[i]; i++) { if (str[i] != head[i]) { - return MP_FALSE; + return false; } } return head[i] == '\0' && (str[i] == '\0' || !unichar_isalpha(str[i])); } -MP_BOOL mp_repl_is_compound_stmt(const char *line) { +bool mp_repl_is_compound_stmt(const char *line) { // compound if line starts with a certain keyword if ( str_startswith_word(line, "if") @@ -23,7 +23,7 @@ MP_BOOL mp_repl_is_compound_stmt(const char *line) { || str_startswith_word(line, "class") || str_startswith_word(line, "@") ) { - return MP_TRUE; + return true; } // also "compound" if unmatched open bracket diff --git a/py/repl.h b/py/repl.h index db082f07a..02fe523ed 100644 --- a/py/repl.h +++ b/py/repl.h @@ -1 +1 @@ -MP_BOOL mp_repl_is_compound_stmt(const char *line); +bool mp_repl_is_compound_stmt(const char *line); diff --git a/py/runtime.c b/py/runtime.c index 86e297d7b..7f9ce2027 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -45,7 +45,7 @@ typedef struct _mp_code_t { int n_args; int n_locals; int n_stack; - MP_BOOL is_generator; + bool is_generator; union { struct { byte *code; @@ -70,60 +70,60 @@ FILE *fp_write_code = NULL; void rt_init(void) { // locals = globals for outer module (see Objects/frameobject.c/PyFrame_New()) map_locals = map_globals = mp_map_new(MP_MAP_QSTR, 1); - mp_qstr_map_lookup(map_globals, MP_QSTR___name__, MP_TRUE)->value = mp_obj_new_str(MP_QSTR___main__); + mp_qstr_map_lookup(map_globals, MP_QSTR___name__, true)->value = mp_obj_new_str(MP_QSTR___main__); // init built-in hash table mp_map_init(&map_builtins, MP_MAP_QSTR, 3); // built-in exceptions (TODO, make these proper classes) - mp_qstr_map_lookup(&map_builtins, MP_QSTR_AttributeError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_AttributeError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_IndexError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_IndexError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_KeyError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_KeyError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_NameError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_NameError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_TypeError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_TypeError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_SyntaxError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_SyntaxError); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_ValueError, MP_TRUE)->value = mp_obj_new_exception(MP_QSTR_ValueError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_AttributeError, true)->value = mp_obj_new_exception(MP_QSTR_AttributeError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_IndexError, true)->value = mp_obj_new_exception(MP_QSTR_IndexError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_KeyError, true)->value = mp_obj_new_exception(MP_QSTR_KeyError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_NameError, true)->value = mp_obj_new_exception(MP_QSTR_NameError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_TypeError, true)->value = mp_obj_new_exception(MP_QSTR_TypeError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_SyntaxError, true)->value = mp_obj_new_exception(MP_QSTR_SyntaxError); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_ValueError, true)->value = mp_obj_new_exception(MP_QSTR_ValueError); // built-in objects - mp_qstr_map_lookup(&map_builtins, MP_QSTR_Ellipsis, MP_TRUE)->value = mp_const_ellipsis; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_Ellipsis, true)->value = mp_const_ellipsis; // built-in core functions - mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, MP_TRUE)->value = rt_make_function_2(mp_builtin___build_class__); - mp_qstr_map_lookup(&map_builtins, MP_QSTR___repl_print__, MP_TRUE)->value = rt_make_function_1(mp_builtin___repl_print__); + mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, true)->value = rt_make_function_2(mp_builtin___build_class__); + mp_qstr_map_lookup(&map_builtins, MP_QSTR___repl_print__, true)->value = rt_make_function_1(mp_builtin___repl_print__); // built-in types - mp_qstr_map_lookup(&map_builtins, MP_QSTR_bool, MP_TRUE)->value = (mp_obj_t)&bool_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_bool, true)->value = (mp_obj_t)&bool_type; #if MICROPY_ENABLE_FLOAT - mp_qstr_map_lookup(&map_builtins, MP_QSTR_complex, MP_TRUE)->value = (mp_obj_t)&complex_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_complex, true)->value = (mp_obj_t)&complex_type; #endif - mp_qstr_map_lookup(&map_builtins, MP_QSTR_dict, MP_TRUE)->value = (mp_obj_t)&dict_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_dict, true)->value = (mp_obj_t)&dict_type; #if MICROPY_ENABLE_FLOAT - mp_qstr_map_lookup(&map_builtins, MP_QSTR_float, MP_TRUE)->value = (mp_obj_t)&float_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_float, true)->value = (mp_obj_t)&float_type; #endif - mp_qstr_map_lookup(&map_builtins, MP_QSTR_int, MP_TRUE)->value = (mp_obj_t)&int_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_list, MP_TRUE)->value = (mp_obj_t)&list_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_set, MP_TRUE)->value = (mp_obj_t)&set_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_tuple, MP_TRUE)->value = (mp_obj_t)&tuple_type; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_type, MP_TRUE)->value = (mp_obj_t)&mp_builtin_type_obj; // TODO + mp_qstr_map_lookup(&map_builtins, MP_QSTR_int, true)->value = (mp_obj_t)&int_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_list, true)->value = (mp_obj_t)&list_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_set, true)->value = (mp_obj_t)&set_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_tuple, true)->value = (mp_obj_t)&tuple_type; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_type, true)->value = (mp_obj_t)&mp_builtin_type_obj; // TODO // built-in user functions; TODO covert all to &mp_builtin_xxx's - mp_qstr_map_lookup(&map_builtins, MP_QSTR_abs, MP_TRUE)->value = rt_make_function_1(mp_builtin_abs); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_all, MP_TRUE)->value = rt_make_function_1(mp_builtin_all); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_any, MP_TRUE)->value = rt_make_function_1(mp_builtin_any); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_callable, MP_TRUE)->value = rt_make_function_1(mp_builtin_callable); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_chr, MP_TRUE)->value = rt_make_function_1(mp_builtin_chr); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_divmod, MP_TRUE)->value = rt_make_function_2(mp_builtin_divmod); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_hash, MP_TRUE)->value = (mp_obj_t)&mp_builtin_hash_obj; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_iter, MP_TRUE)->value = (mp_obj_t)&mp_builtin_iter_obj; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_len, MP_TRUE)->value = rt_make_function_1(mp_builtin_len); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_max, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_max); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_min, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_min); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_next, MP_TRUE)->value = (mp_obj_t)&mp_builtin_next_obj; - mp_qstr_map_lookup(&map_builtins, MP_QSTR_ord, MP_TRUE)->value = rt_make_function_1(mp_builtin_ord); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_pow, MP_TRUE)->value = rt_make_function_var(2, mp_builtin_pow); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_print, MP_TRUE)->value = rt_make_function_var(0, mp_builtin_print); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_range, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_range); - mp_qstr_map_lookup(&map_builtins, MP_QSTR_sum, MP_TRUE)->value = rt_make_function_var(1, mp_builtin_sum); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_abs, true)->value = rt_make_function_1(mp_builtin_abs); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_all, true)->value = rt_make_function_1(mp_builtin_all); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_any, true)->value = rt_make_function_1(mp_builtin_any); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_callable, true)->value = rt_make_function_1(mp_builtin_callable); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_chr, true)->value = rt_make_function_1(mp_builtin_chr); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_divmod, true)->value = rt_make_function_2(mp_builtin_divmod); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_hash, true)->value = (mp_obj_t)&mp_builtin_hash_obj; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_iter, true)->value = (mp_obj_t)&mp_builtin_iter_obj; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_len, true)->value = rt_make_function_1(mp_builtin_len); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_max, true)->value = rt_make_function_var(1, mp_builtin_max); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_min, true)->value = rt_make_function_var(1, mp_builtin_min); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_next, true)->value = (mp_obj_t)&mp_builtin_next_obj; + mp_qstr_map_lookup(&map_builtins, MP_QSTR_ord, true)->value = rt_make_function_1(mp_builtin_ord); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_pow, true)->value = rt_make_function_var(2, mp_builtin_pow); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_print, true)->value = rt_make_function_var(0, mp_builtin_print); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_range, true)->value = rt_make_function_var(1, mp_builtin_range); + mp_qstr_map_lookup(&map_builtins, MP_QSTR_sum, true)->value = rt_make_function_var(1, mp_builtin_sum); next_unique_code_id = 1; // 0 indicates "no code" unique_codes = NULL; @@ -154,7 +154,7 @@ static void alloc_unique_codes(void) { } } -void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, MP_BOOL is_generator) { +void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, bool is_generator) { alloc_unique_codes(); assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); @@ -197,7 +197,7 @@ void rt_assign_native_code(int unique_code_id, void *fun, uint len, int n_args) unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; unique_codes[unique_code_id].n_stack = 0; - unique_codes[unique_code_id].is_generator = MP_FALSE; + unique_codes[unique_code_id].is_generator = false; unique_codes[unique_code_id].u_native.fun = fun; //printf("native code: %d bytes\n", len); @@ -230,7 +230,7 @@ void rt_assign_inline_asm_code(int unique_code_id, void *fun, uint len, int n_ar unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; unique_codes[unique_code_id].n_stack = 0; - unique_codes[unique_code_id].is_generator = MP_FALSE; + unique_codes[unique_code_id].is_generator = false; unique_codes[unique_code_id].u_inline_asm.fun = fun; #ifdef DEBUG_PRINT @@ -252,8 +252,8 @@ void rt_assign_inline_asm_code(int unique_code_id, void *fun, uint len, int n_ar #endif } -static MP_BOOL fit_small_int(mp_small_int_t o) { - return MP_TRUE; +static bool fit_small_int(mp_small_int_t o) { + return true; } int rt_is_true(mp_obj_t arg) { @@ -290,10 +290,10 @@ mp_obj_t rt_load_const_dec(qstr qstr) { const char *s = qstr_str(qstr); int in = PARSE_DEC_IN_INTG; mp_float_t dec_val = 0; - MP_BOOL exp_neg = MP_FALSE; + bool exp_neg = false; int exp_val = 0; int exp_extra = 0; - MP_BOOL imag = MP_FALSE; + bool imag = false; for (; *s; s++) { int dig = *s; if ('0' <= dig && dig <= '9') { @@ -314,11 +314,11 @@ mp_obj_t rt_load_const_dec(qstr qstr) { s++; } else if (s[1] == '-') { s++; - exp_neg = MP_TRUE; + exp_neg = true; } } else if (dig == 'J' || dig == 'j') { s++; - imag = MP_TRUE; + imag = true; break; } else { // unknown character @@ -356,11 +356,11 @@ mp_obj_t rt_load_const_str(qstr qstr) { mp_obj_t rt_load_name(qstr qstr) { // logic: search locals, globals, builtins DEBUG_OP_printf("load name %s\n", qstr_str(qstr)); - mp_map_elem_t *elem = mp_qstr_map_lookup(map_locals, qstr, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(map_locals, qstr, false); if (elem == NULL) { - elem = mp_qstr_map_lookup(map_globals, qstr, MP_FALSE); + elem = mp_qstr_map_lookup(map_globals, qstr, false); if (elem == NULL) { - elem = mp_qstr_map_lookup(&map_builtins, qstr, MP_FALSE); + elem = mp_qstr_map_lookup(&map_builtins, qstr, false); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_NameError, "name '%s' is not defined", qstr_str(qstr))); } @@ -372,9 +372,9 @@ mp_obj_t rt_load_name(qstr qstr) { mp_obj_t rt_load_global(qstr qstr) { // logic: search globals, builtins DEBUG_OP_printf("load global %s\n", qstr_str(qstr)); - mp_map_elem_t *elem = mp_qstr_map_lookup(map_globals, qstr, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(map_globals, qstr, false); if (elem == NULL) { - elem = mp_qstr_map_lookup(&map_builtins, qstr, MP_FALSE); + elem = mp_qstr_map_lookup(&map_builtins, qstr, false); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg_1_arg(MP_QSTR_NameError, "name '%s' is not defined", qstr_str(qstr))); } @@ -384,7 +384,7 @@ mp_obj_t rt_load_global(qstr qstr) { mp_obj_t rt_load_build_class(void) { DEBUG_OP_printf("load_build_class\n"); - mp_map_elem_t *elem = mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(&map_builtins, MP_QSTR___build_class__, false); if (elem == NULL) { nlr_jump(mp_obj_new_exception_msg(MP_QSTR_NameError, "name '__build_class__' is not defined")); } @@ -401,12 +401,12 @@ void rt_set_cell(mp_obj_t cell, mp_obj_t val) { void rt_store_name(qstr qstr, mp_obj_t obj) { DEBUG_OP_printf("store name %s <- %p\n", qstr_str(qstr), obj); - mp_qstr_map_lookup(map_locals, qstr, MP_TRUE)->value = obj; + mp_qstr_map_lookup(map_locals, qstr, true)->value = obj; } void rt_store_global(qstr qstr, mp_obj_t obj) { DEBUG_OP_printf("store global %s <- %p\n", qstr_str(qstr), obj); - mp_qstr_map_lookup(map_globals, qstr, MP_TRUE)->value = obj; + mp_qstr_map_lookup(map_globals, qstr, true)->value = obj; } mp_obj_t rt_unary_op(int op, mp_obj_t arg) { @@ -750,7 +750,7 @@ mp_obj_t rt_store_map(mp_obj_t map, mp_obj_t key, mp_obj_t value) { mp_obj_t rt_load_attr(mp_obj_t base, qstr attr) { DEBUG_OP_printf("load attr %s\n", qstr_str(attr)); if (MP_OBJ_IS_TYPE(base, &class_type)) { - mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(base), attr, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_class_get_locals(base), attr, false); if (elem == NULL) { // TODO what about generic method lookup? goto no_attr; @@ -760,7 +760,7 @@ mp_obj_t rt_load_attr(mp_obj_t base, qstr attr) { return mp_obj_instance_load_attr(base, attr); } else if (MP_OBJ_IS_TYPE(base, &module_type)) { DEBUG_OP_printf("lookup module map %p\n", mp_obj_module_get_globals(base)); - mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_module_get_globals(base), attr, MP_FALSE); + mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_module_get_globals(base), attr, false); if (elem == NULL) { // TODO what about generic method lookup? goto no_attr; @@ -817,13 +817,13 @@ void rt_store_attr(mp_obj_t base, qstr attr, mp_obj_t value) { if (MP_OBJ_IS_TYPE(base, &class_type)) { // TODO CPython allows STORE_ATTR to a class, but is this the correct implementation? mp_map_t *locals = mp_obj_class_get_locals(base); - mp_qstr_map_lookup(locals, attr, MP_TRUE)->value = value; + mp_qstr_map_lookup(locals, attr, true)->value = value; } else if (MP_OBJ_IS_TYPE(base, &instance_type)) { mp_obj_instance_store_attr(base, attr, value); } else if (MP_OBJ_IS_TYPE(base, &module_type)) { // TODO CPython allows STORE_ATTR to a module, but is this the correct implementation? mp_map_t *globals = mp_obj_module_get_globals(base); - mp_qstr_map_lookup(globals, attr, MP_TRUE)->value = value; + mp_qstr_map_lookup(globals, attr, true)->value = value; } else { nlr_jump(mp_obj_new_exception_msg_2_args(MP_QSTR_AttributeError, "'%s' object has no attribute '%s'", mp_obj_get_type_str(base), qstr_str(attr))); } diff --git a/py/runtime0.h b/py/runtime0.h index 19c2f63ed..97dbe5ddb 100644 --- a/py/runtime0.h +++ b/py/runtime0.h @@ -82,6 +82,6 @@ extern void *const rt_fun_table[RT_F_NUMBER_OF]; void rt_init(void); void rt_deinit(void); int rt_get_unique_code_id(void); -void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, MP_BOOL is_generator); +void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, bool is_generator); void rt_assign_native_code(int unique_code_id, void *f, uint len, int n_args); void rt_assign_inline_asm_code(int unique_code_id, void *f, uint len, int n_args); diff --git a/py/scope.c b/py/scope.c index 110e63afa..5d97393ae 100644 --- a/py/scope.c +++ b/py/scope.c @@ -58,10 +58,10 @@ scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, uint unique_code_id, u return scope; } -id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, MP_BOOL *added) { +id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added) { for (int i = 0; i < scope->id_info_len; i++) { if (scope->id_info[i].qstr == qstr) { - *added = MP_FALSE; + *added = false; return &scope->id_info[i]; } } @@ -100,11 +100,11 @@ id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, MP_BOOL *added) { id_info = &scope->id_info[scope->id_info_len++]; } - id_info->param = MP_FALSE; + id_info->param = false; id_info->kind = 0; id_info->qstr = qstr; id_info->local_num = 0; - *added = MP_TRUE; + *added = true; return id_info; } @@ -155,7 +155,7 @@ void scope_close_over_in_parents(scope_t *scope, qstr qstr) { } if (id == NULL) { // variable not declared in this scope, so declare it as free and keep searching parents - MP_BOOL added; + bool added; id = scope_find_or_add_id(s, qstr, &added); assert(added); id->kind = ID_INFO_KIND_FREE; @@ -178,7 +178,7 @@ void scope_declare_global(scope_t *scope, qstr qstr) { printf("SyntaxError?: can't declare global in outer code\n"); return; } - MP_BOOL added; + bool added; id_info_t *id_info = scope_find_or_add_id(scope, qstr, &added); if (!added) { printf("SyntaxError?: identifier already declared something\n"); @@ -198,7 +198,7 @@ void scope_declare_nonlocal(scope_t *scope, qstr qstr) { printf("SyntaxError?: can't declare nonlocal in outer code\n"); return; } - MP_BOOL added; + bool added; id_info_t *id_info = scope_find_or_add_id(scope, qstr, &added); if (!added) { printf("SyntaxError?: identifier already declared something\n"); diff --git a/py/scope.h b/py/scope.h index 8cdcacaaf..761a4d711 100644 --- a/py/scope.h +++ b/py/scope.h @@ -8,7 +8,7 @@ enum { typedef struct _id_info_t { // TODO compress this info to make structure smaller in memory - MP_BOOL param; + bool param; int kind; qstr qstr; @@ -55,7 +55,7 @@ typedef struct _scope_t { } scope_t; scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, uint unique_code_id, uint emit_options); -id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, MP_BOOL *added); +id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, bool *added); id_info_t *scope_find(scope_t *scope, qstr qstr); id_info_t *scope_find_global(scope_t *scope, qstr qstr); id_info_t *scope_find_local_in_parent(scope_t *scope, qstr qstr); diff --git a/py/unicode.c b/py/unicode.c index 345061885..58c860a0e 100644 --- a/py/unicode.c +++ b/py/unicode.c @@ -46,32 +46,32 @@ char *utf8_next_char(const char *s) { return (char*)(s + 1); } -MP_BOOL unichar_isspace(unichar c) { +bool unichar_isspace(unichar c) { return c < 128 && (attr[c] & FL_SPACE) != 0; } -MP_BOOL unichar_isalpha(unichar c) { +bool unichar_isalpha(unichar c) { return c < 128 && (attr[c] & FL_ALPHA) != 0; } -MP_BOOL unichar_isprint(unichar c) { +bool unichar_isprint(unichar c) { return c < 128 && (attr[c] & FL_PRINT) != 0; } -MP_BOOL unichar_isdigit(unichar c) { +bool unichar_isdigit(unichar c) { return c < 128 && (attr[c] & FL_DIGIT) != 0; } /* -MP_BOOL char_is_alpha_or_digit(unichar c) { +bool char_is_alpha_or_digit(unichar c) { return c < 128 && (attr[c] & (FL_ALPHA | FL_DIGIT)) != 0; } -MP_BOOL char_is_upper(unichar c) { +bool char_is_upper(unichar c) { return c < 128 && (attr[c] & FL_UPPER) != 0; } -MP_BOOL char_is_lower(unichar c) { +bool char_is_lower(unichar c) { return c < 128 && (attr[c] & FL_LOWER) != 0; } */ diff --git a/py/vm.c b/py/vm.c index 02f3add75..8e7ef7485 100644 --- a/py/vm.c +++ b/py/vm.c @@ -65,7 +65,7 @@ mp_obj_t mp_execute_byte_code(const byte *code, const mp_obj_t *args, uint n_arg // fastn has items in normal order // sp points to top of stack which grows down -MP_BOOL mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out) { +bool mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t **sp_in_out) { // careful: be sure to declare volatile any variables read in the exception handler (written is ok, I think) const byte *ip = *ip_in_out; @@ -472,7 +472,7 @@ MP_BOOL mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t nlr_pop(); *sp_in_out = sp; assert(exc_sp == &exc_stack[0] - 1); - return MP_FALSE; + return false; case MP_BC_YIELD_VALUE: nlr_pop(); @@ -481,7 +481,7 @@ MP_BOOL mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t fastn[1] = fast1; fastn[2] = fast2; *sp_in_out = sp; - return MP_TRUE; + return true; case MP_BC_IMPORT_NAME: DECODE_QSTR; @@ -499,7 +499,7 @@ MP_BOOL mp_execute_byte_code_2(const byte **ip_in_out, mp_obj_t *fastn, mp_obj_t printf("code %p, byte code 0x%02x not implemented\n", ip, op); assert(0); nlr_pop(); - return MP_FALSE; + return false; } } diff --git a/py/vstr.c b/py/vstr.c index 76232cc10..80841b24c 100644 --- a/py/vstr.c +++ b/py/vstr.c @@ -11,11 +11,11 @@ void vstr_init(vstr_t *vstr) { vstr->len = 0; vstr->buf = m_new(char, vstr->alloc); if (vstr->buf == NULL) { - vstr->had_error = MP_TRUE; + vstr->had_error = true; return; } vstr->buf[0] = 0; - vstr->had_error = MP_FALSE; + vstr->had_error = false; } void vstr_clear(vstr_t *vstr) { @@ -42,10 +42,10 @@ void vstr_free(vstr_t *vstr) { void vstr_reset(vstr_t *vstr) { vstr->len = 0; vstr->buf[0] = 0; - vstr->had_error = MP_FALSE; + vstr->had_error = false; } -MP_BOOL vstr_had_error(vstr_t *vstr) { +bool vstr_had_error(vstr_t *vstr) { return vstr->had_error; } @@ -63,23 +63,23 @@ int vstr_len(vstr_t *vstr) { return vstr->len; } -MP_BOOL vstr_ensure_extra(vstr_t *vstr, int size) { +bool vstr_ensure_extra(vstr_t *vstr, int size) { if (vstr->len + size + 1 > vstr->alloc) { int new_alloc = ROUND_ALLOC((vstr->len + size + 1) * 2); char *new_buf = m_renew(char, vstr->buf, vstr->alloc, new_alloc); if (new_buf == NULL) { - vstr->had_error = MP_TRUE; - return MP_FALSE; + vstr->had_error = true; + return false; } vstr->alloc = new_alloc; vstr->buf = new_buf; } - return MP_TRUE; + return true; } void vstr_hint_size(vstr_t *vstr, int size) { // it's not an error if we fail to allocate for the size hint - MP_BOOL er = vstr->had_error; + bool er = vstr->had_error; vstr_ensure_extra(vstr, size); vstr->had_error = er; } diff --git a/stm/audio.c b/stm/audio.c index 829bd6dfd..34adefbcd 100644 --- a/stm/audio.c +++ b/stm/audio.c @@ -22,7 +22,7 @@ int sample_buf_in; int sample_buf_out; byte sample_buf[SAMPLE_BUF_SIZE]; -MP_BOOL audio_is_full(void) { +bool audio_is_full(void) { return ((sample_buf_in + 1) % SAMPLE_BUF_SIZE) == sample_buf_out; } diff --git a/stm/cc3k/pybcc3k.c b/stm/cc3k/pybcc3k.c index aa83d4a27..9b7113869 100644 --- a/stm/cc3k/pybcc3k.c +++ b/stm/cc3k/pybcc3k.c @@ -165,11 +165,11 @@ void pyb_cc3000_spi_init(void) { /* // WLAN CS, EN and WALN IRQ Configuration - jshSetPinStateIsManual(WLAN_CS_PIN, MP_FALSE); + jshSetPinStateIsManual(WLAN_CS_PIN, false); jshPinOutput(WLAN_CS_PIN, 1); // de-assert CS - jshSetPinStateIsManual(WLAN_EN_PIN, MP_FALSE); + jshSetPinStateIsManual(WLAN_EN_PIN, false); jshPinOutput(WLAN_EN_PIN, 0); // disable WLAN - jshSetPinStateIsManual(WLAN_IRQ_PIN, MP_TRUE); + jshSetPinStateIsManual(WLAN_IRQ_PIN, true); jshPinSetState(WLAN_IRQ_PIN, JSHPINSTATE_GPIO_IN_PULLUP); // flip into read mode with pullup */ // configure wlan CS and EN pins diff --git a/stm/i2c.c b/stm/i2c.c index 6456a1579..9e25ff983 100644 --- a/stm/i2c.c +++ b/stm/i2c.c @@ -20,9 +20,9 @@ typedef enum { I2C_STATE_READ = 2, } i2c_state_t; -// set to MP_TRUE if the port has already been initialized -MP_BOOL i2c1_port_initialized = MP_FALSE; -MP_BOOL i2c2_port_initialized = MP_FALSE; +// set to true if the port has already been initialized +bool i2c1_port_initialized = false; +bool i2c2_port_initialized = false; static I2C_TypeDef * _i2c_port_addr(pyb_i2c_t i2c_port) { if (i2c_port == PYB_I2C_1) { @@ -37,17 +37,17 @@ static I2C_TypeDef * _i2c_port_addr(pyb_i2c_t i2c_port) { // todo - perhaps there should be some global resource management for gpio // this function would fail if the i2c pins have already been defined for // use by another python object -// as it is, this always returns MP_TRUE (unless i2c_port is invalid) -static MP_BOOL _i2c_init(pyb_i2c_t i2c_port) { +// as it is, this always returns true (unless i2c_port is invalid) +static bool _i2c_init(pyb_i2c_t i2c_port) { GPIO_InitTypeDef GPIO_InitStructure; I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); if (i2c == NULL) - return MP_FALSE; + return false; if (i2c_port == PYB_I2C_1) { - if (i2c1_port_initialized == MP_TRUE) { - return MP_TRUE; + if (i2c1_port_initialized == true) { + return true; } RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // enable I2C1 @@ -64,12 +64,12 @@ static MP_BOOL _i2c_init(pyb_i2c_t i2c_port) { GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); - i2c1_port_initialized = MP_TRUE; + i2c1_port_initialized = true; } if (i2c_port == PYB_I2C_2) { - if (i2c2_port_initialized == MP_TRUE) { - return MP_TRUE; + if (i2c2_port_initialized == true) { + return true; } RCC->APB1ENR |= RCC_APB1ENR_I2C2EN; // enable I2C2 @@ -85,7 +85,7 @@ static MP_BOOL _i2c_init(pyb_i2c_t i2c_port) { GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2); - i2c2_port_initialized = MP_TRUE; + i2c2_port_initialized = true; } // get clock speeds @@ -108,7 +108,7 @@ static MP_BOOL _i2c_init(pyb_i2c_t i2c_port) { // enable the I2C peripheral i2c->CR1 |= I2C_CR1_PE; - return MP_TRUE; + return true; } static uint32_t _i2c_get_sr(pyb_i2c_t i2c_port) { @@ -121,9 +121,9 @@ static uint32_t _i2c_get_sr(pyb_i2c_t i2c_port) { return (sr2 << 16) | sr1; } -static MP_BOOL _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { +static bool _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); - if (i2c == NULL) return MP_FALSE; + if (i2c == NULL) return false; // send start condition i2c->CR1 |= I2C_CR1_START; @@ -133,7 +133,7 @@ static MP_BOOL _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { while ((_i2c_get_sr(i2c_port) & 0x00030001) != 0x00030001) { if (--timeout == 0) { //printf("timeout in _i2c_restart\n"); - return MP_FALSE; + return false; } } @@ -145,7 +145,7 @@ static MP_BOOL _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { while ((_i2c_get_sr(i2c_port) & 0x00070082) != 0x00070082) { if (--timeout == 0) { //printf("timeout in _i2c_restart write\n"); - return MP_FALSE; + return false; } } } else { @@ -156,16 +156,16 @@ static MP_BOOL _i2c_restart(pyb_i2c_t i2c_port, uint8_t addr, int write) { while ((_i2c_get_sr(i2c_port) & 0x00030002) != 0x00030002) { if (--timeout == 0) { //printf("timeout in _i2c_restart read\n"); - return MP_FALSE; + return false; } } } - return MP_TRUE; + return true; } -static MP_BOOL _i2c_send_byte(pyb_i2c_t i2c_port, uint8_t data) { +static bool _i2c_send_byte(pyb_i2c_t i2c_port, uint8_t data) { I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); - if (i2c == NULL) return MP_FALSE; + if (i2c == NULL) return false; // send byte i2c->DR = data; @@ -174,10 +174,10 @@ static MP_BOOL _i2c_send_byte(pyb_i2c_t i2c_port, uint8_t data) { while ((_i2c_get_sr(i2c_port) & 0x00070084) != 0x00070084) { if (--timeout == 0) { //printf("timeout in _i2c_send_byte\n"); - return MP_FALSE; + return false; } } - return MP_TRUE; + return true; } static uint8_t _i2c_read_ack(pyb_i2c_t i2c_port) { @@ -220,18 +220,18 @@ static uint8_t _i2c_read_nack(pyb_i2c_t i2c_port) { return data; } -static MP_BOOL _i2c_start(pyb_i2c_t i2c_port) { +static bool _i2c_start(pyb_i2c_t i2c_port) { I2C_TypeDef *i2c = _i2c_port_addr(i2c_port); - if (i2c == NULL) return MP_FALSE; + if (i2c == NULL) return false; // wait until I2C is not busy uint32_t timeout = 1000000; while (i2c->SR2 & I2C_SR2_BUSY) { if (--timeout == 0) { - return MP_FALSE; + return false; } } - return MP_TRUE; + return true; } static void _i2c_stop(pyb_i2c_t i2c_port) { @@ -264,7 +264,7 @@ mp_obj_t i2c_obj_start(mp_obj_t self_in) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; } - if (_i2c_start(self->i2c_port) == MP_TRUE) + if (_i2c_start(self->i2c_port) == true) return mp_const_true; return mp_const_false; } @@ -272,7 +272,7 @@ mp_obj_t i2c_obj_start(mp_obj_t self_in) { mp_obj_t i2c_obj_write(mp_obj_t self_in, mp_obj_t data_in) { pyb_i2c_obj_t *self = self_in; if (self->i2c_state != I2C_STATE_WRITE) { - if (_i2c_restart(self->i2c_port, self->i2c_addr, 1) == MP_FALSE) { + if (_i2c_restart(self->i2c_port, self->i2c_addr, 1) == false) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; return mp_const_false; @@ -280,7 +280,7 @@ mp_obj_t i2c_obj_write(mp_obj_t self_in, mp_obj_t data_in) { self->i2c_state = I2C_STATE_WRITE; } uint8_t data = mp_obj_get_int(data_in); - if (_i2c_send_byte(self->i2c_port, data) == MP_FALSE) + if (_i2c_send_byte(self->i2c_port, data) == false) return mp_const_false; return mp_const_true; } @@ -288,7 +288,7 @@ mp_obj_t i2c_obj_write(mp_obj_t self_in, mp_obj_t data_in) { mp_obj_t i2c_obj_read(mp_obj_t self_in) { pyb_i2c_obj_t *self = self_in; if (self->i2c_state != I2C_STATE_READ) { - if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == MP_FALSE) { + if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == false) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; return mp_const_false; @@ -302,7 +302,7 @@ mp_obj_t i2c_obj_read(mp_obj_t self_in) { mp_obj_t i2c_obj_readAndStop(mp_obj_t self_in) { pyb_i2c_obj_t *self = self_in; if (self->i2c_state != I2C_STATE_READ) { - if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == MP_FALSE) { + if (_i2c_restart(self->i2c_port, self->i2c_addr, 0) == false) { _i2c_stop(self->i2c_port); self->i2c_state = I2C_STATE_IDLE; return mp_const_false; @@ -326,19 +326,18 @@ static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_read_obj, i2c_obj_read); static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_readAndStop_obj, i2c_obj_readAndStop); static MP_DEFINE_CONST_FUN_OBJ_1(i2c_obj_stop_obj, i2c_obj_stop); -static const mp_method_t i2c_obj_type_type_methods[] = { - { "start", &i2c_obj_start_obj }, - { "write", &i2c_obj_write_obj }, - { "read", &i2c_obj_read_obj }, - { "readAndStop", &i2c_obj_readAndStop_obj }, - { "stop", &i2c_obj_stop_obj }, - { NULL, NULL }, -}; static const mp_obj_type_t i2c_obj_type = { { &mp_const_type }, "I2C", .print = i2c_obj_print, - .methods = i2c_obj_type_type_methods, + .methods = { + { "start", &i2c_obj_start_obj }, + { "write", &i2c_obj_write_obj }, + { "read", &i2c_obj_read_obj }, + { "readAndStop", &i2c_obj_readAndStop_obj }, + { "stop", &i2c_obj_stop_obj }, + { NULL, NULL }, + } }; // create the I2C object @@ -351,7 +350,7 @@ mp_obj_t pyb_I2C(mp_obj_t i2c_id, mp_obj_t i2c_addr) { case 1: i2c_port = PYB_I2C_2; break; default: return mp_const_none; } - if (_i2c_init(i2c_port) == MP_FALSE) { + if (_i2c_init(i2c_port) == false) { return mp_const_none; } pyb_i2c_obj_t *o = m_new_obj(pyb_i2c_obj_t); diff --git a/stm/led.c b/stm/led.c index e89adbb78..9809c2177 100644 --- a/stm/led.c +++ b/stm/led.c @@ -176,16 +176,15 @@ mp_obj_t led_obj_off(mp_obj_t self_in) { static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on); static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off); -static const mp_method_t led_obj_type_methods[] = { - { "on", &led_obj_on_obj }, - { "off", &led_obj_off_obj }, - { NULL, NULL }, -}; static const mp_obj_type_t led_obj_type = { { &mp_const_type }, "Led", .print = led_obj_print, - .methods = led_obj_type_methods, + .methods = { + { "on", &led_obj_on_obj }, + { "off", &led_obj_off_obj }, + { NULL, NULL }, + } }; mp_obj_t pyb_Led(mp_obj_t led_id) { diff --git a/stm/lexerstm.c b/stm/lexerstm.c index 6de908317..661dfb016 100644 --- a/stm/lexerstm.c +++ b/stm/lexerstm.c @@ -21,7 +21,7 @@ void str_buf_free(mp_lexer_str_buf_t *sb) { } } -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str, mp_lexer_str_buf_t *sb) { +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, mp_lexer_str_buf_t *sb) { sb->free = free_str; sb->src_beg = str; sb->src_cur = str; diff --git a/stm/lexerstm.h b/stm/lexerstm.h index 99c270a71..7e090898a 100644 --- a/stm/lexerstm.h +++ b/stm/lexerstm.h @@ -1,5 +1,5 @@ typedef struct _py_lexer_str_buf_t { - MP_BOOL free; // free src_beg when done + bool free; // free src_beg when done const char *src_beg; // beginning of source const char *src_cur; // current location in source const char *src_end; // end (exclusive) of source @@ -12,5 +12,5 @@ typedef struct _py_lexer_file_buf_t { uint16_t pos; } mp_lexer_file_buf_t; -mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, MP_BOOL free_str, mp_lexer_str_buf_t *sb); +mp_lexer_t *mp_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, mp_lexer_str_buf_t *sb); mp_lexer_t *mp_lexer_new_from_file(const char *filename, mp_lexer_file_buf_t *fb); diff --git a/stm/main.c b/stm/main.c index e1b695167..07c974eff 100644 --- a/stm/main.c +++ b/stm/main.c @@ -359,7 +359,7 @@ int readline(vstr_t *line, const char *prompt) { readline_hist[0] = strdup(vstr_str(line)); return 1; } else if (c == 27) { - escape = MP_TRUE; + escape = true; } else if (c == 127) { if (vstr_len(line) > len) { vstr_cut_tail(line, 1); @@ -432,12 +432,12 @@ void do_repl(void) { } mp_lexer_str_buf_t sb; - mp_lexer_t *lex = mp_lexer_new_from_str_len("", vstr_str(&line), vstr_len(&line), MP_FALSE, &sb); + mp_lexer_t *lex = mp_lexer_new_from_str_len("", vstr_str(&line), vstr_len(&line), false, &sb); mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT); mp_lexer_free(lex); if (pn != MP_PARSE_NODE_NULL) { - mp_obj_t module_fun = mp_compile(pn, MP_TRUE); + mp_obj_t module_fun = mp_compile(pn, true); if (module_fun != mp_const_none) { nlr_buf_t nlr; uint32_t start = sys_tick_counter; @@ -461,37 +461,37 @@ void do_repl(void) { stdout_tx_str("\r\n"); } -MP_BOOL do_file(const char *filename) { +bool do_file(const char *filename) { mp_lexer_file_buf_t fb; mp_lexer_t *lex = mp_lexer_new_from_file(filename, &fb); if (lex == NULL) { printf("could not open file '%s' for reading\n", filename); - return MP_FALSE; + return false; } mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT); mp_lexer_free(lex); if (pn == MP_PARSE_NODE_NULL) { - return MP_FALSE; + return false; } - mp_obj_t module_fun = mp_compile(pn, MP_FALSE); + mp_obj_t module_fun = mp_compile(pn, false); if (module_fun == mp_const_none) { - return MP_FALSE; + return false; } nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { rt_call_function_0(module_fun); nlr_pop(); - return MP_TRUE; + return true; } else { // uncaught exception mp_obj_print((mp_obj_t)nlr.ret_val); printf("\n"); - return MP_FALSE; + return false; } } @@ -689,12 +689,6 @@ static MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close); // TODO gc hook to close the file if not already closed -static const mp_method_t file_obj_type_methods[] = { - { "read", &file_obj_read_obj }, - { "write", &file_obj_write_obj }, - { "close", &file_obj_close_obj }, - { NULL, NULL }, -}; static const mp_obj_type_t file_obj_type = { { &mp_const_type }, "File", @@ -705,7 +699,12 @@ static const mp_obj_type_t file_obj_type = { NULL, // binary_op NULL, // getiter NULL, // iternext - .methods = file_obj_type_methods, + .methods = { + { "read", &file_obj_read_obj }, + { "write", &file_obj_write_obj }, + { "close", &file_obj_close_obj }, + {NULL, NULL}, + } }; mp_obj_t pyb_io_open(mp_obj_t o_filename, mp_obj_t o_mode) { @@ -779,7 +778,7 @@ int main(void) { //usart_init(); disabled while wi-fi is enabled - int first_soft_reset = MP_TRUE; + int first_soft_reset = true; soft_reset: @@ -848,12 +847,12 @@ soft_reset: lcd_print_str(" micro py board\n"); // check if user switch held (initiates reset of filesystem) - MP_BOOL reset_filesystem = MP_FALSE; + bool reset_filesystem = false; if (switch_get()) { - reset_filesystem = MP_TRUE; + reset_filesystem = true; for (int i = 0; i < 50; i++) { if (!switch_get()) { - reset_filesystem = MP_FALSE; + reset_filesystem = false; break; } sys_tick_delay_ms(10); @@ -1064,7 +1063,7 @@ soft_reset: "f()\n"; mp_lexer_str_buf_t mp_lexer_str_buf; - mp_lexer_t *lex = mp_lexer_new_from_str_len("", pysrc, strlen(pysrc), MP_FALSE, &mp_lexer_str_buf); + mp_lexer_t *lex = mp_lexer_new_from_str_len("", pysrc, strlen(pysrc), false, &mp_lexer_str_buf); // nalloc=1740;6340;6836 -> 140;4600;496 bytes for lexer, parser, compiler printf("lex; al=%u\n", m_get_total_bytes_allocated()); @@ -1075,7 +1074,7 @@ soft_reset: printf("pars;al=%u\n", m_get_total_bytes_allocated()); sys_tick_delay_ms(1000); //parse_node_show(pn, 0); - mp_obj_t module_fun = mp_compile(pn, MP_FALSE); + mp_obj_t module_fun = mp_compile(pn, false); printf("comp;al=%u\n", m_get_total_bytes_allocated()); sys_tick_delay_ms(1000); @@ -1172,7 +1171,7 @@ soft_reset: printf("PYB: soft reboot\n"); - first_soft_reset = MP_FALSE; + first_soft_reset = false; goto soft_reset; } diff --git a/stm/printf.c b/stm/printf.c index 7ada626bd..8a59f8a98 100644 --- a/stm/printf.c +++ b/stm/printf.c @@ -152,10 +152,10 @@ int pfenv_printf(const pfenv_t *pfenv, const char *fmt, va_list args) { } // parse long specifiers (current not used) - //MP_BOOL long_arg = MP_FALSE; + //bool long_arg = false; if (*fmt == 'l') { ++fmt; - //long_arg = MP_TRUE; + //long_arg = true; } if (*fmt == '\0') { @@ -215,14 +215,14 @@ int pfenv_printf(const pfenv_t *pfenv, const char *fmt, va_list args) { void stdout_print_strn(void *data, const char *str, unsigned int len) { // send stdout to USART, USB CDC VCP, and LCD if nothing else - MP_BOOL any = MP_FALSE; + bool any = false; if (usart_is_enabled()) { usart_tx_strn_cooked(str, len); - any = MP_TRUE; + any = true; } if (usb_vcp_is_enabled()) { usb_vcp_send_strn_cooked(str, len); - any = MP_TRUE; + any = true; } if (!any) { lcd_print_strn(str, len); diff --git a/stm/pybwlan.c b/stm/pybwlan.c index cffa01684..6988f1c84 100644 --- a/stm/pybwlan.c +++ b/stm/pybwlan.c @@ -336,7 +336,7 @@ void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length) socketnum = data[0]; //PRINT_F("TCP Close wait #"); printDec(socketnum); if (socketnum < MAX_SOCKETS) - closed_sockets[socketnum] = MP_TRUE; + closed_sockets[socketnum] = true; */ } } diff --git a/stm/servo.c b/stm/servo.c index 7facce745..31190ce79 100644 --- a/stm/servo.c +++ b/stm/servo.c @@ -137,15 +137,14 @@ static mp_obj_t servo_obj_angle(mp_obj_t self_in, mp_obj_t angle) { static MP_DEFINE_CONST_FUN_OBJ_2(servo_obj_angle_obj, servo_obj_angle); -static const mp_method_t servo_obj_type_methods[] = { - { "angle", &servo_obj_angle_obj }, - { NULL, NULL }, -}; static const mp_obj_type_t servo_obj_type = { { &mp_const_type }, "Servo", .print = servo_obj_print, - .methods = servo_obj_type_methods, + .methods = { + { "angle", &servo_obj_angle_obj }, + { NULL, NULL }, + } }; mp_obj_t pyb_Servo(mp_obj_t servo_id) { diff --git a/stm/storage.c b/stm/storage.c index f1ec9f652..daee4adb5 100644 --- a/stm/storage.c +++ b/stm/storage.c @@ -15,18 +15,18 @@ #define FLASH_PART1_NUM_BLOCKS (224) // 16k+16k+16k+64k=112k #define FLASH_MEM_START_ADDR (0x08004000) // sector 1, 16k -static MP_BOOL is_initialised = MP_FALSE; +static bool is_initialised = false; static uint32_t cache_flash_sector_id; static uint32_t cache_flash_sector_start; static uint32_t cache_flash_sector_size; -static MP_BOOL cache_dirty; +static bool cache_dirty; static uint32_t sys_tick_counter_last_write; static void cache_flush(void) { if (cache_dirty) { // sync the cache RAM buffer by writing it to the flash page flash_write(cache_flash_sector_start, (const uint32_t*)CACHE_MEM_START_ADDR, cache_flash_sector_size / 4); - cache_dirty = MP_FALSE; + cache_dirty = false; // indicate a clean cache with LED off led_state(PYB_LED_R1, 0); } @@ -43,7 +43,7 @@ static uint8_t *cache_get_addr_for_write(uint32_t flash_addr) { cache_flash_sector_start = flash_sector_start; cache_flash_sector_size = flash_sector_size; } - cache_dirty = MP_TRUE; + cache_dirty = true; // indicate a dirty cache with LED on led_state(PYB_LED_R1, 1); return (uint8_t*)CACHE_MEM_START_ADDR + flash_addr - flash_sector_start; @@ -64,8 +64,8 @@ static uint8_t *cache_get_addr_for_read(uint32_t flash_addr) { void storage_init(void) { if (!is_initialised) { cache_flash_sector_id = 0; - cache_dirty = MP_FALSE; - is_initialised = MP_TRUE; + cache_dirty = false; + is_initialised = true; sys_tick_counter_last_write = 0; } } @@ -78,7 +78,7 @@ uint32_t storage_get_block_count(void) { return FLASH_PART1_START_BLOCK + FLASH_PART1_NUM_BLOCKS; } -MP_BOOL storage_needs_flush(void) { +bool storage_needs_flush(void) { // wait 2 seconds after last write to flush return cache_dirty && sys_tick_has_passed(sys_tick_counter_last_write, 2000); } @@ -123,7 +123,7 @@ static void build_partition(uint8_t *buf, int boot, int type, uint32_t start_blo buf[15] = num_blocks >> 24; } -MP_BOOL storage_read_block(uint8_t *dest, uint32_t block) { +bool storage_read_block(uint8_t *dest, uint32_t block) { //printf("RD %u\n", block); if (block == 0) { // fake the MBR so we can decide on our own partition table @@ -140,26 +140,26 @@ MP_BOOL storage_read_block(uint8_t *dest, uint32_t block) { dest[510] = 0x55; dest[511] = 0xaa; - return MP_TRUE; + return true; } else if (FLASH_PART1_START_BLOCK <= block && block < FLASH_PART1_START_BLOCK + FLASH_PART1_NUM_BLOCKS) { // non-MBR block, get data from flash memory, possibly via cache uint32_t flash_addr = FLASH_MEM_START_ADDR + (block - FLASH_PART1_START_BLOCK) * BLOCK_SIZE; uint8_t *src = cache_get_addr_for_read(flash_addr); memcpy(dest, src, BLOCK_SIZE); - return MP_TRUE; + return true; } else { // bad block number - return MP_FALSE; + return false; } } -MP_BOOL storage_write_block(const uint8_t *src, uint32_t block) { +bool storage_write_block(const uint8_t *src, uint32_t block) { //printf("WR %u\n", block); if (block == 0) { // can't write MBR, but pretend we did - return MP_TRUE; + return true; } else if (FLASH_PART1_START_BLOCK <= block && block < FLASH_PART1_START_BLOCK + FLASH_PART1_NUM_BLOCKS) { // non-MBR block, copy to cache @@ -167,10 +167,10 @@ MP_BOOL storage_write_block(const uint8_t *src, uint32_t block) { uint8_t *dest = cache_get_addr_for_write(flash_addr); memcpy(dest, src, BLOCK_SIZE); sys_tick_counter_last_write = sys_tick_counter; - return MP_TRUE; + return true; } else { // bad block number - return MP_FALSE; + return false; } } diff --git a/stm/storage.h b/stm/storage.h index 7bdcfc7cc..fe37e8b27 100644 --- a/stm/storage.h +++ b/stm/storage.h @@ -1,7 +1,7 @@ void storage_init(void); uint32_t storage_get_block_size(void); uint32_t storage_get_block_count(void); -MP_BOOL storage_needs_flush(void); +bool storage_needs_flush(void); void storage_flush(void); -MP_BOOL storage_read_block(uint8_t *dest, uint32_t block); -MP_BOOL storage_write_block(const uint8_t *src, uint32_t block); +bool storage_read_block(uint8_t *dest, uint32_t block); +bool storage_write_block(const uint8_t *src, uint32_t block); diff --git a/stm/systick.c b/stm/systick.c index f9def4a02..40ae53279 100644 --- a/stm/systick.c +++ b/stm/systick.c @@ -43,7 +43,7 @@ void sys_tick_wait_at_least(uint32_t stc, uint32_t delay_ms) { } } -MP_BOOL sys_tick_has_passed(uint32_t stc, uint32_t delay_ms) { +bool sys_tick_has_passed(uint32_t stc, uint32_t delay_ms) { // stc_wait is the value of sys_tick_counter that we wait for uint32_t stc_wait = stc + delay_ms; if (stc_wait < stc) { diff --git a/stm/systick.h b/stm/systick.h index 518d872c2..7d2deed11 100644 --- a/stm/systick.h +++ b/stm/systick.h @@ -4,4 +4,4 @@ void sys_tick_init(void); void SysTick_Handler(void); void sys_tick_delay_ms(uint32_t delay_ms); void sys_tick_wait_at_least(uint32_t stc, uint32_t delay_ms); -MP_BOOL sys_tick_has_passed(uint32_t stc, uint32_t delay_ms); +bool sys_tick_has_passed(uint32_t stc, uint32_t delay_ms); diff --git a/stm/usart.c b/stm/usart.c index 6e300a29e..307aff166 100644 --- a/stm/usart.c +++ b/stm/usart.c @@ -5,7 +5,7 @@ #include "misc.h" #include "usart.h" -static MP_BOOL is_enabled; +static bool is_enabled; // USART6 on PC6 (TX), PC7 (RX) void usart_init(void) { @@ -33,14 +33,14 @@ void usart_init(void) { USART_Cmd(USART6, ENABLE); - is_enabled = MP_TRUE; + is_enabled = true; } -MP_BOOL usart_is_enabled(void) { +bool usart_is_enabled(void) { return is_enabled; } -MP_BOOL usart_rx_any(void) { +bool usart_rx_any(void) { return USART_GetFlagStatus(USART6, USART_FLAG_RXNE) == SET; } diff --git a/stm/usart.h b/stm/usart.h index ad57587ce..9d92e59f5 100644 --- a/stm/usart.h +++ b/stm/usart.h @@ -1,6 +1,6 @@ void usart_init(void); -MP_BOOL usart_is_enabled(void); -MP_BOOL usart_rx_any(void); +bool usart_is_enabled(void); +bool usart_rx_any(void); int usart_rx_char(void); void usart_tx_char(int c); void usart_tx_str(const char *str); diff --git a/stm/usb.c b/stm/usb.c index 6b553914e..b0fbfa194 100644 --- a/stm/usb.c +++ b/stm/usb.c @@ -30,7 +30,7 @@ void usb_init(void) { is_enabled = 1; } -MP_BOOL usb_vcp_is_enabled(void) { +bool usb_vcp_is_enabled(void) { return is_enabled; } diff --git a/stm/usb.h b/stm/usb.h index 6f8172a3f..c4b3b151f 100644 --- a/stm/usb.h +++ b/stm/usb.h @@ -1,5 +1,5 @@ void usb_init(void); -MP_BOOL usb_vcp_is_enabled(void); +bool usb_vcp_is_enabled(void); int usb_vcp_rx_any(void); char usb_vcp_rx_get(void); void usb_vcp_send_str(const char* str); diff --git a/unix-cpy/main.c b/unix-cpy/main.c index b1e99ac12..eba97f527 100644 --- a/unix-cpy/main.c +++ b/unix-cpy/main.c @@ -37,7 +37,7 @@ void do_file(const char *file) { //printf("----------------\n"); //parse_node_show(pn, 0); //printf("----------------\n"); - mp_obj_t module_fun = mp_compile(pn, MP_FALSE); + mp_obj_t module_fun = mp_compile(pn, false); //printf("----------------\n"); if (module_fun == mp_const_none) { diff --git a/unix/main.c b/unix/main.c index e3873489d..a06dc3679 100644 --- a/unix/main.c +++ b/unix/main.c @@ -79,13 +79,13 @@ static void do_repl(void) { } } - mp_lexer_t *lex = mp_lexer_new_from_str_len("", line, strlen(line), MP_FALSE); + mp_lexer_t *lex = mp_lexer_new_from_str_len("", line, strlen(line), false); mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT); mp_lexer_free(lex); if (pn != MP_PARSE_NODE_NULL) { //mp_parse_node_show(pn, 0); - mp_obj_t module_fun = mp_compile(pn, MP_TRUE); + mp_obj_t module_fun = mp_compile(pn, true); if (module_fun != mp_const_none) { nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { @@ -139,7 +139,7 @@ void do_file(const char *file) { //printf("----------------\n"); //parse_node_show(pn, 0); //printf("----------------\n"); - mp_obj_t module_fun = mp_compile(pn, MP_FALSE); + mp_obj_t module_fun = mp_compile(pn, false); //printf("----------------\n"); #if MICROPY_EMIT_CPYTHON @@ -166,7 +166,7 @@ void do_file(const char *file) { typedef struct _test_obj_t { mp_obj_base_t base; - MP_BOOL value; + bool value; } test_obj_t; static void test_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) { From a5a01df81d01705b9f04264cc46fbb1bc32641b3 Mon Sep 17 00:00:00 2001 From: ian-v Date: Mon, 6 Jan 2014 14:14:11 -0800 Subject: [PATCH 3/8] Make list and str method tables static --- py/objlist.c | 2 +- py/objstr.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/py/objlist.c b/py/objlist.c index 52eb48837..b642b7015 100644 --- a/py/objlist.c +++ b/py/objlist.c @@ -261,7 +261,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(list_remove_obj, list_remove); static MP_DEFINE_CONST_FUN_OBJ_1(list_reverse_obj, list_reverse); static MP_DEFINE_CONST_FUN_OBJ_2(list_sort_obj, list_sort); -const mp_method_t list_type_methods[] = { +static const mp_method_t list_type_methods[] = { { "append", &list_append_obj }, { "clear", &list_clear_obj }, { "copy", &list_copy_obj }, diff --git a/py/objstr.c b/py/objstr.c index 08e379391..66041c587 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -184,7 +184,7 @@ mp_obj_t str_format(int n_args, const mp_obj_t *args) { static MP_DEFINE_CONST_FUN_OBJ_2(str_join_obj, str_join); static MP_DEFINE_CONST_FUN_OBJ_VAR(str_format_obj, 1, str_format); -const mp_method_t str_type_methods[] = { +static const mp_method_t str_type_methods[] = { { "join", &str_join_obj }, { "format", &str_format_obj }, { NULL, NULL }, // end-of-list sentinel From 501399330ecae4b055120787f08707d4ea1a5532 Mon Sep 17 00:00:00 2001 From: Mark Schafer Date: Tue, 7 Jan 2014 15:01:10 +1300 Subject: [PATCH 4/8] vector logo master with layers inkscape master file has dxf and coloured svg layers. Choose a layer for suitable work. --- logo/vector-logo-2-BW.svg | 587 ++++++++++ logo/vector-logo-2.png | Bin 0 -> 90783 bytes logo/vector-logo-inkscape_master.svg | 1471 ++++++++++++++++++++++++++ 3 files changed, 2058 insertions(+) create mode 100644 logo/vector-logo-2-BW.svg create mode 100644 logo/vector-logo-2.png create mode 100644 logo/vector-logo-inkscape_master.svg diff --git a/logo/vector-logo-2-BW.svg b/logo/vector-logo-2-BW.svg new file mode 100644 index 000000000..d7ff920f9 --- /dev/null +++ b/logo/vector-logo-2-BW.svg @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logo/vector-logo-2.png b/logo/vector-logo-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad2383ff55529517a04245157d25834c161e230 GIT binary patch literal 90783 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 136f67523b10d24dd65cb25e49e07a7e4e5341a1 Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 7 Jan 2014 14:54:15 +0000 Subject: [PATCH 5/8] Factor and simplify Makefile's and mpconfig. --- py/mpconfig.h | 74 +++++++++++++++----- py/py.mk | 100 +++++++++++++++++++++++++++ py/repl.c | 5 ++ py/repl.h | 2 + stm/mpconfigport.h | 5 +- unix-cpy/Makefile | 94 +++++-------------------- unix-cpy/main.c | 1 - unix-cpy/mpconfigport.h | 3 - unix/Makefile | 99 +++++--------------------- unix/main.c | 149 ++++++++++++++++++++-------------------- unix/mpconfigport.h | 5 +- 11 files changed, 278 insertions(+), 259 deletions(-) create mode 100644 py/py.mk diff --git a/py/mpconfig.h b/py/mpconfig.h index 56495d915..8ce432a61 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -4,8 +4,65 @@ #include -#ifndef INT_FMT +// Any options not explicitly set in mpconfigport.h will get default +// values below. + +/*****************************************************************************/ +/* Micro Python emitters */ + +// Whether to emit CPython byte codes (for debugging/testing) +// Enabling this overrides all other emitters +#ifndef MICROPY_EMIT_CPYTHON +#define MICROPY_EMIT_CPYTHON (0) +#endif + +// Whether to emit x64 native code +#ifndef MICROPY_EMIT_X64 +#define MICROPY_EMIT_X64 (0) +#endif + +// Whether to emit thumb native code +#ifndef MICROPY_EMIT_THUMB +#define MICROPY_EMIT_THUMB (0) +#endif + +// Whether to enable the thumb inline assembler +#ifndef MICROPY_EMIT_INLINE_THUMB +#define MICROPY_EMIT_INLINE_THUMB (0) +#endif + +/*****************************************************************************/ +/* Internal debugging stuff */ + +// Whether to collect memory allocation stats +#ifndef MICROPY_MEM_STATS +#define MICROPY_MEM_STATS (0) +#endif + +/*****************************************************************************/ +/* Fine control over Python features */ + +// Whether to include REPL helper function +#ifndef MICROPY_ENABLE_REPL_HELPERS +#define MICROPY_ENABLE_REPL_HELPERS (0) +#endif + +// Whether to support float and complex types +#ifndef MICROPY_ENABLE_FLOAT +#define MICROPY_ENABLE_FLOAT (0) +#endif + +// Whether to support slice object and correspondingly +// slice subscript operators +#ifndef MICROPY_ENABLE_SLICE +#define MICROPY_ENABLE_SLICE (1) +#endif + +/*****************************************************************************/ +/* Miscellaneous settings */ + // printf format spec to use for machine_int_t and friends +#ifndef INT_FMT #ifdef __LP64__ // Archs where machine_int_t == long, long != int #define UINT_FMT "%lu" @@ -16,18 +73,3 @@ #define INT_FMT "%d" #endif #endif //INT_FMT - - -// Any options not explicitly set in mpconfigport.h will get default -// values below. - -// Whether to collect memory allocation stats -#ifndef MICROPY_MEM_STATS -#define MICROPY_MEM_STATS (1) -#endif - -// Whether to support slice object and correspondingly -// slice subscript operators -#ifndef MICROPY_ENABLE_SLICE -#define MICROPY_ENABLE_SLICE (1) -#endif diff --git a/py/py.mk b/py/py.mk new file mode 100644 index 000000000..e673c713c --- /dev/null +++ b/py/py.mk @@ -0,0 +1,100 @@ +# default settings; can be overriden in main Makefile + +ifndef PY_SRC +PY_SRC = ../py +endif + +ifndef BUILD +BUILD = build +endif + +# to create the build directory + +$(BUILD): + mkdir -p $@ + +# where py object files go (they have a name prefix to prevent filename clashes) + +PY_BUILD = $(BUILD)/py. + +# py object files + +PY_O_BASENAME = \ + nlrx86.o \ + nlrx64.o \ + nlrthumb.o \ + malloc.o \ + qstr.o \ + vstr.o \ + unicode.o \ + lexer.o \ + lexerunix.o \ + parse.o \ + scope.o \ + compile.o \ + emitcommon.o \ + emitpass1.o \ + emitcpy.o \ + emitbc.o \ + asmx64.o \ + emitnx64.o \ + asmthumb.o \ + emitnthumb.o \ + emitinlinethumb.o \ + runtime.o \ + map.o \ + obj.o \ + objbool.o \ + objboundmeth.o \ + objcell.o \ + objclass.o \ + objclosure.o \ + objcomplex.o \ + objdict.o \ + objexcept.o \ + objfloat.o \ + objfun.o \ + objgenerator.o \ + objinstance.o \ + objint.o \ + objlist.o \ + objmodule.o \ + objnone.o \ + objrange.o \ + objset.o \ + objslice.o \ + objstr.o \ + objtuple.o \ + objtype.o \ + builtin.o \ + builtinimport.o \ + vm.o \ + showbc.o \ + repl.o \ + +# prepend the build destination prefix to the py object files + +PY_O = $(addprefix $(PY_BUILD), $(PY_O_BASENAME)) + +$(PY_BUILD)emitnx64.o: $(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h + $(CC) $(CFLAGS) -DN_X64 -c -o $@ $< + +$(PY_BUILD)emitnthumb.o: $(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h + $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< + +$(PY_BUILD)%.o: $(PY_SRC)/%.S + $(CC) $(CFLAGS) -c -o $@ $< + +$(PY_BUILD)%.o: $(PY_SRC)/%.c mpconfigport.h + $(CC) $(CFLAGS) -c -o $@ $< + +# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) +$(PY_BUILD)vm.o: $(PY_SRC)/vm.c + $(CC) $(CFLAGS) -O3 -c -o $@ $< + +# header dependencies + +$(PY_BUILD)parse.o: $(PY_SRC)/grammar.h +$(PY_BUILD)compile.o: $(PY_SRC)/grammar.h +$(PY_BUILD)/emitcpy.o: $(PY_SRC)/emit.h +$(PY_BUILD)emitbc.o: $(PY_SRC)/emit.h diff --git a/py/repl.c b/py/repl.c index 4241ef0e4..473313c1e 100644 --- a/py/repl.c +++ b/py/repl.c @@ -1,6 +1,9 @@ #include "misc.h" +#include "mpconfig.h" #include "repl.h" +#if MICROPY_ENABLE_REPL_HELPERS + bool str_startswith_word(const char *str, const char *head) { int i; for (i = 0; str[i] && head[i]; i++) { @@ -42,3 +45,5 @@ bool mp_repl_is_compound_stmt(const char *line) { } return n_paren > 0 || n_brack > 0 || n_brace > 0; } + +#endif // MICROPY_ENABLE_REPL_HELPERS diff --git a/py/repl.h b/py/repl.h index 02fe523ed..23259fa90 100644 --- a/py/repl.h +++ b/py/repl.h @@ -1 +1,3 @@ +#if MICROPY_ENABLE_REPL_HELPERS bool mp_repl_is_compound_stmt(const char *line); +#endif diff --git a/stm/mpconfigport.h b/stm/mpconfigport.h index 4cea332f3..ee90db321 100644 --- a/stm/mpconfigport.h +++ b/stm/mpconfigport.h @@ -2,11 +2,10 @@ // options to control how Micro Python is built -#define MICROPY_ENABLE_FLOAT (1) -#define MICROPY_EMIT_CPYTHON (0) -#define MICROPY_EMIT_X64 (0) #define MICROPY_EMIT_THUMB (1) #define MICROPY_EMIT_INLINE_THUMB (1) +#define MICROPY_ENABLE_REPL_HELPERS (1) +#define MICROPY_ENABLE_FLOAT (1) // type definitions for the specific machine diff --git a/unix-cpy/Makefile b/unix-cpy/Makefile index a1eb9b77e..d2d698713 100644 --- a/unix-cpy/Makefile +++ b/unix-cpy/Makefile @@ -1,95 +1,37 @@ -PYSRC=../py -BUILD=build +# define main target +PROG = cpy +all: $(PROG) +# include py core make definitions +include ../py/py.mk + +# program for deletion +RM = /bin/rm + +# compiler settings CC = gcc -CFLAGS = -I. -I$(PYSRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG +CFLAGS = -I. -I$(PY_SRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG LDFLAGS = -lm +# source files SRC_C = \ main.c \ -PY_O = \ - nlrx86.o \ - nlrx64.o \ - malloc.o \ - qstr.o \ - vstr.o \ - unicode.o \ - lexer.o \ - lexerunix.o \ - parse.o \ - scope.o \ - compile.o \ - emitcommon.o \ - emitpass1.o \ - emitcpy.o \ - runtime.o \ - map.o \ - obj.o \ - objbool.o \ - objboundmeth.o \ - objcell.o \ - objclass.o \ - objclosure.o \ - objcomplex.o \ - objdict.o \ - objexcept.o \ - objfloat.o \ - objfun.o \ - objgenerator.o \ - objinstance.o \ - objint.o \ - objlist.o \ - objmodule.o \ - objnone.o \ - objrange.o \ - objset.o \ - objslice.o \ - objstr.o \ - objtuple.o \ - objtype.o \ - builtin.o \ - builtinimport.o \ - vm.o \ - showbc.o \ - repl.o \ - -OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(PY_O)) +OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) $(PY_O) LIB = -PROG = cpy $(PROG): $(BUILD) $(OBJ) $(CC) -o $@ $(OBJ) $(LIB) $(LDFLAGS) - -$(BUILD): - mkdir -p $@ + strip $(PROG) + size $(PROG) $(BUILD)/%.o: %.c $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD)/%.o: $(PYSRC)/%.S - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h - $(CC) $(CFLAGS) -DN_X64 -c -o $@ $< - -$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h - $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< - -# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) -$(BUILD)/vm.o: $(PYSRC)/vm.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - $(BUILD)/main.o: mpconfigport.h -$(BUILD)/parse.o: $(PYSRC)/grammar.h -$(BUILD)/compile.o: $(PYSRC)/grammar.h -$(BUILD)/emitcpy.o: $(PYSRC)/emit.h -$(BUILD)/emitbc.o: $(PYSRC)/emit.h clean: - /bin/rm -rf $(BUILD) + $(RM) -f $(PROG) + $(RM) -rf $(BUILD) -.PHONY: clean +.PHONY: all clean diff --git a/unix-cpy/main.c b/unix-cpy/main.c index eba97f527..ea85e3275 100644 --- a/unix-cpy/main.c +++ b/unix-cpy/main.c @@ -11,7 +11,6 @@ #include "obj.h" #include "compile.h" #include "runtime0.h" -#include "runtime.h" void do_file(const char *file) { mp_lexer_t *lex = mp_lexer_new_from_file(file); diff --git a/unix-cpy/mpconfigport.h b/unix-cpy/mpconfigport.h index 983b166a5..9e3e32bb4 100644 --- a/unix-cpy/mpconfigport.h +++ b/unix-cpy/mpconfigport.h @@ -2,9 +2,6 @@ #define MICROPY_ENABLE_FLOAT (1) #define MICROPY_EMIT_CPYTHON (1) -#define MICROPY_EMIT_X64 (0) -#define MICROPY_EMIT_THUMB (0) -#define MICROPY_EMIT_INLINE_THUMB (0) // type definitions for the specific machine diff --git a/unix/Makefile b/unix/Makefile index 984f1c3bf..a3faea290 100644 --- a/unix/Makefile +++ b/unix/Makefile @@ -1,106 +1,39 @@ -PYSRC=../py -BUILD=build +# define main target +PROG = py +all: $(PROG) +# include py core make definitions +include ../py/py.mk + +# program for deletion +RM = /bin/rm + +# compiler settings CC = gcc -CFLAGS = -I. -I$(PYSRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG +CFLAGS = -I. -I$(PY_SRC) -Wall -Werror -ansi -std=gnu99 -Os #-DNDEBUG LDFLAGS = -lm +# source files SRC_C = \ main.c \ -PY_O = \ - nlrx86.o \ - nlrx64.o \ - nlrthumb.o \ - malloc.o \ - qstr.o \ - vstr.o \ - unicode.o \ - lexer.o \ - lexerunix.o \ - parse.o \ - scope.o \ - compile.o \ - emitcommon.o \ - emitpass1.o \ - emitcpy.o \ - emitbc.o \ - asmx64.o \ - emitnx64.o \ - asmthumb.o \ - emitnthumb.o \ - emitinlinethumb.o \ - runtime.o \ - map.o \ - obj.o \ - objbool.o \ - objboundmeth.o \ - objcell.o \ - objclass.o \ - objclosure.o \ - objcomplex.o \ - objdict.o \ - objexcept.o \ - objfloat.o \ - objfun.o \ - objgenerator.o \ - objinstance.o \ - objint.o \ - objlist.o \ - objmodule.o \ - objnone.o \ - objrange.o \ - objset.o \ - objslice.o \ - objstr.o \ - objtuple.o \ - objtype.o \ - builtin.o \ - builtinimport.o \ - vm.o \ - showbc.o \ - repl.o \ - -OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(PY_O)) +OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) $(PY_O) LIB = -lreadline # the following is needed for BSD #LIB += -ltermcap -PROG = py $(PROG): $(BUILD) $(OBJ) $(CC) -o $@ $(OBJ) $(LIB) $(LDFLAGS) strip $(PROG) size $(PROG) -$(BUILD): - mkdir -p $@ - $(BUILD)/%.o: %.c $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD)/%.o: $(PYSRC)/%.S - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/emitnx64.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h - $(CC) $(CFLAGS) -DN_X64 -c -o $@ $< - -$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h - $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< - -# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) -$(BUILD)/vm.o: $(PYSRC)/vm.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - $(BUILD)/main.o: mpconfigport.h -$(BUILD)/parse.o: $(PYSRC)/grammar.h -$(BUILD)/compile.o: $(PYSRC)/grammar.h -$(BUILD)/emitcpy.o: $(PYSRC)/emit.h -$(BUILD)/emitbc.o: $(PYSRC)/emit.h clean: - /bin/rm -rf $(BUILD) + $(RM) -f $(PROG) + $(RM) -rf $(BUILD) -.PHONY: clean +.PHONY: all clean diff --git a/unix/main.c b/unix/main.c index a06dc3679..f7277b960 100644 --- a/unix/main.c +++ b/unix/main.c @@ -20,6 +20,52 @@ #include #endif +static void execute_from_lexer(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, bool is_repl) { + if (lex == NULL) { + return; + } + + if (0) { + // just tokenise + while (!mp_lexer_is_kind(lex, MP_TOKEN_END)) { + mp_token_show(mp_lexer_cur(lex)); + mp_lexer_to_next(lex); + } + mp_lexer_free(lex); + return; + } + + mp_parse_node_t pn = mp_parse(lex, input_kind); + mp_lexer_free(lex); + + if (pn == MP_PARSE_NODE_NULL) { + // parse error + return; + } + + //printf("----------------\n"); + //parse_node_show(pn, 0); + //printf("----------------\n"); + + mp_obj_t module_fun = mp_compile(pn, is_repl); + + if (module_fun == mp_const_none) { + // compile error + return; + } + + // execute it + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + rt_call_function_0(module_fun); + nlr_pop(); + } else { + // uncaught exception + mp_obj_print((mp_obj_t)nlr.ret_val); + printf("\n"); + } +} + static char *str_join(const char *s1, int sep_char, const char *s2) { int l1 = strlen(s1); int l2 = strlen(s2); @@ -80,28 +126,11 @@ static void do_repl(void) { } mp_lexer_t *lex = mp_lexer_new_from_str_len("", line, strlen(line), false); - mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT); - mp_lexer_free(lex); - - if (pn != MP_PARSE_NODE_NULL) { - //mp_parse_node_show(pn, 0); - mp_obj_t module_fun = mp_compile(pn, true); - if (module_fun != mp_const_none) { - nlr_buf_t nlr; - if (nlr_push(&nlr) == 0) { - rt_call_function_0(module_fun); - nlr_pop(); - } else { - // uncaught exception - mp_obj_print((mp_obj_t)nlr.ret_val); - printf("\n"); - } - } - } + execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, true); } } -void do_file(const char *file) { +static void do_file(const char *file) { // hack: set dir for import based on where this file is { const char * s = strrchr(file, '/'); @@ -115,53 +144,12 @@ void do_file(const char *file) { } mp_lexer_t *lex = mp_lexer_new_from_file(file); - //const char *pysrc = "def f():\n x=x+1\n print(42)\n"; - //mp_lexer_t *lex = mp_lexer_from_str_len("<>", pysrc, strlen(pysrc), false); - if (lex == NULL) { - return; - } + execute_from_lexer(lex, MP_PARSE_FILE_INPUT, false); +} - if (0) { - // just tokenise - while (!mp_lexer_is_kind(lex, MP_TOKEN_END)) { - mp_token_show(mp_lexer_cur(lex)); - mp_lexer_to_next(lex); - } - mp_lexer_free(lex); - - } else { - // compile - - mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT); - mp_lexer_free(lex); - - if (pn != MP_PARSE_NODE_NULL) { - //printf("----------------\n"); - //parse_node_show(pn, 0); - //printf("----------------\n"); - mp_obj_t module_fun = mp_compile(pn, false); - //printf("----------------\n"); - -#if MICROPY_EMIT_CPYTHON - if (!comp_ok) { - printf("compile error\n"); - } -#else - if (1 && module_fun != mp_const_none) { - // execute it - nlr_buf_t nlr; - if (nlr_push(&nlr) == 0) { - rt_call_function_0(module_fun); - nlr_pop(); - } else { - // uncaught exception - mp_obj_print((mp_obj_t)nlr.ret_val); - printf("\n"); - } - } -#endif - } - } +static void do_str(const char *str) { + mp_lexer_t *lex = mp_lexer_new_from_str_len("", str, strlen(str), false); + execute_from_lexer(lex, MP_PARSE_SINGLE_INPUT, false); } typedef struct _test_obj_t { @@ -192,12 +180,6 @@ static const mp_obj_type_t test_type = { { &mp_const_type }, "Test", .print = test_print, - .make_new = NULL, - .call_n = NULL, - .unary_op = NULL, - .binary_op = NULL, - .getiter = NULL, - .iternext = NULL, .methods = { { "get", &test_get_obj }, { "set", &test_set_obj }, @@ -212,6 +194,11 @@ mp_obj_t test_obj_new(int value) { return o; } +int usage(void) { + printf("usage: py [-c ] []\n"); + return 1; +} + int main(int argc, char **argv) { qstr_init(); rt_init(); @@ -227,12 +214,24 @@ int main(int argc, char **argv) { if (argc == 1) { do_repl(); - } else if (argc == 2) { - do_file(argv[1]); } else { - printf("usage: py []\n"); - return 1; + for (int a = 1; a < argc; a++) { + if (argv[a][0] == '-') { + if (strcmp(argv[a], "-c") == 0) { + if (a + 1 >= argc) { + return usage(); + } + do_str(argv[a + 1]); + a += 1; + } else { + return usage(); + } + } else { + do_file(argv[a]); + } + } } + rt_deinit(); //printf("total bytes = %d\n", m_get_total_bytes_allocated()); diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h index 7a4622b8b..b7901069a 100644 --- a/unix/mpconfigport.h +++ b/unix/mpconfigport.h @@ -5,11 +5,12 @@ #define MICROPY_USE_READLINE (1) #endif -#define MICROPY_ENABLE_FLOAT (1) -#define MICROPY_EMIT_CPYTHON (0) #define MICROPY_EMIT_X64 (1) #define MICROPY_EMIT_THUMB (0) #define MICROPY_EMIT_INLINE_THUMB (0) +#define MICROPY_MEM_STATS (1) +#define MICROPY_ENABLE_REPL_HELPERS (1) +#define MICROPY_ENABLE_FLOAT (1) // type definitions for the specific machine From d3ebe4829d920542e5af462e75179e4f0cadb946 Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 7 Jan 2014 15:20:33 +0000 Subject: [PATCH 6/8] Factor and simplify Makefile's and mpconfig, part 2. --- py/asmx64.c | 8 ++-- py/gc.c | 4 ++ py/lexerunix.c | 5 +++ py/mpconfig.h | 15 +++++++ py/py.mk | 5 +++ py/showbc.c | 4 ++ stm/Makefile | 95 ++++++----------------------------------- stm/mpconfigport.h | 1 + unix-cpy/mpconfigport.h | 3 +- unix/mpconfigport.h | 1 + 10 files changed, 56 insertions(+), 85 deletions(-) diff --git a/py/asmx64.c b/py/asmx64.c index 226d4efee..d3158170f 100644 --- a/py/asmx64.c +++ b/py/asmx64.c @@ -1,16 +1,18 @@ #include #include -#include -#include #include #include "misc.h" -#include "asmx64.h" #include "mpconfig.h" // wrapper around everything in this file #if MICROPY_EMIT_X64 +#include +#include + +#include "asmx64.h" + #if defined(__OpenBSD__) || defined(__MACH__) #define MAP_ANONYMOUS MAP_ANON #endif diff --git a/py/gc.c b/py/gc.c index 7d4cac6e7..054a3cc31 100644 --- a/py/gc.c +++ b/py/gc.c @@ -6,6 +6,8 @@ #include "mpconfig.h" #include "gc.h" +#if MICROPY_ENABLE_GC + // a machine word is big enough to hold a pointer /* #define BYTES_PER_WORD (8) @@ -380,3 +382,5 @@ int main(void) { gc_dump_at(); } */ + +#endif // MICROPY_ENABLE_GC diff --git a/py/lexerunix.c b/py/lexerunix.c index 14c28c16d..5336610ba 100644 --- a/py/lexerunix.c +++ b/py/lexerunix.c @@ -4,8 +4,11 @@ #include #include "misc.h" +#include "mpconfig.h" #include "lexer.h" +#if MICROPY_ENABLE_LEXER_UNIX + typedef struct _str_buf_t { bool free; // free src_beg when done const char *src_beg; // beginning of source @@ -78,3 +81,5 @@ mp_lexer_t *mp_import_open_file(qstr mod_name) { vstr_printf(vstr, "%s.py", qstr_str(mod_name)); return mp_lexer_new_from_file(vstr_str(vstr)); // TODO does lexer need to copy the string? can we free it here? } + +#endif // MICROPY_ENABLE_LEXER_UNIX diff --git a/py/mpconfig.h b/py/mpconfig.h index 8ce432a61..2017ba366 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -39,14 +39,29 @@ #define MICROPY_MEM_STATS (0) #endif +// Whether to build code to show byte code +#ifndef MICROPY_SHOW_BC +#define MICROPY_SHOW_BC (0) +#endif + /*****************************************************************************/ /* Fine control over Python features */ +// Whether to include the garbage collector +#ifndef MICROPY_ENABLE_GC +#define MICROPY_ENABLE_GC (0) +#endif + // Whether to include REPL helper function #ifndef MICROPY_ENABLE_REPL_HELPERS #define MICROPY_ENABLE_REPL_HELPERS (0) #endif +// Whether to include lexer helper function for unix +#ifndef MICROPY_ENABLE_LEXER_UNIX +#define MICROPY_ENABLE_LEXER_UNIX (0) +#endif + // Whether to support float and complex types #ifndef MICROPY_ENABLE_FLOAT #define MICROPY_ENABLE_FLOAT (0) diff --git a/py/py.mk b/py/py.mk index e673c713c..3ed8a3e3d 100644 --- a/py/py.mk +++ b/py/py.mk @@ -24,6 +24,7 @@ PY_O_BASENAME = \ nlrx64.o \ nlrthumb.o \ malloc.o \ + gc.o \ qstr.o \ vstr.o \ unicode.o \ @@ -88,6 +89,10 @@ $(PY_BUILD)%.o: $(PY_SRC)/%.S $(PY_BUILD)%.o: $(PY_SRC)/%.c mpconfigport.h $(CC) $(CFLAGS) -c -o $@ $< +# optimising gc for speed; 5ms down to 4ms on pybv2 +$(PY_BUILD)gc.o: $(PY_SRC)/gc.c + $(CC) $(CFLAGS) -O3 -c -o $@ $< + # optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) $(PY_BUILD)vm.o: $(PY_SRC)/vm.c $(CC) $(CFLAGS) -O3 -c -o $@ $< diff --git a/py/showbc.c b/py/showbc.c index eb7d41b24..aea0aff67 100644 --- a/py/showbc.c +++ b/py/showbc.c @@ -8,6 +8,8 @@ #include "mpconfig.h" #include "bc0.h" +#if MICROPY_SHOW_BC + #define DECODE_UINT do { unum = *ip++; if (unum > 127) { unum = ((unum & 0x3f) << 8) | (*ip++); } } while (0) #define DECODE_ULABEL do { unum = (ip[0] | (ip[1] << 8)); ip += 2; } while (0) #define DECODE_SLABEL do { unum = (ip[0] | (ip[1] << 8)) - 0x8000; ip += 2; } while (0) @@ -363,3 +365,5 @@ void mp_show_byte_code(const byte *ip, int len) { printf("\n"); } } + +#endif // MICROPY_SHOW_BC diff --git a/stm/Makefile b/stm/Makefile index cd998dd88..fecd52527 100644 --- a/stm/Makefile +++ b/stm/Makefile @@ -1,9 +1,16 @@ +# define main target +all: all2 + +# include py core make definitions +include ../py/py.mk + +# program for deletion +RM = /bin/rm + STMSRC=lib #STMOTGSRC=lib-otg FATFSSRC=fatfs CC3KSRC=cc3k -PYSRC=../py -BUILD=build DFU=../tools/dfu.py TARGET=PYBOARD @@ -11,7 +18,7 @@ AS = arm-none-eabi-as CC = arm-none-eabi-gcc LD = arm-none-eabi-ld CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mabi=aapcs-linux -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -Wdouble-promotion -DSTM32F40XX -DHSE_VALUE=8000000 -CFLAGS = -I. -I$(PYSRC) -I$(FATFSSRC) -I$(STMSRC) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4) -D$(TARGET) +CFLAGS = -I. -I$(PY_SRC) -I$(FATFSSRC) -I$(STMSRC) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4) -D$(TARGET) #CFLAGS += -I$(STMOTGSRC) -DUSE_HOST_MODE -DUSE_OTG_MODE LDFLAGS = --nostdlib -T stm32f405.ld @@ -43,53 +50,6 @@ SRC_S = \ startup_stm32f40xx.s \ gchelper.s \ -PY_O = \ - nlrthumb.o \ - gc.o \ - malloc.o \ - qstr.o \ - vstr.o \ - unicode.o \ - lexer.o \ - parse.o \ - scope.o \ - compile.o \ - emitcommon.o \ - emitpass1.o \ - emitbc.o \ - asmthumb.o \ - emitnthumb.o \ - emitinlinethumb.o \ - runtime.o \ - map.o \ - obj.o \ - objbool.o \ - objboundmeth.o \ - objcell.o \ - objclass.o \ - objclosure.o \ - objcomplex.o \ - objdict.o \ - objexcept.o \ - objfloat.o \ - objfun.o \ - objgenerator.o \ - objinstance.o \ - objint.o \ - objlist.o \ - objmodule.o \ - objnone.o \ - objrange.o \ - objset.o \ - objslice.o \ - objstr.o \ - objtuple.o \ - objtype.o \ - builtin.o \ - builtinimport.o \ - vm.o \ - repl.o \ - SRC_FATFS = \ ff.c \ diskio.c \ @@ -146,10 +106,10 @@ SRC_CC3K = \ ccspi.c \ pybcc3k.c \ -OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(PY_O) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o)) +OBJ = $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o)) $(PY_O) #OBJ += $(addprefix $(BUILD)/, $(SRC_STM_OTG:.c=.o)) -all: $(BUILD) $(BUILD)/flash.dfu +all2: $(BUILD) $(BUILD)/flash.dfu $(BUILD)/flash.dfu: $(BUILD)/flash0.bin $(BUILD)/flash1.bin python $(DFU) -b 0x08000000:$(BUILD)/flash0.bin -b 0x08020000:$(BUILD)/flash1.bin $@ @@ -164,9 +124,6 @@ $(BUILD)/flash.elf: $(OBJ) $(LD) $(LDFLAGS) -o $@ $(OBJ) arm-none-eabi-size $@ -$(BUILD): - mkdir -p $@ - $(BUILD)/%.o: %.s $(AS) -o $@ $< @@ -185,31 +142,7 @@ $(BUILD)/%.o: $(STMSRC)/%.c $(BUILD)/%.o: $(CC3KSRC)/%.c $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD)/%.o: $(PYSRC)/%.s - $(AS) -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.S - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/%.o: $(PYSRC)/%.c mpconfigport.h - $(CC) $(CFLAGS) -c -o $@ $< - -$(BUILD)/emitnthumb.o: $(PYSRC)/emitnative.c $(PYSRC)/emit.h - $(CC) $(CFLAGS) -DN_THUMB -c -o $@ $< - -# optimising gc for speed; 5ms down to 4ms -$(BUILD)/gc.o: $(PYSRC)/gc.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - -# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster) -$(BUILD)/vm.o: $(PYSRC)/vm.c - $(CC) $(CFLAGS) -O3 -c -o $@ $< - -$(BUILD)/parse.o: $(PYSRC)/grammar.h -$(BUILD)/compile.o: $(PYSRC)/grammar.h -$(BUILD)/emitbc.o: $(PYSRC)/emit.h - clean: - /bin/rm -rf $(BUILD) + $(RM) -rf $(BUILD) -.PHONY: all clean +.PHONY: all all2 clean diff --git a/stm/mpconfigport.h b/stm/mpconfigport.h index ee90db321..dfa46cc50 100644 --- a/stm/mpconfigport.h +++ b/stm/mpconfigport.h @@ -4,6 +4,7 @@ #define MICROPY_EMIT_THUMB (1) #define MICROPY_EMIT_INLINE_THUMB (1) +#define MICROPY_ENABLE_GC (1) #define MICROPY_ENABLE_REPL_HELPERS (1) #define MICROPY_ENABLE_FLOAT (1) diff --git a/unix-cpy/mpconfigport.h b/unix-cpy/mpconfigport.h index 9e3e32bb4..3fc186677 100644 --- a/unix-cpy/mpconfigport.h +++ b/unix-cpy/mpconfigport.h @@ -1,7 +1,8 @@ // options to control how Micro Python is built -#define MICROPY_ENABLE_FLOAT (1) #define MICROPY_EMIT_CPYTHON (1) +#define MICROPY_ENABLE_LEXER_UNIX (1) +#define MICROPY_ENABLE_FLOAT (1) // type definitions for the specific machine diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h index b7901069a..832764121 100644 --- a/unix/mpconfigport.h +++ b/unix/mpconfigport.h @@ -10,6 +10,7 @@ #define MICROPY_EMIT_INLINE_THUMB (0) #define MICROPY_MEM_STATS (1) #define MICROPY_ENABLE_REPL_HELPERS (1) +#define MICROPY_ENABLE_LEXER_UNIX (1) #define MICROPY_ENABLE_FLOAT (1) // type definitions for the specific machine From 7b21c2d8f01b33b35463cb22487b1235aa7446a4 Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 7 Jan 2014 16:54:58 +0000 Subject: [PATCH 7/8] py: Fix allocation of unique code blocks. --- py/objmodule.c | 4 +++- py/runtime.c | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/py/objmodule.c b/py/objmodule.c index 3e7a0f7fc..7b92b76f4 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -6,6 +6,7 @@ #include "nlr.h" #include "misc.h" #include "mpconfig.h" +#include "mpqstr.h" #include "obj.h" #include "runtime.h" #include "map.h" @@ -31,7 +32,8 @@ mp_obj_t mp_obj_new_module(qstr module_name) { mp_obj_module_t *o = m_new_obj(mp_obj_module_t); o->base.type = &module_type; o->name = module_name; - o->globals = mp_map_new(MP_MAP_QSTR, 0); + o->globals = mp_map_new(MP_MAP_QSTR, 1); + mp_qstr_map_lookup(o->globals, MP_QSTR___name__, true)->value = mp_obj_new_str(module_name); return o; } diff --git a/py/runtime.c b/py/runtime.c index 0457f0df4..a5dafb190 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -61,7 +61,8 @@ typedef struct _mp_code_t { } mp_code_t; static int next_unique_code_id; -static mp_code_t *unique_codes; +static machine_uint_t unique_codes_alloc = 0; +static mp_code_t *unique_codes = NULL; #ifdef WRITE_CODE FILE *fp_write_code = NULL; @@ -126,6 +127,7 @@ void rt_init(void) { mp_qstr_map_lookup(&map_builtins, MP_QSTR_sum, true)->value = rt_make_function_var(1, mp_builtin_sum); next_unique_code_id = 1; // 0 indicates "no code" + unique_codes_alloc = 0; unique_codes = NULL; #ifdef WRITE_CODE @@ -134,6 +136,7 @@ void rt_init(void) { } void rt_deinit(void) { + m_del(mp_code_t, unique_codes, unique_codes_alloc); #ifdef WRITE_CODE if (fp_write_code != NULL) { fclose(fp_write_code); @@ -146,18 +149,20 @@ int rt_get_unique_code_id(void) { } static void alloc_unique_codes(void) { - if (unique_codes == NULL) { - unique_codes = m_new(mp_code_t, next_unique_code_id + 10); // XXX hack until we fix the REPL allocation problem - for (int i = 0; i < next_unique_code_id; i++) { + if (next_unique_code_id > unique_codes_alloc) { + // increase size of unique_codes table + unique_codes = m_renew(mp_code_t, unique_codes, unique_codes_alloc, next_unique_code_id); + for (int i = unique_codes_alloc; i < next_unique_code_id; i++) { unique_codes[i].kind = MP_CODE_NONE; } + unique_codes_alloc = next_unique_code_id; } } void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, int n_locals, int n_stack, bool is_generator) { alloc_unique_codes(); - assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); + assert(1 <= unique_code_id && unique_code_id < next_unique_code_id && unique_codes[unique_code_id].kind == MP_CODE_NONE); unique_codes[unique_code_id].kind = MP_CODE_BYTE; unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = n_locals; @@ -192,7 +197,7 @@ void rt_assign_byte_code(int unique_code_id, byte *code, uint len, int n_args, i void rt_assign_native_code(int unique_code_id, void *fun, uint len, int n_args) { alloc_unique_codes(); - assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); + assert(1 <= unique_code_id && unique_code_id < next_unique_code_id && unique_codes[unique_code_id].kind == MP_CODE_NONE); unique_codes[unique_code_id].kind = MP_CODE_NATIVE; unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; @@ -225,7 +230,7 @@ void rt_assign_native_code(int unique_code_id, void *fun, uint len, int n_args) void rt_assign_inline_asm_code(int unique_code_id, void *fun, uint len, int n_args) { alloc_unique_codes(); - assert(1 <= unique_code_id && unique_code_id < next_unique_code_id); + assert(1 <= unique_code_id && unique_code_id < next_unique_code_id && unique_codes[unique_code_id].kind == MP_CODE_NONE); unique_codes[unique_code_id].kind = MP_CODE_INLINE_ASM; unique_codes[unique_code_id].n_args = n_args; unique_codes[unique_code_id].n_locals = 0; From fd04bb3bacf5dbc4d79c04a49520e3e81abb7352 Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 7 Jan 2014 17:14:05 +0000 Subject: [PATCH 8/8] Add some example scripts for pyboard (some can run on PC). --- examples/accellog.py | 14 ++++++++++++++ examples/conwaylife.py | 43 ++++++++++++++++++++++++++++++++++++++++++ examples/lcd.py | 36 +++++++++++++++++++++++++++++++++++ examples/ledangle.py | 22 +++++++++++++++++++++ examples/mandel.py | 32 +++++++++++++++++++------------ examples/pyb.py | 11 +++++++++++ 6 files changed, 146 insertions(+), 12 deletions(-) create mode 100644 examples/accellog.py create mode 100644 examples/conwaylife.py create mode 100644 examples/lcd.py create mode 100644 examples/ledangle.py create mode 100644 examples/pyb.py diff --git a/examples/accellog.py b/examples/accellog.py new file mode 100644 index 000000000..81f44f19a --- /dev/null +++ b/examples/accellog.py @@ -0,0 +1,14 @@ +# log the accelerometer values to a file, 1 per second + +f = open('motion.dat', 'w') # open the file for writing + +for i in range(60): # loop 60 times + time = pyb.time() # get the current time + accel = pyb.accel() # get the accelerometer data + + # write time and x,y,z values to the file + f.write('{} {} {} {}\n'.format(time, accel[0], accel[1], accel[2])) + + pyb.delay(1000) # wait 1000 ms = 1 second + +f.close() # close the file diff --git a/examples/conwaylife.py b/examples/conwaylife.py new file mode 100644 index 000000000..fb62ce69e --- /dev/null +++ b/examples/conwaylife.py @@ -0,0 +1,43 @@ +# do 1 iteration of Conway's Game of Life +def conway_step(): + for x in range(128): # loop over x coordinates + for y in range(32): # loop over y coordinates + # count number of neigbours + num_neighbours = (lcd.get(x - 1, y - 1) + + lcd.get(x, y - 1) + + lcd.get(x + 1, y - 1) + + lcd.get(x - 1, y) + + lcd.get(x + 1, y) + + lcd.get(x + 1, y + 1) + + lcd.get(x, y + 1) + + lcd.get(x - 1, y + 1)) + + # check if the centre cell is alive or not + self = lcd.get(x, y) + + # apply the rules of life + if self and not (2 <= num_neighbours <= 3): + lcd.reset(x, y) # not enough, or too many neighbours: cell dies + elif not self and num_neighbours == 3: + lcd.set(x, y) # exactly 3 neigbours around an empty cell: cell is born + +# randomise the start +def conway_rand(): + lcd.clear() # clear the LCD + for x in range(128): # loop over x coordinates + for y in range(32): # loop over y coordinates + if pyb.rand() & 1: # get a 1-bit random number + lcd.set(x, y) # set the pixel randomly + +# loop for a certain number of frames, doing iterations of Conway's Game of Life +def conway_go(num_frames): + for i in range(num_frames): + conway_step() # do 1 iteration + lcd.show() # update the LCD + +# PC testing +import lcd +import pyb +lcd = lcd.LCD(128, 32) +conway_rand() +conway_go(100) diff --git a/examples/lcd.py b/examples/lcd.py new file mode 100644 index 000000000..3303337bf --- /dev/null +++ b/examples/lcd.py @@ -0,0 +1,36 @@ +# LCD testing object for PC +# uses double buffering +class LCD: + def __init__(self, width, height): + self.width = width + self.height = height + self.buf1 = [[0 for x in range(self.width)] for y in range(self.height)] + self.buf2 = [[0 for x in range(self.width)] for y in range(self.height)] + + def clear(self): + for y in range(self.height): + for x in range(self.width): + self.buf1[y][x] = self.buf2[y][x] = 0 + + def show(self): + print('') # blank line to separate frames + for y in range(self.height): + for x in range(self.width): + self.buf1[y][x] = self.buf2[y][x] + for y in range(self.height): + row = ''.join(['*' if self.buf1[y][x] else ' ' for x in range(self.width)]) + print(row) + + def get(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + return self.buf1[y][x] + else: + return 0 + + def reset(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + self.buf2[y][x] = 0 + + def set(self, x, y): + if 0 <= x < self.width and 0 <= y < self.height: + self.buf2[y][x] = 1 diff --git a/examples/ledangle.py b/examples/ledangle.py new file mode 100644 index 000000000..35c9148a4 --- /dev/null +++ b/examples/ledangle.py @@ -0,0 +1,22 @@ +def led_angle(seconds_to_run_for): + # make LED objects + l1 = pyb.Led(1) + l2 = pyb.Led(2) + + for i in range(20 * seconds_to_run_for): + # get x-axis + accel = pyb.accel()[0] + + # turn on LEDs depending on angle + if accel < -10: + l1.on() + l2.off() + elif accel > 10: + l1.off() + l2.on() + else: + l1.off() + l2.off() + + # delay so that loop runs at at 1/50ms = 20Hz + pyb.delay(50) diff --git a/examples/mandel.py b/examples/mandel.py index b13b7d87f..996132a91 100644 --- a/examples/mandel.py +++ b/examples/mandel.py @@ -1,14 +1,22 @@ -@micropython.native -def in_set(c): - z = 0 - for i in range(40): - z = z*z + c - if abs(z) > 60: - return False - return True +def mandelbrot(): + # returns True if c, complex, is in the Mandelbrot set + @micropython.native + def in_set(c): + z = 0 + for i in range(40): + z = z*z + c + if abs(z) > 60: + return False + return True -for v in range(31): - line = [] + lcd.clear() for u in range(91): - line.append('*' if in_set((u / 30 - 2) + (v / 15 - 1) * 1j) else ' ') - print(''.join(line)) + for v in range(31): + if in_set((u / 30 - 2) + (v / 15 - 1) * 1j): + lcd.set(u, v) + lcd.show() + +# PC testing +import lcd +lcd = lcd.LCD(128, 32) +mandelbrot() diff --git a/examples/pyb.py b/examples/pyb.py new file mode 100644 index 000000000..5e24f40e4 --- /dev/null +++ b/examples/pyb.py @@ -0,0 +1,11 @@ +# pyboard testing functions for PC + +def delay(n): + pass + +rand_seed = 1 +def rand(): + global rand_seed + # for these choice of numbers, see P L'Ecuyer, "Tables of linear congruential generators of different sizes and good lattice structure" + rand_seed = (rand_seed * 653276) % 8388593 + return rand_seed