Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
U
uPython-mirror
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
TASTE
uPython-mirror
Commits
03d4f7b2
Commit
03d4f7b2
authored
Feb 20, 2018
by
Damien George
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into leon
parents
587c24b5
7e2a4885
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
92 additions
and
29 deletions
+92
-29
py/builtinimport.c
py/builtinimport.c
+40
-13
py/modmicropython.c
py/modmicropython.c
+5
-5
py/mpconfig.h
py/mpconfig.h
+12
-0
py/objmodule.c
py/objmodule.c
+17
-11
py/objmodule.h
py/objmodule.h
+9
-0
py/runtime.c
py/runtime.c
+9
-0
No files found.
py/builtinimport.c
View file @
03d4f7b2
...
...
@@ -44,6 +44,8 @@
#define DEBUG_printf(...) (void)0
#endif
#if MICROPY_ENABLE_EXTERNAL_IMPORT
#define PATH_SEP_CHAR '/'
bool
mp_obj_is_package
(
mp_obj_t
module
)
{
...
...
@@ -389,19 +391,7 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {
}
// found weak linked module
module_obj
=
el
->
value
;
if
(
MICROPY_MODULE_BUILTIN_INIT
)
{
// look for __init__ and call it if it exists
// Note: this code doesn't work fully correctly because it allows the
// __init__ function to be called twice if the module is imported by its
// non-weak-link name. Also, this code is duplicated in objmodule.c.
mp_obj_t
dest
[
2
];
mp_load_method_maybe
(
el
->
value
,
MP_QSTR___init__
,
dest
);
if
(
dest
[
0
]
!=
MP_OBJ_NULL
)
{
mp_call_method_n_kw
(
0
,
0
,
dest
);
// register module so __init__ is not called again
mp_module_register
(
mod_name
,
el
->
value
);
}
}
mp_module_call_init
(
mod_name
,
module_obj
);
}
else
{
no_exist:
#else
...
...
@@ -485,4 +475,41 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {
// Otherwise, we need to return top-level package
return
top_module_obj
;
}
#else // MICROPY_ENABLE_EXTERNAL_IMPORT
mp_obj_t
mp_builtin___import__
(
size_t
n_args
,
const
mp_obj_t
*
args
)
{
// Check that it's not a relative import
if
(
n_args
>=
5
&&
MP_OBJ_SMALL_INT_VALUE
(
args
[
4
])
!=
0
)
{
mp_raise_NotImplementedError
(
"relative import"
);
}
// Check if module already exists, and return it if it does
qstr
module_name_qstr
=
mp_obj_str_get_qstr
(
args
[
0
]);
mp_obj_t
module_obj
=
mp_module_get
(
module_name_qstr
);
if
(
module_obj
!=
MP_OBJ_NULL
)
{
return
module_obj
;
}
#if MICROPY_MODULE_WEAK_LINKS
// Check if there is a weak link to this module
mp_map_elem_t
*
el
=
mp_map_lookup
((
mp_map_t
*
)
&
mp_builtin_module_weak_links_map
,
MP_OBJ_NEW_QSTR
(
module_name_qstr
),
MP_MAP_LOOKUP
);
if
(
el
!=
NULL
)
{
// Found weak-linked module
mp_module_call_init
(
module_name_qstr
,
el
->
value
);
return
el
->
value
;
}
#endif
// Couldn't find the module, so fail
if
(
MICROPY_ERROR_REPORTING
==
MICROPY_ERROR_REPORTING_TERSE
)
{
mp_raise_msg
(
&
mp_type_ImportError
,
"module not found"
);
}
else
{
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_ImportError
,
"no module named '%q'"
,
module_name_qstr
));
}
}
#endif // MICROPY_ENABLE_EXTERNAL_IMPORT
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN
(
mp_builtin___import___obj
,
1
,
5
,
mp_builtin___import__
);
py/modmicropython.c
View file @
03d4f7b2
...
...
@@ -104,15 +104,15 @@ STATIC mp_obj_t mp_micropython_qstr_info(size_t n_args, const mp_obj_t *args) {
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN
(
mp_micropython_qstr_info_obj
,
0
,
1
,
mp_micropython_qstr_info
);
#if MICROPY_STACK_CHECK
#endif // MICROPY_PY_MICROPYTHON_MEM_INFO
#if MICROPY_PY_MICROPYTHON_STACK_USE
STATIC
mp_obj_t
mp_micropython_stack_use
(
void
)
{
return
MP_OBJ_NEW_SMALL_INT
(
mp_stack_usage
());
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_0
(
mp_micropython_stack_use_obj
,
mp_micropython_stack_use
);
#endif
#endif // MICROPY_PY_MICROPYTHON_MEM_INFO
#if MICROPY_ENABLE_PYSTACK
STATIC
mp_obj_t
mp_micropython_pystack_use
(
void
)
{
return
MP_OBJ_NEW_SMALL_INT
(
mp_pystack_usage
());
...
...
@@ -168,10 +168,10 @@ STATIC const mp_rom_map_elem_t mp_module_micropython_globals_table[] = {
#endif
{
MP_ROM_QSTR
(
MP_QSTR_mem_info
),
MP_ROM_PTR
(
&
mp_micropython_mem_info_obj
)
},
{
MP_ROM_QSTR
(
MP_QSTR_qstr_info
),
MP_ROM_PTR
(
&
mp_micropython_qstr_info_obj
)
},
#if MICROPY_STACK_CHECK
#endif
#if MICROPY_PY_MICROPYTHON_STACK_USE
{
MP_ROM_QSTR
(
MP_QSTR_stack_use
),
MP_ROM_PTR
(
&
mp_micropython_stack_use_obj
)
},
#endif
#endif
#if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF && (MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE == 0)
{
MP_ROM_QSTR
(
MP_QSTR_alloc_emergency_exception_buf
),
MP_ROM_PTR
(
&
mp_alloc_emergency_exception_buf_obj
)
},
#endif
...
...
py/mpconfig.h
View file @
03d4f7b2
...
...
@@ -405,6 +405,13 @@
/*****************************************************************************/
/* Python internal features */
// Whether to enable import of external modules
// When disabled, only importing of built-in modules is supported
// When enabled, a port must implement mp_import_stat (among other things)
#ifndef MICROPY_ENABLE_EXTERNAL_IMPORT
#define MICROPY_ENABLE_EXTERNAL_IMPORT (1)
#endif
// Whether to use the POSIX reader for importing files
#ifndef MICROPY_READER_POSIX
#define MICROPY_READER_POSIX (0)
...
...
@@ -905,6 +912,11 @@ typedef double mp_float_t;
#define MICROPY_PY_MICROPYTHON_MEM_INFO (0)
#endif
// Whether to provide "micropython.stack_use" function
#ifndef MICROPY_PY_MICROPYTHON_STACK_USE
#define MICROPY_PY_MICROPYTHON_STACK_USE (MICROPY_PY_MICROPYTHON_MEM_INFO)
#endif
// Whether to provide "array" module. Note that large chunk of the
// underlying code is shared with "bytearray" builtin type, so to
// get real savings, it should be disabled too.
...
...
py/objmodule.c
View file @
03d4f7b2
...
...
@@ -255,17 +255,7 @@ mp_obj_t mp_module_get(qstr module_name) {
#endif
return
MP_OBJ_NULL
;
}
if
(
MICROPY_MODULE_BUILTIN_INIT
)
{
// look for __init__ and call it if it exists
mp_obj_t
dest
[
2
];
mp_load_method_maybe
(
el
->
value
,
MP_QSTR___init__
,
dest
);
if
(
dest
[
0
]
!=
MP_OBJ_NULL
)
{
mp_call_method_n_kw
(
0
,
0
,
dest
);
// register module so __init__ is not called again
mp_module_register
(
module_name
,
el
->
value
);
}
}
mp_module_call_init
(
module_name
,
el
->
value
);
}
// module found, return it
...
...
@@ -276,3 +266,19 @@ void mp_module_register(qstr qst, mp_obj_t module) {
mp_map_t
*
mp_loaded_modules_map
=
&
MP_STATE_VM
(
mp_loaded_modules_dict
).
map
;
mp_map_lookup
(
mp_loaded_modules_map
,
MP_OBJ_NEW_QSTR
(
qst
),
MP_MAP_LOOKUP_ADD_IF_NOT_FOUND
)
->
value
=
module
;
}
#if MICROPY_MODULE_BUILTIN_INIT
void
mp_module_call_init
(
qstr
module_name
,
mp_obj_t
module_obj
)
{
// Look for __init__ and call it if it exists
mp_obj_t
dest
[
2
];
mp_load_method_maybe
(
module_obj
,
MP_QSTR___init__
,
dest
);
if
(
dest
[
0
]
!=
MP_OBJ_NULL
)
{
mp_call_method_n_kw
(
0
,
0
,
dest
);
// Register module so __init__ is not called again.
// If a module can be referenced by more than one name (eg due to weak links)
// then __init__ will still be called for each distinct import, and it's then
// up to the particular module to make sure it's __init__ code only runs once.
mp_module_register
(
module_name
,
module_obj
);
}
}
#endif
py/objmodule.h
View file @
03d4f7b2
...
...
@@ -34,4 +34,13 @@ extern const mp_map_t mp_builtin_module_weak_links_map;
mp_obj_t
mp_module_get
(
qstr
module_name
);
void
mp_module_register
(
qstr
qstr
,
mp_obj_t
module
);
#if MICROPY_MODULE_BUILTIN_INIT
void
mp_module_call_init
(
qstr
module_name
,
mp_obj_t
module_obj
);
#else
static
inline
void
mp_module_call_init
(
qstr
module_name
,
mp_obj_t
module_obj
)
{
(
void
)
module_name
;
(
void
)
module_obj
;
}
#endif
#endif // MICROPY_INCLUDED_PY_OBJMODULE_H
py/runtime.c
View file @
03d4f7b2
...
...
@@ -1343,6 +1343,8 @@ import_error:
return
dest
[
0
];
}
#if MICROPY_ENABLE_EXTERNAL_IMPORT
// See if it's a package, then can try FS import
if
(
!
mp_obj_is_package
(
module
))
{
goto
import_error
;
...
...
@@ -1369,6 +1371,13 @@ import_error:
// TODO lookup __import__ and call that instead of going straight to builtin implementation
return
mp_builtin___import__
(
5
,
args
);
#else
// Package import not supported with external imports disabled
goto
import_error
;
#endif
}
void
mp_import_all
(
mp_obj_t
module
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment