From 03182b1ed660af00706325e092e398a484bf97a6 Mon Sep 17 00:00:00 2001 From: Simon Krajewski Date: Fri, 19 Jan 2024 19:36:28 +0100 Subject: [PATCH] start working on delayed expression reading see #11498 --- src/compiler/hxb/hxbReader.ml | 34 ++++++++++++++++++++++++------ src/compiler/hxb/hxbReaderApi.ml | 1 + src/compiler/hxb/hxbWriter.ml | 3 ++- src/compiler/server.ml | 3 +++ src/context/display/displayJson.ml | 3 +++ src/typing/typeloadModule.ml | 8 +++---- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/compiler/hxb/hxbReader.ml b/src/compiler/hxb/hxbReader.ml index 6bf854cc279..3179b70ad4d 100644 --- a/src/compiler/hxb/hxbReader.ml +++ b/src/compiler/hxb/hxbReader.ml @@ -1612,15 +1612,35 @@ class hxb_reader method read_exd = ignore(self#read_list (fun () -> let c = self#read_class_ref in - self#select_class_type_parameters c; self#read_list (fun () -> let cf = self#read_field_ref in - field_type_parameters <- List.assq cf awful; - field_type_parameter_offset <- 0; - let fctx = self#start_texpr in - let e,e_unopt = self#read_expression fctx in - cf.cf_expr <- Some e; - cf.cf_expr_unoptimized <- e_unopt + let length = read_uleb128 ch in + let bytes = read_bytes ch length in + let ch_cf = BytesWithPosition.create bytes in + let read_expressions () = + self#select_class_type_parameters c; + field_type_parameters <- List.assq cf awful; + field_type_parameter_offset <- 0; + let old = ch in + ch <- ch_cf; + let fctx = self#start_texpr in + let e,e_unopt = self#read_expression fctx in + ch <- old; + cf.cf_expr <- Some e; + cf.cf_expr_unoptimized <- e_unopt; + in + if true || api#read_expression_eagerly cf then + read_expressions () + else begin + let t = cf.cf_type in + let r = ref (lazy_available t) in + r := lazy_wait (fun() -> + r := lazy_available t; + read_expressions (); + t + ); + cf.cf_type <- TLazy r + end ) )) diff --git a/src/compiler/hxb/hxbReaderApi.ml b/src/compiler/hxb/hxbReaderApi.ml index 4803015008d..f488fc37f1c 100644 --- a/src/compiler/hxb/hxbReaderApi.ml +++ b/src/compiler/hxb/hxbReaderApi.ml @@ -7,4 +7,5 @@ class virtual hxb_reader_api = object(self) method virtual resolve_type : string list -> string -> string -> module_type method virtual basic_types : basic_types method virtual get_var_id : int -> int + method virtual read_expression_eagerly : tclass_field -> bool end diff --git a/src/compiler/hxb/hxbWriter.ml b/src/compiler/hxb/hxbWriter.ml index 10a52d64088..405dfaa0141 100644 --- a/src/compiler/hxb/hxbWriter.ml +++ b/src/compiler/hxb/hxbWriter.ml @@ -2083,7 +2083,8 @@ module HxbWriter = struct write_class_ref writer c; Chunk.write_list writer.chunk l (fun (cf,ref_kind,e) -> write_field_ref writer c ref_kind cf; - Chunk.export_data e writer.chunk + let bytes = Chunk.get_bytes e in + Chunk.write_bytes_length_prefixed writer.chunk bytes; ) ) end; diff --git a/src/compiler/server.ml b/src/compiler/server.ml index 2f74c131f06..acd846a575e 100644 --- a/src/compiler/server.ml +++ b/src/compiler/server.ml @@ -454,6 +454,9 @@ class hxb_reader_api_server method get_var_id (i : int) = i + + method read_expression_eagerly (cf : tclass_field) = + false (* TODO: Check this please Rudy! *) end let handle_cache_bound_objects com cbol = diff --git a/src/context/display/displayJson.ml b/src/context/display/displayJson.ml index d8f58b6d9aa..c7a4e4e4cdf 100644 --- a/src/context/display/displayJson.ml +++ b/src/context/display/displayJson.ml @@ -143,6 +143,9 @@ class hxb_reader_api_com method get_var_id (i : int) = i + + method read_expression_eagerly (cf : tclass_field) = + false end let find_module ~(headers_only : bool) com cc path = diff --git a/src/typing/typeloadModule.ml b/src/typing/typeloadModule.ml index 0a1eb8e6329..ba3fc30ca1f 100644 --- a/src/typing/typeloadModule.ml +++ b/src/typing/typeloadModule.ml @@ -799,6 +799,9 @@ class hxb_reader_api_typeload let uid = fst alloc_var' in incr uid; !uid + + method read_expression_eagerly (cf : tclass_field) = + ctx.com.is_macro_context end let rec load_hxb_module ctx path p = @@ -811,10 +814,7 @@ let rec load_hxb_module ctx path p = delay ctx PBuildClass (fun () -> ignore(read EOT); delay ctx PConnectField (fun () -> - ignore(read EOF); - delay ctx PTypeField (fun () -> - ignore(read EOM) - ) + ignore(read EOM); ); ); m