aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/c.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-10-24 14:41:22 +0300
committerVeikka Tuominen <git@vexu.eu>2022-10-27 01:31:17 +0300
commitdd437ae39948031dc04836f245c8b77d459a428a (patch)
treeea2cf8ea5dce382549deaf9a2c8801ec1c7403d1 /src/codegen/c.zig
parent9db293492bbbc5b8d70638bd9c59dea19d13596c (diff)
downloadzig-dd437ae39948031dc04836f245c8b77d459a428a.tar.gz
zig-dd437ae39948031dc04836f245c8b77d459a428a.zip
stage2: optimize size of optional slices
Diffstat (limited to 'src/codegen/c.zig')
-rw-r--r--src/codegen/c.zig14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index d6584d75ae..5f6f2fd6d5 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -726,7 +726,11 @@ pub const DeclGen = struct {
}
if (ty.optionalReprIsPayload()) {
- return dg.renderValue(writer, payload_ty, val, location);
+ if (val.castTag(.opt_payload)) |payload| {
+ return dg.renderValue(writer, payload_ty, payload.data, location);
+ } else {
+ return dg.renderValue(writer, payload_ty, val, location);
+ }
}
try writer.writeByte('(');
@@ -3263,11 +3267,9 @@ fn airIsNull(
try f.writeCValue(writer, operand);
const ty = f.air.typeOf(un_op);
+ const opt_ty = if (deref_suffix[0] != 0) ty.childType() else ty;
var opt_buf: Type.Payload.ElemType = undefined;
- const payload_ty = if (deref_suffix[0] != 0)
- ty.childType().optionalChild(&opt_buf)
- else
- ty.optionalChild(&opt_buf);
+ const payload_ty = opt_ty.optionalChild(&opt_buf);
if (!payload_ty.hasRuntimeBitsIgnoreComptime()) {
try writer.print("){s} {s} true;\n", .{ deref_suffix, operator });
@@ -3276,6 +3278,8 @@ fn airIsNull(
try writer.print("){s} {s} NULL;\n", .{ deref_suffix, operator });
} else if (payload_ty.zigTypeTag() == .ErrorSet) {
try writer.print("){s} {s} 0;\n", .{ deref_suffix, operator });
+ } else if (payload_ty.isSlice() and opt_ty.optionalReprIsPayload()) {
+ try writer.print("){s}.ptr {s} NULL;\n", .{ deref_suffix, operator });
} else {
try writer.print("){s}.is_null {s} true;\n", .{ deref_suffix, operator });
}