authorgravatar for mgk1795@gmail.comMatthew Knight <mgk1795@gmail.com> 2020-05-04 23:45:31-07:00
committergravatar for mgk1795@gmail.comMatthew Knight <mgk1795@gmail.com> 2020-05-04 23:45:31-07:00
logdb4833d4d607a91686dc37ed68e453e9538dc668
tree20ace84a35d3c1cd3ec105ae5ddbe3e3a84da4ee
parentc5198bd76f96d7dab64fdd8d81fc8028187b1403

moved duplicated code to common functions


2 files changed, 39 insertions(+), 29 deletions(-)

src-self-hosted/translate_c.zig+37-29
...@@ -668,17 +668,7 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe...@@ -668,17 +668,7 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe
668 return transCreateNodeIdentifier(c, builtin_name);668 return transCreateNodeIdentifier(c, builtin_name);
669}669}
670670
671fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_level_visit: bool) Error!?*ast.Node {671fn checkForBuiltinTypedef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, checked_name: []const u8) !?*ast.Node {
672 if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv|
673 return transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice
674 const rp = makeRestorePoint(c);
675
676 const typedef_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, typedef_decl)));
677
678 // TODO https://github.com/ziglang/zig/issues/3756
679 // TODO https://github.com/ziglang/zig/issues/1802
680 const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ typedef_name, c.getMangle() }) else typedef_name;
681
682 if (mem.eql(u8, checked_name, "uint8_t"))672 if (mem.eql(u8, checked_name, "uint8_t"))
683 return transTypeDefAsBuiltin(c, typedef_decl, "u8")673 return transTypeDefAsBuiltin(c, typedef_decl, "u8")
684 else if (mem.eql(u8, checked_name, "int8_t"))674 else if (mem.eql(u8, checked_name, "int8_t"))
...@@ -704,28 +694,49 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l...@@ -704,28 +694,49 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l
704 else if (mem.eql(u8, checked_name, "size_t"))694 else if (mem.eql(u8, checked_name, "size_t"))
705 return transTypeDefAsBuiltin(c, typedef_decl, "usize");695 return transTypeDefAsBuiltin(c, typedef_decl, "usize");
706696
697 return null;
698}
699
700fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_level_visit: bool) Error!?*ast.Node {
701 if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv|
702 return transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice
703 const rp = makeRestorePoint(c);
704
705 const typedef_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, typedef_decl)));
706
707 // TODO https://github.com/ziglang/zig/issues/3756
708 // TODO https://github.com/ziglang/zig/issues/1802
709 const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ typedef_name, c.getMangle() }) else typedef_name;
710 if (try checkForBuiltinTypedef(c, typedef_decl, checked_name)) |node| {
711 return node;
712 }
713
707 if (!top_level_visit) {714 if (!top_level_visit) {
708 return transCreateNodeIdentifier(c, checked_name);715 return transCreateNodeIdentifier(c, checked_name);
709 }716 }
710717
711 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name);718 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name);
712 const visib_tok = try appendToken(c, .Keyword_pub, "pub");719 const node = (try transZigTypedef(rp, typedef_decl, true, checked_name)) orelse return null;
713 const const_tok = try appendToken(c, .Keyword_const, "const");720 try addTopLevelDecl(c, checked_name, &node.base);
714 const node = try transCreateNodeVarDecl(c, true, true, checked_name);721 return transCreateNodeIdentifier(c, checked_name);
715 node.eq_token = try appendToken(c, .Equal, "=");722}
723
724fn transZigTypedef(rp: RestorePoint, typedef_decl: *const ZigClangTypedefNameDecl, toplevel: bool, checked_name: []const u8) Error!?*ast.Node.VarDecl {
725 const node = try transCreateNodeVarDecl(rp.c, toplevel, true, checked_name);
726 node.eq_token = try appendToken(rp.c, .Equal, "=");
716727
717 const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);728 const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
718 const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl);729 const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl);
719 node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) {730 node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) {
720 error.UnsupportedType => {731 error.UnsupportedType => {
721 try failDecl(c, typedef_loc, checked_name, "unable to resolve typedef child type", .{});732 try failDecl(rp.c, typedef_loc, checked_name, "unable to resolve typedef child type", .{});
722 return null;733 return null;
723 },734 },
724 error.OutOfMemory => |e| return e,735 error.OutOfMemory => |e| return e,
725 };736 };
726 node.semicolon_token = try appendToken(c, .Semicolon, ";");737
727 try addTopLevelDecl(c, checked_name, &node.base);738 node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
728 return transCreateNodeIdentifier(c, checked_name);739 return node;
729}740}
730741
731fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*ast.Node {742fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*ast.Node {
...@@ -1395,21 +1406,18 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)...@@ -1395,21 +1406,18 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)
1395 try block_scope.block_node.statements.push(&node.base);1406 try block_scope.block_node.statements.push(&node.base);
1396 },1407 },
1397 .Typedef => {1408 .Typedef => {
1398 const type_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]);1409 const typedef_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]);
1399 const name = try c.str(ZigClangNamedDecl_getName_bytes_begin(1410 const name = try c.str(ZigClangNamedDecl_getName_bytes_begin(
1400 @ptrCast(*const ZigClangNamedDecl, type_decl),1411 @ptrCast(*const ZigClangNamedDecl, typedef_decl),
1401 ));1412 ));
14021413
1403 const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(type_decl);
1404 const underlying_type = ZigClangQualType_getTypePtr(underlying_qual);
1405
1406 const mangled_name = try block_scope.makeMangledName(c, name);1414 const mangled_name = try block_scope.makeMangledName(c, name);
1407 const node = try transCreateNodeVarDecl(c, false, true, mangled_name);1415 if (try checkForBuiltinTypedef(c, typedef_decl, mangled_name)) |ast_node| {
1408 node.eq_token = try appendToken(c, .Equal, "=");1416 return ast_node;
1417 }
14091418
1410 const loc = ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt));1419 const node = (try transZigTypedef(rp, typedef_decl, false, mangled_name))
1411 node.init_node = try transType(rp, underlying_type, loc);1420 orelse return error.UnsupportedTranslation;
1412 node.semicolon_token = try appendToken(c, .Semicolon, ";");
1413 try block_scope.block_node.statements.push(&node.base);1421 try block_scope.block_node.statements.push(&node.base);
1414 },1422 },
1415 else => |kind| return revertAndWarn(1423 else => |kind| return revertAndWarn(
test/run_translated_c.zig+2
...@@ -245,10 +245,12 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -245,10 +245,12 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
245 , "");245 , "");
246246
247 cases.add("scoped typedef",247 cases.add("scoped typedef",
248 \\#include <stdint.h>
248 \\int main(int argc, char **argv) {249 \\int main(int argc, char **argv) {
249 \\ typedef int Foo;250 \\ typedef int Foo;
250 \\ typedef Foo Bar;251 \\ typedef Foo Bar;
251 \\ typedef void (*func)(int);252 \\ typedef void (*func)(int);
253 \\ typedef uint32_t Number;
252 \\ Foo i;254 \\ Foo i;
253 \\ Bar j;255 \\ Bar j;
254 \\ return 0;256 \\ return 0;