aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorMartin Wickham <spexguy070@gmail.com>2021-10-01 15:02:49 -0500
committerMartin Wickham <spexguy070@gmail.com>2021-10-02 15:21:49 -0500
commitfd60012c21360202a74b17d87d230a18d56edc88 (patch)
tree32ef5e9f386c0fedcb71b825e90029879ebd7628 /src/Module.zig
parent01e08c92b3d1a7895762e7b8f8a7913d08c3fa6c (diff)
downloadzig-fd60012c21360202a74b17d87d230a18d56edc88.tar.gz
zig-fd60012c21360202a74b17d87d230a18d56edc88.zip
Change *Scope to *Scope.Block, use Sema when required
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig181
1 files changed, 9 insertions, 172 deletions
diff --git a/src/Module.zig b/src/Module.zig
index fb6bdad3ac..27210519b8 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -2372,7 +2372,7 @@ pub const LazySrcLoc = union(enum) {
node_offset_lib_name: i32,
/// Upgrade to a `SrcLoc` based on the `Decl` or file in the provided scope.
- pub fn toSrcLoc(lazy: LazySrcLoc, scope: *Scope) SrcLoc {
+ pub fn toSrcLoc(lazy: LazySrcLoc, block: *Scope.Block) SrcLoc {
return switch (lazy) {
.unneeded,
.entire_file,
@@ -2380,7 +2380,7 @@ pub const LazySrcLoc = union(enum) {
.token_abs,
.node_abs,
=> .{
- .file_scope = scope.getFileScope(),
+ .file_scope = block.getFileScope(),
.parent_decl_node = 0,
.lazy = lazy,
},
@@ -2416,8 +2416,8 @@ pub const LazySrcLoc = union(enum) {
.node_offset_anyframe_type,
.node_offset_lib_name,
=> .{
- .file_scope = scope.getFileScope(),
- .parent_decl_node = scope.srcDecl().?.src_node,
+ .file_scope = block.getFileScope(),
+ .parent_decl_node = block.src_decl.src_node,
.lazy = lazy,
},
};
@@ -3464,12 +3464,12 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool {
if (decl.is_usingnamespace) {
const ty_ty = Type.initTag(.type);
if (!decl_tv.ty.eql(ty_ty)) {
- return mod.fail(&block_scope.base, src, "expected type, found {}", .{decl_tv.ty});
+ return sema.fail(&block_scope, src, "expected type, found {}", .{decl_tv.ty});
}
var buffer: Value.ToTypeBuffer = undefined;
const ty = decl_tv.val.toType(&buffer);
if (ty.getNamespace() == null) {
- return mod.fail(&block_scope.base, src, "type {} has no namespace", .{ty});
+ return sema.fail(&block_scope, src, "type {} has no namespace", .{ty});
}
decl.ty = ty_ty;
@@ -3532,11 +3532,11 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool {
if (decl.is_exported) {
const export_src = src; // TODO make this point at `export` token
if (is_inline) {
- return mod.fail(&block_scope.base, export_src, "export of inline function", .{});
+ return sema.fail(&block_scope, export_src, "export of inline function", .{});
}
// The scope needs to have the decl in it.
const options: std.builtin.ExportOptions = .{ .name = mem.spanZ(decl.name) };
- try mod.analyzeExport(&block_scope, export_src, options, decl);
+ try sema.analyzeExport(&block_scope, export_src, options, decl);
}
return type_changed or is_inline != prev_is_inline;
}
@@ -3590,7 +3590,7 @@ fn semaDecl(mod: *Module, decl: *Decl) !bool {
const export_src = src; // TODO point to the export token
// The scope needs to have the decl in it.
const options: std.builtin.ExportOptions = .{ .name = mem.spanZ(decl.name) };
- try mod.analyzeExport(&block_scope, export_src, options, decl);
+ try sema.analyzeExport(&block_scope, export_src, options, decl);
}
return type_changed;
@@ -4347,81 +4347,6 @@ pub fn getErrorValue(mod: *Module, name: []const u8) !std.StringHashMapUnmanaged
};
}
-pub fn analyzeExport(
- mod: *Module,
- block: *Scope.Block,
- src: LazySrcLoc,
- borrowed_options: std.builtin.ExportOptions,
- exported_decl: *Decl,
-) !void {
- try mod.ensureDeclAnalyzed(exported_decl);
- switch (exported_decl.ty.zigTypeTag()) {
- .Fn => {},
- else => return mod.fail(&block.base, src, "unable to export type '{}'", .{exported_decl.ty}),
- }
-
- const gpa = mod.gpa;
-
- try mod.decl_exports.ensureUnusedCapacity(gpa, 1);
- try mod.export_owners.ensureUnusedCapacity(gpa, 1);
-
- const new_export = try gpa.create(Export);
- errdefer gpa.destroy(new_export);
-
- const symbol_name = try gpa.dupe(u8, borrowed_options.name);
- errdefer gpa.free(symbol_name);
-
- const section: ?[]const u8 = if (borrowed_options.section) |s| try gpa.dupe(u8, s) else null;
- errdefer if (section) |s| gpa.free(s);
-
- const src_decl = block.src_decl;
- const owner_decl = block.sema.owner_decl;
-
- log.debug("exporting Decl '{s}' as symbol '{s}' from Decl '{s}'", .{
- exported_decl.name, symbol_name, owner_decl.name,
- });
-
- new_export.* = .{
- .options = .{
- .name = symbol_name,
- .linkage = borrowed_options.linkage,
- .section = section,
- },
- .src = src,
- .link = switch (mod.comp.bin_file.tag) {
- .coff => .{ .coff = {} },
- .elf => .{ .elf = link.File.Elf.Export{} },
- .macho => .{ .macho = link.File.MachO.Export{} },
- .plan9 => .{ .plan9 = null },
- .c => .{ .c = {} },
- .wasm => .{ .wasm = {} },
- .spirv => .{ .spirv = {} },
- },
- .owner_decl = owner_decl,
- .src_decl = src_decl,
- .exported_decl = exported_decl,
- .status = .in_progress,
- };
-
- // Add to export_owners table.
- const eo_gop = mod.export_owners.getOrPutAssumeCapacity(owner_decl);
- if (!eo_gop.found_existing) {
- eo_gop.value_ptr.* = &[0]*Export{};
- }
- eo_gop.value_ptr.* = try gpa.realloc(eo_gop.value_ptr.*, eo_gop.value_ptr.len + 1);
- eo_gop.value_ptr.*[eo_gop.value_ptr.len - 1] = new_export;
- errdefer eo_gop.value_ptr.* = gpa.shrink(eo_gop.value_ptr.*, eo_gop.value_ptr.len - 1);
-
- // Add to exported_decl table.
- const de_gop = mod.decl_exports.getOrPutAssumeCapacity(exported_decl);
- if (!de_gop.found_existing) {
- de_gop.value_ptr.* = &[0]*Export{};
- }
- de_gop.value_ptr.* = try gpa.realloc(de_gop.value_ptr.*, de_gop.value_ptr.len + 1);
- de_gop.value_ptr.*[de_gop.value_ptr.len - 1] = new_export;
- errdefer de_gop.value_ptr.* = gpa.shrink(de_gop.value_ptr.*, de_gop.value_ptr.len - 1);
-}
-
/// Takes ownership of `name` even if it returns an error.
pub fn createAnonymousDeclNamed(
mod: *Module,
@@ -4506,19 +4431,6 @@ pub fn makeIntType(arena: *Allocator, signedness: std.builtin.Signedness, bits:
return Type.initPayload(&int_payload.base);
}
-/// We don't return a pointer to the new error note because the pointer
-/// becomes invalid when you add another one.
-pub fn errNote(
- mod: *Module,
- scope: *Scope,
- src: LazySrcLoc,
- parent: *ErrorMsg,
- comptime format: []const u8,
- args: anytype,
-) error{OutOfMemory}!void {
- return mod.errNoteNonLazy(src.toSrcLoc(scope), parent, format, args);
-}
-
pub fn errNoteNonLazy(
mod: *Module,
src_loc: SrcLoc,
@@ -4536,81 +4448,6 @@ pub fn errNoteNonLazy(
};
}
-pub fn errMsg(
- mod: *Module,
- scope: *Scope,
- src: LazySrcLoc,
- comptime format: []const u8,
- args: anytype,
-) error{OutOfMemory}!*ErrorMsg {
- return ErrorMsg.create(mod.gpa, src.toSrcLoc(scope), format, args);
-}
-
-pub fn fail(
- mod: *Module,
- scope: *Scope,
- src: LazySrcLoc,
- comptime format: []const u8,
- args: anytype,
-) CompileError {
- const err_msg = try mod.errMsg(scope, src, format, args);
- return mod.failWithOwnedErrorMsg(scope, err_msg);
-}
-
-/// Same as `fail`, except given a token index, and the function sets up the `LazySrcLoc`
-/// for pointing at it relatively by subtracting from the containing `Decl`.
-pub fn failTok(
- mod: *Module,
- scope: *Scope,
- token_index: Ast.TokenIndex,
- comptime format: []const u8,
- args: anytype,
-) CompileError {
- const src = scope.srcDecl().?.tokSrcLoc(token_index);
- return mod.fail(scope, src, format, args);
-}
-
-/// Same as `fail`, except given an AST node index, and the function sets up the `LazySrcLoc`
-/// for pointing at it relatively by subtracting from the containing `Decl`.
-pub fn failNode(
- mod: *Module,
- scope: *Scope,
- node_index: Ast.Node.Index,
- comptime format: []const u8,
- args: anytype,
-) CompileError {
- const src = scope.srcDecl().?.nodeSrcLoc(node_index);
- return mod.fail(scope, src, format, args);
-}
-
-pub fn failWithOwnedErrorMsg(mod: *Module, scope: *Scope, err_msg: *ErrorMsg) CompileError {
- @setCold(true);
-
- {
- errdefer err_msg.destroy(mod.gpa);
- if (err_msg.src_loc.lazy == .unneeded) {
- return error.NeededSourceLocation;
- }
- try mod.failed_decls.ensureUnusedCapacity(mod.gpa, 1);
- try mod.failed_files.ensureUnusedCapacity(mod.gpa, 1);
- }
- switch (scope.tag) {
- .block => {
- const block = scope.cast(Scope.Block).?;
- if (block.sema.owner_func) |func| {
- func.state = .sema_failure;
- } else {
- block.sema.owner_decl.analysis = .sema_failure;
- block.sema.owner_decl.generation = mod.generation;
- }
- mod.failed_decls.putAssumeCapacityNoClobber(block.sema.owner_decl, err_msg);
- },
- .file => unreachable,
- .namespace => unreachable,
- }
- return error.AnalysisFail;
-}
-
pub fn optionalType(arena: *Allocator, child_type: Type) Allocator.Error!Type {
switch (child_type.tag()) {
.single_const_pointer => return Type.Tag.optional_single_const_pointer.create(