Explorar o código

fix class field scoping

Simon Krajewski hai 1 ano
pai
achega
b1366c158a
Modificáronse 2 ficheiros con 34 adicións e 25 borrados
  1. 17 11
      src/compiler/hxb/hxbReader.ml
  2. 17 14
      src/compiler/hxb/hxbWriter.ml

+ 17 - 11
src/compiler/hxb/hxbReader.ml

@@ -1150,24 +1150,30 @@ class hxb_reader
 				(Some e,e_unopt)
 		in
 
+		cf.cf_type <- t;
+		cf.cf_doc <- doc;
+		cf.cf_meta <- meta;
+		cf.cf_kind <- kind;
+		cf.cf_expr <- expr;
+		cf.cf_expr_unoptimized <- expr_unoptimized;
+		cf.cf_params <- !params;
+		cf.cf_flags <- flags;
+
+	method read_class_field_and_overloads_data (cf : tclass_field) =
+		let write cf =
+			self#read_class_field_data false cf;
+		in
+		write cf;
 		let rec loop depth cfl = match cfl with
 			| cf :: cfl ->
 				assert (depth > 0);
-				self#read_class_field_data false cf;
+				write cf;
 				loop (depth - 1) cfl
 			| [] ->
 				assert (depth = 0)
 		in
 		loop self#read_uleb128 cf.cf_overloads;
 
-		cf.cf_type <- t;
-		cf.cf_doc <- doc;
-		cf.cf_meta <- meta;
-		cf.cf_kind <- kind;
-		cf.cf_expr <- expr;
-		cf.cf_expr_unoptimized <- expr_unoptimized;
-		cf.cf_params <- !params;
-		cf.cf_flags <- flags;
 
 	method read_class_fields (c : tclass) =
 		begin match c.cl_kind with
@@ -1188,13 +1194,13 @@ class hxb_reader
 		let _ = self#read_option (fun f ->
 			let cf = Option.get c.cl_constructor in
 			handle_feature CfrConstructor cf;
-			self#read_class_field_data false cf
+			self#read_class_field_and_overloads_data cf
 		) in
 		let rec loop ref_kind num cfl = match cfl with
 			| cf :: cfl ->
 				assert (num > 0);
 				handle_feature ref_kind cf;
-				self#read_class_field_data false cf;
+				self#read_class_field_and_overloads_data cf;
 				loop ref_kind (num - 1) cfl
 			| [] ->
 				assert (num = 0)

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

@@ -893,6 +893,8 @@ class hxb_writer
 			let index = anon_fields#add cf () in
 			chunk#write_u8 1;
 			chunk#write_uleb128 index;
+			(* TODO: nested here may or not be true. We should handle this accurately for type
+			   parameter reasons. This is also true for the reader. *)
 			let close = self#open_field_scope true cf.cf_params in
 			self#write_class_field_data cf;
 			close()
@@ -1477,9 +1479,7 @@ class hxb_writer
 		self#write_pos cf.cf_pos;
 		self#write_pos cf.cf_name_pos;
 		chunk#write_list cf.cf_overloads (fun cf ->
-			let close = self#open_field_scope false cf.cf_params in
 			self#write_class_field_forward cf;
-			close()
 		);
 
 	method start_texpr (p: pos) =
@@ -1516,11 +1516,7 @@ class hxb_writer
 				chunk#write_option cf.cf_expr_unoptimized (self#write_texpr fctx);
 				close();
 		end;
-		chunk#write_list cf.cf_overloads (fun cf ->
-			let close = self#open_field_scope false cf.cf_params in
-			self#write_class_field_data cf;
-			close();
-		);
+
 		restore (fun new_chunk ->
 			chunk#write_list cf.cf_params self#write_type_parameter_forward;
 			chunk#write_list cf.cf_params self#write_type_parameter_data;
@@ -1530,6 +1526,15 @@ class hxb_writer
 			new_chunk#export_data chunk
 		)
 
+	method write_class_field_and_overloads_data (cf : tclass_field) =
+		let write cf =
+			let close = self#open_field_scope false cf.cf_params in
+			self#write_class_field_data cf;
+			close();
+		in
+		write cf;
+		chunk#write_list cf.cf_overloads write
+
 	(* Module types *)
 
 	method select_type (path : path) =
@@ -1767,15 +1772,13 @@ class hxb_writer
 					self#select_type c.cl_path;
 				end;
 
-				let write_field source cf =
-					let close = self#open_field_scope false cf.cf_params in
-					self#write_class_field_data cf;
-					close();
+				let write_field cf =
+					self#write_class_field_and_overloads_data cf;
 				in
 
-				chunk#write_option c.cl_constructor (write_field CfrConstructor);
-				chunk#write_list c.cl_ordered_fields (write_field CfrMember);
-				chunk#write_list c.cl_ordered_statics (write_field CfrStatic);
+				chunk#write_option c.cl_constructor write_field;
+				chunk#write_list c.cl_ordered_fields write_field;
+				chunk#write_list c.cl_ordered_statics write_field;
 				chunk#write_option c.cl_init (fun e ->
 					let fctx,close = self#start_texpr e.epos in
 					self#write_texpr fctx e;