69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package haxe; | ||
|  | 
 | ||
|  | import flash.errors.Error; | ||
|  | import haxe.CallStack.StackItem; | ||
|  | 
 | ||
|  | /** | ||
|  | 	Do not use manually. | ||
|  | **/ | ||
|  | @:dox(hide) | ||
|  | @:noCompletion | ||
|  | @:allow(haxe.Exception) | ||
|  | class NativeStackTrace { | ||
|  | 	@:ifFeature('haxe.NativeStackTrace.exceptionStack') | ||
|  | 	static public inline function saveStack(e:Any):Void { | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static public inline function callStack():String { | ||
|  | 		return normalize(new Error().getStackTrace(), 1); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static public function exceptionStack():String { | ||
|  | 		var err:Null<Error> = untyped flash.Boot.lastError; | ||
|  | 		return err == null ? '' : normalize(err.getStackTrace()); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static public function toHaxe(native:String, skip:Int = 0):Array<StackItem> { | ||
|  | 		var a = new Array(); | ||
|  | 		var r = ~/at ([^\/]+?)\$?(\/[^\(]+)?\(\)(\[(.*?):([0-9]+)\])?/; | ||
|  | 		var rlambda = ~/^MethodInfo-([0-9]+)$/g; | ||
|  | 		var cnt = 0; | ||
|  | 		while (r.match(native)) { | ||
|  | 			native = r.matchedRight(); | ||
|  | 			if(skip > cnt++) { | ||
|  | 				continue; | ||
|  | 			} | ||
|  | 			var cl = r.matched(1).split("::").join("."); | ||
|  | 			var meth = r.matched(2); | ||
|  | 			var item; | ||
|  | 			if (meth == null) { | ||
|  | 				if (rlambda.match(cl)) | ||
|  | 					item = LocalFunction(Std.parseInt(rlambda.matched(1))); | ||
|  | 				else | ||
|  | 					item = Method(cl, "new"); | ||
|  | 			} else | ||
|  | 				item = Method(cl, meth.substring(1)); | ||
|  | 			if (r.matched(3) != null) | ||
|  | 				item = FilePos(item, r.matched(4), Std.parseInt(r.matched(5))); | ||
|  | 			a.push(item); | ||
|  | 		} | ||
|  | 		return a; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function normalize(stack:String, skipItems:Int = 0):String { | ||
|  | 		switch (stack:String).substring(0, 6) { | ||
|  | 			case 'Error:' | 'Error\n': skipItems += 1; | ||
|  | 			case _: | ||
|  | 		} | ||
|  | 		return skipLines(stack, skipItems); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function skipLines(stack:String, skip:Int, pos:Int = 0):String { | ||
|  | 		return if(skip > 0) { | ||
|  | 			pos = stack.indexOf('\n', pos); | ||
|  | 			return pos < 0 ? '' : skipLines(stack, --skip, pos + 1); | ||
|  | 		} else { | ||
|  | 			return stack.substring(pos); | ||
|  | 		} | ||
|  | 	} | ||
|  | } |