From ca106878665053b3a342a4b50f35b83b06252fb8 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 12 Apr 2021 11:00:38 -0500 Subject: [PATCH] updating some examples and bugfixes --- bin/onyx | Bin 344440 -> 344440 bytes core/alloc/pool.onyx | 6 +- core/builtin.onyx | 6 +- docs/bugs | 11 ++++ docs/compile_time_vars | 2 +- docs/plan | 2 +- examples/12_varargs.onyx | 73 ++++++++++++++++++++++ examples/13_use_keyword.onyx | 93 +++++++++++++++++++++++++++++ progs/odin_example.onyx | 2 +- src/onyx.c | 32 ++++------ src/onyxutils.c | 11 +++- tests/array_struct_robustness | 9 +++ tests/array_struct_robustness.onyx | 26 ++++++++ 13 files changed, 243 insertions(+), 30 deletions(-) diff --git a/bin/onyx b/bin/onyx index 5e9795c52834ec7a4bba1215c8614db40fc2a096..ad5f0d5c5860ba6254d510f9107f5e57239ebebc 100755 GIT binary patch delta 42402 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 PoolAllocator(Elem) // when that feature is implemented. +// +// I think I'm going to veto that idea because when the buffer is a slice of Elem +// its guaranteed that the size allocated for the buffer is a multiple of the size +// of Elem. make :: (buffer: [] $Elem) -> PoolAllocator(Elem) { assert(sizeof Elem >= sizeof rawptr, "Cannot have a pool allocator of a type less than a rawptr in size."); @@ -74,4 +78,4 @@ make_allocator :: (pool: ^PoolAllocator($Elem)) -> Allocator { func = #solidify pool_allocator_proc { Elem = Elem }, data = pool, }; -} \ No newline at end of file +} diff --git a/core/builtin.onyx b/core/builtin.onyx index 7a7fd34c..aa742eb8 100644 --- a/core/builtin.onyx +++ b/core/builtin.onyx @@ -30,12 +30,12 @@ vararg_get :: proc { return true; }, - (va: vararg, $T: type_expr, default: T = 0) -> T { - if va.count <= 0 do return default; + (va: vararg, $T: type_expr, default: T = 0) -> (bool, T) { + if va.count <= 0 do return false, default; ret := *cast(^T) va.data; va.data = cast(rawptr) (cast(^u8) va.data + sizeof T); va.count -= 1; - return ret; + return true, ret; } } diff --git a/docs/bugs b/docs/bugs index 56a44438..a174a863 100644 --- a/docs/bugs +++ b/docs/bugs @@ -37,6 +37,8 @@ List of known bugs: } [ ] There is a segfault when passing an anonymous struct literal to an untyped vararg. + Should just need to detect this case and provide an error message since this doesn't + make any sense semantically. vararg_proc :: (va: ...) { ... @@ -53,6 +55,15 @@ List of known bugs: The problem is that 'T' is an unresolved symbol because the context of the function type does not have the solved value of T in it. +[ ] Top level implicit typed arrays/struct literals are not correctly being marked as compile-time. + + Vec2 :: struct { x, y: i32; } + + Hex_Directions := Vec2.[ + .{ 1, 0 }, .{ 1, -1 }, .{ 0, -1 }, + .{ -1, 0 }, .{ -1, 1 }, .{ 0, 1 }, + ]; + List of things to change: [X] Currently, there is no way to use the initialized members of a structure without using a struct literal. diff --git a/docs/compile_time_vars b/docs/compile_time_vars index b784f619..42ecb1bb 100644 --- a/docs/compile_time_vars +++ b/docs/compile_time_vars @@ -6,7 +6,7 @@ that give information about the current compilation. These would include things The standard library will be rewritten to use these variables to conditionally include file that are only supported on a particular system. -For the moment, I think that the choice of backend will be given by compiler flags. It will +For the moment, I think that the choice of runtime will be given by compiler flags. It will set the variables described below to their value. There should be an #error directive that when hit just produces a compile time error and prevents diff --git a/docs/plan b/docs/plan index 1cd88288..081487fd 100644 --- a/docs/plan +++ b/docs/plan @@ -69,7 +69,7 @@ HOW: - This means identifiers can be compared using ptr comparison, instead of string comparison - This mean no more token_toggle_end!! Woo!! - [ ] 'when' statements + [X] 'when' statements - Compile time conditions - Only evalutate code blocks that evaluate to be true diff --git a/examples/12_varargs.onyx b/examples/12_varargs.onyx index ddf56f41..268d1013 100644 --- a/examples/12_varargs.onyx +++ b/examples/12_varargs.onyx @@ -1,6 +1,79 @@ +// Variadic procedures are a very useful feature in a lot of programming languages +// today so you have probably come across them at some point. If you haven't, +// "variadic" just means that the number of arguments the procedure takes varies. +// This is a slightly different concept from overloaded procedures, where there are +// multiple versions of a procedure and which one is chosen depends on the arguments +// given. Variadic procedures can consume as many arguments as they want. + +// In Onyx, there are two kinds of variadic procedures: fixed type, and untyped. In +// fixed type variadic procedures, all variadic procedures need to be of a specified type. +// In untyped variadic procedures, each of the variadic arguments can be of any type, +// similar to how they work in C. + +// Some little things to note about the current implementation of variadic arguments: +// - There can be at most 1 variadic argument +// - 'variadic argument' is shortened to 'vararg' in many situtations + + #load "core/std" use package core main :: (args: [] cstr) { + + // This is how you specify a fixed type variadic procedure. 'args' can be thought + // of as a slice of integers, with data and count fields. You can iterate over the + // varargs using a for-loop like any other array-like structure. Note, do not + // take a pointer to anything in the varargs because they are placed on the stack + // and will "disappear" when the procedure returns. + typed_varargs :: (args: ..i32) { + print("Typed variadic arguments: "); + for x: args { + printf("%i ", x); + } + print("\n"); + } + + typed_varargs(1, 2, 3, 4); + + // This is how you specify an untyped variadic procedure. Notice the extra '.' + // in the type. The access the arguments, you need to use the builtin procedure, + // 'vararg_get'. This procedure has two overloads that you can use: + // + // vararg_get :: (va: vararg, res: ^$T) -> bool + // vararg_get :: (va: vararg, $T: type_expr, default: T) -> (bool, T) + // + // The 'bool' returned is whether or not retrieving the vararg was successful. This + // can be achieved because in Onyx, untyped varargs know how many varargs are passed + // through a runtime count. This means if you call vararg_get more times than there + // are varargs, you will get empty or default results back. + untyped_varargs :: (args: ...) { + print("Untyped variadic arguments: "); + + x: i32; + while vararg_get(args, ^x) { + printf("%p ", x); + } + + print("\n"); + } + + untyped_varargs(1.0f, 2.0f, 3.0f, 4.0f); + + + + + // Most of the time with untyped varargs, you will have some kind of format + // specifier to indicate how many and of what type the varargs are. For example + // 'printf' uses this: + // + // printf :: (format: str, va: ...) -> void + // printf("%i %f %l %d", int, float, long, double); + // + // There are plans for the future to have better runtime type information available, + // which would allow you to introspect the types of each vararg at runtime. This + // would mean that instead of using '%i' style specifiers in printf, you could use + // '{}' to indicate the next variadic argument, whose type is automatically determined. + // If I'm not explaining this very well I apologize and hope that when the feature + // is implemented, it will make sense why it is a good idea. } diff --git a/examples/13_use_keyword.onyx b/examples/13_use_keyword.onyx index ddf56f41..760a81a2 100644 --- a/examples/13_use_keyword.onyx +++ b/examples/13_use_keyword.onyx @@ -1,6 +1,99 @@ +// Controlling the symbols in scope is important to maintaining well structured +// and factored code. In Onyx, the most powerful feature available to do this is +// the 'use' keyword. It allows you to bring in symbols from another namespace into +// the currently scope. In Onyx, a "namespace" simply referers to something contains +// names, generally something you can use the "." operator on. Some of the examples +// include: +// - structs with static (::) members +// - struct members +// - variables with a struct or pointer to a struct type +// - packages +// - enums + +// Please note, 'use' is a rather "alpha-tier" feature at the moment, meaning it works in +// most cases, but can easily break and require you to write the code without it. This +// is being address and hopefully in the next couple months it will be much more robust. + #load "core/std" use package core main :: (args: [] cstr) { + // Here are the uses of 'use' currently. + + { + // You can 'use' a package. You hopefully already knew this. + // This brings in all the symbols from the core.alloc package into + // this scope. + use package core.alloc + + // You can also restrict and partially rename the symbols that collide + use package core.string { free as string_free } + } + + { + // You can also 'use' a package that is a subpackage of another package. Here, 'string' + // is a subpackage of 'core' and the above 'use package core' makes this package + // available for you to write code like 'string.equal(...)'. However, because it is + // a namespace, you can 'use' it. + use string + + s := " Some string ..."; + t := strip_leading_whitespace(s); // This would have to be 'string.strip_leading_whitespace' otherwise. + println(t); + } + + { + // You can 'use' parameters to a function. This effectively makes this + // procedure behave like a 'method' for Dummy. You can access all members + // of dummy with having to say 'dummy.' everywhere. Note, this is one of the + // most alpha-tier parts of 'use', so if you are running into error, report + // an issue and (sadly) go back to writing without the 'use'. + // + // One side note, you can 'use' more than one parameter, and it doesn't have to + // be the first parameter. This can create decent self-documenting code because + // a procedure with two used parameters implies that it is a 'cross-cutting' + // procedure between two areas of concern. + + basically_a_method :: (use dummy: ^Dummy) { + printf("Dummy with name '%s', and age '%i'.\n", name, age); + } + + dummy := Dummy.{ "Phil", 15 }; + basically_a_method(^dummy); + + Dummy :: struct { + name : str; + age : i32; + } + } + + { + // You can 'use' an enum. This is great if you have a burried enum in some other namespace + // and want to do a switch over that enum. + + Player :: struct { + Color :: enum { + Undefined; + Red; Green; Blue; + } + + color := Color.Red; + } + + value := Player.{}; + + use Player.Color; + switch value.color { + case Red do println("The color is red!"); + case Green do println("The color is green!"); + case Blue do println("The color is blue!"); + case #default do println("The color is unknown..."); + } + } + + { + // You can 'use' struct members that are structures. + // This is already explained in the struct example. + } } diff --git a/progs/odin_example.onyx b/progs/odin_example.onyx index 566a3d20..9a307413 100644 --- a/progs/odin_example.onyx +++ b/progs/odin_example.onyx @@ -69,7 +69,7 @@ f :: () -> [5] [2] u32 #export "IAMTHEFUNCTION" { return mem; } -compress :: (arr: [$N] $T, f : proc (T, T) -> T) -> T { +compress :: (arr: [$N] $T, f: (T, T) -> T) -> T { val := arr[0]; for i: 1..N do val = f(val, arr[i]); return val; diff --git a/src/onyx.c b/src/onyx.c index 5030c3f1..f9db59a2 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -370,33 +370,23 @@ static void output_dummy_progress_bar() { if (bh_arr_length(eh->entities) == 0) return; static const char* state_colors[] = { - "\e[91m", - "\e[93m", - "\e[97m", - "\e[93m", - "\e[94m", - "\e[95m", - "\e[94m", - "\e[95m", - "\e[96m", - "\e[92m", + "\e[91m", "\e[93m", "\e[97m", "\e[93m", "\e[94m", + "\e[95m", "\e[94m", "\e[95m", "\e[96m", "\e[92m", }; printf("\e[2;1H"); for (i32 i = 0; i < Entity_State_Count - 1; i++) { - if (i % 4 == 0) printf("\n"); - printf("%s \xe2\x96\x88 %s", state_colors[i], entity_state_strings[i]); + if (i % 2 == 0) printf("\n"); + printf("%s %25s \xe2\x96\x88 ", state_colors[i], entity_state_strings[i]); } printf("\n\n"); for (i32 i = 0; i < Entity_Type_Count; i++) { - if (eh->type_count[i] == 0) { - printf("\e[90m"); - } else { - printf("\e[97m"); - } + if (eh->type_count[i] == 0) printf("\e[90m"); + else if ((i32) eh->entities[0]->type == i) printf("\e[92m"); + else printf("\e[97m"); printf("%25s (%4d) | ", entity_type_strings[i], eh->type_count[i]); @@ -407,9 +397,7 @@ static void output_dummy_progress_bar() { printf(state_colors[j]); i32 count = (eh->all_count[j][i] >> 5) + 1; - for (i32 c = 0; c < count * 2; c++) { - printf("\xe2\x96\x88"); - } + for (i32 c = 0; c < count * 2; c++) printf("\xe2\x96\x88"); printf("\e[0m"); } @@ -426,7 +414,6 @@ static i32 onyx_compile() { while (!bh_arr_is_empty(context.entities.entities)) { Entity* ent = entity_heap_top(&context.entities); - entity_heap_remove_top(&context.entities); #if defined(_BH_LINUX) if (context.options->fun_output) { @@ -441,7 +428,8 @@ static i32 onyx_compile() { usleep(1000); } #endif - + + entity_heap_remove_top(&context.entities); b32 changed = process_entity(ent); // NOTE: VERY VERY dumb cycle breaking. Basically, remember the first entity that did diff --git a/src/onyxutils.c b/src/onyxutils.c index b7d219fd..67af166c 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -862,7 +862,7 @@ AstNode* polymorphic_proc_try_solidify(AstPolyProc* pp, bh_arr(AstPolySolution) AstPolyProc* new_pp = onyx_ast_node_new(context.ast_alloc, sizeof(AstPolyProc), Ast_Kind_Polymorphic_Proc); new_pp->token = pp->token; // TODO: Change this to be the solidify->token new_pp->base_func = pp->base_func; - new_pp->poly_scope = new_pp->poly_scope; + new_pp->poly_scope = new_pp->poly_scope; // CLEANUP: This doesn't seem correct?? new_pp->flags = pp->flags; new_pp->poly_params = pp->poly_params; @@ -1033,6 +1033,15 @@ void report_unable_to_match_overload(AstCall* call) { // // Polymorphic Structures // +// +// Currently, I am not very happy about how polymorphic structure generation works. My biggest problem +// with it is that it is very different from the polymorhic procedure generation. Also, it needs to +// completely generate and check the structure right away, which means there is a lot of up-front work +// done here that could probably be done elsewhere. This really relates to a large problem in the compiler +// that types need to be known completely by the time symbol resolution is done, even though that +// information shouldn't need to be known until right before the types are checked. +// + char* build_poly_struct_name(AstPolyStructType* ps_type, Type* cs_type) { char name_buf[256]; fori (i, 0, 256) name_buf[i] = 0; diff --git a/tests/array_struct_robustness b/tests/array_struct_robustness index 038649df..434a6604 100644 --- a/tests/array_struct_robustness +++ b/tests/array_struct_robustness @@ -13,3 +13,12 @@ Vec2(25, 125) Vec2(100, 1000) Array of u32. 63001 +2D-array from an allocation to a function. +Vec2(1000, 2000) +Vec2(1001, 2001) +Vec2(1002, 2004) +Vec2(1003, 2009) +Vec2(1004, 2016) +Vec2(1005, 2025) +Vec2(1006, 2036) +Vec2(1007, 2049) diff --git a/tests/array_struct_robustness.onyx b/tests/array_struct_robustness.onyx index 806b8656..dc169bc8 100644 --- a/tests/array_struct_robustness.onyx +++ b/tests/array_struct_robustness.onyx @@ -95,4 +95,30 @@ main :: (args: [] cstr) { println(nums[50]); } + + { + println("2D-array from an allocation to a function."); + + vecs_data: [2][4] Vec2; + vecs := ^vecs_data; // equivalent of heap allocating it + + set_vecs :: (vecs: ^[2][4] Vec2) { + i := 0; + for ^row: *vecs { + for ^v: *row { + *v = .{ 1000 + i, 2000 + i * i }; + i += 1; + } + } + } + + set_vecs(vecs); + + print_vecs :: (vecs: ^[4] Vec2) { + for ^v: *vecs do println(*v); + } + + print_vecs(^(*vecs)[0]); + print_vecs(^(*vecs)[1]); + } } -- 2.25.1