Prechádzať zdrojové kódy

start working on delayed expression reading

see #11498
Simon Krajewski 1 rok pred
rodič
commit
03182b1ed6

+ 27 - 7
src/compiler/hxb/hxbReader.ml

@@ -1612,15 +1612,35 @@ class hxb_reader
 	method read_exd =
 	method read_exd =
 		ignore(self#read_list (fun () ->
 		ignore(self#read_list (fun () ->
 			let c = self#read_class_ref in
 			let c = self#read_class_ref in
-			self#select_class_type_parameters c;
 			self#read_list (fun () ->
 			self#read_list (fun () ->
 				let cf = self#read_field_ref in
 				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
 			)
 			)
 		))
 		))
 
 

+ 1 - 0
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 resolve_type : string list -> string -> string -> module_type
 	method virtual basic_types : basic_types
 	method virtual basic_types : basic_types
 	method virtual get_var_id : int -> int
 	method virtual get_var_id : int -> int
+	method virtual read_expression_eagerly : tclass_field -> bool
 end
 end

+ 2 - 1
src/compiler/hxb/hxbWriter.ml

@@ -2083,7 +2083,8 @@ module HxbWriter = struct
 					write_class_ref writer c;
 					write_class_ref writer c;
 					Chunk.write_list writer.chunk l (fun (cf,ref_kind,e) ->
 					Chunk.write_list writer.chunk l (fun (cf,ref_kind,e) ->
 						write_field_ref writer c ref_kind cf;
 						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;
 		end;

+ 3 - 0
src/compiler/server.ml

@@ -454,6 +454,9 @@ class hxb_reader_api_server
 
 
 	method get_var_id (i : int) =
 	method get_var_id (i : int) =
 		i
 		i
+
+	method read_expression_eagerly (cf : tclass_field) =
+		false (* TODO: Check this please Rudy! *)
 end
 end
 
 
 let handle_cache_bound_objects com cbol =
 let handle_cache_bound_objects com cbol =

+ 3 - 0
src/context/display/displayJson.ml

@@ -143,6 +143,9 @@ class hxb_reader_api_com
 
 
 	method get_var_id (i : int) =
 	method get_var_id (i : int) =
 		i
 		i
+
+	method read_expression_eagerly (cf : tclass_field) =
+		false
 end
 end
 
 
 let find_module ~(headers_only : bool) com cc path =
 let find_module ~(headers_only : bool) com cc path =

+ 4 - 4
src/typing/typeloadModule.ml

@@ -799,6 +799,9 @@ class hxb_reader_api_typeload
 		let uid = fst alloc_var' in
 		let uid = fst alloc_var' in
 		incr uid;
 		incr uid;
 		!uid
 		!uid
+
+	method read_expression_eagerly (cf : tclass_field) =
+		ctx.com.is_macro_context
 end
 end
 
 
 let rec load_hxb_module ctx path p =
 let rec load_hxb_module ctx path p =
@@ -811,10 +814,7 @@ let rec load_hxb_module ctx path p =
 			delay ctx PBuildClass (fun () ->
 			delay ctx PBuildClass (fun () ->
 				ignore(read EOT);
 				ignore(read EOT);
 				delay ctx PConnectField (fun () ->
 				delay ctx PConnectField (fun () ->
-					ignore(read EOF);
-					delay ctx PTypeField (fun () ->
-						ignore(read EOM)
-					)
+					ignore(read EOM);
 				);
 				);
 			);
 			);
 			m
 			m