浏览代码

[hxb] @:const type parameters

Rudy Ges 2 年之前
父节点
当前提交
a915260370

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

@@ -577,6 +577,19 @@ class hxb_reader
 
 	(* Type instances *)
 
+	method read_type_parameter_ref = function
+		| 5 ->
+			let i = self#read_uleb128 in
+			(field_type_parameters.(i)).ttp_type
+		| 6 ->
+			let i = self#read_uleb128 in
+			(type_type_parameters.(i)).ttp_type
+		| 7 ->
+			let k = self#read_uleb128 in
+			(DynArray.get local_type_parameters k).ttp_type
+		| _ ->
+			die "" __LOC__
+
 	method read_type_instance =
 		let kind = self#read_u8 in
 		(* Printf.eprintf "   Read type instance %d\n" kind; *)
@@ -591,17 +604,7 @@ class hxb_reader
 			let tmono = !monomorph_create_ref () in (* TODO identity *)
 			tmono.tm_type <- Some t;
 			TMono tmono;
-		| 5 ->
-			let i = self#read_uleb128 in
-			(* Printf.eprintf "     Get field type param %d\n" i; *)
-			(field_type_parameters.(i)).ttp_type
-		| 6 ->
-			let i = self#read_uleb128 in
-			(* Printf.eprintf "     Get type type param %d\n" i; *)
-			(type_type_parameters.(i)).ttp_type
-		| 7 ->
-			let k = self#read_uleb128 in
-			(DynArray.get local_type_parameters k).ttp_type
+		| 5 | 6 | 7 -> self#read_type_parameter_ref kind
 		| 8 ->
 			let e = self#read_expr in
 			TInst({null_class with cl_kind = KExpr e}, [])
@@ -691,9 +694,11 @@ class hxb_reader
 		for i = 0 to l - 1 do
 			let tl1 = self#read_types in
 			let tl2 = self#read_types in
+			let meta = self#read_metadata in
 			begin match a.(i) with
 			| {ttp_type = TInst(c,_)} as ttp ->
 				c.cl_kind <- KTypeParameter tl1;
+				c.cl_meta <- meta;
 				a.(i) <- {ttp with ttp_type = (TInst(c,tl2))}
 			| _ ->
 				die "" __LOC__
@@ -996,26 +1001,16 @@ class hxb_reader
 				TNew(c,tl,el)
 			| 127 ->
 				(* TODO: this is giga awkward *)
-				let t = match self#read_uleb128 with
-					| 5 ->
-						let i = self#read_uleb128 in
-						(field_type_parameters.(i)).ttp_type
-					| 6 ->
-						let i = self#read_uleb128 in
-						(type_type_parameters.(i)).ttp_type
-					| 7 ->
-						let k = self#read_uleb128 in
-						(DynArray.get local_type_parameters k).ttp_type
-					| _ ->
-						die "" __LOC__
-				in
-				let c = match t with
-					| TInst(c,_) -> c
-					| _ -> die "" __LOC__
-				in
+				let t = self#read_type_parameter_ref self#read_uleb128 in
+				let c = match t with | TInst(c,_) -> c | _ -> die "" __LOC__ in
 				let tl = self#read_types in
 				let el = self#read_texpr_list in
 				TNew(c,tl,el)
+			| 128 ->
+				(* TODO: this is giga awkward *)
+				let t = self#read_type_parameter_ref self#read_uleb128 in
+				let c = match t with | TInst(c,_) -> c | _ -> die "" __LOC__ in
+				TTypeExpr (TClassDecl c)
 
 			(* unops 140-159 *)
 			| _ when i >= 140 && i < 160 ->

+ 5 - 1
src/compiler/hxb/hxbWriter.ml

@@ -977,6 +977,9 @@ class ['a] hxb_writer
 				loop e1;
 				chunk#write_string s;
 			(* module types 120-139 *)
+			| TTypeExpr (TClassDecl ({cl_kind = KTypeParameter []} as c)) ->
+				chunk#write_byte 128;
+				self#write_type_parameter_ref c
 			| TTypeExpr (TClassDecl c) ->
 				chunk#write_byte 120;
 				self#write_class_ref c;
@@ -1043,9 +1046,10 @@ class ['a] hxb_writer
 			die "" __LOC__
 
 	method write_type_parameter_data ttp = match follow ttp.ttp_type with
-		| TInst({cl_kind = KTypeParameter tl1},tl2) ->
+		| TInst({cl_kind = KTypeParameter tl1} as c,tl2) ->
 			self#write_types tl1;
 			self#write_types tl2;
+			self#write_metadata c.cl_meta
 		| _ ->
 			die "" __LOC__
 

+ 0 - 0
tests/unit/src/unit/issues/Issue3450.hx.disabled → tests/unit/src/unit/issues/Issue3450.hx


+ 0 - 0
tests/unit/src/unit/issues/Issue6952.hx.disabled → tests/unit/src/unit/issues/Issue6952.hx


+ 0 - 0
tests/unit/src/unit/issues/Issue6979.hx.disabled → tests/unit/src/unit/issues/Issue6979.hx


+ 0 - 0
tests/unit/src/unit/issues/Issue9149.hx.disabled → tests/unit/src/unit/issues/Issue9149.hx