Merge branch 'cplusplus' of https://github.com/ian-v/micropython into ian-v-cplusplus
Conflicts:
py/objcomplex.c
diff --git a/py/misc.h b/py/misc.h
index 153218b..1bf4d8f 100644
--- a/py/misc.h
+++ b/py/misc.h
@@ -5,11 +5,7 @@
/** types *******************************************************/
-typedef int bool;
-enum {
- false = 0,
- true = 1
-};
+#include <stdbool.h>
typedef unsigned char byte;
typedef unsigned int uint;
diff --git a/py/obj.h b/py/obj.h
index 1ba7427..49167bf 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -15,15 +15,14 @@
typedef machine_float_t mp_float_t;
#endif
-// Anything that wants to be a Micro Python object must
-// have mp_obj_base_t as its first member (except NULL and small ints)
+// 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 @@
#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 @@
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:
@@ -108,6 +108,8 @@
*/
};
+typedef struct _mp_obj_type_t mp_obj_type_t;
+
// Constant objects, globally accessible
extern const mp_obj_type_t mp_const_type;
@@ -241,6 +243,7 @@
// for const function objects, make an empty, const map
// such functions won't be able to access the global scope, but that's probably okay
} mp_obj_fun_native_t;
+
extern const mp_obj_type_t fun_native_type;
extern const mp_obj_type_t fun_bc_type;
void mp_obj_fun_bc_get(mp_obj_t self_in, int *n_args, uint *n_state, const byte **code);
diff --git a/py/objbool.c b/py/objbool.c
index 77394da..cfab7db 100644
--- a/py/objbool.c
+++ b/py/objbool.c
@@ -34,14 +34,8 @@
const mp_obj_type_t bool_type = {
{ &mp_const_type },
"bool",
- bool_print, // print
- bool_make_new, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .print = bool_print,
+ .make_new = bool_make_new,
};
static const mp_obj_bool_t false_obj = {{&bool_type}, false};
diff --git a/py/objboundmeth.c b/py/objboundmeth.c
index 4e6d2e0..78e5c62 100644
--- a/py/objboundmeth.c
+++ b/py/objboundmeth.c
@@ -36,14 +36,7 @@
const mp_obj_type_t bound_meth_type = {
{ &mp_const_type },
"bound_method",
- NULL, // print
- NULL, // make_new
- bound_meth_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .call_n = bound_meth_call_n,
};
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 3465f99..264125b 100644
--- a/py/objcell.c
+++ b/py/objcell.c
@@ -26,14 +26,6 @@
const mp_obj_type_t cell_type = {
{ &mp_const_type },
"cell",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
};
mp_obj_t mp_obj_new_cell(mp_obj_t obj) {
diff --git a/py/objclass.c b/py/objclass.c
index 536abdf..d13d177 100644
--- a/py/objclass.c
+++ b/py/objclass.c
@@ -63,14 +63,7 @@
const mp_obj_type_t class_type = {
{ &mp_const_type },
"class",
- NULL, // print
- NULL, // make_new
- class_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .call_n = class_call_n,
};
mp_obj_t mp_obj_new_class(mp_map_t *class_locals) {
diff --git a/py/objclosure.c b/py/objclosure.c
index 3317eb8..b372ee6 100644
--- a/py/objclosure.c
+++ b/py/objclosure.c
@@ -35,14 +35,7 @@
const mp_obj_type_t closure_type = {
{ &mp_const_type },
"closure",
- NULL, // print
- NULL, // make_new
- closure_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .call_n = closure_call_n,
};
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 46f43b5..1036bae 100644
--- a/py/objcomplex.c
+++ b/py/objcomplex.c
@@ -87,14 +87,10 @@
const mp_obj_type_t complex_type = {
{ &mp_const_type },
"complex",
- complex_print, // print
- complex_make_new, // make_new
- NULL, // call_n
- complex_unary_op, // unary_op
- complex_binary_op, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = { { NULL, NULL }, },
+ .print = complex_print,
+ .make_new = complex_make_new,
+ .unary_op = complex_unary_op,
+ .binary_op = complex_binary_op,
};
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 b3e21ae..66a442f 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -66,8 +66,6 @@
.print = dict_print,
.make_new = dict_make_new,
.binary_op = dict_binary_op,
- .getiter = NULL,
- .methods = {{NULL, NULL},},
};
mp_obj_t mp_obj_new_dict(int n_args) {
diff --git a/py/objexcept.c b/py/objexcept.c
index 22b8c58..829b147 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -38,14 +38,7 @@
const mp_obj_type_t exception_type = {
{ &mp_const_type },
"exception",
- exception_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .print = exception_print,
};
mp_obj_t mp_obj_new_exception(qstr id) {
diff --git a/py/objfloat.c b/py/objfloat.c
index 336ae59..d21472d 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -68,7 +68,6 @@
.make_new = float_make_new,
.unary_op = float_unary_op,
.binary_op = float_binary_op,
- .methods = { { NULL, NULL }, },
};
mp_obj_t mp_obj_new_float(mp_float_t value) {
diff --git a/py/objfun.c b/py/objfun.c
index 0db6459..51b4329 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -72,16 +72,7 @@
const mp_obj_type_t fun_native_type = {
{ &mp_const_type },
"function",
- NULL, // print
- NULL, // make_new
- fun_native_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {
- {NULL, NULL}, // end-of-list sentinel
- },
+ .call_n = fun_native_call_n,
};
mp_obj_t rt_make_function_0(mp_fun_0_t fun) {
@@ -174,16 +165,7 @@
const mp_obj_type_t fun_bc_type = {
{ &mp_const_type },
"function",
- NULL, // print
- NULL, // make_new
- fun_bc_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {
- {NULL, NULL}, // end-of-list sentinel
- },
+ .call_n = fun_bc_call_n,
};
mp_obj_t mp_obj_new_fun_bc(int n_args, uint n_state, const byte *code) {
@@ -288,16 +270,7 @@
static const mp_obj_type_t fun_asm_type = {
{ &mp_const_type },
"function",
- NULL, // print
- NULL, // make_new
- fun_asm_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {
- {NULL, NULL}, // end-of-list sentinel
- },
+ .call_n = fun_asm_call_n,
};
mp_obj_t mp_obj_new_fun_asm(uint n_args, void *fun) {
diff --git a/py/objgenerator.c b/py/objgenerator.c
index a91b0d6..7eeb4ef 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -39,14 +39,7 @@
const mp_obj_type_t gen_wrap_type = {
{ &mp_const_type },
"generator",
- NULL, // print
- NULL, // make_new
- gen_wrap_call_n, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .call_n = gen_wrap_call_n,
};
mp_obj_t mp_obj_new_gen_wrap(uint n_locals, uint n_stack, mp_obj_t fun) {
@@ -94,14 +87,9 @@
const mp_obj_type_t gen_instance_type = {
{ &mp_const_type },
"generator",
- gen_instance_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- gen_instance_getiter, // getiter
- gen_instance_iternext, // iternext
- .methods = {{NULL, NULL},},
+ .print = gen_instance_print,
+ .getiter = gen_instance_getiter,
+ .iternext = gen_instance_iternext,
};
// args are in reverse order in the array
diff --git a/py/objinstance.c b/py/objinstance.c
index 8ef2773..209643e 100644
--- a/py/objinstance.c
+++ b/py/objinstance.c
@@ -92,14 +92,6 @@
const mp_obj_type_t instance_type = {
{ &mp_const_type },
"instance",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
};
mp_obj_t mp_obj_new_instance(mp_obj_t class) {
diff --git a/py/objint.c b/py/objint.c
index 8d69c4e..9cd5eba 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -34,7 +34,6 @@
{ &mp_const_type },
"int",
.make_new = int_make_new,
- .methods = { { NULL, NULL }, },
};
mp_obj_t mp_obj_new_int(machine_int_t value) {
diff --git a/py/objlist.c b/py/objlist.c
index 02a6b15..df9e197 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -57,6 +57,7 @@
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) {
@@ -260,27 +261,28 @@
static MP_DEFINE_CONST_FUN_OBJ_1(list_reverse_obj, list_reverse);
static MP_DEFINE_CONST_FUN_OBJ_2(list_sort_obj, list_sort);
+static 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 },
+ { "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
+};
+
const mp_obj_type_t list_type = {
{ &mp_const_type },
"list",
.print = list_print,
.make_new = list_make_new,
- .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 +346,6 @@
{ &mp_const_type },
"list_iterator",
.iternext = list_it_iternext,
- .methods = { { NULL, 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 2d6f955..3e7a0f7 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -24,14 +24,7 @@
const mp_obj_type_t module_type = {
{ &mp_const_type },
"module",
- module_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .print = module_print,
};
mp_obj_t mp_obj_new_module(qstr module_name) {
diff --git a/py/objnone.c b/py/objnone.c
index 877e61f..c0efe6c 100644
--- a/py/objnone.c
+++ b/py/objnone.c
@@ -18,7 +18,6 @@
{ &mp_const_type },
"NoneType",
.print = none_print,
- .methods = {{NULL, NULL},},
};
static const mp_obj_none_t none_obj = {{&none_type}};
diff --git a/py/objrange.c b/py/objrange.c
index 1ef4267..a2a0e67 100644
--- a/py/objrange.c
+++ b/py/objrange.c
@@ -25,14 +25,7 @@
static const mp_obj_type_t range_type = {
{ &mp_const_type} ,
"range",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- range_getiter,
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .getiter = range_getiter,
};
// range is a class and instances are immutable sequence objects
@@ -70,14 +63,7 @@
static const mp_obj_type_t range_it_type = {
{ &mp_const_type },
"range_iterator",
- NULL, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- range_it_iternext,
- .methods = {{NULL, NULL},},
+ .iternext = range_it_iternext,
};
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 dd9a4d1..67dab11 100644
--- a/py/objset.c
+++ b/py/objset.c
@@ -57,14 +57,8 @@
const mp_obj_type_t set_type = {
{ &mp_const_type },
"set",
- set_print, // print
- set_make_new, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = { { NULL, NULL }, },
+ .print = set_print,
+ .make_new = set_make_new,
};
mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items) {
diff --git a/py/objslice.c b/py/objslice.c
index da69b92..d95ccef 100644
--- a/py/objslice.c
+++ b/py/objslice.c
@@ -23,14 +23,7 @@
const mp_obj_type_t ellipsis_type = {
{ &mp_const_type },
"ellipsis",
- ellipsis_print, // print
- NULL, // make_new
- NULL, // call_n
- NULL, // unary_op
- NULL, // binary_op
- NULL, // getiter
- NULL, // iternext
- .methods = {{NULL, NULL},},
+ .print = ellipsis_print,
};
static const mp_obj_ellipsis_t ellipsis_obj = {{&ellipsis_type}};
@@ -58,7 +51,6 @@
{ &mp_const_type },
"slice",
.print = slice_print,
- .methods = { { NULL, 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 db3e0be..cc9f7f8 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -184,17 +184,19 @@
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);
+static 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 +237,6 @@
{ &mp_const_type },
"str_iterator",
.iternext = str_it_iternext,
- .methods = { { NULL, 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 ceca420..593b14e 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -103,7 +103,6 @@
.make_new = tuple_make_new,
.binary_op = tuple_binary_op,
.getiter = tuple_getiter,
- .methods = {{NULL, NULL},},
};
// the zero-length tuple
@@ -166,7 +165,6 @@
{ &mp_const_type },
"tuple_iterator",
.iternext = tuple_it_iternext,
- .methods = {{NULL, NULL},},
};
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 37d40b3..8778c18 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -27,5 +27,4 @@
"type",
.print = type_print,
.call_n = type_call_n,
- .methods = {{NULL, NULL},},
};
diff --git a/py/runtime.c b/py/runtime.c
index 6bc71ab..0457f0d 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -775,10 +775,12 @@
} 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);
+ }
}
}
}
@@ -799,12 +801,14 @@
} 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;
+ }
}
}
}