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
668668 return transCreateNodeIdentifier(c, builtin_name);
669669}
670670
671fn checkForBuiltinTypedef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, checked_name: []const u8) !?*ast.Node {
672 if (mem.eql(u8, checked_name, "uint8_t"))
673 return transTypeDefAsBuiltin(c, typedef_decl, "u8")
674 else if (mem.eql(u8, checked_name, "int8_t"))
675 return transTypeDefAsBuiltin(c, typedef_decl, "i8")
676 else if (mem.eql(u8, checked_name, "uint16_t"))
677 return transTypeDefAsBuiltin(c, typedef_decl, "u16")
678 else if (mem.eql(u8, checked_name, "int16_t"))
679 return transTypeDefAsBuiltin(c, typedef_decl, "i16")
680 else if (mem.eql(u8, checked_name, "uint32_t"))
681 return transTypeDefAsBuiltin(c, typedef_decl, "u32")
682 else if (mem.eql(u8, checked_name, "int32_t"))
683 return transTypeDefAsBuiltin(c, typedef_decl, "i32")
684 else if (mem.eql(u8, checked_name, "uint64_t"))
685 return transTypeDefAsBuiltin(c, typedef_decl, "u64")
686 else if (mem.eql(u8, checked_name, "int64_t"))
687 return transTypeDefAsBuiltin(c, typedef_decl, "i64")
688 else if (mem.eql(u8, checked_name, "intptr_t"))
689 return transTypeDefAsBuiltin(c, typedef_decl, "isize")
690 else if (mem.eql(u8, checked_name, "uintptr_t"))
691 return transTypeDefAsBuiltin(c, typedef_decl, "usize")
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");
671fn checkForBuiltinTypedef(checked_name: []const u8) !?[]const u8 {
672 const table = comptime [_][2][]const u8{
673 .{ "uint8_t", "u8" },
674 .{ "int8_t", "i8" },
675 .{ "uint16_t", "u16" },
676 .{ "int16_t", "i16" },
677 .{ "uint32_t", "u32" },
678 .{ "int32_t", "i32" },
679 .{ "uint64_t", "u64" },
680 .{ "int64_t", "i64" },
681 .{ "intptr_t", "isize" },
682 .{ "uintptr_t", "usize" },
683 .{ "ssize_t", "isize" },
684 .{ "size_t", "usize" },
685 };
686
687 for (table) |entry| {
688 if (mem.eql(u8, checked_name, entry[0])) {
689 return entry[1];
690 }
691 }
696692
697693 return null;
698694}
......@@ -707,8 +703,8 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l
707703 // TODO https://github.com/ziglang/zig/issues/3756
708704 // TODO https://github.com/ziglang/zig/issues/1802
709705 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;
706 if (try checkForBuiltinTypedef(checked_name)) |builtin| {
707 return transTypeDefAsBuiltin(c, typedef_decl, builtin);
712708 }
713709
714710 if (!top_level_visit) {
......@@ -716,12 +712,12 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l
716712 }
717713
718714 _ = 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;
720716 try addTopLevelDecl(c, checked_name, &node.base);
721717 return transCreateNodeIdentifier(c, checked_name);
722718}
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 {
725721 const node = try transCreateNodeVarDecl(rp.c, toplevel, true, checked_name);
726722 node.eq_token = try appendToken(rp.c, .Equal, "=");
727723
......@@ -1411,14 +1407,20 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)
14111407 @ptrCast(*const ZigClangNamedDecl, typedef_decl),
14121408 ));
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
14141414 const mangled_name = try block_scope.makeMangledName(c, name);
1415 if (try checkForBuiltinTypedef(c, typedef_decl, mangled_name)) |ast_node| {
1416 return ast_node;
1415 if (try checkForBuiltinTypedef(underlying_name)) |builtin| {
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);
14171423 }
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);
14221424 },
14231425 else => |kind| return revertAndWarn(
14241426 rp,