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;
 | |
| 	}
 | |
| } |