69 lines
1.7 KiB
Haxe
69 lines
1.7 KiB
Haxe
package haxe;
|
|
|
|
import flash.errors.Error;
|
|
import haxe.CallStack.StackItem;
|
|
|
|
/**
|
|
Do not use manually.
|
|
**/
|
|
@:dox(hide)
|
|
@:noCompletion
|
|
@:allow(haxe.Exception)
|
|
class NativeStackTrace {
|
|
@:ifFeature('haxe.NativeStackTrace.exceptionStack')
|
|
static public inline function saveStack(e:Any):Void {
|
|
}
|
|
|
|
static public inline function callStack():String {
|
|
return normalize(new Error().getStackTrace(), 1);
|
|
}
|
|
|
|
static public function exceptionStack():String {
|
|
var err:Null<Error> = untyped flash.Boot.lastError;
|
|
return err == null ? '' : normalize(err.getStackTrace());
|
|
}
|
|
|
|
static public function toHaxe(native:String, skip:Int = 0):Array<StackItem> {
|
|
var a = new Array();
|
|
var r = ~/at ([^\/]+?)\$?(\/[^\(]+)?\(\)(\[(.*?):([0-9]+)\])?/;
|
|
var rlambda = ~/^MethodInfo-([0-9]+)$/g;
|
|
var cnt = 0;
|
|
while (r.match(native)) {
|
|
native = r.matchedRight();
|
|
if(skip > cnt++) {
|
|
continue;
|
|
}
|
|
var cl = r.matched(1).split("::").join(".");
|
|
var meth = r.matched(2);
|
|
var item;
|
|
if (meth == null) {
|
|
if (rlambda.match(cl))
|
|
item = LocalFunction(Std.parseInt(rlambda.matched(1)));
|
|
else
|
|
item = Method(cl, "new");
|
|
} else
|
|
item = Method(cl, meth.substring(1));
|
|
if (r.matched(3) != null)
|
|
item = FilePos(item, r.matched(4), Std.parseInt(r.matched(5)));
|
|
a.push(item);
|
|
}
|
|
return a;
|
|
}
|
|
|
|
static function normalize(stack:String, skipItems:Int = 0):String {
|
|
switch (stack:String).substring(0, 6) {
|
|
case 'Error:' | 'Error\n': skipItems += 1;
|
|
case _:
|
|
}
|
|
return skipLines(stack, skipItems);
|
|
}
|
|
|
|
static function skipLines(stack:String, skip:Int, pos:Int = 0):String {
|
|
return if(skip > 0) {
|
|
pos = stack.indexOf('\n', pos);
|
|
return pos < 0 ? '' : skipLines(stack, --skip, pos + 1);
|
|
} else {
|
|
return stack.substring(pos);
|
|
}
|
|
}
|
|
} |