@@ -7098,7 +7098,9 @@ output_java_call (struct cb_call *p)
70987098 char * last_dot ;
70997099 char * method_name ;
71007100 const char * class_name ;
7101+ char method_signature [256 ] = "(" ;
71017102 char * mangled ;
7103+ struct cb_tree * ptr ;
71027104
71037105 mangled = strdup (class_and_method_name );
71047106 for (size_t i = 0 ; i < strlen (mangled ) + 1 ; i ++ ) {
@@ -7115,18 +7117,103 @@ output_java_call (struct cb_call *p)
71157117 method_name = last_dot + 1 ;
71167118 class_name = class_and_method_name ;
71177119
7120+ for (ptr = p -> args ; ptr != NULL ; ptr = ptr -> next ) {
7121+ switch (CB_TREE_TAG (ptr )) {
7122+ case CB_TAG_INTEGER :
7123+ strcat (method_signature , "I" );
7124+ break ;
7125+ case CB_TAG_LONG :
7126+ strcat (method_signature , "J" );
7127+ break ;
7128+ case CB_TAG_FLOAT :
7129+ strcat (method_signature , "F" );
7130+ break ;
7131+ case CB_TAG_DOUBLE :
7132+ strcat (method_signature , "D" );
7133+ break ;
7134+ case CB_TAG_BOOLEAN :
7135+ strcat (method_signature , "Z" );
7136+ break ;
7137+ case CB_TAG_BYTE :
7138+ strcat (method_signature , "B" );
7139+ break ;
7140+ case CB_TAG_SHORT :
7141+ strcat (method_signature , "S" );
7142+ break ;
7143+ case CB_TAG_CHAR :
7144+ strcat (method_signature , "C" );
7145+ break ;
7146+ case CB_TAG_STRING :
7147+ strcat (method_signature , "Ljava/lang/String;" );
7148+ break ;
7149+ case CB_TAG_OBJECT :
7150+ strcat (method_signature , "Ljava/lang/Object;" );
7151+ break ;
7152+ case CB_TAG_LITERAL :
7153+ if (CB_TREE_CATEGORY (ptr ) == CB_CATEGORY_NUMERIC ) {
7154+ strcat (method_signature , "I" );
7155+ } else if (CB_TREE_CATEGORY (ptr ) == CB_CATEGORY_ALPHANUMERIC ) {
7156+ strcat (method_signature , "Ljava/lang/String;" );
7157+ }
7158+ break ;
7159+ case CB_TAG_ARRAY :
7160+ switch (CB_TREE_TAG (CB_TREE (ptr )-> next )) {
7161+ case CB_TAG_INTEGER :
7162+ strcat (method_signature , "[I" );
7163+ break ;
7164+ case CB_TAG_LONG :
7165+ strcat (method_signature , "[J" );
7166+ break ;
7167+ case CB_TAG_FLOAT :
7168+ strcat (method_signature , "[F" );
7169+ break ;
7170+ case CB_TAG_DOUBLE :
7171+ strcat (method_signature , "[D" );
7172+ break ;
7173+ case CB_TAG_BOOLEAN :
7174+ strcat (method_signature , "[Z" );
7175+ break ;
7176+ case CB_TAG_BYTE :
7177+ strcat (method_signature , "[B" );
7178+ break ;
7179+ case CB_TAG_SHORT :
7180+ strcat (method_signature , "[S" );
7181+ break ;
7182+ case CB_TAG_CHAR :
7183+ strcat (method_signature , "[C" );
7184+ break ;
7185+ case CB_TAG_STRING :
7186+ strcat (method_signature , "[Ljava/lang/String;" );
7187+ break ;
7188+ case CB_TAG_OBJECT :
7189+ strcat (method_signature , "[Ljava/lang/Object;" );
7190+ break ;
7191+ default :
7192+ cobc_err_msg (_ ("Unsupported array type in Java method call" ));
7193+ COBC_ABORT ();
7194+ }
7195+ break ;
7196+ default :
7197+ cobc_err_msg (_ ("Unsupported argument type in Java method call" ));
7198+ COBC_ABORT ();
7199+ }
7200+ }
7201+
7202+ strcat (method_signature , ")V" );
7203+
71187204 lookup_java_call (mangled );
71197205 output_line ("if (call_java_%s == NULL)" , mangled );
71207206 output_block_open ();
71217207
71227208 output_prefix ();
71237209 output_line ("call_java_%s = " , mangled );
7124- output ("cob_resolve_java(\"%s\", \"%s\", \"()V\");" , class_name , method_name );
7210+ output ("cob_resolve_java(\"%s\", \"%s\", \"()V\");" , class_name , method_name , method_signature );
71257211 output_newline ();
71267212 output_prefix ();
71277213 output_line ("cob_call_java(call_java_%s);\n" , mangled );
71287214 output_newline ();
71297215 output_block_close ();
7216+ cobc_free (mangled );
71307217}
71317218
71327219static void
0 commit comments