Parcourir la source

[cpp] Do not mix 'class_string' the cppast. Closes #4983.

hughsando il y a 9 ans
Parent
commit
38cb3f6155
1 fichiers modifiés avec 21 ajouts et 14 suppressions
  1. 21 14
      src/generators/gencpp.ml

+ 21 - 14
src/generators/gencpp.ml

@@ -1815,25 +1815,25 @@ let rec s_tcpp = function
    | CppCastObjC _ -> "CppCastObjC"
    | CppCastNative _ -> "CppCastNative"
 
-and tcpp_to_string = function
+and tcpp_to_string_suffix suffix tcpp = match tcpp with
    | TCppDynamic -> "Dynamic"
    | TCppObject -> "Dynamic"
    | TCppVoid -> "void"
    | TCppVoidStar -> "void *"
    | TCppVariant -> "::cpp::Variant"
-   | TCppEnum(enum) -> "::hx::EnumBase"
+   | TCppEnum(enum) -> "::hx::EnumBase" ^ suffix
    | TCppScalar(scalar) -> scalar
    | TCppString -> "::String"
-   | TCppFastIterator it -> "::cpp::FastIterator< " ^ (tcpp_to_string it) ^ " >";
+   | TCppFastIterator it -> "::cpp::FastIterator" ^ suffix ^ "< " ^ (tcpp_to_string it) ^ " >";
    | TCppPointer(ptrType,valueType) -> "::cpp::" ^ ptrType ^ "< " ^ (tcpp_to_string valueType) ^ " >"
    | TCppRawPointer(constName,valueType) -> constName ^ (tcpp_to_string valueType) ^ "*"
    | TCppFunction(argTypes,retType,abi) ->
         let args = (String.concat "," (List.map tcpp_to_string argTypes)) in
         "::cpp::Function< " ^ abi ^ " " ^ (tcpp_to_string retType) ^ "(" ^ args ^ ") >"
-   | TCppDynamicArray -> "::cpp::VirtualArray"
-   | TCppObjectArray _ -> "::Array< ::Dynamic>"
+   | TCppDynamicArray -> "::cpp::VirtualArray" ^ suffix
+   | TCppObjectArray _ -> "::Array" ^ suffix ^ "< ::Dynamic>"
    | TCppWrapped _ -> "Dynamic"
-   | TCppScalarArray(value) -> "::Array< " ^ (tcpp_to_string value) ^ " >"
+   | TCppScalarArray(value) -> "::Array" ^ suffix ^ "< " ^ (tcpp_to_string value) ^ " >"
    | TCppObjC klass ->
       let path = join_class_path_remap klass.cl_path "::" in
       if klass.cl_interface then
@@ -1842,12 +1842,15 @@ and tcpp_to_string = function
          path ^ " *"
    | TCppNativePointer klass -> (join_class_path_remap klass.cl_path "::") ^ " *"
    | TCppInst klass ->
-        cpp_class_path_of klass
-   | TCppClass -> "hx::Class";
+        (cpp_class_path_of klass) ^ suffix
+   | TCppClass -> "hx::Class" ^ suffix;
    | TCppGlobal -> "";
    | TCppNull -> "Dynamic";
    | TCppCode _ -> "Code"
 
+and tcpp_to_string tcpp =
+    tcpp_to_string_suffix "" tcpp
+
 and cpp_class_path_of klass =
       "::" ^ (join_class_path_remap klass.cl_path "::")
 ;;
@@ -5508,10 +5511,14 @@ let rec has_gc_references class_def =
    || has_new_gc_references class_def
 ;;
 
-let rec find_next_super_iteration class_def =
+let rec find_next_super_iteration ctx class_def =
    match class_def.cl_super with
-   | Some  (klass,params) when has_new_gc_references klass -> class_string klass "_obj" params true
-   | Some  (klass,_) -> find_next_super_iteration klass
+   | Some  (klass,params) when has_new_gc_references klass ->
+        if ctx.ctx_cppast then
+           tcpp_to_string_suffix "_obj" (cpp_instance_type ctx klass params)
+        else
+           class_string klass "_obj" params true
+   | Some  (klass,_) -> find_next_super_iteration ctx klass
    | _ -> "";
 ;;
 
@@ -5664,7 +5671,7 @@ let generate_class_files baseCtx super_deps constructor_deps class_def inScripta
 
    ctx.ctx_class_name <- "::" ^ (join_class_path class_def.cl_path "::");
    ctx.ctx_class_super_name <- (match class_def.cl_super with
-      | Some (klass, params) -> class_string klass "_obj" params true
+      | Some (klass, params) -> (tcpp_to_string_suffix "_obj" (cpp_instance_type ctx klass params) )
       | _ -> "");
    if (debug>1) then print_endline ("Found class definition:" ^ ctx.ctx_class_name);
 
@@ -5915,7 +5922,7 @@ let generate_class_files baseCtx super_deps constructor_deps class_def inScripta
 
 
       if (override_iteration) then begin
-         let super_needs_iteration = find_next_super_iteration class_def in
+         let super_needs_iteration = find_next_super_iteration ctx class_def in
          (* MARK function - explicitly mark all child pointers *)
          output_cpp ("void " ^ class_name ^ "::__Mark(HX_MARK_PARAMS)\n{\n");
          output_cpp ("\tHX_MARK_BEGIN_CLASS(" ^ smart_class_name ^ ");\n");
@@ -6441,7 +6448,7 @@ let generate_class_files baseCtx super_deps constructor_deps class_def inScripta
 
    let h_file = new_header_file common_ctx common_ctx.file class_path in
    let super = match class_def.cl_super with
-      | Some (klass,params) -> (class_string klass "_obj" params true)
+      | Some (klass,params) -> (tcpp_to_string_suffix "_obj" (cpp_instance_type ctx klass params) )
       | _ when nativeGen -> ""
       | _ -> if (class_def.cl_interface) then "hx::Interface" else "hx::Object"
       in