aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-02-05 17:41:03 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-02-06 08:42:14 +0100
commit556f0ce5bfb962764bb68d9d9c16765cf9e1b9ba (patch)
treee3ddbc2240c99a089906a10c4c40dcc83a883f17 /src/value.zig
parent04f379dd414184a42412f4497b0573d7612d6730 (diff)
downloadzig-556f0ce5bfb962764bb68d9d9c16765cf9e1b9ba.tar.gz
zig-556f0ce5bfb962764bb68d9d9c16765cf9e1b9ba.zip
stage2: add new Decl subtype, ExternFn
`ExternFn` will contain a maybe-lib-name if it was defined with the `extern` keyword like so ```zig extern "c" fn write(usize, usize, usize) usize; ``` `lib_name` will live as long as `ExternFn` decl does.
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/value.zig b/src/value.zig
index e444e2daf1..38cba74b0b 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -262,9 +262,9 @@ pub const Value = extern union {
.int_big_negative,
=> Payload.BigInt,
- .extern_fn,
- .decl_ref,
- => Payload.Decl,
+ .extern_fn => Payload.ExternFn,
+
+ .decl_ref => Payload.Decl,
.repeated,
.eu_payload,
@@ -475,7 +475,7 @@ pub const Value = extern union {
return Value{ .ptr_otherwise = &new_payload.base };
},
.function => return self.copyPayloadShallow(arena, Payload.Function),
- .extern_fn => return self.copyPayloadShallow(arena, Payload.Decl),
+ .extern_fn => return self.copyPayloadShallow(arena, Payload.ExternFn),
.variable => return self.copyPayloadShallow(arena, Payload.Variable),
.decl_ref => return self.copyPayloadShallow(arena, Payload.Decl),
.decl_ref_mut => return self.copyPayloadShallow(arena, Payload.DeclRefMut),
@@ -1803,9 +1803,10 @@ pub const Value = extern union {
pub fn pointerDecl(val: Value) ?*Module.Decl {
return switch (val.tag()) {
.decl_ref_mut => val.castTag(.decl_ref_mut).?.data.decl,
- .extern_fn, .decl_ref => val.cast(Payload.Decl).?.data,
+ .extern_fn => val.castTag(.extern_fn).?.data.owner_decl,
.function => val.castTag(.function).?.data.owner_decl,
.variable => val.castTag(.variable).?.data.owner_decl,
+ .decl_ref => val.cast(Payload.Decl).?.data,
else => null,
};
}
@@ -1872,9 +1873,10 @@ pub const Value = extern union {
pub fn markReferencedDeclsAlive(val: Value) void {
switch (val.tag()) {
.decl_ref_mut => return val.castTag(.decl_ref_mut).?.data.decl.markAlive(),
- .extern_fn, .decl_ref => return val.cast(Payload.Decl).?.data.markAlive(),
+ .extern_fn => return val.castTag(.extern_fn).?.data.owner_decl.markAlive(),
.function => return val.castTag(.function).?.data.owner_decl.markAlive(),
.variable => return val.castTag(.variable).?.data.owner_decl.markAlive(),
+ .decl_ref => return val.cast(Payload.Decl).?.data.markAlive(),
.repeated,
.eu_payload,
@@ -3148,6 +3150,11 @@ pub const Value = extern union {
data: *Module.Fn,
};
+ pub const ExternFn = struct {
+ base: Payload,
+ data: *Module.ExternFn,
+ };
+
pub const Decl = struct {
base: Payload,
data: *Module.Decl,