51 lines
1.2 KiB
Haxe
51 lines
1.2 KiB
Haxe
|
package haxe;
|
||
|
|
||
|
import haxe.CallStack.StackItem;
|
||
|
|
||
|
private typedef NativeTrace = {
|
||
|
final skip:Int;
|
||
|
final stack:Dynamic;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Do not use manually.
|
||
|
**/
|
||
|
@:dox(hide)
|
||
|
@:noCompletion
|
||
|
class NativeStackTrace {
|
||
|
@:ifFeature('haxe.NativeStackTrace.exceptionStack')
|
||
|
static public inline function saveStack(exception:Any):Void {
|
||
|
}
|
||
|
|
||
|
static public inline function callStack():NativeTrace {
|
||
|
return { skip:1, stack:untyped __dollar__callstack() };
|
||
|
}
|
||
|
|
||
|
static public function exceptionStack():NativeTrace {
|
||
|
return { skip:0, stack:untyped __dollar__excstack() };
|
||
|
}
|
||
|
|
||
|
static public function toHaxe(native:NativeTrace, skip:Int = 0):Array<StackItem> {
|
||
|
skip += native.skip;
|
||
|
var a = new Array();
|
||
|
var l = untyped __dollar__asize(native.stack);
|
||
|
var i = 0;
|
||
|
while (i < l) {
|
||
|
var x = native.stack[l - i - 1];
|
||
|
//skip all CFunctions until we skip required amount of hx entries
|
||
|
if(x == null && skip > i) {
|
||
|
skip++;
|
||
|
}
|
||
|
if(skip > i++) {
|
||
|
continue;
|
||
|
}
|
||
|
if (x == null)
|
||
|
a.push(CFunction);
|
||
|
else if (untyped __dollar__typeof(x) == __dollar__tstring)
|
||
|
a.push(Module(new String(x)));
|
||
|
else
|
||
|
a.push(FilePos(null, new String(untyped x[0]), untyped x[1]));
|
||
|
}
|
||
|
return a;
|
||
|
}
|
||
|
}
|