58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package haxe;
 | 
						|
 | 
						|
import hl.NativeArray;
 | 
						|
import hl.Bytes;
 | 
						|
import haxe.CallStack.StackItem;
 | 
						|
 | 
						|
/**
 | 
						|
	Do not use manually.
 | 
						|
**/
 | 
						|
@:dox(hide)
 | 
						|
@:noCompletion
 | 
						|
class NativeStackTrace {
 | 
						|
	@:ifFeature('haxe.NativeStackTrace.exceptionStack')
 | 
						|
	static public inline function saveStack(exception:Any):Void {
 | 
						|
	}
 | 
						|
 | 
						|
	@:hlNative("std", "exception_stack")
 | 
						|
	static public function exceptionStack():NativeArray<Bytes> {
 | 
						|
		return null;
 | 
						|
	}
 | 
						|
 | 
						|
	//TODO: implement in hashlink like `exceptionStack`
 | 
						|
	static public function callStack():NativeArray<Bytes> {
 | 
						|
		var stack:NativeArray<Bytes> = try {
 | 
						|
			throw new Exception('', null, 'stack');
 | 
						|
		} catch (e:Exception) {
 | 
						|
			exceptionStack();
 | 
						|
		}
 | 
						|
		var skip = 1;
 | 
						|
		for(i in 0...stack.length - 1) {
 | 
						|
			var s = @:privateAccess String.fromUCS2(stack[i]);
 | 
						|
			if(s.indexOf('NativeStackTrace.callStack') < 0) {
 | 
						|
				break;
 | 
						|
			}
 | 
						|
			skip++;
 | 
						|
		}
 | 
						|
		return skip < stack.length ? stack.sub(skip, stack.length - skip) : stack;
 | 
						|
	}
 | 
						|
 | 
						|
	static public function toHaxe(native:NativeArray<Bytes>, skip:Int = 0):Array<StackItem> {
 | 
						|
		var stack = [];
 | 
						|
		var r = ~/^([A-Za-z0-9.$_]+)\.([~A-Za-z0-9_]+(\.[0-9]+)?)\((.+):([0-9]+)\)$/;
 | 
						|
		var r_fun = ~/^fun\$([0-9]+)\((.+):([0-9]+)\)$/;
 | 
						|
		for (i in 0...native.length - 1) {
 | 
						|
			if(skip > i) {
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			var str = @:privateAccess String.fromUCS2(native[i]);
 | 
						|
			if (r.match(str))
 | 
						|
				stack.push(FilePos(Method(r.matched(1), r.matched(2)), r.matched(4), Std.parseInt(r.matched(5))));
 | 
						|
			else if (r_fun.match(str))
 | 
						|
				stack.push(FilePos(LocalFunction(Std.parseInt(r_fun.matched(1))), r_fun.matched(2), Std.parseInt(r_fun.matched(3))));
 | 
						|
			else
 | 
						|
				stack.push(Module(str));
 | 
						|
		}
 | 
						|
		return stack;
 | 
						|
	}
 | 
						|
} |