Skip to content

Commit dc9d338

Browse files
authored
Merge pull request #1167 from notro/cpython_stdlib
Support CPython standard library
2 parents 7e29597 + d882ff6 commit dc9d338

File tree

6 files changed

+221
-19
lines changed

6 files changed

+221
-19
lines changed

ports/atmel-samd/mpconfigport.h

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
#define MICROPY_COMP_CONST (1)
2121
#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN (1)
2222
#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (1)
23-
// Turn off for consistency
24-
#define MICROPY_CPYTHON_COMPAT (0)
2523
#define MICROPY_MEM_STATS (0)
2624
#define MICROPY_DEBUG_PRINTERS (0)
2725
#define MICROPY_ENABLE_GC (1)
@@ -57,7 +55,6 @@
5755
#define MICROPY_PY_DESCRIPTORS (1)
5856
#define MICROPY_PY_MATH (0)
5957
#define MICROPY_PY_CMATH (0)
60-
#define MICROPY_PY_IO (0)
6158
#define MICROPY_PY_URANDOM (0)
6259
#define MICROPY_PY_URANDOM_EXTRA_FUNCS (0)
6360
#define MICROPY_PY_STRUCT (0)
@@ -84,7 +81,6 @@
8481
#define MICROPY_VFS (1)
8582
#define MICROPY_VFS_FAT (1)
8683
#define MICROPY_PY_MACHINE (1)
87-
#define MICROPY_MODULE_WEAK_LINKS (0)
8884
#define MICROPY_REPL_AUTO_INDENT (1)
8985
#define MICROPY_HW_ENABLE_DAC (1)
9086
#define MICROPY_ENABLE_FINALISER (1)
@@ -140,15 +136,33 @@ typedef long mp_off_t;
140136
#include "include/sam.h"
141137

142138
#ifdef SAMD21
143-
#define CIRCUITPY_MCU_FAMILY samd21
139+
#define CIRCUITPY_MCU_FAMILY samd21
144140
#define MICROPY_PY_SYS_PLATFORM "Atmel SAMD21"
145-
#define PORT_HEAP_SIZE (16384 + 4096)
141+
#define PORT_HEAP_SIZE (16384 + 4096)
142+
#define CIRCUITPY_DEFAULT_STACK_SIZE 4096
143+
#define MICROPY_CPYTHON_COMPAT (0)
144+
#define MICROPY_MODULE_WEAK_LINKS (0)
145+
#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (0)
146+
#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (0)
147+
#define MICROPY_PY_FUNCTION_ATTRS (0)
148+
#define MICROPY_PY_IO (0)
149+
#define MICROPY_PY_REVERSE_SPECIAL_METHODS (0)
150+
#define MICROPY_PY_SYS_EXC_INFO (0)
146151
#endif
147152

148153
#ifdef SAMD51
149-
#define CIRCUITPY_MCU_FAMILY samd51
154+
#define CIRCUITPY_MCU_FAMILY samd51
150155
#define MICROPY_PY_SYS_PLATFORM "MicroChip SAMD51"
151-
#define PORT_HEAP_SIZE (0x20000) // 128KiB
156+
#define PORT_HEAP_SIZE (0x20000) // 128KiB
157+
#define CIRCUITPY_DEFAULT_STACK_SIZE 8192
158+
#define MICROPY_CPYTHON_COMPAT (1)
159+
#define MICROPY_MODULE_WEAK_LINKS (1)
160+
#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (1)
161+
#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1)
162+
#define MICROPY_PY_FUNCTION_ATTRS (1)
163+
#define MICROPY_PY_IO (1)
164+
#define MICROPY_PY_REVERSE_SPECIAL_METHODS (1)
165+
#define MICROPY_PY_SYS_EXC_INFO (1)
152166
#endif
153167

