Browse Source

[java/cs] Do not edit common fields. Closes #3350

Cauê Waneck 10 years ago
parent
commit
dc62f59942
3 changed files with 32 additions and 28 deletions
  1. 24 21
      gencommon.ml
  2. 6 5
      gencs.ml
  3. 2 2
      genjava.ml

+ 24 - 21
gencommon.ml

@@ -535,6 +535,8 @@ type generator_ctx =
 	gfollow : (t, t) rule_dispatcher;
 
 	gtypes : (path, module_type) Hashtbl.t;
+	mutable gtypes_list : module_type list;
+	mutable gmodules : Type.module_def list;
 
 	(* cast detection helpers / settings *)
 	(* this is a cache for all field access types *)
@@ -731,6 +733,8 @@ let new_ctx con =
 		gsyntax_filters = new rule_map_dispatcher "gsyntax_filters";
 		gfollow = new rule_dispatcher "gfollow" false;
 		gtypes = types;
+		gtypes_list = con.types;
+		gmodules = con.modules;
 
 		greal_field_types = Hashtbl.create 0;
 		ghandle_cast = (fun to_t from_t e -> mk_cast to_t e);
@@ -741,12 +745,12 @@ let new_ctx con =
 
 		gadd_type = (fun md should_filter ->
 			if should_filter then begin
-				con.types <- md :: con.types;
-				con.modules <- { m_id = alloc_mid(); m_path = (t_path md); m_types = [md]; m_extra = module_extra "" "" 0. MFake } :: con.modules;
+				gen.gtypes_list <- md :: gen.gtypes_list;
+				gen.gmodules <- { m_id = alloc_mid(); m_path = (t_path md); m_types = [md]; m_extra = module_extra "" "" 0. MFake } :: gen.gmodules;
 				Hashtbl.add gen.gtypes (t_path md) md;
 			end else gen.gafter_filters_ended <- (fun () ->
-				con.types <- md :: con.types;
-				con.modules <- { m_id = alloc_mid(); m_path = (t_path md); m_types = [md]; m_extra = module_extra "" "" 0. MFake } :: con.modules;
+				gen.gtypes_list <- md :: gen.gtypes_list;
+				gen.gmodules <- { m_id = alloc_mid(); m_path = (t_path md); m_types = [md]; m_extra = module_extra "" "" 0. MFake } :: gen.gmodules;
 				Hashtbl.add gen.gtypes (t_path md) md;
 			) :: gen.gafter_filters_ended;
 		);
@@ -808,15 +812,14 @@ let reorder_modules gen =
 	let modules = Hashtbl.create 20 in
 	List.iter (fun md ->
 		Hashtbl.add modules ( (t_infos md).mt_module ).m_path md
-	) gen.gcon.types;
+	) gen.gtypes_list;
 
-	let con = gen.gcon in
-	con.modules <- [];
+	gen.gmodules <- [];
 	let processed = Hashtbl.create 20 in
 	Hashtbl.iter (fun md_path md ->
 		if not (Hashtbl.mem processed md_path) then begin
 			Hashtbl.add processed md_path true;
-			con.modules <- { m_id = alloc_mid(); m_path = md_path; m_types = List.rev ( Hashtbl.find_all modules md_path ); m_extra = (t_infos md).mt_module.m_extra } :: con.modules
+			gen.gmodules <- { m_id = alloc_mid(); m_path = md_path; m_types = List.rev ( Hashtbl.find_all modules md_path ); m_extra = (t_infos md).mt_module.m_extra } :: gen.gmodules
 		end
 	) modules
 
