Jelajahi Sumber

[cpp] Rework hxcpp 'main' logic. Closes #3227.

Hugh 10 tahun lalu
induk
melakukan
737b4102b3
1 mengubah file dengan 28 tambahan dan 8 penghapusan
  1. 28 8
      gencpp.ml

+ 28 - 8
gencpp.ml

@@ -2791,6 +2791,25 @@ let find_referenced_types ctx obj super_deps constructor_deps header_only for_de
    ;;
 
 
+let generate_main_header output_main =
+   output_main "#include <hxcpp.h>\n\n";
+   output_main "#include <stdio.h>\n\n";
+   output_main "extern \"C\" void __hxcpp_main();\n\n";
+   output_main "extern \"C\" void __hxcpp_lib_main();\n\n"
+;;
+
+let generate_main_footer1 output_main =
+   output_main "void __hxcpp_main() {\n";;
+
+let generate_main_footer2 output_main =
+   output_main "	}\n\n";
+   output_main "void __hxcpp_lib_main() {\n";
+   output_main "	HX_TOP_OF_STACK\n";
+   output_main "	hx::Boot();\n";
+   output_main "	__boot_all();\n";
+   output_main "	__hxcpp_main();\n";
+   output_main "	}\n"
+;;
 
 
 let generate_main common_ctx member_types super_deps class_def file_info =
@@ -2806,16 +2825,17 @@ let generate_main common_ctx member_types super_deps class_def file_info =
       let cpp_file = new_cpp_file common_ctx common_ctx.file ([],filename) in
       let output_main = (cpp_file#write) in
 
-      output_main "#include <hxcpp.h>\n\n";
-      output_main "#include <stdio.h>\n\n";
+      generate_main_header output_main;
 
       List.iter ( add_include cpp_file ) depend_referenced;
       output_main "\n\n";
 
-      output_main ( if is_main then "HX_BEGIN_MAIN\n\n" else "HX_BEGIN_LIB_MAIN\n\n" );
+      if is_main then output_main "\n#include <hx/HxcppMain.h>\n\n";
+
+      generate_main_footer1 output_main;
       gen_expression (new_context common_ctx cpp_file 1 file_info) false main_expression;
       output_main ";\n";
-      output_main ( if is_main then "HX_END_MAIN\n\n" else "HX_END_LIB_MAIN\n\n" );
+      generate_main_footer2 output_main;
       cpp_file#close;
    in
    generate_startup "__main__" true;
@@ -2826,10 +2846,10 @@ let generate_dummy_main common_ctx =
    let generate_startup filename is_main =
       let main_file = new_cpp_file common_ctx common_ctx.file ([],filename) in
       let output_main = (main_file#write) in
-      output_main "#include <hxcpp.h>\n\n";
-      output_main "#include <stdio.h>\n\n";
-      output_main ( if is_main then "HX_BEGIN_MAIN\n\n" else "HX_BEGIN_LIB_MAIN\n\n" );
-      output_main ( if is_main then "HX_END_MAIN\n\n" else "HX_END_LIB_MAIN\n\n" );
+      generate_main_header output_main;
+      if is_main then output_main "\n#include <hx/HxcppMain.h\n\n";
+      generate_main_footer1 output_main;
+      generate_main_footer2 output_main;
       main_file#close;
    in
    generate_startup "__main__" true;