aboutsummaryrefslogtreecommitdiff
path: root/py/obj.h
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2022-04-22 15:32:22 +1000
committerDamien George <damien@micropython.org>2022-05-03 22:23:46 +1000
commit709e8328d9812a2e02da6fba65a03f9a873d60a2 (patch)
tree72d53933f3e251be477f709ad3d94a2609b85fcd /py/obj.h
parent590de399f01cd08aa4825b26b91785e07abcf68c (diff)
py/obj: Introduce mp_obj_malloc macro to allocate, and set object type.
This is to replace the following: mp_foo_obj_t *self = m_new_obj(mp_foo_obj_t); self->base.type = &mp_type_foo; with: mp_foo_obj_t *self = mp_obj_malloc(mp_foo_obj_t, &mp_type_foo); Calling the function is less code than inlining setting the type everywhere, adds up to ~100 bytes on PYBV11. It also helps to avoid an easy mistake of forgetting to set the type. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
Diffstat (limited to 'py/obj.h')
-rw-r--r--py/obj.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/py/obj.h b/py/obj.h
index 08a35ee6f..ead3ce864 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -732,6 +732,12 @@ extern const struct _mp_obj_exception_t mp_const_GeneratorExit_obj;
// General API for objects
+// Helper versions of m_new_obj when you need to immediately set base.type.
+// Implementing this as a call rather than inline saves 8 bytes per usage.
+#define mp_obj_malloc(struct_type, obj_type) ((struct_type *)mp_obj_malloc_helper(sizeof(struct_type), obj_type))
+#define mp_obj_malloc_var(struct_type, var_type, var_num, obj_type) ((struct_type *)mp_obj_malloc_helper(sizeof(struct_type) + sizeof(var_type) * (var_num), obj_type))
+void *mp_obj_malloc_helper(size_t num_bytes, const mp_obj_type_t *type);
+
// These macros are derived from more primitive ones and are used to
// check for more specific object types.
// Note: these are kept as macros because inline functions sometimes use much