@@ -872,7 +875,7 @@ let run_filters gen =
 					let filters = [ filter#run_f ] in
 					let added_types = ref [] in
 					gen.gadd_to_module <- (fun md_type priority ->
-						gen.gcon.types <- md_type :: gen.gcon.types;
+						gen.gtypes_list <- md_type :: gen.gtypes_list;
 						added_types := (md_type, priority) :: !added_types
 					);
 
@@ -900,7 +903,7 @@ let run_filters gen =
 
 					loop (added_types @ (md :: acc)) tl
 		in
-		List.rev (loop [] gen.gcon.types)
+		List.rev (loop [] gen.gtypes_list)
 	in
 
 	let run_mod_filter filter =
@@ -932,21 +935,21 @@ let run_filters gen =
 					processed
 		in
 
-		let filtered = loop [] gen.gcon.types in
+		let filtered = loop [] gen.gtypes_list in
 		gen.gadd_to_module <- last_add_to_module;
-		gen.gcon.types <- List.rev (filtered)
+		gen.gtypes_list <- List.rev (filtered)
 	in
 
 	run_mod_filter gen.gmodule_filters;
 	List.iter (fun fn -> fn()) gen.gafter_mod_filters_ended;
 
 	let last_add_to_module = gen.gadd_to_module in
-	gen.gcon.types <- run_filters gen.gexpr_filters;
+	gen.gtypes_list <- run_filters gen.gexpr_filters;
 	gen.gadd_to_module <- last_add_to_module;
 
 	List.iter (fun fn -> fn()) gen.gafter_expr_filters_ended;
-	(* Codegen.post_process gen.gcon.types [gen.gexpr_filters#run_f]; *)
-	gen.gcon.types <- run_filters gen.gsyntax_filters;
+	(* Codegen.post_process gen.gtypes_list [gen.gexpr_filters#run_f]; *)
+	gen.gtypes_list <- run_filters gen.gsyntax_filters;
 	List.iter (fun fn -> fn()) gen.gafter_filters_ended;
 
 	reorder_modules gen;
@@ -1052,7 +1055,7 @@ let dump_descriptor gen name path_s module_s =
 					SourceWriter.newline w
 				| _ -> () (* still no typedef or abstract is generated *)
 		) md_def.m_types
-	) gen.gcon.modules;
+	) gen.gmodules;
 	SourceWriter.write w "end modules";
 	SourceWriter.newline w;
 	(* dump all resources *)
@@ -1162,7 +1165,7 @@ let generate_modules gen extension source_dir (module_gen : SourceWriter.source_
 			let path = path_of_md_def md_def in
 			write_file gen w source_dir path extension out_files
 		end
-	) gen.gcon.modules
+	) gen.gmodules
 
 let generate_modules_t gen extension source_dir change_path (module_gen : SourceWriter.source_writer->module_type->bool) out_files =
 	let source_dir = gen.gcon.file ^ "/" ^ source_dir in
@@ -1174,7 +1177,7 @@ let generate_modules_t gen extension source_dir change_path (module_gen : Source
 			let path = change_path (t_path md) in
 			write_file gen w (source_dir ^ "/" ^ (String.concat "/" (fst path))) path extension out_files;
 		end
-	) gen.gcon.types
+	) gen.gtypes_list
 
 (*
 	various helper functions
@@ -1623,7 +1626,7 @@ struct
 					| TAbstractDecl a -> a.a_meta <- (meta, [], a.a_pos) :: a.a_meta
 			end
 		in
-		List.iter filter gen.gcon.types
+		List.iter filter gen.gtypes_list
 
 end;;
 
@@ -1899,7 +1902,7 @@ struct
 			let basic = gen.gcon.basic in
 			let should_change cl = not cl.cl_interface && (not cl.cl_extern || is_hxgen (TClassDecl cl)) && (match cl.cl_kind with KAbstractImpl _ -> false | _ -> true) in
 			let static_ctor_name = gen.gmk_internal_name "hx" "ctor" in
-			let msize = List.length gen.gcon.types in
+			let msize = List.length gen.gtypes_list in
 			let processed, empty_ctors = Hashtbl.create msize, Hashtbl.create msize in
 
 
@@ -5001,7 +5004,7 @@ struct
 
 				| _ -> ()
 
-			) gen.gcon.types
+			) gen.gtypes_list
 
 	end;;
 

+ 6 - 5
gencs.ml

@@ -2670,7 +2670,7 @@ let configure gen =
 			 cl.cl_super <- Option.map super_map cl.cl_super;
 			 cl.cl_implements <- List.map super_map cl.cl_implements
 		| _ -> ()
-		) gen.gcon.types;
+		) gen.gtypes_list;
 
 	let closure_t = ClosuresToClass.DoubleAndDynamicClosureImpl.get_ctx gen 6 in
 
@@ -3291,15 +3291,16 @@ let configure gen =
 let generate con =
 	(try
 
+		let gen = new_ctx con in
+		let basic = con.basic in
+
 		if Common.defined_value con Define.Dce = "no" then begin
 			let m = { null_module with m_id = alloc_mid(); m_path = ["haxe";"lang"],"DceNo" } in
 			let cl = mk_class m (["haxe";"lang"],"DceNo") null_pos in
-			con.types <- (TClassDecl cl) :: con.types
+			gen.gtypes_list <- (TClassDecl cl) :: gen.gtypes_list;
+			Hashtbl.add gen.gtypes cl.cl_path (TClassDecl cl)
 		end;
 
-		let gen = new_ctx con in
-		let basic = con.basic in
-
 		(* make the basic functions in C# *)
 		let type_cl = get_cl ( get_type gen (["System"], "Type")) in
 		let basic_fns =

+ 2 - 2
genjava.ml

@@ -1873,7 +1873,7 @@ let configure gen =
 			| TAbstractDecl { a_path = ([],c) } ->
 					imports := ([],c) :: !imports
 			| _ -> ()
-		) gen.gcon.types;
+		) gen.gtypes_list;
 
 		newline w;
 		write w "@SuppressWarnings(value={";
@@ -2055,7 +2055,7 @@ let configure gen =
 			 cl.cl_super <- Option.map super_map cl.cl_super;
 			 cl.cl_implements <- List.map super_map cl.cl_implements
 		| _ -> ()
-		) gen.gcon.types;
+		) gen.gtypes_list;
 
 	let closure_t = ClosuresToClass.DoubleAndDynamicClosureImpl.get_ctx gen 6 in