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