LNXSDK/Kha/Tools/macos/std/cs/_std/haxe/NativeStackTrace.hx
2025-01-22 16:18:30 +01:00

60 lines
1.3 KiB
Haxe

package haxe;
import haxe.CallStack.StackItem;
import cs.system.diagnostics.StackTrace;
/**
Do not use manually.
**/
@:dox(hide)
@:noCompletion
class NativeStackTrace {
@:meta(System.ThreadStaticAttribute)
static var exception:Null<cs.system.Exception>;
@:ifFeature('haxe.NativeStackTrace.exceptionStack')
static public inline function saveStack(e:Any):Void {
exception = e;
}
static public inline function callStack():StackTrace {
return new StackTrace(1, true);
}
static public function exceptionStack():Null<StackTrace> {
return switch exception {
case null: null;
case e: new StackTrace(e, true);
}
}
static public function toHaxe(native:Null<StackTrace>, skip:Int = 0):Array<StackItem> {
var stack = [];
if(native == null) {
return stack;
}
var cnt = 0;
for (i in 0...native.FrameCount) {
var frame = native.GetFrame(i);
var m = frame.GetMethod();
if (m == null) {
continue;
}
if(skip > cnt++) {
continue;
}
var method = StackItem.Method(m.ReflectedType.ToString(), m.Name);
var fileName = frame.GetFileName();
var lineNumber = frame.GetFileLineNumber();
if (fileName != null || lineNumber >= 0)
stack.push(FilePos(method, fileName, lineNumber));
else
stack.push(method);
}
return stack;
}
}