51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package haxe;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import haxe.CallStack.StackItem;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private typedef NativeTrace = {
							 | 
						||
| 
								 | 
							
									final skip:Int;
							 | 
						||
| 
								 | 
							
									final stack:Dynamic;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									Do not use manually.
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								@:dox(hide)
							 | 
						||
| 
								 | 
							
								@:noCompletion
							 | 
						||
| 
								 | 
							
								class NativeStackTrace {
							 | 
						||
| 
								 | 
							
									@:ifFeature('haxe.NativeStackTrace.exceptionStack')
							 | 
						||
| 
								 | 
							
									static public inline function saveStack(exception:Any):Void {
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static public inline function callStack():NativeTrace {
							 | 
						||
| 
								 | 
							
										return { skip:1, stack:untyped __dollar__callstack() };
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static public function exceptionStack():NativeTrace {
							 | 
						||
| 
								 | 
							
										return { skip:0, stack:untyped __dollar__excstack() };
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static public function toHaxe(native:NativeTrace, skip:Int = 0):Array<StackItem> {
							 | 
						||
| 
								 | 
							
										skip += native.skip;
							 | 
						||
| 
								 | 
							
										var a = new Array();
							 | 
						||
| 
								 | 
							
										var l = untyped __dollar__asize(native.stack);
							 | 
						||
| 
								 | 
							
										var i = 0;
							 | 
						||
| 
								 | 
							
										while (i < l) {
							 | 
						||
| 
								 | 
							
											var x = native.stack[l - i - 1];
							 | 
						||
| 
								 | 
							
											//skip all CFunctions until we skip required amount of hx entries
							 | 
						||
| 
								 | 
							
											if(x == null && skip > i) {
							 | 
						||
| 
								 | 
							
												skip++;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											if(skip > i++) {
							 | 
						||
| 
								 | 
							
												continue;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											if (x == null)
							 | 
						||
| 
								 | 
							
												a.push(CFunction);
							 | 
						||
| 
								 | 
							
											else if (untyped __dollar__typeof(x) == __dollar__tstring)
							 | 
						||
| 
								 | 
							
												a.push(Module(new String(x)));
							 | 
						||
| 
								 | 
							
											else
							 | 
						||
| 
								 | 
							
												a.push(FilePos(null, new String(untyped x[0]), untyped x[1]));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return a;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |