aboutsummaryrefslogtreecommitdiff
path: root/gramlib/grammar.ml
diff options
context:
space:
mode:
authorEmilio Jesus Gallego Arias2020-07-15 17:33:04 +0200
committerEmilio Jesus Gallego Arias2020-07-16 15:54:31 +0200
commit4a4d35baf47944f4d30bd10de7e71f46f17da8f2 (patch)
tree1375055cc0dcda8de90072f98678d1d25c684200 /gramlib/grammar.ml
parentf54bc666c62ad9a66067cb486816cdfc68c2946d (diff)
[gramlib] Remove legacy located exception wrapper in favor of standard infrastructure.
The old wrapper was basically unused, this PR also fixes backtraces in some class of bugs such as https://github.com/coq/coq/issues/12695
Diffstat (limited to 'gramlib/grammar.ml')
-rw-r--r--gramlib/grammar.ml22
1 files changed, 15 insertions, 7 deletions
diff --git a/gramlib/grammar.ml b/gramlib/grammar.ml
index d6951fff6d..83c158e057 100644
--- a/gramlib/grammar.ml
+++ b/gramlib/grammar.ml
@@ -1548,12 +1548,21 @@ module Parsable = struct
Stream.Failure ->
let loc = get_loc () in
restore ();
- Ploc.raise loc (Stream.Error ("illegal begin of " ^ entry.ename))
+ Loc.raise ~loc (Stream.Error ("illegal begin of " ^ entry.ename))
| Stream.Error _ as exc ->
- let loc = get_loc () in restore (); Ploc.raise loc exc
+ let loc = get_loc () in restore ();
+ Loc.raise ~loc exc
| exc ->
+ let exc,info = Exninfo.capture exc in
let loc = Stream.count cs, Stream.count cs + 1 in
- restore (); Ploc.raise (Ploc.make_unlined loc) exc
+ restore ();
+ (* If the original exn had a loc, keep it *)
+ let info =
+ match Loc.get_loc info with
+ | Some _ -> info
+ | None -> Loc.add_loc info (Ploc.make_unlined loc)
+ in
+ Exninfo.iraise (exc,info)
let parse_parsable e p =
L.State.set !(p.lexer_state);
@@ -1561,11 +1570,10 @@ module Parsable = struct
let c = parse_parsable e p in
p.lexer_state := L.State.get ();
c
- with Ploc.Exc (loc,e) ->
+ with exn ->
+ let exn,info = Exninfo.capture exn in
L.State.drop ();
- let loc' = Loc.get_loc (Exninfo.info e) in
- let loc = match loc' with None -> loc | Some loc -> loc in
- Loc.raise ~loc e
+ Exninfo.iraise (exn,info)
let make ?loc cs =
let lexer_state = ref (L.State.init ()) in