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 {...@@ -28,6 +28,8 @@ pub const CToken = struct {
28 Comma,28 Comma,
29 Fn,29 Fn,
30 Arrow,30 Arrow,
31 LBrace,
32 RBrace,
31 };33 };
3234
33 pub const NumLitSuffix = enum {35 pub const NumLitSuffix = enum {
...@@ -289,6 +291,14 @@ fn next(chars: [*:0]const u8, i: *usize) !CToken {...@@ -289,6 +291,14 @@ fn next(chars: [*:0]const u8, i: *usize) !CToken {
289 result.id = .Comma;291 result.id = .Comma;
290 state = .Done;292 state = .Done;
291 },293 },
294 '[' => {
295 result.id = .LBrace;
296 state = .Done;
297 },
298 ']' => {
299 result.id = .RBrace;
300 state = .Done;
301 },
292 else => return error.TokenizingFailed,302 else => return error.TokenizingFailed,
293 }303 }
294 },304 },
src-self-hosted/clang.zig+3
...@@ -1102,3 +1102,6 @@ pub extern fn ZigClangMemberExpr_getBase(*const ZigClangMemberExpr) *const ZigCl...@@ -1102,3 +1102,6 @@ pub extern fn ZigClangMemberExpr_getBase(*const ZigClangMemberExpr) *const ZigCl
1102pub extern fn ZigClangMemberExpr_isArrow(*const ZigClangMemberExpr) bool;1102pub extern fn ZigClangMemberExpr_isArrow(*const ZigClangMemberExpr) bool;
1103pub extern fn ZigClangMemberExpr_getMemberDecl(*const ZigClangMemberExpr) *const ZigClangValueDecl;1103pub 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(...@@ -850,6 +850,7 @@ fn transStmt(
850 .CharacterLiteralClass => return transCharLiteral(rp, scope, @ptrCast(*const ZigClangCharacterLiteral, stmt), result_used),850 .CharacterLiteralClass => return transCharLiteral(rp, scope, @ptrCast(*const ZigClangCharacterLiteral, stmt), result_used),
851 .StmtExprClass => return transStmtExpr(rp, scope, @ptrCast(*const ZigClangStmtExpr, stmt), result_used),851 .StmtExprClass => return transStmtExpr(rp, scope, @ptrCast(*const ZigClangStmtExpr, stmt), result_used),
852 .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used),852 .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used),
853 .ArraySubscriptExprClass => return transArrayAccess(rp, scope, @ptrCast(*const ZigClangArraySubscriptExpr, stmt), result_used),
853 else => {854 else => {
854 return revertAndWarn(855 return revertAndWarn(
855 rp,856 rp,
...@@ -1523,7 +1524,7 @@ fn transInitListExpr(...@@ -1523,7 +1524,7 @@ fn transInitListExpr(
1523 var cat_tok: ast.TokenIndex = undefined;1524 var cat_tok: ast.TokenIndex = undefined;
1524 if (init_count != 0) {1525 if (init_count != 0) {
1525 const dot_tok = try appendToken(rp.c, .Period, ".");1526 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);
1527 var i: c_uint = 0;1528 var i: c_uint = 0;
1528 while (i < init_count) : (i += 1) {1529 while (i < init_count) : (i += 1) {
1529 const elem_expr = ZigClangInitListExpr_getInit(expr, i);1530 const elem_expr = ZigClangInitListExpr_getInit(expr, i);
...@@ -1538,7 +1539,7 @@ fn transInitListExpr(...@@ -1538,7 +1539,7 @@ fn transInitListExpr(
1538 }1539 }
15391540
1540 const dot_tok = try appendToken(rp.c, .Period, ".");1541 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);
1542 const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);1543 const filler_val_expr = ZigClangInitListExpr_getArrayFiller(expr);
1543 try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value));1544 try filler_init_node.op.ArrayInitializer.push(try transExpr(rp, scope, filler_val_expr, .used, .r_value));
1544 filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");1545 filler_init_node.rtoken = try appendToken(rp.c, .RBrace, "}");
...@@ -1995,6 +1996,14 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE...@@ -1995,6 +1996,14 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE
1995 return maybeSuppressResult(rp, scope, result_used, node);1996 return maybeSuppressResult(rp, scope, result_used, node);
1996}1997}
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
1998fn transCPtrCast(2007fn transCPtrCast(
1999 rp: RestorePoint,2008 rp: RestorePoint,
2000 loc: ZigClangSourceLocation,2009 loc: ZigClangSourceLocation,
...@@ -2643,7 +2652,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {...@@ -2643,7 +2652,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {
2643 return &node.base;2652 return &node.base;
2644}2653}
26452654
2646fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.Node.SuffixOp {2655fn transCreateNodeContainerInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.Node.SuffixOp {
2647 _ = try appendToken(c, .LBrace, "{");2656 _ = try appendToken(c, .LBrace, "{");
2648 const node = try c.a().create(ast.Node.SuffixOp);2657 const node = try c.a().create(ast.Node.SuffixOp);
2649 node.* = ast.Node.SuffixOp{2658 node.* = ast.Node.SuffixOp{
...@@ -2972,6 +2981,19 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {...@@ -2972,6 +2981,19 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {
2972 return &node.base;2981 return &node.base;
2973}2982}
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
2975const RestorePoint = struct {2997const RestorePoint = struct {
2976 c: *Context,2998 c: *Context,
2977 token_index: ast.TokenIndex,2999 token_index: ast.TokenIndex,
...@@ -3869,26 +3891,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -3869,26 +3891,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
3869 .Dot => {3891 .Dot => {
3870 const name_tok = it.next().?;3892 const name_tok = it.next().?;
3871 if (name_tok.id != .Identifier)3893 if (name_tok.id != .Identifier)
3872 return revertAndWarn(3894 return error.ParseError;
3873 rp,
3874 error.ParseError,
3875 source_loc,
3876 "unable to translate C expr",
3877 .{},
3878 );
38793895
3880 node = try transCreateNodeFieldAccess(rp.c, node, name_tok.bytes);3896 node = try transCreateNodeFieldAccess(rp.c, node, name_tok.bytes);
3881 },3897 },
3882 .Arrow => {3898 .Arrow => {
3883 const name_tok = it.next().?;3899 const name_tok = it.next().?;
3884 if (name_tok.id != .Identifier)3900 if (name_tok.id != .Identifier)
3885 return revertAndWarn(3901 return error.ParseError;
3886 rp,
3887 error.ParseError,
3888 source_loc,
3889 "unable to translate C expr",
3890 .{},
3891 );
38923902
3893 const deref = try transCreateNodePtrDeref(rp.c, node);3903 const deref = try transCreateNodePtrDeref(rp.c, node);
3894 node = try transCreateNodeFieldAccess(rp.c, deref, name_tok.bytes);3904 node = try transCreateNodeFieldAccess(rp.c, deref, name_tok.bytes);
...@@ -3929,6 +3939,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -3929,6 +3939,14 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
3929 };3939 };
3930 node = &bitshift_node.base;3940 node = &bitshift_node.base;
3931 },3941 },
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 },
3932 else => {3950 else => {
3933 _ = it.prev();3951 _ = it.prev();
3934 return node;3952 return node;
test/translate_c.zig+27-12
...@@ -1523,6 +1523,21 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1523,6 +1523,21 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1523 \\pub const ARROW = a.*.b;1523 \\pub const ARROW = a.*.b;
1524 });1524 });
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
1526 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////1541 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
15271542
1528 cases.addAllowWarnings("simple data types",1543 cases.addAllowWarnings("simple data types",
...@@ -1731,18 +1746,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1731,18 +1746,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1731 \\}1746 \\}
1732 });1747 });
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
1746 cases.addC("sizeof",1749 cases.addC("sizeof",
1747 \\#include <stddef.h>1750 \\#include <stddef.h>
1748 \\size_t size_of(void) {1751 \\size_t size_of(void) {
...@@ -2656,4 +2659,16 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2656,4 +2659,16 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2656 \\ return foo.*.field;2659 \\ return foo.*.field;
2657 \\}2660 \\}
2658 });2661 });
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 });
2659}2674}