فهرست منبع

infer nested status from stack

Did you know there can be anon fields inside enum fields? Crazy...
Simon Krajewski 1 سال پیش
والد
کامیت
2e8c51bb72
2فایلهای تغییر یافته به همراه37 افزوده شده و 7 حذف شده
  1. 23 3
      src/compiler/hxb/hxbReader.ml
  2. 14 4
      src/compiler/hxb/hxbWriter.ml

+ 23 - 3
src/compiler/hxb/hxbReader.ml

@@ -83,6 +83,19 @@ class hxb_reader
 	val mutable field_type_parameters = Array.make 0 (mk_type_param null_class TPHMethod None None)
 	val mutable local_type_parameters = Array.make 0 (mk_type_param null_class TPHLocal None None)
 
+	val mutable field_stack = []
+
+	method in_nested_scope = match field_stack with
+		| [] -> assert false
+		| [_] -> false
+		| _ -> true
+
+	method open_field_scope =
+		field_stack <- () :: field_stack;
+		(fun () ->
+			field_stack <- List.tl field_stack
+		)
+
 	method resolve_type pack mname tname =
 		try api#resolve_type pack mname tname with
 		| Bad_module (path, reason) -> raise (Bad_module (current_module.m_path, DependencyDirty (path, reason)))
@@ -235,7 +248,9 @@ class hxb_reader
 			anon_fields.(self#read_uleb128)
 		| 1 ->
 			let cf = anon_fields.(self#read_uleb128) in
-			self#read_class_field_data true cf;
+			let close = self#open_field_scope in
+			self#read_class_field_data cf;
+			close();
 			cf
 		| _ ->
 			assert false
@@ -1121,9 +1136,10 @@ class hxb_reader
 		) in
 		create_field_reader_context self#read_pos a
 
-	method read_class_field_data (nested : bool) (cf : tclass_field) : unit =
+	method read_class_field_data (cf : tclass_field) : unit =
 		current_field <- cf;
 
+		let nested = self#in_nested_scope in
 		let params = ref [] in
 		self#read_type_parameters (if nested then TPHAnonField else TPHMethod) (fun a ->
 			params := Array.to_list a;
@@ -1161,7 +1177,9 @@ class hxb_reader
 
 	method read_class_field_and_overloads_data (cf : tclass_field) =
 		let write cf =
-			self#read_class_field_data false cf;
+			let close = self#open_field_scope in
+			self#read_class_field_data cf;
+			close();
 		in
 		write cf;
 		let rec loop depth cfl = match cfl with
@@ -1214,6 +1232,7 @@ class hxb_reader
 		type_type_parameters <- Array.of_list e.e_params;
 		self#read_list (fun () ->
 			let name = self#read_string in
+			let close = self#open_field_scope in
 			let ef = PMap.find name e.e_constrs in
 			let params = ref [] in
 			self#read_type_parameters TPHEnumConstructor (fun a ->
@@ -1224,6 +1243,7 @@ class hxb_reader
 			ef.ef_type <- self#read_type_instance;
 			ef.ef_doc <- self#read_option (fun () -> self#read_documentation);
 			ef.ef_meta <- self#read_metadata;
+			close();
 			class_field_of_enum_field ef
 		)
 

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

@@ -439,6 +439,13 @@ class hxb_writer
 
 	val instance_overload_cache = Hashtbl.create 0
 
+	val mutable field_stack = []
+
+	method in_nested_scope = match field_stack with
+		| [] -> assert false
+		| [_] -> false
+		| _ -> true
+
 	(* Chunks *)
 
 	method start_chunk (kind : chunk_kind) =
@@ -895,7 +902,7 @@ class hxb_writer
 			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
+			let close = self#open_field_scope cf.cf_params in
 			self#write_class_field_data cf;
 			close()
 
@@ -1459,7 +1466,9 @@ class hxb_writer
 			f r;
 			f w;
 
-	method open_field_scope (nested : bool) (params : type_params) =
+	method open_field_scope (params : type_params) =
+		field_stack <- () :: field_stack;
+		let nested = self#in_nested_scope in
 		let old_field_params = field_type_parameters in
 		let old_local_params = local_type_parameters in
 		if not nested then begin
@@ -1472,6 +1481,7 @@ class hxb_writer
 		(fun () ->
 			field_type_parameters <- old_field_params;
 			local_type_parameters <- old_local_params;
+			field_stack <- List.tl field_stack
 		)
 
 	method write_class_field_forward cf =
@@ -1528,7 +1538,7 @@ class hxb_writer
 
 	method write_class_field_and_overloads_data (cf : tclass_field) =
 		let write cf =
-			let close = self#open_field_scope false cf.cf_params in
+			let close = self#open_field_scope cf.cf_params in
 			self#write_class_field_data cf;
 			close();
 		in
@@ -1796,7 +1806,7 @@ class hxb_writer
 			chunk#write_list own_enums (fun e ->
 				chunk#write_list (PMap.foldi (fun s f acc -> (s,f) :: acc) e.e_constrs []) (fun (s,ef) ->
 					self#select_type e.e_path;
-					let close = self#open_field_scope false ef.ef_params in
+					let close = self#open_field_scope ef.ef_params in
 					chunk#write_string s;
 					chunk#write_list ef.ef_params self#write_type_parameter_forward;
 					chunk#write_list ef.ef_params self#write_type_parameter_data;