Browse Source

[cpp] More work on cppast - fix array new, add some fixed fields to Anon objects

hughsando 9 năm trước cách đây
mục cha
commit
64f11bce21
1 tập tin đã thay đổi với 35 bổ sung22 xóa
  1. 35 22
      gencpp.ml

+ 35 - 22
gencpp.ml

@@ -1593,6 +1593,7 @@ type tcpp =
    | TCppString
    | TCppFastIterator of tcpp
    | TCppPointer of string * tcpp
+   | TCppRawPointer of string * tcpp
    | TCppFunction of tcpp list * tcpp * string
    | TCppVoidStar
    | TCppDynamicArray
@@ -1659,7 +1660,7 @@ and tcppfuncloc =
    | FuncStatic of tclass * tclass_field
    | FuncEnumConstruct of tenum * tenum_field
    | FuncSuper of tcppthis
-   | FuncNew of tclass * tparams
+   | FuncNew of tclass * tcpp list
    | FuncDynamic of tcppexpr
    | FuncInternal of tcppexpr * string * string
    | FuncGlobal of string
@@ -1883,9 +1884,9 @@ let rec cpp_type_of haxe_type =
       | (["cpp"],"ConstPointer"), p::[] ->
             TCppPointer("ConstPointer", cpp_type_of p)
       | (["cpp"],"RawPointer"), p::[] ->
-            TCppPointer("RawPointer", cpp_type_of p)
+            TCppRawPointer("", cpp_type_of p)
       | (["cpp"],"ConstRawPointer"), p::[] ->
-            TCppPointer("ConstRawPointer", cpp_type_of p)
+            TCppRawPointer("const", cpp_type_of p)
       | (["cpp"],"Function"), [function_type; abi] ->
             cpp_function_type_of function_type abi;
 
@@ -1957,13 +1958,6 @@ let cpp_class_path_of klass =
       join_class_path_remap klass.cl_path "::"
 ;;
 
-let cpp_class_name klass =
-   let rename = get_meta_string klass.cl_meta Meta.Native in
-   if rename <> "" then
-      rename
-   else
-      (join_class_path_remap klass.cl_path "::") ^ "_obj"
-;;
 
 
 let cpp_enum_path_of enum =
@@ -1982,10 +1976,11 @@ let rec tcpp_to_string = function
    | TCppScalar(scalar) -> scalar
    | TCppString -> "::String"
    | TCppFastIterator it -> "::cpp::FastIterator< " ^ (tcpp_to_string it) ^ " >";
-   | TCppPointer(ptrType,valueType) -> "::cpp::" ^ ptrType ^ "< " ^ (tcpp_to_string valueType) ^ ">"
+   | 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 ^ ") >"
+        "::cpp::Function< " ^ abi ^ " " ^ (tcpp_to_string retType) ^ "(" ^ args ^ ") >"
    | TCppDynamicArray -> "::cpp::VirtualArray"
    | TCppObjectArray _ -> "::hx::Array<Dyanmic>"
    | TCppWrapped _ -> "Dynamic"
@@ -2003,6 +1998,18 @@ let rec tcpp_to_string = function
    | TCppPrivate -> "/* private */"
 ;;
 
+let cpp_class_name klass params =
+   let rename = get_meta_string klass.cl_meta Meta.Native in
+   if rename <> "" then
+      rename
+   else
+      (join_class_path_remap klass.cl_path "::") ^ "_obj" ^
+      (match params with
+      | [] -> ""
+      | _ -> "< " ^ (String.concat "," (List.map tcpp_to_string params) ) ^ " >"
+      )
+;;
+
 
 let cpp_variant_type_of t = match t with
    | TCppDynamic
@@ -2022,6 +2029,7 @@ let cpp_variant_type_of t = match t with
    | TCppFunction _
    | TCppNativePointer _
    | TCppPointer _
+   | TCppRawPointer _
    | TCppVoidStar -> TCppVoidStar
    | TCppScalar "Int"
    | TCppScalar "Bool"
@@ -2244,7 +2252,7 @@ let retype_expression ctx request_type function_args expression_tree =
          | TNew (clazz,params,args) ->
             (* New DynamicArray ? *)
             let retypedArgs = List.map (retype TCppDynamic ) args in
-            CppCall( FuncNew(clazz,params), retypedArgs), cpp_type_of expr.etype
+            CppCall( FuncNew(clazz,List.map cpp_type_of params), retypedArgs), cpp_type_of expr.etype
 
          | TFunction func ->
             let old_this_real = !this_real in
