浏览代码

[cpp] Use previously create glue interface functions if they exist. For #6906

Hugh Sanderson 7 年之前
父节点
当前提交
a1bd124464
共有 1 个文件被更改,包括 12 次插入10 次删除
  1. 12 10
      src/generators/gencpp.ml

+ 12 - 10
src/generators/gencpp.ml

@@ -5732,17 +5732,19 @@ let generate_class_files baseCtx super_deps constructor_deps class_def inScripta
                          *)
                          *)
                          let castKey = if interface_name="_hx_haxe_IMap" && realName="set" then castKey ^ "*" else castKey in
                          let castKey = if interface_name="_hx_haxe_IMap" && realName="set" then castKey ^ "*" else castKey in
                          let implementationKey = realName ^ "::" ^ class_implementation in
                          let implementationKey = realName ^ "::" ^ class_implementation in
-                         if castKey <> implementationKey && not (Hashtbl.mem alreadyGlued castKey) then begin
-                            Hashtbl.replace alreadyGlued castKey ();
+                         if castKey <> implementationKey then begin
                             let glue =  Printf.sprintf "%s_%08lx" field.cf_name (gen_hash32 0 cast) in
                             let glue =  Printf.sprintf "%s_%08lx" field.cf_name (gen_hash32 0 cast) in
-                            let argList = ctx_tfun_arg_list ctx true args in
-                            let returnType = ctx_type_string ctx return_type in
-                            let returnStr = if returnType="void" then "" else "return " in
-                            let cppCode = returnType ^ " " ^ class_name ^ "::" ^ glue ^ "(" ^ argList ^ ") {\n" ^
-                               "\t\t\t" ^ returnStr ^ realName ^ "(" ^ cpp_arg_names args ^ ");\n}\n" in
-                            let headerCode = "\t\t" ^ returnType ^ " " ^ glue ^ "(" ^ argList ^ ");\n" in
-                            header_glue := headerCode :: !header_glue;
-                            cpp_glue := cppCode :: !cpp_glue;
+                            if not (Hashtbl.mem alreadyGlued castKey) then begin
+                               Hashtbl.replace alreadyGlued castKey ();
+                               let argList = ctx_tfun_arg_list ctx true args in
+                               let returnType = ctx_type_string ctx return_type in
+                               let returnStr = if returnType="void" then "" else "return " in
+                               let cppCode = returnType ^ " " ^ class_name ^ "::" ^ glue ^ "(" ^ argList ^ ") {\n" ^
+                                  "\t\t\t" ^ returnStr ^ realName ^ "(" ^ cpp_arg_names args ^ ");\n}\n" in
+                               let headerCode = "\t\t" ^ returnType ^ " " ^ glue ^ "(" ^ argList ^ ");\n" in
+                               header_glue := headerCode :: !header_glue;
+                               cpp_glue := cppCode :: !cpp_glue;
+                            end;
                             output_cpp ("	" ^ cast ^ "&" ^ implname ^ "::" ^ glue ^ ",\n");
                             output_cpp ("	" ^ cast ^ "&" ^ implname ^ "::" ^ glue ^ ",\n");
                          end else
                          end else
                             output_cpp ("	" ^ cast ^ "&" ^ implname ^ "::" ^ realName ^ ",\n");
                             output_cpp ("	" ^ cast ^ "&" ^ implname ^ "::" ^ realName ^ ",\n");