|
@@ -415,6 +415,9 @@ type hxb_writer = {
|
|
docs : StringPool.t;
|
|
docs : StringPool.t;
|
|
mutable chunk : Chunk.t;
|
|
mutable chunk : Chunk.t;
|
|
|
|
|
|
|
|
+ mutable in_expr : bool;
|
|
|
|
+ mutable sig_deps : module_def list;
|
|
|
|
+
|
|
classes : (path,tclass) Pool.t;
|
|
classes : (path,tclass) Pool.t;
|
|
enums : (path,tenum) Pool.t;
|
|
enums : (path,tenum) Pool.t;
|
|
typedefs : (path,tdef) Pool.t;
|
|
typedefs : (path,tdef) Pool.t;
|
|
@@ -866,20 +869,28 @@ module HxbWriter = struct
|
|
|
|
|
|
(* References *)
|
|
(* References *)
|
|
|
|
|
|
|
|
+ let maybe_add_sig_dep writer m =
|
|
|
|
+ if not writer.in_expr && m.m_path <> writer.current_module.m_path && not (List.exists (fun m' -> m'.m_path = m.m_path) writer.sig_deps) then
|
|
|
|
+ writer.sig_deps <- m :: writer.sig_deps
|
|
|
|
+
|
|
let write_class_ref writer (c : tclass) =
|
|
let write_class_ref writer (c : tclass) =
|
|
let i = Pool.get_or_add writer.classes c.cl_path c in
|
|
let i = Pool.get_or_add writer.classes c.cl_path c in
|
|
|
|
+ maybe_add_sig_dep writer c.cl_module;
|
|
Chunk.write_uleb128 writer.chunk i
|
|
Chunk.write_uleb128 writer.chunk i
|
|
|
|
|
|
let write_enum_ref writer (en : tenum) =
|
|
let write_enum_ref writer (en : tenum) =
|
|
let i = Pool.get_or_add writer.enums en.e_path en in
|
|
let i = Pool.get_or_add writer.enums en.e_path en in
|
|
|
|
+ maybe_add_sig_dep writer en.e_module;
|
|
Chunk.write_uleb128 writer.chunk i
|
|
Chunk.write_uleb128 writer.chunk i
|
|
|
|
|
|
let write_typedef_ref writer (td : tdef) =
|
|
let write_typedef_ref writer (td : tdef) =
|
|
let i = Pool.get_or_add writer.typedefs td.t_path td in
|
|
let i = Pool.get_or_add writer.typedefs td.t_path td in
|
|
|
|
+ maybe_add_sig_dep writer td.t_module;
|
|
Chunk.write_uleb128 writer.chunk i
|
|
Chunk.write_uleb128 writer.chunk i
|
|
|
|
|
|
let write_abstract_ref writer (a : tabstract) =
|
|
let write_abstract_ref writer (a : tabstract) =
|
|
let i = Pool.get_or_add writer.abstracts a.a_path a in
|
|
let i = Pool.get_or_add writer.abstracts a.a_path a in
|
|
|
|
+ maybe_add_sig_dep writer a.a_module;
|
|
Chunk.write_uleb128 writer.chunk i
|
|
Chunk.write_uleb128 writer.chunk i
|
|
|
|
|
|
let write_tmono_ref writer (mono : tmono) =
|
|
let write_tmono_ref writer (mono : tmono) =
|
|
@@ -1785,15 +1796,21 @@ module HxbWriter = struct
|
|
| Some e when not write_expr_immediately ->
|
|
| Some e when not write_expr_immediately ->
|
|
Chunk.write_u8 writer.chunk 2;
|
|
Chunk.write_u8 writer.chunk 2;
|
|
let fctx,close = start_texpr writer e.epos in
|
|
let fctx,close = start_texpr writer e.epos in
|
|
|
|
+ let old = writer.in_expr in
|
|
|
|
+ writer.in_expr <- true;
|
|
write_texpr writer fctx e;
|
|
write_texpr writer fctx e;
|
|
Chunk.write_option writer.chunk cf.cf_expr_unoptimized (write_texpr writer fctx);
|
|
Chunk.write_option writer.chunk cf.cf_expr_unoptimized (write_texpr writer fctx);
|
|
|
|
+ writer.in_expr <- old;
|
|
let expr_chunk = close() in
|
|
let expr_chunk = close() in
|
|
Some expr_chunk
|
|
Some expr_chunk
|
|
| Some e ->
|
|
| Some e ->
|
|
Chunk.write_u8 writer.chunk 1;
|
|
Chunk.write_u8 writer.chunk 1;
|
|
let fctx,close = start_texpr writer e.epos in
|
|
let fctx,close = start_texpr writer e.epos in
|
|
|
|
+ let old = writer.in_expr in
|
|
|
|
+ writer.in_expr <- true;
|
|
write_texpr writer fctx e;
|
|
write_texpr writer fctx e;
|
|
Chunk.write_option writer.chunk cf.cf_expr_unoptimized (write_texpr writer fctx);
|
|
Chunk.write_option writer.chunk cf.cf_expr_unoptimized (write_texpr writer fctx);
|
|
|
|
+ writer.in_expr <- old;
|
|
let expr_pre_chunk,expr_chunk = close() in
|
|
let expr_pre_chunk,expr_chunk = close() in
|
|
Chunk.export_data expr_pre_chunk writer.chunk;
|
|
Chunk.export_data expr_pre_chunk writer.chunk;
|
|
Chunk.export_data expr_chunk writer.chunk;
|
|
Chunk.export_data expr_chunk writer.chunk;
|
|
@@ -2240,6 +2257,19 @@ module HxbWriter = struct
|
|
end
|
|
end
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ (* Note: this is only a start, and is still including a lot of dependencies *)
|
|
|
|
+ (* that are not actually needed for signature only. *)
|
|
|
|
+ let sig_deps = ref PMap.empty in
|
|
|
|
+ PMap.iter (fun id mdep -> match mdep.md_origin with
|
|
|
|
+ | MDepFromMacro -> sig_deps := PMap.add id mdep !sig_deps;
|
|
|
|
+ | _ -> ()
|
|
|
|
+ ) m.m_extra.m_deps;
|
|
|
|
+ List.iter (fun mdep ->
|
|
|
|
+ let dep = {md_sign = mdep.m_extra.m_sign; md_path = mdep.m_path; md_kind = mdep.m_extra.m_kind; md_origin = MDepFromTyping} in
|
|
|
|
+ sig_deps := PMap.add mdep.m_id dep !sig_deps;
|
|
|
|
+ ) writer.sig_deps;
|
|
|
|
+ m.m_extra.m_sig_deps <- Some !sig_deps;
|
|
|
|
+
|
|
start_chunk writer EOT;
|
|
start_chunk writer EOT;
|
|
start_chunk writer EOF;
|
|
start_chunk writer EOF;
|
|
start_chunk writer EOM;
|
|
start_chunk writer EOM;
|
|
@@ -2277,6 +2307,8 @@ let create config string_pool warn anon_id =
|
|
chunks = DynArray.create ();
|
|
chunks = DynArray.create ();
|
|
cp = cp;
|
|
cp = cp;
|
|
has_own_string_pool;
|
|
has_own_string_pool;
|
|
|
|
+ sig_deps = [];
|
|
|
|
+ in_expr = false;
|
|
docs = StringPool.create ();
|
|
docs = StringPool.create ();
|
|
chunk = Obj.magic ();
|
|
chunk = Obj.magic ();
|
|
classes = Pool.create ();
|
|
classes = Pool.create ();
|