Skip to content

Commit 332e29c

Browse files
committed
Updated output java call
1 parent 7b31a0b commit 332e29c

File tree

1 file changed

+88
-1
lines changed

1 file changed

+88
-1
lines changed

cobc/codegen.c

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

71327219
static void

0 commit comments

Comments
 (0)