Sfoglia il codice sorgente

[gencommon] small cleanup related to empty constructors

Dan Korostelev 9 anni fa
parent
commit
9d0b7ce0ac
3 ha cambiato i file con 24 aggiunte e 34 eliminazioni
  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 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 =
 		match c.cl_constructor with
 		| Some ctor ->
@@ -1766,6 +1757,15 @@ struct
 		| None -> ()
 		| 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 =
 		set_new_create_empty gen empty_ctor_expr;
 
@@ -1921,7 +1921,7 @@ end;;
 
 	depends on:
 		(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
 *)
 module InitFunction =
@@ -2165,7 +2165,7 @@ end;;
 
 	depends on:
 		(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
 *)
 module DynamicOperators =
@@ -2663,7 +2663,7 @@ let fun_args = List.map (function | (v,s) -> (v.v_name, (match s with | None ->
 
 	dependencies:
 		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 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
 
 	(*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_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]) });
 
-	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 ->
 		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
 
 	(*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_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]) });
 
-	CastDetect.configure gen (Some (TEnum(empty_e, []))) false;
+	CastDetect.configure gen (Some empty_ctor_type) false;
 
 	SwitchToIf.configure gen (fun e ->
 		match e.eexpr with