forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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; | ||
|  | 	} | ||
|  | } |