Skip to content

Commit 8d71c28

Browse files
authored
flambda-backend: Port upstream's #12260 (#2067)
1 parent 447c324 commit 8d71c28

File tree

3 files changed

+22
-10
lines changed

3 files changed

+22
-10
lines changed

testsuite/tests/tool-toplevel/topeval.compilers.reference

+3
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,7 @@ val _bar : ('a, 'b) A.t -> 'a option = <fun>
77
- : string = ""
88
- : char = 'd'
99
- : float = 42.
10+
external foo : int -> int -> int = "%addint"
11+
module S = String
12+
val x : int = 42
1013

testsuite/tests/tool-toplevel/topeval.ml

+7
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ let List.(String.(_)) = 'd'
4646
let List.(_) : float = 42.0
4747
;;
4848

49+
(* issue #12257: external or module alias followed by regular value triggers
50+
an exception in ocamlnat *)
51+
external foo : int -> int -> int = "%addint"
52+
module S = String
53+
let x = 42
54+
;;
55+
4956
(* Check that frametables are correctly loaded by triggering GC *)
5057
let () =
5158
Gc.minor ();

toplevel/native/topeval.ml

+12-10
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,17 @@ let global_symbol comp_unit =
3939

4040
let remembered = ref Ident.empty
4141

42-
let rec remember phrase_name i = function
43-
| [] -> ()
44-
| Sig_value (id, _, _) :: rest
45-
| Sig_module (id, _, _, _, _) :: rest
46-
| Sig_typext (id, _, _, _) :: rest
47-
| Sig_class (id, _, _, _) :: rest ->
48-
remembered := Ident.add id (phrase_name, i) !remembered;
49-
remember phrase_name (succ i) rest
50-
| _ :: rest -> remember phrase_name i rest
42+
let remember phrase_name signature =
43+
let exported = List.filter Includemod.is_runtime_component signature in
44+
List.iteri (fun i sg ->
45+
match sg with
46+
| Sig_value (id, _, _)
47+
| Sig_module (id, _, _, _, _)
48+
| Sig_typext (id, _, _, _)
49+
| Sig_class (id, _, _, _) ->
50+
remembered := Ident.add id (phrase_name, i) !remembered
51+
| _ -> ())
52+
exported
5153

5254
let toplevel_value id =
5355
try Ident.find_same id !remembered
@@ -210,7 +212,7 @@ let execute_phrase print_outcome ppf phr =
210212
Translmod.transl_implementation phrase_comp_unit (str, Tcoerce_none)
211213
~style:Plain_block
212214
in
213-
remember compilation_unit 0 sg';
215+
remember compilation_unit sg';
214216
compilation_unit, close_phrase res, required_globals, size
215217
else
216218
let size, res = Translmod.transl_store_phrases phrase_comp_unit str in

0 commit comments

Comments
 (0)