@@ -2616,7 +2616,7 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
tree
build_jni_stub (tree method)
{
- tree jnifunc, call, body, method_sig, arg_types;
+ tree jnifunc, call, body, method_sig, arg_type;
tree jniarg0, jniarg1, jniarg2, jniarg3;
tree jni_func_type, tem;
tree env_var, res_var = NULL_TREE, block;
@@ -2624,7 +2624,9 @@ build_jni_stub (tree method)
tree meth_var;
tree bind;
VEC(tree,gc) *args = NULL;
+ VEC(tree,gc) *arg_types = NULL;
int args_size = 0;
+ function_args_iterator iter;
tree klass = DECL_CONTEXT (method);
klass = build_class_ref (klass);
@@ -2684,13 +2686,17 @@ build_jni_stub (tree method)
VEC_safe_push (tree, gc, args, tem);
}
- arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
- /* Argument types for static methods and the JNIEnv structure.
- FIXME: Write and use build_function_type_vec to avoid this. */
+ /* Argument types for static methods and the JNIEnv structure. */
+ VEC_safe_push (tree, gc, arg_types, ptr_type_node);
if (METHOD_STATIC (method))
- arg_types = tree_cons (NULL_TREE, object_ptr_type_node, arg_types);
- arg_types = tree_cons (NULL_TREE, ptr_type_node, arg_types);
+ VEC_safe_push (tree, gc, arg_types, object_ptr_type_node);
+ FOREACH_FUNCTION_ARGS (TREE_TYPE (method), arg_type, iter)
+ {
+ if (arg_type == void_type_node)
+ break;
+ VEC_safe_push (tree, gc, arg_types, arg_type);
+ }
/* We call _Jv_LookupJNIMethod to find the actual underlying
function pointer. _Jv_LookupJNIMethod will throw the appropriate
@@ -2703,7 +2709,7 @@ build_jni_stub (tree method)
IDENTIFIER_LENGTH (method_sig)));
jniarg3 = build_int_cst (NULL_TREE, args_size);
- tem = build_function_type (TREE_TYPE (TREE_TYPE (method)), arg_types);
+ tem = build_function_type_vec (TREE_TYPE (TREE_TYPE (method)), arg_types);
#ifdef MODIFY_JNI_METHOD_CALL
tem = MODIFY_JNI_METHOD_CALL (tem);
@@ -407,18 +407,17 @@ parse_signature_string (const unsigned char *sig_string, int sig_length)
if (str < limit && str[0] == '(')
{
- tree argtype_list = NULL_TREE;
+ VEC(tree,gc) *argtypes = NULL;
str++;
while (str < limit && str[0] != ')')
{
tree argtype = parse_signature_type (&str, limit);
- argtype_list = tree_cons (NULL_TREE, argtype, argtype_list);
+ VEC_safe_push (tree, gc, argtypes, argtype);
}
if (str++, str >= limit)
abort ();
result_type = parse_signature_type (&str, limit);
- argtype_list = chainon (nreverse (argtype_list), end_params_node);
- result_type = build_function_type (result_type, argtype_list);
+ result_type = build_function_type_vec (result_type, argtypes);
}
else
result_type = parse_signature_type (&str, limit);