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:
@@ -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);
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
|
||||
@@ -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:;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user