60 lines
1.3 KiB
Haxe
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;
|
|
}
|
|
} |