From 788c52b749d56492d55d9106e8a772126cdebbad Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 8 Oct 2026 20:03:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(tomllib):=20=E5=8D=95=E5=BC=95=E5=8F=B7?= =?UTF-8?q?=E5=A4=84=E8=AF=AF=E7=94=A8=E5=8F=8C=E5=BC=95=E5=8F=B7=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E5=AD=97=E9=9D=A2=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit char 形参与 char 比较位置写成「双引号包单引号」(实为 i8* 字符串):形参处报 CastError(implicit pointer-to-integer),比较处被 C 哨兵规则静默 ptrtoint 成恒假(TOML 单引号字面量字符串根本解析不出来)。7 处统一改成字符字面量,与 lexer.vp 同款写法一致。 --- tomllib/__parser.vp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tomllib/__parser.vp b/tomllib/__parser.vp index 54f4718..5597fc3 100644 --- a/tomllib/__parser.vp +++ b/tomllib/__parser.vp @@ -224,10 +224,10 @@ def _parse_basic_string(s: TomlState*) -> str: # Literal string '...': taken verbatim, no escapes. def _parse_literal_string(s: TomlState*) -> str: - if _peek(s) != "'": return None + if _peek(s) != '\'': return None _advance(s) start: sizet = s.pos - while s.pos < s.len and s.src[s.pos] != "'": + while s.pos < s.len and s.src[s.pos] != '\'': if _is_newline(s.src[s.pos]): return None s.pos += 1 if s.pos >= s.len: return None @@ -276,7 +276,7 @@ def _parse_multiline_literal(s: TomlState*) -> str: if _peek(s) == '\n': s.pos += 1 start: sizet = s.pos while s.pos < s.len: - if s.src[s.pos] == "'" and s.pos + 2 < s.len and s.src[s.pos + 1] == "'" and s.src[s.pos + 2] == "'": + if s.src[s.pos] == '\'' and s.pos + 2 < s.len and s.src[s.pos + 1] == '\'' and s.src[s.pos + 2] == '\'': n: sizet = s.pos - start s.pos += 3 return _copy_span(s.pool, s.src, start, n) @@ -440,9 +440,9 @@ def _parse_value(s: TomlState*) -> JsonValue*: else: sv = _parse_basic_string(s) if sv == None: return None return string_val(s.pool, sv) - if ch == "'": + if ch == '\'': sv2: str = None - if _is_multiline_open(s, "'") != 0: sv2 = _parse_multiline_literal(s) + if _is_multiline_open(s, '\'') != 0: sv2 = _parse_multiline_literal(s) else: sv2 = _parse_literal_string(s) if sv2 == None: return None return string_val(s.pool, sv2) @@ -468,8 +468,8 @@ def _parse_key_segment(s: TomlState*) -> str: if ch == '"': if _is_multiline_open(s, '"') != 0: return None return _parse_basic_string(s) - if ch == "'": - if _is_multiline_open(s, "'") != 0: return None + if ch == '\'': + if _is_multiline_open(s, '\'') != 0: return None return _parse_literal_string(s) if not _is_bare_key_char(ch): return None start: sizet = s.pos