From e6bf6b680e760c638612d5c0be4a2270aaad8c89 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 21 Apr 2023 07:55:34 +0200 Subject: [PATCH] Core: Conditional compound to fix Msvc, better assert but printf based, Fix tests --- build/examples/dynamic_typing.core | 26 ++++++++++---------- build/examples/polymorphism.core | 10 +++++--- build/examples/push_struct.core | 2 +- build/examples/raymarcher.core | 6 ++--- build/examples/runtime_type_information.core | 12 +++------ build/modules/Base.core | 10 ++++---- build/modules/MathVec2.core | 22 ++++++++--------- build/modules/Multimedia.core | 6 ++--- build/modules/win32_multimedia.core | 6 ++--- core_codegen_c_language.cpp | 20 ++++++++++++--- core_compiler.cpp | 3 ++- core_main.cpp | 5 ++-- core_typechecking.cpp | 2 +- 13 files changed, 71 insertions(+), 59 deletions(-) diff --git a/build/examples/dynamic_typing.core b/build/examples/dynamic_typing.core index c3042ec..7c9c204 100644 --- a/build/examples/dynamic_typing.core +++ b/build/examples/dynamic_typing.core @@ -17,31 +17,31 @@ and make a pointer out of it. Have to be mindful of the lifetime. */ -storage: [32]S64 -len : S64 +storage: [32]int +len : int "+" :: (a: Any, b: Any): Any result: Any = storage[len++] - if a.type == S64 && b.type == S64 - *(result.data->*S64) = *(a.data->*S64) + *(b.data->*S64) + if a.type == int && b.type == int + *(result.data->*int) = *(a.data->*int) + *(b.data->*int) return result -"+" :: (a: Any, b: S64): Any +"+" :: (a: Any, b: int): Any result: Any = storage[len++] - if a.type == S64 - *(result.data->*S64) = *(a.data->*S64) + b + if a.type == int + *(result.data->*int) = *(a.data->*int) + b return result -"==" :: (a: Any, b: S64): bool +"==" :: (a: Any, b: int): bool result := false - if a.type == S64 - result = *(a.data->*S64) == b + if a.type == int + result = *(a.data->*int) == b return result "==" :: (a: Any, b: Any): bool result := false - if a.type == S64 && b.type == S64 - result = *(a.data->*S64) == *(b.data->*S64) + if a.type == int && b.type == int + result = *(a.data->*int) == *(b.data->*int) return result main :: (): int @@ -49,7 +49,7 @@ main :: (): int b: Any = 20 c := a + b - Assert(c.type == S64 && c == 30) + Assert(c.type == int && c == 30) Assert(a+b+a==c+(5+5)) return 0 \ No newline at end of file diff --git a/build/examples/polymorphism.core b/build/examples/polymorphism.core index 3ddd38e..b1538b8 100644 --- a/build/examples/polymorphism.core +++ b/build/examples/polymorphism.core @@ -16,6 +16,12 @@ Tuple :: struct($A: Type, $B: Type) a: A b: B +Triple :: struct($A: Type, $B: Type, $C: Type) + a: A + b: B + c: C + + Variant :: union($A: Type, $B: Type, $C: Type) a: A b: B @@ -49,9 +55,6 @@ GetCount :: (a: int): int // @todo: this is allowed, shouldn't be // Test :: (a: int, b: int = 10, c: int???) -Test :: (a: C.Triple(int, int, int)) - pass - // @todo: // Add :: (arr: *Array($T), item: T) // return @@ -74,7 +77,6 @@ main :: (argc: int, argv: **char): int sixth: Array(Array(F32)) seventh: Variant(int, F32, S64) - Test({1,2,3}) test_a := int test := *int Assert(test_a != test) diff --git a/build/examples/push_struct.core b/build/examples/push_struct.core index c2c8b71..78effa3 100644 --- a/build/examples/push_struct.core +++ b/build/examples/push_struct.core @@ -10,6 +10,6 @@ main :: (argc: int, argv: **char): int a: *int = PushStruct(&arena, int, int) b: *F32 = PushStruct(&arena, int, F32) padding := sizeof(int) - Assert(arena.len->S64 == (sizeof(int) + sizeof(F32) + padding)) + Assert(arena.len->int == (sizeof(int) + sizeof(F32) + padding)) return 0 \ No newline at end of file diff --git a/build/examples/raymarcher.core b/build/examples/raymarcher.core index 85c90c6..9ab5c09 100644 --- a/build/examples/raymarcher.core +++ b/build/examples/raymarcher.core @@ -4,8 +4,8 @@ V2 :: #import "MathVec2.core"; Vec2 :: V2.Vec2 Epsilon :: 0.00001 Screen : *U32 -X : S64 -Y : S64 +X : int +Y : int TotalTime: F64 LightPos := Vec3{2,4,2} @@ -143,7 +143,7 @@ WinMain :: (hInstance: HINSTANCE, hPrevInstance: HINSTANCE, lpCmdLine: LPSTR, nS requested_time_per_frame: F64 = 1.0 / 60.0 frame_start_time := Time() - frame_number: S64 + frame_number: int for AppIsRunning msg: MSG for PeekMessageW(&msg, window, 0, 0, PM_REMOVE) > 0 diff --git a/build/examples/runtime_type_information.core b/build/examples/runtime_type_information.core index fb3aa2e..23f4d97 100644 --- a/build/examples/runtime_type_information.core +++ b/build/examples/runtime_type_information.core @@ -34,15 +34,11 @@ main :: (): int value_to_be_wrapped := 10 any_value: Any = value_to_be_wrapped - if any_value.type == S64 - *(any_value.data->*S64) = 20 - elif any_value.type == int - // Void pointers get implicitly cast - value: *int = any_value.data - *value = 30 - elif any_value.type == char;; Assert(false, "No bueno") + if any_value.type == int + *(any_value.data->*int) = 20 + else ;; Assert(false, "No bueno") - Assert(*(any_value.data->*S64) == 20) + Assert(*(any_value.data->*int) == 20) letter := GetFirstLetterOfType(value_to_be_wrapped) Assert(letter == 'I') diff --git a/build/modules/Base.core b/build/modules/Base.core index c4d5c6c..60e8f53 100644 --- a/build/modules/Base.core +++ b/build/modules/Base.core @@ -27,12 +27,12 @@ ZeroMemory :: (p: *void, size: SizeU) // Unicode // QuestionMark16 :: 0x003f -String32 :: struct;; str: *U32; len: S64 -String16 :: struct;; str: *U16; len: S64 +String32 :: struct;; str: *U32; len: int +String16 :: struct;; str: *U16; len: int -Utf8ToUtf32 :: (c: *U8, max_advance: S64): U32, S64 +Utf8ToUtf32 :: (c: *U8, max_advance: int): U32, int out_str: U32 - advance: S64 + advance: int if (c[0] & 0b10000000) == 0 if max_advance >= 1 c0 := c[0]->U32 @@ -62,7 +62,7 @@ Utf8ToUtf32 :: (c: *U8, max_advance: S64): U32, S64 return out_str, advance -Utf32ToUtf16 :: (codepoint: U32): [2]U16, S64 +Utf32ToUtf16 :: (codepoint: U32): [2]U16, int str: [2]U16 len := 0 if codepoint < 0x10000 diff --git a/build/modules/MathVec2.core b/build/modules/MathVec2.core index 730cefa..9c5ae59 100644 --- a/build/modules/MathVec2.core +++ b/build/modules/MathVec2.core @@ -1,5 +1,5 @@ -Vec2I :: struct;; x: S64; y: S64 +Vec2I :: struct;; x: int; y: int Vec2 :: struct;; x: F32; y: F32 "*" :: (a: Vec2, b: Vec2): Vec2 ;; return {a.x*b.x, a.y*b.y} @@ -16,17 +16,17 @@ Vec2 :: struct;; x: F32; y: F32 "/" :: (a: F32, b: Vec2) : Vec2 ;; return {a/b.x, a/b.y} "*" :: (a: Vec2I, b: Vec2I): Vec2I ;; return {a.x*b.x, a.y*b.y} -"*" :: (a: Vec2I, b: S64) : Vec2I ;; return {a.x*b, a.y*b} -"*" :: (a: S64, b: Vec2I) : Vec2I ;; return {a*b.x, a*b.y} +"*" :: (a: Vec2I, b: int) : Vec2I ;; return {a.x*b, a.y*b} +"*" :: (a: int, b: Vec2I) : Vec2I ;; return {a*b.x, a*b.y} "-" :: (a: Vec2I, b: Vec2I): Vec2I ;; return {a.x-b.x, a.y-b.y} -"-" :: (a: Vec2I, b: S64) : Vec2I ;; return {a.x-b, a.y-b} -"-" :: (a: S64, b: Vec2I) : Vec2I ;; return {a-b.x, a-b.y} +"-" :: (a: Vec2I, b: int) : Vec2I ;; return {a.x-b, a.y-b} +"-" :: (a: int, b: Vec2I) : Vec2I ;; return {a-b.x, a-b.y} "+" :: (a: Vec2I, b: Vec2I): Vec2I ;; return {a.x+b.x, a.y+b.y} -"+" :: (a: Vec2I, b: S64) : Vec2I ;; return {a.x+b, a.y+b} -"+" :: (a: S64, b: Vec2I) : Vec2I ;; return {a+b.x, a+b.y} +"+" :: (a: Vec2I, b: int) : Vec2I ;; return {a.x+b, a.y+b} +"+" :: (a: int, b: Vec2I) : Vec2I ;; return {a+b.x, a+b.y} "/" :: (a: Vec2I, b: Vec2I): Vec2I ;; return {a.x/b.x, a.y/b.y} -"/" :: (a: Vec2I, b: S64) : Vec2I ;; return {a.x/b, a.y/b} -"/" :: (a: S64, b: Vec2I) : Vec2I ;; return {a/b.x, a/b.y} +"/" :: (a: Vec2I, b: int) : Vec2I ;; return {a.x/b, a.y/b} +"/" :: (a: int, b: Vec2I) : Vec2I ;; return {a/b.x, a/b.y} -FloorVec2ToVec2I :: (a: Vec2): Vec2I ;; return {floorf(a.x)->S64, floorf(a.y)->S64} -CastVec2ToVec2I :: (a: Vec2): Vec2I ;; return {a.x->S64, a.y->S64} +FloorVec2ToVec2I :: (a: Vec2): Vec2I ;; return {floorf(a.x)->int, floorf(a.y)->int} +CastVec2ToVec2I :: (a: Vec2): Vec2I ;; return {a.x->int, a.y->int} diff --git a/build/modules/Multimedia.core b/build/modules/Multimedia.core index ce24f23..a30d1fc 100644 --- a/build/modules/Multimedia.core +++ b/build/modules/Multimedia.core @@ -26,8 +26,8 @@ MU :: struct os: Platform MUWindow :: struct - x: S64 - y: S64 + x: int + y: int sizef: Vec2 size: Vec2I resizable: bool @@ -55,7 +55,7 @@ Mouse :: struct left: KeyState right: KeyState middle: KeyState - wheel: S64 + wheel: int #import "Base.core" #import "MathF32.core" diff --git a/build/modules/win32_multimedia.core b/build/modules/win32_multimedia.core index 219db3f..d6e6f68 100644 --- a/build/modules/win32_multimedia.core +++ b/build/modules/win32_multimedia.core @@ -66,8 +66,8 @@ GetWindowSize :: (window: HWND): Vec2I result: Vec2I window_rect: RECT GetClientRect(window, &window_rect) - result.x = (window_rect.right - window_rect.left)->S64 - result.y = (window_rect.bottom - window_rect.top)->S64 + result.x = (window_rect.right - window_rect.left)->int + result.y = (window_rect.bottom - window_rect.top)->int return result GetWindowPos :: (window: HWND): Vec2I @@ -94,7 +94,7 @@ SetWindowPosition :: (window: HWND, style: DWORD, pos: Vec2I): void SetWindowPos(window, 0, rect.left, rect.top, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE) StartMultimedia :: ( - x: S64 = 1280, y: S64 = 720, + x: int = 1280, y: int = 720, title: String = "Hello people!", window_resizable: bool = false, target_ms: F64 = 0.0166666 diff --git a/core_codegen_c_language.cpp b/core_codegen_c_language.cpp index c6a53fb..8f5a39b 100644 --- a/core_codegen_c_language.cpp +++ b/core_codegen_c_language.cpp @@ -243,7 +243,7 @@ gen_value(Token *pos, Value a) { default: { if (is_string(type)) { int length = 0; - gen("{(uint8_t *)\""); + gen("CORE_ConditionalCompound(String){(uint8_t *)\""); for (int i = 0; i < a.intern_val.len; i++) { if (a.intern_val.str[i] == '\n') { length += 2; @@ -845,8 +845,14 @@ compile_to_c_code() { #include #include +int printf(const char *format, ...); #ifndef Assert - #define Assert(x) do{if(!(x))(*(volatile int *)0 = 0);}while(0) + #define Assert(x) do{ \ + if(!(x)) { \ + printf("Assertion failed! %%s(%%d): %%s\n", __FILE__, __LINE__, #x); \ + *(volatile int *)0 = 0; \ + } \ + }while(0) #endif #ifndef AssertMessage @@ -866,7 +872,15 @@ compile_to_c_code() { } #endif -#define BufferSize(x) (sizeof(x)/sizeof((x)[0])) +#define BufferSize(x) ((int)(sizeof(x)/sizeof((x)[0]))) + +#ifdef __clang__ + #define CORE_ConditionalCompound(x) (x) +#elif _MSC_VER + #define CORE_ConditionalCompound(x) +#else + #define CORE_ConditionalCompound(x) (x) +#endif )"); diff --git a/core_compiler.cpp b/core_compiler.cpp index 7b7f2d0..9237fc6 100644 --- a/core_compiler.cpp +++ b/core_compiler.cpp @@ -311,7 +311,8 @@ resolve_everything_in_module(Ast_Module *module) { if (decl->flags & AST_POLYMORPH) continue; // @cleanup: Why I'm not calling resolve_decl here? - resolve_name(file, decl->pos, decl->name); + // resolve_name(file, decl->pos, decl->name); + resolve_decl(decl); if (decl->kind == AST_STRUCT || decl->kind == AST_UNION) type_complete(decl->type_val); } } diff --git a/core_main.cpp b/core_main.cpp index 488909b..2d186bd 100644 --- a/core_main.cpp +++ b/core_main.cpp @@ -108,7 +108,7 @@ static void compile_file(Allocator *allocator, String filename, U32 compile_flag F64 begin = os_time(); if (!is_flag_set(compile_flags, DONT_USE_C_COMPILER)) { String_Builder builder = {scratch}; - builder.addf("clang generated_main.c vendor\\raylib\\windows\\raylibdll.lib -Wall -Wno-unused-function -Wno-parentheses-equality -g -o a" OS_EXE " "); + builder.addf("clang generated_main.c -Wall -Wno-unused-function -Wno-parentheses-equality -g -o a" OS_EXE " "); For(pctx->files_to_link) { builder.addf("-l%Q ", it->intern_val); } @@ -170,7 +170,6 @@ int main(int argument_count, char **arguments) { } For(args) { - if (it == "-testing"_s) { Scoped_Arena _scope(&scratch); Array examples = os_list_dir(&scratch, &scratch, "examples"_s); @@ -193,7 +192,7 @@ int main(int argument_count, char **arguments) { } } printf("End of program\n"); -#if 0 // OS_WINDOWS +#if 1 if (IsDebuggerPresent()) { Breakpoint; } diff --git a/core_typechecking.cpp b/core_typechecking.cpp index 40b3520..54e9bb1 100644 --- a/core_typechecking.cpp +++ b/core_typechecking.cpp @@ -612,7 +612,7 @@ insert_into_scope(Ast_Scope *scope, Ast_Decl *decl) { // as such we probably don't want to call any resolve stuff here Scoped_Arena scratch(pctx->scratch); Scope_Search search = make_scope_search(scratch.arena, scope, decl->name); - // search.search_only_current_scope = true; + search.search_only_current_scope = true; scope_search(&search); if (search.results.len != 0) { if (!is_flag_set(decl->flags, AST_OPERATOR_OVERLOAD)) {