|
32 | 32 | #include "py/mpprint.h" |
33 | 33 |
|
34 | 34 | // All Micro Python objects are at least this type |
35 | | -// It must be of pointer size |
| 35 | +// The bit-size must be at least pointer size |
36 | 36 |
|
| 37 | +#if MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_D |
| 38 | +typedef uint64_t mp_obj_t; |
| 39 | +typedef uint64_t mp_const_obj_t; |
| 40 | +#else |
37 | 41 | typedef machine_ptr_t mp_obj_t; |
38 | 42 | typedef machine_const_ptr_t mp_const_obj_t; |
| 43 | +#endif |
39 | 44 |
|
40 | 45 | // Anything that wants to be a Micro Python object must have |
41 | 46 | // mp_obj_base_t as its first member (except small ints and qstrs) |
@@ -158,6 +163,56 @@ static inline bool MP_OBJ_IS_QSTR(mp_const_obj_t o) |
158 | 163 | static inline bool MP_OBJ_IS_OBJ(mp_const_obj_t o) |
159 | 164 | { return ((((mp_int_t)(o)) & 3) == 0); } |
160 | 165 |
|
| 166 | +#elif MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_D |
| 167 | + |
| 168 | +static inline bool MP_OBJ_IS_SMALL_INT(mp_const_obj_t o) |
| 169 | + { return ((((mp_int_t)(o)) & 0xffff000000000000) == 0x0001000000000000); } |
| 170 | +#define MP_OBJ_SMALL_INT_VALUE(o) (((intptr_t)(o)) >> 1) |
| 171 | +#define MP_OBJ_NEW_SMALL_INT(small_int) ((mp_obj_t)(((uintptr_t)(small_int)) << 1) | 0x0001000000000001) |
| 172 | + |
| 173 | +static inline bool MP_OBJ_IS_QSTR(mp_const_obj_t o) |
| 174 | + { return ((((mp_int_t)(o)) & 0xffff000000000000) == 0x0002000000000000); } |
| 175 | +#define MP_OBJ_QSTR_VALUE(o) ((((mp_uint_t)(o)) >> 1) & 0xffffffff) |
| 176 | +#define MP_OBJ_NEW_QSTR(qst) ((mp_obj_t)((((mp_uint_t)(qst)) << 1) | 0x0002000000000001)) |
| 177 | + |
| 178 | +#if MICROPY_PY_BUILTINS_FLOAT |
| 179 | +#define mp_const_float_e {((mp_obj_t)((uint64_t)0x4005bf0a8b125769 + 0x8004000000000000))} |
| 180 | +#define mp_const_float_pi {((mp_obj_t)((uint64_t)0x400921fb54442d18 + 0x8004000000000000))} |
| 181 | + |
| 182 | +static inline bool mp_obj_is_float(mp_const_obj_t o) { |
| 183 | + return ((uint64_t)(o) & 0xfffc000000000000) != 0; |
| 184 | +} |
| 185 | +static inline mp_float_t mp_obj_float_get(mp_const_obj_t o) { |
| 186 | + union { |
| 187 | + mp_float_t f; |
| 188 | + uint64_t r; |
| 189 | + } num = {.r = o - 0x8004000000000000}; |
| 190 | + return num.f; |
| 191 | +} |
| 192 | +static inline mp_obj_t mp_obj_new_float(mp_float_t f) { |
| 193 | + union { |
| 194 | + mp_float_t f; |
| 195 | + uint64_t r; |
| 196 | + } num = {.f = f}; |
| 197 | + return num.r + 0x8004000000000000; |
| 198 | +} |
| 199 | +#endif |
| 200 | + |
| 201 | +static inline bool MP_OBJ_IS_OBJ(mp_const_obj_t o) |
| 202 | + { return ((((uint64_t)(o)) & 0xffff000000000000) == 0x0000000000000000); } |
| 203 | +#define MP_OBJ_TO_PTR(o) ((void*)(uintptr_t)(o)) |
| 204 | +#define MP_OBJ_FROM_PTR(p) ((mp_obj_t)((uintptr_t)(p))) |
| 205 | + |
| 206 | +// rom object storage needs special handling to widen 32-bit pointer to 64-bits |
| 207 | +typedef union _mp_rom_obj_t { uint64_t u64; struct { const void *lo, *hi; } u32; } mp_rom_obj_t; |
| 208 | +#define MP_ROM_INT(i) {MP_OBJ_NEW_SMALL_INT(i)} |
| 209 | +#define MP_ROM_QSTR(q) {MP_OBJ_NEW_QSTR(q)} |
| 210 | +#if MP_ENDIANNESS_LITTLE |
| 211 | +#define MP_ROM_PTR(p) {.u32 = {.lo = (p), .hi = NULL}} |
| 212 | +#else |
| 213 | +#define MP_ROM_PTR(p) {.u32 = {.lo = NULL, .hi = (p)}} |
| 214 | +#endif |
| 215 | + |
161 | 216 | #endif |
162 | 217 |
|
163 | 218 | // Macros to convert between mp_obj_t and concrete object types. |
|
0 commit comments