Merge pull request #1 from mopp/support_otp21
Support Erlang/OTP 21
diff --git a/rebar.config b/rebar.config
index c475d40..8333493 100644
--- a/rebar.config
+++ b/rebar.config
@@ -36,6 +36,6 @@
[
{test,
[
- {plugins, [rebar_covertool]}
+ {plugins, [covertool]}
]}
]}.
diff --git a/src/passage_pd.erl b/src/passage_pd.erl
index 2f39821..960f2b1 100644
--- a/src/passage_pd.erl
+++ b/src/passage_pd.erl
@@ -54,6 +54,16 @@
%%------------------------------------------------------------------------------
-define(ANCESTORS_KEY, passage_span_ancestors).
+-ifdef('OTP_RELEASE').
+%% The 'OTP_RELEASE' macro introduced at OTP-21,
+%% so we can use it for detecting whether the Erlang compiler supports new try/catch syntax or not.
+-define(CAPTURE_STACKTRACE, :__StackTrace).
+-define(GET_STACKTRACE, __StackTrace).
+-else.
+-define(CAPTURE_STACKTRACE, ).
+-define(GET_STACKTRACE, erlang:get_stacktrace()).
+-endif.
+
%%------------------------------------------------------------------------------
%% Exported Types
%%------------------------------------------------------------------------------
@@ -135,8 +145,8 @@
start_span(OperationName, Options),
Fun()
catch
- Class:Error ->
- Stack = erlang:get_stacktrace(),
+ Class:Error ?CAPTURE_STACKTRACE ->
+ Stack = ?GET_STACKTRACE,
log(#{?LOG_FIELD_ERROR_KIND => Class,
?LOG_FIELD_MESSAGE => Error,
?LOG_FIELD_STACK => Stack},
diff --git a/src/passage_transform.erl b/src/passage_transform.erl
index 80dc844..c412d48 100644
--- a/src/passage_transform.erl
+++ b/src/passage_transform.erl
@@ -361,10 +361,10 @@
make_catch_clauses(Line, _) ->
ClassVar = make_var(Line, "__Class"),
ErrorVar = make_var(Line, "__Error"),
- GetStrackTrace = make_call_remote(Line, erlang, get_stacktrace, []),
+ {StackTraceVar, GetStrackTrace} = make_stacktrace(Line),
[
{clause, Line,
- [{tuple, Line, [ClassVar, ErrorVar, {var, Line, '_'}]}],
+ [{tuple, Line, [ClassVar, ErrorVar, StackTraceVar]}],
[],
[
make_error_log(
@@ -378,3 +378,21 @@
]
}
].
+
+-ifdef('OTP_RELEASE').
+
+-spec make_stacktrace(line()) -> {expr_var(), expr_var()}.
+make_stacktrace(Line) ->
+ StackTraceVar = make_var(Line, "__StackTrace"),
+ GetStrackTrace = StackTraceVar,
+ {StackTraceVar, GetStrackTrace}.
+
+-else.
+
+-spec make_stacktrace(line()) -> {expr_var(), expr_call_remote()}.
+make_stacktrace(Line) ->
+ StackTraceVar = {var, Line, '_'},
+ GetStrackTrace = make_call_remote(Line, erlang, get_stacktrace, []),
+ {StackTraceVar, GetStrackTrace}.
+
+-endif.