authorgravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-28 18:01:41-07:00
committergravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-28 18:01:41-07:00
log247e567422a0efde2ed1f2cbf1b16f217f2b61d9
tree6d1e1e7e4558b6427a35673d7e1601ee1dede283
parent102bf5200cfd82c1df6d503059e70c37b4925361
signaturelock-open Commit is signed but in an unrecognized format.

Don't return a slice pointing to a deceased stack address


1 files changed, 15 insertions(+), 12 deletions(-)

src-self-hosted/translate_c.zig+15-12
...@@ -691,8 +691,9 @@ fn transStringLiteral(...@@ -691,8 +691,9 @@ fn transStringLiteral(
691 const bytes_ptr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len);691 const bytes_ptr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len);
692 const str = bytes_ptr[0..len];692 const str = bytes_ptr[0..len];
693693
694 var char_buf: [4]u8 = undefined;
694 len = 0;695 len = 0;
695 for (str) |c| len += escapeChar(c).len;696 for (str) |c| len += escapeChar(c, &char_buf).len;
696697
697 const buf = try rp.c.a().alloc(u8, len + "c\"\"".len);698 const buf = try rp.c.a().alloc(u8, len + "c\"\"".len);
698 buf[0] = 'c';699 buf[0] = 'c';
...@@ -725,33 +726,35 @@ fn transStringLiteral(...@@ -725,33 +726,35 @@ fn transStringLiteral(
725726
726fn escapedStringLen(s: []const u8) usize {727fn escapedStringLen(s: []const u8) usize {
727 var len: usize = 0;728 var len: usize = 0;
728 for (s) |c| len += escapeChar(c).len;729 var char_buf: [4]u8 = undefined;
730 for (s) |c| len += escapeChar(c, &char_buf).len;
729 return len;731 return len;
730}732}
731733
732fn writeEscapedString(buf: []u8, s: []const u8) void {734fn writeEscapedString(buf: []u8, s: []const u8) void {
735 var char_buf: [4]u8 = undefined;
733 var i: usize = 0;736 var i: usize = 0;
734 for (s) |c| {737 for (s) |c| {
735 const escaped = escapeChar(c);738 const escaped = escapeChar(c, &char_buf);
736 std.mem.copy(u8, buf[i..], escaped);739 std.mem.copy(u8, buf[i..], escaped);
737 i += escaped.len;740 i += escaped.len;
738 }741 }
739}742}
740743
741fn escapeChar(c: u8) []const u8 {744// Returns either a string literal or a slice of `buf`.
745fn escapeChar(c: u8, char_buf: *[4]u8) []const u8 {
742 // TODO: https://github.com/ziglang/zig/issues/2749746 // TODO: https://github.com/ziglang/zig/issues/2749
743 switch (c) {747 const escaped = switch (c) {
744 // Printable ASCII except for ' " \748 // Printable ASCII except for ' " \
745 ' ', '!', '#'...'&', '('...'[', ']'...'~' => return ([_]u8{c})[0..],749 ' ', '!', '#'...'&', '('...'[', ']'...'~' => ([_]u8{c})[0..],
746 '\'', '\"', '\\' => return ([_]u8{ '\\', c })[0..],750 '\'', '\"', '\\' => ([_]u8{ '\\', c })[0..],
747 '\n' => return "\\n"[0..],751 '\n' => return "\\n"[0..],
748 '\r' => return "\\r"[0..],752 '\r' => return "\\r"[0..],
749 '\t' => return "\\t"[0..],753 '\t' => return "\\t"[0..],
750 else => {754 else => return std.fmt.bufPrint(char_buf[0..], "\\x{x:2}", c) catch unreachable,
751 var buf: [4]u8 = undefined;755 };
752 return std.fmt.bufPrint(buf[0..], "\\x{x:2}", c) catch unreachable;756 std.mem.copy(u8, char_buf, escaped);
753 },757 return char_buf[0..escaped.len];
754 }
755}758}
756759
757fn transCCast(760fn transCCast(