authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-18 22:57:53+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-18 22:57:53+02:00
logc2666c48a4cf5c0576cf846171744b53f39acb80
tree8d9d3c9b3047b791d3e2aa88286e913d80d14d9a
parentcf7a5b7a4a77181a4c90fc9a92df496cfb48c3cd
signature Commit is signed but in an unrecognized format.

translate-c-2 array access


4 files changed, 75 insertions(+), 29 deletions(-)

src-self-hosted/c_tokenizer.zig+10
......@@ -28,6 +28,8 @@ pub const CToken = struct {
2828 Comma,
2929 Fn,
3030 Arrow,
31 LBrace,
32 RBrace,
3133 };
3234
3335 pub const NumLitSuffix = enum {
......@@ -289,6 +291,14 @@ fn next(chars: [*:0]const u8, i: *usize) !CToken {
289291 result.id = .Comma;
290292 state = .Done;
291293 },
294 '[' => {
295 result.id = .LBrace;
296 state = .Done;
297 },
298 ']' => {
299 result.id = .RBrace;
300 state = .Done;
301 },
292302 else => return error.TokenizingFailed,
293303 }
294304 },
src-self-hosted/clang.zig+3
......@@ -1102,3 +1102,6 @@ pub extern fn ZigClangMemberExpr_getBase(*const ZigClangMemberExpr) *const ZigCl
11021102pub extern fn ZigClangMemberExpr_isArrow(*const ZigClangMemberExpr) bool;
11031103pub extern fn ZigClangMemberExpr_getMemberDecl(*const ZigClangMemberExpr) *const ZigClangValueDecl;
11041104
1105pub extern fn ZigClangArraySubscriptExpr_getBase(*const ZigClangArraySubscriptExpr) *const ZigClangExpr;
1106pub extern fn ZigClangArraySubscriptExpr_getIdx(*const ZigClangArraySubscriptExpr) *const ZigClangExpr;
1107
src-self-hosted/translate_c.zig+35-17
......@@ -850,6 +850,7 @@ fn transStmt(
850850 .CharacterLiteralClass => return transCharLiteral(rp, scope, @ptrCast(*const ZigClangCharacterLiteral, stmt), result_used),
851851 .StmtExprClass => return transStmtExpr(rp, scope, @ptrCast(*const ZigClangStmtExpr, stmt), result_used),
852852 .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used),
853 .ArraySubscriptExprClass => return transArrayAccess(rp, scope, @ptrCast(*const ZigClangArraySubscriptExpr, stmt), result_used),
853854 else => {
854855 return revertAndWarn(
855856 rp,
......@@ -1523,7 +1524,7 @@ fn transInitListExpr(
15231524 var cat_tok: ast.TokenIndex = undefined;
15241525 if (init_count != 0) {
15251526 const dot_tok = try appendToken(rp.c, .Period, ".");
1526 init_node = try transCreateNodeArrayInitializer(rp.c, dot_tok);
1527 init_node = try transCreateNodeContainerInitializer(rp.c, dot_tok);
15271528 var i: c_uint = 0;
15281529 while (i < init_count) : (i += 1) {
15291530 const elem_expr = ZigClangInitListExpr_getInit(expr, i);
......@@ -1538,7 +1539,7 @@ fn transInitListExpr(
15381539 }
15391540
15401541 const dot_tok = try appendToken(rp.c, .Period, ".");
1541 var filler_init_node = try transCreateNodeArrayInitializer(rp.c, dot_tok);
1542 var filler_init_node = try transCreateNodeContainerInitializer(rp.c, dot_tok);
15421543 const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);
15431544 try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value));
15441545 filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
......@@ -1995,6 +1996,14 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE
19951996 return maybeSuppressResult(rp, scope, result_used, node);
19961997}
19971998
1999fn transArrayAccess(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangArraySubscriptExpr, result_used: ResultUsed) TransError!*ast.Node {
2000 const container_node = try transExpr(rp, scope, ZigClangArraySubscriptExpr_getBase(stmt), .used, .r_value);
2001 const node = try transCreateNodeArrayAccess(rp.c, container_node);
2002 node.op.ArrayAccess = try transExpr(rp, scope, ZigClangArraySubscriptExpr_getIdx(stmt), .used, .r_value);
2003 node.rtoken = try appendToken(rp.c, .RBrace, "]");
2004 return maybeSuppressResult(rp, scope, result_used, &node.base);
2005}
2006
19982007fn transCPtrCast(
19992008 rp: RestorePoint,
20002009 loc: ZigClangSourceLocation,
......@@ -2643,7 +2652,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {
26432652 return &node.base;
26442653}
26452654
2646fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.Node.SuffixOp {
2655fn transCreateNodeContainerInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.Node.SuffixOp {
26472656 _ = try appendToken(c, .LBrace, "{");
26482657 const node = try c.a().create(ast.Node.SuffixOp);
26492658 node.* = ast.Node.SuffixOp{
......@@ -2972,6 +2981,19 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {
29722981 return &node.base;
29732982}
29742983
2984fn transCreateNodeArrayAccess(c: *Context, lhs: *ast.Node) !*ast.Node.SuffixOp {
2985 _ = try appendToken(c, .LBrace, "[");
2986 const node = try c.a().create(ast.Node.SuffixOp);
2987 node.* = .{
2988 .lhs = .{ .node = lhs },
2989 .op = .{
2990 .ArrayAccess = undefined,
2991 },
2992 .rtoken = undefined,
2993 };
2994 return node;
2995}
2996
29752997const RestorePoint = struct {
29762998 c: *Context,
29772999 token_index: ast.TokenIndex,
......@@ -3869,26 +3891,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
38693891 .Dot => {
38703892 const name_tok = it.next().?;
38713893 if (name_tok.id != .Identifier)
3872 return revertAndWarn(
3873 rp,
3874 error.ParseError,
3875 source_loc,
3876 "unable to translate C expr",
3877 .{},
3878 );
3894 return error.ParseError;
38793895
38803896 node = try transCreateNodeFieldAccess(rp.c, node, name_tok.bytes);
38813897 },
38823898 .Arrow => {
38833899 const name_tok = it.next().?;
38843900 if (name_tok.id != .Identifier)
3885 return revertAndWarn(
3886 rp,
3887 error.ParseError,
3888 source_loc,
3889 "unable to translate C expr",
3890 .{},
3891 );
3901 return error.ParseError;
38923902
38933903 const deref = try transCreateNodePtrDeref(rp.c, node);
38943904 node = try transCreateNodeFieldAccess(rp.c, deref, name_tok.bytes);
......@@ -3929,6 +3939,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
39293939 };
39303940 node = &bitshift_node.base;
39313941 },
3942 .LBrace => {
3943 const arr_node = try transCreateNodeArrayAccess(rp.c, node);
3944 arr_node.op.ArrayAccess = try parseCPrimaryExpr(rp, it, source_loc, scope);
3945 arr_node.rtoken = try appendToken(rp.c, .RBrace, "]");
3946 node = &arr_node.base;
3947 if (it.next().?.id != .RBrace)
3948 return error.ParseError;
3949 },
39323950 else => {
39333951 _ = it.prev();
39343952 return node;
test/translate_c.zig+27-12
......@@ -1523,6 +1523,21 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
15231523 \\pub const ARROW = a.*.b;
15241524 });
15251525
1526 cases.add_2("array access",
1527 \\#define ACCESS array[2]
1528 \\int array[100] = {};
1529 \\int foo(int index) {
1530 \\ return array[index];
1531 \\}
1532 , &[_][]const u8{
1533 \\pub export var array: [100]c_int = .{0} ** 100;
1534 \\pub export fn foo(index: c_int) c_int {
1535 \\ return array[index];
1536 \\}
1537 ,
1538 \\pub const ACCESS = array[2];
1539 });
1540
15261541 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
15271542
15281543 cases.addAllowWarnings("simple data types",
......@@ -1731,18 +1746,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
17311746 \\}
17321747 });
17331748
1734 cases.addC("array access",
1735 \\int array[100];
1736 \\int foo(int index) {
1737 \\ return array[index];
1738 \\}
1739 , &[_][]const u8{
1740 \\pub var array: [100]c_int = undefined;
1741 \\pub export fn foo(index: c_int) c_int {
1742 \\ return array[index];
1743 \\}
1744 });
1745
17461749 cases.addC("sizeof",
17471750 \\#include <stddef.h>
17481751 \\size_t size_of(void) {
......@@ -2656,4 +2659,16 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
26562659 \\ return foo.*.field;
26572660 \\}
26582661 });
2662
2663 cases.addC("array access",
2664 \\int array[100];
2665 \\int foo(int index) {
2666 \\ return array[index];
2667 \\}
2668 , &[_][]const u8{
2669 \\pub var array: [100]c_int = undefined;
2670 \\pub export fn foo(index: c_int) c_int {
2671 \\ return array[index];
2672 \\}
2673 });
26592674}