Skip to content

Commit

Permalink
stage2: array cat support more types of operands
Browse files Browse the repository at this point in the history
  • Loading branch information
g-w1 committed Sep 26, 2021
1 parent 7fcb195 commit 4b28962
Showing 1 changed file with 26 additions and 25 deletions.
51 changes: 26 additions & 25 deletions src/Sema.zig
Original file line number Diff line number Diff line change
Expand Up @@ -5957,35 +5957,36 @@ fn zirArrayCat(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr
if (try sema.resolveDefinedValue(block, lhs_src, lhs)) |lhs_val| {
if (try sema.resolveDefinedValue(block, rhs_src, rhs)) |rhs_val| {
const final_len = lhs_info.len + rhs_info.len;
if (lhs_ty.zigTypeTag() == .Pointer) {
var anon_decl = try block.startAnonDecl();
defer anon_decl.deinit();
const is_pointer = lhs_ty.zigTypeTag() == .Pointer;
var anon_decl = try block.startAnonDecl();
defer anon_decl.deinit();

const lhs_sub_val = (try lhs_val.pointerDeref(anon_decl.arena())).?;
const rhs_sub_val = (try rhs_val.pointerDeref(anon_decl.arena())).?;
const buf = try anon_decl.arena().alloc(Value, final_len);
{
var i: u64 = 0;
while (i < lhs_info.len) : (i += 1) {
const val = try lhs_sub_val.elemValue(sema.arena, i);
buf[i] = try val.copy(anon_decl.arena());
}
const lhs_sub_val = if (is_pointer) (try lhs_val.pointerDeref(anon_decl.arena())).? else lhs_val;
const rhs_sub_val = if (is_pointer) (try rhs_val.pointerDeref(anon_decl.arena())).? else rhs_val;
const buf = try anon_decl.arena().alloc(Value, final_len);
{
var i: u64 = 0;
while (i < lhs_info.len) : (i += 1) {
const val = try lhs_sub_val.elemValue(sema.arena, i);
buf[i] = try val.copy(anon_decl.arena());
}
{
var i: u64 = 0;
while (i < rhs_info.len) : (i += 1) {
const val = try rhs_sub_val.elemValue(sema.arena, i);
buf[lhs_info.len + i] = try val.copy(anon_decl.arena());
}
}
{
var i: u64 = 0;
while (i < rhs_info.len) : (i += 1) {
const val = try rhs_sub_val.elemValue(sema.arena, i);
buf[lhs_info.len + i] = try val.copy(anon_decl.arena());
}
const ty = if (res_sent) |rs|
try Type.Tag.array_sentinel.create(anon_decl.arena(), .{ .len = final_len, .elem_type = lhs_info.elem_type, .sentinel = rs })
else
try Type.Tag.array.create(anon_decl.arena(), .{ .len = final_len, .elem_type = lhs_info.elem_type });
const val = try Value.Tag.array.create(anon_decl.arena(), buf);
return sema.analyzeDeclRef(try anon_decl.finish(ty, val));
}
return sema.mod.fail(&block.base, lhs_src, "TODO array_cat more types of Values", .{});
const ty = if (res_sent) |rs|
try Type.Tag.array_sentinel.create(anon_decl.arena(), .{ .len = final_len, .elem_type = lhs_info.elem_type, .sentinel = rs })
else
try Type.Tag.array.create(anon_decl.arena(), .{ .len = final_len, .elem_type = lhs_info.elem_type });
const val = try Value.Tag.array.create(anon_decl.arena(), buf);
return if (is_pointer)
sema.analyzeDeclRef(try anon_decl.finish(ty, val))
else
sema.analyzeDeclVal(block, .unneeded, try anon_decl.finish(ty, val));
} else {
return sema.mod.fail(&block.base, lhs_src, "TODO runtime array_cat", .{});
}
Expand Down

0 comments on commit 4b28962

Please sign in to comment.