summaryrefslogtreecommitdiffstatshomepage
path: root/py/objboundmeth.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/objboundmeth.c')
-rw-r--r--py/objboundmeth.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/py/objboundmeth.c b/py/objboundmeth.c
new file mode 100644
index 0000000000..8bd238c65e
--- /dev/null
+++ b/py/objboundmeth.c
@@ -0,0 +1,54 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <assert.h>
+
+#include "nlr.h"
+#include "misc.h"
+#include "mpconfig.h"
+#include "obj.h"
+#include "runtime.h"
+
+typedef struct _mp_obj_bound_meth_t {
+ mp_obj_base_t base;
+ mp_obj_t meth;
+ mp_obj_t self;
+} mp_obj_bound_meth_t;
+
+// args are in reverse order in the array
+mp_obj_t bound_meth_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
+ mp_obj_bound_meth_t *self = self_in;
+
+ if (n_args == 0) {
+ return rt_call_function_n(self->meth, 1, &self->self);
+ } else if (n_args == 1) {
+ mp_obj_t args2[2];
+ args2[1] = self->self;
+ args2[0] = args[0];
+ return rt_call_function_n(self->meth, 2, args2);
+ } else {
+ // TODO not implemented
+ assert(0);
+ return mp_const_none;
+ //return rt_call_function_2(self->meth, n_args + 1, self->self + args);
+ }
+}
+
+const mp_obj_type_t bound_meth_type = {
+ { &mp_const_type },
+ "bound_method",
+ NULL, // print
+ bound_meth_call_n, // call_n
+ NULL, // unary_op
+ NULL, // binary_op
+ NULL, // getiter
+ NULL, // iternext
+ {{NULL, NULL},}, // method list
+};
+
+mp_obj_t mp_obj_new_bound_meth(mp_obj_t self, mp_obj_t meth) {
+ mp_obj_bound_meth_t *o = m_new_obj(mp_obj_bound_meth_t);
+ o->base.type = &bound_meth_type;
+ o->meth = meth;
+ o->self = self;
+ return o;
+}