summaryrefslogtreecommitdiff
path: root/examples/natmod
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-06-10 13:58:39 +1000
committerDamien George <damien@micropython.org>2022-06-10 16:42:43 +1000
commit1f1afae622a26a0484c8187b02c46db3eb0b053d (patch)
treee8549c43b6db35a19308b80f0c9c8d22a92e734f /examples/natmod
parent0e556f22a22ff26cedcacf08a2e273e916b76c30 (diff)
examples/natmod/features3: Add example to test more natmod features.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'examples/natmod')
-rw-r--r--examples/natmod/features3/Makefile14
-rw-r--r--examples/natmod/features3/features3.c60
2 files changed, 74 insertions, 0 deletions
diff --git a/examples/natmod/features3/Makefile b/examples/natmod/features3/Makefile
new file mode 100644
index 000000000..4a5f71b8f
--- /dev/null
+++ b/examples/natmod/features3/Makefile
@@ -0,0 +1,14 @@
+# Location of top-level MicroPython directory
+MPY_DIR = ../../..
+
+# Name of module
+MOD = features3
+
+# Source files (.c or .py)
+SRC = features3.c
+
+# Architecture to build for (x86, x64, armv7m, xtensa, xtensawin)
+ARCH = x64
+
+# Include to get the rules for compiling and linking the module
+include $(MPY_DIR)/py/dynruntime.mk
diff --git a/examples/natmod/features3/features3.c b/examples/natmod/features3/features3.c
new file mode 100644
index 000000000..20efd67cd
--- /dev/null
+++ b/examples/natmod/features3/features3.c
@@ -0,0 +1,60 @@
+/* This example demonstrates the following features in a native module:
+ - using types
+ - using constant objects
+ - creating dictionaries
+*/
+
+// Include the header file to get access to the MicroPython API.
+#include "py/dynruntime.h"
+
+// A function that returns a tuple of object types.
+STATIC mp_obj_t get_types(void) {
+ return mp_obj_new_tuple(9, ((mp_obj_t []) {
+ MP_OBJ_FROM_PTR(&mp_type_type),
+ MP_OBJ_FROM_PTR(&mp_type_NoneType),
+ MP_OBJ_FROM_PTR(&mp_type_bool),
+ MP_OBJ_FROM_PTR(&mp_type_int),
+ MP_OBJ_FROM_PTR(&mp_type_str),
+ MP_OBJ_FROM_PTR(&mp_type_bytes),
+ MP_OBJ_FROM_PTR(&mp_type_tuple),
+ MP_OBJ_FROM_PTR(&mp_type_list),
+ MP_OBJ_FROM_PTR(&mp_type_dict),
+ }));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(get_types_obj, get_types);
+
+// A function that returns a tuple of constant objects.
+STATIC mp_obj_t get_const_objects(void) {
+ return mp_obj_new_tuple(5, ((mp_obj_t []) {
+ mp_const_none,
+ mp_const_false,
+ mp_const_true,
+ mp_const_empty_bytes,
+ mp_const_empty_tuple,
+ }));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(get_const_objects_obj, get_const_objects);
+
+// A function that creates a dictionary from the given arguments.
+STATIC mp_obj_t make_dict(size_t n_args, const mp_obj_t *args) {
+ mp_obj_t dict = mp_obj_new_dict(n_args / 2);
+ for (; n_args >= 2; n_args -= 2, args += 2) {
+ mp_obj_dict_store(dict, args[0], args[1]);
+ }
+ return dict;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(make_dict_obj, 0, MP_OBJ_FUN_ARGS_MAX, make_dict);
+
+// This is the entry point and is called when the module is imported.
+mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) {
+ // This must be first, it sets up the globals dict and other things.
+ MP_DYNRUNTIME_INIT_ENTRY
+
+ // Make the functions available in the module's namespace.
+ mp_store_global(MP_QSTR_make_dict, MP_OBJ_FROM_PTR(&make_dict_obj));
+ mp_store_global(MP_QSTR_get_types, MP_OBJ_FROM_PTR(&get_types_obj));
+ mp_store_global(MP_QSTR_get_const_objects, MP_OBJ_FROM_PTR(&get_const_objects_obj));
+
+ // This must be last, it restores the globals dict.
+ MP_DYNRUNTIME_INIT_EXIT
+}