diff --git a/src/generators/cpp/gen/cppGen.ml b/src/generators/cpp/gen/cppGen.ml index ab1570b1d03..72d223d0c7c 100644 --- a/src/generators/cpp/gen/cppGen.ml +++ b/src/generators/cpp/gen/cppGen.ml @@ -1610,6 +1610,9 @@ let gen_cpp_ast_expression_tree ctx class_name func_name function_args function_ output_i "int __Compare(const ::hx::Object* inRhs) const override {\n"; output_i (Printf.sprintf "\treturn dynamic_cast(inRhs) ? 0 : -1;\n" closure.close_id); output_i "}\n"; + output_i "std::type_index callableId() const override {\n"; + output_i (Printf.sprintf "\treturn std::type_index{ typeid(_hx_Closure_%i) };\n" closure.close_id); + output_i "}\n"; let return = match closure.close_type with TCppVoid -> "(void)" | _ -> "return" diff --git a/src/generators/genjvm.ml b/src/generators/genjvm.ml index 9563e695b0a..ed8ede12642 100644 --- a/src/generators/genjvm.ml +++ b/src/generators/genjvm.ml @@ -1134,7 +1134,10 @@ class texpr_to_jvm | [TObject(path1,_);sig2] when jc#has_typed_function path1 || path1 = haxe_function_path -> code#swap; fun_compare path1 sig2 - | [(TObject _ | TArray _ | TMethod _) as t1;(TObject _ | TArray _ | TMethod _) as t2] -> + | [TMethod _;_] | [_;TMethod _] -> + jm#invokestatic haxe_jvm_path "compareFunctions" (method_sig [object_sig;object_sig] (Some TBool)); + CmpNormal(op,TBool) + | [(TObject _ | TArray _) as t1;(TObject _ | TArray _) as t2] -> CmpSpecial ((if op = CmpEq then code#if_acmp_ne else code#if_acmp_eq) t1 t2) | [TDouble;TDouble] -> let op = flip_cmp_op op in diff --git a/std/jvm/Jvm.hx b/std/jvm/Jvm.hx index dc2a484aac3..88debe91785 100644 --- a/std/jvm/Jvm.hx +++ b/std/jvm/Jvm.hx @@ -71,6 +71,10 @@ class Jvm { return Reflect.compare(v1, v2); } + static public function compareFunctions(v1:Dynamic, v2:Dynamic):Bool { + return Reflect.compareMethods(v1, v2); + } + static public function enumEq(v1:Dynamic, v2:Dynamic) { if (!instanceof(v1, jvm.Enum)) { return false; diff --git a/tests/unit/src/unit/issues/Issue12746.hx b/tests/unit/src/unit/issues/Issue12746.hx new file mode 100644 index 00000000000..09a431a316b --- /dev/null +++ b/tests/unit/src/unit/issues/Issue12746.hx @@ -0,0 +1,31 @@ +package unit.issues; + +private class Event {} +private class MouseEvent extends Event {} +private class Foo { + public function onMouseMove(e:MouseEvent):Void {} + + public function new() {} +} + +class Issue12746 extends Test { + function test() { +#if !neko + final obj = new Foo(); + + final a:Event->Void = cast obj.onMouseMove; + final b:Event->Void = cast obj.onMouseMove; + t(a == b); + + t(genericCast(obj.onMouseMove, obj.onMouseMove)); +#else + utest.Assert.pass(); // See PR 12763 discussion +#end + } + + static function genericCast(a:T->Void, b:T->Void):Bool { + var ca:Event->Void = cast a; + var cb:Event->Void = cast b; + return ca == cb; + } +}