authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-23 16:24:03-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-23 16:24:03-04:00
log1a90a5e63adfd585836aee2658275c02856a4427
tree5155190e962f0b9099f7bbd5ac91b1f07e0450c1
parente072692e1ffb6012d3d75051996bfcbbbd80e093

translate-c is building again, but I have 1 `@panic` in there


2 files changed, 106 insertions(+), 83 deletions(-)

src-self-hosted/main.zig+5-5
...@@ -743,15 +743,15 @@ fn printErrMsgToFile(...@@ -743,15 +743,15 @@ fn printErrMsgToFile(
743 const span_first = lok_token;743 const span_first = lok_token;
744 const span_last = lok_token;744 const span_last = lok_token;
745745
746 const first_token = tree.tokens[span_first];746 const first_token = tree.token_locs[span_first];
747 const last_token = tree.tokens[span_last];747 const last_token = tree.token_locs[span_last];
748 const start_loc = tree.tokenLocationPtr(0, first_token);748 const start_loc = tree.tokenLocationLoc(0, first_token);
749 const end_loc = tree.tokenLocationPtr(first_token.end, last_token);749 const end_loc = tree.tokenLocationLoc(first_token.end, last_token);
750750
751 var text_buf = std.ArrayList(u8).init(gpa);751 var text_buf = std.ArrayList(u8).init(gpa);
752 defer text_buf.deinit();752 defer text_buf.deinit();
753 const out_stream = text_buf.outStream();753 const out_stream = text_buf.outStream();
754 try parse_error.render(tree.tokens, out_stream);754 try parse_error.render(tree.token_ids, out_stream);
755 const text = text_buf.span();755 const text = text_buf.span();
756756
757 const stream = file.outStream();757 const stream = file.outStream();
src-self-hosted/translate_c.zig+101-78
...@@ -59,7 +59,7 @@ const Scope = struct {...@@ -59,7 +59,7 @@ const Scope = struct {
59 /// into the main arena.59 /// into the main arena.
60 const Switch = struct {60 const Switch = struct {
61 base: Scope,61 base: Scope,
62 pending_block: *Block,62 pending_block: Block,
63 cases: []*ast.Node,63 cases: []*ast.Node,
64 case_index: usize,64 case_index: usize,
65 has_default: bool = false,65 has_default: bool = false,
...@@ -102,7 +102,7 @@ const Scope = struct {...@@ -102,7 +102,7 @@ const Scope = struct {
102 },102 },
103 .statements = std.ArrayList(*ast.Node).init(c.gpa),103 .statements = std.ArrayList(*ast.Node).init(c.gpa),
104 .variables = AliasList.init(c.gpa),104 .variables = AliasList.init(c.gpa),
105 .label = if (self.label) |l| blk: {105 .label = if (label) |l| blk: {
106 const ll = try appendIdentifier(c, l);106 const ll = try appendIdentifier(c, l);
107 _ = try appendToken(c, .Colon, ":");107 _ = try appendToken(c, .Colon, ":");
108 break :blk ll;108 break :blk ll;
...@@ -118,7 +118,10 @@ const Scope = struct {...@@ -118,7 +118,10 @@ const Scope = struct {
118 }118 }
119119
120 fn complete(self: *Block, c: *Context) !*ast.Node.Block {120 fn complete(self: *Block, c: *Context) !*ast.Node.Block {
121 const node = try ast.Node.Block.alloc(c.arena, self.statements.items.len);121 // We reserve 1 extra statement if the parent is a Loop. This is in case of
122 // do while, we want to put `if (cond) break;` at the end.
123 const alloc_len = self.statements.items.len + @boolToInt(self.base.parent.?.id == .Loop);
124 const node = try ast.Node.Block.alloc(c.arena, alloc_len);
122 node.* = .{125 node.* = .{
123 .statements_len = self.statements.items.len,126 .statements_len = self.statements.items.len,
124 .lbrace = self.lbrace,127 .lbrace = self.lbrace,
...@@ -137,13 +140,12 @@ const Scope = struct {...@@ -137,13 +140,12 @@ const Scope = struct {
137 scope.mangle_count += 1;140 scope.mangle_count += 1;
138 proposed_name = try std.fmt.allocPrint(c.arena, "{}_{}", .{ name, scope.mangle_count });141 proposed_name = try std.fmt.allocPrint(c.arena, "{}_{}", .{ name, scope.mangle_count });
139 }142 }
140 try scope.variables.push(.{ .name = name, .alias = proposed_name });143 try scope.variables.append(.{ .name = name, .alias = proposed_name });
141 return proposed_name;144 return proposed_name;
142 }145 }
143146
144 fn getAlias(scope: *Block, name: []const u8) []const u8 {147 fn getAlias(scope: *Block, name: []const u8) []const u8 {
145 var it = scope.variables.iterator(0);148 for (scope.variables.items) |p| {
146 while (it.next()) |p| {
147 if (mem.eql(u8, p.name, name))149 if (mem.eql(u8, p.name, name))
148 return p.alias;150 return p.alias;
149 }151 }
...@@ -151,8 +153,7 @@ const Scope = struct {...@@ -151,8 +153,7 @@ const Scope = struct {
151 }153 }
152154
153 fn localContains(scope: *Block, name: []const u8) bool {155 fn localContains(scope: *Block, name: []const u8) bool {
154 var it = scope.variables.iterator(0);156 for (scope.variables.items) |p| {
155 while (it.next()) |p| {
156 if (mem.eql(u8, p.name, name))157 if (mem.eql(u8, p.name, name))
157 return true;158 return true;
158 }159 }
...@@ -407,7 +408,7 @@ pub fn translate(...@@ -407,7 +408,7 @@ pub fn translate(
407408
408 if (false) {409 if (false) {
409 std.debug.warn("debug source:\n{}\n==EOF==\ntokens:\n", .{source_buffer.items});410 std.debug.warn("debug source:\n{}\n==EOF==\ntokens:\n", .{source_buffer.items});
410 for (context.tokens.items) |token| {411 for (context.token_ids.items) |token| {
411 std.debug.warn("{}\n", .{token});412 std.debug.warn("{}\n", .{token});
412 }413 }
413 }414 }
...@@ -581,7 +582,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -581,7 +582,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
581 var scope = &block_scope.base;582 var scope = &block_scope.base;
582583
583 var param_id: c_uint = 0;584 var param_id: c_uint = 0;
584 for (proto_node.params()) |param, i| {585 for (proto_node.params()) |*param, i| {
585 const param_name = if (param.name_token) |name_tok|586 const param_name = if (param.name_token) |name_tok|
586 tokenSlice(c, name_tok)587 tokenSlice(c, name_tok)
587 else if (param.param_type == .var_args) {588 else if (param.param_type == .var_args) {
...@@ -623,7 +624,8 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -623,7 +624,8 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
623 error.UnsupportedType,624 error.UnsupportedType,
624 => return failDecl(c, fn_decl_loc, fn_name, "unable to translate function", .{}),625 => return failDecl(c, fn_decl_loc, fn_name, "unable to translate function", .{}),
625 };626 };
626 proto_node.body_node = try block_scope.complete(rp.c);627 const body_node = try block_scope.complete(rp.c);
628 proto_node.body_node = &body_node.base;
627 return addTopLevelDecl(c, fn_name, &proto_node.base);629 return addTopLevelDecl(c, fn_name, &proto_node.base);
628}630}
629631
...@@ -964,7 +966,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -964,7 +966,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
964966
965 try addTopLevelDecl(c, name, &node.base);967 try addTopLevelDecl(c, name, &node.base);
966 if (!is_unnamed)968 if (!is_unnamed)
967 try c.alias_list.push(.{ .alias = bare_name, .name = name });969 try c.alias_list.append(.{ .alias = bare_name, .name = name });
968 return transCreateNodeIdentifier(c, name);970 return transCreateNodeIdentifier(c, name);
969}971}
970972
...@@ -1114,7 +1116,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -1114,7 +1116,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
11141116
1115 try addTopLevelDecl(c, name, &node.base);1117 try addTopLevelDecl(c, name, &node.base);
1116 if (!is_unnamed)1118 if (!is_unnamed)
1117 try c.alias_list.push(.{ .alias = bare_name, .name = name });1119 try c.alias_list.append(.{ .alias = bare_name, .name = name });
1118 return transCreateNodeIdentifier(c, name);1120 return transCreateNodeIdentifier(c, name);
1119}1121}
11201122
...@@ -1245,7 +1247,7 @@ fn transBinaryOperator(...@@ -1245,7 +1247,7 @@ fn transBinaryOperator(
1245 const rhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);1247 const rhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
1246 if (expr) {1248 if (expr) {
1247 _ = try appendToken(rp.c, .Semicolon, ";");1249 _ = try appendToken(rp.c, .Semicolon, ";");
1248 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);1250 const break_node = try transCreateNodeBreakToken(rp.c, block_scope.label);
1249 break_node.rhs = rhs;1251 break_node.rhs = rhs;
1250 try block_scope.statements.append(&break_node.base);1252 try block_scope.statements.append(&break_node.base);
1251 const block_node = try block_scope.complete(rp.c);1253 const block_node = try block_scope.complete(rp.c);
...@@ -1418,7 +1420,7 @@ fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompo...@@ -1418,7 +1420,7 @@ fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompo
1418 var block_scope = try Scope.Block.init(rp.c, scope, null);1420 var block_scope = try Scope.Block.init(rp.c, scope, null);
1419 defer block_scope.deinit();1421 defer block_scope.deinit();
1420 try transCompoundStmtInline(rp, &block_scope.base, stmt, &block_scope);1422 try transCompoundStmtInline(rp, &block_scope.base, stmt, &block_scope);
1421 const node = block_scope.complete(c);1423 const node = try block_scope.complete(rp.c);
1422 return &node.base;1424 return &node.base;
1423}1425}
14241426
...@@ -1493,7 +1495,7 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)...@@ -1493,7 +1495,7 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)
14931495
1494 const mangled_name = try block_scope.makeMangledName(c, name);1496 const mangled_name = try block_scope.makeMangledName(c, name);
1495 if (checkForBuiltinTypedef(name)) |builtin| {1497 if (checkForBuiltinTypedef(name)) |builtin| {
1496 try block_scope.variables.push(.{1498 try block_scope.variables.append(.{
1497 .alias = builtin,1499 .alias = builtin,
1498 .name = mangled_name,1500 .name = mangled_name,
1499 });1501 });
...@@ -1511,7 +1513,8 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)...@@ -1511,7 +1513,8 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)
1511 ),1513 ),
1512 }1514 }
1513 }1515 }
1514 return &block_scope.block_node.base;1516
1517 @panic("previously the code was returning the containing block scope node here and I do not understand why it would do that");
1515}1518}
15161519
1517fn transDeclRefExpr(1520fn transDeclRefExpr(
...@@ -2135,11 +2138,11 @@ fn transInitListExprRecord(...@@ -2135,11 +2138,11 @@ fn transInitListExprRecord(
2135 _ = try appendToken(rp.c, .Comma, ",");2138 _ = try appendToken(rp.c, .Comma, ",");
2136 }2139 }
21372140
2138 _ = try appendToken(c, .LBrace, "{");2141 _ = try appendToken(rp.c, .LBrace, "{");
21392142
2140 const node = try ast.Node.StructInitializer.alloc(rp.c.arena, field_inits.items.len);2143 const node = try ast.Node.StructInitializer.alloc(rp.c.arena, field_inits.items.len);
2141 node.* = .{2144 node.* = .{
2142 .lhs = ty,2145 .lhs = ty_node,
2143 .rtoken = try appendToken(rp.c, .RBrace, "}"),2146 .rtoken = try appendToken(rp.c, .RBrace, "}"),
2144 .list_len = field_inits.items.len,2147 .list_len = field_inits.items.len,
2145 };2148 };
...@@ -2187,7 +2190,7 @@ fn transInitListExprArray(...@@ -2187,7 +2190,7 @@ fn transInitListExprArray(
2187 const all_count = ZigClangAPInt_getLimitedValue(size_ap_int, math.maxInt(usize));2190 const all_count = ZigClangAPInt_getLimitedValue(size_ap_int, math.maxInt(usize));
2188 const leftover_count = all_count - init_count;2191 const leftover_count = all_count - init_count;
21892192
2190 var init_node: *ast.Node.SuffixOp = undefined;2193 var init_node: *ast.Node.ArrayInitializer = undefined;
2191 var cat_tok: ast.TokenIndex = undefined;2194 var cat_tok: ast.TokenIndex = undefined;
2192 if (init_count != 0) {2195 if (init_count != 0) {
2193 const ty_node = try transCreateNodeArrayType(2196 const ty_node = try transCreateNodeArrayType(
...@@ -2196,11 +2199,19 @@ fn transInitListExprArray(...@@ -2196,11 +2199,19 @@ fn transInitListExprArray(
2196 ZigClangQualType_getTypePtr(child_qt),2199 ZigClangQualType_getTypePtr(child_qt),
2197 init_count,2200 init_count,
2198 );2201 );
2199 init_node = try transCreateNodeArrayInitializer(rp.c, ty_node);2202 _ = try appendToken(rp.c, .LBrace, "{");
2203 init_node = try ast.Node.ArrayInitializer.alloc(rp.c.arena, init_count);
2204 init_node.* = .{
2205 .lhs = ty_node,
2206 .rtoken = undefined,
2207 .list_len = init_count,
2208 };
2209 const init_list = init_node.list();
2210
2200 var i: c_uint = 0;2211 var i: c_uint = 0;
2201 while (i < init_count) : (i += 1) {2212 while (i < init_count) : (i += 1) {
2202 const elem_expr = ZigClangInitListExpr_getInit(expr, i);2213 const elem_expr = ZigClangInitListExpr_getInit(expr, i);
2203 try init_node.op.ArrayInitializer.push(try transExpr(rp, scope, elem_expr, .used, .r_value));2214 init_list[i] = try transExpr(rp, scope, elem_expr, .used, .r_value);
2204 _ = try appendToken(rp.c, .Comma, ",");2215 _ = try appendToken(rp.c, .Comma, ",");
2205 }2216 }
2206 init_node.rtoken = try appendToken(rp.c, .RBrace, "}");2217 init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
...@@ -2211,9 +2222,14 @@ fn transInitListExprArray(...@@ -2211,9 +2222,14 @@ fn transInitListExprArray(
2211 }2222 }
22122223
2213 const ty_node = try transCreateNodeArrayType(rp, loc, ZigClangQualType_getTypePtr(child_qt), 1);2224 const ty_node = try transCreateNodeArrayType(rp, loc, ZigClangQualType_getTypePtr(child_qt), 1);
2214 var filler_init_node = try transCreateNodeArrayInitializer(rp.c, ty_node);2225 const filler_init_node = try ast.Node.ArrayInitializer.alloc(rp.c.arena, 1);
2226 filler_init_node.* = .{
2227 .lhs = ty_node,
2228 .rtoken = undefined,
2229 .list_len = 1,
2230 };
2215 const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);2231 const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);
2216 try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value));2232 filler_init_node.list()[0] = try transExpr(rp, scope, filler_val_expr, .used, .r_value);
2217 filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");2233 filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
22182234
2219 const rhs_node = if (leftover_count == 1)2235 const rhs_node = if (leftover_count == 1)
...@@ -2443,7 +2459,8 @@ fn transDoWhileLoop(...@@ -2443,7 +2459,8 @@ fn transDoWhileLoop(
2443 // zig: b;2459 // zig: b;
2444 // zig: if (!cond) break;2460 // zig: if (!cond) break;
2445 // zig: }2461 // zig: }
2446 break :blk (try transStmt(rp, &loop_scope, ZigClangDoStmt_getBody(stmt), .unused, .r_value)).cast(ast.Node.Block).?;2462 const node = try transStmt(rp, &loop_scope, ZigClangDoStmt_getBody(stmt), .unused, .r_value);
2463 break :blk node.cast(ast.Node.Block).?;
2447 } else blk: {2464 } else blk: {
2448 // the C statement is without a block, so we need to create a block to contain it.2465 // the C statement is without a block, so we need to create a block to contain it.
2449 // c: do2466 // c: do
...@@ -2454,12 +2471,15 @@ fn transDoWhileLoop(...@@ -2454,12 +2471,15 @@ fn transDoWhileLoop(
2454 // zig: if (!cond) break;2471 // zig: if (!cond) break;
2455 // zig: }2472 // zig: }
2456 new = true;2473 new = true;
2457 const block = try transCreateNodeBlock(rp.c, null);2474 const block = try rp.c.createBlock(null, 2);
2458 try block.statements.push(try transStmt(rp, &loop_scope, ZigClangDoStmt_getBody(stmt), .unused, .r_value));2475 block.statements_len = 1; // over-allocated so we can add another below
2476 block.statements()[0] = try transStmt(rp, &loop_scope, ZigClangDoStmt_getBody(stmt), .unused, .r_value);
2459 break :blk block;2477 break :blk block;
2460 };2478 };
24612479
2462 try body_node.statements.push(&if_node.base);2480 // In both cases above, we reserved 1 extra statement.
2481 body_node.statements()[body_node.statements_len] = &if_node.base;
2482 body_node.statements_len += 1;
2463 if (new)2483 if (new)
2464 body_node.rbrace = try appendToken(rp.c, .RBrace, "}");2484 body_node.rbrace = try appendToken(rp.c, .RBrace, "}");
2465 while_node.body = &body_node.base;2485 while_node.body = &body_node.base;
...@@ -2482,8 +2502,8 @@ fn transForLoop(...@@ -2482,8 +2502,8 @@ fn transForLoop(
2482 if (ZigClangForStmt_getInit(stmt)) |init| {2502 if (ZigClangForStmt_getInit(stmt)) |init| {
2483 block_scope = try Scope.Block.init(rp.c, scope, null);2503 block_scope = try Scope.Block.init(rp.c, scope, null);
2484 loop_scope.parent = &block_scope.?.base;2504 loop_scope.parent = &block_scope.?.base;
2485 const result = try transStmt(rp, &block_scope.?.base, init, .unused, .r_value);2505 const init_node = try transStmt(rp, &block_scope.?.base, init, .unused, .r_value);
2486 try block_scope.statements.push(result);2506 try block_scope.?.statements.append(init_node);
2487 }2507 }
2488 var cond_scope = Scope.Condition{2508 var cond_scope = Scope.Condition{
2489 .base = .{2509 .base = .{
...@@ -2509,8 +2529,8 @@ fn transForLoop(...@@ -2509,8 +2529,8 @@ fn transForLoop(
25092529
2510 while_node.body = try transStmt(rp, &loop_scope, ZigClangForStmt_getBody(stmt), .unused, .r_value);2530 while_node.body = try transStmt(rp, &loop_scope, ZigClangForStmt_getBody(stmt), .unused, .r_value);
2511 if (block_scope) |*bs| {2531 if (block_scope) |*bs| {
2512 try bs.statements.push(&while_node.base);2532 try bs.statements.append(&while_node.base);
2513 const node = bs.complete(rp.c);2533 const node = try bs.complete(rp.c);
2514 return &node.base;2534 return &node.base;
2515 } else {2535 } else {
2516 _ = try appendToken(rp.c, .Semicolon, ";");2536 _ = try appendToken(rp.c, .Semicolon, ";");
...@@ -2519,9 +2539,15 @@ fn transForLoop(...@@ -2519,9 +2539,15 @@ fn transForLoop(
2519}2539}
25202540
2521fn getSwitchCaseCount(stmt: *const ZigClangSwitchStmt) usize {2541fn getSwitchCaseCount(stmt: *const ZigClangSwitchStmt) usize {
2522 const stmt = ZigClangSwitchStmt_getBody(stmt);2542 const body = ZigClangSwitchStmt_getBody(stmt);
2523 const comp = ZigClangStmtExpr_getSubStmt(stmt);2543 assert(ZigClangStmt_getStmtClass(body) == .StmtExprClass);
2524 return ZigClangCompoundStmt_body_end(comp) - ZigClangCompoundStmt_body_begin(comp);2544 const stmt_expr = @ptrCast(*const ZigClangStmtExpr, body);
2545 const comp = ZigClangStmtExpr_getSubStmt(stmt_expr);
2546 // TODO https://github.com/ziglang/zig/issues/1738
2547 // return ZigClangCompoundStmt_body_end(comp) - ZigClangCompoundStmt_body_begin(comp);
2548 const start_addr = @ptrToInt(ZigClangCompoundStmt_body_begin(comp));
2549 const end_addr = @ptrToInt(ZigClangCompoundStmt_body_end(comp));
2550 return (end_addr - start_addr) / @sizeOf(*ZigClangStmt);
2525}2551}
25262552
2527fn transSwitch(2553fn transSwitch(
...@@ -2532,7 +2558,7 @@ fn transSwitch(...@@ -2532,7 +2558,7 @@ fn transSwitch(
2532 const switch_tok = try appendToken(rp.c, .Keyword_switch, "switch");2558 const switch_tok = try appendToken(rp.c, .Keyword_switch, "switch");
2533 _ = try appendToken(rp.c, .LParen, "(");2559 _ = try appendToken(rp.c, .LParen, "(");
25342560
2535 const cases_len = getSwitchCaseCount(ZigClangSwitchStmt_getBody(stmt));2561 const cases_len = getSwitchCaseCount(stmt);
25362562
2537 var cond_scope = Scope.Condition{2563 var cond_scope = Scope.Condition{
2538 .base = .{2564 .base = .{
...@@ -2594,8 +2620,8 @@ fn transSwitch(...@@ -2594,8 +2620,8 @@ fn transSwitch(
2594 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));2620 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));
2595 else_prong.expr = &(try transCreateNodeBreak(rp.c, "__switch")).base;2621 else_prong.expr = &(try transCreateNodeBreak(rp.c, "__switch")).base;
2596 _ = try appendToken(rp.c, .Comma, ",");2622 _ = try appendToken(rp.c, .Comma, ",");
2597 switch_node.cases[switch_node.case_index] = &else_prong.base;2623 switch_scope.cases[switch_scope.case_index] = &else_prong.base;
2598 switch_node.case_index += 1;2624 switch_scope.case_index += 1;
2599 }2625 }
2600 // We overallocated in case there was no default, so now we correct2626 // We overallocated in case there was no default, so now we correct
2601 // the number of cases in the AST node.2627 // the number of cases in the AST node.
...@@ -2613,7 +2639,7 @@ fn transCase(...@@ -2613,7 +2639,7 @@ fn transCase(
2613) TransError!*ast.Node {2639) TransError!*ast.Node {
2614 const block_scope = scope.findBlockScope(rp.c) catch unreachable;2640 const block_scope = scope.findBlockScope(rp.c) catch unreachable;
2615 const switch_scope = scope.getSwitch();2641 const switch_scope = scope.getSwitch();
2616 const label = try std.fmt.allocPrint(rp.c.arena, "__case_{}", .{switch_scope.cases.len() - @boolToInt(switch_scope.has_default)});2642 const label = try std.fmt.allocPrint(rp.c.arena, "__case_{}", .{switch_scope.case_index - @boolToInt(switch_scope.has_default)});
2617 _ = try appendToken(rp.c, .Semicolon, ";");2643 _ = try appendToken(rp.c, .Semicolon, ";");
26182644
2619 const expr = if (ZigClangCaseStmt_getRHS(stmt)) |rhs| blk: {2645 const expr = if (ZigClangCaseStmt_getRHS(stmt)) |rhs| blk: {
...@@ -2775,7 +2801,7 @@ fn transStmtExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangStmtExpr,...@@ -2775,7 +2801,7 @@ fn transStmtExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangStmtExpr,
2775 return transCompoundStmt(rp, scope, comp);2801 return transCompoundStmt(rp, scope, comp);
2776 }2802 }
2777 const lparen = try appendToken(rp.c, .LParen, "(");2803 const lparen = try appendToken(rp.c, .LParen, "(");
2778 const block_scope = try Scope.Block.init(rp.c, scope, "blk");2804 var block_scope = try Scope.Block.init(rp.c, scope, "blk");
2779 defer block_scope.deinit();2805 defer block_scope.deinit();
27802806
2781 var it = ZigClangCompoundStmt_body_begin(comp);2807 var it = ZigClangCompoundStmt_body_begin(comp);
...@@ -2892,7 +2918,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr,...@@ -2892,7 +2918,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr,
2892 raw_fn_expr;2918 raw_fn_expr;
28932919
2894 const num_args = ZigClangCallExpr_getNumArgs(stmt);2920 const num_args = ZigClangCallExpr_getNumArgs(stmt);
2895 const node = try c.createCall(fn_expr, num_args);2921 const node = try rp.c.createCall(fn_expr, num_args);
2896 const call_params = node.params();2922 const call_params = node.params();
28972923
2898 const args = ZigClangCallExpr_getArgs(stmt);2924 const args = ZigClangCallExpr_getArgs(stmt);
...@@ -3091,9 +3117,9 @@ fn transCreatePreCrement(...@@ -3091,9 +3117,9 @@ fn transCreatePreCrement(
3091 const assign = try transCreateNodeInfixOp(rp, scope, ref_node, op, token, one, .used, false);3117 const assign = try transCreateNodeInfixOp(rp, scope, ref_node, op, token, one, .used, false);
3092 try block_scope.statements.append(assign);3118 try block_scope.statements.append(assign);
30933119
3094 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);3120 const break_node = try transCreateNodeBreakToken(rp.c, block_scope.label);
3095 break_node.rhs = ref_node;3121 break_node.rhs = ref_node;
3096 try block_scope.statements.push(&break_node.base);3122 try block_scope.statements.append(&break_node.base);
3097 const block_node = try block_scope.complete(rp.c);3123 const block_node = try block_scope.complete(rp.c);
3098 // semicolon must immediately follow rbrace because it is the last token in a block3124 // semicolon must immediately follow rbrace because it is the last token in a block
3099 _ = try appendToken(rp.c, .Semicolon, ";");3125 _ = try appendToken(rp.c, .Semicolon, ";");
...@@ -3146,7 +3172,7 @@ fn transCreatePostCrement(...@@ -3146,7 +3172,7 @@ fn transCreatePostCrement(
3146 rhs_node.rhs = try transExpr(rp, scope, op_expr, .used, .r_value);3172 rhs_node.rhs = try transExpr(rp, scope, op_expr, .used, .r_value);
3147 node.init_node = &rhs_node.base;3173 node.init_node = &rhs_node.base;
3148 node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");3174 node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
3149 try block_scope.statements.push(&node.base);3175 try block_scope.statements.append(&node.base);
31503176
3151 const lhs_node = try transCreateNodeIdentifier(rp.c, ref);3177 const lhs_node = try transCreateNodeIdentifier(rp.c, ref);
3152 const ref_node = try transCreateNodePtrDeref(rp.c, lhs_node);3178 const ref_node = try transCreateNodePtrDeref(rp.c, lhs_node);
...@@ -3157,17 +3183,17 @@ fn transCreatePostCrement(...@@ -3157,17 +3183,17 @@ fn transCreatePostCrement(
3157 tmp_node.eq_token = try appendToken(rp.c, .Equal, "=");3183 tmp_node.eq_token = try appendToken(rp.c, .Equal, "=");
3158 tmp_node.init_node = ref_node;3184 tmp_node.init_node = ref_node;
3159 tmp_node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");3185 tmp_node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
3160 try block_scope.statements.push(&tmp_node.base);3186 try block_scope.statements.append(&tmp_node.base);
31613187
3162 const token = try appendToken(rp.c, op_tok_id, bytes);3188 const token = try appendToken(rp.c, op_tok_id, bytes);
3163 const one = try transCreateNodeInt(rp.c, 1);3189 const one = try transCreateNodeInt(rp.c, 1);
3164 _ = try appendToken(rp.c, .Semicolon, ";");3190 _ = try appendToken(rp.c, .Semicolon, ";");
3165 const assign = try transCreateNodeInfixOp(rp, scope, ref_node, op, token, one, .used, false);3191 const assign = try transCreateNodeInfixOp(rp, scope, ref_node, op, token, one, .used, false);
3166 try block_scope.statements.push(assign);3192 try block_scope.statements.append(assign);
31673193
3168 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);3194 const break_node = try transCreateNodeBreakToken(rp.c, block_scope.label);
3169 break_node.rhs = try transCreateNodeIdentifier(rp.c, tmp);3195 break_node.rhs = try transCreateNodeIdentifier(rp.c, tmp);
3170 try block_scope.statements.push(&break_node.base);3196 try block_scope.statements.append(&break_node.base);
3171 _ = try appendToken(rp.c, .Semicolon, ";");3197 _ = try appendToken(rp.c, .Semicolon, ";");
3172 const block_node = try block_scope.complete(rp.c);3198 const block_node = try block_scope.complete(rp.c);
3173 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);3199 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
...@@ -3337,7 +3363,7 @@ fn transCreateCompoundAssign(...@@ -3337,7 +3363,7 @@ fn transCreateCompoundAssign(
3337 try block_scope.statements.append(assign);3363 try block_scope.statements.append(assign);
3338 }3364 }
33393365
3340 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);3366 const break_node = try transCreateNodeBreakToken(rp.c, block_scope.label);
3341 break_node.rhs = ref_node;3367 break_node.rhs = ref_node;
3342 try block_scope.statements.append(&break_node.base);3368 try block_scope.statements.append(&break_node.base);
3343 const block_node = try block_scope.complete(rp.c);3369 const block_node = try block_scope.complete(rp.c);
...@@ -3457,7 +3483,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const...@@ -3457,7 +3483,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const
3457 tmp_var.semicolon_token = try appendToken(rp.c, .Semicolon, ";");3483 tmp_var.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
3458 try block_scope.statements.append(&tmp_var.base);3484 try block_scope.statements.append(&tmp_var.base);
34593485
3460 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);3486 const break_node = try transCreateNodeBreakToken(rp.c, block_scope.label);
34613487
3462 const if_node = try transCreateNodeIf(rp.c);3488 const if_node = try transCreateNodeIf(rp.c);
3463 var cond_scope = Scope.Condition{3489 var cond_scope = Scope.Condition{
...@@ -3482,7 +3508,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const...@@ -3482,7 +3508,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const
3482 break_node.rhs = &if_node.base;3508 break_node.rhs = &if_node.base;
3483 _ = try appendToken(rp.c, .Semicolon, ";");3509 _ = try appendToken(rp.c, .Semicolon, ";");
3484 try block_scope.statements.append(&break_node.base);3510 try block_scope.statements.append(&break_node.base);
3485 const block_node = block_scope.complete(rp.c);3511 const block_node = try block_scope.complete(rp.c);
34863512
3487 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);3513 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
3488 grouped_expr.* = .{3514 grouped_expr.* = .{
...@@ -3884,7 +3910,8 @@ fn transCreateNodeAssign(...@@ -3884,7 +3910,8 @@ fn transCreateNodeAssign(
3884 // zig: lhs = _tmp;3910 // zig: lhs = _tmp;
3885 // zig: break :blk _tmp3911 // zig: break :blk _tmp
3886 // zig: })3912 // zig: })
3887 var block_scope = try Scope.Block.init(rp.c, scope, "blk");3913 const label_name = "blk";
3914 var block_scope = try Scope.Block.init(rp.c, scope, label_name);
3888 defer block_scope.deinit();3915 defer block_scope.deinit();
38893916
3890 const tmp = try block_scope.makeMangledName(rp.c, "tmp");3917 const tmp = try block_scope.makeMangledName(rp.c, "tmp");
...@@ -3910,7 +3937,7 @@ fn transCreateNodeAssign(...@@ -3910,7 +3937,7 @@ fn transCreateNodeAssign(
3910 const assign = try transCreateNodeInfixOp(rp, &block_scope.base, lhs_node, .Assign, eq_token, ident, .used, false);3937 const assign = try transCreateNodeInfixOp(rp, &block_scope.base, lhs_node, .Assign, eq_token, ident, .used, false);
3911 try block_scope.statements.append(assign);3938 try block_scope.statements.append(assign);
39123939
3913 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);3940 const break_node = try transCreateNodeBreak(rp.c, label_name);
3914 break_node.rhs = try transCreateNodeIdentifier(rp.c, tmp);3941 break_node.rhs = try transCreateNodeIdentifier(rp.c, tmp);
3915 _ = try appendToken(rp.c, .Semicolon, ";");3942 _ = try appendToken(rp.c, .Semicolon, ";");
3916 try block_scope.statements.append(&break_node.base);3943 try block_scope.statements.append(&break_node.base);
...@@ -4134,19 +4161,6 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {...@@ -4134,19 +4161,6 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {
4134 return &node.base;4161 return &node.base;
4135}4162}
41364163
4137fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp {
4138 _ = try appendToken(c, .LBrace, "{");
4139 const node = try c.arena.create(ast.Node.SuffixOp);
4140 node.* = .{
4141 .lhs = ty,
4142 .op = .{
4143 .ArrayInitializer = ast.Node.SuffixOp.Op.InitList{},
4144 },
4145 .rtoken = undefined, // set after appending values
4146 };
4147 return node;
4148}
4149
4150fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {4164fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {
4151 const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int});4165 const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int});
4152 const node = try c.arena.create(ast.Node.IntegerLiteral);4166 const node = try c.arena.create(ast.Node.IntegerLiteral);
...@@ -4306,6 +4320,13 @@ fn transCreateNodeElse(c: *Context) !*ast.Node.Else {...@@ -4306,6 +4320,13 @@ fn transCreateNodeElse(c: *Context) !*ast.Node.Else {
4306 return node;4320 return node;
4307}4321}
43084322
4323fn transCreateNodeBreakToken(c: *Context, label: ?ast.TokenIndex) !*ast.Node.ControlFlowExpression {
4324 const other_token = label orelse return transCreateNodeBreak(c, null);
4325 const loc = c.token_locs.items[other_token];
4326 const label_name = c.source_buffer.items[loc.start..loc.end];
4327 return transCreateNodeBreak(c, label_name);
4328}
4329
4309fn transCreateNodeBreak(c: *Context, label: ?[]const u8) !*ast.Node.ControlFlowExpression {4330fn transCreateNodeBreak(c: *Context, label: ?[]const u8) !*ast.Node.ControlFlowExpression {
4310 const ltoken = try appendToken(c, .Keyword_break, "break");4331 const ltoken = try appendToken(c, .Keyword_break, "break");
4311 const label_node = if (label) |l| blk: {4332 const label_node = if (label) |l| blk: {
...@@ -4379,14 +4400,14 @@ fn transCreateNodeContinue(c: *Context) !*ast.Node {...@@ -4379,14 +4400,14 @@ fn transCreateNodeContinue(c: *Context) !*ast.Node {
4379fn transCreateNodeSwitchCase(c: *Context, lhs: *ast.Node) !*ast.Node.SwitchCase {4400fn transCreateNodeSwitchCase(c: *Context, lhs: *ast.Node) !*ast.Node.SwitchCase {
4380 const arrow_tok = try appendToken(c, .EqualAngleBracketRight, "=>");4401 const arrow_tok = try appendToken(c, .EqualAngleBracketRight, "=>");
43814402
4382 const node = try c.arena.create(ast.Node.SwitchCase);4403 const node = try ast.Node.SwitchCase.alloc(c.arena, 1);
4383 node.* = .{4404 node.* = .{
4384 .items = ast.Node.SwitchCase.ItemList{},4405 .items_len = 1,
4385 .arrow_token = arrow_tok,4406 .arrow_token = arrow_tok,
4386 .payload = null,4407 .payload = null,
4387 .expr = undefined,4408 .expr = undefined,
4388 };4409 };
4389 try node.items.push(lhs);4410 node.items()[0] = lhs;
4390 return node;4411 return node;
4391}4412}
43924413
...@@ -4464,7 +4485,8 @@ const RestorePoint = struct {...@@ -4464,7 +4485,8 @@ const RestorePoint = struct {
4464 src_buf_index: usize,4485 src_buf_index: usize,
44654486
4466 fn activate(self: RestorePoint) void {4487 fn activate(self: RestorePoint) void {
4467 self.c.tokens.shrink(self.c.gpa, self.token_index);4488 self.c.token_ids.shrink(self.c.gpa, self.token_index);
4489 self.c.token_locs.shrink(self.c.gpa, self.token_index);
4468 self.c.source_buffer.shrink(self.src_buf_index);4490 self.c.source_buffer.shrink(self.src_buf_index);
4469 }4491 }
4470};4492};
...@@ -4472,7 +4494,7 @@ const RestorePoint = struct {...@@ -4472,7 +4494,7 @@ const RestorePoint = struct {
4472fn makeRestorePoint(c: *Context) RestorePoint {4494fn makeRestorePoint(c: *Context) RestorePoint {
4473 return RestorePoint{4495 return RestorePoint{
4474 .c = c,4496 .c = c,
4475 .token_index = c.tokens.items.len,4497 .token_index = c.token_ids.items.len,
4476 .src_buf_index = c.source_buffer.items.len,4498 .src_buf_index = c.source_buffer.items.len,
4477 };4499 };
4478}4500}
...@@ -5233,7 +5255,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5233,7 +5255,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5233 _ = try appendToken(c, .Semicolon, ";");5255 _ = try appendToken(c, .Semicolon, ";");
5234 const type_of_arg = if (expr.id != .Block) expr else blk: {5256 const type_of_arg = if (expr.id != .Block) expr else blk: {
5235 const blk = @fieldParentPtr(ast.Node.Block, "base", expr);5257 const blk = @fieldParentPtr(ast.Node.Block, "base", expr);
5236 const blk_last = blk.statements.first.?.findLast().data;5258 const blk_last = blk.statements()[blk.statements_len - 1];
5237 std.debug.assert(blk_last.id == .ControlFlowExpression);5259 std.debug.assert(blk_last.id == .ControlFlowExpression);
5238 const br = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", blk_last);5260 const br = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", blk_last);
5239 break :blk br.rhs.?;5261 break :blk br.rhs.?;
...@@ -5276,7 +5298,8 @@ fn parseCExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, source_...@@ -5276,7 +5298,8 @@ fn parseCExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, source_
5276 },5298 },
5277 .Comma => {5299 .Comma => {
5278 _ = try appendToken(c, .Semicolon, ";");5300 _ = try appendToken(c, .Semicolon, ";");
5279 var block_scope = try Scope.Block.init(c, scope, "blk");5301 const label_name = "blk";
5302 var block_scope = try Scope.Block.init(c, scope, label_name);
5280 defer block_scope.deinit();5303 defer block_scope.deinit();
52815304
5282 var last = node;5305 var last = node;
...@@ -5301,7 +5324,7 @@ fn parseCExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, source_...@@ -5301,7 +5324,7 @@ fn parseCExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, source_
5301 }5324 }
5302 }5325 }
53035326
5304 const break_node = try transCreateNodeBreak(c, block_scope.label);5327 const break_node = try transCreateNodeBreak(c, label_name);
5305 break_node.rhs = last;5328 break_node.rhs = last;
5306 try block_scope.statements.append(&break_node.base);5329 try block_scope.statements.append(&break_node.base);
5307 const block_node = try block_scope.complete(c);5330 const block_node = try block_scope.complete(c);
...@@ -5638,7 +5661,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5638,7 +5661,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5638 //else5661 //else
5639 // @as(dest, x) )5662 // @as(dest, x) )
5640 const if_node = try transCreateNodeIf(c);5663 const if_node = try transCreateNodeIf(c);
5641 const type_info_node = try rp.c.createBuiltinCall("@typeInfo", 1);5664 const type_info_node = try c.createBuiltinCall("@typeInfo", 1);
5642 type_info_node.params()[0] = inner_node;5665 type_info_node.params()[0] = inner_node;
5643 type_info_node.rparen_token = try appendToken(c, .LParen, ")");5666 type_info_node.rparen_token = try appendToken(c, .LParen, ")");
5644 const cmp_node = try c.arena.create(ast.Node.InfixOp);5667 const cmp_node = try c.arena.create(ast.Node.InfixOp);
...@@ -5710,7 +5733,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5710,7 +5733,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5710 .rhs = child_ident,5733 .rhs = child_ident,
5711 };5734 };
57125735
5713 const align_of = try rp.c.createBuiltinCall("@alignOf", 1);5736 const align_of = try c.createBuiltinCall("@alignOf", 1);
5714 align_of.params()[0] = &inner_node_child.base;5737 align_of.params()[0] = &inner_node_child.base;
5715 align_of.rparen_token = try appendToken(c, .RParen, ")");5738 align_of.rparen_token = try appendToken(c, .RParen, ")");
5716 // hack to get zig fmt to render a comma in builtin calls5739 // hack to get zig fmt to render a comma in builtin calls
...@@ -5818,7 +5841,7 @@ fn macroBoolToInt(c: *Context, node: *ast.Node) !*ast.Node {...@@ -5818,7 +5841,7 @@ fn macroBoolToInt(c: *Context, node: *ast.Node) !*ast.Node {
5818 return &group_node.base;5841 return &group_node.base;
5819 }5842 }
58205843
5821 const builtin_node = try rp.c.createBuiltinCall("@boolToInt", 1);5844 const builtin_node = try c.createBuiltinCall("@boolToInt", 1);
5822 builtin_node.params()[0] = node;5845 builtin_node.params()[0] = node;
5823 builtin_node.rparen_token = try appendToken(c, .RParen, ")");5846 builtin_node.rparen_token = try appendToken(c, .RParen, ")");
5824 return &builtin_node.base;5847 return &builtin_node.base;
...@@ -6115,7 +6138,7 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -6115,7 +6138,7 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
6115}6138}
61166139
6117fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 {6140fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 {
6118 const tok = c.tokens.items[token];6141 const tok = c.token_locs.items[token];
6119 const slice = c.source_buffer.span()[tok.start..tok.end];6142 const slice = c.source_buffer.span()[tok.start..tok.end];
6120 return if (mem.startsWith(u8, slice, "@\""))6143 return if (mem.startsWith(u8, slice, "@\""))
6121 slice[2 .. slice.len - 1]6144 slice[2 .. slice.len - 1]