Преглед изворни кода

[gencommon] small cleanup related to empty constructors

Dan Korostelev пре 9 година
родитељ
комит
9d0b7ce0ac
3 измењених фајлова са 24 додато и 34 уклоњено
  1. 12 12
      src/generators/gencommon.ml
  2. 6 11
      src/generators/gencs.ml
  3. 6 11
      src/generators/genjava.ml

+ 12 - 12
src/generators/gencommon.ml

@@ -1526,15 +1526,6 @@ struct
 
 
 	let name = "overloading_constructor"
 	let name = "overloading_constructor"
 
 
-	let set_new_create_empty gen empty_ctor_expr =
-		let old = gen.gtools.rf_create_empty in
-		gen.gtools.rf_create_empty <- (fun cl params pos ->
-			if is_hxgen (TClassDecl cl) then
-				{ eexpr = TNew(cl,params,[empty_ctor_expr]); etype = TInst(cl,params); epos = pos }
-			else
-				old cl params pos
-		)
-
 	let rec cur_ctor c tl =
 	let rec cur_ctor c tl =
 		match c.cl_constructor with
 		match c.cl_constructor with
 		| Some ctor ->
 		| Some ctor ->
@@ -1766,6 +1757,15 @@ struct
 		| None -> ()
 		| None -> ()
 		| Some e -> Type.iter loop e
 		| Some e -> Type.iter loop e
 
 
+	let set_new_create_empty gen empty_ctor_expr =
+		let old = gen.gtools.rf_create_empty in
+		gen.gtools.rf_create_empty <- (fun cl params pos ->
+			if is_hxgen (TClassDecl cl) then
+				{ eexpr = TNew(cl,params,[empty_ctor_expr]); etype = TInst(cl,params); epos = pos }
+			else
+				old cl params pos
+		)
+
 	let configure ~(empty_ctor_type : t) ~(empty_ctor_expr : texpr) gen =
 	let configure ~(empty_ctor_type : t) ~(empty_ctor_expr : texpr) gen =
 		set_new_create_empty gen empty_ctor_expr;
 		set_new_create_empty gen empty_ctor_expr;
 
 
@@ -1921,7 +1921,7 @@ end;;
 
 
 	depends on:
 	depends on:
 		(syntax) must run before ExprStatement module
 		(syntax) must run before ExprStatement module
-		(ok) must run before OverloadingCtor module so the constructor can be in the correct place
+		(ok) must run before OverloadingConstructor module so the constructor can be in the correct place
 		(syntax) must run before FunctionToClass module
 		(syntax) must run before FunctionToClass module
 *)
 *)
 module InitFunction =
 module InitFunction =
@@ -2165,7 +2165,7 @@ end;;
 
 
 	depends on:
 	depends on:
 		(syntax) must run before expression/statment normalization because it may generate complex expressions
 		(syntax) must run before expression/statment normalization because it may generate complex expressions
-		must run before OverloadingCtor due to later priority conflicts. Since ExpressionUnwrap is only
+		must run before OverloadingConstructor due to later priority conflicts. Since ExpressionUnwrap is only
 		defined afterwards, we will set this value with absolute values
 		defined afterwards, we will set this value with absolute values
 *)
 *)
 module DynamicOperators =
 module DynamicOperators =
