فهرست منبع

handle local type parameters differently

Simon Krajewski 2 سال پیش
والد
کامیت
a777d7f617
2فایلهای تغییر یافته به همراه24 افزوده شده و 48 حذف شده
  1. 8 24
      src/compiler/hxb/hxbReader.ml
  2. 16 24
      src/compiler/hxb/hxbWriter.ml

+ 8 - 24
src/compiler/hxb/hxbReader.ml

@@ -33,7 +33,7 @@ class hxb_reader
 	val vars = Hashtbl.create 0
 	val mutable type_type_parameters = Array.make 0 (mk_type_param "" t_dynamic None)
 	val mutable field_type_parameters = Array.make 0 (mk_type_param "" t_dynamic None)
-	val mutable local_type_parameters = []
+	val mutable local_type_parameters = DynArray.create ()
 
 	val mutable tvoid = None
 	method get_tvoid =
@@ -597,16 +597,7 @@ class hxb_reader
 			(type_type_parameters.(i)).ttp_type
 		| 7 ->
 			let k = self#read_uleb128 in
-			let i = self#read_uleb128 in
-			let rec loop left params = match params with
-				| _ :: params when left > 0 ->
-					loop (left - 1) params
-				| params :: _ ->
-					params.(i).ttp_type
-				| _ ->
-					error (Printf.sprintf "Bad index into local params: %i" k)
-			in
-			loop k local_type_parameters
+			(DynArray.get local_type_parameters k).ttp_type
 		| 10 ->
 			TInst(self#read_class_ref,[])
 		| 11 ->
@@ -748,7 +739,6 @@ class hxb_reader
 		let args = self#read_list (fun () -> self#read_tfunction_arg) in
 		let r = self#read_type_instance in
 		let e = self#read_texpr in
-		let args = List.map (fun ((v,close),cto) -> close(); (v,cto)) args in
 		{
 			tf_args = args;
 			tf_type = r;
@@ -771,15 +761,13 @@ class hxb_reader
 			| _ -> assert false
 
 	method read_var =
-		let close = ref (fun () -> ()) in (* TODO: awkward *)
 		let id = IO.read_i32 ch in
 		let name = self#read_string in
 		let extra = self#read_option (fun () ->
 			let params = ref [] in
 			self#read_type_parameters null_module ([],name) (fun a ->
-				local_type_parameters <- a :: local_type_parameters;
+				Array.iter (fun ttp -> DynArray.add local_type_parameters ttp) a;
 				params := Array.to_list a;
-				close := (fun () -> local_type_parameters <- List.tl local_type_parameters)
 			);
 			let vexpr = self#read_option (fun () -> self#read_texpr) in
 			{
@@ -803,7 +791,7 @@ class hxb_reader
 			v_flags = flags;
 		} in
 		Hashtbl.add vars id v;
-		v,!close
+		v
 
 	method read_texpr =
 		let t = self#read_type_instance in
@@ -825,13 +813,11 @@ class hxb_reader
 			(* vars 20-29 *)
 			| 20 -> TLocal (Hashtbl.find vars (IO.read_i32 ch))
 			| 21 ->
-				let v,close = self#read_var in
-				close();
+				let v = self#read_var in
 				TVar (v,None)
 			| 22 ->
-					let v,close = self#read_var in
+					let v = self#read_var in
 					let e = self#read_texpr in
-					close();
 					TVar (v, Some e)
 
 			(* blocks 30-49 *)
@@ -912,9 +898,8 @@ class hxb_reader
 			| 83 ->
 				let e1 = self#read_texpr in
 				let catches = self#read_list (fun () ->
-					let v,close = self#read_var in
+					let v = self#read_var in
 					let e = self#read_texpr in
-					close();
 					(v,e)
 				) in
 				TTry(e1,catches)
@@ -927,10 +912,9 @@ class hxb_reader
 				let e2 = self#read_texpr in
 				TWhile(e1,e2,DoWhile)
 			| 86 ->
-				let v,close = self#read_var in
+				let v  = self#read_var in
 				let e1 = self#read_texpr in
 				let e2 = self#read_texpr in
