|
@@ -36,6 +36,34 @@ enum StackItem {
|
|
Get informations about the call stack.
|
|
Get informations about the call stack.
|
|
**/
|
|
**/
|
|
class CallStack {
|
|
class CallStack {
|
|
|
|
+ #if js
|
|
|
|
+ static var lastException:js.Error;
|
|
|
|
+
|
|
|
|
+ static function getStack(e:js.Error):Array<StackItem> {
|
|
|
|
+ // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
|
|
|
|
+ var oldValue = (untyped Error).prepareStackTrace;
|
|
|
|
+ (untyped Error).prepareStackTrace = function (error, callsites :Array<Dynamic>) {
|
|
|
|
+ var stack = [];
|
|
|
|
+ for (site in callsites) {
|
|
|
|
+ var method = null;
|
|
|
|
+ var fullName :String = site.getFunctionName();
|
|
|
|
+ if (fullName != null) {
|
|
|
|
+ var idx = fullName.lastIndexOf(".");
|
|
|
|
+ if (idx >= 0) {
|
|
|
|
+ var className = fullName.substr(0, idx);
|
|
|
|
+ var methodName = fullName.substr(idx+1);
|
|
|
|
+ method = Method(className, methodName);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ stack.push(FilePos(method, site.getFileName(), site.getLineNumber()));
|
|
|
|
+ }
|
|
|
|
+ return stack;
|
|
|
|
+ }
|
|
|
|
+ var a = makeStack(e.stack);
|
|
|
|
+ (untyped Error).prepareStackTrace = oldValue;
|
|
|
|
+ return a;
|
|
|
|
+ }
|
|
|
|
+ #end
|
|
|
|
|
|
/**
|
|
/**
|
|
Return the call stack elements, or an empty array if not available.
|
|
Return the call stack elements, or an empty array if not available.
|
|
@@ -55,33 +83,14 @@ class CallStack {
|
|
var s:Array<String> = untyped __global__.__hxcpp_get_call_stack(true);
|
|
var s:Array<String> = untyped __global__.__hxcpp_get_call_stack(true);
|
|
return makeStack(s);
|
|
return makeStack(s);
|
|
#elseif js
|
|
#elseif js
|
|
- // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
|
|
|
|
- var oldValue = (untyped Error).prepareStackTrace;
|
|
|
|
- (untyped Error).prepareStackTrace = function (error, callsites :Array<Dynamic>) {
|
|
|
|
- var stack = [];
|
|
|
|
- for (site in callsites) {
|
|
|
|
- var method = null;
|
|
|
|
- var fullName :String = site.getFunctionName();
|
|
|
|
- if (fullName != null) {
|
|
|
|
- var idx = fullName.lastIndexOf(".");
|
|
|
|
- if (idx >= 0) {
|
|
|
|
- var className = fullName.substr(0, idx);
|
|
|
|
- var methodName = fullName.substr(idx+1);
|
|
|
|
- method = Method(className, methodName);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- stack.push(FilePos(method, site.getFileName(), site.getLineNumber()));
|
|
|
|
- }
|
|
|
|
- return stack;
|
|
|
|
- }
|
|
|
|
try {
|
|
try {
|
|
- throw untyped __new__("Error");
|
|
|
|
|
|
+ throw new js.Error();
|
|
} catch( e : Dynamic ) {
|
|
} catch( e : Dynamic ) {
|
|
- var a = makeStack(e.stack);
|
|
|
|
- if( a != null ) a.shift(); // remove Stack.callStack()
|
|
|
|
- (untyped Error).prepareStackTrace = oldValue;
|
|
|
|
|
|
+ var a = getStack(e);
|
|
|
|
+ a.shift(); // remove Stack.callStack()
|
|
return a;
|
|
return a;
|
|
}
|
|
}
|
|
|
|
+
|
|
#elseif java
|
|
#elseif java
|
|
var stack = [];
|
|
var stack = [];
|
|
for ( el in java.lang.Thread.currentThread().getStackTrace() ) {
|
|
for ( el in java.lang.Thread.currentThread().getStackTrace() ) {
|
|
@@ -178,6 +187,8 @@ class CallStack {
|
|
stack.push(FilePos(null, elem._1, elem._2));
|
|
stack.push(FilePos(null, elem._1, elem._2));
|
|
}
|
|
}
|
|
return stack;
|
|
return stack;
|
|
|
|
+ #elseif js
|
|
|
|
+ return untyped __define_feature__("haxe.CallStack.exceptionStack", getStack(lastException));
|
|
#else
|
|
#else
|
|
return []; // Unsupported
|
|
return []; // Unsupported
|
|
#end
|
|
#end
|