All Java methods treated as varargs
Jonathan P. Olson
olson@mmsi.com
Sat Sep 19 10:32:00 GMT 1998
Turns out that gcj was treating all Java methods as C `stdarg' methods.
Note the following code from function.c:assign_parms()
/* Nonzero if function takes extra anonymous args.
This means the last named arg must be on the stack
right before the anonymous ones. */
int stdarg
= (TYPE_ARG_TYPES (fntype) != 0
&& (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
!= void_type_node));
What this does is assume that any argument list that doesn't end with
a `void_type_node' is treated as a variable length argument list. I added
the following patch to <gcc/java/decl.c> that should fixup the problem.
Check and make sure that it doesn't have any undesirable side effects:
*** egcs-19980906/gcc/java/decl.c.orig Sun Sep 6 08:36:07 1998
--- egcs-19980906/gcc/java/decl.c Sat Sep 19 08:45:44 1998
***************
*** 1516,1523 ****
}
}
*ptr = NULL_TREE;
- DECL_ARG_SLOT_COUNT (current_function_decl) = i;
while (i < DECL_MAX_LOCALS(fndecl))
type_map[i++] = NULL_TREE;
--- 1516,1533 ----
}
}
*ptr = NULL_TREE;
+ /* We need an extra `void' at the end of our parameter list so
+ that assign_parms() doesn't think that this is a variable length
+ argument list. */
+
+ if (i)
+ {
+ tem = tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
+ TREE_CHAIN (tem) = perm_tree_cons (NULL_TREE, void_type_node, NULL_TREE);
+ }
+
+ DECL_ARG_SLOT_COUNT (current_function_decl) = i;
while (i < DECL_MAX_LOCALS(fndecl))
type_map[i++] = NULL_TREE;
--
Jon Olson, Modular Mining Systems
3289 E. Hemisphere Loop
Tucson, AZ 85706
INTERNET: olson@mmsi.com
PHONE: (520)746-9127
FAX: (520)889-5790
More information about the Java
mailing list