@@ -2663,7 +2663,7 @@ let fun_args = List.map (function | (v,s) -> (v.v_name, (match s with | None ->
 
 
 	dependencies:
 	dependencies:
 		must run after dynamic field access, because of conflicting ways to deal with invokeField
 		must run after dynamic field access, because of conflicting ways to deal with invokeField
-		(module filter) must run after OverloadingCtor so we can also change the dynamic function expressions
+		(module filter) must run after OverloadingConstructor so we can also change the dynamic function expressions
 
 
 		uses TArray expressions for array. TODO see interaction
 		uses TArray expressions for array. TODO see interaction
 		uses TThrow expressions.
 		uses TThrow expressions.

+ 6 - 11
src/generators/gencs.ml

@@ -2783,16 +2783,11 @@ let configure gen =
 	let object_iface = get_cl (get_type gen (["haxe";"lang"],"IHxObject")) in
 	let object_iface = get_cl (get_type gen (["haxe";"lang"],"IHxObject")) in
 
 
 	(*fixme: THIS IS A HACK. take this off *)
 	(*fixme: THIS IS A HACK. take this off *)
-	let empty_e = match (get_type gen (["haxe";"lang"], "EmptyObject")) with | TEnumDecl e -> e | _ -> assert false in
-	(*OverloadingCtor.set_new_create_empty gen ({eexpr=TEnumField(empty_e, "EMPTY"); etype=TEnum(empty_e,[]); epos=null_pos;});*)
-
-	let empty_expr = { eexpr = (TTypeExpr (TEnumDecl empty_e)); etype = (TAnon { a_fields = PMap.empty; a_status = ref (EnumStatics empty_e) }); epos = null_pos } in
-	let empty_ef =
-		try
-			PMap.find "EMPTY" empty_e.e_constrs
-		with Not_found -> gen.gcon.error "Required enum field EMPTY was not found" empty_e.e_pos; assert false
-	in
-	OverloadingConstructor.configure ~empty_ctor_type:(TEnum(empty_e, [])) ~empty_ctor_expr:({ eexpr=TField(empty_expr, FEnum(empty_e, empty_ef)); etype=TEnum(empty_e,[]); epos=null_pos; }) gen;
+	let empty_en = match get_type gen (["haxe";"lang"], "EmptyObject") with TEnumDecl e -> e | _ -> assert false in
+	let empty_ctor_type = TEnum(empty_en, []) in
+	let empty_en_expr = mk (TTypeExpr (TEnumDecl empty_en)) (TAnon { a_fields = PMap.empty; a_status = ref (EnumStatics empty_en) }) null_pos in
+	let empty_ctor_expr = mk (TField (empty_en_expr, FEnum(empty_en, PMap.find "EMPTY" empty_en.e_constrs))) empty_ctor_type null_pos in
+	OverloadingConstructor.configure ~empty_ctor_type:empty_ctor_type ~empty_ctor_expr:empty_ctor_expr gen;
 
 
 	let rcf_static_find = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "findHash" Ast.null_pos [] in
 	let rcf_static_find = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "findHash" Ast.null_pos [] in
 	let rcf_static_lookup = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "lookupHash" Ast.null_pos [] in
 	let rcf_static_lookup = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "lookupHash" Ast.null_pos [] in
@@ -3117,7 +3112,7 @@ let configure gen =
 
 
 	ClassInstance.configure gen (fun e _ -> { e with eexpr = TCall({ eexpr = TLocal(alloc_var "__typeof__" t_dynamic); etype = t_dynamic; epos = e.epos }, [e]) });
 	ClassInstance.configure gen (fun e _ -> { e with eexpr = TCall({ eexpr = TLocal(alloc_var "__typeof__" t_dynamic); etype = t_dynamic; epos = e.epos }, [e]) });
 
 
-	CastDetect.configure gen (Some (TEnum(empty_e, []))) (not erase_generics) ~overloads_cast_to_base:true;
+	CastDetect.configure gen (Some empty_ctor_type) (not erase_generics) ~overloads_cast_to_base:true;
 
 
 	SwitchToIf.configure gen (fun e ->
 	SwitchToIf.configure gen (fun e ->
 		match e.eexpr with
 		match e.eexpr with

+ 6 - 11
src/generators/genjava.ml

@@ -2092,16 +2092,11 @@ let configure gen =
 	let object_iface = get_cl (get_type gen (["haxe";"lang"],"IHxObject")) in
 	let object_iface = get_cl (get_type gen (["haxe";"lang"],"IHxObject")) in
 
 
 	(*fixme: THIS IS A HACK. take this off *)
 	(*fixme: THIS IS A HACK. take this off *)
-	let empty_e = match (get_type gen (["haxe";"lang"], "EmptyObject")) with | TEnumDecl e -> e | _ -> assert false in
-	(*OverloadingCtor.set_new_create_empty gen ({eexpr=TEnumField(empty_e, "EMPTY"); etype=TEnum(empty_e,[]); epos=null_pos;});*)
-
-	let empty_expr = { eexpr = (TTypeExpr (TEnumDecl empty_e)); etype = (TAnon { a_fields = PMap.empty; a_status = ref (EnumStatics empty_e) }); epos = null_pos } in
-	let empty_ef =
-		try
-			PMap.find "EMPTY" empty_e.e_constrs
-		with Not_found -> gen.gcon.error "Required enum field EMPTY was not found" empty_e.e_pos; assert false
-	in
-	OverloadingConstructor.configure ~empty_ctor_type:(TEnum(empty_e, [])) ~empty_ctor_expr:({ eexpr=TField(empty_expr, FEnum(empty_e, empty_ef)); etype=TEnum(empty_e,[]); epos=null_pos; }) gen;
+	let empty_en = match get_type gen (["haxe";"lang"], "EmptyObject") with TEnumDecl e -> e | _ -> assert false in
+	let empty_ctor_type = TEnum(empty_en, []) in
+	let empty_en_expr = mk (TTypeExpr (TEnumDecl empty_en)) (TAnon { a_fields = PMap.empty; a_status = ref (EnumStatics empty_en) }) null_pos in
+	let empty_ctor_expr = mk (TField (empty_en_expr, FEnum(empty_en, PMap.find "EMPTY" empty_en.e_constrs))) empty_ctor_type null_pos in
+	OverloadingConstructor.configure ~empty_ctor_type:empty_ctor_type ~empty_ctor_expr:empty_ctor_expr gen;
 
 
 	let rcf_static_find = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "findHash" Ast.null_pos [] in
 	let rcf_static_find = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "findHash" Ast.null_pos [] in
 	(*let rcf_static_lookup = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "lookupHash" Ast.null_pos [] in*)
 	(*let rcf_static_lookup = mk_static_field_access_infer (get_cl (get_type gen (["haxe";"lang"], "FieldLookup"))) "lookupHash" Ast.null_pos [] in*)
@@ -2369,7 +2364,7 @@ let configure gen =
 
 
 	ClassInstance.configure gen (fun e _ -> { e with eexpr = TCall({ eexpr = TLocal(alloc_var "__typeof__" t_dynamic); etype = t_dynamic; epos = e.epos }, [e]) });
 	ClassInstance.configure gen (fun e _ -> { e with eexpr = TCall({ eexpr = TLocal(alloc_var "__typeof__" t_dynamic); etype = t_dynamic; epos = e.epos }, [e]) });
 
 
-	CastDetect.configure gen (Some (TEnum(empty_e, []))) false;
+	CastDetect.configure gen (Some empty_ctor_type) false;
 
 
 	SwitchToIf.configure gen (fun e ->
 	SwitchToIf.configure gen (fun e ->
 		match e.eexpr with
 		match e.eexpr with