1 /* Handle types for the GNU compiler for the Java(TM) language.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
21 Java and all Java-based marks are trademarks or registered trademarks
22 of Sun Microsystems, Inc. in the United States and other countries.
23 The Free Software Foundation is independent of Sun Microsystems, Inc. */
25 /* Written by Per Bothner <bothner@cygnus.com> */
32 #include "java-tree.h"
37 static tree convert_ieee_real_to_integer PARAMS ((tree, tree));
38 static tree parse_signature_type PARAMS ((const unsigned char **,
39 const unsigned char *));
40 static tree lookup_do PARAMS ((tree, tree, tree, tree, tree (*)(tree)));
43 extern struct obstack permanent_obstack;
45 /* Set the type of the local variable with index SLOT to TYPE. */
48 set_local_type (slot, type)
52 int max_locals = DECL_MAX_LOCALS(current_function_decl);
53 int nslots = TYPE_IS_WIDE (type) ? 2 : 1;
54 if (slot < 0 || slot + nslots - 1 >= max_locals)
55 fatal ("invalid local variable index");
56 type_map[slot] = type;
58 type_map[++slot] = void_type_node;
61 /* Convert an IEEE real to an integer type. The result of such a
62 conversion when the source operand is a NaN isn't defined by
63 IEEE754, but by the Java language standard: it must be zero. Also,
64 overflows must be clipped to within range. This conversion
65 produces something like:
67 ((expr >= (float)MAX_INT)
69 : ((expr <= (float)MIN_INT)
76 convert_ieee_real_to_integer (type, expr)
80 expr = save_expr (expr);
82 result = build (COND_EXPR, type,
83 build (NE_EXPR, boolean_type_node, expr, expr),
84 convert (type, integer_zero_node),
85 convert_to_integer (type, expr));
87 result = build (COND_EXPR, type,
88 build (LE_EXPR, boolean_type_node, expr,
89 convert (TREE_TYPE (expr), TYPE_MIN_VALUE (type))),
90 TYPE_MIN_VALUE (type),
93 result = build (COND_EXPR, type,
94 build (GE_EXPR, boolean_type_node, expr,
95 convert (TREE_TYPE (expr), TYPE_MAX_VALUE (type))),
96 TYPE_MAX_VALUE (type),
102 /* Create an expression whose value is that of EXPR,
103 converted to type TYPE. The TREE_TYPE of the value
104 is always TYPE. This function implements all reasonable
105 conversions; callers should filter out those that are
106 not permitted by the language being compiled. */
112 register enum tree_code code = TREE_CODE (type);
115 return error_mark_node;
118 return build1 (NOP_EXPR, type, expr);
120 if (type == TREE_TYPE (expr)
121 || TREE_CODE (expr) == ERROR_MARK)
123 if (TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK)
124 return error_mark_node;
125 if (code == VOID_TYPE)
126 return build1 (CONVERT_EXPR, type, expr);
127 if (code == BOOLEAN_TYPE)
128 return fold (convert_to_boolean (type, expr));
129 if (code == INTEGER_TYPE)
132 && ! flag_emit_class_files
133 && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE
134 && TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
135 return fold (convert_ieee_real_to_integer (type, expr));
137 return fold (convert_to_integer (type, expr));
139 if (code == REAL_TYPE)
140 return fold (convert_to_real (type, expr));
141 if (code == CHAR_TYPE)
142 return fold (convert_to_char (type, expr));
143 if (code == POINTER_TYPE)
144 return fold (convert_to_pointer (type, expr));
145 error ("conversion to non-scalar type requested");
146 return error_mark_node;
151 convert_to_char (type, expr)
154 return build1 (NOP_EXPR, type, expr);
158 convert_to_boolean (type, expr)
161 return build1 (NOP_EXPR, type, expr);
164 /* Print an error message for invalid use of an incomplete type.
165 VALUE is the expression that was used (or 0 if that isn't known)
166 and TYPE is the type that was invalid. */
169 incomplete_type_error (value, type)
170 tree value ATTRIBUTE_UNUSED;
171 tree type ATTRIBUTE_UNUSED;
173 error ("internal error - use of undefined type");
176 /* Return a data type that has machine mode MODE.
177 If the mode is an integer,
178 then UNSIGNEDP selects between signed and unsigned types. */
181 type_for_mode (mode, unsignedp)
182 enum machine_mode mode;
185 if (mode == TYPE_MODE (int_type_node))
186 return unsignedp ? unsigned_int_type_node : int_type_node;
187 if (mode == TYPE_MODE (long_type_node))
188 return unsignedp ? unsigned_long_type_node : long_type_node;
189 if (mode == TYPE_MODE (short_type_node))
190 return unsignedp ? unsigned_short_type_node : short_type_node;
191 if (mode == TYPE_MODE (byte_type_node))
192 return unsignedp ? unsigned_byte_type_node : byte_type_node;
193 if (mode == TYPE_MODE (float_type_node))
194 return float_type_node;
195 if (mode == TYPE_MODE (double_type_node))
196 return double_type_node;
201 /* Return an integer type with BITS bits of precision,
202 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
205 type_for_size (bits, unsignedp)
209 if (bits <= TYPE_PRECISION (byte_type_node))
210 return unsignedp ? unsigned_byte_type_node : byte_type_node;
211 if (bits <= TYPE_PRECISION (short_type_node))
212 return unsignedp ? unsigned_short_type_node : short_type_node;
213 if (bits <= TYPE_PRECISION (int_type_node))
214 return unsignedp ? unsigned_int_type_node : int_type_node;
215 if (bits <= TYPE_PRECISION (long_type_node))
216 return unsignedp ? unsigned_long_type_node : long_type_node;
220 /* Return a type the same as TYPE except unsigned or
221 signed according to UNSIGNEDP. */
224 signed_or_unsigned_type (unsignedp, type)
228 if (! INTEGRAL_TYPE_P (type))
230 if (TYPE_PRECISION (type) == TYPE_PRECISION (int_type_node))
231 return unsignedp ? unsigned_int_type_node : int_type_node;
232 if (TYPE_PRECISION (type) == TYPE_PRECISION (byte_type_node))
233 return unsignedp ? unsigned_byte_type_node : byte_type_node;
234 if (TYPE_PRECISION (type) == TYPE_PRECISION (short_type_node))
235 return unsignedp ? unsigned_short_type_node : short_type_node;
236 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_type_node))
237 return unsignedp ? unsigned_long_type_node : long_type_node;
241 /* Return a signed type the same as TYPE in other respects. */
247 return signed_or_unsigned_type (0, type);
250 /* Return an unsigned type the same as TYPE in other respects. */
256 return signed_or_unsigned_type (1, type);
260 /* Mark EXP saying that we need to be able to take the
261 address of it; it should not be allocated in a register.
262 Value is 1 if successful. */
265 mark_addressable (exp)
268 register tree x = exp;
270 switch (TREE_CODE (x))
277 x = TREE_OPERAND (x, 0);
280 case TRUTH_ANDIF_EXPR:
281 case TRUTH_ORIF_EXPR:
283 x = TREE_OPERAND (x, 1);
287 return mark_addressable (TREE_OPERAND (x, 1))
288 & mark_addressable (TREE_OPERAND (x, 2));
291 TREE_ADDRESSABLE (x) = 1;
295 /* We sometimes add a cast *(TYPE*)&FOO to handle type and mode
296 incompatibility problems. Handle this case by marking FOO. */
297 if (TREE_CODE (TREE_OPERAND (x, 0)) == NOP_EXPR
298 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (x, 0), 0)) == ADDR_EXPR)
300 x = TREE_OPERAND (TREE_OPERAND (x, 0), 0);
303 if (TREE_CODE (TREE_OPERAND (x, 0)) == ADDR_EXPR)
305 x = TREE_OPERAND (x, 0);
315 TREE_ADDRESSABLE (x) = 1;
316 #if 0 /* poplevel deals with this now. */
317 if (DECL_CONTEXT (x) == 0)
318 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
326 /* Thorough checking of the arrayness of TYPE. */
329 is_array_type_p (type)
332 return TREE_CODE (type) == POINTER_TYPE
333 && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
334 && TYPE_ARRAY_P (TREE_TYPE (type));
337 /* Return the length of a Java array type.
338 Return -1 if the length is unknown or non-constant. */
341 java_array_type_length (array_type)
345 if (TREE_CODE (array_type) == POINTER_TYPE)
346 array_type = TREE_TYPE (array_type);
347 arfld = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (array_type)));
348 if (arfld != NULL_TREE)
350 tree index_type = TYPE_DOMAIN (TREE_TYPE (arfld));
351 tree high = TYPE_MAX_VALUE (index_type);
352 if (TREE_CODE (high) == INTEGER_CST)
353 return TREE_INT_CST_LOW (high) + 1;
359 build_prim_array_type (element_type, length)
361 HOST_WIDE_INT length;
363 tree max_index = build_int_2 (length - 1, (0 == length ? -1 : 0));
364 TREE_TYPE (max_index) = sizetype;
365 return build_array_type (element_type, build_index_type (max_index));
368 /* Return a Java array type with a given ELEMENT_TYPE and LENGTH.
369 These are hashed (shared) using IDENTIFIER_SIGNATURE_TYPE.
370 The LENGTH is -1 if the length is unknown. */
373 build_java_array_type (element_type, length)
375 HOST_WIDE_INT length;
379 tree elsig = build_java_signature (element_type);
380 tree el_name = element_type;
383 sprintf (buf+1, HOST_WIDE_INT_PRINT_DEC, length);
386 sig = ident_subst (IDENTIFIER_POINTER (elsig), IDENTIFIER_LENGTH (elsig),
388 t = IDENTIFIER_SIGNATURE_TYPE (sig);
390 return TREE_TYPE (t);
392 IDENTIFIER_SIGNATURE_TYPE (sig) = build_pointer_type (t);
393 TYPE_ARRAY_P (t) = 1;
395 if (TREE_CODE (el_name) == POINTER_TYPE)
396 el_name = TREE_TYPE (el_name);
397 el_name = TYPE_NAME (el_name);
398 if (TREE_CODE (el_name) == TYPE_DECL)
399 el_name = DECL_NAME (el_name);
400 TYPE_NAME (t) = identifier_subst (el_name, "", '.', '.', "[]");
402 set_java_signature (t, sig);
403 set_super_info (0, t, object_type_node, 0);
404 if (TREE_CODE (element_type) == RECORD_TYPE)
405 element_type = promote_type (element_type);
406 TYPE_ARRAY_ELEMENT (t) = element_type;
408 /* Add length pseudo-field. */
409 push_obstacks (&permanent_obstack, &permanent_obstack);
410 fld = build_decl (FIELD_DECL, get_identifier ("length"), int_type_node);
411 TYPE_FIELDS (t) = fld;
412 DECL_CONTEXT (fld) = t;
413 FIELD_PUBLIC (fld) = 1;
414 FIELD_FINAL (fld) = 1;
418 tree atype = build_prim_array_type (element_type, length);
419 tree arfld = build_decl (FIELD_DECL, get_identifier ("data"), atype);
421 DECL_CONTEXT (arfld) = t;
422 TREE_CHAIN (fld) = arfld;
424 /* We need to force the data field to begin at an alignment at
425 least equal to the biggest alignment in an object type node
426 in order to be compatible with the way that JArray is defined
427 in CNI. However, we can't exceed BIGGEST_FIELD_ALIGNMENT. */
429 unsigned desired_align = TYPE_ALIGN (object_type_node);
430 desired_align = MAX (desired_align, TYPE_ALIGN (element_type));
431 #ifdef BIGGEST_FIELD_ALIGNMENT
432 desired_align = MIN (desired_align,
433 (unsigned) BIGGEST_FIELD_ALIGNMENT);
435 #ifdef ADJUST_FIELD_ALIGN
436 desired_align = ADJUST_FIELD_ALIGN (field, desired_align);
438 DECL_ALIGN (arfld) = desired_align;
443 unsigned desired_align = TYPE_ALIGN (element_type);
444 #ifdef BIGGEST_FIELD_ALIGNMENT
445 desired_align = MIN (desired_align, (unsigned) BIGGEST_FIELD_ALIGNMENT);
447 TYPE_ALIGN (t) = desired_align;
451 /* We could layout_class, but that loads java.lang.Object prematurely.
452 * This is called by the parser, and it is a bad idea to do load_class
453 * in the middle of parsing, because of possible circularity problems. */
454 push_super_field (t, object_type_node);
460 /* Promote TYPE to the type actually used for fields and parameters. */
466 switch (TREE_CODE (type))
469 return build_pointer_type (CLASS_TO_HANDLE_TYPE (type));
471 if (type == boolean_type_node)
472 return promoted_boolean_type_node;
475 if (type == char_type_node)
476 return promoted_char_type_node;
480 if (TYPE_PRECISION (type) < TYPE_PRECISION (int_type_node))
482 if (type == short_type_node)
483 return promoted_short_type_node;
484 if (type == byte_type_node)
485 return promoted_byte_type_node;
486 return int_type_node;
488 /* ... else fall through ... */
494 /* Parse a signature string, starting at *PTR and ending at LIMIT.
495 Return the seen TREE_TYPE, updating *PTR. */
498 parse_signature_type (ptr, limit)
499 const unsigned char **ptr, *limit;
503 fatal ("bad signature string");
506 case 'B': (*ptr)++; return byte_type_node;
507 case 'C': (*ptr)++; return char_type_node;
508 case 'D': (*ptr)++; return double_type_node;
509 case 'F': (*ptr)++; return float_type_node;
510 case 'S': (*ptr)++; return short_type_node;
511 case 'I': (*ptr)++; return int_type_node;
512 case 'J': (*ptr)++; return long_type_node;
513 case 'Z': (*ptr)++; return boolean_type_node;
514 case 'V': (*ptr)++; return void_type_node;
516 for ((*ptr)++; (*ptr) < limit && ISDIGIT (**ptr); ) (*ptr)++;
517 type = parse_signature_type (ptr, limit);
518 type = build_java_array_type (type, -1);
522 const unsigned char *start = ++(*ptr);
523 register const unsigned char *str = start;
527 fatal ("bad signature string");
532 type = lookup_class (unmangle_classname (start, str - start));
536 fatal ("unrecognized signature string");
538 return promote_type (type);
541 /* Parse a Java "mangled" signature string, starting at SIG_STRING,
542 and SIG_LENGTH bytes long.
543 Return a gcc type node. */
546 parse_signature_string (sig_string, sig_length)
547 const unsigned char *sig_string;
551 const unsigned char *str = sig_string;
552 const unsigned char *limit = str + sig_length;
554 push_obstacks (&permanent_obstack, &permanent_obstack);
555 if (str < limit && str[0] == '(')
557 tree argtype_list = NULL_TREE;
559 while (str < limit && str[0] != ')')
561 tree argtype = parse_signature_type (&str, limit);
562 argtype_list = tree_cons (NULL_TREE, argtype, argtype_list);
564 if (str++, str >= limit)
565 fatal ("bad signature string");
566 result_type = parse_signature_type (&str, limit);
567 argtype_list = chainon (nreverse (argtype_list), end_params_node);
568 result_type = build_function_type (result_type, argtype_list);
571 result_type = parse_signature_type (&str, limit);
573 error ("junk at end of signature string");
578 /* Convert a signature to its type.
579 * Uses IDENTIFIER_SIGNATURE_TYPE as a cache (except for primitive types).
583 get_type_from_signature (tree signature)
585 const unsigned char *sig = (const unsigned char *) IDENTIFIER_POINTER (signature);
586 int len = IDENTIFIER_LENGTH (signature);
588 /* Primitive types aren't cached. */
590 return parse_signature_string (sig, len);
591 type = IDENTIFIER_SIGNATURE_TYPE (signature);
592 if (type == NULL_TREE)
594 type = parse_signature_string (sig, len);
595 IDENTIFIER_SIGNATURE_TYPE (signature) = type;
600 /* Return the signature string for the arguments of method type TYPE. */
603 build_java_argument_signature (type)
606 extern struct obstack temporary_obstack;
607 tree sig = TYPE_ARGUMENT_SIGNATURE (type);
608 if (sig == NULL_TREE)
610 tree args = TYPE_ARG_TYPES (type);
611 if (TREE_CODE (type) == METHOD_TYPE)
612 args = TREE_CHAIN (args); /* Skip "this" argument. */
613 for (; args != end_params_node; args = TREE_CHAIN (args))
615 tree t = build_java_signature (TREE_VALUE (args));
616 obstack_grow (&temporary_obstack,
617 IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t));
619 obstack_1grow (&temporary_obstack, '\0');
621 sig = get_identifier (obstack_base (&temporary_obstack));
622 TYPE_ARGUMENT_SIGNATURE (type) = sig;
623 obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
628 /* Return the signature of the given TYPE. */
631 build_java_signature (type)
635 push_obstacks (&permanent_obstack, &permanent_obstack);
636 while (TREE_CODE (type) == POINTER_TYPE)
637 type = TREE_TYPE (type);
638 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
639 sig = TYPE_SIGNATURE (type);
640 if (sig == NULL_TREE)
643 switch (TREE_CODE (type))
645 case BOOLEAN_TYPE: sg[0] = 'Z'; goto native;
646 case CHAR_TYPE: sg[0] = 'C'; goto native;
647 case VOID_TYPE: sg[0] = 'V'; goto native;
649 switch (TYPE_PRECISION (type))
651 case 8: sg[0] = 'B'; goto native;
652 case 16: sg[0] = 'S'; goto native;
653 case 32: sg[0] = 'I'; goto native;
654 case 64: sg[0] = 'J'; goto native;
655 default: goto bad_type;
658 switch (TYPE_PRECISION (type))
660 case 32: sg[0] = 'F'; goto native;
661 case 64: sg[0] = 'D'; goto native;
662 default: goto bad_type;
666 sig = get_identifier (sg);
669 if (TYPE_ARRAY_P (type))
671 t = build_java_signature (TYPE_ARRAY_ELEMENT (type));
672 sig = ident_subst (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t),
677 t = DECL_NAME (TYPE_NAME (type));
678 sig = ident_subst (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t),
685 extern struct obstack temporary_obstack;
686 sig = build_java_argument_signature (type);
687 obstack_1grow (&temporary_obstack, '(');
688 obstack_grow (&temporary_obstack,
689 IDENTIFIER_POINTER (sig), IDENTIFIER_LENGTH (sig));
690 obstack_1grow (&temporary_obstack, ')');
692 t = build_java_signature (TREE_TYPE (type));
693 obstack_grow0 (&temporary_obstack,
694 IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t));
696 sig = get_identifier (obstack_base (&temporary_obstack));
697 obstack_free (&temporary_obstack,
698 obstack_base (&temporary_obstack));
703 fatal ("internal error - build_java_signature passed invalid type");
705 TYPE_SIGNATURE (type) = sig;
711 /* Save signature string SIG (an IDENTIFIER_NODE) in TYPE for future use. */
714 set_java_signature (type, sig)
719 while (TREE_CODE (type) == POINTER_TYPE)
720 type = TREE_TYPE (type);
721 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
722 old_sig = TYPE_SIGNATURE (type);
723 if (old_sig != NULL_TREE && old_sig != sig)
724 fatal ("internal error - set_java_signature");
725 TYPE_SIGNATURE (type) = sig;
726 #if 0 /* careful about METHOD_TYPE */
727 if (IDENTIFIER_SIGNATURE_TYPE (sig) == NULL_TREE && TREE_PERMANENT (type))
728 IDENTIFIER_SIGNATURE_TYPE (sig) = type;
732 /* Search in class SEARCHED_CLASS (and its superclasses) for a method
733 matching METHOD_NAME and signature SIGNATURE. If SEARCHED_INTERFACE is
734 not NULL_TREE then first search its superinterfaces for a similar match.
735 Return the matched method DECL or NULL_TREE. SIGNATURE_BUILDER is
736 used on method candidates to build their (sometimes partial)
740 lookup_argument_method (searched_class, method_name, method_signature)
741 tree searched_class, method_name, method_signature;
743 return lookup_do (searched_class, NULL_TREE, method_name, method_signature,
744 build_java_argument_signature);
747 /* Search in class SEARCHED_CLASS (and its superclasses and
748 implemented interfaces) for a method matching METHOD_NAME and
749 argument signature METHOD_SIGNATURE. Return a FUNCTION_DECL on
750 success, or NULL_TREE if none found. (Contrast lookup_java_method,
751 which takes into account return type.) */
754 lookup_argument_method2 (searched_class, method_name, method_signature)
755 tree searched_class, method_name, method_signature;
757 return lookup_do (CLASSTYPE_SUPER (searched_class), searched_class,
758 method_name, method_signature,
759 build_java_argument_signature);
762 /* Search in class SEARCHED_CLASS (and its superclasses) for a method
763 matching METHOD_NAME and signature METHOD_SIGNATURE. Return a
764 FUNCTION_DECL on success, or NULL_TREE if none found. (Contrast
765 lookup_argument_method, which ignores return type.) If
766 SEARCHED_CLASS is an interface, search it too. */
769 lookup_java_method (searched_class, method_name, method_signature)
770 tree searched_class, method_name, method_signature;
772 tree searched_interface;
774 /* If this class is an interface class, search its superinterfaces
775 * first. A superinterface is not an interface's superclass: a super
776 * interface is implemented by the interface. */
778 searched_interface = (CLASS_INTERFACE (TYPE_NAME (searched_class)) ?
779 searched_class : NULL_TREE);
780 return lookup_do (searched_class, searched_interface, method_name,
781 method_signature, build_java_signature);
784 /* Search in class SEARCHED_CLASS (an its superclasses) for a method
785 matching METHOD_NAME and signature SIGNATURE. Also search in
786 SEARCHED_INTERFACE (an its superinterfaces) for a similar match.
787 Return the matched method DECL or NULL_TREE. SIGNATURE_BUILDER is
788 used on method candidates to build their (sometimes partial)
792 lookup_do (searched_class, searched_interface, method_name, signature, signature_builder)
793 tree searched_class, searched_interface, method_name, signature;
794 tree (*signature_builder) PARAMS ((tree));
798 if (searched_interface)
802 TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (searched_interface)) - 1;
804 for (i = interface_len; i > 0; i--)
807 TREE_VEC_ELT (TYPE_BINFO_BASETYPES (searched_interface), i);
808 tree iclass = BINFO_TYPE (child);
810 /* If the superinterface hasn't been loaded yet, do so now. */
811 if (CLASS_FROM_SOURCE_P (iclass))
812 safe_layout_class (iclass);
813 else if (!CLASS_LOADED_P (iclass))
814 load_class (iclass, 1);
816 for (method = TYPE_METHODS (iclass);
817 method != NULL_TREE; method = TREE_CHAIN (method))
819 tree method_sig = (*signature_builder) (TREE_TYPE (method));
820 tree name = DECL_NAME (method);
822 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
823 EXPR_WFL_NODE (name) : name) == method_name
824 && method_sig == signature)
828 /* it could be defined in a supersuperinterface */
829 if (CLASS_INTERFACE (TYPE_NAME (iclass)))
831 method = lookup_do (iclass, iclass, method_name,
832 signature, signature_builder);
833 if (method != NULL_TREE)
839 while (searched_class != NULL_TREE)
841 for (method = TYPE_METHODS (searched_class);
842 method != NULL_TREE; method = TREE_CHAIN (method))
844 tree method_sig = (*signature_builder) (TREE_TYPE (method));
845 tree name = DECL_NAME (method);
847 if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
848 EXPR_WFL_NODE (name) : name) == method_name
849 && method_sig == signature)
852 searched_class = CLASSTYPE_SUPER (searched_class);
858 /* Search in class CLAS for a constructor matching METHOD_SIGNATURE.
859 Return a FUNCTION_DECL on success, or NULL_TREE if none found. */
862 lookup_java_constructor (clas, method_signature)
863 tree clas, method_signature;
865 tree method = TYPE_METHODS (clas);
866 for ( ; method != NULL_TREE; method = TREE_CHAIN (method))
868 tree method_sig = build_java_signature (TREE_TYPE (method));
869 if (DECL_CONSTRUCTOR_P (method) && method_sig == method_signature)
875 /* Return a type which is the Binary Numeric Promotion of the pair T1,
876 T2 and convert EXP1 and/or EXP2. See 5.6.2 Binary Numeric
877 Promotion. It assumes that both T1 and T2 are elligible to BNP. */
880 binary_numeric_promotion (t1, t2, exp1, exp2)
886 if (t1 == double_type_node || t2 == double_type_node)
888 if (t1 != double_type_node)
889 *exp1 = convert (double_type_node, *exp1);
890 if (t2 != double_type_node)
891 *exp2 = convert (double_type_node, *exp2);
892 return double_type_node;
894 if (t1 == float_type_node || t2 == float_type_node)
896 if (t1 != float_type_node)
897 *exp1 = convert (float_type_node, *exp1);
898 if (t2 != float_type_node)
899 *exp2 = convert (float_type_node, *exp2);
900 return float_type_node;
902 if (t1 == long_type_node || t2 == long_type_node)
904 if (t1 != long_type_node)
905 *exp1 = convert (long_type_node, *exp1);
906 if (t2 != long_type_node)
907 *exp2 = convert (long_type_node, *exp2);
908 return long_type_node;
911 if (t1 != int_type_node)
912 *exp1 = convert (int_type_node, *exp1);
913 if (t2 != int_type_node)
914 *exp2 = convert (int_type_node, *exp2);
915 return int_type_node;