| ... | @@ -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 | } |
| 119 | | 119 | |
| 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 | } |
| 143 | | 146 | |
| 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 | } |
| 152 | | 154 | |
| 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( |
| 407 | | 408 | |
| 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; |
| 582 | | 583 | |
| 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 | } |
| 629 | | 631 | |
| ... | @@ -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!?* |
| 964 | | 966 | |
| 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 | } |
| 970 | | 972 | |
| ... | @@ -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 |
| 1114 | | 1116 | |
| 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 | } |
| 1120 | | 1122 | |
| ... | @@ -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 | } |
| 1424 | | 1426 | |
| ... | @@ -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) |
| 1493 | | 1495 | |
| 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 | } |
| 1516 | | 1519 | |
| 1517 | fn transDeclRefExpr( | 1520 | fn 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 | } |
| 2137 | | 2140 | |
| 2138 | _ = try appendToken(c, .LBrace, "{"); | 2141 | _ = try appendToken(rp.c, .LBrace, "{"); |
| 2139 | | 2142 | |
| 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; |
| 2189 | | 2192 | |
| 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 | } |
| 2212 | | 2223 | |
| 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, "}"); |
| 2218 | | 2234 | |
| 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: do | 2466 | // 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 | }; |
| 2461 | | 2479 | |
| 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( |
| 2509 | | 2529 | |
| 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 | } |
| 2520 | | 2540 | |
| 2521 | fn getSwitchCaseCount(stmt: *const ZigClangSwitchStmt) usize { | 2541 | fn 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 | } |
| 2526 | | 2552 | |
| 2527 | fn transSwitch( | 2553 | fn 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, "("); |
| 2534 | | 2560 | |
| 2535 | const cases_len = getSwitchCaseCount(ZigClangSwitchStmt_getBody(stmt)); | 2561 | const cases_len = getSwitchCaseCount(stmt); |
| 2536 | | 2562 | |
| 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 correct | 2626 | // 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, ";"); |
| 2618 | | 2644 | |
| 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(); |
| 2780 | | 2806 | |
| 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; |
| 2893 | | 2919 | |
| 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(); |
| 2897 | | 2923 | |
| 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); |
| 3093 | | 3119 | |
| 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 block | 3124 | // 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); |
| 3150 | | 3176 | |
| 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); |
| 3161 | | 3187 | |
| 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); |
| 3167 | | 3193 | |
| 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 | } |
| 3339 | | 3365 | |
| 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); |
| 3459 | | 3485 | |
| 3460 | const break_node = try transCreateNodeBreak(rp.c, block_scope.label); | 3486 | const break_node = try transCreateNodeBreakToken(rp.c, block_scope.label); |
| 3461 | | 3487 | |
| 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); |
| 3486 | | 3512 | |
| 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 _tmp | 3911 | // 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(); |
| 3889 | | 3916 | |
| 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); |
| 3912 | | 3939 | |
| 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 | } |
| 4136 | | 4163 | |
| 4137 | fn 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 | | | |
| 4150 | fn transCreateNodeInt(c: *Context, int: var) !*ast.Node { | 4164 | fn 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 | } |
| 4308 | | 4322 | |
| | 4323 | fn 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 | |
| 4309 | fn transCreateNodeBreak(c: *Context, label: ?[]const u8) !*ast.Node.ControlFlowExpression { | 4330 | fn 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 { |
| 4379 | fn transCreateNodeSwitchCase(c: *Context, lhs: *ast.Node) !*ast.Node.SwitchCase { | 4400 | fn 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, "=>"); |
| 4381 | | 4402 | |
| 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 | } |
| 4392 | | 4413 | |
| ... | @@ -4464,7 +4485,8 @@ const RestorePoint = struct { | ... | @@ -4464,7 +4485,8 @@ const RestorePoint = struct { |
| 4464 | src_buf_index: usize, | 4485 | src_buf_index: usize, |
| 4465 | | 4486 | |
| 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 { |
| 4472 | fn makeRestorePoint(c: *Context) RestorePoint { | 4494 | fn 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(); |
| 5281 | | 5304 | |
| 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 | } |
| 5303 | | 5326 | |
| 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 | //else | 5661 | //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 | }; |
| 5712 | | 5735 | |
| 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 calls | 5739 | // 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 | } |
| 5820 | | 5843 | |
| 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 | } |
| 6116 | | 6139 | |
| 6117 | fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 { | 6140 | fn 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] |