@@ -7095,24 +7095,19 @@ output_field_constant (cb_tree x, int n, const char *flagname)
7095
7095
static void
7096
7096
output_java_call (struct cb_call * p )
7097
7097
{
7098
- char * full_name = (char * )CB_LITERAL (p -> name )-> data ; /* Assume java.prefix (enforced in `parser.y`, rule `call_body`)*/
7098
+ char * full_name = (char * )CB_LITERAL (p -> name )-> data ;
7099
7099
char * class_and_method_name = full_name + 5 ;
7100
7100
char * last_dot ;
7101
7101
char * method_name ;
7102
7102
const char * class_name ;
7103
7103
char return_type_signature [COB_MINI_BUFF ];
7104
7104
char method_signature [COB_NORMAL_BUFF ] = "(" ;
7105
- char * mangled ;
7105
+ char mangled [ COB_NORMAL_BUFF ] = "" ;
7106
7106
struct cb_tree_common * ptr ;
7107
7107
7108
- mangled = strdup (class_and_method_name );
7109
- for (size_t i = 0 ; i < strlen (mangled ) + 1 ; i ++ ) {
7110
- mangled [i ] = (mangled [i ] == '.' ) ? '_' : mangled [i ];
7111
- }
7112
-
7113
7108
last_dot = strrchr (class_and_method_name , '.' );
7114
7109
if (last_dot == NULL ) {
7115
- cobc_err_msg (_ ("malformed call '%s' to a Java method" ), class_and_method_name );
7110
+ cobc_err_msg (_ ("malformed call '%s' to a Java method" ), class_and_method_name );
7116
7111
return ;
7117
7112
}
7118
7113
@@ -7121,7 +7116,7 @@ output_java_call (struct cb_call *p)
7121
7116
class_name = class_and_method_name ;
7122
7117
7123
7118
for (int i = 0 ; (ptr = ((struct cb_tree_common * * )p -> args )[i ]) != NULL ; i ++ ) {
7124
- if (CB_TREE_TAG (ptr ) == CB_TAG_INTEGER ) {
7119
+ if (CB_TREE_TAG (ptr ) == CB_TAG_INTEGER ) {
7125
7120
struct cb_picture * pic = CB_FIELD (ptr )-> pic ;
7126
7121
if (pic ) {
7127
7122
int n = pic -> digits ;
@@ -7138,7 +7133,7 @@ output_java_call (struct cb_call *p)
7138
7133
}
7139
7134
}
7140
7135
}
7141
- }
7136
+ }
7142
7137
7143
7138
if (p -> call_returning == NULL ) {
7144
7139
strncat (method_signature , ")V" , COB_NORMAL_BUFF - strlen (method_signature ) - 1 );
@@ -7168,18 +7163,26 @@ output_java_call (struct cb_call *p)
7168
7163
strcpy (return_type_signature , "void" );
7169
7164
}
7170
7165
7171
- lookup_java_call (mangled , method_signature );
7166
+ strncat (mangled , class_and_method_name , COB_NORMAL_BUFF - strlen (mangled ) - 1 );
7167
+ strncat (mangled , "_" , COB_NORMAL_BUFF - strlen (mangled ) - 1 );
7168
+ strncat (mangled , method_name , COB_NORMAL_BUFF - strlen (mangled ) - 1 );
7169
+ strncat (mangled , method_signature , COB_NORMAL_BUFF - strlen (mangled ) - 1 );
7170
+
7171
+ for (char * c = mangled ; * c ; c ++ ) {
7172
+ if (* c == '.' || * c == ',' || * c == ' ' || * c == '(' || * c == ')' ) {
7173
+ * c = '_' ;
7174
+ }
7175
+ }
7176
+
7177
+ lookup_java_call (mangled , class_and_method_name , method_signature );
7178
+
7172
7179
output_line ("if (call_java_%s == NULL)" , mangled );
7173
7180
output_block_open ();
7174
-
7175
- output_prefix ();
7176
- output_line ("call_java_%s = " , mangled );
7177
- output ("cob_resolve_java(\"%s\", \"%s\", \"%s\", \"()V\");" , class_name , method_name , method_signature );
7178
- output_newline ();
7179
- output_prefix ();
7180
- output_line ("cob_call_java(call_java_%s);\n" , mangled );
7181
- output_newline ();
7181
+ output_line ("call_java_%s = cob_resolve_java(\"%s\", \"%s\", \"%s\");" , mangled , class_name , method_name , method_signature );
7182
+ output_line ("cob_call_java(call_java_%s);" , mangled );
7182
7183
output_block_close ();
7184
+
7185
+ output_exception_handling (p );
7183
7186
}
7184
7187
7185
7188
static void
0 commit comments