60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package haxe;
 | |
| 
 | |
| import haxe.CallStack.StackItem;
 | |
| import cs.system.diagnostics.StackTrace;
 | |
| 
 | |
| /**
 | |
| 	Do not use manually.
 | |
| **/
 | |
| @:dox(hide)
 | |
| @:noCompletion
 | |
| class NativeStackTrace {
 | |
| 	@:meta(System.ThreadStaticAttribute)
 | |
| 	static var exception:Null<cs.system.Exception>;
 | |
| 
 | |
| 	@:ifFeature('haxe.NativeStackTrace.exceptionStack')
 | |
| 	static public inline function saveStack(e:Any):Void {
 | |
| 		exception = e;
 | |
| 	}
 | |
| 
 | |
| 	static public inline function callStack():StackTrace {
 | |
| 		return new StackTrace(1, true);
 | |
| 	}
 | |
| 
 | |
| 	static public function exceptionStack():Null<StackTrace> {
 | |
| 		return switch exception {
 | |
| 			case null: null;
 | |
| 			case e: new StackTrace(e, true);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	static public function toHaxe(native:Null<StackTrace>, skip:Int = 0):Array<StackItem> {
 | |
| 		var stack = [];
 | |
| 		if(native == null) {
 | |
| 			return stack;
 | |
| 		}
 | |
| 		var cnt = 0;
 | |
| 		for (i in 0...native.FrameCount) {
 | |
| 			var frame = native.GetFrame(i);
 | |
| 			var m = frame.GetMethod();
 | |
| 
 | |
| 			if (m == null) {
 | |
| 				continue;
 | |
| 			}
 | |
| 			if(skip > cnt++) {
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			var method = StackItem.Method(m.ReflectedType.ToString(), m.Name);
 | |
| 
 | |
| 			var fileName = frame.GetFileName();
 | |
| 			var lineNumber = frame.GetFileLineNumber();
 | |
| 
 | |
| 			if (fileName != null || lineNumber >= 0)
 | |
| 				stack.push(FilePos(method, fileName, lineNumber));
 | |
| 			else
 | |
| 				stack.push(method);
 | |
| 		}
 | |
| 		return stack;
 | |
| 	}
 | |
| } |