| author | |
| committer | |
| log | 4ef062b9c819a2d7bfa9dd3394713ac9e8051660 |
| tree | cae97813bd1925ea7e18f96dc33fde913d161066 |
| parent | e21a83dd74822d9d8b272079a2e0e0b01aff60d4 |
7 files changed, 23 insertions(+), 31 deletions(-)
doc/langref.md+1-1| ... | ... | @@ -72,7 +72,7 @@ PointerType : token(Ampersand) option(token(Const)) Type |
| 72 | 72 | |
| 73 | 73 | MaybeType : token(Question) Type |
| 74 | 74 | |
| 75 | ArrayType : token(LBracket) Type token(Semicolon) Expression token(RBracket) | |
| 75 | ArrayType : token(LBracket) option(Expression) token(RBracket) Type | |
| 76 | 76 | |
| 77 | 77 | Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace) |
| 78 | 78 |
example/arrays/arrays.zig+1-1| ... | ... | @@ -3,7 +3,7 @@ export executable "arrays"; |
| 3 | 3 | use "std.zig"; |
| 4 | 4 | |
| 5 | 5 | pub fn main(argc: isize, argv: &&u8, env: &&u8) -> i32 { |
| 6 | var array : [u32; 5]; | |
| 6 | var array : [5]u32; | |
| 7 | 7 | |
| 8 | 8 | var i : u32 = 0; |
| 9 | 9 | while (i < 5) { |
example/rand/main.zig+9-11| ... | ... | @@ -27,14 +27,14 @@ struct Rand { |
| 27 | 27 | return y; |
| 28 | 28 | } |
| 29 | 29 | |
| 30 | /// Write `count` bytes of randomness into `buf`. | |
| 31 | pub fn get_bytes(r: &Rand, buf: &u8, count: usize) { | |
| 32 | var bytes_left = r.get_bytes_aligned(buf, count); | |
| 30 | /// Fill `buf` with randomness. | |
| 31 | pub fn get_bytes(r: &Rand, buf: []u8) { | |
| 32 | var bytes_left = r.get_bytes_aligned(buf); | |
| 33 | 33 | if (bytes_left > 0) { |
| 34 | 34 | var rand_val_array : [u8; #sizeof(u32)]; |
| 35 | 35 | *(rand_val_array.ptr as &u32) = r.get_u32(); |
| 36 | 36 | while (bytes_left > 0) { |
| 37 | buf[count - bytes_left] = rand_val_array[#sizeof(u32) - bytes_left]; | |
| 37 | buf[buf.len - bytes_left] = rand_val_array[#sizeof(u32) - bytes_left]; | |
| 38 | 38 | bytes_left -= 1; |
| 39 | 39 | } |
| 40 | 40 | } |
| ... | ... | @@ -49,7 +49,7 @@ struct Rand { |
| 49 | 49 | var rand_val_array : [u8; #sizeof(u64)]; |
| 50 | 50 | |
| 51 | 51 | while (true) { |
| 52 | r.get_bytes_aligned(rand_val_array.ptr, rand_val_array.len); | |
| 52 | r.get_bytes_aligned(rand_val_array); | |
| 53 | 53 | const rand_val = *(rand_val_array.ptr as &u64); |
| 54 | 54 | if (rand_val < upper_bound) { |
| 55 | 55 | return start + (rand_val % range); |
| ... | ... | @@ -75,14 +75,12 @@ struct Rand { |
| 75 | 75 | } |
| 76 | 76 | } |
| 77 | 77 | |
| 78 | // does not populate the remaining (count % 4) bytes | |
| 79 | fn get_bytes_aligned(r: &Rand, buf: &u8, count: usize) -> usize { | |
| 80 | var bytes_left = count; | |
| 81 | var buf_ptr = buf; | |
| 78 | // does not populate the remaining (buf.len % 4) bytes | |
| 79 | fn get_bytes_aligned(r: &Rand, buf: []u8) -> usize { | |
| 80 | var bytes_left = buf.len; | |
| 82 | 81 | while (bytes_left > 4) { |
| 83 | *(buf_ptr as &u32) = r.get_u32(); | |
| 82 | *(&buf[buf.len - bytes_left] as &u32) = r.get_u32(); | |
| 84 | 83 | bytes_left -= #sizeof(u32); |
| 85 | buf_ptr += #sizeof(u32); | |
| 86 | 84 | } |
| 87 | 85 | return bytes_left; |
| 88 | 86 | } |
src/parser.cpp+4-10| ... | ... | @@ -1062,7 +1062,7 @@ static AstNode *ast_parse_compiler_fn_call(ParseContext *pc, int *token_index, b |
| 1062 | 1062 | /* |
| 1063 | 1063 | Type : token(Symbol) | token(Unreachable) | token(Void) | PointerType | ArrayType | MaybeType | CompilerFnExpr |
| 1064 | 1064 | PointerType : token(Ampersand) option(token(Const)) Type |
| 1065 | ArrayType : token(LBracket) Type token(Semicolon) token(Number) token(RBracket) | |
| 1065 | ArrayType : token(LBracket) option(Expression) token(RBracket) Type | |
| 1066 | 1066 | */ |
| 1067 | 1067 | static AstNode *ast_parse_type(ParseContext *pc, int *token_index) { |
| 1068 | 1068 | Token *token = &pc->tokens->at(*token_index); |
| ... | ... | @@ -1103,17 +1103,11 @@ static AstNode *ast_parse_type(ParseContext *pc, int *token_index) { |
| 1103 | 1103 | } else if (token->id == TokenIdLBracket) { |
| 1104 | 1104 | node->data.type.type = AstNodeTypeTypeArray; |
| 1105 | 1105 | |
| 1106 | node->data.type.child_type = ast_parse_type(pc, token_index); | |
| 1107 | ||
| 1108 | Token *semicolon_token = &pc->tokens->at(*token_index); | |
| 1109 | *token_index += 1; | |
| 1110 | ast_expect_token(pc, semicolon_token, TokenIdSemicolon); | |
| 1106 | node->data.type.array_size = ast_parse_expression(pc, token_index, false); | |
| 1111 | 1107 | |
| 1112 | node->data.type.array_size = ast_parse_expression(pc, token_index, true); | |
| 1108 | ast_eat_token(pc, token_index, TokenIdRBracket); | |
| 1113 | 1109 | |
| 1114 | Token *rbracket_token = &pc->tokens->at(*token_index); | |
| 1115 | *token_index += 1; | |
| 1116 | ast_expect_token(pc, rbracket_token, TokenIdRBracket); | |
| 1110 | node->data.type.child_type = ast_parse_type(pc, token_index); | |
| 1117 | 1111 | } else { |
| 1118 | 1112 | ast_invalid_token_error(pc, token); |
| 1119 | 1113 | } |
src/parser.hpp+1-1| ... | ... | @@ -106,7 +106,7 @@ struct AstNodeType { |
| 106 | 106 | AstNodeTypeType type; |
| 107 | 107 | Buf primitive_name; |
| 108 | 108 | AstNode *child_type; |
| 109 | AstNode *array_size; | |
| 109 | AstNode *array_size; // can be null | |
| 110 | 110 | bool is_const; |
| 111 | 111 | AstNode *compiler_expr; |
| 112 | 112 | }; |
std/std.zig+5-5| ... | ... | @@ -53,7 +53,7 @@ pub fn fprint_str(fd: isize, str: string) -> isize { |
| 53 | 53 | // TODO error handling |
| 54 | 54 | pub fn print_u64(x: u64) -> isize { |
| 55 | 55 | // TODO use max_u64_base10_digits instead of hardcoding 20 |
| 56 | var buf: [u8; 20]; | |
| 56 | var buf: [20]u8; | |
| 57 | 57 | const len = buf_print_u64(buf.ptr, x); |
| 58 | 58 | return write(stdout_fileno, buf.ptr, len); |
| 59 | 59 | } |
| ... | ... | @@ -62,7 +62,7 @@ pub fn print_u64(x: u64) -> isize { |
| 62 | 62 | // TODO error handling |
| 63 | 63 | pub fn print_i64(x: i64) -> isize { |
| 64 | 64 | // TODO use max_u64_base10_digits instead of hardcoding 20 |
| 65 | var buf: [u8; 20]; | |
| 65 | var buf: [20]u8; | |
| 66 | 66 | const len = buf_print_i64(buf.ptr, x); |
| 67 | 67 | return write(stdout_fileno, buf.ptr, len); |
| 68 | 68 | } |
| ... | ... | @@ -83,9 +83,9 @@ fn buf_print_i64(out_buf: &u8, x: i64) -> usize { |
| 83 | 83 | } |
| 84 | 84 | |
| 85 | 85 | fn buf_print_u64(out_buf: &u8, x: u64) -> usize { |
| 86 | var buf: [u8; max_u64_base10_digits]; | |
| 86 | var buf: [max_u64_base10_digits]u8; | |
| 87 | 87 | var a = x; |
| 88 | var index = max_u64_base10_digits; | |
| 88 | var index = buf.len; | |
| 89 | 89 | |
| 90 | 90 | while (true) { |
| 91 | 91 | const digit = a % 10; |
| ... | ... | @@ -96,7 +96,7 @@ fn buf_print_u64(out_buf: &u8, x: u64) -> usize { |
| 96 | 96 | break; |
| 97 | 97 | } |
| 98 | 98 | |
| 99 | const len = max_u64_base10_digits - index; | |
| 99 | const len = buf.len - index; | |
| 100 | 100 | |
| 101 | 101 | // TODO memcpy intrinsic |
| 102 | 102 | var i: usize = 0; |
test/run_tests.cpp+2-2| ... | ... | @@ -349,7 +349,7 @@ done: |
| 349 | 349 | use "std.zig"; |
| 350 | 350 | |
| 351 | 351 | pub fn main(argc: isize, argv: &&u8, env: &&u8) -> i32 { |
| 352 | var array : [u32; 5]; | |
| 352 | var array : [5]u32; | |
| 353 | 353 | |
| 354 | 354 | var i : u32 = 0; |
| 355 | 355 | while (i < 5) { |
| ... | ... | @@ -784,7 +784,7 @@ use "std.zig"; |
| 784 | 784 | const ARRAY_SIZE : u8 = 20; |
| 785 | 785 | |
| 786 | 786 | pub fn main(argc: isize, argv: &&u8, env: &&u8) -> i32 { |
| 787 | var array : [u8; ARRAY_SIZE]; | |
| 787 | var array : [ARRAY_SIZE]u8; | |
| 788 | 788 | print_u64(#sizeof(#typeof(array))); |
| 789 | 789 | print_str("\n"); |
| 790 | 790 | return 0; |