NativeStackTrace.hx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package haxe;
  2. import java.NativeArray;
  3. import java.lang.ThreadLocal;
  4. import java.lang.Throwable;
  5. import java.lang.Thread;
  6. import java.lang.StackTraceElement;
  7. import haxe.CallStack.StackItem;
  8. /**
  9. Do not use manually.
  10. **/
  11. @:dox(hide)
  12. @:noCompletion
  13. class NativeStackTrace {
  14. static var exception = new ThreadLocal<Throwable>();
  15. @:ifFeature('haxe.NativeStackTrace.exceptionStack')
  16. static public inline function saveStack(e:Throwable):Void {
  17. exception.set(e);
  18. }
  19. static public function callStack():NativeArray<StackTraceElement> {
  20. var stack = Thread.currentThread().getStackTrace();
  21. return stack.length <= 3 ? stack : java.util.Arrays.copyOfRange(stack, 3, stack.length);
  22. }
  23. static public function exceptionStack():NativeArray<StackTraceElement> {
  24. return switch exception.get() {
  25. case null: new NativeArray(0);
  26. case e: e.getStackTrace();
  27. }
  28. }
  29. static public function toHaxe(native:NativeArray<StackTraceElement>, skip:Int = 0):Array<StackItem> {
  30. var stack = [];
  31. for (i in 0...native.length) {
  32. if(skip > i) {
  33. continue;
  34. }
  35. var el = native[i];
  36. var className = el.getClassName();
  37. var methodName = el.getMethodName();
  38. var fileName = el.getFileName();
  39. var lineNumber = el.getLineNumber();
  40. var method = Method(className, methodName);
  41. if (fileName != null || lineNumber >= 0) {
  42. stack.push(FilePos(method, fileName, lineNumber));
  43. } else {
  44. stack.push(method);
  45. }
  46. }
  47. return stack;
  48. }
  49. }