Forráskód Böngészése

add ANFR for anon fields

Rudy Ges 1 éve
szülő
commit
0c26f9b00c

+ 4 - 1
src/compiler/hxb/hxbData.ml

@@ -17,6 +17,7 @@ type chunk_kind =
 	| CLSD (* class definition *)
 	| ABSD (* abstract definition *)
 	| ENFR (* enum field references *)
+	| ANFR (* anon field references *)
 	| CFLR (* class field references *)
 	| CFLD (* class fields *)
 	| AFLD (* abstract fields *)
@@ -37,6 +38,7 @@ let string_of_chunk_kind = function
 	| CLSD -> "CLSD"
 	| ABSD -> "ABSD"
 	| ENFR -> "ENFR"
+	| ANFR -> "ANFR"
 	| CFLR -> "CFLR"
 	| CFLD -> "CFLD"
 	| AFLD -> "AFLD"
@@ -57,6 +59,7 @@ let chunk_kind_of_string = function
 	| "CLSD" -> CLSD
 	| "ABSD" -> ABSD
 	| "ENFR" -> ENFR
+	| "ANFR" -> ANFR
 	| "CFLR" -> CFLR
 	| "CFLD" -> CFLD
 	| "AFLD" -> AFLD
@@ -70,4 +73,4 @@ let error (s : string) =
 	Printf.eprintf "[error] %s\n" s;
 	raise (HxbFailure s)
 
-let hxb_version = 1
+let hxb_version = 1

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

@@ -235,8 +235,8 @@ class hxb_reader
 		| 1 ->
 			let index = self#read_uleb128 in
 			(try begin
-				let cf = self#read_class_field true in
-				anon_fields.(index) <- cf;
+				let cf = anon_fields.(index) in
+				self#read_class_field_data true cf;
 				cf
 			end with e ->
 				prerr_endline (Printf.sprintf "[%s] %s reading anon field (1) ref %i" (s_type_path current_module.m_path) todo_error index);
@@ -1366,6 +1366,16 @@ class hxb_reader
 		) in
 		enum_fields <- a
 
+	method read_anfr =
+		let l = self#read_uleb128 in
+		let a = Array.init l (fun i ->
+			let name = self#read_string in
+			let pos = self#read_pos in
+			let name_pos = self#read_pos in
+			{ null_field with cf_name = name; cf_pos = pos; cf_name_pos = name_pos }
+		) in
+		anon_fields <- a
+
 	method read_cflr =
 		let l = self#read_uleb128 in
 		let instance_overload_cache = Hashtbl.create 0 in
@@ -1612,8 +1622,6 @@ class hxb_reader
 
 		let l = self#read_uleb128 in
 		anons <- Array.init l (fun _ -> { a_fields = PMap.empty; a_status = ref Closed });
-
-		anon_fields <- Array.make (self#read_uleb128) null_field;
 		tmonos <- Array.init (self#read_uleb128) (fun _ -> mk_mono());
 		api#make_module path file
 
@@ -1665,6 +1673,9 @@ class hxb_reader
 			| ENFR ->
 				self#read_enfr;
 				loop()
+			| ANFR ->
+				self#read_anfr;
+				loop()
 			| CFLR ->
 				self#read_cflr;
 				loop();

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

@@ -409,7 +409,6 @@ class ['a] hxb_writer
 			chunk#write_byte 1;
 			chunk#write_uleb128 index;
 			let close = self#open_field_scope true cf in
-			self#write_class_field_forward cf;
 			self#write_class_field_data cf;
 			close()
 
@@ -1606,11 +1605,19 @@ class ['a] hxb_writer
 			chunk#write_string ef.ef_name;
 		) items;
 
+		self#start_chunk ANFR;
+		let items = anon_fields#items in
+		chunk#write_uleb128 (DynArray.length items);
+		DynArray.iter (fun (cf,_) ->
+			chunk#write_string cf.cf_name;
+			self#write_pos cf.cf_pos;
+			self#write_pos cf.cf_name_pos;
+		) items;
+
 		self#start_chunk HHDR;
 		self#write_path m.m_path;
 		chunk#write_string (Path.UniqueKey.lazy_path m.m_extra.m_file);
 		chunk#write_uleb128 (DynArray.length anons#items);
-		chunk#write_uleb128 (DynArray.length anon_fields#items);
 		chunk#write_uleb128 (DynArray.length tmonos#items);
 		self#start_chunk HEND;