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