aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/builtinimport.c8
-rw-r--r--py/frozenmod.c23
-rw-r--r--py/frozenmod.h2
-rw-r--r--py/modio.c8
-rw-r--r--unix/main.c7
5 files changed, 27 insertions, 21 deletions
diff --git a/py/builtinimport.c b/py/builtinimport.c
index 48aee58d1..01dddd02b 100644
--- a/py/builtinimport.c
+++ b/py/builtinimport.c
@@ -57,9 +57,11 @@ bool mp_obj_is_package(mp_obj_t module) {
// (whatever is available, if at all).
STATIC mp_import_stat_t mp_import_stat_any(const char *path) {
#if MICROPY_MODULE_FROZEN
- mp_import_stat_t st = mp_frozen_stat(path);
- if (st != MP_IMPORT_STAT_NO_EXIST) {
- return st;
+ if (strlen(path) > 8 && strncmp(".frozen/", path, 8) == 0) {
+ mp_import_stat_t st = mp_frozen_stat(path + 8);
+ if (st != MP_IMPORT_STAT_NO_EXIST) {
+ return st;
+ }
}
#endif
return mp_import_stat(path);
diff --git a/py/frozenmod.c b/py/frozenmod.c
index 1eaaf574a..782b437af 100644
--- a/py/frozenmod.c
+++ b/py/frozenmod.c
@@ -44,13 +44,13 @@ extern const uint32_t mp_frozen_str_sizes[];
extern const char mp_frozen_str_content[];
// On input, *len contains size of name, on output - size of content
-const char *mp_find_frozen_str(const char *str, size_t *len) {
+const char *mp_find_frozen_str(const char *str, size_t str_len, size_t *len) {
const char *name = mp_frozen_str_names;
size_t offset = 0;
for (int i = 0; *name != 0; i++) {
size_t l = strlen(name);
- if (l == *len && !memcmp(str, name, l)) {
+ if (l == str_len && !memcmp(str, name, l)) {
*len = mp_frozen_str_sizes[i];
return mp_frozen_str_content + offset;
}
@@ -60,16 +60,16 @@ const char *mp_find_frozen_str(const char *str, size_t *len) {
return NULL;
}
-STATIC mp_lexer_t *mp_lexer_frozen_str(const char *str, size_t len) {
- size_t name_len = len;
- const char *content = mp_find_frozen_str(str, &len);
+STATIC mp_lexer_t *mp_lexer_frozen_str(const char *str, size_t str_len) {
+ size_t file_len;
+ const char *content = mp_find_frozen_str(str, str_len, &file_len);
if (content == NULL) {
return NULL;
}
- qstr source = qstr_from_strn(str, name_len);
- mp_lexer_t *lex = MICROPY_MODULE_FROZEN_LEXER(source, content, len, 0);
+ qstr source = qstr_from_strn(str, str_len);
+ mp_lexer_t *lex = MICROPY_MODULE_FROZEN_LEXER(source, content, file_len, 0);
return lex;
}
@@ -82,11 +82,11 @@ STATIC mp_lexer_t *mp_lexer_frozen_str(const char *str, size_t len) {
extern const char mp_frozen_mpy_names[];
extern const mp_raw_code_t *const mp_frozen_mpy_content[];
-STATIC const mp_raw_code_t *mp_find_frozen_mpy(const char *str, size_t len) {
+STATIC const mp_raw_code_t *mp_find_frozen_mpy(const char *str, size_t str_len) {
const char *name = mp_frozen_mpy_names;
for (size_t i = 0; *name != 0; i++) {
size_t l = strlen(name);
- if (l == len && !memcmp(str, name, l)) {
+ if (l == str_len && !memcmp(str, name, l)) {
return mp_frozen_mpy_content[i];
}
name += l + 1;
@@ -136,15 +136,16 @@ mp_import_stat_t mp_frozen_stat(const char *str) {
}
int mp_find_frozen_module(const char *str, size_t len, void **data) {
+ // The +8/-8 account for the .frozen/ path prefix used on frozen modules.
#if MICROPY_MODULE_FROZEN_STR
- mp_lexer_t *lex = mp_lexer_frozen_str(str, len);
+ mp_lexer_t *lex = mp_lexer_frozen_str(str + 8, len - 8);
if (lex != NULL) {
*data = lex;
return MP_FROZEN_STR;
}
#endif
#if MICROPY_MODULE_FROZEN_MPY
- const mp_raw_code_t *rc = mp_find_frozen_mpy(str, len);
+ const mp_raw_code_t *rc = mp_find_frozen_mpy(str + 8, len - 8);
if (rc != NULL) {
*data = (void*)rc;
return MP_FROZEN_MPY;
diff --git a/py/frozenmod.h b/py/frozenmod.h
index 4b125ff24..de11e4a61 100644
--- a/py/frozenmod.h
+++ b/py/frozenmod.h
@@ -33,5 +33,5 @@ enum {
};
int mp_find_frozen_module(const char *str, size_t len, void **data);
-const char *mp_find_frozen_str(const char *str, size_t *len);
+const char *mp_find_frozen_str(const char *str, size_t str_len, size_t *len);
mp_import_stat_t mp_frozen_stat(const char *str);
diff --git a/py/modio.c b/py/modio.c
index 2d317d022..b6770194a 100644
--- a/py/modio.c
+++ b/py/modio.c
@@ -164,14 +164,14 @@ STATIC mp_obj_t resource_stream(mp_obj_t package_in, mp_obj_t path_in) {
const char *path = mp_obj_str_get_data(path_in, &len);
vstr_add_strn(&path_buf, path, len);
- len = path_buf.len;
- const char *data = mp_find_frozen_str(path_buf.buf, &len);
+ size_t file_len;
+ const char *data = mp_find_frozen_str(path_buf.buf, path_buf.len, &file_len);
if (data != NULL) {
mp_obj_stringio_t *o = m_new_obj(mp_obj_stringio_t);
o->base.type = &mp_type_bytesio;
o->vstr = m_new_obj(vstr_t);
- vstr_init_fixed_buf(o->vstr, len + 1, (char*)data);
- o->vstr->len = len;
+ vstr_init_fixed_buf(o->vstr, file_len + 1, (char*)data);
+ o->vstr->len = file_len;
o->pos = 0;
return MP_OBJ_FROM_PTR(o);
}
diff --git a/unix/main.c b/unix/main.c
index 633144c86..e96cdaaa2 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -453,7 +453,9 @@ MP_NOINLINE int main_(int argc, char **argv) {
path = "~/.micropython/lib:/usr/lib/micropython";
#endif
}
- size_t path_num = 1; // [0] is for current dir (or base dir of the script)
+ size_t path_num = 2; // [0] is for current dir (or base dir of the script)
+ // [1] is for frozen files.
+ size_t builtin_path_count = path_num;
if (*path == ':') {
path_num++;
}
@@ -467,9 +469,10 @@ MP_NOINLINE int main_(int argc, char **argv) {
mp_obj_t *path_items;
mp_obj_list_get(mp_sys_path, &path_num, &path_items);
path_items[0] = MP_OBJ_NEW_QSTR(MP_QSTR_);
+ path_items[1] = MP_OBJ_NEW_QSTR(MP_QSTR__dot_frozen);
{
char *p = path;
- for (mp_uint_t i = 1; i < path_num; i++) {
+ for (mp_uint_t i = builtin_path_count; i < path_num; i++) {
char *p1 = strchr(p, PATHLIST_SEP_CHAR);
if (p1 == NULL) {
p1 = p + strlen(p);