diff --git a/Toy b/Toy index 50d03e2..67fce42 160000 --- a/Toy +++ b/Toy @@ -1 +1 @@ -Subproject commit 50d03e28fc4ab1b7b6194006a7bbbb210f8aa19f +Subproject commit 67fce427ebb0fc0d1a02d8fc62c624518222242d diff --git a/box/box_engine.c b/box/box_engine.c index 95cbb7d..c448b32 100644 --- a/box/box_engine.c +++ b/box/box_engine.c @@ -460,8 +460,11 @@ void Box_execEngine() { SDL_RenderClear(engine.renderer); //NOTE: This line can be disabled later Dbg_stopTimer(&dbgTimer); - Dbg_startTimer(&dbgTimer, "draw screen"); + Dbg_startTimer(&dbgTimer, "onDraw() calls"); Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onDraw", NULL); + Dbg_stopTimer(&dbgTimer); + + Dbg_startTimer(&dbgTimer, "render screen"); SDL_RenderPresent(engine.renderer); Dbg_stopTimer(&dbgTimer); } diff --git a/box/dbg_profiler.c b/box/dbg_profiler.c index 757d858..340d939 100644 --- a/box/dbg_profiler.c +++ b/box/dbg_profiler.c @@ -66,7 +66,6 @@ void Dbg_clearConsole() void Dbg_initTimer(Dbg_Timer* timer) { timer->name = NULL; timer->start = 0; - timer->log = TOY_ALLOCATE(char, 2048); memset(timer->log, 0, 2048); timer->logPos = 0; } @@ -87,13 +86,12 @@ void Dbg_printTimerLog(Dbg_Timer* timer) { } void Dbg_freeTimer(Dbg_Timer* timer) { - TOY_FREE_ARRAY(char, timer->log, 2048); + // } void Dbg_initFPSCounter(Dbg_FPSCounter* counter) { counter->count = 0; counter->start = clock(); - counter->log = TOY_ALLOCATE(char, 256); memset(counter->log, 0, 256); } @@ -112,5 +110,5 @@ void Dbg_printFPSCounter(Dbg_FPSCounter* counter) { } void Dbg_freeFPSCounter(Dbg_FPSCounter* counter) { - TOY_FREE_ARRAY(char, counter->log, 256); + // } \ No newline at end of file diff --git a/box/dbg_profiler.h b/box/dbg_profiler.h index 92c9f7b..7cd9309 100644 --- a/box/dbg_profiler.h +++ b/box/dbg_profiler.h @@ -7,7 +7,7 @@ void Dbg_clearConsole(); typedef struct Dbg_Timer { const char* name; clock_t start; - char* log; + char log[2048]; int logPos; } Dbg_Timer; @@ -20,7 +20,7 @@ void Dbg_freeTimer(Dbg_Timer*); typedef struct Dbg_FPSCounter { int count; clock_t start; - char* log; + char log[256]; } Dbg_FPSCounter; void Dbg_initFPSCounter(Dbg_FPSCounter*); diff --git a/box/lib_standard.c b/box/lib_standard.c index 4514446..2a348b1 100644 --- a/box/lib_standard.c +++ b/box/lib_standard.c @@ -1471,8 +1471,13 @@ static void recursiveLiteralQuicksortUtil(Toy_Interpreter* interpreter, Toy_Lite swapLiteralsUtil(&ptr[runner], &ptr[literalCount - 1]); //recurse on each end - recursiveLiteralQuicksortUtil(interpreter, &ptr[0], runner, fnCompareLiteral); - recursiveLiteralQuicksortUtil(interpreter, &ptr[runner + 1], literalCount - runner - 1, fnCompareLiteral); + if (runner > 0) { + recursiveLiteralQuicksortUtil(interpreter, &ptr[0], runner, fnCompareLiteral); + } + + if (runner < literalCount) { + recursiveLiteralQuicksortUtil(interpreter, &ptr[runner + 1], literalCount - runner - 1, fnCompareLiteral); + } } static int nativeSort(Toy_Interpreter* interpreter, Toy_LiteralArray* arguments) { @@ -1511,8 +1516,34 @@ static int nativeSort(Toy_Interpreter* interpreter, Toy_LiteralArray* arguments) return -1; } + //BUGFIX: check if the array is already sorted + bool sorted = true; + for (int checker = 0; checker < TOY_AS_ARRAY(selfLiteral)->count - 1 && sorted; checker++) { + Toy_LiteralArray arguments; + Toy_LiteralArray returns; + + Toy_initLiteralArray(&arguments); + Toy_initLiteralArray(&returns); + + Toy_pushLiteralArray(&arguments, TOY_AS_ARRAY(selfLiteral)->literals[checker]); + Toy_pushLiteralArray(&arguments, TOY_AS_ARRAY(selfLiteral)->literals[checker + 1]); + + Toy_callLiteralFn(interpreter, fnLiteral, &arguments, &returns); + + Toy_Literal lessThan = Toy_popLiteralArray(&returns); + + Toy_freeLiteralArray(&arguments); + Toy_freeLiteralArray(&returns); + + if (!TOY_IS_TRUTHY(lessThan)) { + sorted = false; + } + + Toy_freeLiteral(lessThan); + } + //call the quicksort util - if (TOY_IS_ARRAY(selfLiteral)) { + if (!sorted) { recursiveLiteralQuicksortUtil(interpreter, TOY_AS_ARRAY(selfLiteral)->literals, TOY_AS_ARRAY(selfLiteral)->count, fnLiteral); }