authorgravatar for mgk1795@gmail.comMatthew Knight <mgk1795@gmail.com> 2020-05-05 23:26:00-07:00
committergravatar for mgk1795@gmail.comMatthew Knight <mgk1795@gmail.com> 2020-05-05 23:26:00-07:00
log52f0adb3052b284102f2a96c083c5dd28b7941d8
tree5474102429df690fd57ac85f0e0c1ebafb0ecce4
parentdb4833d4d607a91686dc37ed68e453e9538dc668

checkForBuiltinTypedef now returns a string


1 files changed, 37 insertions(+), 35 deletions(-)

src-self-hosted/translate_c.zig+37-35
...@@ -668,31 +668,27 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe...@@ -668,31 +668,27 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe
668 return transCreateNodeIdentifier(c, builtin_name);668 return transCreateNodeIdentifier(c, builtin_name);
669}669}
670670
671fn checkForBuiltinTypedef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, checked_name: []const u8) !?*ast.Node {671fn checkForBuiltinTypedef(checked_name: []const u8) !?[]const u8 {
672 if (mem.eql(u8, checked_name, "uint8_t"))672 const table = comptime [_][2][]const u8{
673 return transTypeDefAsBuiltin(c, typedef_decl, "u8")673 .{ "uint8_t", "u8" },
674 else if (mem.eql(u8, checked_name, "int8_t"))674 .{ "int8_t", "i8" },
675 return transTypeDefAsBuiltin(c, typedef_decl, "i8")675 .{ "uint16_t", "u16" },
676 else if (mem.eql(u8, checked_name, "uint16_t"))676 .{ "int16_t", "i16" },
677 return transTypeDefAsBuiltin(c, typedef_decl, "u16")677 .{ "uint32_t", "u32" },
678 else if (mem.eql(u8, checked_name, "int16_t"))678 .{ "int32_t", "i32" },
679 return transTypeDefAsBuiltin(c, typedef_decl, "i16")679 .{ "uint64_t", "u64" },
680 else if (mem.eql(u8, checked_name, "uint32_t"))680 .{ "int64_t", "i64" },
681 return transTypeDefAsBuiltin(c, typedef_decl, "u32")681 .{ "intptr_t", "isize" },
682 else if (mem.eql(u8, checked_name, "int32_t"))682 .{ "uintptr_t", "usize" },
683 return transTypeDefAsBuiltin(c, typedef_decl, "i32")683 .{ "ssize_t", "isize" },
684 else if (mem.eql(u8, checked_name, "uint64_t"))684 .{ "size_t", "usize" },
685 return transTypeDefAsBuiltin(c, typedef_decl, "u64")685 };
686 else if (mem.eql(u8, checked_name, "int64_t"))686
687 return transTypeDefAsBuiltin(c, typedef_decl, "i64")687 for (table) |entry| {
688 else if (mem.eql(u8, checked_name, "intptr_t"))688 if (mem.eql(u8, checked_name, entry[0])) {
689 return transTypeDefAsBuiltin(c, typedef_decl, "isize")689 return entry[1];
690 else if (mem.eql(u8, checked_name, "uintptr_t"))690 }
691 return transTypeDefAsBuiltin(c, typedef_decl, "usize")691 }
692 else if (mem.eql(u8, checked_name, "ssize_t"))
693 return transTypeDefAsBuiltin(c, typedef_decl, "isize")
694 else if (mem.eql(u8, checked_name, "size_t"))
695 return transTypeDefAsBuiltin(c, typedef_decl, "usize");
696692
697 return null;693 return null;
698}694}
...@@ -707,8 +703,8 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l...@@ -707,8 +703,8 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l
707 // TODO https://github.com/ziglang/zig/issues/3756703 // TODO https://github.com/ziglang/zig/issues/3756
708 // TODO https://github.com/ziglang/zig/issues/1802704 // 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;705 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| {706 if (try checkForBuiltinTypedef(checked_name)) |builtin| {
711 return node;707 return transTypeDefAsBuiltin(c, typedef_decl, builtin);
712 }708 }
713709
714 if (!top_level_visit) {710 if (!top_level_visit) {
...@@ -716,12 +712,12 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l...@@ -716,12 +712,12 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l
716 }712 }
717713
718 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name);714 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name);
719 const node = (try transZigTypedef(rp, typedef_decl, true, checked_name)) orelse return null;715 const node = (try transCreateNodeTypedef(rp, typedef_decl, true, checked_name)) orelse return null;
720 try addTopLevelDecl(c, checked_name, &node.base);716 try addTopLevelDecl(c, checked_name, &node.base);
721 return transCreateNodeIdentifier(c, checked_name);717 return transCreateNodeIdentifier(c, checked_name);
722}718}
723719
724fn transZigTypedef(rp: RestorePoint, typedef_decl: *const ZigClangTypedefNameDecl, toplevel: bool, checked_name: []const u8) Error!?*ast.Node.VarDecl {720fn transCreateNodeTypedef(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);721 const node = try transCreateNodeVarDecl(rp.c, toplevel, true, checked_name);
726 node.eq_token = try appendToken(rp.c, .Equal, "=");722 node.eq_token = try appendToken(rp.c, .Equal, "=");
727723
...@@ -1411,14 +1407,20 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)...@@ -1411,14 +1407,20 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)
1411 @ptrCast(*const ZigClangNamedDecl, typedef_decl),1407 @ptrCast(*const ZigClangNamedDecl, typedef_decl),
1412 ));1408 ));
14131409
1410 const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
1411 const underlying_type = ZigClangQualType_getTypePtr(underlying_qual);
1412 const underlying_name = try c.str(ZigClangType_getTypeClassName(underlying_type));
1413
1414 const mangled_name = try block_scope.makeMangledName(c, name);1414 const mangled_name = try block_scope.makeMangledName(c, name);
1415 if (try checkForBuiltinTypedef(c, typedef_decl, mangled_name)) |ast_node| {1415 if (try checkForBuiltinTypedef(underlying_name)) |builtin| {
1416 return ast_node;1416 try block_scope.variables.push(.{
1417 .alias = builtin,
1418 .name = mangled_name,
1419 });
1420 } else {
1421 const node = (try transCreateNodeTypedef(rp, typedef_decl, false, mangled_name)) orelse return error.UnsupportedTranslation;
1422 try block_scope.block_node.statements.push(&node.base);
1417 }1423 }
1418
1419 const node = (try transZigTypedef(rp, typedef_decl, false, mangled_name))
1420 orelse return error.UnsupportedTranslation;
1421 try block_scope.block_node.statements.push(&node.base);
1422 },1424 },
1423 else => |kind| return revertAndWarn(1425 else => |kind| return revertAndWarn(
1424 rp,1426 rp,