From 7237c999918e44e2e76a6d2e2ae37ea709af08f6 Mon Sep 17 00:00:00 2001 From: physick Date: Tue, 28 Jul 2026 20:29:45 +0500 Subject: Added wren limiting fork support --- src/puzzles/puzzle.c | 22 +++++++++++++++------- src/puzzles/puzzle.h | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) (limited to 'src/puzzles') diff --git a/src/puzzles/puzzle.c b/src/puzzles/puzzle.c index fad3f00..11328a8 100644 --- a/src/puzzles/puzzle.c +++ b/src/puzzles/puzzle.c @@ -1,5 +1,7 @@ +#include "../resources/resources.h" #include "puzzle.h" #include "../wren_inter/wren_inter.h" +#include #include #include #include @@ -116,7 +118,7 @@ bool CheckResult(PuzzleIO *io, WrenVM *vm) { } } -enum PUZZLE_TEST_RESULT RunTest(Test *test, WrenVM *vm) { +enum PUZZLE_TEST_RESULT RunTest(Test *test, WrenVM *vm, size_t max_op) { wrenEnsureSlots(vm, test->argc + 1); // finction handle + arguments wrenGetVariable(vm, USER_MODULE_NAME, test->RecieverName, 0); @@ -136,14 +138,15 @@ enum PUZZLE_TEST_RESULT RunTest(Test *test, WrenVM *vm) { PutIOIntoSlot(i+1, &test->argv[i], vm); } - WrenInterpretResult call_result = wrenCall(vm, fn_handle); - + WrenInterpretResult call_result = wrenCallLim(vm, fn_handle, max_op); switch (call_result) { case WREN_RESULT_COMPILE_ERROR: return RESULT_COMPTIME_ERR; case WREN_RESULT_RUNTIME_ERROR: return RESULT_RUNTIME_ERR; + case WREN_RESULT_RUNTIME_LIMIT: + return RESULT_TIMEOUT; default: break; } @@ -160,8 +163,8 @@ enum PUZZLE_TEST_RESULT RunTest(Test *test, WrenVM *vm) { } // Returns the res ptr. Does not modify the address -SubmitionResult *TryEvaluateUserCode(WrenVM *vm, char *script, SubmitionResult *res) { - WrenInterpretResult result = wrenInterpret(vm, "main", script); +SubmitionResult *TryEvaluateUserCode(WrenVM *vm, char *script, SubmitionResult *res, size_t max_op) { + WrenInterpretResult result = wrenInterpretLim(vm, "main", script, max_op); res->result = RESULT_OK; switch (result) { case WREN_RESULT_COMPILE_ERROR: @@ -170,6 +173,10 @@ SubmitionResult *TryEvaluateUserCode(WrenVM *vm, char *script, SubmitionResult * case WREN_RESULT_RUNTIME_ERROR: res->result = RESULT_RUNTIME_ERR; return res; + case WREN_RESULT_RUNTIME_LIMIT: + res->result = RESULT_TIMEOUT; + printf("Timeout with max_op %zu\n", max_op); + return res; default: break; } return res; @@ -187,6 +194,7 @@ SubmitionResult *PrepareResult(SubmitionResult *self, } SubmitionResult *SubmitSolution(Puzzle *self, char *script) { + Config *cfg = GetConfig(); if (self == NULL || script == NULL) return NULL; SubmitionResult *res = malloc(sizeof(SubmitionResult)); @@ -196,13 +204,13 @@ SubmitionResult *SubmitSolution(Puzzle *self, char *script) { return res; } - res = TryEvaluateUserCode(vm, script, res); + res = TryEvaluateUserCode(vm, script, res, cfg->MaxOperations); if (res->result != RESULT_OK) { return PrepareResult(res, vm, res->result); } for (size_t i = 0; i < self->TestC; i++) { - enum PUZZLE_TEST_RESULT test_res = RunTest(&self->Tests[i], vm); + enum PUZZLE_TEST_RESULT test_res = RunTest(&self->Tests[i], vm, cfg->MaxOperations); switch (test_res) { case WREN_RESULT_COMPILE_ERROR: return PrepareResult(res, vm, RESULT_COMPTIME_ERR); diff --git a/src/puzzles/puzzle.h b/src/puzzles/puzzle.h index 28ab6ca..4dfd0f8 100644 --- a/src/puzzles/puzzle.h +++ b/src/puzzles/puzzle.h @@ -29,7 +29,7 @@ typedef struct { /// The user submitted code should be evaluated by this point. /// The entry point should be registered and the absence of the /// Main method signatire will be concidered an error -enum PUZZLE_TEST_RESULT RunTest(Test *test, WrenVM *vm); +enum PUZZLE_TEST_RESULT RunTest(Test *test, WrenVM *vm, size_t max_op); typedef struct { char *Name; -- cgit v1.3