rough error checking in AsyncEmbeddedScript2

This commit is contained in:
2023-09-20 20:41:37 -06:00
parent 81a3d279c4
commit f11b2155ad

View File

@@ -13,6 +13,7 @@ using tink.MacroApi;
#end
import haxe.CallStack;
import kiss.Kiss;
using kiss.Kiss;
import kiss.ReaderExp;
@@ -239,11 +240,14 @@ class AsyncEmbeddedScript2 {
} else {
() -> {};
}
if (hscriptInstructions.exists(instructionPointer)) {
runHscriptInstruction(instructionPointer, skipping, continuation);
} else {
instructions[instructionPointer](this, skipping, continuation);
}
runWithErrorChecking(() -> {
if (hscriptInstructions.exists(instructionPointer)) {
runHscriptInstruction(instructionPointer, skipping, continuation);
} else {
instructions[instructionPointer](this, skipping, continuation);
}
});
if (tryCallNextWithTailRecursion) {
nextCalledWithTailRecursion = true;
@@ -292,6 +296,57 @@ class AsyncEmbeddedScript2 {
public var printCurrentInstruction = true;
public function runWithErrorChecking(process:Void->Void) {
try {
process();
} catch (e:haxe.Exception) {
Prelude.print("ERROR STACK:");
logStack(e.stack);
Prelude.print("ERROR MESSAGE:");
Prelude.printStr(e.message);
if (onError != null) {
onError(e);
}
#if (sys || hxnodejs)
Sys.exit(1);
#end
throw e;
}
}
function logStack(c:CallStack):Void {
var lastFilePos = "";
var consecutiveCalls = 0;
var nextFrame = null;
for (idx in 0... c.length) {
switch (nextFrame = c.get(idx)) {
case null:
break;
case FilePos(s, file, line, column):
var filePos = '${file}:${line}';
if (column != null) filePos += ':${column}';
if (filePos == lastFilePos) {
++consecutiveCalls;
} else {
if (lastFilePos.length > 0) {
Prelude.print('${lastFilePos} x ${consecutiveCalls}');
}
consecutiveCalls = 1;
}
lastFilePos = filePos;
default:
Prelude.print(nextFrame);
}
}
if (lastFilePos.length > 0) {
Prelude.print('${lastFilePos} x ${consecutiveCalls}');
}
}
public var onError:Any->Void;
#if macro
public static function build(dslHaxelib:String, dslFile:String, scriptFile:String):Array<Field> {
// trace('AsyncEmbeddedScript.build $dslHaxelib $dslFile $scriptFile');
@@ -351,6 +406,18 @@ class AsyncEmbeddedScript2 {
}
};
// Or if you're subclassing this before implementing your script, add this macro to the subclass dsl:
// (defMacro makeCC [&body b]
// `->:Void [] (runWithErrorChecking ->:Void {,@b}))
k.macros["makeCC"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
var b = wholeExp.expBuilder();
b.callSymbol("lambda", [b.list([]),
b.callSymbol("runWithErrorChecking", [
b.callSymbol("lambda", [b.list([])].concat(args))
])]);
};
if (dslHaxelib.length > 0) {
dslFile = Path.join([Helpers.libPath(dslHaxelib), dslFile]);
}