Pārlūkot izejas kodu

don't write type parameter length twice

Simon Krajewski 1 gadu atpakaļ
vecāks
revīzija
a4f4efb7f1
2 mainītis faili ar 22 papildinājumiem un 19 dzēšanām
  1. 5 4
      src/compiler/hxb/hxbReader.ml
  2. 17 15
      src/compiler/hxb/hxbWriter.ml

+ 5 - 4
src/compiler/hxb/hxbReader.ml

@@ -823,7 +823,6 @@ class hxb_reader
 			mk_type_param c host None None
 		) in
 		f a;
-		let l = read_uleb128 ch in
 		for i = 0 to l - 1 do
 			let meta = self#read_metadata in
 			let constraints = self#read_types in
@@ -1311,13 +1310,15 @@ class hxb_reader
 		in
 		loop (read_uleb128 ch) (cf :: cf.cf_overloads);
 
-	method read_class_fields (c : tclass) =
-		begin match c.cl_kind with
+	method select_class_type_parameters (c: tclass) =
+		match c.cl_kind with
 		| KAbstractImpl a ->
 			type_type_parameters <- Array.of_list a.a_params
 		| _ ->
 			type_type_parameters <- Array.of_list c.cl_params
-		end;
+
+	method read_class_fields (c : tclass) =
+		self#select_class_type_parameters c;
 		let _ = self#read_option (fun f ->
 			let cf = Option.get c.cl_constructor in
 			self#read_class_field_and_overloads_data cf

+ 17 - 15
src/compiler/hxb/hxbWriter.ml

@@ -1615,15 +1615,20 @@ class hxb_writer
 
 	(* Fields *)
 
-	method write_type_parameter_forward ttp =
-		self#write_path ttp.ttp_class.cl_path;
-		self#write_pos ttp.ttp_class.cl_name_pos
-
-	method write_type_parameter_data ttp =
-		let c = ttp.ttp_class in
-		self#write_metadata c.cl_meta;
-		self#write_types (get_constraints ttp);
-		Chunk.write_option chunk ttp.ttp_default self#write_type_instance
+	method write_type_parameters (ttps : typed_type_param list) =
+		IOChunk.write_uleb128 chunk.io (List.length ttps);
+		let write_type_parameter_forward ttp =
+			self#write_path ttp.ttp_class.cl_path;
+			self#write_pos ttp.ttp_class.cl_name_pos
+		in
+		let write_type_parameter_data ttp =
+			let c = ttp.ttp_class in
+			self#write_metadata c.cl_meta;
+			self#write_types (get_constraints ttp);
+			Chunk.write_option chunk ttp.ttp_default self#write_type_instance
+		in
+		List.iter write_type_parameter_forward ttps;
+		List.iter write_type_parameter_data ttps;
 
 	method write_field_kind = function
 		| Method MethNormal -> IOChunk.write_u8 chunk.io 0;
@@ -1696,8 +1701,7 @@ class hxb_writer
 				let restore = self#start_temporary_chunk 512 in
 				if not self#in_nested_scope then begin
 					let ltp = List.map fst local_type_parameters#to_list in
-					Chunk.write_list chunk ltp self#write_type_parameter_forward;
-					Chunk.write_list chunk ltp self#write_type_parameter_data;
+					self#write_type_parameters ltp
 				end;
 				let items = fctx.t_pool#items in
 				IOChunk.write_uleb128 chunk.io (DynArray.length items);
@@ -1719,8 +1723,7 @@ class hxb_writer
 		IOChunk.write_uleb128 chunk.io (List.length params);
 		if not self#in_nested_scope then begin
 			let ftp = List.map fst field_type_parameters#to_list in
-			Chunk.write_list chunk ftp self#write_type_parameter_forward;
-			Chunk.write_list chunk ftp self#write_type_parameter_data;
+			self#write_type_parameters ftp
 		end
 
 	method write_class_field_data (write_expr_immediately : bool) (cf : tclass_field) =
@@ -1775,8 +1778,7 @@ class hxb_writer
 		IOChunk.write_bool chunk.io infos.mt_private;
 		Chunk.write_option chunk infos.mt_doc self#write_documentation;
 		self#write_metadata infos.mt_meta;
-		Chunk.write_list chunk infos.mt_params self#write_type_parameter_forward;
-		Chunk.write_list chunk infos.mt_params self#write_type_parameter_data;
+		self#write_type_parameters infos.mt_params;
 		Chunk.write_list chunk infos.mt_using (fun (c,p) ->
 			self#write_class_ref c;
 			self#write_pos p;