154168
#ifdef LONGINT_IMPL_NONE
@@ -290,6 +304,34 @@ extern const struct _mp_obj_module_t usb_hid_module;
290304
{ MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \
291305
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \
292306
{ MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module },
307+
#elif MICROPY_MODULE_WEAK_LINKS
308+
#define MICROPY_PORT_BUILTIN_MODULES \
309+
{ MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \
310+
{ MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \
311+
{ MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, \
312+
{ MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \
313+
{ MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)&microcontroller_module }, \
314+
{ MP_OBJ_NEW_QSTR(MP_QSTR_neopixel_write),(mp_obj_t)&neopixel_write_module }, \
315+
{ MP_OBJ_NEW_QSTR(MP_QSTR__os), (mp_obj_t)&os_module }, \
316+
{ MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \
317+
{ MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \
318+
{ MP_OBJ_NEW_QSTR(MP_QSTR_rtc), (mp_obj_t)&rtc_module }, \
319+
{ MP_OBJ_NEW_QSTR(MP_QSTR_samd),(mp_obj_t)&samd_module }, \
320+
{ MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, \
321+
{ MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, \
322+
{ MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \
323+
{ MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&math_module }, \
324+
{ MP_OBJ_NEW_QSTR(MP_QSTR__time), (mp_obj_t)&time_module }, \
325+
{ MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, \
326+
TOUCHIO_MODULE \
327+
EXTRA_BUILTIN_MODULES
328+
329+
#define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \
330+
{ MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mp_module_uerrno) }, \
331+
{ MP_ROM_QSTR(MP_QSTR_io), MP_ROM_PTR(&mp_module_io) }, \
332+
{ MP_ROM_QSTR(MP_QSTR_os), MP_ROM_PTR(&os_module) }, \
333+
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \
334+
293335
#else
294336
#define MICROPY_PORT_BUILTIN_MODULES \
295337
{ MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \
@@ -360,8 +402,4 @@ void run_background_tasks(void);
360402
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
361403
#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt"
362404

363-
// TODO(tannewt): Make this 6k+ for any non-express M4 boards because they cache sectors on the
364-
// stack.
365-
#define CIRCUITPY_DEFAULT_STACK_SIZE 4096
366-
367405
#endif // __INCLUDED_MPCONFIGPORT_H

py/builtinimport.c

100755100644
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,9 @@ STATIC void do_load_from_lexer(mp_obj_t module_obj, mp_lexer_t *lex) {
155155
#endif
156156

157157
#if MICROPY_PERSISTENT_CODE_LOAD || MICROPY_MODULE_FROZEN_MPY
158-
STATIC void do_execute_raw_code(mp_obj_t module_obj, mp_raw_code_t *raw_code) {
158+
STATIC void do_execute_raw_code(mp_obj_t module_obj, mp_raw_code_t *raw_code, const char *filename) {
159159
#if MICROPY_PY___FILE__
160-
// TODO
161-
//qstr source_name = lex->source_name;
162-
//mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(source_name));
160+
mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(qstr_from_str(filename)));
163161
#endif
164162

165163
// execute the module in its context
@@ -222,7 +220,7 @@ STATIC void do_load(mp_obj_t module_obj, vstr_t *file) {
222220
// its data) in the list of frozen files, execute it.
223221
#if MICROPY_MODULE_FROZEN_MPY
224222
if (frozen_type == MP_FROZEN_MPY) {
225-
do_execute_raw_code(module_obj, modref);
223+
do_execute_raw_code(module_obj, modref, file_str);
226224
return;
227225
}
228226
#endif
@@ -235,7 +233,7 @@ STATIC void do_load(mp_obj_t module_obj, vstr_t *file) {
235233
#if MICROPY_PERSISTENT_CODE_LOAD
236234
if (file_str[file->len - 3] == 'm') {
237235
mp_raw_code_t *raw_code = mp_raw_code_load_file(file_str);
238-
do_execute_raw_code(module_obj, raw_code);
236+
do_execute_raw_code(module_obj, raw_code, file_str);
239237
return;
240238
}
241239
#endif

py/modsys.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ STATIC mp_obj_t mp_sys_exc_info(void) {
135135

136136
t->items[0] = MP_OBJ_FROM_PTR(mp_obj_get_type(cur_exc));
137137
t->items[1] = cur_exc;
138-
t->items[2] = mp_const_none;
138+
t->items[2] = mp_obj_exception_get_traceback_obj(cur_exc);
139139
return MP_OBJ_FROM_PTR(t);
140140
}
141141
MP_DEFINE_CONST_FUN_OBJ_0(mp_sys_exc_info_obj, mp_sys_exc_info);

py/obj.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,7 @@ bool mp_obj_exception_match(mp_obj_t exc, mp_const_obj_t exc_type);
717717
void mp_obj_exception_clear_traceback(mp_obj_t self_in);
718718
void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qstr block);
719719
void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values);
720+
mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in);
720721
mp_obj_t mp_obj_exception_get_value(mp_obj_t self_in);
721722
mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args);
722723
mp_obj_t mp_alloc_emergency_exception_buf(mp_obj_t size_in);

py/objboundmeth.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ STATIC void bound_meth_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
9292
if (attr == MP_QSTR___name__) {
9393
mp_obj_bound_meth_t *o = MP_OBJ_TO_PTR(self_in);
9494
dest[0] = MP_OBJ_NEW_QSTR(mp_obj_fun_get_name(o->meth));
95+
} else if (attr == MP_QSTR___func__) {
96+
mp_obj_bound_meth_t *o = MP_OBJ_TO_PTR(self_in);
97+
dest[0] = o->meth;
9598
}
9699
}
97100
#endif

py/objexcept.c

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <stdio.h>
3131

3232
#include "py/objlist.h"
33+
#include "py/objnamedtuple.h"
3334
#include "py/objstr.h"
3435
#include "py/objtuple.h"
3536
#include "py/objtype.h"
@@ -531,3 +532,164 @@ void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values
531532
*values = self->traceback_data;
532533
}
533534
}
535+
536+
#if MICROPY_PY_SYS_EXC_INFO
537+
STATIC const mp_obj_namedtuple_type_t code_type_obj = {
538+
.base = {
539+
.base = {
540+
.type = &mp_type_type
541+
},
542+
.name = MP_QSTR_code,
543+
.print = namedtuple_print,
544+
.make_new = namedtuple_make_new,
545+
.unary_op = mp_obj_tuple_unary_op,
546+
.binary_op = mp_obj_tuple_binary_op,
547+
.attr = namedtuple_attr,
548+
.subscr = mp_obj_tuple_subscr,
549+
.getiter = mp_obj_tuple_getiter,
550+
.parent = &mp_type_tuple,
551+
},
552+
.n_fields = 15,
553+
.fields = {
554+
MP_QSTR_co_argcount,
555+
MP_QSTR_co_kwonlyargcount,
556+
MP_QSTR_co_nlocals,
557+
MP_QSTR_co_stacksize,
558+
MP_QSTR_co_flags,
559+
MP_QSTR_co_code,
560+
MP_QSTR_co_consts,
561+
MP_QSTR_co_names,
562+
MP_QSTR_co_varnames,
563+
MP_QSTR_co_freevars,
564+
MP_QSTR_co_cellvars,
565+
MP_QSTR_co_filename,
566+
MP_QSTR_co_name,
567+
MP_QSTR_co_firstlineno,
568+
MP_QSTR_co_lnotab,
569+
},
570+
};
571+
572+
STATIC mp_obj_t code_make_new(qstr file, qstr block) {
573+
mp_obj_t elems[15] = {
574+
mp_obj_new_int(0), // co_argcount
575+
mp_obj_new_int(0), // co_kwonlyargcount
576+
mp_obj_new_int(0), // co_nlocals
577+
mp_obj_new_int(0), // co_stacksize
578+
mp_obj_new_int(0), // co_flags
579+
mp_obj_new_bytearray(0, NULL), // co_code
580+
mp_obj_new_tuple(0, NULL), // co_consts
581+
mp_obj_new_tuple(0, NULL), // co_names
582+
mp_obj_new_tuple(0, NULL), // co_varnames
583+
mp_obj_new_tuple(0, NULL), // co_freevars
584+
mp_obj_new_tuple(0, NULL), // co_cellvars
585+
MP_OBJ_NEW_QSTR(file), // co_filename
586+
MP_OBJ_NEW_QSTR(block), // co_name
587+
mp_obj_new_int(1), // co_firstlineno
588+
mp_obj_new_bytearray(0, NULL), // co_lnotab
589+
};
590+
591+
return namedtuple_make_new((const mp_obj_type_t*)&code_type_obj, 15, 0, elems);
592+
}
593+
594+
STATIC const mp_obj_namedtuple_type_t frame_type_obj = {
595+
.base = {
596+
.base = {
597+
.type = &mp_type_type
598+
},
599+
.name = MP_QSTR_frame,
600+
.print = namedtuple_print,
601+
.make_new = namedtuple_make_new,
602+
.unary_op = mp_obj_tuple_unary_op,
603+
.binary_op = mp_obj_tuple_binary_op,
604+
.attr = namedtuple_attr,
605+
.subscr = mp_obj_tuple_subscr,
606+
.getiter = mp_obj_tuple_getiter,
607+
.parent = &mp_type_tuple,
608+
},
609+
.n_fields = 8,
610+
.fields = {
611+
MP_QSTR_f_back,
612+
MP_QSTR_f_builtins,
613+
MP_QSTR_f_code,
614+
MP_QSTR_f_globals,
615+
MP_QSTR_f_lasti,
616+
MP_QSTR_f_lineno,
617+
MP_QSTR_f_locals,
618+
MP_QSTR_f_trace,
619+
},
620+
};
621+
622+
STATIC mp_obj_t frame_make_new(mp_obj_t f_code, int f_lineno) {
623+
mp_obj_t elems[8] = {
624+
mp_const_none, // f_back
625+
mp_obj_new_dict(0), // f_builtins
626+
f_code, // f_code
627+
mp_obj_new_dict(0), // f_globals
628+
mp_obj_new_int(0), // f_lasti
629+
mp_obj_new_int(f_lineno), // f_lineno
630+
mp_obj_new_dict(0), // f_locals
631+
mp_const_none, // f_trace
632+
};
633+
634+
return namedtuple_make_new((const mp_obj_type_t*)&frame_type_obj, 8, 0, elems);
635+
}
636+
637+
STATIC const mp_obj_namedtuple_type_t traceback_type_obj = {
638+
.base = {
639+
.base = {
640+
.type = &mp_type_type
641+
},
642+
.name = MP_QSTR_traceback,
643+
.print = namedtuple_print,
644+
.make_new = namedtuple_make_new,
645+
.unary_op = mp_obj_tuple_unary_op,
646+
.binary_op = mp_obj_tuple_binary_op,
647+
.attr = namedtuple_attr,
648+
.subscr = mp_obj_tuple_subscr,
649+
.getiter = mp_obj_tuple_getiter,
650+
.parent = &mp_type_tuple,
651+
},
652+
.n_fields = 4,
653+
.fields = {
654+
MP_QSTR_tb_frame,
655+
MP_QSTR_tb_lasti,
656+
MP_QSTR_tb_lineno,
657+
MP_QSTR_tb_next,
658+
},
659+
};
660+
661+
STATIC mp_obj_t traceback_from_values(size_t *values, mp_obj_t tb_next) {
662+
int lineno = values[1];
663+
664+
mp_obj_t elems[4] = {
665+
frame_make_new(code_make_new(values[0], values[2]), lineno),
666+
mp_obj_new_int(0),
667+
mp_obj_new_int(lineno),
668+
tb_next,
669+
};
670+
671+
return namedtuple_make_new((const mp_obj_type_t*)&traceback_type_obj, 4, 0, elems);
672+
};
673+
674+
mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in) {
675+
mp_obj_exception_t *self = MP_OBJ_TO_PTR(self_in);
676+
677+
if (!mp_obj_is_exception_instance(self)) {
678+
return mp_const_none;
679+
}
680+
681+
size_t n, *values;
682+
mp_obj_exception_get_traceback(self, &n, &values);
683+
if (n == 0) {
684+
return mp_const_none;
685+
}
686+
687+
mp_obj_t tb_next = mp_const_none;
688+
689+
for (size_t i = 0; i < n; i += 3) {
690+
tb_next = traceback_from_values(&values[i], tb_next);
691+
}
692+
693+
return tb_next;
694+
}
695+
#endif

0 commit comments

Comments
 (0)