Commit e807020679
Changed files (3)
src/AstGen.zig
@@ -36,7 +36,7 @@ compile_errors: ArrayListUnmanaged(Zir.Inst.CompileErrors.Item) = .{},
fn_block: ?*GenZir = null,
/// Maps string table indexes to the first `@import` ZIR instruction
/// that uses this string as the operand.
-imports: std.AutoArrayHashMapUnmanaged(u32, Zir.Inst.Index) = .{},
+imports: std.AutoArrayHashMapUnmanaged(u32, ast.TokenIndex) = .{},
const InnerError = error{ OutOfMemory, AnalysisFail };
@@ -132,8 +132,7 @@ pub fn generate(gpa: *Allocator, tree: ast.Tree) Allocator.Error!Zir {
if (astgen.compile_errors.items.len == 0) {
astgen.extra.items[err_index] = 0;
} else {
- try astgen.extra.ensureCapacity(gpa, astgen.extra.items.len +
- 1 + astgen.compile_errors.items.len *
+ try astgen.extra.ensureUnusedCapacity(gpa, 1 + astgen.compile_errors.items.len *
@typeInfo(Zir.Inst.CompileErrors.Item).Struct.fields.len);
astgen.extra.items[err_index] = astgen.addExtraAssumeCapacity(Zir.Inst.CompileErrors{
@@ -149,13 +148,20 @@ pub fn generate(gpa: *Allocator, tree: ast.Tree) Allocator.Error!Zir {
if (astgen.imports.count() == 0) {
astgen.extra.items[imports_index] = 0;
} else {
- try astgen.extra.ensureCapacity(gpa, astgen.extra.items.len +
- @typeInfo(Zir.Inst.Imports).Struct.fields.len + astgen.imports.count());
+ try astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Imports).Struct.fields.len +
+ astgen.imports.count() * @typeInfo(Zir.Inst.Imports.Item).Struct.fields.len);
astgen.extra.items[imports_index] = astgen.addExtraAssumeCapacity(Zir.Inst.Imports{
.imports_len = @intCast(u32, astgen.imports.count()),
});
- astgen.extra.appendSliceAssumeCapacity(astgen.imports.values());
+
+ var it = astgen.imports.iterator();
+ while (it.next()) |entry| {
+ _ = astgen.addExtraAssumeCapacity(Zir.Inst.Imports.Item{
+ .name = entry.key_ptr.*,
+ .token = entry.value_ptr.*,
+ });
+ }
}
return Zir{
@@ -6986,12 +6992,10 @@ fn builtinCall(
const str_lit_token = main_tokens[operand_node];
const str = try astgen.strLitAsString(str_lit_token);
const result = try gz.addStrTok(.import, str.index, str_lit_token);
- if (gz.refToIndex(result)) |import_inst_index| {
const gop = try astgen.imports.getOrPut(astgen.gpa, str.index);
if (!gop.found_existing) {
- gop.value_ptr.* = import_inst_index;
+ gop.value_ptr.* = str_lit_token;
}
- }
return rvalue(gz, rl, result, node);
},
.compile_log => {
src/Compilation.zig
@@ -2315,7 +2315,7 @@ const AstGenSrc = union(enum) {
root,
import: struct {
importing_file: *Module.Scope.File,
- import_inst: Zir.Inst.Index,
+ import_tok: std.zig.ast.TokenIndex,
},
};
@@ -2352,11 +2352,15 @@ fn workerAstGenFile(
assert(file.zir_loaded);
const imports_index = file.zir.extra[@enumToInt(Zir.ExtraIndex.imports)];
if (imports_index != 0) {
- const imports_len = file.zir.extra[imports_index];
+ const extra = file.zir.extraData(Zir.Inst.Imports, imports_index);
+ var import_i: u32 = 0;
+ var extra_index = extra.end;
- for (file.zir.extra[imports_index + 1 ..][0..imports_len]) |import_inst| {
- const inst_data = file.zir.instructions.items(.data)[import_inst].str_tok;
- const import_path = inst_data.get(file.zir);
+ while (import_i < extra.data.imports_len) : (import_i += 1) {
+ const item = file.zir.extraData(Zir.Inst.Imports.Item, extra_index);
+ extra_index = item.end;
+
+ const import_path = file.zir.nullTerminatedString(item.data.name);
const import_result = blk: {
const lock = comp.mutex.acquire();
@@ -2370,7 +2374,7 @@ fn workerAstGenFile(
});
const sub_src: AstGenSrc = .{ .import = .{
.importing_file = file,
- .import_inst = import_inst,
+ .import_tok = item.data.token,
} };
wg.start();
comp.thread_pool.spawn(workerAstGenFile, .{
@@ -2602,12 +2606,11 @@ fn reportRetryableAstGenError(
},
.import => |info| blk: {
const importing_file = info.importing_file;
- const import_inst = info.import_inst;
- const inst_data = importing_file.zir.instructions.items(.data)[import_inst].str_tok;
+
break :blk .{
.file_scope = importing_file,
.parent_decl_node = 0,
- .lazy = .{ .token_offset = inst_data.src_tok },
+ .lazy = .{ .token_abs = info.import_tok },
};
},
};
src/Zir.zig
@@ -138,11 +138,17 @@ pub fn renderAsTextToFile(
const imports_index = scope_file.zir.extra[@enumToInt(ExtraIndex.imports)];
if (imports_index != 0) {
try fs_file.writeAll("Imports:\n");
- const imports_len = scope_file.zir.extra[imports_index];
- for (scope_file.zir.extra[imports_index + 1 ..][0..imports_len]) |import_inst| {
- const inst_data = writer.code.instructions.items(.data)[import_inst].str_tok;
- const src = inst_data.src();
- const import_path = inst_data.get(writer.code);
+
+ const extra = scope_file.zir.extraData(Inst.Imports, imports_index);
+ var import_i: u32 = 0;
+ var extra_index = extra.end;
+
+ while (import_i < extra.data.imports_len) : (import_i += 1) {
+ const item = scope_file.zir.extraData(Inst.Imports.Item, extra_index);
+ extra_index = item.end;
+
+ const src: LazySrcLoc = .{ .token_abs = item.data.token };
+ const import_path = scope_file.zir.nullTerminatedString(item.data.name);
try fs_file.writer().print(" @import(\"{}\") ", .{
std.zig.fmtEscapes(import_path),
});
@@ -2780,10 +2786,16 @@ pub const Inst = struct {
};
};
- /// Trailing: for each `imports_len` there is an instruction index
- /// to an import instruction.
+ /// Trailing: for each `imports_len` there is an Item
pub const Imports = struct {
imports_len: Zir.Inst.Index,
+
+ pub const Item = struct {
+ /// null terminated string index
+ name: u32,
+ /// points to the import name
+ token: ast.TokenIndex,
+ };
};
};