From 0ebf4e12777721d56ec04d2d7ce6654ba1db2b23 Mon Sep 17 00:00:00 2001 From: Michel Hermier Date: Thu, 19 Jul 2018 18:04:15 +0200 Subject: [PATCH 1/3] Add me to AUTHORS. --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 4b29cd09..c43b1427 100644 --- a/AUTHORS +++ b/AUTHORS @@ -23,3 +23,4 @@ Kyle Charters Marshall Bowers Michal Kozakiewicz Charlotte Koch +Michel Hermier From 051e224ce6c2a362923918a167a58d1545bef205 Mon Sep 17 00:00:00 2001 From: Michel Hermier Date: Thu, 19 Jul 2018 17:57:51 +0200 Subject: [PATCH 2/3] De-inline wrenHasError. Move fiber error detection inside a function instead of using inlined version everywhere. --- src/vm/wren_core.c | 6 +++--- src/vm/wren_value.h | 5 +++++ src/vm/wren_vm.c | 18 +++++++++--------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c index ff037f9b..eaeb64de 100644 --- a/src/vm/wren_core.c +++ b/src/vm/wren_core.c @@ -81,7 +81,7 @@ static bool runFiber(WrenVM* vm, ObjFiber* fiber, Value* args, bool isCall, bool hasValue, const char* verb) { - if (!IS_NULL(fiber->error)) + if (wrenHasError(fiber)) { RETURN_ERROR_FMT("Cannot $ an aborted fiber.", verb); } @@ -154,7 +154,7 @@ DEF_PRIMITIVE(fiber_error) DEF_PRIMITIVE(fiber_isDone) { ObjFiber* runFiber = AS_FIBER(args[0]); - RETURN_BOOL(runFiber->numFrames == 0 || !IS_NULL(runFiber->error)); + RETURN_BOOL(runFiber->numFrames == 0 || wrenHasError(runFiber)); } DEF_PRIMITIVE(fiber_suspend) @@ -187,7 +187,7 @@ DEF_PRIMITIVE(fiber_try) runFiber(vm, AS_FIBER(args[0]), args, true, false, "try"); // If we're switching to a valid fiber to try, remember that we're trying it. - if (IS_NULL(vm->fiber->error)) vm->fiber->state = FIBER_TRY; + if (!wrenHasError(vm->fiber)) vm->fiber->state = FIBER_TRY; return false; } diff --git a/src/vm/wren_value.h b/src/vm/wren_value.h index bdc6ed19..59531230 100644 --- a/src/vm/wren_value.h +++ b/src/vm/wren_value.h @@ -657,6 +657,11 @@ static inline void wrenAppendCallFrame(WrenVM* vm, ObjFiber* fiber, // Ensures [fiber]'s stack has at least [needed] slots. void wrenEnsureStack(WrenVM* vm, ObjFiber* fiber, int needed); +static inline bool wrenHasError(const ObjFiber* fiber) +{ + return !IS_NULL(fiber->error); +} + ObjForeign* wrenNewForeign(WrenVM* vm, ObjClass* classObj, size_t size); // Creates a new empty function. Before being used, it must have code, diff --git a/src/vm/wren_vm.c b/src/vm/wren_vm.c index d1a7784b..9b01c4df 100644 --- a/src/vm/wren_vm.c +++ b/src/vm/wren_vm.c @@ -388,7 +388,7 @@ static void callForeign(WrenVM* vm, ObjFiber* fiber, // handles the error. If none do, tells the VM to stop. static void runtimeError(WrenVM* vm) { - ASSERT(!IS_NULL(vm->fiber->error), "Should only call this after an error."); + ASSERT(wrenHasError(vm->fiber), "Should only call this after an error."); ObjFiber* current = vm->fiber; Value error = current->error; @@ -601,7 +601,7 @@ static void createClass(WrenVM* vm, int numFields, ObjModule* module) vm->fiber->stackTop--; vm->fiber->error = validateSuperclass(vm, name, superclass, numFields); - if (!IS_NULL(vm->fiber->error)) return; + if (wrenHasError(vm->fiber)) return; ObjClass* classObj = wrenNewClass(vm, AS_CLASS(superclass), numFields, AS_STRING(name)); @@ -1003,14 +1003,14 @@ static WrenInterpretResult runInterpreter(WrenVM* vm, register ObjFiber* fiber) // If we don't have a fiber to switch to, stop interpreting. fiber = vm->fiber; if (fiber == NULL) return WREN_RESULT_SUCCESS; - if (!IS_NULL(fiber->error)) RUNTIME_ERROR(); + if (wrenHasError(fiber)) RUNTIME_ERROR(); LOAD_FRAME(); } break; case METHOD_FOREIGN: callForeign(vm, fiber, method->as.foreign, numArgs); - if (!IS_NULL(fiber->error)) RUNTIME_ERROR(); + if (wrenHasError(fiber)) RUNTIME_ERROR(); break; case METHOD_BLOCK: @@ -1232,14 +1232,14 @@ static WrenInterpretResult runInterpreter(WrenVM* vm, register ObjFiber* fiber) CASE_CODE(CLASS): { createClass(vm, READ_BYTE(), NULL); - if (!IS_NULL(fiber->error)) RUNTIME_ERROR(); + if (wrenHasError(fiber)) RUNTIME_ERROR(); DISPATCH(); } CASE_CODE(FOREIGN_CLASS): { createClass(vm, -1, fn->module); - if (!IS_NULL(fiber->error)) RUNTIME_ERROR(); + if (wrenHasError(fiber)) RUNTIME_ERROR(); DISPATCH(); } @@ -1250,7 +1250,7 @@ static WrenInterpretResult runInterpreter(WrenVM* vm, register ObjFiber* fiber) ObjClass* classObj = AS_CLASS(PEEK()); Value method = PEEK2(); bindMethod(vm, instruction, symbol, fn->module, classObj, method); - if (!IS_NULL(fiber->error)) RUNTIME_ERROR(); + if (wrenHasError(fiber)) RUNTIME_ERROR(); DROP(); DROP(); DISPATCH(); @@ -1270,7 +1270,7 @@ static WrenInterpretResult runInterpreter(WrenVM* vm, register ObjFiber* fiber) // imported module's closure in the slot in case a GC happens when // invoking the closure. PUSH(importModule(vm, fn->constants.data[READ_SHORT()])); - if (!IS_NULL(fiber->error)) RUNTIME_ERROR(); + if (wrenHasError(fiber)) RUNTIME_ERROR(); // If we get a closure, call it to execute the module body. if (IS_CLOSURE(PEEK())) @@ -1295,7 +1295,7 @@ static WrenInterpretResult runInterpreter(WrenVM* vm, register ObjFiber* fiber) Value variable = fn->constants.data[READ_SHORT()]; ASSERT(vm->lastModule != NULL, "Should have already imported module."); Value result = getModuleVariable(vm, vm->lastModule, variable); - if (!IS_NULL(fiber->error)) RUNTIME_ERROR(); + if (wrenHasError(fiber)) RUNTIME_ERROR(); PUSH(result); DISPATCH(); From fe57c1eea076eeb7a62fb8be6ccf0b2b10f2aa33 Mon Sep 17 00:00:00 2001 From: Michel Hermier Date: Wed, 25 Jul 2018 11:58:50 +0200 Subject: [PATCH 3/3] Trivial: wren_core.wren.inc needs to be regenerated. --- src/vm/wren_core.wren.inc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/vm/wren_core.wren.inc b/src/vm/wren_core.wren.inc index 63d6648f..1feda8c9 100644 --- a/src/vm/wren_core.wren.inc +++ b/src/vm/wren_core.wren.inc @@ -239,15 +239,10 @@ static const char* coreModuleSource = " }\n" "\n" " trim() { trim_(\"\t\r\n \", true, true) }\n" -"\n" " trim(chars) { trim_(chars, true, true) }\n" -"\n" " trimEnd() { trim_(\"\t\r\n \", false, true) }\n" -"\n" " trimEnd(chars) { trim_(chars, false, true) }\n" -"\n" " trimStart() { trim_(\"\t\r\n \", true, false) }\n" -"\n" " trimStart(chars) { trim_(chars, true, false) }\n" "\n" " trim_(chars, trimStart, trimEnd) {\n" @@ -256,7 +251,6 @@ static const char* coreModuleSource = " }\n" "\n" " var codePoints = chars.codePoints.toList\n" -"// System.print(\"code points %(codePoints)\")\n" "\n" " var start\n" " if (trimStart) {\n" @@ -274,12 +268,10 @@ static const char* coreModuleSource = " end = byteCount_ - 1\n" " while (end >= start) {\n" " var codePoint = codePointAt_(end)\n" -"// System.print(\"test %(end) : %(codePoint)\")\n" " if (codePoint != -1 && !codePoints.contains(codePoint)) break\n" " end = end - 1\n" " }\n" "\n" -"// System.print(\"range %(start) %(end)\")\n" " if (end < start) return \"\"\n" " } else {\n" " end = -1\n"