Skip to content

Commit 7421f67

Browse files
LimitEpsiloncristianoc
authored andcommitted
use value_description for figuring out raise
The original code matched the name of the function to possible names of "raise functions" to figure out if the "apply expression" is actually a "raise expression". This is undesirable, as various versions of OCaml has different names for raise. For example, "Pervasives.raise" now translates to "Stdlib!.Pervasives.raise". This commit utilizes the value_description field to figure out if the function is a "raise" or not. This pattern-matching format is also utilized in OCaml's typecore.ml : https://github.com/ocaml/ocaml/blob/98392895940cc1c18534280ae001b70fa5bf24c2/typing/typecore.ml#L2358
1 parent c91bd83 commit 7421f67

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

src/Exception.ml

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -249,13 +249,18 @@ let traverseAst () =
249249
case.c_guard |> iterExprOpt self;
250250
case.c_rhs |> iterExpr self)
251251
in
252-
let isRaise s =
253-
s = "Pervasives.raise"
254-
|| s = "Pervasives.raise_notrace"
255-
|| s = "Stdlib.raise"
256-
|| s = "Stdlib.raise_notrace"
257-
|| s = "Stdlib.Pervasives.raise"
258-
|| s = "Stdlib.Pervasives.raise_notrace"
252+
let isRaise : CL.Types.value_description -> bool = function
253+
| {
254+
val_kind =
255+
Val_prim
256+
{
257+
prim_name =
258+
( "%raise" | "%reraise" | "%raise_notrace"
259+
| "%raise_with_backtrace" );
260+
};
261+
} ->
262+
true
263+
| _ -> false
259264
in
260265
let raiseArgs args =
261266
match args with
@@ -279,12 +284,12 @@ let traverseAst () =
279284
let oldEvents = !currentEvents in
280285
if isDoesNoRaise then currentEvents := [];
281286
(match expr.exp_desc with
282-
| Texp_ident (callee_, _, _) ->
287+
| Texp_ident (callee_, _, val_desc) ->
283288
let callee =
284289
callee_ |> Common.Path.fromPathT |> ModulePath.resolveAlias
285290
in
286291
let calleeName = callee |> Common.Path.toString in
287-
if calleeName |> isRaise then
292+
if val_desc |> isRaise then
288293
Log_.warning ~loc ~name:"Exception Analysis" (fun ppf () ->
289294
Format.fprintf ppf
290295
"@{<info>%s@} can be analyzed only if called directly" calleeName);
@@ -297,25 +302,24 @@ let traverseAst () =
297302
:: !currentEvents
298303
| Texp_apply
299304
( {exp_desc = Texp_ident (atat, _, _)},
300-
[(_lbl1, Some {exp_desc = Texp_ident (callee, _, _)}); arg] )
305+
[(_lbl1, Some {exp_desc = Texp_ident (_, _, val_desc)}); arg] )
301306
when (* raise @@ Exn(...) *)
302307
atat |> CL.Path.name = "Pervasives.@@"
303-
&& callee |> CL.Path.name |> isRaise ->
308+
&& val_desc |> isRaise ->
304309
let exceptions = [arg] |> raiseArgs in
305310
currentEvents := {Event.exceptions; loc; kind = Raises} :: !currentEvents;
306311
arg |> snd |> iterExprOpt self
307312
| Texp_apply
308313
( {exp_desc = Texp_ident (atat, _, _)},
309-
[arg; (_lbl1, Some {exp_desc = Texp_ident (callee, _, _)})] )
314+
[arg; (_lbl1, Some {exp_desc = Texp_ident (_, _, val_desc)})] )
310315
when (* Exn(...) |> raise *)
311316
atat |> CL.Path.name = "Pervasives.|>"
312-
&& callee |> CL.Path.name |> isRaise ->
317+
&& val_desc |> isRaise ->
313318
let exceptions = [arg] |> raiseArgs in
314319
currentEvents := {Event.exceptions; loc; kind = Raises} :: !currentEvents;
315320
arg |> snd |> iterExprOpt self
316-
| Texp_apply (({exp_desc = Texp_ident (callee, _, _)} as e), args) ->
317-
let calleeName = CL.Path.name callee in
318-
if calleeName |> isRaise then
321+
| Texp_apply (({exp_desc = Texp_ident (_, _, val_desc)} as e), args) ->
322+
if val_desc |> isRaise then
319323
let exceptions = args |> raiseArgs in
320324
currentEvents :=
321325
{Event.exceptions; loc; kind = Raises} :: !currentEvents

0 commit comments

Comments
 (0)