From 0d6aee301ca1fb933dd652d37710c3761a330235 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 24 Aug 2020 16:28:16 -0500 Subject: [PATCH] performance improvements --- core/string.onyx | 11 +++-------- core/wasi.onyx | 2 +- misc/onyx.vim | 7 +++++-- onyx | Bin 174496 -> 174496 bytes progs/wasi_test.onyx | 30 ++++++++++++++++-------------- src/onyxlex.c | 20 +++++++++++++++++--- src/onyxwasm.c | 6 ++++-- 7 files changed, 46 insertions(+), 30 deletions(-) diff --git a/core/string.onyx b/core/string.onyx index ebfbfaaa..1743e19f 100644 --- a/core/string.onyx +++ b/core/string.onyx @@ -51,12 +51,7 @@ string_concat :: proc (a: Allocator, s1: string, s2: string) -> string { string_free :: proc (a: Allocator, s: string) do free(a, s.data); -StringSplitResult :: struct { - tokens: ^string; - count: u32; -} - -string_split :: proc (a: Allocator, str: string, delim: u8) -> StringSplitResult { +string_split :: proc (a: Allocator, str: string, delim: u8) -> []string { delim_count := 0; for i: 0, str.count do if str.data[i] == delim do delim_count += 1; @@ -75,7 +70,7 @@ string_split :: proc (a: Allocator, str: string, delim: u8) -> StringSplitResult strarr[curr_str] = str.data[begin : str.count]; - return StringSplitResult.{ strarr, delim_count + 1 }; + return strarr[0 : delim_count + 1]; } string_substr :: proc (str: string, sub: string) -> string { @@ -193,7 +188,7 @@ string_builder_add_u64 :: proc (use sb: ^StringBuilder, n: u64) -> ^StringBuilde string_builder_add_u64_with_base :: proc (use sb: ^StringBuilder, n: u64, base: u64) -> ^StringBuilder { buf : [256] u8; - s := u64_to_string(n, 10l, Buffer.{ cast(^u8) buf, 256 }); + s := u64_to_string(n, base, Buffer.{ cast(^u8) buf, 256 }); return string_builder_add_string(sb, s); } diff --git a/core/wasi.onyx b/core/wasi.onyx index c146415e..027dbf6e 100644 --- a/core/wasi.onyx +++ b/core/wasi.onyx @@ -475,5 +475,5 @@ proc #export "_start" { args_get(argv, argv_buf); - main.main(argc, argv); + main.main(argv[0 : argc]); } diff --git a/misc/onyx.vim b/misc/onyx.vim index 73eb5d1b..13337566 100644 --- a/misc/onyx.vim +++ b/misc/onyx.vim @@ -29,9 +29,11 @@ syn keyword onyxConstant true false null syn keyword onyxCommentStart contained TODO NOTE BUG HACK -syn region onyxComment start="//" end="$" keepend contains=onyxCommentStart +syn region onyxComment start="//" end="$" keepend contains=onyxCommentStart -syn region onyxDirective start="#" end=" " keepend +syn region onyxDirective start="#" end=" " keepend + +syn region onyxString display start=+"+ skip=+\\\\\|\\"+ end=+"+ keepend hi def link onyxKeyword Statement hi def link onyxType Type @@ -39,6 +41,7 @@ hi def link onyxComment Comment hi def link onyxCommentStart Todo hi def link onyxConstant Constant hi def link onyxDirective Constant +hi def link onyxString String let b:current_syntax = "onyx" let &cpo = s:cpo_save diff --git a/onyx b/onyx index 429da3352666060f26715b90e66b31f200fb030f..8d63f147f2f29d97dd444b68c41d3e4bca0119c0 100755 GIT binary patch delta 36531 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 DcCjc+ delta 35931 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 diff --git a/progs/wasi_test.onyx b/progs/wasi_test.onyx index 6743d1b4..ec764c00 100644 --- a/progs/wasi_test.onyx +++ b/progs/wasi_test.onyx @@ -202,7 +202,12 @@ print_arr :: proc (sb: ^StringBuilder, arr: []i32) { sb |> sba("\n") |> string_builder_to_string() |> print(); } -main :: proc (argc: u32, argv: ^cstring) { +make_i32_arr :: proc (a: Allocator, len: u32) -> [] i32 { + arr := cast(^i32) alloc(a, sizeof i32 * len); + return arr[0 : len]; +} + +main :: proc (args: []cstring) { sb := string_builder_make(heap_allocator, 256); timer := timer_start(); @@ -216,16 +221,16 @@ main :: proc (argc: u32, argv: ^cstring) { } ^sb |> sba("There are ") - |> sba(cast(u64) argc) + |> sba(cast(u64) args.count) |> sba(" arguments.\n"); - for i: 0, argc do ^sb |> sba(argv[i]) |> sba(" "); + for i: 0, args.count do ^sb |> sba(args.data[i]) |> sba(" "); ^sb |> sba("\n") |> string_builder_to_string() |> print(); fd: FileDescriptor = -1; - if err := path_open(3, LookupFlags.SymLinkFollow, string_make(argv[1]), cast(OFlags) 0, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, FDFlags.Sync, ^fd); err != Errno.Success { + if err := path_open(3, LookupFlags.SymLinkFollow, string_make(args.data[1]), cast(OFlags) 0, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, FDFlags.Sync, ^fd); err != Errno.Success { print("Failed to open file\n"); print("Error code: "); print_u64_with_base(cast(u64) err, 16l); @@ -251,13 +256,12 @@ main :: proc (argc: u32, argv: ^cstring) { print_u64_with_base(sum, 10l); print("\n"); - matches := string_split(heap_allocator, "This is a test string to test splitting. It surprisingly works very well.", #char " "); - defer free(heap_allocator, matches.tokens); + defer free(heap_allocator, matches.data); string_builder_clear(^sb); for i: 0, matches.count { - ^sb |> sba(matches.tokens[i]) + ^sb |> sba(matches.data[i]) |> sba("\n"); } @@ -265,11 +269,11 @@ main :: proc (argc: u32, argv: ^cstring) { program := "+ + * s - /"; tokens := string_split(heap_allocator, program, #char " "); - defer free(heap_allocator, tokens.tokens); + defer free(heap_allocator, tokens.data); acc := 0; for i: 0, tokens.count { - tok :: tokens.tokens[i].data[0]; + tok :: tokens.data[i].data[0]; if tok == #char "+" do acc += 1; elseif tok == #char "-" do acc -= 1; @@ -308,7 +312,7 @@ main :: proc (argc: u32, argv: ^cstring) { ^sb |> string_builder_clear(); while i := 0; i < 10 { ^sb |> sba("Loop: ") |> sba(cast(u64) i) |> sba("\n"); - + i += 1; } else { print("Never ran the loop\n"); @@ -320,11 +324,9 @@ main :: proc (argc: u32, argv: ^cstring) { arr : [128] i32; for i: 0, 128 do arr[i] = i * i; - slice := arr[14 : 20]; - - print_arr(^sb, slice); + print_arr(^sb, arr[5 : 10]); - ss := string_substr("Hello, WoWorld!", "World"); + ss := string_substr("Hello, World!", "World"); if ss.count > 0 { print(ss); } diff --git a/src/onyxlex.c b/src/onyxlex.c index 5439dda5..e826ce6b 100644 --- a/src/onyxlex.c +++ b/src/onyxlex.c @@ -122,8 +122,22 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) { OnyxToken tk; // Skip whitespace - while (char_is_whitespace(*tokenizer->curr) && tokenizer->curr != tokenizer->end) - INCREMENT_CURR_TOKEN(tokenizer) + while (1) { + if (tokenizer->curr == tokenizer->end) break; + + switch (*tokenizer->curr) { + case ' ': + case '\n': + case '\t': + case '\r': + INCREMENT_CURR_TOKEN(tokenizer); + break; + default: + goto whitespace_skipped; + } + } + +whitespace_skipped: tk.type = Token_Type_Unknown; tk.text = tokenizer->curr; @@ -367,7 +381,7 @@ OnyxTokenizer onyx_tokenizer_create(bh_allocator allocator, bh_file_contents *fc .tokens = NULL, }; - bh_arr_new(allocator, tknizer.tokens, 512); + bh_arr_new(allocator, tknizer.tokens, 1 << 16); return tknizer; } diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 57978683..89025298 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -1516,8 +1516,10 @@ COMPILE_FUNC(expression, AstTyped* expr) { compile_expression(mod, &code, sl->lo); WIL(WI_LOCAL_TEE, tmp_local); - WID(WI_I32_CONST, sl->elem_size); - WI(WI_I32_MUL); + if (sl->elem_size != 1) { + WID(WI_I32_CONST, sl->elem_size); + WI(WI_I32_MUL); + } compile_location(mod, &code, sl->addr); WI(WI_I32_ADD); compile_expression(mod, &code, sl->hi); -- 2.25.1