authorgravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-23 01:03:28-07:00
committergravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-23 01:03:28-07:00
log1c86a191da400bd47a5044a5b84cf9a05b15066b
treed6f515027f46c1664e30041b1863ef4f61411ff8
parent4c8b460fec7dff1f56605ca1c9bd9b76599952d8
signature Commit is signed but in an unrecognized format.

Fix order of tokens; omit 'pub' for fn types


1 files changed, 40 insertions(+), 28 deletions(-)

src-self-hosted/translate_c.zig+40-28
......@@ -271,7 +271,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
271271 const proto_node = switch (ZigClangType_getTypeClass(fn_type)) {
272272 .FunctionProto => blk: {
273273 const fn_proto_type = @ptrCast(*const ZigClangFunctionProtoType, fn_type);
274 break :blk transFnProto(rp, fn_proto_type, fn_decl_loc, decl_ctx) catch |err| switch (err) {
274 break :blk transFnProto(rp, fn_proto_type, fn_decl_loc, decl_ctx, true) catch |err| switch (err) {
275275 error.UnsupportedType => {
276276 return failDecl(c, fn_decl_loc, fn_name, "unable to resolve prototype of function");
277277 },
......@@ -280,7 +280,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
280280 },
281281 .FunctionNoProto => blk: {
282282 const fn_no_proto_type = @ptrCast(*const ZigClangFunctionType, fn_type);
283 break :blk transFnNoProto(rp, fn_no_proto_type, fn_decl_loc, decl_ctx) catch |err| switch (err) {
283 break :blk transFnNoProto(rp, fn_no_proto_type, fn_decl_loc, decl_ctx, true) catch |err| switch (err) {
284284 error.UnsupportedType => {
285285 return failDecl(c, fn_decl_loc, fn_name, "unable to resolve prototype of function");
286286 },
......@@ -420,7 +420,6 @@ fn transCompoundStmtInline(
420420 while (it != end_it) : (it += 1) {
421421 const result = try transStmt(rp, parent_scope, it.*, .unused, .r_value);
422422 scope = result.child_scope;
423 std.debug.warn("id: {}\n", result.node.id);
424423 if (result.node != &block_node.base)
425424 try block_node.statements.push(result.node);
426425 }
......@@ -661,10 +660,13 @@ fn transCCast(
661660 if (qualTypeIsPtr(dst_type) and qualTypeIsPtr(src_type))
662661 return transCPtrCast(rp, loc, dst_type, src_type, expr);
663662 if (cIsUnsignedInteger(dst_type) and qualTypeIsPtr(src_type)) {
663 const cast_node = try transCreateNodeFnCall(rp.c, try transQualType(rp, dst_type, loc));
664664 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@ptrToInt");
665665 try builtin_node.params.push(expr);
666666 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
667 return &(try transCreateNodeFnCall(rp.c, try transQualType(rp, dst_type, loc), &builtin_node.base)).base;
667 try cast_node.op.Call.params.push(&builtin_node.base);
668 cast_node.rtoken = try appendToken(rp.c, .RParen, ")");
669 return &cast_node.base;
668670 }
669671 if (cIsUnsignedInteger(src_type) and qualTypeIsPtr(dst_type)) {
670672 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@intToPtr");
......@@ -677,7 +679,10 @@ fn transCCast(
677679 // TODO: maybe widen to increase size
678680 // TODO: maybe bitcast to change sign
679681 // TODO: maybe truncate to reduce size
680 return &(try transCreateNodeFnCall(rp.c, try transQualType(rp, dst_type, loc), expr)).base;
682 const cast_node = try transCreateNodeFnCall(rp.c, try transQualType(rp, dst_type, loc));
683 try cast_node.op.Call.params.push(expr);
684 cast_node.rtoken = try appendToken(rp.c, .RParen, ")");
685 return &cast_node.base;
681686}
682687
683688fn transExpr(
......@@ -728,13 +733,15 @@ fn transCPtrCast(
728733 // void has 1-byte alignment, so @alignCast is not needed
729734 try ptrcast_node.params.push(expr);
730735 } else {
736 const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignCast");
731737 const alignof_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignOf");
732738 const child_type_node = try transQualType(rp, child_type, loc);
733739 try alignof_node.params.push(child_type_node);
734 const aligncast_node = try transCreateNodeBuiltinFnCall(rp.c, "@alignCast");
740 alignof_node.rparen_token = try appendToken(rp.c, .RParen, ")");
735741 try aligncast_node.params.push(&alignof_node.base);
736742 _ = try appendToken(rp.c, .Comma, ",");
737743 try aligncast_node.params.push(expr);
744 aligncast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
738745 try ptrcast_node.params.push(&aligncast_node.base);
739746 }
740747 ptrcast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
......@@ -909,7 +916,7 @@ fn transCreateNodeBuiltinFnCall(c: *Context, name: []const u8) !*ast.Node.Builti
909916 return node;
910917}
911918
912fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node, first_arg: *ast.Node) !*ast.Node.SuffixOp {
919fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {
913920 _ = try appendToken(c, .LParen, "(");
914921 const node = try c.a().create(ast.Node.SuffixOp);
915922 node.* = ast.Node.SuffixOp{
......@@ -921,37 +928,34 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node, first_arg: *ast.Node)
921928 .async_attr = null,
922929 },
923930 },
924 .rtoken = try appendToken(c, .RParen, ")"),
931 .rtoken = undefined, // set after appending args
925932 };
926 try node.op.Call.params.push(first_arg);
927933 return node;
928934}
929935
930936fn transCreateNodePrefixOp(
931937 c: *Context,
932938 op: ast.Node.PrefixOp.Op,
933 rhs: *ast.Node,
934939 op_tok_id: std.zig.Token.Id,
935940 bytes: []const u8,
936) !*ast.Node {
941) !*ast.Node.PrefixOp {
937942 const node = try c.a().create(ast.Node.PrefixOp);
938943 node.* = ast.Node.PrefixOp{
939944 .base = ast.Node{ .id = .PrefixOp },
940945 .op_token = try appendToken(c, op_tok_id, bytes),
941946 .op = op,
942 .rhs = rhs,
947 .rhs = undefined, // translate and set afterward
943948 };
944 return &node.base;
949 return node;
945950}
946951
947952fn transCreateNodePtrType(
948953 c: *Context,
949954 is_const: bool,
950955 is_volatile: bool,
951 rhs: *ast.Node,
952956 op_tok_id: std.zig.Token.Id,
953957 bytes: []const u8,
954) !*ast.Node {
958) !*ast.Node.PrefixOp {
955959 const node = try c.a().create(ast.Node.PrefixOp);
956960 node.* = ast.Node.PrefixOp{
957961 .base = ast.Node{ .id = .PrefixOp },
......@@ -964,9 +968,9 @@ fn transCreateNodePtrType(
964968 .volatile_token = if (is_volatile) try appendToken(c, .Keyword_volatile, "volatile") else null,
965969 },
966970 },
967 .rhs = rhs,
971 .rhs = undefined, // translate and set afterward
968972 };
969 return &node.base;
973 return node;
970974}
971975
972976fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {
......@@ -1038,7 +1042,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
10381042 },
10391043 .FunctionProto => {
10401044 const fn_proto_ty = @ptrCast(*const ZigClangFunctionProtoType, ty);
1041 const fn_proto = try transFnProto(rp, fn_proto_ty, source_loc, null);
1045 const fn_proto = try transFnProto(rp, fn_proto_ty, source_loc, null, false);
10421046 return &fn_proto.base;
10431047 },
10441048 .Paren => {
......@@ -1047,28 +1051,33 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
10471051 },
10481052 .Pointer => {
10491053 const child_qt = ZigClangType_getPointeeType(ty);
1050 const child_node = try transQualType(rp, child_qt, source_loc);
1051 if (qualTypeChildIsFnProto(child_qt))
1052 return transCreateNodePrefixOp(rp.c, .OptionalType, child_node, .QuestionMark, "?");
1054 if (qualTypeChildIsFnProto(child_qt)) {
1055 const optional_node = try transCreateNodePrefixOp(rp.c, .OptionalType, .QuestionMark, "?");
1056 optional_node.rhs = try transQualType(rp, child_qt, source_loc);
1057 return &optional_node.base;
1058 }
10531059 if (typeIsOpaque(rp.c, ZigClangQualType_getTypePtr(child_qt), source_loc)) {
1060 const optional_node = try transCreateNodePrefixOp(rp.c, .OptionalType, .QuestionMark, "?");
10541061 const pointer_node = try transCreateNodePtrType(
10551062 rp.c,
10561063 ZigClangQualType_isConstQualified(child_qt),
10571064 ZigClangQualType_isVolatileQualified(child_qt),
1058 child_node,
10591065 .Asterisk,
10601066 "*",
10611067 );
1062 return transCreateNodePrefixOp(rp.c, .OptionalType, pointer_node, .QuestionMark, "?");
1068 optional_node.rhs = &pointer_node.base;
1069 pointer_node.rhs = try transQualType(rp, child_qt, source_loc);
1070 return &optional_node.base;
10631071 }
1064 return transCreateNodePtrType(
1072 const pointer_node = try transCreateNodePtrType(
10651073 rp.c,
10661074 ZigClangQualType_isConstQualified(child_qt),
10671075 ZigClangQualType_isVolatileQualified(child_qt),
1068 child_node,
10691076 .BracketStarCBracket,
10701077 "[*c]",
10711078 );
1079 pointer_node.rhs = try transQualType(rp, child_qt, source_loc);
1080 return &pointer_node.base;
10721081 },
10731082 else => {
10741083 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));
......@@ -1103,6 +1112,7 @@ fn transFnProto(
11031112 fn_proto_ty: *const ZigClangFunctionProtoType,
11041113 source_loc: ZigClangSourceLocation,
11051114 fn_decl_context: ?FnDeclContext,
1115 is_pub: bool,
11061116) !*ast.Node.FnProto {
11071117 const fn_ty = @ptrCast(*const ZigClangFunctionType, fn_proto_ty);
11081118 const cc = try transCC(rp, fn_ty, source_loc);
......@@ -1113,7 +1123,7 @@ fn transFnProto(
11131123 return revertAndWarn(rp, error.UnsupportedType, source_loc, "TODO: implement parameters for FunctionProto in transType");
11141124 }
11151125
1116 return finishTransFnProto(rp, fn_ty, source_loc, fn_decl_context, is_var_args, cc);
1126 return finishTransFnProto(rp, fn_ty, source_loc, fn_decl_context, is_var_args, cc, is_pub);
11171127}
11181128
11191129fn transFnNoProto(
......@@ -1121,10 +1131,11 @@ fn transFnNoProto(
11211131 fn_ty: *const ZigClangFunctionType,
11221132 source_loc: ZigClangSourceLocation,
11231133 fn_decl_context: ?FnDeclContext,
1134 is_pub: bool,
11241135) !*ast.Node.FnProto {
11251136 const cc = try transCC(rp, fn_ty, source_loc);
11261137 const is_var_args = if (fn_decl_context) |ctx| !ctx.is_export else true;
1127 return finishTransFnProto(rp, fn_ty, source_loc, fn_decl_context, is_var_args, cc);
1138 return finishTransFnProto(rp, fn_ty, source_loc, fn_decl_context, is_var_args, cc, is_pub);
11281139}
11291140
11301141fn finishTransFnProto(
......@@ -1134,6 +1145,7 @@ fn finishTransFnProto(
11341145 fn_decl_context: ?FnDeclContext,
11351146 is_var_args: bool,
11361147 cc: CallingConvention,
1148 is_pub: bool,
11371149) !*ast.Node.FnProto {
11381150 const is_export = if (fn_decl_context) |ctx| ctx.is_export else false;
11391151
......@@ -1141,7 +1153,7 @@ fn finishTransFnProto(
11411153 // TODO check for align attribute
11421154
11431155 // pub extern fn name(...) T
1144 const pub_tok = try appendToken(rp.c, .Keyword_pub, "pub");
1156 const pub_tok = if (is_pub) try appendToken(rp.c, .Keyword_pub, "pub") else null;
11451157 const cc_tok = if (cc == .Stdcall) try appendToken(rp.c, .Keyword_stdcallcc, "stdcallcc") else null;
11461158 const extern_export_inline_tok = if (is_export)
11471159 try appendToken(rp.c, .Keyword_export, "export")