Просмотр исходного кода

[cpp] Remove overrides from __scriptableFunctions (#12377)

* [cpp] Remove overrides from __scriptableFunctions

* [tests] Add case for host class overrides
tobil4sk 2 недель назад
Родитель
Сommit
33bbc8cc96

+ 1 - 1
src/generators/cpp/gen/cppGenClassImplementation.ml

@@ -977,7 +977,7 @@ let generate_managed_class base_ctx tcpp_class =
     if List.length tcpp_class.tcl_functions > 0 || List.length tcpp_class.tcl_static_functions > 0 then (
     if List.length tcpp_class.tcl_functions > 0 || List.length tcpp_class.tcl_static_functions > 0 then (
 
 
       let dump_script is_static f acc =
       let dump_script is_static f acc =
-        if f.tcf_name <> "toString" then (* toString implicitly overrides hx::Object::toString *)
+        if not f.tcf_is_overriding && f.tcf_name <> "toString" then (* toString implicitly overrides hx::Object::toString *)
           let signature = generate_script_function is_static f.tcf_field ("__s_" ^ f.tcf_field.cf_name) f.tcf_name in
           let signature = generate_script_function is_static f.tcf_field ("__s_" ^ f.tcf_field.cf_name) f.tcf_name in
           let superCall = if is_static then "0" else "__s_" ^ f.tcf_field.cf_name ^ "<true>" in
           let superCall = if is_static then "0" else "__s_" ^ f.tcf_field.cf_name ^ "<true>" in
           let named =
           let named =

+ 25 - 0
tests/unit/src/scripthost/Issue12376.hx

@@ -0,0 +1,25 @@
+package scripthost;
+
+#if cpp
+@:keep class HostParent12376 {
+	public function new() {}
+
+	public function methodA() {
+		return "HostParent.methodA()";
+	}
+}
+
+@:keep class HostChild12376 extends HostParent12376 {
+	override function methodA() {
+		return "HostChild.methodA()";
+	}
+
+	public function methodB() {
+		return "HostChild.methodB()";
+	}
+
+	public function methodC() {
+		return "HostChild.methodC()";
+	}
+}
+#end

+ 22 - 0
tests/unit/src/unit/issues/Issue12376.hx

@@ -0,0 +1,22 @@
+package unit.issues;
+
+import scripthost.Issue12376;
+
+class Issue12376 extends Test {
+	#if cppia
+	public function test() {
+		var child:ScriptChild = new ScriptChild();
+		eq('HostChild.methodA()', child.methodA());
+		eq('ScriptChild.methodB()', child.methodB());
+		eq('HostChild.methodC()', child.methodC());
+	}
+	#end
+}
+
+#if cppia
+private class ScriptChild extends HostChild12376 {
+	override function methodB() {
+		return 'ScriptChild.methodB()';
+	}
+}
+#end