summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-11-20 12:44:20 +0000
committerDamien George <damien.p.george@gmail.com>2015-11-20 12:44:20 +0000
commitb5b1f2c527f26dbf56ef1fcb0100eccc8ad0b97e (patch)
treec59cf13a0fd800ba34dcfbb9ae1d5010a5bfd262
parentf148727b78c7656f3bedc6c036b5faef325bc5c2 (diff)
downloadmicropython-b5b1f2c527f26dbf56ef1fcb0100eccc8ad0b97e.tar.gz
micropython-b5b1f2c527f26dbf56ef1fcb0100eccc8ad0b97e.zip
py/emitglue: Add mp_raw_code_load_mem to load raw-code from memory.
-rw-r--r--py/emitglue.c20
-rw-r--r--py/emitglue.h1
2 files changed, 21 insertions, 0 deletions
diff --git a/py/emitglue.c b/py/emitglue.c
index 4731af992d..a0f0e004eb 100644
--- a/py/emitglue.c
+++ b/py/emitglue.c
@@ -324,6 +324,26 @@ mp_raw_code_t *mp_raw_code_load(mp_reader_t *reader) {
return load_raw_code(reader);
}
+typedef struct _mp_mem_reader_t {
+ const byte *cur;
+ const byte *end;
+} mp_mem_reader_t;
+
+STATIC mp_uint_t mp_mem_reader_next_byte(void *br_in) {
+ mp_mem_reader_t *br = br_in;
+ if (br->cur < br->end) {
+ return *br->cur++;
+ } else {
+ return (mp_uint_t)-1;
+ }
+}
+
+mp_raw_code_t *mp_raw_code_load_mem(const byte *buf, size_t len) {
+ mp_mem_reader_t mr = {buf, buf + len};
+ mp_reader_t reader = {&mr, mp_mem_reader_next_byte};
+ return mp_raw_code_load(&reader);
+}
+
// here we define mp_raw_code_load_file depending on the port
// TODO abstract this away properly
diff --git a/py/emitglue.h b/py/emitglue.h
index 6da0f6cb48..b31e8dbb22 100644
--- a/py/emitglue.h
+++ b/py/emitglue.h
@@ -62,6 +62,7 @@ typedef struct _mp_reader_t {
} mp_reader_t;
mp_raw_code_t *mp_raw_code_load(mp_reader_t *reader);
+mp_raw_code_t *mp_raw_code_load_mem(const byte *buf, size_t len);
mp_raw_code_t *mp_raw_code_load_file(const char *filename);
#endif