authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-20 23:28:31-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-20 23:28:31-04:00
log3c5d581ce35b137a7b80ac1431c1d9132e281fef
tree3df0bfb5c486a488e8a6db2ffbebe716a7135987
parent140dc2f43e347ddddc2f6f344b388bdc74c97c56

update translate-c to the new fn params AST node API


1 files changed, 32 insertions(+), 44 deletions(-)

src-self-hosted/translate_c.zig+32-44
...@@ -534,17 +534,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -534,17 +534,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
534 const block_node = try transCreateNodeBlock(rp.c, null);534 const block_node = try transCreateNodeBlock(rp.c, null);
535 block_scope.setBlockNode(block_node);535 block_scope.setBlockNode(block_node);
536536
537 var it = proto_node.params.first;
538 var param_id: c_uint = 0;537 var param_id: c_uint = 0;
539 var prev_node_link = &proto_node.params_first;538 for (proto_node.params()) |param, i| {
540 while (it) |p_node| : ({prev_node_link = &p_node.next; it = p_node.next;}) {
541 const p = p_node.data;
542 const param = @fieldParentPtr(ast.Node.ParamDecl, "base", p);
543 const param_name = if (param.name_token) |name_tok|539 const param_name = if (param.name_token) |name_tok|
544 tokenSlice(c, name_tok)540 tokenSlice(c, name_tok)
545 else if (param.param_type == .var_args) {541 else if (param.param_type == .var_args) {
546 assert(p_node.next == null);542 assert(i + 1 == proto_node.params_len);
547 prev_node_link.* = null;543 proto_node.params_len -= 1;
548 break;544 break;
549 } else545 } else
550 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name});546 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name});
...@@ -3843,7 +3839,7 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {...@@ -3843,7 +3839,7 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {
3843 _ = try appendToken(c, .LParen, "(");3839 _ = try appendToken(c, .LParen, "(");
3844 const node = try c.arena.create(ast.Node.SuffixOp);3840 const node = try c.arena.create(ast.Node.SuffixOp);
3845 node.* = .{3841 node.* = .{
3846 .lhs = .{ .node = fn_expr },3842 .lhs = fn_expr,
3847 .op = .{3843 .op = .{
3848 .Call = .{3844 .Call = .{
3849 .params = ast.Node.SuffixOp.Op.Call.ParamList{},3845 .params = ast.Node.SuffixOp.Op.Call.ParamList{},
...@@ -4129,41 +4125,36 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -4129,41 +4125,36 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
4129 const name_tok = try appendIdentifier(c, name);4125 const name_tok = try appendIdentifier(c, name);
4130 _ = try appendToken(c, .LParen, "(");4126 _ = try appendToken(c, .LParen, "(");
41314127
4132 var fn_params = ast.Node.FnProto.ParamList{};4128 var fn_params = std.ArrayList(ast.Node.FnProto.ParamDecl).init(c.gpa);
4133 var fn_params_list = &fn_params.first;4129 defer fn_params.deinit();
4134 var it = proto_alias.params.first;4130
4135 while (it) |pn_node| : (it = pn_node.next) {4131 for (proto_alias.params()) |param, i| {
4136 const pn = pn_node.data;4132 if (i != 0) {
4137 if (pn_node != proto_alias.params.first.?) {
4138 _ = try appendToken(c, .Comma, ",");4133 _ = try appendToken(c, .Comma, ",");
4139 }4134 }
4140 const param = pn.cast(ast.Node.ParamDecl).?;
4141
4142 const param_name_tok = param.name_token orelse4135 const param_name_tok = param.name_token orelse
4143 try appendTokenFmt(c, .Identifier, "arg_{}", .{c.getMangle()});4136 try appendTokenFmt(c, .Identifier, "arg_{}", .{c.getMangle()});
41444137
4145 _ = try appendToken(c, .Colon, ":");4138 _ = try appendToken(c, .Colon, ":");
41464139
4147 const param_node = try c.arena.create(ast.Node.ParamDecl);4140 (try fn_params.addOne()).* = .{
4148 param_node.* = .{
4149 .doc_comments = null,4141 .doc_comments = null,
4150 .comptime_token = null,4142 .comptime_token = null,
4151 .noalias_token = param.noalias_token,4143 .noalias_token = param.noalias_token,
4152 .name_token = param_name_tok,4144 .name_token = param_name_tok,
4153 .param_type = param.param_type,4145 .param_type = param.param_type,
4154 };4146 };
4155 fn_params_list = try c.llpush(*ast.Node, fn_params_list, &param_node.base);
4156 }4147 }
41574148
4158 _ = try appendToken(c, .RParen, ")");4149 _ = try appendToken(c, .RParen, ")");
41594150
4160 const fn_proto = try c.arena.create(ast.Node.FnProto);4151 const fn_proto = try ast.Node.FnProto.alloc(c.arena, fn_params.items.len);
4161 fn_proto.* = .{4152 fn_proto.* = .{
4162 .doc_comments = null,4153 .doc_comments = null,
4163 .visib_token = pub_tok,4154 .visib_token = pub_tok,
4164 .fn_token = fn_tok,4155 .fn_token = fn_tok,
4165 .name_token = name_tok,4156 .name_token = name_tok,
4166 .params = fn_params,4157 .params_len = fn_params.items.len,
4167 .return_type = proto_alias.return_type,4158 .return_type = proto_alias.return_type,
4168 .var_args_token = null,4159 .var_args_token = null,
4169 .extern_export_inline_token = inline_tok,4160 .extern_export_inline_token = inline_tok,
...@@ -4173,6 +4164,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -4173,6 +4164,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
4173 .section_expr = null,4164 .section_expr = null,
4174 .callconv_expr = null,4165 .callconv_expr = null,
4175 };4166 };
4167 mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items);
41764168
4177 const block = try transCreateNodeBlock(c, null);4169 const block = try transCreateNodeBlock(c, null);
4178 var block_statements_it = &block.statements.first;4170 var block_statements_it = &block.statements.first;
...@@ -4182,13 +4174,10 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -4182,13 +4174,10 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
4182 const call_expr = try transCreateNodeFnCall(c, unwrap_expr);4174 const call_expr = try transCreateNodeFnCall(c, unwrap_expr);
4183 var call_params_it = &call_expr.op.Call.params.first;4175 var call_params_it = &call_expr.op.Call.params.first;
41844176
4185 it = fn_params.first;4177 for (fn_params.items) |param, i| {
4186 while (it) |pn_node| : (it = pn_node.next) {4178 if (i != 0) {
4187 const pn = pn_node.data;
4188 if (fn_params.first.? != pn_node) {
4189 _ = try appendToken(c, .Comma, ",");4179 _ = try appendToken(c, .Comma, ",");
4190 }4180 }
4191 const param = pn.cast(ast.Node.ParamDecl).?;
4192 call_params_it = try c.llpush(*ast.Node, call_params_it, try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)),);4181 call_params_it = try c.llpush(*ast.Node, call_params_it, try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)),);
4193 }4182 }
4194 call_expr.rtoken = try appendToken(c, .RParen, ")");4183 call_expr.rtoken = try appendToken(c, .RParen, ")");
...@@ -4207,7 +4196,7 @@ fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node {...@@ -4207,7 +4196,7 @@ fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node {
4207 const node = try c.arena.create(ast.Node.SuffixOp);4196 const node = try c.arena.create(ast.Node.SuffixOp);
4208 node.* = .{4197 node.* = .{
4209 .op = .UnwrapOptional,4198 .op = .UnwrapOptional,
4210 .lhs = .{ .node = wrapped },4199 .lhs = wrapped,
4211 .rtoken = qm,4200 .rtoken = qm,
4212 };4201 };
4213 return &node.base;4202 return &node.base;
...@@ -4697,9 +4686,10 @@ fn finishTransFnProto(...@@ -4697,9 +4686,10 @@ fn finishTransFnProto(
4697 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;4686 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;
4698 const lparen_tok = try appendToken(rp.c, .LParen, "(");4687 const lparen_tok = try appendToken(rp.c, .LParen, "(");
46994688
4700 var fn_params = ast.Node.FnProto.ParamList{};4689 var fn_params = std.ArrayList(ast.Node.FnProto.ParamDecl).init(rp.c.gpa);
4701 var fn_params_list = rp.c.llpusher(&fn_params);4690 defer fn_params.deinit();
4702 const param_count: usize = if (fn_proto_ty != null) ZigClangFunctionProtoType_getNumParams(fn_proto_ty.?) else 0;4691 const param_count: usize = if (fn_proto_ty != null) ZigClangFunctionProtoType_getNumParams(fn_proto_ty.?) else 0;
4692 try fn_params.ensureCapacity(param_count + 1); // +1 for possible var args node
47034693
4704 var i: usize = 0;4694 var i: usize = 0;
4705 while (i < param_count) : (i += 1) {4695 while (i < param_count) : (i += 1) {
...@@ -4723,15 +4713,13 @@ fn finishTransFnProto(...@@ -4723,15 +4713,13 @@ fn finishTransFnProto(
47234713
4724 const type_node = try transQualType(rp, param_qt, source_loc);4714 const type_node = try transQualType(rp, param_qt, source_loc);
47254715
4726 const param_node = try rp.c.arena.create(ast.Node.ParamDecl);4716 fn_params.addOneAssumeCapacity().* = .{
4727 param_node.* = .{
4728 .doc_comments = null,4717 .doc_comments = null,
4729 .comptime_token = null,4718 .comptime_token = null,
4730 .noalias_token = noalias_tok,4719 .noalias_token = noalias_tok,
4731 .name_token = param_name_tok,4720 .name_token = param_name_tok,
4732 .param_type = .{ .type_expr = type_node },4721 .param_type = .{ .type_expr = type_node },
4733 };4722 };
4734 try fn_params_list.push(&param_node.base);
47354723
4736 if (i + 1 < param_count) {4724 if (i + 1 < param_count) {
4737 _ = try appendToken(rp.c, .Comma, ",");4725 _ = try appendToken(rp.c, .Comma, ",");
...@@ -4743,15 +4731,13 @@ fn finishTransFnProto(...@@ -4743,15 +4731,13 @@ fn finishTransFnProto(
4743 _ = try appendToken(rp.c, .Comma, ",");4731 _ = try appendToken(rp.c, .Comma, ",");
4744 }4732 }
47454733
4746 const var_arg_node = try rp.c.arena.create(ast.Node.ParamDecl);4734 fn_params.addOneAssumeCapacity().* = .{
4747 var_arg_node.* = .{
4748 .doc_comments = null,4735 .doc_comments = null,
4749 .comptime_token = null,4736 .comptime_token = null,
4750 .noalias_token = null,4737 .noalias_token = null,
4751 .name_token = null,4738 .name_token = null,
4752 .param_type = .{ .var_args = try appendToken(rp.c, .Ellipsis3, "...") }4739 .param_type = .{ .var_args = try appendToken(rp.c, .Ellipsis3, "...") }
4753 };4740 };
4754 try fn_params_list.push(&var_arg_node.base);
4755 }4741 }
47564742
4757 const rparen_tok = try appendToken(rp.c, .RParen, ")");4743 const rparen_tok = try appendToken(rp.c, .RParen, ")");
...@@ -4818,13 +4804,13 @@ fn finishTransFnProto(...@@ -4818,13 +4804,13 @@ fn finishTransFnProto(
4818 }4804 }
4819 };4805 };
48204806
4821 const fn_proto = try rp.c.arena.create(ast.Node.FnProto);4807 const fn_proto = try ast.Node.FnProto.alloc(rp.c.arena, fn_params.items.len);
4822 fn_proto.* = .{4808 fn_proto.* = .{
4823 .doc_comments = null,4809 .doc_comments = null,
4824 .visib_token = pub_tok,4810 .visib_token = pub_tok,
4825 .fn_token = fn_tok,4811 .fn_token = fn_tok,
4826 .name_token = name_tok,4812 .name_token = name_tok,
4827 .params = fn_params,4813 .params_len = fn_params.items.len,
4828 .return_type = .{ .Explicit = return_type_node },4814 .return_type = .{ .Explicit = return_type_node },
4829 .var_args_token = null, // TODO this field is broken in the AST data model4815 .var_args_token = null, // TODO this field is broken in the AST data model
4830 .extern_export_inline_token = extern_export_inline_tok,4816 .extern_export_inline_token = extern_export_inline_tok,
...@@ -4834,6 +4820,7 @@ fn finishTransFnProto(...@@ -4834,6 +4820,7 @@ fn finishTransFnProto(
4834 .section_expr = linksection_expr,4820 .section_expr = linksection_expr,
4835 .callconv_expr = callconv_expr,4821 .callconv_expr = callconv_expr,
4836 };4822 };
4823 mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items);
4837 return fn_proto;4824 return fn_proto;
4838}4825}
48394826
...@@ -5130,8 +5117,10 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5130,8 +5117,10 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5130 .{},5117 .{},
5131 );5118 );
5132 }5119 }
5133 var fn_params = ast.Node.FnProto.ParamList{};5120
5134 var fn_params_it = &fn_params.first;5121 var fn_params = std.ArrayList(ast.Node.FnProto.ParamDecl).init(c.gpa);
5122 defer fn_params.deinit();
5123
5135 while (true) {5124 while (true) {
5136 const param_tok = it.next().?;5125 const param_tok = it.next().?;
5137 if (param_tok.id != .Identifier) {5126 if (param_tok.id != .Identifier) {
...@@ -5154,15 +5143,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5154,15 +5143,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5154 .token = token_index,5143 .token = token_index,
5155 };5144 };
51565145
5157 const param_node = try c.arena.create(ast.Node.ParamDecl);5146 (try fn_params.addOne()).* = .{
5158 param_node.* = .{
5159 .doc_comments = null,5147 .doc_comments = null,
5160 .comptime_token = null,5148 .comptime_token = null,
5161 .noalias_token = null,5149 .noalias_token = null,
5162 .name_token = param_name_tok,5150 .name_token = param_name_tok,
5163 .param_type = .{ .type_expr = &identifier.base },5151 .param_type = .{ .type_expr = &identifier.base },
5164 };5152 };
5165 fn_params_it = try c.llpush(*ast.Node, fn_params_it, &param_node.base);
51665153
5167 if (it.peek().?.id != .Comma)5154 if (it.peek().?.id != .Comma)
5168 break;5155 break;
...@@ -5186,13 +5173,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5186,13 +5173,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5186 type_of.rparen_token = try appendToken(c, .RParen, ")");5173 type_of.rparen_token = try appendToken(c, .RParen, ")");
5187 var type_of_params = c.llpusher(&type_of.params);5174 var type_of_params = c.llpusher(&type_of.params);
51885175
5189 const fn_proto = try c.arena.create(ast.Node.FnProto);5176 const fn_proto = try ast.Node.FnProto.alloc(c.arena, fn_params.items.len);
5190 fn_proto.* = .{5177 fn_proto.* = .{
5191 .visib_token = pub_tok,5178 .visib_token = pub_tok,
5192 .extern_export_inline_token = inline_tok,5179 .extern_export_inline_token = inline_tok,
5193 .fn_token = fn_tok,5180 .fn_token = fn_tok,
5194 .name_token = name_tok,5181 .name_token = name_tok,
5195 .params = fn_params,5182 .params_len = fn_params.items.len,
5196 .return_type = .{ .Explicit = &type_of.base },5183 .return_type = .{ .Explicit = &type_of.base },
5197 .doc_comments = null,5184 .doc_comments = null,
5198 .var_args_token = null,5185 .var_args_token = null,
...@@ -5202,6 +5189,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5202,6 +5189,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5202 .section_expr = null,5189 .section_expr = null,
5203 .callconv_expr = null,5190 .callconv_expr = null,
5204 };5191 };
5192 mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items);
52055193
5206 const block = try transCreateNodeBlock(c, null);5194 const block = try transCreateNodeBlock(c, null);
5207 var block_statements = c.llpusher(&block.statements);5195 var block_statements = c.llpusher(&block.statements);