summaryrefslogtreecommitdiff
path: root/src/puzzles/puzzle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/puzzles/puzzle.c')
-rw-r--r--src/puzzles/puzzle.c22
1 files changed, 15 insertions, 7 deletions
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wren.h>
@@ -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);