Skip to content

Commit 5f3f54d

Browse files
authored
fix(compiler): Correct parsetree caching behaviour (#2280)
1 parent 37a64f9 commit 5f3f54d

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

compiler/src/parsing/driver.re

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,24 @@ let parse_program_for_syntax_error = (~name=?, lexbuf, source) => {
110110
let cached_parsetrees = Hashtbl.create(64);
111111
let reset = () => Hashtbl.clear(cached_parsetrees);
112112

113-
let get_cached_parsetree = name => {
114-
Option.fold(~none=None, ~some=Hashtbl.find_opt(cached_parsetrees), name);
113+
let get_cached_parsetree = (name, source) => {
114+
switch (
115+
Option.fold(~none=None, ~some=Hashtbl.find_opt(cached_parsetrees), name)
116+
) {
117+
| Some((cached_source, cached_program))
118+
when cached_source == Hashtbl.hash(source) =>
119+
Some(cached_program)
120+
| _ => None
121+
};
122+
};
123+
124+
let add_cached_parsetree = (name, source, program) => {
125+
Hashtbl.add(cached_parsetrees, name, (Hashtbl.hash(source), program));
115126
};
116127

117128
let parse = (~name=?, lexbuf, source): Parsetree.parsed_program => {
118-
switch (get_cached_parsetree(name)) {
129+
let source = source();
130+
switch (get_cached_parsetree(name, source)) {
119131
| Some(cached) => cached
120132
| None =>
121133
Sedlexing.set_position(lexbuf, Location.start_pos);
@@ -133,7 +145,6 @@ let parse = (~name=?, lexbuf, source): Parsetree.parsed_program => {
133145
| Parser.Error =>
134146
// Fast parse failed, so now we do a slow, thoughtful parse to produce a
135147
// good error message.
136-
let source = source();
137148
ignore @@
138149
parse_program_for_syntax_error(
139150
~name?,
@@ -144,7 +155,7 @@ let parse = (~name=?, lexbuf, source): Parsetree.parsed_program => {
144155
failwith("Impossible: Program with syntax error raised no error");
145156
};
146157
switch (name) {
147-
| Some(name) => Hashtbl.add(cached_parsetrees, name, program)
158+
| Some(name) => add_cached_parsetree(name, source, program)
148159
| None => ()
149160
};
150161
program;

0 commit comments

Comments
 (0)