forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package haxe;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import hl.NativeArray;
							 | 
						||
| 
								 | 
							
								import hl.Bytes;
							 | 
						||
| 
								 | 
							
								import haxe.CallStack.StackItem;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									Do not use manually.
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								@:dox(hide)
							 | 
						||
| 
								 | 
							
								@:noCompletion
							 | 
						||
| 
								 | 
							
								class NativeStackTrace {
							 | 
						||
| 
								 | 
							
									@:ifFeature('haxe.NativeStackTrace.exceptionStack')
							 | 
						||
| 
								 | 
							
									static public inline function saveStack(exception:Any):Void {
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "exception_stack")
							 | 
						||
| 
								 | 
							
									static public function exceptionStack():NativeArray<Bytes> {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									//TODO: implement in hashlink like `exceptionStack`
							 | 
						||
| 
								 | 
							
									static public function callStack():NativeArray<Bytes> {
							 | 
						||
| 
								 | 
							
										var stack:NativeArray<Bytes> = try {
							 | 
						||
| 
								 | 
							
											throw new Exception('', null, 'stack');
							 | 
						||
| 
								 | 
							
										} catch (e:Exception) {
							 | 
						||
| 
								 | 
							
											exceptionStack();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										var skip = 1;
							 | 
						||
| 
								 | 
							
										for(i in 0...stack.length - 1) {
							 | 
						||
| 
								 | 
							
											var s = @:privateAccess String.fromUCS2(stack[i]);
							 | 
						||
| 
								 | 
							
											if(s.indexOf('NativeStackTrace.callStack') < 0) {
							 | 
						||
| 
								 | 
							
												break;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											skip++;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return skip < stack.length ? stack.sub(skip, stack.length - skip) : stack;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static public function toHaxe(native:NativeArray<Bytes>, skip:Int = 0):Array<StackItem> {
							 | 
						||
| 
								 | 
							
										var stack = [];
							 | 
						||
| 
								 | 
							
										var r = ~/^([A-Za-z0-9.$_]+)\.([~A-Za-z0-9_]+(\.[0-9]+)?)\((.+):([0-9]+)\)$/;
							 | 
						||
| 
								 | 
							
										var r_fun = ~/^fun\$([0-9]+)\((.+):([0-9]+)\)$/;
							 | 
						||
| 
								 | 
							
										for (i in 0...native.length - 1) {
							 | 
						||
| 
								 | 
							
											if(skip > i) {
							 | 
						||
| 
								 | 
							
												continue;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											var str = @:privateAccess String.fromUCS2(native[i]);
							 | 
						||
| 
								 | 
							
											if (r.match(str))
							 | 
						||
| 
								 | 
							
												stack.push(FilePos(Method(r.matched(1), r.matched(2)), r.matched(4), Std.parseInt(r.matched(5))));
							 | 
						||
| 
								 | 
							
											else if (r_fun.match(str))
							 | 
						||
| 
								 | 
							
												stack.push(FilePos(LocalFunction(Std.parseInt(r_fun.matched(1))), r_fun.matched(2), Std.parseInt(r_fun.matched(3))));
							 | 
						||
| 
								 | 
							
											else
							 | 
						||
| 
								 | 
							
												stack.push(Module(str));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return stack;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |