|
@@ -1587,6 +1587,7 @@ let hx_stack_push ctx output clazz func_name pos =
|
|
|
|
|
|
type tcpp =
|
|
type tcpp =
|
|
| TCppDynamic
|
|
| TCppDynamic
|
|
|
|
+ | TCppObject
|
|
| TCppVoid
|
|
| TCppVoid
|
|
| TCppNull
|
|
| TCppNull
|
|
| TCppEnum of tenum
|
|
| TCppEnum of tenum
|
|
@@ -1667,6 +1668,7 @@ and tcppfuncloc =
|
|
| FuncDynamic of tcppexpr
|
|
| FuncDynamic of tcppexpr
|
|
| FuncInternal of tcppexpr * string * string
|
|
| FuncInternal of tcppexpr * string * string
|
|
| FuncGlobal of string
|
|
| FuncGlobal of string
|
|
|
|
+ | FuncFromStaticFunction
|
|
|
|
|
|
and tcpparrayloc =
|
|
and tcpparrayloc =
|
|
| ArrayTyped of tcppexpr * tcppexpr
|
|
| ArrayTyped of tcppexpr * tcppexpr
|
|
@@ -1696,6 +1698,7 @@ and tcpp_expr_expr =
|
|
| CppFunction of tcppfuncloc * tcpp
|
|
| CppFunction of tcppfuncloc * tcpp
|
|
| CppEnumField of tenum * tenum_field
|
|
| CppEnumField of tenum * tenum_field
|
|
| CppCall of tcppfuncloc * tcppexpr list
|
|
| CppCall of tcppfuncloc * tcppexpr list
|
|
|
|
+ | CppFunctionAddress of tclass * tclass_field
|
|
| CppArray of tcpparrayloc
|
|
| CppArray of tcpparrayloc
|
|
| CppCrement of tcppcrementop * Ast.unop_flag * tcpplvalue
|
|
| CppCrement of tcppcrementop * Ast.unop_flag * tcpplvalue
|
|
| CppSet of tcpplvalue * tcppexpr
|
|
| CppSet of tcpplvalue * tcppexpr
|
|
@@ -1740,6 +1743,7 @@ let s_tcpp = function
|
|
| CppFunction _ -> "CppFunction"
|
|
| CppFunction _ -> "CppFunction"
|
|
| CppEnumField _ -> "CppEnumField"
|
|
| CppEnumField _ -> "CppEnumField"
|
|
| CppCall _ -> "CppCall"
|
|
| CppCall _ -> "CppCall"
|
|
|
|
+ | CppFunctionAddress _ -> "CppFunctionAddress"
|
|
| CppArray _ -> "CppArray"
|
|
| CppArray _ -> "CppArray"
|
|
| CppCrement _ -> "CppCrement"
|
|
| CppCrement _ -> "CppCrement"
|
|
| CppSet _ -> "CppSet"
|
|
| CppSet _ -> "CppSet"
|
|
@@ -1833,6 +1837,7 @@ let cpp_class_path_of klass =
|
|
|
|
|
|
let rec tcpp_to_string = function
|
|
let rec tcpp_to_string = function
|
|
| TCppDynamic -> "Dynamic"
|
|
| TCppDynamic -> "Dynamic"
|
|
|
|
+ | TCppObject -> "Dynamic"
|
|
| TCppVoid -> "void"
|
|
| TCppVoid -> "void"
|
|
| TCppVoidStar -> "void *"
|
|
| TCppVoidStar -> "void *"
|
|
| TCppVariant -> "::cpp::Var"
|
|
| TCppVariant -> "::cpp::Var"
|
|
@@ -1874,6 +1879,7 @@ let rec cpp_type_of haxe_type =
|
|
| TCppDynamic ->
|
|
| TCppDynamic ->
|
|
TCppDynamicArray
|
|
TCppDynamicArray
|
|
|
|
|
|
|
|
+ | TCppObject
|
|
| TCppInst _
|
|
| TCppInst _
|
|
| TCppClass
|
|
| TCppClass
|
|
| TCppDynamicArray
|
|
| TCppDynamicArray
|
|
@@ -1913,7 +1919,7 @@ let rec cpp_type_of haxe_type =
|
|
| TAbstract ({ a_path = ([],"Bool") },[]) -> TCppScalar("Bool")
|
|
| TAbstract ({ a_path = ([],"Bool") },[]) -> TCppScalar("Bool")
|
|
| TAbstract ({ a_path = ([],"Float") },[]) -> TCppScalar("Float")
|
|
| TAbstract ({ a_path = ([],"Float") },[]) -> TCppScalar("Float")
|
|
| TAbstract ({ a_path = ([],"Int") },[]) -> TCppScalar("Int")
|
|
| TAbstract ({ a_path = ([],"Int") },[]) -> TCppScalar("Int")
|
|
- | TAbstract( { a_path = ([], "EnumValue") }, _ ) -> TCppDynamic
|
|
|
|
|
|
+ | TAbstract( { a_path = ([], "EnumValue") }, _ ) -> TCppObject
|
|
| TAbstract( { a_path = ([], "Class") }, _ ) -> TCppClass
|
|
| TAbstract( { a_path = ([], "Class") }, _ ) -> TCppClass
|
|
| TAbstract( { a_path = ([], "Enum") }, _ ) -> TCppClass
|
|
| TAbstract( { a_path = ([], "Enum") }, _ ) -> TCppClass
|
|
| TAbstract( { a_path = (["cpp"], "Char") }, _ ) -> TCppScalar("char")
|
|
| TAbstract( { a_path = (["cpp"], "Char") }, _ ) -> TCppScalar("char")
|
|
@@ -1931,6 +1937,9 @@ let rec cpp_type_of haxe_type =
|
|
|
|
|
|
| TEnum (enum,params) -> TCppEnum(enum)
|
|
| TEnum (enum,params) -> TCppEnum(enum)
|
|
|
|
|
|
|
|
+ | TInst ({ cl_path=([],"Array"); cl_kind = KTypeParameter _},_)
|
|
|
|
+ -> TCppObject
|
|
|
|
+
|
|
| TInst ({ cl_kind = KTypeParameter _},_)
|
|
| TInst ({ cl_kind = KTypeParameter _},_)
|
|
-> TCppDynamic
|
|
-> TCppDynamic
|
|
|
|
|
|
@@ -1984,12 +1993,8 @@ let rec cpp_type_of haxe_type =
|
|
assert false;
|
|
assert false;
|
|
*)
|
|
*)
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- | TFun _ -> TCppDynamic
|
|
|
|
- | TAnon _ -> TCppDynamic
|
|
|
|
|
|
+ | TFun _ -> TCppObject
|
|
|
|
+ | TAnon _ -> TCppObject
|
|
| TDynamic _ -> TCppDynamic
|
|
| TDynamic _ -> TCppDynamic
|
|
| TLazy func -> cpp_type_of ((!func)())
|
|
| TLazy func -> cpp_type_of ((!func)())
|
|
| TAbstract (abs,pl) when abs.a_impl <> None ->
|
|
| TAbstract (abs,pl) when abs.a_impl <> None ->
|
|
@@ -2081,6 +2086,7 @@ let cpp_class_name klass =
|
|
|
|
|
|
let cpp_variant_type_of t = match t with
|
|
let cpp_variant_type_of t = match t with
|
|
| TCppDynamic
|
|
| TCppDynamic
|
|
|
|
+ | TCppObject
|
|
| TCppVoid
|
|
| TCppVoid
|
|
| TCppFastIterator _
|
|
| TCppFastIterator _
|
|
| TCppDynamicArray
|
|
| TCppDynamicArray
|
|
@@ -2263,6 +2269,12 @@ let retype_expression ctx request_type function_args expression_tree =
|
|
| _ ->
|
|
| _ ->
|
|
CppFunction( FuncInstance(retypedObj, member), funcReturn ), exprType
|
|
CppFunction( FuncInstance(retypedObj, member), funcReturn ), exprType
|
|
end
|
|
end
|
|
|
|
+
|
|
|
|
+ | FStatic ( {cl_path=(["cpp"],"Function")}, ({cf_name="fromStaticFunction"} as member) ) ->
|
|
|
|
+ let funcReturn = cpp_member_return_type member in
|
|
|
|
+ let exprType = cpp_type_of member.cf_type in
|
|
|
|
+ CppFunction( FuncFromStaticFunction, funcReturn ), exprType
|
|
|
|
+
|
|
| FStatic (clazz,member) ->
|
|
| FStatic (clazz,member) ->
|
|
let funcReturn = cpp_member_return_type member in
|
|
let funcReturn = cpp_member_return_type member in
|
|
let exprType = cpp_type_of member.cf_type in
|
|
let exprType = cpp_type_of member.cf_type in
|
|
@@ -2309,6 +2321,12 @@ let retype_expression ctx request_type function_args expression_tree =
|
|
*)
|
|
*)
|
|
let retypedArgs = List.map (retype TCppDynamic ) args in
|
|
let retypedArgs = List.map (retype TCppDynamic ) args in
|
|
(match retypedFunc.cppexpr with
|
|
(match retypedFunc.cppexpr with
|
|
|
|
+ | CppFunction(FuncFromStaticFunction ,returnType) ->
|
|
|
|
+ ( match retypedArgs with
|
|
|
|
+ | [ {cppexpr=CppFunction( FuncStatic(clazz,member), funcReturn)} ] ->
|
|
|
|
+ CppFunctionAddress(clazz,member), funcReturn
|
|
|
|
+ | _ -> error "cpp.Function.fromStaticFunction must be called on static function" expr.epos;
|
|
|
|
+ )
|
|
| CppFunction(func,returnType) ->
|
|
| CppFunction(func,returnType) ->
|
|
CppCall(func,retypedArgs), returnType
|
|
CppCall(func,retypedArgs), returnType
|
|
| CppEnumField(enum, field) ->
|
|
| CppEnumField(enum, field) ->
|
|
@@ -2693,6 +2711,7 @@ let gen_cpp_ast_expression_tree ctx function_args injection tree =
|
|
| FuncSuper _ | FuncSuperConstruct -> error "Can't create super closure" expr.cpppos
|
|
| FuncSuper _ | FuncSuperConstruct -> error "Can't create super closure" expr.cpppos
|
|
| FuncNew _ -> error "Can't create new closure" expr.cpppos
|
|
| FuncNew _ -> error "Can't create new closure" expr.cpppos
|
|
| FuncEnumConstruct _ -> error "Enum constructor outside of CppCall" expr.cpppos
|
|
| FuncEnumConstruct _ -> error "Enum constructor outside of CppCall" expr.cpppos
|
|
|
|
+ | FuncFromStaticFunction -> error "Can't create cpp.Function.fromStaticFunction closure" expr.cpppos
|
|
);
|
|
);
|
|
| CppCall(func, args) ->
|
|
| CppCall(func, args) ->
|
|
let closeCall = ref "" in
|
|
let closeCall = ref "" in
|
|
@@ -2705,6 +2724,8 @@ let gen_cpp_ast_expression_tree ctx function_args injection tree =
|
|
gen expr; out (operator ^ (cpp_member_name_of field) );
|
|
gen expr; out (operator ^ (cpp_member_name_of field) );
|
|
| FuncStatic(clazz,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) );
|
|
|
|
+ | FuncFromStaticFunction ->
|
|
|
|
+ error "Unexpected FuncFromStaticFunction" expr.cpppos
|
|
| FuncEnumConstruct(enum,field) ->
|
|
| FuncEnumConstruct(enum,field) ->
|
|
out ((string_of_path enum.e_path) ^ "::" ^ (cpp_enum_name_of field));
|
|
out ((string_of_path enum.e_path) ^ "::" ^ (cpp_enum_name_of field));
|
|
|
|
|
|
@@ -2743,6 +2764,14 @@ let gen_cpp_ast_expression_tree ctx function_args injection tree =
|
|
) args;
|
|
) args;
|
|
out (")" ^ !closeCall);
|
|
out (")" ^ !closeCall);
|
|
|
|
|
|
|
|
+ | CppFunctionAddress(klass, member) ->
|
|
|
|
+ let signature = cpp_function_signature member.cf_type "" in
|
|
|
|
+ let name = cpp_member_name_of member in
|
|
|
|
+ (*let void_cast = has_meta_key field.cf_meta Meta.Void in*)
|
|
|
|
+ out ("::cpp::Function< " ^ signature ^">(");
|
|
|
|
+ out ("&::" ^(join_class_path_remap klass.cl_path "::")^ "_obj::" ^ name );
|
|
|
|
+ out " )"
|
|
|
|
+
|
|
| CppDynamicField(obj,name) ->
|
|
| CppDynamicField(obj,name) ->
|
|
gen obj;
|
|
gen obj;
|
|
out ("->__Field(" ^ (strq name) ^ ",hx::paccDynamic)");
|
|
out ("->__Field(" ^ (strq name) ^ ",hx::paccDynamic)");
|
|
@@ -2851,6 +2880,13 @@ let gen_cpp_ast_expression_tree ctx function_args injection tree =
|
|
|
|
|
|
if (expr.cpptype==TCppDynamic) then out ")";
|
|
if (expr.cpptype==TCppDynamic) then out ")";
|
|
|
|
|
|
|
|
+
|
|
|
|
+ | CppBinop( Ast.OpUShr, left, right) ->
|
|
|
|
+ out "hx::UShr("; gen left; out ","; gen right; out ")";
|
|
|
|
+
|
|
|
|
+ | CppBinop( Ast.OpMod, left, right) ->
|
|
|
|
+ out "hx::Mod("; gen left; out ","; gen right; out ")";
|
|
|
|
+
|
|
| CppBinop(op, left, right) ->
|
|
| CppBinop(op, left, right) ->
|
|
let op = string_of_op op expr.cpppos in
|
|
let op = string_of_op op expr.cpppos in
|
|
let castOpen, castClose = (match op with
|
|
let castOpen, castClose = (match op with
|