Simon Krajewski 1 gadu atpakaļ
vecāks
revīzija
3facff7c01

+ 3 - 0
src/compiler/hxb/hxbData.ml

@@ -16,6 +16,7 @@ type chunk_kind =
 	| ENMR (* enum reference array *)
 	| CLSD (* class definition *)
 	| ABSD (* abstract definition *)
+	| ENFR (* enum field references *)
 	| CFLR (* class field references *)
 	| CFLD (* class fields *)
 	| AFLD (* abstract fields *)
@@ -35,6 +36,7 @@ let string_of_chunk_kind = function
 	| ENMR -> "ENMR"
 	| CLSD -> "CLSD"
 	| ABSD -> "ABSD"
+	| ENFR -> "ENFR"
 	| CFLR -> "CFLR"
 	| CFLD -> "CFLD"
 	| AFLD -> "AFLD"
@@ -54,6 +56,7 @@ let chunk_kind_of_string = function
 	| "ENMR" -> ENMR
 	| "CLSD" -> CLSD
 	| "ABSD" -> ABSD
+	| "ENFR" -> ENFR
 	| "CFLR" -> CFLR
 	| "CFLD" -> CFLD
 	| "AFLD" -> AFLD

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

@@ -42,6 +42,7 @@ class hxb_reader
 	val mutable anon_fields = Array.make 0 null_field
 	val mutable tmonos = Array.make 0 (mk_mono())
 	val mutable class_fields = Array.make 0 null_field
+	val mutable enum_fields = Array.make 0 null_enum_field
 
 	val vars = Hashtbl.create 0
 	val mutable type_type_parameters = Array.make 0 (mk_type_param null_class TPHType None None)
@@ -208,14 +209,8 @@ class hxb_reader
 	method read_field_ref =
 		class_fields.(self#read_uleb128)
 
-	method read_enum_field_ref en =
-		let name = self#read_string in
-		try PMap.find name en.e_constrs with e ->
-			prerr_endline (Printf.sprintf "  %s reading enum field ref for %s.%s" todo_error (s_type_path en.e_path) name);
-			prerr_endline (Printf.sprintf "    Available fields: %s" (PMap.fold (fun ef acc -> acc ^ " " ^ ef.ef_name) en.e_constrs ""));
-			self#print_reader_state;
-			(* print_stacktrace (); *)
-			raise e
+	method read_enum_field_ref =
+		enum_fields.(self#read_uleb128)
 
 	method read_anon_ref =
 		match IO.read_byte ch with
@@ -1029,8 +1024,7 @@ class hxb_reader
 			| 100 -> TEnumIndex (self#read_texpr)
 			| 101 ->
 				let e1 = self#read_texpr in
-				let en = self#read_enum_ref in
-				let ef = self#read_enum_field_ref en in
+				let ef = self#read_enum_field_ref in
 				let i = IO.read_i32 ch in
 				TEnumParameter(e1,ef,i)
 			| 102 ->
@@ -1061,7 +1055,7 @@ class hxb_reader
 			| 107 ->
 				let e1 = self#read_texpr in
 				let en = self#read_enum_ref in
-				let ef = self#read_enum_field_ref en in
+				let ef = self#read_enum_field_ref in
 				TField(e1,FEnum(en,ef))
 			| 108 ->
 				let e1 = self#read_texpr in
@@ -1366,6 +1360,15 @@ class hxb_reader
 		let kind = chunk_kind_of_string name in
 		(kind,data)
 
+	method read_enfr =
+		let l = self#read_uleb128 in
+		let a = Array.init l (fun i ->
+			let en = self#read_enum_ref in
+			let name = self#read_string in
+			PMap.find name en.e_constrs
+		) in
+		enum_fields <- a
+
 	method read_cflr =
 		let l = self#read_uleb128 in
 		let a = Array.init l (fun i ->
@@ -1651,6 +1654,9 @@ class hxb_reader
 			| ABSD ->
 				self#read_absd;
 				loop()
+			| ENFR ->
+				self#read_enfr;
+				loop()
 			| CFLR ->
 				self#read_cflr;
 				loop();

+ 21 - 11
src/compiler/hxb/hxbWriter.ml

@@ -267,6 +267,7 @@ class ['a] hxb_writer
 
 	val type_param_lut = new pool
 	val class_fields = new identity_pool
+	val enum_fields = new pool
 	val mutable type_type_parameters = new pool
 	val mutable field_type_parameters = new identity_pool
 	val mutable local_type_parameters = new identity_pool
@@ -381,8 +382,12 @@ class ['a] hxb_writer
 			end in
 			chunk#write_uleb128 (class_fields#add cf (c,kind,depth));
 
-	method write_enum_field_ref ef =
-		chunk#write_string ef.ef_name
+	method write_enum_field_ref (en : tenum) (ef : tenum_field) =
+		let key = (en.e_path,ef.ef_name) in
+		try
+			chunk#write_uleb128 (enum_fields#get key)
+		with Not_found ->
+			chunk#write_uleb128 (enum_fields#add key (en,ef))
 
 	method write_anon_field_ref cf =
 		try
@@ -896,12 +901,9 @@ class ['a] hxb_writer
 		chunk#write_i32 v.v_id;
 		chunk#write_string v.v_name;
 		chunk#write_option v.v_extra (fun ve ->
-			chunk#write_list ve.v_params (fun ttp -> match follow_lazy ttp.ttp_type with
-				| TInst(c,_) ->
-					let index = local_type_parameters#add ttp () in
-					chunk#write_uleb128 index
-				| _ ->
-					die "" __LOC__
+			chunk#write_list ve.v_params (fun ttp ->
+				let index = local_type_parameters#add ttp () in
+				chunk#write_uleb128 index
 			);
 			chunk#write_option ve.v_expr self#write_texpr;
 		);
@@ -1091,8 +1093,7 @@ class ['a] hxb_writer
 					| _ ->
 						die "" __LOC__
 				in
-				self#write_enum_ref en;
-				self#write_enum_field_ref ef;
+				self#write_enum_field_ref en ef;
 				chunk#write_i32 i;
 			(* | TEnumParameter(e1,({ ef_type = eft}),i) -> *)
 			(* 	prerr_endline (Printf.sprintf "en = %s" (s_type_kind eft)); *)
@@ -1126,7 +1127,7 @@ class ['a] hxb_writer
 				chunk#write_byte 107;
 				loop e1;
 				self#write_enum_ref en;
-				self#write_enum_field_ref ef;
+				self#write_enum_field_ref en ef;
 			| TField(e1,FDynamic s) ->
 				chunk#write_byte 108;
 				loop e1;
@@ -1640,6 +1641,7 @@ class ['a] hxb_writer
 				self#write_full_path (fst m.m_path) (snd m.m_path) (snd td.t_path);
 			)
 		end;
+
 		self#start_chunk CFLR;
 		let items = class_fields#items in
 		chunk#write_uleb128 (DynArray.length items);
@@ -1658,6 +1660,14 @@ class ['a] hxb_writer
 			chunk#write_uleb128 depth
 		) items;
 
+		self#start_chunk ENFR;
+		let items = enum_fields#items in
+		chunk#write_uleb128 (DynArray.length items);
+		DynArray.iter (fun (en,ef) ->
+			self#write_enum_ref en;
+			chunk#write_string ef.ef_name;
+		) items;
+
 		self#start_chunk HHDR;
 		self#write_path m.m_path;
 		chunk#write_string (Path.UniqueKey.lazy_path m.m_extra.m_file);