Răsfoiți Sursa

[jvm] generate method signature if it doesn't match the descriptor

see #11362
Simon Krajewski 1 an în urmă
părinte
comite
f5fcc4572e
2 a modificat fișierele cu 13 adăugiri și 10 ștergeri
  1. 10 8
      src/generators/genjvm.ml
  2. 3 2
      src/generators/jvm/jvmMethod.ml

+ 10 - 8
src/generators/genjvm.ml

@@ -2494,19 +2494,21 @@ class tclass_to_jvm gctx c = object(self)
 			let field_info = gctx.preprocessor#get_field_info cf.cf_meta in
 			self#generate_expr gctx field_info jc jm e scmode mtype;
 		end;
-		begin match cf.cf_params with
-			| [] when c.cl_params = [] ->
-				()
+		let ssig = generate_method_signature true jsig in
+		let ssig = match cf.cf_params with
+			| [] ->
+				ssig
 			| _ ->
 				let stl = String.concat "" (List.map (fun tp ->
 					Printf.sprintf "%s:Ljava/lang/Object;" tp.ttp_name
 				) cf.cf_params) in
-				let ssig = generate_method_signature true (jsignature_of_type gctx cf.cf_type) in
-				let s = if cf.cf_params = [] then ssig else Printf.sprintf "<%s>%s" stl ssig in
-				let offset = jc#get_pool#add_string s in
-				jm#add_attribute (AttributeSignature offset);
+				Printf.sprintf "<%s>%s" stl ssig
+		in
+		if ssig <> jm#get_descriptor then begin
+			let offset = jc#get_pool#add_string ssig in
+			jm#add_attribute (AttributeSignature offset);
 		end;
-		AnnotationHandler.generate_annotations (jm :> JvmBuilder.base_builder) cf.cf_meta;
+		AnnotationHandler.generate_annotations (jm :> JvmBuilder.base_builder) cf.cf_meta
 
 	method generate_field gctx (jc : JvmClass.builder) c mtype cf =
 		let jsig = jsignature_of_type gctx cf.cf_type in

+ 3 - 2
src/generators/jvm/jvmMethod.ml

@@ -149,6 +149,7 @@ class builder jc name jsig = object(self)
 	inherit base_builder
 	val code = new JvmCode.builder jc#get_pool
 
+	val descriptor = generate_method_signature false jsig
 	val mutable max_num_locals = 0
 	val mutable debug_locals = []
 	val mutable stack_frames = []
@@ -1081,6 +1082,7 @@ class builder jc name jsig = object(self)
 	method is_terminated = code#is_terminated
 	method get_name = name
 	method get_jsig = jsig
+	method get_descriptor = descriptor
 	method set_terminated b = code#set_terminated b
 
 	method private get_jcode (config : export_config) =
@@ -1149,8 +1151,7 @@ class builder jc name jsig = object(self)
 		end;
 		let attributes = self#export_attributes jc#get_pool in
 		let offset_name = jc#get_pool#add_string name in
-		let jsig = generate_method_signature false jsig in
-		let offset_desc = jc#get_pool#add_string jsig in
+		let offset_desc = jc#get_pool#add_string descriptor in
 		{
 			field_access_flags = access_flags;
 			field_name_index = offset_name;