summaryrefslogtreecommitdiff
path: root/extmod
diff options
context:
space:
mode:
authorDavePutz <dwputz@gmail.com>2020-12-10 12:05:51 -0600
committerGitHub <noreply@github.com>2020-12-10 12:05:51 -0600
commit3d5c77c601fa8297861416dde52211809c3e7b58 (patch)
treed4d606afaabfae6632110824db0fd098521ea878 /extmod
parent3abc671bbdf617dcf87cbd4eda1201c944c05651 (diff)
parente9fd689d576f834eff255d5f15edcad07c46e2ec (diff)
Merge pull request #35 from adafruit/main
Update from adafruit/main
Diffstat (limited to 'extmod')
-rw-r--r--extmod/machine_mem.c2
-rw-r--r--extmod/moduheapq.c2
-rw-r--r--extmod/modujson.c36
-rw-r--r--extmod/modure.c6
-rw-r--r--extmod/moduzlib.c2
m---------extmod/ulab0
-rw-r--r--extmod/vfs_posix_file.c2
7 files changed, 34 insertions, 16 deletions
diff --git a/extmod/machine_mem.c b/extmod/machine_mem.c
index 6c6e11063..8944c3a66 100644
--- a/extmod/machine_mem.c
+++ b/extmod/machine_mem.c
@@ -21,7 +21,7 @@
STATIC uintptr_t machine_mem_get_addr(mp_obj_t addr_o, uint align) {
uintptr_t addr = mp_obj_int_get_truncated(addr_o);
if ((addr & (align - 1)) != 0) {
- nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, translate("address %08x is not aligned to %d bytes"), addr, align));
+ mp_raise_ValueError_varg(translate("address %08x is not aligned to %d bytes"), addr, align);
}
return addr;
}
diff --git a/extmod/moduheapq.c b/extmod/moduheapq.c
index bc4b97ff5..50fe6c051 100644
--- a/extmod/moduheapq.c
+++ b/extmod/moduheapq.c
@@ -62,7 +62,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_uheapq_heappush_obj, mod_uheapq_heappush);
STATIC mp_obj_t mod_uheapq_heappop(mp_obj_t heap_in) {
mp_obj_list_t *heap = get_heap(heap_in);
if (heap->len == 0) {
- nlr_raise(mp_obj_new_exception_msg(&mp_type_IndexError, translate("empty heap")));
+ mp_raise_IndexError(translate("empty heap"));
}
mp_obj_t item = heap->items[0];
heap->len -= 1;
diff --git a/extmod/modujson.c b/extmod/modujson.c
index 431b5e0cf..3bb4b3301 100644
--- a/extmod/modujson.c
+++ b/extmod/modujson.c
@@ -57,6 +57,8 @@ typedef struct _ujson_stream_t {
int errcode;
mp_obj_t python_readinto[2 + 1];
mp_obj_array_t bytearray_obj;
+ size_t start;
+ size_t end;
byte cur;
} ujson_stream_t;
@@ -77,28 +79,44 @@ STATIC byte ujson_stream_next(ujson_stream_t *s) {
return s->cur;
}
+// We read from an object's `readinto` method in chunks larger than the json
+// parser needs to reduce the number of function calls done.
+
+#define CIRCUITPY_JSON_READ_CHUNK_SIZE 64
+
STATIC mp_uint_t ujson_python_readinto(mp_obj_t obj, void *buf, mp_uint_t size, int *errcode) {
+ (void) size; // Ignore size because we know it's always 1.
ujson_stream_t* s = obj;
- s->bytearray_obj.items = buf;
- s->bytearray_obj.len = size;
- *errcode = 0;
- mp_obj_t ret = mp_call_method_n_kw(1, 0, s->python_readinto);
- if (ret == mp_const_none) {
- *errcode = MP_EAGAIN;
- return MP_STREAM_ERROR;
+
+ if (s->start == s->end) {
+ *errcode = 0;
+ mp_obj_t ret = mp_call_method_n_kw(1, 0, s->python_readinto);
+ if (ret == mp_const_none) {
+ *errcode = MP_EAGAIN;
+ return MP_STREAM_ERROR;
+ }
+ s->start = 0;
+ s->end = mp_obj_get_int(ret);
}
- return mp_obj_get_int(ret);
+
+ *((uint8_t *)buf) = ((uint8_t*) s->bytearray_obj.items)[s->start];
+ s->start++;
+ return 1;
}
STATIC mp_obj_t _mod_ujson_load(mp_obj_t stream_obj, bool return_first_json) {
const mp_stream_p_t *stream_p = mp_proto_get(MP_QSTR_protocol_stream, stream_obj);
ujson_stream_t s;
+ uint8_t character_buffer[CIRCUITPY_JSON_READ_CHUNK_SIZE];
if (stream_p == NULL) {
+ s.start = 0;
+ s.end = 0;
mp_load_method(stream_obj, MP_QSTR_readinto, s.python_readinto);
s.bytearray_obj.base.type = &mp_type_bytearray;
s.bytearray_obj.typecode = BYTEARRAY_TYPECODE;
+ s.bytearray_obj.len = CIRCUITPY_JSON_READ_CHUNK_SIZE;
s.bytearray_obj.free = 0;
- // len and items are set at read time
+ s.bytearray_obj.items = character_buffer;
s.python_readinto[2] = MP_OBJ_FROM_PTR(&s.bytearray_obj);
s.stream_obj = &s;
s.read = ujson_python_readinto;
diff --git a/extmod/modure.c b/extmod/modure.c
index a20f3ee42..bb54bc732 100644
--- a/extmod/modure.c
+++ b/extmod/modure.c
@@ -43,7 +43,7 @@ STATIC mp_obj_t match_group(mp_obj_t self_in, mp_obj_t no_in) {
mp_obj_match_t *self = MP_OBJ_TO_PTR(self_in);
mp_int_t no = mp_obj_get_int(no_in);
if (no < 0 || no >= self->num_matches) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, no_in));
+ mp_raise_arg1(&mp_type_IndexError, no_in);
}
const char *start = self->caps[no * 2];
@@ -82,7 +82,7 @@ STATIC void match_span_helper(size_t n_args, const mp_obj_t *args, mp_obj_t span
if (n_args == 2) {
no = mp_obj_get_int(args[1]);
if (no < 0 || no >= self->num_matches) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, args[1]));
+ mp_raise_arg1(&mp_type_IndexError, args[1]);
}
}
@@ -326,7 +326,7 @@ STATIC mp_obj_t re_sub_helper(mp_obj_t self_in, size_t n_args, const mp_obj_t *a
}
if (match_no >= (unsigned int)match->num_matches) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, MP_OBJ_NEW_SMALL_INT(match_no)));
+ mp_raise_arg1(&mp_type_IndexError, MP_OBJ_NEW_SMALL_INT(match_no));
}
const char *start_match = match->caps[match_no * 2];
diff --git a/extmod/moduzlib.c b/extmod/moduzlib.c
index 8422e7598..b344f9642 100644
--- a/extmod/moduzlib.c
+++ b/extmod/moduzlib.c
@@ -179,7 +179,7 @@ STATIC mp_obj_t mod_uzlib_decompress(size_t n_args, const mp_obj_t *args) {
return res;
error:
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_ValueError, MP_OBJ_NEW_SMALL_INT(st)));
+ mp_raise_arg1(&mp_type_ValueError, MP_OBJ_NEW_SMALL_INT(st));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_uzlib_decompress_obj, 1, 3, mod_uzlib_decompress);
diff --git a/extmod/ulab b/extmod/ulab
-Subproject 8242b84753355433b61230ab6631c06e5ac77f3
+Subproject aa7e741530df471d206a4a321823a37a913a0eb
diff --git a/extmod/vfs_posix_file.c b/extmod/vfs_posix_file.c
index 3f887785e..593b8d6a2 100644
--- a/extmod/vfs_posix_file.c
+++ b/extmod/vfs_posix_file.c
@@ -24,7 +24,7 @@ typedef struct _mp_obj_vfs_posix_file_t {
#ifdef MICROPY_CPYTHON_COMPAT
STATIC void check_fd_is_open(const mp_obj_vfs_posix_file_t *o) {
if (o->fd < 0) {
- nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, translate("I/O operation on closed file")));
+ mp_raise_ValueError(translate("I/O operation on closed file"));
}
}
#else