aboutsummaryrefslogtreecommitdiff
path: root/py/objbool.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-01-23 18:27:51 +0000
committerDamien George <damien.p.george@gmail.com>2014-01-23 18:27:51 +0000
commit1e708fed188e3471cc7bed13635ba69b48bc8cf7 (patch)
treea8322082bbcf08272ae039843de237f0bf427134 /py/objbool.c
parentb051e7d167ac00576e45a6a1de291b8ff6bcd6a3 (diff)
py: Implement bool unary op; tidy up unary op dispatch.
Diffstat (limited to 'py/objbool.c')
-rw-r--r--py/objbool.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/py/objbool.c b/py/objbool.c
index 729ffb4e6..53b2bf8ed 100644
--- a/py/objbool.c
+++ b/py/objbool.c
@@ -6,6 +6,7 @@
#include "mpconfig.h"
#include "qstr.h"
#include "obj.h"
+#include "runtime0.h"
#include "runtime.h"
typedef struct _mp_obj_bool_t {
@@ -32,11 +33,24 @@ static mp_obj_t bool_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp
}
}
+static mp_obj_t bool_unary_op(int op, mp_obj_t o_in) {
+ machine_int_t value = ((mp_obj_bool_t*)o_in)->value;
+ switch (op) {
+ case RT_UNARY_OP_NOT: if (value) { return mp_const_false; } else { return mp_const_true; }
+ case RT_UNARY_OP_POSITIVE: return MP_OBJ_NEW_SMALL_INT(value);
+ case RT_UNARY_OP_NEGATIVE: return MP_OBJ_NEW_SMALL_INT(-value);
+ case RT_UNARY_OP_INVERT:
+ default: // no other cases
+ return MP_OBJ_NEW_SMALL_INT(~value);
+ }
+}
+
const mp_obj_type_t bool_type = {
{ &mp_const_type },
"bool",
.print = bool_print,
.make_new = bool_make_new,
+ .unary_op = bool_unary_op,
};
static const mp_obj_bool_t false_obj = {{&bool_type}, false};