mirror of
https://github.com/ziglang/zig.git
synced 2026-02-15 13:58:27 +00:00
Zcu.Decl: replace typedValue with valueOrFail
Now that the legacy `Value` representation is eliminated, we can begin to phase out the redundant `TypedValue` type.
This commit is contained in:
parent
920f2c7794
commit
0d8c7ae007
@ -480,17 +480,11 @@ pub const Decl = struct {
|
||||
return decl.val.typeOf(zcu);
|
||||
}
|
||||
|
||||
pub fn typedValue(decl: Decl, zcu: *const Zcu) error{AnalysisFail}!TypedValue {
|
||||
/// Small wrapper for Sema to use over direct access to the `val` field.
|
||||
/// If the value is not populated, instead returns `error.AnalysisFail`.
|
||||
pub fn valueOrFail(decl: Decl) error{AnalysisFail}!Value {
|
||||
if (!decl.has_tv) return error.AnalysisFail;
|
||||
return .{
|
||||
.ty = decl.typeOf(zcu),
|
||||
.val = decl.val,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn isFunction(decl: Decl, zcu: *const Zcu) !bool {
|
||||
const tv = try decl.typedValue(zcu);
|
||||
return tv.ty.zigTypeTag(zcu) == .Fn;
|
||||
return decl.val;
|
||||
}
|
||||
|
||||
/// If the Decl owns its value and it is a struct, return it,
|
||||
|
||||
30
src/Sema.zig
30
src/Sema.zig
@ -26660,13 +26660,12 @@ fn prepareSimplePanic(sema: *Sema, block: *Block) !void {
|
||||
// decl_index may be an alias; we must find the decl that actually
|
||||
// owns the function.
|
||||
try sema.ensureDeclAnalyzed(decl_index);
|
||||
const tv = try mod.declPtr(decl_index).typedValue(mod);
|
||||
const fn_val = try mod.declPtr(decl_index).valueOrFail();
|
||||
try sema.declareDependency(.{ .decl_val = decl_index });
|
||||
assert(tv.ty.zigTypeTag(mod) == .Fn);
|
||||
assert(try sema.fnHasRuntimeBits(tv.ty));
|
||||
const func_index = tv.val.toIntern();
|
||||
try mod.ensureFuncBodyAnalysisQueued(func_index);
|
||||
mod.panic_func_index = func_index;
|
||||
assert(fn_val.typeOf(mod).zigTypeTag(mod) == .Fn);
|
||||
assert(try sema.fnHasRuntimeBits(fn_val.typeOf(mod)));
|
||||
try mod.ensureFuncBodyAnalysisQueued(fn_val.toIntern());
|
||||
mod.panic_func_index = fn_val.toIntern();
|
||||
}
|
||||
|
||||
if (mod.null_stack_trace == .none) {
|
||||
@ -32449,8 +32448,8 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: InternPool.DeclIndex, analyze_fn
|
||||
const mod = sema.mod;
|
||||
try sema.ensureDeclAnalyzed(decl_index);
|
||||
|
||||
const decl_tv = try mod.declPtr(decl_index).typedValue(mod);
|
||||
const owner_decl = mod.declPtr(switch (mod.intern_pool.indexToKey(decl_tv.val.toIntern())) {
|
||||
const decl_val = try mod.declPtr(decl_index).valueOrFail();
|
||||
const owner_decl = mod.declPtr(switch (mod.intern_pool.indexToKey(decl_val.toIntern())) {
|
||||
.variable => |variable| variable.decl,
|
||||
.extern_func => |extern_func| extern_func.decl,
|
||||
.func => |func| func.owner_decl,
|
||||
@ -32459,10 +32458,10 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: InternPool.DeclIndex, analyze_fn
|
||||
// TODO: if this is a `decl_ref` of a non-variable decl, only depend on decl type
|
||||
try sema.declareDependency(.{ .decl_val = decl_index });
|
||||
const ptr_ty = try sema.ptrType(.{
|
||||
.child = decl_tv.ty.toIntern(),
|
||||
.child = decl_val.typeOf(mod).toIntern(),
|
||||
.flags = .{
|
||||
.alignment = owner_decl.alignment,
|
||||
.is_const = if (decl_tv.val.getVariable(mod)) |variable| variable.is_const else true,
|
||||
.is_const = if (decl_val.getVariable(mod)) |variable| variable.is_const else true,
|
||||
.address_space = owner_decl.@"addrspace",
|
||||
},
|
||||
});
|
||||
@ -32478,12 +32477,10 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: InternPool.DeclIndex, analyze_fn
|
||||
fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: InternPool.DeclIndex) !void {
|
||||
const mod = sema.mod;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
const tv = try decl.typedValue(mod);
|
||||
if (tv.ty.zigTypeTag(mod) != .Fn) return;
|
||||
if (!try sema.fnHasRuntimeBits(tv.ty)) return;
|
||||
const func_index = tv.val.toIntern();
|
||||
if (!mod.intern_pool.isFuncBody(func_index)) return; // undef or extern function
|
||||
try mod.ensureFuncBodyAnalysisQueued(func_index);
|
||||
const decl_val = try decl.valueOrFail();
|
||||
if (!mod.intern_pool.isFuncBody(decl_val.toIntern())) return;
|
||||
if (!try sema.fnHasRuntimeBits(decl_val.typeOf(mod))) return;
|
||||
try mod.ensureFuncBodyAnalysisQueued(decl_val.toIntern());
|
||||
}
|
||||
|
||||
fn analyzeRef(
|
||||
@ -39049,7 +39046,6 @@ fn sliceToIpString(
|
||||
reason: NeededComptimeReason,
|
||||
) CompileError!InternPool.NullTerminatedString {
|
||||
const zcu = sema.mod;
|
||||
const ip = &zcu.intern_pool;
|
||||
const slice_ty = slice_val.typeOf(zcu);
|
||||
assert(slice_ty.isSlice(zcu));
|
||||
assert(slice_ty.childType(zcu).toIntern() == .u8_type);
|
||||
|
||||
@ -1762,7 +1762,7 @@ pub const Object = struct {
|
||||
const decl_name = decl_name: {
|
||||
const decl_name = mod.intern_pool.stringToSlice(decl.name);
|
||||
|
||||
if (mod.getTarget().isWasm() and try decl.isFunction(mod)) {
|
||||
if (mod.getTarget().isWasm() and decl.val.typeOf(mod).zigTypeTag(mod) == .Fn) {
|
||||
if (mod.intern_pool.stringToSliceUnwrap(decl.getOwnedExternFunc(mod).?.lib_name)) |lib_name| {
|
||||
if (!std.mem.eql(u8, lib_name, "c")) {
|
||||
break :decl_name try self.builder.strtabStringFmt("{s}|{s}", .{ decl_name, lib_name });
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user