-				close();
 				TFor(v,e1,e2)
 
 			(* control flow 90-99 *)

+ 16 - 24
src/compiler/hxb/hxbWriter.ml

@@ -335,15 +335,12 @@ class ['a] hxb_writer
 				let rec loop k l = match l with
 					| [] ->
 						raise Not_found
-					| pool :: l ->
-						begin try
-							let i = pool#get (snd c.cl_path) in
+					| c' :: l ->
+						if c == c' then begin
 							chunk#write_byte 7;
 							chunk#write_uleb128 k;
-							chunk#write_uleb128 i
-						with Not_found ->
+						end else
 							loop (k + 1) l
-						end
 				in
 				loop 0 local_type_parameters
 			with Not_found ->
@@ -518,7 +515,6 @@ class ['a] hxb_writer
 		in
 		chunk#write_byte i;
 
-
 	method write_placed_access (ac,p) =
 		self#write_access ac;
 		self#write_pos p;
@@ -754,30 +750,28 @@ class ['a] hxb_writer
 		in
 		chunk#write_byte b
 
-	method set_local_type_parameters (params : typed_type_param list) =
-		let pool = new pool in
-		local_type_parameters <- pool :: local_type_parameters;
-		List.iter (fun ttp ->
-			ignore(pool#add ttp.ttp_name ttp);
+	method add_local_type_parameters (params : typed_type_param list) =
+		List.iter (fun ttp -> match follow ttp.ttp_type with
+			| TInst(c,_) ->
+				local_type_parameters <- c :: local_type_parameters
+			| _ ->
+				die "" __LOC__
 		) params
 
 	method write_var v =
-		let close = ref (fun () -> ()) in (* TODO: awkward *)
 		chunk#write_i32 v.v_id;
 		chunk#write_string v.v_name;
 		chunk#write_option v.v_extra (fun ve ->
-			self#set_local_type_parameters ve.v_params;
+			self#add_local_type_parameters ve.v_params;
 			chunk#write_list ve.v_params self#write_type_parameter_forward;
 			chunk#write_list ve.v_params self#write_type_parameter_data;
 			chunk#write_option ve.v_expr self#write_texpr;
-			close := (fun () -> local_type_parameters <- List.tl local_type_parameters)
 		);
 		self#write_type_instance v.v_type;
 		self#write_var_kind v.v_kind;
 		chunk#write_i32 v.v_flags;
 		self#write_metadata v.v_meta;
-		self#write_pos v.v_pos;
-		!close
+		self#write_pos v.v_pos
 
 	method write_texpr (e : texpr) =
 		let rec loop e =
@@ -814,12 +808,11 @@ class ['a] hxb_writer
 				chunk#write_i32 v.v_id;
 			| TVar(v,None) ->
 				chunk#write_byte 21;
-				self#write_var v ()
+				self#write_var v
 			| TVar(v,Some e1) ->
 				chunk#write_byte 22;
-				let close = self#write_var v in
+				self#write_var v;
 				loop e1;
-				close()
 			(* blocks 30-49 *)
 			| TBlock [] ->
 				chunk#write_byte 30;
@@ -848,9 +841,8 @@ class ['a] hxb_writer
 			| TFunction tf ->
 				chunk#write_byte 50;
 				chunk#write_list tf.tf_args (fun (v,eo) ->
-					let close = self#write_var v in
+					self#write_var v;
 					chunk#write_option eo loop;
-					close();
 				);
 				self#write_type_instance tf.tf_type;
 				loop tf.tf_expr;
@@ -906,7 +898,7 @@ class ['a] hxb_writer
 				chunk#write_byte 83;
 				loop e1;
 				chunk#write_list catches  (fun (v,e) ->
-					self#write_var v ();
+					self#write_var v;
 					loop e
 				);
 			| TWhile(e1,e2,flag) ->
@@ -915,7 +907,7 @@ class ['a] hxb_writer
 				loop e2;
 			| TFor(v,e1,e2) ->
 				chunk#write_byte 86;
-				self#write_var v ();
+				self#write_var v;
 				loop e1;
 				loop e2;
 			(* control flow 90-99 *)