Bladeren bron

[dce] added "type_param_binop_==" and "type_param_binop_!=" features
fixes #9637

Aleksandr Kuzmenko 5 jaren geleden
bovenliggende
commit
df5606dd03

+ 5 - 0
src/core/tOther.ml

@@ -177,6 +177,11 @@ module ExtType = struct
 		| TAbstract({a_path=[],"Bool"},_) -> true
 		| _ -> false
 
+	let is_type_param t =
+		match t with
+		| TInst({ cl_kind = KTypeParameter _ }, _) -> true
+		| _ -> false
+
 	type semantics =
 		| VariableSemantics
 		| ReferenceSemantics

+ 1 - 3
src/generators/genjava.ml

@@ -117,9 +117,7 @@ let is_dynamic gen t =
 		| TDynamic _ -> true
 		| _ -> false
 
-let is_type_param t = match follow t with
-	| TInst({ cl_kind = KTypeParameter _ }, _) -> true
-	| _ -> false
+let is_type_param t = ExtType.is_type_param (follow t)
 
 let rec t_has_type_param_shallow last t = match follow t with
 	| TInst({ cl_kind = KTypeParameter _ }, []) -> true

+ 8 - 0
src/optimization/dce.ml

@@ -627,10 +627,18 @@ and expr dce e =
 		check_and_add_feature dce "dynamic_binop_==";
 		expr dce e1;
 		expr dce e2;
+	| TBinop(OpEq,({ etype = t1} as e1), ({ etype = t2} as e2) ) when ExtType.is_type_param (follow t1) || ExtType.is_type_param (follow t2) ->
+		check_and_add_feature dce "type_param_binop_==";
+		expr dce e1;
+		expr dce e2;
 	| TBinop(OpNotEq,({ etype = t1} as e1), ({ etype = t2} as e2) ) when is_dynamic t1 || is_dynamic t2 ->
 		check_and_add_feature dce "dynamic_binop_!=";
 		expr dce e1;
 		expr dce e2;
+	| TBinop(OpNotEq,({ etype = t1} as e1), ({ etype = t2} as e2) ) when ExtType.is_type_param (follow t1) || ExtType.is_type_param (follow t2) ->
+		check_and_add_feature dce "type_param_binop_!=";
+		expr dce e1;
+		expr dce e2;
 	| TBinop(OpMod,e1,e2) ->
 		check_and_add_feature dce "binop_%";
 		expr dce e1;

+ 1 - 1
std/python/internal/HxOverrides.hx

@@ -48,7 +48,7 @@ class HxOverrides {
 		return Syntax.callField(x, "keyValueIterator");
 	}
 
-	@:ifFeature("dynamic_binop_==", "dynamic_binop_!=")
+	@:ifFeature("dynamic_binop_==", "dynamic_binop_!=", "type_param_binop_==", "type_param_binop_!=")
 	static function eq(a:Dynamic, b:Dynamic):Bool {
 		if (Boot.isArray(a) || Boot.isArray(b)) {
 			return Syntax.code('a is b');

+ 6 - 0
tests/misc/python/projects/Issue9637/Main.hx

@@ -0,0 +1,6 @@
+class Main {
+	static function main() {
+		final chickenEgg = ["b", "a"];
+		chickenEgg.sort(Reflect.compare);
+	}
+}

+ 4 - 0
tests/misc/python/projects/Issue9637/build.hxml

@@ -0,0 +1,4 @@
+-python bin/test.py
+-dce full
+--main Main
+--cmd python3 bin/test.py