ソースを参照

write nested status so the reader doesn't have to track this

Simon Krajewski 1 年間 前
コミット
68ea14accc
2 ファイル変更28 行追加27 行削除
  1. 20 25
      src/compiler/hxb/hxbReader.ml
  2. 8 2
      src/compiler/hxb/hxbWriter.ml

+ 20 - 25
src/compiler/hxb/hxbReader.ml

@@ -102,21 +102,9 @@ 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 = []
 	val mutable field_type_parameter_offset = 0
 	val empty_anon = mk_anon (ref Closed)
 
-	method in_nested_scope = match field_stack with
-		| [] -> 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
@@ -1242,10 +1230,16 @@ class hxb_reader
 		{ null_field with cf_name = name; cf_pos = pos; cf_name_pos = name_pos; cf_overloads = overloads }
 
 	method start_texpr =
-		if not self#in_nested_scope then
-			self#read_type_parameters (fun a ->
-				local_type_parameters <- a
-			);
+		begin match IO.read_byte ch with
+			| 0 ->
+				()
+			| 1 ->
+				self#read_type_parameters (fun a ->
+					local_type_parameters <- a
+				);
+			| i ->
+				die "" __LOC__
+		end;
 		let l = read_uleb128 ch in
 		let ts = Array.init l (fun _ ->
 			self#read_type_instance
@@ -1258,11 +1252,16 @@ class hxb_reader
 
 	method read_field_type_parameters kind =
 		let num_params = read_uleb128 ch in
-		if not self#in_nested_scope then begin
-			self#read_type_parameters (fun a ->
-				field_type_parameters <- a;
-			);
-			field_type_parameter_offset <- 0;
+		begin match IO.read_byte ch with
+			| 0 ->
+				()
+			| 1 ->
+				self#read_type_parameters (fun a ->
+					field_type_parameters <- a;
+				);
+				field_type_parameter_offset <- 0;
+			| i ->
+				die "" __LOC__
 		end;
 		let params = List.init num_params (fun offset ->
 			field_type_parameters.(field_type_parameter_offset + offset)
@@ -1310,9 +1309,7 @@ class hxb_reader
 		let rec loop depth cfl = match cfl with
 			| cf :: cfl ->
 				assert (depth > 0);
-				let close = self#open_field_scope in
 				self#read_class_field_data cf;
-				close();
 				loop (depth - 1) cfl
 			| [] ->
 				assert (depth = 0)
@@ -1349,13 +1346,11 @@ class hxb_reader
 		type_type_parameters <- Array.of_list e.e_params;
 		ignore(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
 			ef.ef_params <- self#read_field_type_parameters TPHEnumConstructor;
 			ef.ef_type <- self#read_type_instance;
 			ef.ef_doc <- self#read_option (fun () -> self#read_documentation);
 			ef.ef_meta <- self#read_metadata;
-			close()
 		))
 
 	(* Module types *)

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

@@ -1708,7 +1708,10 @@ class hxb_writer
 		fctx,(fun () ->
 			restore(fun new_chunk ->
 				let restore = self#start_temporary_chunk 512 in
-				if not self#in_nested_scope then begin
+				if self#in_nested_scope then
+					IOChunk.write_u8 chunk.io 0
+				else begin
+					IOChunk.write_u8 chunk.io 1;
 					let ltp = List.map fst local_type_parameters#to_list in
 					self#write_type_parameters ltp
 				end;
@@ -1730,7 +1733,10 @@ class hxb_writer
 
 	method commit_field_type_parameters (params : type_params) =
 		IOChunk.write_uleb128 chunk.io (List.length params);
-		if not self#in_nested_scope then begin
+		if self#in_nested_scope then
+			IOChunk.write_u8 chunk.io 0
+		else begin
+			IOChunk.write_u8 chunk.io 1;
 			let ftp = List.map fst field_type_parameters#to_list in
 			self#write_type_parameters ftp
 		end