stage2 提供近乎完整的功能但出现严重性能问题 添加stage0的原生性能记录 stage1添加更多内置函数 nob重构代码使其更加健壮
This commit is contained in:
1 parent
b5a7a811b3
commit
e02b0c633a
35 files changed
+14018
-216
No files matched your search
+31
-4
@@ -81,15 +81,18 @@ static void dump_tokens(spl_tok_vec_t toks) {
|
||||
vec_free(toks);
|
||||
}
|
||||
|
||||
/* 折叠重复分隔符并去掉 "." 路径分量,使同一模块的 import 解析结果唯一。
|
||||
就地重写,'\' 统一成 '/';保留前导分隔符(绝对路径)。 */
|
||||
/* 折叠重复分隔符、解析 "." 与 ".." 路径分量,使同一模块的 import 解析结果唯一。
|
||||
就地重写,'\' 统一成 '/';保留前导分隔符(绝对路径)。
|
||||
".." 会弹出上一个分量;无分量可弹时按相对语义保留(绝对根则忽略)。 */
|
||||
static void normalize_import_path(char *p) {
|
||||
usize n = strlen(p);
|
||||
char *out = malloc(n + 1);
|
||||
if (!out)
|
||||
return;
|
||||
char *base = out;
|
||||
char *w = out;
|
||||
if (p[0] == '/' || p[0] == '\\')
|
||||
int has_root = (p[0] == '/' || p[0] == '\\');
|
||||
if (has_root)
|
||||
*w++ = '/';
|
||||
|
||||
char *r = p;
|
||||
@@ -104,7 +107,31 @@ static void normalize_import_path(char *p) {
|
||||
usize len = (usize)(r - seg);
|
||||
if (len == 1 && seg[0] == '.')
|
||||
continue;
|
||||
if (w != out && w[-1] != '/')
|
||||
if (len == 2 && seg[0] == '.' && seg[1] == '.') {
|
||||
if (w == base + (has_root ? 1 : 0)) {
|
||||
if (!has_root) {
|
||||
*w++ = '.';
|
||||
*w++ = '.';
|
||||
}
|
||||
} else {
|
||||
char *q = w;
|
||||
while (q > base && q[-1] != '/')
|
||||
q--;
|
||||
usize sl = (usize)(w - q);
|
||||
if (sl == 2 && q[0] == '.' && q[1] == '.') {
|
||||
*w++ = '.';
|
||||
*w++ = '.';
|
||||
} else {
|
||||
if (q > base && q[-1] == '/')
|
||||
q--;
|
||||
w = q;
|
||||
if (w == base && has_root)
|
||||
w = base + 1;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (w != base && w[-1] != '/')
|
||||
*w++ = '/';
|
||||
memcpy(w, seg, len);
|
||||
w += len;
|
||||
|
||||
Reference in new issue
Block a user