Skip to content

Commit 8de4183

Browse files
committed
Updated output_java_call to include method signature in mangled name
1 parent 91751c8 commit 8de4183

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

cobc/codegen.c

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7095,24 +7095,19 @@ output_field_constant (cb_tree x, int n, const char *flagname)
70957095
static void
70967096
output_java_call (struct cb_call *p)
70977097
{
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;
70997099
char* class_and_method_name = full_name + 5;
71007100
char *last_dot;
71017101
char *method_name;
71027102
const char *class_name;
71037103
char return_type_signature[COB_MINI_BUFF];
71047104
char method_signature[COB_NORMAL_BUFF] = "(";
7105-
char* mangled;
7105+
char mangled[COB_NORMAL_BUFF] = "";
71067106
struct cb_tree_common *ptr;
71077107

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-
71137108
last_dot = strrchr(class_and_method_name, '.');
71147109
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);
71167111
return;
71177112
}
71187113

@@ -7121,7 +7116,7 @@ output_java_call (struct cb_call *p)
71217116
class_name = class_and_method_name;
71227117

71237118
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) {
71257120
struct cb_picture* pic = CB_FIELD(ptr)->pic;
71267121
if (pic) {
71277122
int n = pic->digits;
@@ -7138,7 +7133,7 @@ output_java_call (struct cb_call *p)
71387133
}
71397134
}
71407135
}
7141-
}
7136+
}
71427137

71437138
if (p->call_returning == NULL) {
71447139
strncat(method_signature, ")V", COB_NORMAL_BUFF - strlen(method_signature) - 1);
@@ -7168,18 +7163,26 @@ output_java_call (struct cb_call *p)
71687163
strcpy(return_type_signature, "void");
71697164
}
71707165

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+
71727179
output_line("if (call_java_%s == NULL)", mangled);
71737180
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);
71827183
output_block_close();
7184+
7185+
output_exception_handling(p);
71837186
}
71847187

71857188
static void

0 commit comments

Comments
 (0)