1 /*
2  * This file is part of the MicroPython project, http://micropython.org/
3  *
4  * The MIT License (MIT)
5  *
6  * Copyright (c) 2013, 2014 Damien P. George
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  */
26 
27 #include <stdlib.h>
28 
29 #include "py/runtime.h"
30 
31 #if MICROPY_OBJ_IMMEDIATE_OBJS
32 
33 #define BOOL_VALUE(o) ((o) == mp_const_false ? 0 : 1)
34 
35 #else
36 
37 #define BOOL_VALUE(o) (((mp_obj_bool_t *)MP_OBJ_TO_PTR(o))->value)
38 
39 typedef struct _mp_obj_bool_t {
40     mp_obj_base_t base;
41     bool value;
42 } mp_obj_bool_t;
43 
44 #endif
45 
bool_print(const mp_print_t * print,mp_obj_t self_in,mp_print_kind_t kind)46 STATIC void bool_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
47     bool value = BOOL_VALUE(self_in);
48     if (MICROPY_PY_UJSON && kind == PRINT_JSON) {
49         if (value) {
50             mp_print_str(print, "true");
51         } else {
52             mp_print_str(print, "false");
53         }
54     } else {
55         if (value) {
56             mp_print_str(print, "True");
57         } else {
58             mp_print_str(print, "False");
59         }
60     }
61 }
62 
bool_make_new(const mp_obj_type_t * type_in,size_t n_args,size_t n_kw,const mp_obj_t * args)63 STATIC mp_obj_t bool_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
64     (void)type_in;
65     mp_arg_check_num(n_args, n_kw, 0, 1, false);
66 
67     if (n_args == 0) {
68         return mp_const_false;
69     } else {
70         return mp_obj_new_bool(mp_obj_is_true(args[0]));
71     }
72 }
73 
bool_unary_op(mp_unary_op_t op,mp_obj_t o_in)74 STATIC mp_obj_t bool_unary_op(mp_unary_op_t op, mp_obj_t o_in) {
75     if (op == MP_UNARY_OP_LEN) {
76         return MP_OBJ_NULL;
77     }
78     bool value = BOOL_VALUE(o_in);
79     return mp_unary_op(op, MP_OBJ_NEW_SMALL_INT(value));
80 }
81 
bool_binary_op(mp_binary_op_t op,mp_obj_t lhs_in,mp_obj_t rhs_in)82 STATIC mp_obj_t bool_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
83     bool value = BOOL_VALUE(lhs_in);
84     return mp_binary_op(op, MP_OBJ_NEW_SMALL_INT(value), rhs_in);
85 }
86 
87 const mp_obj_type_t mp_type_bool = {
88     { &mp_type_type },
89     .flags = MP_TYPE_FLAG_EQ_CHECKS_OTHER_TYPE, // can match all numeric types
90     .name = MP_QSTR_bool,
91     .print = bool_print,
92     .make_new = bool_make_new,
93     .unary_op = bool_unary_op,
94     .binary_op = bool_binary_op,
95 };
96 
97 #if !MICROPY_OBJ_IMMEDIATE_OBJS
98 const mp_obj_bool_t mp_const_false_obj = {{&mp_type_bool}, false};
99 const mp_obj_bool_t mp_const_true_obj = {{&mp_type_bool}, true};
100 #endif
101