// Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) /* ** Program to run in debugger organized to provide tests for ** stepping, breakpoints, evaluation, cross-module calls. */ #include "raddbg_markup/raddbg_markup.h" //////////////////////////////// // NOTE(allen): System For DLL Testing typedef void TestFunction(void); static void mule_init(void); static TestFunction* mule_get_module_function(char *name); #if _WIN32 #include HMODULE mule_dll = 0; static void mule_init(void){ mule_dll = LoadLibraryA("mule_module.dll"); } static TestFunction* mule_get_module_function(char *name){ TestFunction *result = (TestFunction*)GetProcAddress(mule_dll, name); return(result); } #else static void mule_init(void){ // TODO(allen): implement } static TestFunction* mule_get_module_function(char *name){ // TODO(allen): implement return(0); } #endif //////////////////////////////// // NOTE(nick): Entry Point int mule_main(int argc, char **argv); #if _WIN32 #include #include int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ int argc = __argc; char **argv = __argv; int result = mule_main(argc, argv); return(result); } #else int main(int argc, char **argv){ return(mule_main(argc, argv)); } #endif //////////////////////////////// // NOTE(nick): BSS section test #if defined(__clang__) # pragma clang section bss="muleBSS" #elif defined(_MSC_VER) // NOTE(nick): clang-cl is borken it allocates memory and sets Initialized Flag on the seciton. // This is was reported by Jeff => https://bugs.llvm.org/show_bug.cgi?id=47939 // // This is still unresolved, last checked Sep 11, 2023. # pragma bss_seg("muleBSS") #else # error "bss not defined" #endif char global_variable_in_bss[4096*10000]; //////////////////////////////// // NOTE(allen): Inline Stepping (Built In Separate Unit) extern unsigned int fixed_frac_bits; unsigned int inline_stepping_tests(void); //////////////////////////////// // NOTE(rjf): -O2 Optimized Code (Built In Separate Unit) void optimized_build_eval_tests(void); void optimized_struct_parameters_eval_tests(void); //////////////////////////////// // NOTE(allen): Type Coverage Eval #include struct Basics{ char a; unsigned char b; short c; unsigned short d; int e; unsigned int f; long long g; unsigned long long h; float i; double j; int z; }; struct Basics_Stdint{ int8_t a; uint8_t b; int16_t c; uint16_t d; int32_t e; uint32_t f; int64_t g; uint64_t h; float i; double j; }; struct Pair{ int x; float y; }; struct Fixed_Array{ Pair pairs[10]; int count; }; struct Dynamic_Array{ Pair *pairs; int count; }; struct Struct_With_Embedded_Arrays{ int x; float y; Pair pairs[10]; char z; }; typedef unsigned int Custom_Index_Type; typedef void Function_No_Params_Type(void); typedef void Function_Few_Params_Type(Pair *pairs, int count, Function_No_Params_Type *no_params_type); static Function_No_Params_Type *ty_no_params = 0; static Function_Few_Params_Type *ty_few_params = 0; struct Callback{ Function_Few_Params_Type *few_params; Function_No_Params_Type *no_params; Pair pair; }; union Vector_R2{ struct{ float x; float y; }; float v[2]; }; enum Kind{ Kind_None, Kind_First, Kind_Second, Kind_Third, Kind_Fourth, Kind_COUNT, }; enum Flag{ Flag_None = 0, Flag_First = 1, Flag_Second = 2, Flag_Third = 4, Flag_Fourth = 8, Flag_AllMoreNarrow = 0xFF, Flag_AllNarrow = 0xFFFF, Flag_All = 0xFFFFFFFF, }; struct Has_Enums{ Kind kind; Flag flags; }; struct Discriminated_Union{ Kind kind; union{ struct{ int x; int y; Vector_R2 vector; } first; Pair second; struct{ Function_Few_Params_Type *few_params; Pair pairs[4]; } third; struct{ Kind sub_kind; Flag flags; } fourth; }; }; struct Linked_List{ Linked_List *next; Linked_List *prev; int x; }; enum{ Anonymous_A, Anonymous_B, Anonymous_C, Anonymous_D, }; typedef Kind Alias1; typedef Flag Alias2; typedef Has_Enums Alias3; typedef Discriminated_Union Alias4; struct Has_A_Pre_Forward_Reference{ struct Gets_Referenced_Forwardly *pointer; }; struct Gets_Referenced_Forwardly{ int x; int y; }; struct Has_A_Post_Forward_Reference{ struct Gets_Referenced_Forwardly value; }; static void no_params1(void){ } static void few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){ } static void type_coverage_eval_tests(void){ Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; char string[] = "Hello World!"; char longer_text[] = "Suppose there was some text\n" "With multiple lines in it\r\n" "\t> What ways might it be rendered?\n" "\t> How would it deal with line endings?\r\n"; void *pointer = &basics; Basics *pointer_to_basics = &basics; Basics **pointer_to_pointer_to_basics = &pointer_to_basics; Fixed_Array fixed = { { { 3, 4.f}, { 5, 6.f}, { 7, 8.f}, { 9, 10.f}, {11, 12.f}, {13, 14.f}, {15, 16.f}, {17, 18.f}, {19, 20.f}, }, 9 }; Pair memory_[] = { {100, 1.f}, {101, 2.f}, {102, 4.f}, {103, 8.f}, {104, 16.f}, {105, 32.f}, }; Dynamic_Array dynamic = { memory_, 6 }; raddbg_pin(basics); raddbg_pin(fixed); raddbg_pin(pointer); Struct_With_Embedded_Arrays swea = {0}; { swea.x = 4; swea.y = 23.5f; swea.pairs[0].x = 100; swea.pairs[0].y = 123.f; swea.pairs[2].x = 300; swea.pairs[2].y = 323.f; swea.pairs[5].x = 600; swea.pairs[5].y = 623.f; swea.z = 'z'; } Custom_Index_Type custom_index = 42; Custom_Index_Type more_custom_indices[] = { 04,13,22,31,40 }; Function_No_Params_Type *ptr_no_params = no_params1; Function_No_Params_Type **ptr_ptr_no_params = &ptr_no_params; Function_Few_Params_Type *ptr_few_params = few_params1; Function_Few_Params_Type **ptr_ptr_few_params = &ptr_few_params; Callback callback = {few_params1, no_params1, {1, 2.f}}; Vector_R2 vector = {1.f, 2.f}; Has_Enums has_enums = {(Kind)4, (Flag)7}; Discriminated_Union discriminated_union = {Kind_First}; discriminated_union.first.x = 16; discriminated_union.first.y = 8; discriminated_union.first.vector.x = 4.f; discriminated_union.first.vector.y = 2.f; Linked_List list = {&list, &list, 0}; Alias1 a1 = has_enums.kind; Alias2 a2 = has_enums.flags; Alias3 a3 = has_enums; Alias4 a4 = discriminated_union; Has_A_Pre_Forward_Reference r1 = {0}; Has_A_Post_Forward_Reference r2 = {0}; Basics &basics_ref = basics; const Basics *basics_const_ptr = &basics; const Basics &basics_const_ref = basics; union { int x; char y[4]; } integer_slicing = {123456789}; typedef struct stks { void *left; size_t len; } stks; stks stks_test[256] = {0}; stks *stks_first = &stks_test[0]; stks *stks_ptr = stks_first + 8; TestFunction *function = mule_get_module_function("dll_type_eval_tests"); function(); int x = (int)(Anonymous_D); } //////////////////////////////// // NOTE(allen): Mutating Variables Eval static const int con_some_constant = 4; static const float con_some_constant_f = 0.04f; static int mut_x = 0; static int mut_y; static int mut_xarray[4] = {0, 1, 2, 3}; static int *mut_xptr; static float mut_f = 0; static float mut_g; static float mut_farray[4] = {0.5f, 1.5f, 2.5f, 3.5f}; static float *mut_fptr; static float mut_arrayarray[3][3]; static Linked_List mut_link; static void mutate_in_function(int *array, int count){ for (int i = 0; i < count; i += 1){ array[i] += 1; } for (int i = 0; i < 4; i += 1){ mut_farray[i] += 1.f; } } static void mutating_variables_eval_tests(void){ //////////////////////////////// // NOTE(allen): Basics int array_literal[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, }; Basics struct_literal = { -1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001, }; array_literal[0] = struct_literal.e = 9; int x = mut_x; int y = x + 10 + con_some_constant; mut_y = y; mut_xarray[0] += 0; mut_xarray[1] += x; mut_xarray[2] += y; mut_xarray[3] += x + y; mut_xptr = &mut_xarray[2]; *mut_xptr -= (y - x)/2; *(mut_xptr - 1) += 11; float f = mut_f + .333f + con_some_constant_f; float g = f + 10.1f; mut_g = g; mut_farray[0] += 0.000001f; mut_farray[1] += f; mut_farray[2] += g; mut_farray[3] += f + g; mut_fptr = &mut_farray[3]; *mut_fptr -= (g - f)*0.5f; *(mut_fptr - 1) += 1.f; float a = 0.777f; for (int i = 0; i < 3; i += 1){ float b = a*a - 1.f; for (int j = 0; j < 3; j += 1){ mut_arrayarray[i][j] = b; b += 0.111f; } a += 0.333f; } //////////////////////////////// // NOTE(allen): Changes in functions mutate_in_function(array_literal, 10); mutate_in_function(array_literal, 10); //////////////////////////////// // NOTE(allen): Changes through pointers Basics basic = struct_literal; Basics advanced = struct_literal; Basics *struct_pointer = &basic; basic.a += 1; advanced.a += 1; struct_pointer->a += 1; struct_pointer = &advanced; basic.b += 1; advanced.b += 1; struct_pointer->b += 1; Linked_List links[5]; for (int i = 0; i < 5; i += 1){ links[i].next = &links[i + 1]; links[i].prev = &links[i - 1]; links[i].x = i; } links[0].prev = 0; links[4].next = &mut_link; mut_link.prev = &links[4]; mut_link.next = 0; mut_link.x = 1000; Linked_List *link_ptr = links; link_ptr = link_ptr->next; link_ptr = &links[4]; link_ptr = &mut_link; Linked_List sentinel = {0}; sentinel.x = -1; sentinel.next = &links[0]; links[0].prev = &sentinel; sentinel.prev = &mut_link; mut_link.next = &sentinel; link_ptr = &sentinel; } //////////////////////////////// // NOTE(allen): Global Eval struct NestedNodeInner{ unsigned int small0; unsigned int small1; unsigned int big0; unsigned int big1; }; struct NestedNodeOuter{ NestedNodeOuter *next; NestedNodeInner *inner_nodes; unsigned int inner_node_count; }; static void nested_types_eval_tests(void){ // doing some setup NestedNodeOuter *outer1 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); NestedNodeOuter *outer2 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); NestedNodeOuter *outer3 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); outer1->next = outer2; outer2->next = outer3; outer3->next = 0; outer1->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); outer1->inner_node_count = 10; outer2->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); outer2->inner_node_count = 10; outer3->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); outer3->inner_node_count = 10; for (unsigned int i = 0; i < 10; i += 1){ outer1->inner_nodes[i].small0 = i; outer1->inner_nodes[i].small1 = 2*i; outer1->inner_nodes[i].big0 = 0xFFFFFF + 0xF*i; outer1->inner_nodes[i].big1 = 0xFFFFFF + 0xFF*i; outer2->inner_nodes[i].small0 = 1 + i; outer2->inner_nodes[i].small1 = 3*i; outer2->inner_nodes[i].big0 = 0x1000000 + 0x10*i; outer2->inner_nodes[i].big1 = 0x1000000 + 0x101*i; outer3->inner_nodes[i].small0 = 2 + i; outer3->inner_nodes[i].small1 = 4*i; outer3->inner_nodes[i].big0 = 0x8000000 + 0xF0*i; outer3->inner_nodes[i].big1 = 0x8000000 + 0xF0F*i; } // okay eval it here int x = 0; } //////////////////////////////// // NOTE(rjf): Struct Parameters Eval static void struct_parameter_helper(Basics basics) { basics.a += 1; basics.a += 1; basics.a += 1; } static void struct_parameters_eval_tests(void) { Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; struct_parameter_helper(basics); } //////////////////////////////// // NOTE(allen): Global Eval static int g_abc = 100; static float g_xyz = 21.f; static Alias1 g_kind = Kind_First; // TODO(allen): more global test types static void complicated_global_mutation(int *x){ *x = (int)g_xyz; } static void cross_unit_global_mutation(void){ fixed_frac_bits = 10; } static void global_eval_tests(void){ g_abc = 11*11; g_xyz = (float)g_abc - 21.f; int z = g_abc; complicated_global_mutation(&z); complicated_global_mutation(&g_abc); if (g_kind == Kind_First){ g_abc -= 1; g_kind = Kind_None; } cross_unit_global_mutation(); static int l_abc = 200; static float l_xyz = 42.f; static Alias1 l_kind = Kind_Second; l_abc = g_abc*2; l_xyz = g_xyz*2; l_kind = (Alias1)(g_kind + 1); } //////////////////////////////// // NOTE(allen): Return Eval static int complicated_return_expression(void){ int x = 171717; return((x % 13) <= 5?(x % 19)*11:(x - 500)%200); } static void return_eval_tests(void){ complicated_return_expression(); } //////////////////////////////// // NOTE(allen): TLS Eval #if _WIN32 # define thread_var __declspec(thread) #else # define thread_var __thread #endif thread_var int tls_a = 100; thread_var int tls_b = 999; static void tls_eval_tests(void){ tls_a = (tls_a + tls_b)/2; tls_b = tls_b - tls_a; TestFunction *dll_tls_eval_test = mule_get_module_function("dll_tls_eval_test"); if (dll_tls_eval_test != 0){ dll_tls_eval_test(); } } //////////////////////////////// // NOTE(allen): Complicated Type Coverage Eval struct Complicated_Type_Members{ int x600[2][2][2][2]; int *x601[2][2][2][2]; int (*x602)[2][2][2][2]; int (*x603[2])[2][2][2]; int (*(*x604[2])[2])[2][2]; int (*(*(*x605[2])[2])[2])[2]; int (*x33[2])(void); int (*x34[3])(void); int (*x35[2][2])(void); int (*(*z33)(void))[2]; int (*(*z34)(void))[3]; int (*(*z35)(void))[2][2]; int (*(*f2)(void))(void); int (*(*(*f3)(void))(void))(void); int (*(*f4)(int))(void); int (*(*f5)(void))(int); int (*(*f6)(int))(int); int (*(*(*f7_growing)(char))(short))(int); int (*(*(*f7_shrinking)(int))(short))(char); }; static void complicated_type_coverage_tests(void){ Complicated_Type_Members m = {0}; int x1 = {0}; int *x2 = {0}; int **x3 = {0}; int x4a[2] = {0}; int *x4[2] = {0}; int x5a[3] = {0}; int *x5[3] = {0}; int *x6[2][2] = {0}; int (*x7)[2] = {0}; int (*x8)[3] = {0}; int (*x9)[2][2] = {0}; int x600[2][2][2][2] = {0}; int *x601[2][2][2][2] = {0}; int (*x602)[2][2][2][2] = {0}; int (*x603[2])[2][2][2] = {0}; int (*(*x604[2])[2])[2][2] = {0}; int (*(*(*x605[2])[2])[2])[2] = {0}; int x606_growing [2][3][4][5] = {0}; int x606_shrinking[5][4][3][2] = {0}; int (*(*(*x607_growing [2])[3])[4])[5] = {0}; int (*(*(*x607_shrinking[5])[4])[3])[2] = {0}; int **x10[2] = {0}; int **x11[3] = {0}; int **x12[2][2] = {0}; int *(*x13)[2] = {0}; int *(*x14)[3] = {0}; int *(*x15)[2][2] = {0}; int **x16[2] = {0}; int **x17[3] = {0}; int **x18[2][2] = {0}; int (*y1[2])[2] = {0}; int (*y2[3])[2] = {0}; int (*y3[2][2])[2] = {0}; int (*y4[2])[3] = {0}; int (*y5[3])[3] = {0}; int (*y6[2][2])[3] = {0}; int (*y7[2])[2][2] = {0}; int (*y8[3])[2][2] = {0}; int (*y9[2][2])[2][2] = {0}; int (*x19)(void) = {0}; int (*x20)(int) = {0}; int (*x21)(int, int) = {0}; int (*x22)(int*, int) = {0}; int (*x23)(int**, int) = {0}; int (*x24)(int**, int*) = {0}; int (*x25)(int**, int**) = {0}; int *(*x26)(void) = {0}; int *(*x27)(int) = {0}; int *(*x28)(int, int) = {0}; int *(*x29)(int*, int) = {0}; int *(*x30)(int**, int) = {0}; int *(*x31)(int**, int*) = {0}; int *(*x32)(int**, int**) = {0}; int (*x33[2])(void) = {0}; int (*x34[3])(void) = {0}; int (*x35[2][2])(void) = {0}; int (*x36[2])(int) = {0}; int (*x37[3])(int) = {0}; int (*x38[2][2])(int) = {0}; int (*x39[2])(int, int) = {0}; int (*x40[3])(int, int) = {0}; int (*x41[2][2])(int, int) = {0}; int (*x42[2])(int*, int) = {0}; int (*x43[3])(int*, int) = {0}; int (*x44[2][2])(int*, int) = {0}; int (*x45[2])(int**, int) = {0}; int (*x46[3])(int**, int) = {0}; int (*x47[2][2])(int**, int) = {0}; int (*x48[2])(int**, int*) = {0}; int (*x49[3])(int**, int*) = {0}; int (*x50[2][2])(int**, int*) = {0}; int (*x51[2])(int**, int**) = {0}; int (*x52[3])(int**, int**) = {0}; int (*x53[2][2])(int**, int**) = {0}; int (*(*z33)(void))[2] = {0}; int (*(*z34)(void))[3] = {0}; int (*(*z35)(void))[2][2] = {0}; int (*(*z36)(int))[2] = {0}; int (*(*z37)(int))[3] = {0}; int (*(*z38)(int))[2][2] = {0}; int (*(*z39)(int, int))[2] = {0}; int (*(*z40)(int, int))[3] = {0}; int (*(*z41)(int, int))[2][2] = {0}; int (*(*z42)(int*, int))[2] = {0}; int (*(*z43)(int*, int))[3] = {0}; int (*(*z44)(int*, int))[2][2] = {0}; int (*(*z45)(int**, int))[2] = {0}; int (*(*z46)(int**, int))[3] = {0}; int (*(*z47)(int**, int))[2][2] = {0}; int (*(*z48)(int**, int*))[2] = {0}; int (*(*z49)(int**, int*))[3] = {0}; int (*(*z50)(int**, int*))[2][2] = {0}; int (*(*z51)(int**, int**))[2] = {0}; int (*(*z52)(int**, int**))[3] = {0}; int (*(*z53)(int**, int**))[2][2] = {0}; int (*(*z303[2])(void)) = {0}; int (*(*z304[3])(void)) = {0}; int (*(*z305[2][2])(void)) = {0}; int (*(*z306[2])(int)) = {0}; int (*(*z307[3])(int)) = {0}; int (*(*z308[2][2])(int)) = {0}; int (*(*z309[2])(int, int)) = {0}; int (*(*z400[3])(int, int)) = {0}; int (*(*z401[2][2])(int, int)) = {0}; int (*(*z402[2])(int*, int)) = {0}; int (*(*z403[3])(int*, int)) = {0}; int (*(*z404[2][2])(int*, int)) = {0}; int (*(*z405[2])(int**, int)) = {0}; int (*(*z406[3])(int**, int)) = {0}; int (*(*z407[2][2])(int**, int)) = {0}; int (*(*z408[2])(int**, int*)) = {0}; int (*(*z409[3])(int**, int*)) = {0}; int (*(*z500[2][2])(int**, int*)) = {0}; int (*(*z501[2])(int**, int**)) = {0}; int (*(*z502[3])(int**, int**)) = {0}; int (*(*z503[2][2])(int**, int**)) = {0}; int (*(*f2)(void))(void) = {0}; int (*(*(*f3)(void))(void))(void) = {0}; int (*(*f4)(int))(void) = {0}; int (*(*f5)(void))(int) = {0}; int (*(*f6)(int))(int) = {0}; int (*(*(*f7_growing)(char))(short))(int) = {0}; int (*(*(*f7_shrinking)(int))(short))(char) = {0}; int (*f8)(int (*)(void)) = {0}; int (*f9)(void (*)(int)) = {0}; void (*f10)(int (*)(int)) = {0}; int (*f11)(int, int (*)(void)) = {0}; int (*f12)(int (*)(void), int) = {0}; int (*f13)(int (*)(void), int (*)(void)) = {0}; int (*f14)(int (*)(void)) = {0}; int (*f15)(int (*)(int (*)(void))) = {0}; int (*f16)(int (*)(int (*)(int (*)(void)))) = {0}; int (*f17)(int (*)(int (*)(int (*)(int (*)(void))))) = {0}; int (*f18)(int (*)(void)) = {0}; int (*f19)(int (*(*)(void))(void)) = {0}; int (*f20)(int (*(*(*)(void))(void))(void)) = {0}; int (*f21)(int (*(*(*(*)(void))(void))(void))(void)) = {0}; int (*(*(*(*f22)(void))(void))(void))(void) = {0}; int (*(*(*(*f23)(int [2]))(void))(void))(void) = {0}; int (*(*(*(*f24)(int *[2]))(int [3]))(void))(void) = {0}; int (*(*(*(*f25)(int (*)[2]))(int *[3]))(int [4]))(void) = {0}; int (*(*(*(*f26)(int **(**)[2]))(int (*)[3]))(int *[4]))(int [5]) = {0}; int x = 0; } //////////////////////////////// // NOTE(allen): Extended Type Coverage Eval template struct Template_Example{ X x; int y; }; template struct Template_Example2{ X x; Y y; }; template struct Template_Example3{ X x; Y y; Template_Example3(X x, Y y) { this->x = x; this->y = y; } ~Template_Example3() { int x = 2; int y = 5; int z = x + y; } }; struct SingleInheritanceBase { int x; int y; }; struct SingleInheritanceDerived : SingleInheritanceBase { int z; int w; }; struct Has_Members{ int a; int b; uint64_t c; uint64_t d; Basics bas; int w(void){ return a; } int x(void){ return b; } uint64_t y(void){ return c; } uint64_t z(void){ return d; } Basics bas_f(void){ return bas; } }; struct Has_Static_Members{ int a; int b; static uint64_t c; static uint64_t d; int w(void){ return a; } int x(void){ return b; } static uint64_t y(void){ return c; } static uint64_t z(void){ return d; } }; uint64_t Has_Static_Members::c = 0; uint64_t Has_Static_Members::d = 0; struct Pointer_To_Member{ int Has_Members::*member_ptr_int; uint64_t Has_Members::*member_ptr_u64; Basics Has_Members::*member_ptr_bas; int (Has_Members::*method_ptr_int)(void); uint64_t (Has_Members::*method_ptr_u64)(void); Basics (Has_Members::*method_ptr_bas)(void); }; struct Has_Sub_Types{ struct Sub_Type1{ int x; int y; }; struct Sub_Type2{ float x; float y; }; Sub_Type1 a; Sub_Type2 b; }; struct Conflicting_Type_Names{ struct Sub_Type1{ uint64_t z; }; struct Sub_Type2{ int64_t z; }; Sub_Type1 a; Sub_Type2 b; }; struct Has_Private_Sub_Types{ Has_Private_Sub_Types(char x1, char y1, float x2, int y2, int x3, float y3){ this->a.x = x1; this->a.y = y1; this->b.x = x2; this->b.y = y2; this->c.x = x3; this->c.y = y3; } struct Public_Sub_Type{ char x; char y; }; Public_Sub_Type a; protected: struct Protected_Sub_Type{ float x; int y; }; Protected_Sub_Type b; private: struct Private_Sub_Type{ int x; float y; }; Private_Sub_Type c; }; struct Vtable_Parent{ virtual void a_virtual_function(void) = 0; virtual void b_virtual_function(void) = 0; virtual void c_virtual_function(void) = 0; void a_virtual_function(int r){ for (int i = 0; i < r; i += 1){ a_virtual_function(); } } }; struct Vtable_Child : Vtable_Parent{ int x; int y; Vtable_Child(int a, int b){ x = a; y = b; } virtual void a_virtual_function(void){ x = 0; }; virtual void b_virtual_function(void){ y = 0; }; virtual void c_virtual_function(void){ x = y; }; }; struct Vinheritance_Base{ int x; int y; virtual void a_virtual_function(void){ x = 0; }; virtual void b_virtual_function(void){ y = 0; }; virtual void x_virtual_function(void){ y = x; }; }; struct Vinheritance_MidLeft : virtual Vinheritance_Base{ float left; virtual void c1_virtual_function(void){ left = 0; }; virtual void c2_virtual_function(void){ left = 0; }; }; struct Vinheritance_MidRight : virtual Vinheritance_Base{ float right; virtual void d_virtual_function(void){ right = 0; }; }; struct Vinheritance_Child : Vinheritance_MidLeft, Vinheritance_MidRight{ char *name; virtual void a_virtual_function(void){ x = 1; }; virtual void c1_virtual_function(void){ left = 1; }; }; struct Minheritance_Base{ int x; int y; }; struct Minheritance_MidLeft : Minheritance_Base{ float left; }; struct Minheritance_MidRight : Minheritance_Base{ float right; }; struct Minheritance_Child : Minheritance_MidLeft, Minheritance_MidRight{ char *name; }; struct Pure { virtual ~Pure() = default; virtual void Foo() = 0; }; struct PureChild : Pure { virtual ~PureChild() = default; virtual void Foo() {a += 1;} double a = 0; }; struct Base { int x; int y; int z; virtual ~Base() = default; virtual void Foo() = 0; }; struct Derived : Base { int r; int g; int b; int a; virtual ~Derived() = default; virtual void Foo() {a += 1;} }; struct DerivedA : Base { float a; float b; virtual void Foo() {a += 1;} virtual ~DerivedA() = default; }; struct DerivedB : Base { double c; double d; virtual void Foo() {c += 1;} virtual ~DerivedB() = default; }; struct NonVirtualBase { int x; int y; int z; }; struct NonVirtualDerived : NonVirtualBase { int r; int g; int b; int a; }; struct OverloadedMethods{ int x; int cool_method(void){ return(x); } int cool_method(int z){ int r = x; x = z; return(r); } void cool_method(int y, int z){ if (x < z){ x = y; } else{ x = z; } } }; struct HasStaticConstMembers { int a; int b; static int c; static int d; static const int e = 789; static const int f = 101112; }; int HasStaticConstMembers::c = 123; int HasStaticConstMembers::d = 456; struct Has_A_Constructor{ int n; int d; Has_A_Constructor(int a, int b){ int gcd = 1; { int x = a; int y = b; if (x < y){ y = a; x = b; } for (;y > 0;){ int z = x%y; x = y; y = z; } gcd = x; } n = a/gcd; d = b/gcd; } static int N; static int D; ~Has_A_Constructor(){ int m = N*d + n*D; int e = d*D; N = m; D = d; } }; int Has_A_Constructor::N = 0; int Has_A_Constructor::D = 1; struct Constructor_Gotcha_Test{ int x; int y; void Constructor_Gotcha(void){ x = y = 0; } }; struct Has_A_Friend{ friend struct Modifies_Other; int get_x(void){ return x; } int get_y(void){ return y; } private: int x; int y; }; struct Modifies_Other{ int x; int y; void talk_to_friend(Has_A_Friend *other){ other->x = y; other->y = x; } }; namespace UserNamespace{ namespace SubA{ struct Foo{ int x; int y; }; }; namespace SubB{ struct Foo{ float u; float v; }; }; SubA::Foo foo_a = {10, 20}; SubB::Foo foo_b = {0.1f, 0.05f}; static void namespaced_function(void){ foo_a.x = (int)(foo_a.y*foo_b.u); foo_b.v = (float)(foo_a.x*foo_b.v); } }; static void call_with_pass_by_reference(int &x){ x += 1; } static void call_with_pass_by_const_reference(const int &x){ int y = x; } static void extended_type_coverage_eval_tests(void){ //////////////////////////////// // NOTE(allen): Extensions to base type system. { int x = 0; const int *x_ptr = &x; int *const x_cptr = &x; call_with_pass_by_reference(x); call_with_pass_by_const_reference(x); } //////////////////////////////// // NOTE(allen): Extensions to user defined types { Template_Example temp_f = {1.f, 2}; Template_Example temp_v = {(void*)&temp_f, 2}; Template_Example > temp_tf = {temp_f, 2}; Template_Example2 temp_if = {2, 1.f}; Template_Example3 temp3_if(2, 1.f); Template_Example3 temp3_vi((void *)&temp3_if, 1.f); Template_Example3> temp3_itif(123, temp_if); SingleInheritanceDerived sid; sid.x = 123; sid.y = 456; sid.z = 789; sid.w = 999; Pointer_To_Member pointer_to_member = { &Has_Members::a, &Has_Members::c, &Has_Members::bas, &Has_Members::x, &Has_Members::z, &Has_Members::bas_f, }; Has_Static_Members has_static_members = { 10, 20 }; Has_Static_Members::c = 100; Has_Static_Members::d = 110; has_static_members.x(); has_static_members.y(); has_static_members.z(); has_static_members.w(); Has_Sub_Types has_sub_types = { {100, 200}, {.1f, .2f}, }; Conflicting_Type_Names conflicting_type_names = { {10}, {-20}, }; Has_Private_Sub_Types has_private_sub_types(1, 2, 4, 8, 16, 32); Vtable_Child vtable_child(1, 2); vtable_child.a_virtual_function(); Vinheritance_Child vinheritance_child; vinheritance_child.name = "foobar"; vinheritance_child.left = 10.5f; vinheritance_child.right = 13.0f; vinheritance_child.x = -1; vinheritance_child.y = -1; Minheritance_Child minheritance_child; minheritance_child.name = "foobar"; minheritance_child.left = 10.5f; minheritance_child.right = 13.0f; minheritance_child.Minheritance_MidLeft::x = -1; minheritance_child.Minheritance_MidLeft::y = -1; minheritance_child.Minheritance_MidRight::x = +1; minheritance_child.Minheritance_MidRight::y = +1; Pure *child = new PureChild(); child->Foo(); child->Foo(); child->Foo(); delete child; Base *derived = new Derived(); derived->Foo(); derived->Foo(); derived->Foo(); delete derived; NonVirtualBase *non_virtual_derived = new NonVirtualDerived(); non_virtual_derived->x += 1; non_virtual_derived->x += 1; non_virtual_derived->x += 1; Base *base_array[1024] = {0}; for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1) { if((i & 1) == 1) { base_array[i] = new DerivedA(); } else { base_array[i] = new DerivedB(); } } OverloadedMethods overloaded_methods; { overloaded_methods.x = 0; int a = overloaded_methods.cool_method(); overloaded_methods.cool_method(-10, 100); int b = overloaded_methods.cool_method(100); overloaded_methods.cool_method(b*2, a*2); int c = overloaded_methods.cool_method(a + b); int z = c; } Has_A_Constructor construct_me(360, 25); Has_A_Friend has_a_friend; Modifies_Other modifies_other; modifies_other.x = 57; modifies_other.y = 66; modifies_other.talk_to_friend(&has_a_friend); int x = has_a_friend.get_x(); int y = has_a_friend.get_y(); int z = x; HasStaticConstMembers static_const_members = {0}; static_const_members.a = 123 + HasStaticConstMembers::c * HasStaticConstMembers::e; static_const_members.b = 456 + HasStaticConstMembers::d * HasStaticConstMembers::f; } //////////////////////////////// // NOTE(allen): Namespaces { UserNamespace::namespaced_function(); } } //////////////////////////////// //~ rjf: Templated Function Eval Tests typedef struct TemplateArg TemplateArg; struct TemplateArg { int x; int y; int z; float a; float b; float c; char *name; }; template static T templated_factorial(T t) { T result = t; if(t > 1) { result *= templated_factorial(t-1); } return result; } template static T compute_template_arg_info(T t) { int sum = t.x + t.y + t.z; int size = sizeof(t); float sum_f = t.a + t.b + t.c; OutputDebugStringA(t.name); return t; } static void templated_function_eval_tests(void) { int int_factorial = templated_factorial(10); float float_factorial = templated_factorial(10); TemplateArg arg = {1, 2, 3, 4.f, 5.f, 6.f, "my template arg"}; compute_template_arg_info(arg); int x = 0; } //////////////////////////////// //~ NOTE(allen): C Type Coverage extern "C"{ #include "mule_c.h" } //////////////////////////////// //~ rjf: Fancy Visualization Eval Tests static unsigned int mule_bswap_u32(unsigned int x) { unsigned int result = (((x & 0xFF000000) >> 24) | ((x & 0x00FF0000) >> 8) | ((x & 0x0000FF00) << 8) | ((x & 0x000000FF) << 24)); return result; } static void fancy_viz_eval_tests(void) { //- rjf: colors float example_color_4f32[4] = {1.00f, 0.85f, 0.25f, 1.00f}; unsigned int example_color_u32 = 0xff6f30ff; struct {float r, g, b, a;} example_color_struct = {0.50f, 0.95f, 0.75f, 1.00f}; int x0 = 0; //- rjf: multiline text char *long_string = ("This is an example of some very long text with line breaks\n" "in it. This is a very common kind of data which is inspected\n" "in the debugger while programming, and it is often a pain\n" "when it is poorly supported.\n"); char *code_string = ("#include \n" "\n" "int main(int argc, char**argv)\n" "{\n" " printf(\"Hello, World!\\n\");\n" " return 0;\n" "}\n\n"); int x1 = 0; raddbg_pin(long_string, "text"); raddbg_pin(code_string, "text: (lang:c)"); raddbg_pin(fancy_viz_eval_tests, "disasm: (arch:x64)"); //- rjf: bitmaps unsigned int background_color = 0x00000000; unsigned int main_color = 0xff2424ff; unsigned int shine_color = 0xff5693ff; unsigned int shadow_color = 0xff238faf; unsigned int bg = mule_bswap_u32(background_color); unsigned int cl = mule_bswap_u32(main_color); unsigned int sn = mule_bswap_u32(shine_color); unsigned int sh = mule_bswap_u32(shadow_color); unsigned int bitmap[] = { bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, cl, cl, bg, cl, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, cl, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, cl, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sn, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, sh, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, sh, cl, cl, cl, sh, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, sh, sh, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, }; raddbg_pin(bitmap, "bitmap:(w:18, h:18)"); for(int i = 0; i < sizeof(bitmap)/sizeof(bitmap[0]); i += 1) { unsigned int r = bitmap[i]&0x000000ff; unsigned int a = bitmap[i]&0xff000000; bitmap[i] = bitmap[i]>>8; bitmap[i] &= ~0xffff0000; bitmap[i] |= (r<<16); bitmap[i] |= (a); } for(int i = 0; i < sizeof(bitmap)/sizeof(bitmap[0]); i += 1) { unsigned int r = bitmap[i]&0x000000ff; unsigned int a = bitmap[i]&0xff000000; bitmap[i] = bitmap[i]>>8; bitmap[i] &= ~0xffff0000; bitmap[i] |= (r<<16); bitmap[i] |= (a); } for(int i = 0; i < sizeof(bitmap)/sizeof(bitmap[0]); i += 1) { unsigned int r = bitmap[i]&0x000000ff; unsigned int a = bitmap[i]&0xff000000; bitmap[i] = bitmap[i]>>8; bitmap[i] &= ~0xffff0000; bitmap[i] |= (r<<16); bitmap[i] |= (a); } int x2 = 0; //- rjf: 3D geometry float vertex_data[] = // pos.x, pos.y, pos.z, nor.x, nor.y, nor.z, tex.u, tex.v, col.r, col.g, col.b, ... { -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 0.0f, 0.973f, 0.480f, 0.002f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 2.0f, 0.973f, 0.480f, 0.002f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 2.0f, 0.973f, 0.480f, 0.002f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 8.0f, 0.973f, 0.480f, 0.002f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 8.0f, 0.973f, 0.480f, 0.002f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.973f, 0.480f, 0.002f, -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 10.0f, 0.973f, 0.480f, 0.002f, 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 10.0f, 0.973f, 0.480f, 0.002f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 10.0f, 0.973f, 0.480f, 0.002f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.897f, 0.163f, 0.011f, 1.0f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.897f, 0.163f, 0.011f, 1.0f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.897f, 0.163f, 0.011f, 1.0f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.897f, 0.163f, 0.011f, 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.897f, 0.163f, 0.011f, 1.0f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.897f, 0.163f, 0.011f, 1.0f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.897f, 0.163f, 0.011f, 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.897f, 0.163f, 0.011f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 0.0f, 0.612f, 0.000f, 0.069f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 2.0f, 0.612f, 0.000f, 0.069f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 2.0f, 0.612f, 0.000f, 0.069f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.612f, 0.000f, 0.069f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 8.0f, 0.612f, 0.000f, 0.069f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.612f, 0.000f, 0.069f, 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 10.0f, 0.612f, 0.000f, 0.069f, -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 10.0f, 0.612f, 0.000f, 0.069f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 10.0f, 0.612f, 0.000f, 0.069f, -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.127f, 0.116f, 0.408f, -1.0f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.127f, 0.116f, 0.408f, -1.0f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.127f, 0.116f, 0.408f, -1.0f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.127f, 0.116f, 0.408f, -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.127f, 0.116f, 0.408f, -1.0f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.127f, 0.116f, 0.408f, -1.0f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.127f, 0.116f, 0.408f, -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.127f, 0.116f, 0.408f, -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 0.0f, 0.000f, 0.254f, 0.637f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 2.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 2.0f, 0.000f, 0.254f, 0.637f, -0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 8.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 8.0f, 0.000f, 0.254f, 0.637f, -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.000f, 0.254f, 0.637f, -0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 10.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 10.0f, 0.000f, 0.254f, 0.637f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 10.0f, 0.000f, 0.254f, 0.637f, -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 0.0f, 0.001f, 0.447f, 0.067f, 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 2.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 2.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 8.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 8.0f, 0.001f, 0.447f, 0.067f, -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 10.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 10.0f, 0.001f, 0.447f, 0.067f, 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 10.0f, 0.001f, 0.447f, 0.067f, -0.6f, 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, -0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, 1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, 0.6f, 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, 0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, -1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, -0.6f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, 0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, }; unsigned int index_data[] = { 0, 1, 9, 9, 8, 0, 1, 2, 5, 5, 4, 1, 6, 7, 10, 10, 9, 6, 2, 3, 11, 11, 10, 2, 12, 13, 21, 21, 20, 12, 13, 14, 17, 17, 16, 13, 18, 19, 22, 22, 21, 18, 14, 15, 23, 23, 22, 14, 24, 25, 33, 33, 32, 24, 25, 26, 29, 29, 28, 25, 30, 31, 34, 34, 33, 30, 26, 27, 35, 35, 34, 26, 36, 37, 45, 45, 44, 36, 37, 38, 41, 41, 40, 37, 42, 43, 46, 46, 45, 42, 38, 39, 47, 47, 46, 38, 48, 49, 57, 57, 56, 48, 49, 50, 53, 53, 52, 49, 54, 55, 58, 58, 57, 54, 50, 51, 59, 59, 58, 50, 60, 61, 69, 69, 68, 60, 61, 62, 65, 65, 64, 61, 66, 67, 70, 70, 69, 66, 62, 63, 71, 71, 70, 62, 72, 73, 74, 74, 75, 72, 76, 77, 78, 78, 79, 76, 80, 81, 82, 82, 83, 80, 84, 85, 86, 86, 87, 84, 88, 89, 90, 90, 91, 88, 92, 93, 94, 94, 95, 92, 96, 97, 98, 98, 99, 96, 100, 101, 102, 102, 103, 100, 104, 105, 106, 106, 107, 104, 108, 109, 110, 110, 111, 108, 112, 113, 114, 114, 115, 112, 116, 117, 118, 118, 119, 116, 120, 121, 122, 122, 123, 120, 124, 125, 126, 126, 127, 124, 128, 129, 130, 130, 131, 128, 132, 133, 134, 134, 135, 132, 136, 137, 138, 138, 139, 136, 140, 141, 142, 142, 143, 140, 144, 145, 146, 146, 147, 144, 148, 149, 150, 150, 151, 148, 152, 153, 154, 154, 155, 152, 156, 157, 158, 158, 159, 156, 160, 161, 162, 162, 163, 160, 164, 165, 166, 166, 167, 164, }; raddbg_pin(index_data, "geo: { count:(sizeof index_data / 4), vertices_base:(vertex_data), vertices_size:(sizeof vertex_data) }"); int x3 = 0; } //////////////////////////////// // NOTE(allen): Function Overload Resolution static int overloaded_function(float y){ int r = (int)(y + 0.5f); return(r); } static int overloaded_function(float y, int x){ int r = overloaded_function(y) + x; return(r); } static int overloaded_function(int x){ float y = (float)x; int r = overloaded_function(y, 1); return(r); } //////////////////////////////// // NOTE(allen): Control Flow Stepping static void control_flow_stepping_tests(void){ { int a = 1; if (a < 1){ a += 1; } if (a < 2){ a += 2; } } { int a = 1; if (a < 1) { a += 1; } if (a < 2) { a += 2; } } { int a = 1; if (a < 1) a += 1; if (a < 2) a += 2; } { int a = 1; int b = 2; if (a <= b){ if (a == b){ b += 1; } else{ a += 1; } } else{ if (a%2){ a = b; } else{ a = b - 1; } } } { int a = 1; int b = 2; if (a <= b) { if (a == b) { b += 1; } else { a += 1; } } else { if (a%2) { a = b; } else { a = b - 1; } } } { int a = 1; int b = 2; if (a <= b) if (a == b) b += 1; else a += 1; else if (a%2) a = b; else a = b - 1; } { int x = 0; for (int i = 0; i < 10; i += 1){ x += i; } } { int x = 0; for (int i = 0; i < 10; i += 1) { x += i; } } { int x = 0; for (int i = 0; i < 10; i += 1) x += i; } { int x = 0; for (int i = 0; i < 10; i += 1) x += i; } { int a = 1; for (;a < 10;){ switch (a){ case 0: case 1: case 2: { a += 2; }break; default: case 4: case 5: { a += 1; }break; case 6: a += 1; break; case 7: a += 1; case 8: case 9: a += 1; } } } { int i = 0; while (i < 5){ i += 1; } while (i < 10) { i += 1; } while (i < 15) i += 1; while (i < 20) i += 1; } { int i = 0; do { i += 1; } while (i < 10); } { int i = 17; check_again: if (i <= 1) goto done; if ((i&1) == 0) goto even_case; // odd_case: i = 3*i + 1; even_case: i /= 2; goto check_again; done:; } { int x = 15; label_same_line:; x -= 1; if(x > 0) { goto label_same_line; } else { goto end_label_same_line; } } end_label_same_line:; } //////////////////////////////// // NOTE(allen): Indirect Call/Jump Stepping Tests typedef int FunctionType(int); static int function_foo(int a){ if (a < 1){ a += 1; } if (a < 2){ a += 2; } return(a); } static int function_bar(int x){ for (int i = 0; i < 10; i += 1){ x += i; } return(x); } static void indirect_call_jump_stepping_tests(void){ int z = 1; FunctionType *ptr = function_foo; z = ptr(z); if ((z & 1) == 0){ ptr = function_bar; } z = ptr(z); switch (z&7){ case 0: { z += 2; ptr = function_bar; }break; case 1: { z += 1; ptr = function_bar; }break; case 2: { z *= 2; ptr = function_bar; }break; case 3: { z -= 10; ptr = function_foo; }break; case 4: { z -= 5; ptr = function_foo; }break; case 5: { z = z ^ 0x10; ptr = function_foo; }break; case 6: { z = z & ~0x10; ptr = function_foo; }break; case 7: { z = z | 0x10; ptr = function_foo; }break; } z = ptr(z); } //////////////////////////////// // NOTE(rjf): alloca (Variable-Width Stack Changes) Stepping Tests static void alloca_stepping_tests(void) { int x = 1; int y = 3; int z = 5; #if _WIN32 int *mem = (int *)_alloca((x+y+z)*sizeof(int)); mem[0] = x; mem[1] = y; mem[2] = z; #else int *mem = (int *)__builtin_alloca((x+y+z)*sizeof(int)); mem[0] = x; mem[1] = y; mem[2] = z; #endif } //////////////////////////////// // NOTE(allen): Overloaded Line Stepping static int function_get_integer(void){ return(1); } static void function_with_multiple_parameters(int x, int y){ x += y; } static int recursive_single_line(int x){ return(x <= 1?0:x + recursive_single_line(x/2)); } static int shared_1(int x) { return(x); } static int shared_2(int x) { return(1 + shared_1(x)); } static void overloaded_line_stepping_tests(void){ function_with_multiple_parameters(function_get_integer(), function_get_integer()); function_with_multiple_parameters(function_get_integer(), function_get_integer()); function_with_multiple_parameters(function_get_integer(), function_get_integer()); recursive_single_line(50); recursive_single_line(50); recursive_single_line(50); shared_2(5); shared_2(5); shared_2(5); function_get_integer(); shared_1(1); shared_1(2); if ((shared_2(10) && shared_2(-1)) || shared_2(function_get_integer())){ int x = 0; } else{ int y = 0; } } //////////////////////////////// // NOTE(allen): Long Jump Stepping #include static jmp_buf global_jump_buffer; static int global_jump_x; static void long_jump_from_function(void){ int spin = 0; for (; spin < 5; spin += 1); longjmp(global_jump_buffer, 2); global_jump_x = spin; } static void long_jump_wrapped_in_function(void){ global_jump_x = 0; int val = setjmp(global_jump_buffer); if (val == 0){ global_jump_x = 1; longjmp(global_jump_buffer, 1); } else if (val == 1){ if (global_jump_x == 1){ global_jump_x = 2; long_jump_from_function(); } } else if (val == 2){ global_jump_x = 3; } } static void long_jump_stepping_tests(void){ long_jump_wrapped_in_function(); long_jump_wrapped_in_function(); long_jump_wrapped_in_function(); } //////////////////////////////// // NOTE(allen): Recursion Stepping static int recursive_call(int x){ if (x <= 1){ return(x); } int r1 = recursive_call(x - 1); int r2 = recursive_call(x - 2); return(r1 + r2); } static int tail_recursive_call(int x, int m){ if (x <= 1){ return(m); } return(tail_recursive_call(x - 1, x*m)); } static void recursion_stepping_tests(void){ recursive_call(4); recursive_call(4); tail_recursive_call(5, 1); tail_recursive_call(5, 1); } //////////////////////////////// // NOTE(rjf): Debug Strings static void debug_string_tests(void) { #if _WIN32 for(int i = 0; i < 100; i += 1) { OutputDebugStringA("Hello, World!\n"); } #endif } //////////////////////////////// // NOTE(allen): Exception Stepping int *global_null_read_pointer = 0; static void trip(void){ *global_null_read_pointer = 0; } static void cpp_exception_in_function(void){ int v = 0; try{ throw 1; } catch (...){ v = 1; } } static void cpp_throw_in_function(void){ throw 1; } static void win32_exception_in_function(void){ #if _WIN32 int v = 0; __try{ trip(); v = 1; } __except (EXCEPTION_EXECUTE_HANDLER){ v = 2; } v = 3; __try{ trip(); v = 4; } __except (EXCEPTION_EXECUTE_HANDLER){ v = 5; } #endif } static void cpp_recursive_exception(int x){ try{ if (x > 1){ throw 1; } } catch (...){ x -= 1; cpp_recursive_exception(x); x += 1; } } static void win32_recursive_exception(int x){ #if _WIN32 __try{ if (x > 1){ throw 1; } } __except (EXCEPTION_EXECUTE_HANDLER){ x -= 1; win32_recursive_exception(x); x += 1; } #endif } static void exception_stepping_tests(void){ { int v = 0; try{ throw 1; } catch (...){ v = 1; } } { int v = 0; try{ cpp_throw_in_function(); } catch (...){ v = 1; } } cpp_exception_in_function(); cpp_exception_in_function(); #if _WIN32 win32_exception_in_function(); win32_exception_in_function(); #endif // NOTE(allen): Exception in catch tests { int v = 0; try{ v = 1; throw 1; } catch (...){ try{ v = 2; throw 2; } catch (...){ v = 3; } } } { int v = 0; try{ v = 1; throw 1; } catch (...){ cpp_exception_in_function(); } } #if _WIN32 { int v = 0; try{ v = 1; throw 1; } catch (...){ win32_exception_in_function(); } } #endif cpp_recursive_exception(4); cpp_recursive_exception(4); cpp_recursive_exception(4); #if _WIN32 win32_recursive_exception(4); win32_recursive_exception(4); win32_recursive_exception(4); #endif // NOTE(allen): Try in try tests { int v = 0; try{ try{ v = 1; throw 1; } catch (...){ v = 2; } throw 2; } catch (...){ v = 3; } } { int v = 0; try{ try{ v = 1; cpp_throw_in_function(); } catch (...){ v = 2; } throw 2; } catch (...){ v = 3; } } { int v = 0; try{ cpp_exception_in_function(); throw 2; } catch (...){ v = 3; } } #if _WIN32 { int v = 0; try{ win32_exception_in_function(); throw 2; } catch (...){ v = 3; } } #endif } typedef void (*callback_t)(int a); static void dynamic_step_test(void){ #if _WIN32 #if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( _M_AMD64 ) void *page = VirtualAlloc(0, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); char *ptr = (char*)page; *ptr++ = 0x51; // push rcx *ptr++ = 0x59; // pop rcx *ptr++ = 0xC3; // ret callback_t cb = (callback_t)page; cb(1); #endif #endif } //////////////////////////////// int mule_main(int argc, char** argv){ mule_init(); // NOTE(allen): Eval Tests type_coverage_eval_tests(); mutating_variables_eval_tests(); nested_types_eval_tests(); struct_parameters_eval_tests(); global_eval_tests(); return_eval_tests(); tls_eval_tests(); complicated_type_coverage_tests(); extended_type_coverage_eval_tests(); templated_function_eval_tests(); c_type_coverage_eval_tests(); c_type_with_bitfield_usage(); optimized_build_eval_tests(); optimized_struct_parameters_eval_tests(); fancy_viz_eval_tests(); // NOTE(allen): Stepping Tests control_flow_stepping_tests(); indirect_call_jump_stepping_tests(); alloca_stepping_tests(); inline_stepping_tests(); overloaded_line_stepping_tests(); overloaded_function(100); dynamic_step_test(); long_jump_stepping_tests(); recursion_stepping_tests(); debug_string_tests(); exception_stepping_tests(); return(0); }