同步操作将从 OpenHarmony-SIG/python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/** This file is part of the MicroPython project, http://micropython.org/** The MIT License (MIT)** Copyright (c) 2013-2019 Damien P. George* Copyright (c) 2014 Paul Sokolovsky** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documentation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN* THE SOFTWARE.*/#include <stdio.h>#include <string.h>#include <assert.h>#include "py/compile.h"#include "py/objmodule.h"#include "py/persistentcode.h"#include "py/runtime.h"#include "py/builtin.h"#include "py/frozenmod.h"#if MICROPY_DEBUG_VERBOSE // print debugging info#define DEBUG_PRINT (1)#define DEBUG_printf DEBUG_printf#else // don't print debugging info#define DEBUG_PRINT (0)#define DEBUG_printf(...) (void)0#endif#if MICROPY_ENABLE_EXTERNAL_IMPORT#define PATH_SEP_CHAR '/'#define printf(...) ((void)0)bool mp_obj_is_package(mp_obj_t module) {mp_obj_t dest[2];mp_load_method_maybe(module, MP_QSTR___path__, dest);return dest[0] != MP_OBJ_NULL;}// Stat either frozen or normal module by a given path// (whatever is available, if at all).STATIC mp_import_stat_t mp_import_stat_any(const char *path) {#if MICROPY_MODULE_FROZENmp_import_stat_t st = mp_frozen_stat(path);if (st != MP_IMPORT_STAT_NO_EXIST) {return st;}#endifreturn mp_import_stat(path);}STATIC mp_import_stat_t stat_file_py_or_mpy(vstr_t *path) {mp_import_stat_t stat = mp_import_stat_any(vstr_null_terminated_str(path));if (stat == MP_IMPORT_STAT_FILE) {return stat;}#if MICROPY_PERSISTENT_CODE_LOADvstr_ins_byte(path, path->len - 2, 'm');stat = mp_import_stat_any(vstr_null_terminated_str(path));if (stat == MP_IMPORT_STAT_FILE) {return stat;}#endifreturn MP_IMPORT_STAT_NO_EXIST;}STATIC mp_import_stat_t stat_dir_or_file(vstr_t *path) {mp_import_stat_t stat = mp_import_stat_any(vstr_null_terminated_str(path));DEBUG_printf("stat %s: %d\n", vstr_str(path), stat);if (stat == MP_IMPORT_STAT_DIR) {return stat;}// not a directory, add .py and try as a filevstr_add_str(path, ".py");return stat_file_py_or_mpy(path);}STATIC mp_import_stat_t find_file(const char *file_str, uint file_len, vstr_t *dest) {#if MICROPY_PY_SYS// extract the list of pathssize_t path_num;mp_obj_t *path_items;mp_obj_list_get(mp_sys_path, &path_num, &path_items);printf("Delphi: %s : %d : path_num = %u\n", __FUNCTION__, __LINE__, path_num);if (path_num != 0) {// go through each path looking for a directory or filefor (size_t i = 0; i < path_num; i++) {vstr_reset(dest);size_t p_len;const char *p = mp_obj_str_get_data(path_items[i], &p_len);if (p_len > 0) {vstr_add_strn(dest, p, p_len);vstr_add_char(dest, PATH_SEP_CHAR);}vstr_add_strn(dest, file_str, file_len);printf("Delphi: %s : %d : dest = %s\n", __FUNCTION__, __LINE__, vstr_null_terminated_str(dest));mp_import_stat_t stat = stat_dir_or_file(dest);if (stat != MP_IMPORT_STAT_NO_EXIST) {return stat;}}// could not find a directory or filereturn MP_IMPORT_STAT_NO_EXIST;}#endif// mp_sys_path is empty, so just use the given file namevstr_add_strn(dest, file_str, file_len);return stat_dir_or_file(dest);}#if MICROPY_MODULE_FROZEN_STR || MICROPY_ENABLE_COMPILERSTATIC void do_load_from_lexer(mp_obj_t module_obj, mp_lexer_t *lex) {#if MICROPY_PY___FILE__qstr source_name = lex->source_name;mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(source_name));#endif// parse, compile and execute the module in its contextmp_obj_dict_t *mod_globals = mp_obj_module_get_globals(module_obj);mp_parse_compile_execute(lex, MP_PARSE_FILE_INPUT, mod_globals, mod_globals);}#endif#if MICROPY_PERSISTENT_CODE_LOAD || MICROPY_MODULE_FROZEN_MPYSTATIC void do_execute_raw_code(mp_obj_t module_obj, mp_raw_code_t *raw_code, const char *source_name) {(void)source_name;#if MICROPY_PY___FILE__mp_store_attr(module_obj, MP_QSTR___file__, MP_OBJ_NEW_QSTR(qstr_from_str(source_name)));#endif// execute the module in its contextmp_obj_dict_t *mod_globals = mp_obj_module_get_globals(module_obj);// save contextmp_obj_dict_t *volatile old_globals = mp_globals_get();mp_obj_dict_t *volatile old_locals = mp_locals_get();// set new contextmp_globals_set(mod_globals);mp_locals_set(mod_globals);nlr_buf_t nlr;if (nlr_push(&nlr) == 0) {mp_obj_t module_fun = mp_make_function_from_raw_code(raw_code, MP_OBJ_NULL, MP_OBJ_NULL);mp_call_function_0(module_fun);// finish nlr block, restore contextnlr_pop();mp_globals_set(old_globals);mp_locals_set(old_locals);} else {// exception; restore context and re-raise same exceptionmp_globals_set(old_globals);mp_locals_set(old_locals);nlr_jump(nlr.ret_val);}}#endifSTATIC void do_load(mp_obj_t module_obj, vstr_t *file) {#if MICROPY_MODULE_FROZEN || MICROPY_ENABLE_COMPILER || (MICROPY_PERSISTENT_CODE_LOAD && MICROPY_HAS_FILE_READER)char *file_str = vstr_null_terminated_str(file);#endifprintf("Delphi: %s : %d : file_str = %s\n", __FUNCTION__, __LINE__, file_str);// If we support frozen modules (either as str or mpy) then try to find the// requested filename in the list of frozen module filenames.#if MICROPY_MODULE_FROZENvoid *modref;int frozen_type = mp_find_frozen_module(file_str, file->len, &modref);#endif// If we support frozen str modules and the compiler is enabled, and we// found the filename in the list of frozen files, then load and execute it.#if MICROPY_MODULE_FROZEN_STRif (frozen_type == MP_FROZEN_STR) {do_load_from_lexer(module_obj, modref);return;}#endif// If we support frozen mpy modules and we found a corresponding file (and// its data) in the list of frozen files, execute it.#if MICROPY_MODULE_FROZEN_MPYif (frozen_type == MP_FROZEN_MPY) {do_execute_raw_code(module_obj, modref, file_str);return;}#endif// If we support loading .mpy files then check if the file extension is of// the correct format and, if so, load and execute the file.#if MICROPY_HAS_FILE_READER && MICROPY_PERSISTENT_CODE_LOADif (file_str[file->len - 3] == 'm') {mp_raw_code_t *raw_code = mp_raw_code_load_file(file_str);do_execute_raw_code(module_obj, raw_code, file_str);return;}#endif// If we can compile scripts then load the file and compile and execute it.#if MICROPY_ENABLE_COMPILER{mp_lexer_t *lex = mp_lexer_new_from_file(file_str);do_load_from_lexer(module_obj, lex);return;}#else// If we get here then the file was not frozen and we can't compile scripts.mp_raise_msg(&mp_type_ImportError, MP_ERROR_TEXT("script compilation not supported"));#endif}STATIC void chop_component(const char *start, const char **end) {const char *p = *end;while (p > start) {if (*--p == '.') {*end = p;return;}}*end = p;}mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {#if DEBUG_PRINTDEBUG_printf("__import__:\n");for (size_t i = 0; i < n_args; i++) {DEBUG_printf(" ");mp_obj_print(args[i], PRINT_REPR);DEBUG_printf("\n");}#endifmp_obj_t module_name = args[0];mp_obj_t fromtuple = mp_const_none;mp_int_t level = 0;if (n_args >= 4) {fromtuple = args[3];if (n_args >= 5) {level = MP_OBJ_SMALL_INT_VALUE(args[4]);if (level < 0) {mp_raise_ValueError(NULL);}}}size_t mod_len;const char *mod_str = mp_obj_str_get_data(module_name, &mod_len);if (level != 0) {// What we want to do here is to take name of current module,// chop <level> trailing components, and concatenate with passed-in// module name, thus resolving relative import name into absolute.// This even appears to be correct per// http://legacy.python.org/dev/peps/pep-0328/#relative-imports-and-name// "Relative imports use a module's __name__ attribute to determine that// module's position in the package hierarchy."level--;mp_obj_t this_name_q = mp_obj_dict_get(MP_OBJ_FROM_PTR(mp_globals_get()), MP_OBJ_NEW_QSTR(MP_QSTR___name__));assert(this_name_q != MP_OBJ_NULL);#if MICROPY_CPYTHON_COMPATif (MP_OBJ_QSTR_VALUE(this_name_q) == MP_QSTR___main__) {// This is a module run by -m command-line switch, get its real name from backup attributethis_name_q = mp_obj_dict_get(MP_OBJ_FROM_PTR(mp_globals_get()), MP_OBJ_NEW_QSTR(MP_QSTR___main__));}#endifmp_map_t *globals_map = &mp_globals_get()->map;mp_map_elem_t *elem = mp_map_lookup(globals_map, MP_OBJ_NEW_QSTR(MP_QSTR___path__), MP_MAP_LOOKUP);bool is_pkg = (elem != NULL);#if DEBUG_PRINTDEBUG_printf("Current module/package: ");mp_obj_print(this_name_q, PRINT_REPR);DEBUG_printf(", is_package: %d", is_pkg);DEBUG_printf("\n");#endifprintf("Current module/package: ");mp_obj_print(this_name_q, PRINT_REPR);printf(", is_package: %d", is_pkg);printf("\n");size_t this_name_l;const char *this_name = mp_obj_str_get_data(this_name_q, &this_name_l);const char *p = this_name + this_name_l;if (!is_pkg) {// We have module, but relative imports are anchored at package, so// go there.chop_component(this_name, &p);}while (level--) {chop_component(this_name, &p);}// We must have some component left over to import fromif (p == this_name) {mp_raise_ValueError(MP_ERROR_TEXT("can't perform relative import"));}uint new_mod_l = (mod_len == 0 ? (size_t)(p - this_name) : (size_t)(p - this_name) + 1 + mod_len);char *new_mod = mp_local_alloc(new_mod_l);memcpy(new_mod, this_name, p - this_name);if (mod_len != 0) {new_mod[p - this_name] = '.';memcpy(new_mod + (p - this_name) + 1, mod_str, mod_len);}qstr new_mod_q = qstr_from_strn(new_mod, new_mod_l);mp_local_free(new_mod);printf("Resolved base name for relative import: '%s'\n", qstr_str(new_mod_q));module_name = MP_OBJ_NEW_QSTR(new_mod_q);mod_str = qstr_str(new_mod_q);mod_len = new_mod_l;}if (mod_len == 0) {mp_raise_ValueError(NULL);}// check if module already existsqstr module_name_qstr = mp_obj_str_get_qstr(module_name);mp_obj_t module_obj = mp_module_get(module_name_qstr);if (module_obj != MP_OBJ_NULL) {DEBUG_printf("Module already loaded\n");// If it's not a package, return module right awaychar *p = strchr(mod_str, '.');if (p == NULL) {return module_obj;}// If fromlist is not empty, return leaf moduleif (fromtuple != mp_const_none) {return module_obj;}// Otherwise, we need to return top-level packageqstr pkg_name = qstr_from_strn(mod_str, p - mod_str);return mp_module_get(pkg_name);}printf("Module not yet loaded\n");uint last = 0;VSTR_FIXED(path, MICROPY_ALLOC_PATH_MAX)module_obj = MP_OBJ_NULL;mp_obj_t top_module_obj = MP_OBJ_NULL;mp_obj_t outer_module_obj = MP_OBJ_NULL;uint i;for (i = 1; i <= mod_len; i++) {if (i == mod_len || mod_str[i] == '.') {// create a qstr for the module name up to this depthqstr mod_name = qstr_from_strn(mod_str, i);printf("Processing module: %s\n", qstr_str(mod_name));printf("Previous path: =%u.%s=\n", vstr_len(&path), vstr_str(&path));// find the file corresponding to the module namemp_import_stat_t stat;if (vstr_len(&path) == 0) {// first module in the dotted-name; search for a directory or filestat = find_file(mod_str, i, &path);printf("Delphi: %s : %d : stat = %d\n", __FUNCTION__, __LINE__, stat);} else {// latter module in the dotted-name; append to pathvstr_add_char(&path, PATH_SEP_CHAR);vstr_add_strn(&path, mod_str + last, i - last);stat = stat_dir_or_file(&path);}printf("Current path: %u.%s\n", vstr_len(&path), vstr_str(&path));if (stat == MP_IMPORT_STAT_NO_EXIST) {module_obj = MP_OBJ_NULL;#if MICROPY_MODULE_WEAK_LINKS// check if there is a weak link to this moduleif (i == mod_len) {module_obj = mp_module_search_umodule(mod_str);if (module_obj != MP_OBJ_NULL) {// found weak linked modulemp_module_call_init(mod_name, module_obj);}}#endifif (module_obj == MP_OBJ_NULL) {// couldn't find the file, so fail#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSEmp_raise_msg(&mp_type_ImportError, MP_ERROR_TEXT("module not found"));#elsemp_raise_msg_varg(&mp_type_ImportError, MP_ERROR_TEXT("no module named '%q'"), mod_name);#endif}} else {// found the file, so get the modulemodule_obj = mp_module_get(mod_name);}if (module_obj == MP_OBJ_NULL) {// module not already loaded, so load it!module_obj = mp_obj_new_module(mod_name);// if args[3] (fromtuple) has magic value False, set up// this module for command-line "-m" option (set module's// name to __main__ instead of real name). Do this only// for *modules* however - packages never have their names// replaced, instead they're -m'ed using a special __main__// submodule in them. (This all apparently is done to not// touch package name itself, which is important for future// imports).if (i == mod_len && fromtuple == mp_const_false && stat != MP_IMPORT_STAT_DIR) {mp_obj_module_t *o = MP_OBJ_TO_PTR(module_obj);mp_obj_dict_store(MP_OBJ_FROM_PTR(o->globals), MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR___main__));#if MICROPY_CPYTHON_COMPAT// Store module as "__main__" in the dictionary of loaded modules (returned by sys.modules).mp_obj_dict_store(MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_loaded_modules_dict)), MP_OBJ_NEW_QSTR(MP_QSTR___main__), module_obj);// Store real name in "__main__" attribute. Chosen semi-randonly, to reuse existing qstr's.mp_obj_dict_store(MP_OBJ_FROM_PTR(o->globals), MP_OBJ_NEW_QSTR(MP_QSTR___main__), MP_OBJ_NEW_QSTR(mod_name));#endif}if (stat == MP_IMPORT_STAT_DIR) {printf("%u.*%s is dir\n", vstr_len(&path), vstr_str(&path));// https://docs.python.org/3/reference/import.html// "Specifically, any module that contains a __path__ attribute is considered a package."mp_store_attr(module_obj, MP_QSTR___path__, mp_obj_new_str(vstr_str(&path), vstr_len(&path)));size_t orig_path_len = path.len;vstr_add_char(&path, PATH_SEP_CHAR);vstr_add_str(&path, "__init__.py");if (stat_file_py_or_mpy(&path) != MP_IMPORT_STAT_FILE) {// mp_warning("%s is imported as namespace package", vstr_str(&path));} else {do_load(module_obj, &path);}path.len = orig_path_len;} else { // MP_IMPORT_STAT_FILEprintf("Delphi: %s : %d : path = %s\n", __FUNCTION__, __LINE__, vstr_str(&path));do_load(module_obj, &path);// This should be the last component in the import path. If there are// remaining components then it's an ImportError because the current path// (the module that was just loaded) is not a package. This will be caught// on the next iteration because the file will not exist.}}if (outer_module_obj != MP_OBJ_NULL) {qstr s = qstr_from_strn(mod_str + last, i - last);mp_store_attr(outer_module_obj, s, module_obj);}outer_module_obj = module_obj;if (top_module_obj == MP_OBJ_NULL) {top_module_obj = module_obj;}last = i + 1;}}// If fromlist is not empty, return leaf moduleif (fromtuple != mp_const_none) {return module_obj;}// Otherwise, we need to return top-level packagereturn top_module_obj;}#else // MICROPY_ENABLE_EXTERNAL_IMPORTmp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {// Check that it's not a relative importif (n_args >= 5 && MP_OBJ_SMALL_INT_VALUE(args[4]) != 0) {mp_raise_NotImplementedError(MP_ERROR_TEXT("relative import"));}// Check if module already exists, and return it if it doesqstr 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 modulemodule_obj = mp_module_search_umodule(qstr_str(module_name_qstr));if (module_obj != MP_OBJ_NULL) {// Found weak-linked modulemp_module_call_init(module_name_qstr, module_obj);return module_obj;}#endif// Couldn't find the module, so fail#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSEmp_raise_msg(&mp_type_ImportError, MP_ERROR_TEXT("module not found"));#elsemp_raise_msg_varg(&mp_type_ImportError, MP_ERROR_TEXT("no module named '%q'"), module_name_qstr);#endif}#endif // MICROPY_ENABLE_EXTERNAL_IMPORTMP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin___import___obj, 1, 5, mp_builtin___import__);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。