@@ -2507,7 +2515,7 @@ let gen_cpp_ast_expression_tree ctx function_args tree =
          | FuncInterface(expr,field) ->
               gen expr; out ("->" ^ (cpp_member_name_of field) ^ "_dyn()");
          | FuncStatic(clazz,field) ->
-              out (cpp_class_name clazz); out ("::" ^ (cpp_member_name_of field) ^ "_dyn()");
+              out (cpp_class_name clazz []); out ("::" ^ (cpp_member_name_of field) ^ "_dyn()");
          | FuncDynamic(expr) ->
               gen expr;
          | FuncGlobal(name) ->
@@ -2525,9 +2533,10 @@ let gen_cpp_ast_expression_tree ctx function_args tree =
               out ("this->" ^ (cpp_member_name_of field) );
          | FuncInstance(expr,field)
          | FuncInterface(expr,field) ->
-              gen expr; out ("->" ^ (cpp_member_name_of field) );
+              let operator = if expr.cpptype = TCppString then "." else "->" in
+              gen expr; out (operator ^ (cpp_member_name_of field) );
          | FuncStatic(clazz,field) ->
-              out (cpp_class_name clazz); out ("::" ^ (cpp_member_name_of field) );
+              out (cpp_class_name clazz []); out ("::" ^ (cpp_member_name_of field) );
          | FuncEnumConstruct(enum,field) ->
             out ((string_of_path enum.e_path) ^ "::" ^ (cpp_enum_name_of field));
 
@@ -2537,7 +2546,7 @@ let gen_cpp_ast_expression_tree ctx function_args tree =
               else
                  out ("__this->" ^ ctx.ctx_class_super_name ^ "::__construct");
          | FuncNew(clazz, params) ->
-            out ("new " ^ (string_of_path clazz.cl_path));
+            out ((cpp_class_name clazz params) ^ "::__new");
          | FuncInternal(expr,name,join) ->
               gen expr; out (join ^ name)
          | FuncGlobal(name) ->
@@ -2639,7 +2648,9 @@ let gen_cpp_ast_expression_tree ctx function_args tree =
          let sorted = List.sort (fun  (_,_,h0) (_,_,h1) -> Int32.compare h0 h1 )
                 (List.map (fun (name,value) -> name,value,(gen_hash32 0 name ) ) values) in
          ExtList.List.iteri (fun idx (name,value,_) ->
-            out "\n"; output_p value ("\t->setFixed(" ^ (string_of_int idx) ^ "," ^ (strq name) ^ ","); gen value; out ")";
+
+
+            out ("\n" ^ spacer); writer#write_i ("\t->setFixed(" ^ (string_of_int idx) ^ "," ^ (strq name) ^ ","); gen value; out ")";
          ) sorted;
 
       | CppArrayDecl(exprList) ->
@@ -2807,10 +2818,10 @@ let gen_cpp_ast_expression_tree ctx function_args tree =
       | CppCode(value, exprs) ->
          Codegen.interpolate_code ctx.ctx_common (format_code value) exprs out (fun e -> gen e) expr.cpppos
       | CppCastDynamic(expr,klass) ->
-         out ("hx::TCast< " ^ cpp_class_name klass ^ " >::cast("); gen expr; out ")"
+         out ("hx::TCast< " ^ cpp_class_name klass [] ^ " >::cast("); gen expr; out ")"
 
       | CppCastObjC(expr,klass) ->
-         out ("( (" ^ cpp_class_name klass ^ ") id ("); gen expr; out ") )"
+         out ("( (" ^ cpp_class_name klass [] ^ ") id ("); gen expr; out ") )"
 
       | CppCastNative(expr) ->
          out "("; gen expr; out ").mPtr"
@@ -2839,9 +2850,11 @@ let gen_cpp_ast_expression_tree ctx function_args tree =
       match loc with
       | VarClosure(var) -> out ("__this->" ^ var.v_name)
       | VarLocal(local) -> out local.v_name
-      | VarStatic(clazz,member) -> out (cpp_class_name clazz); out ("::" ^ (cpp_member_name_of member))
+      | VarStatic(clazz,member) -> out (cpp_class_name clazz [] ); out ("::" ^ (cpp_member_name_of member))
       | VarThis(member) -> out ("this->" ^ (cpp_member_name_of member))
-      | VarInstance(obj,member) -> gen obj; out ("->" ^ (cpp_member_name_of member))
+      | VarInstance(obj,member) ->
+         let operator = if obj.cpptype = TCppString then "." else "->" in
+         gen obj; out (operator ^ (cpp_member_name_of member))
 
    and string_of_op_eq op pos = match op with
       | OpAdd -> "+="