astgen: fix InternPool.zig — parser fallthrough for struct/enum/union, add @compileLog, fix @"..." escape scanning

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-16 16:18:20 +00:00
parent 58702f9648
commit 1377fae4cd
3 changed files with 48 additions and 4 deletions

View File

@@ -1318,8 +1318,11 @@ static uint32_t identAsString(AstGenCtx* ag, uint32_t ident_token) {
uint32_t content_start = start + 2; // skip @"
uint32_t content_end = content_start;
while (
content_end < ag->tree->source_len && source[content_end] != '"')
content_end < ag->tree->source_len && source[content_end] != '"') {
if (source[content_end] == '\\')
content_end++; // skip escape character
content_end++;
}
// Check for escapes.
bool has_escapes = false;
for (uint32_t j = content_start; j < content_end; j++) {
@@ -5474,6 +5477,29 @@ static uint32_t builtinCall(
return rvalue(gz, rl, result, node);
}
// clang-format on
// @compileLog — AstGen.zig:9275-9286.
// clang-format off
if (name_len == 10
&& memcmp(source + name_start, "compileLog", 10) == 0) {
// clang-format on
AstData nd = tree->nodes.datas[node];
uint32_t param_count
= (nd.lhs != 0 ? 1u : 0u) + (nd.rhs != 0 ? 1u : 0u);
ensureExtraCapacity(ag, 1 + param_count);
uint32_t payload_index = ag->extra_len;
ag->extra[ag->extra_len++]
= (uint32_t)((int32_t)node - (int32_t)gz->decl_node_index);
uint32_t args_index = ag->extra_len;
ag->extra_len += param_count;
if (nd.lhs != 0)
ag->extra[args_index++] = expr(gz, scope, nd.lhs);
if (nd.rhs != 0)
ag->extra[args_index++] = expr(gz, scope, nd.rhs);
uint32_t result
= addExtendedPayloadSmall(gz, (uint16_t)ZIR_EXT_COMPILE_LOG,
(uint16_t)param_count, payload_index);
return rvalue(gz, rl, result, node);
}
// TODO: handle other 1-arg builtins.
SET_ERROR(ag);
@@ -5817,6 +5843,24 @@ static uint32_t builtinCallMultiArg(GenZir* gz, Scope* scope, ResultLoc rl,
return rvalue(gz, rl, result, node);
}
// clang-format on
// @compileLog — AstGen.zig:9275-9286.
// clang-format off
if (name_len == 10
&& memcmp(source + name_start, "compileLog", 10) == 0) {
// clang-format on
ensureExtraCapacity(ag, 1 + param_count);
uint32_t payload_index = ag->extra_len;
ag->extra[ag->extra_len++]
= (uint32_t)((int32_t)node - (int32_t)gz->decl_node_index);
uint32_t args_index = ag->extra_len;
ag->extra_len += param_count;
for (uint32_t i = 0; i < param_count; i++)
ag->extra[args_index + i] = expr(gz, scope, params[i]);
uint32_t result
= addExtendedPayloadSmall(gz, (uint16_t)ZIR_EXT_COMPILE_LOG,
(uint16_t)param_count, payload_index);
return rvalue(gz, rl, result, node);
}
// TODO: handle other multi-arg builtins.
SET_ERROR(ag);

View File

@@ -1319,7 +1319,7 @@ const corpus_files = .{
"../src/Type.zig",
"../src/translate_c.zig",
"../src/Compilation.zig",
//"../src/InternPool.zig",
"../src/InternPool.zig",
//"../src/Sema.zig",
};

View File

@@ -796,8 +796,8 @@ static AstNodeIndex expectStatement(Parser* p, bool allow_defer_var) {
return expectIfStatement(p);
case TOKEN_KEYWORD_ENUM:
case TOKEN_KEYWORD_STRUCT:
case TOKEN_KEYWORD_UNION:;
fail(p, "unsupported statement keyword");
case TOKEN_KEYWORD_UNION:
// Parse.zig:961-971: fall through to expression parsing.
default:;
}