Commit 34d4df06 by Alexandre Petit-Bianco Committed by Alexandre Petit-Bianco

class.c (maybe_layout_super_class): Fixed indentation.

2000-08-10  Alexandre Petit-Bianco  <apbianco@cygnus.com>

        * class.c (maybe_layout_super_class): Fixed indentation.
        * java-tree.h (CLASS_METHOD_CHECKED_P): New macro.
        (java_check_methods): New function declaration.
        * jcf-parse.c (get_constant): Let `char_len' go up to 3. Use `str'
        instead of `str_ptr'.
        * jcf-write.c (generate_bytecode_insns): Emit number the of args
        of a `invokeinterface' at the right time.
        * parse.h (WFL_STRIP_BRACKET): New macro.
        (SET_TYPE_FOR_RESOLUTION): Use it.
        * parse.y (build_unresolved_array_type): Reuse `type_or_wfl.'
        (check_class_interface_creation): Don't check for cross package
        innerclass name clashes.
        (method_header): Behave properly if MDECL is `error_mark_node.'
        (method_declarator): Return `error_mark_node' if bogus current
        class.
        (resolve_class): Apply WFL_STRIP_BRACKET on `cl' if necessary.
        (resolve_and_layout): New local `decl_type', set and used. Call
        java_check_methods.
        (java_check_methods): New method.
        (java_layout_classes): Use it.
        (resolve_qualified_expression_name): No EH check necessary in
        access$<n>.
        (java_complete_lhs): Use VAR_DECL's DECL_INITIAL when evaluating
        `case' statement.
        (patch_assignment): Set DECL_INITIAL on integral final local.

(http://gcc.gnu.org/ml/gcc-patches/2000-08/msg00516.html)

From-SVN: r35644
parent 82fbe835
2000-08-10 Alexandre Petit-Bianco <apbianco@cygnus.com>
* class.c (maybe_layout_super_class): Fixed indentation.
* java-tree.h (CLASS_METHOD_CHECKED_P): New macro.
(java_check_methods): New function declaration.
* jcf-parse.c (get_constant): Let `char_len' go up to 3. Use `str'
instead of `str_ptr'.
* jcf-write.c (generate_bytecode_insns): Emit number the of args
of a `invokeinterface' at the right time.
* parse.h (WFL_STRIP_BRACKET): New macro.
(SET_TYPE_FOR_RESOLUTION): Use it.
* parse.y (build_unresolved_array_type): Reuse `type_or_wfl.'
(check_class_interface_creation): Don't check for cross package
innerclass name clashes.
(method_header): Behave properly if MDECL is `error_mark_node.'
(method_declarator): Return `error_mark_node' if bogus current
class.
(resolve_class): Apply WFL_STRIP_BRACKET on `cl' if necessary.
(resolve_and_layout): New local `decl_type', set and used. Call
java_check_methods.
(java_check_methods): New method.
(java_layout_classes): Use it.
(resolve_qualified_expression_name): No EH check necessary in
access$<n>.
(java_complete_lhs): Use VAR_DECL's DECL_INITIAL when evaluating
`case' statement.
(patch_assignment): Set DECL_INITIAL on integral final local.
2000-08-07 Alexandre Petit-Bianco <apbianco@cygnus.com 2000-08-07 Alexandre Petit-Bianco <apbianco@cygnus.com
* parse.y (build_dot_class_method_invocation): Changed parameter * parse.y (build_dot_class_method_invocation): Changed parameter
......
...@@ -1748,8 +1748,7 @@ maybe_layout_super_class (super_class, this_class) ...@@ -1748,8 +1748,7 @@ maybe_layout_super_class (super_class, this_class)
{ {
if (TREE_CODE (super_class) == RECORD_TYPE) if (TREE_CODE (super_class) == RECORD_TYPE)
{ {
if (!CLASS_LOADED_P (super_class) if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
&& CLASS_FROM_SOURCE_P (super_class))
safe_layout_class (super_class); safe_layout_class (super_class);
if (!CLASS_LOADED_P (super_class)) if (!CLASS_LOADED_P (super_class))
load_class (super_class, 1); load_class (super_class, 1);
......
...@@ -52,6 +52,7 @@ struct JCF; ...@@ -52,6 +52,7 @@ struct JCF;
QUALIFIED_P (in IDENTIFIER_NODE) QUALIFIED_P (in IDENTIFIER_NODE)
PRIMARY_P (in EXPR_WITH_FILE_LOCATION) PRIMARY_P (in EXPR_WITH_FILE_LOCATION)
MODIFY_EXPR_FROM_INITIALIZATION_P (in MODIFY_EXPR) MODIFY_EXPR_FROM_INITIALIZATION_P (in MODIFY_EXPR)
CLASS_METHOD_CHECKED_P (in RECORD_TYPE)
3: IS_AN_IMPORT_ON_DEMAND_P (in IDENTIFIER_NODE) 3: IS_AN_IMPORT_ON_DEMAND_P (in IDENTIFIER_NODE)
RESOLVE_PACKAGE_NAME_P (in EXPR_WITH_FILE_LOCATION) RESOLVE_PACKAGE_NAME_P (in EXPR_WITH_FILE_LOCATION)
SWITCH_HAS_DEFAULT (in SWITCH_EXPR) SWITCH_HAS_DEFAULT (in SWITCH_EXPR)
...@@ -788,6 +789,7 @@ extern tree get_boehm_type_descriptor PARAMS ((tree)); ...@@ -788,6 +789,7 @@ extern tree get_boehm_type_descriptor PARAMS ((tree));
extern unsigned long java_hash_hash_tree_node PARAMS ((hash_table_key)); extern unsigned long java_hash_hash_tree_node PARAMS ((hash_table_key));
extern boolean java_hash_compare_tree_node PARAMS ((hash_table_key, extern boolean java_hash_compare_tree_node PARAMS ((hash_table_key,
hash_table_key)); hash_table_key));
extern void java_check_methods PARAMS ((tree));
/* We use ARGS_SIZE_RTX to indicate that gcc/expr.h has been included /* We use ARGS_SIZE_RTX to indicate that gcc/expr.h has been included
to declare `enum expand_modifier'. */ to declare `enum expand_modifier'. */
...@@ -999,6 +1001,8 @@ extern tree *type_map; ...@@ -999,6 +1001,8 @@ extern tree *type_map;
initialization during its declaration */ initialization during its declaration */
#define MODIFY_EXPR_FROM_INITIALIZATION_P(EXPR) TREE_LANG_FLAG_2 (EXPR) #define MODIFY_EXPR_FROM_INITIALIZATION_P(EXPR) TREE_LANG_FLAG_2 (EXPR)
#define CLASS_METHOD_CHECKED_P(EXPR) TREE_LANG_FLAG_2 (EXPR)
/* True if EXPR (a WFL in that case) resolves into an expression name */ /* True if EXPR (a WFL in that case) resolves into an expression name */
#define RESOLVE_EXPRESSION_NAME_P(WFL) TREE_LANG_FLAG_0 (WFL) #define RESOLVE_EXPRESSION_NAME_P(WFL) TREE_LANG_FLAG_0 (WFL)
......
...@@ -341,8 +341,8 @@ get_constant (jcf, index) ...@@ -341,8 +341,8 @@ get_constant (jcf, index)
for (str_len = 0; i > 0; str_len++) for (str_len = 0; i > 0; str_len++)
{ {
int char_len = UT8_CHAR_LENGTH (*str); int char_len = UT8_CHAR_LENGTH (*str);
if (char_len < 0 || char_len > 2 || char_len > i) if (char_len < 0 || char_len > 3 || char_len > i)
fatal ("bad string constant"); fatal ("bad string constant");
str += char_len; str += char_len;
i -= char_len; i -= char_len;
} }
...@@ -368,7 +368,7 @@ get_constant (jcf, index) ...@@ -368,7 +368,7 @@ get_constant (jcf, index)
char_value = (char_value << 6) | (*str++ & 0x3F); char_value = (char_value << 6) | (*str++ & 0x3F);
break; break;
case 3: case 3:
char_value = *str_ptr++ & 0x0F; char_value = *str++ & 0x0F;
char_value = (char_value << 6) | (*str++ & 0x3F); char_value = (char_value << 6) | (*str++ & 0x3F);
char_value = (char_value << 6) | (*str++ & 0x3F); char_value = (char_value << 6) | (*str++ & 0x3F);
break; break;
......
...@@ -2561,9 +2561,13 @@ generate_bytecode_insns (exp, target, state) ...@@ -2561,9 +2561,13 @@ generate_bytecode_insns (exp, target, state)
TREE_TYPE (TREE_TYPE (TREE_VALUE (TREE_OPERAND (exp, 1)))); TREE_TYPE (TREE_TYPE (TREE_VALUE (TREE_OPERAND (exp, 1))));
} }
index = find_methodref_index (&state->cpool, f); index = find_methodref_index (&state->cpool, f);
if (interface)
DECL_CONTEXT (f) = saved_context;
OP2 (index); OP2 (index);
if (interface)
{
DECL_CONTEXT (f) = saved_context;
OP1 (nargs);
OP1 (0);
}
f = TREE_TYPE (TREE_TYPE (f)); f = TREE_TYPE (TREE_TYPE (f));
if (TREE_CODE (f) != VOID_TYPE) if (TREE_CODE (f) != VOID_TYPE)
{ {
...@@ -2573,11 +2577,6 @@ generate_bytecode_insns (exp, target, state) ...@@ -2573,11 +2577,6 @@ generate_bytecode_insns (exp, target, state)
else else
NOTE_PUSH (size); NOTE_PUSH (size);
} }
if (interface)
{
OP1 (nargs);
OP1 (0);
}
break; break;
} }
} }
......
...@@ -535,27 +535,50 @@ typedef struct _jdeplist { ...@@ -535,27 +535,50 @@ typedef struct _jdeplist {
java.lang.Object. */ java.lang.Object. */
#define SET_TYPE_FOR_RESOLUTION(TYPE, SAVE, CHAIN) \ #define SET_TYPE_FOR_RESOLUTION(TYPE, SAVE, CHAIN) \
{ \ { \
tree returned_type; \ tree _returned_type; \
(CHAIN) = 0; \ (CHAIN) = 0; \
if (TREE_TYPE (GET_CPC ()) == object_type_node \ if (TREE_TYPE (GET_CPC ()) == object_type_node \
&& TREE_CODE (TYPE) == EXPR_WITH_FILE_LOCATION \ && TREE_CODE (TYPE) == EXPR_WITH_FILE_LOCATION \
&& EXPR_WFL_NODE (TYPE) == unqualified_object_id_node) \ && EXPR_WFL_NODE (TYPE) == unqualified_object_id_node) \
(TYPE) = object_type_node; \ (TYPE) = object_type_node; \
else \ else \
{ \ { \
if (unresolved_type_p (type, &returned_type)) \ if (unresolved_type_p (type, &_returned_type)) \
{ \ { \
if (returned_type) \ if (_returned_type) \
(TYPE) = returned_type; \ (TYPE) = _returned_type; \
else \ else \
{ \ { \
(SAVE) = (TYPE); \ tree _type; \
WFL_STRIP_BRACKET (_type, TYPE); \
(SAVE) = (_type); \
(TYPE) = obtain_incomplete_type (TYPE); \ (TYPE) = obtain_incomplete_type (TYPE); \
CHAIN = 1; \ CHAIN = 1; \
} \ } \
} \ } \
} \ } \
} }
#define WFL_STRIP_BRACKET(TARGET, TYPE) \
{ \
tree __type = (TYPE); \
if (TYPE && TREE_CODE (TYPE) == EXPR_WITH_FILE_LOCATION) \
{ \
tree _node = EXPR_WFL_NODE (TYPE); \
const char *_ptr = IDENTIFIER_POINTER (_node); \
const char *_ref = _ptr; \
while (_ptr[0] == '[') \
_ptr++; \
if (_ref != _ptr) \
{ \
tree _new = copy_node (TYPE); \
EXPR_WFL_NODE (_new) = get_identifier (_ptr); \
__type = _new; \
} \
} \
(TARGET) = __type; \
}
/* Promote a type if it won't be registered as a patch */ /* Promote a type if it won't be registered as a patch */
#define PROMOTE_RECORD_IF_COMPLETE(TYPE, IS_INCOMPLETE) \ #define PROMOTE_RECORD_IF_COMPLETE(TYPE, IS_INCOMPLETE) \
{ \ { \
......
...@@ -3265,10 +3265,8 @@ build_unresolved_array_type (type_or_wfl) ...@@ -3265,10 +3265,8 @@ build_unresolved_array_type (type_or_wfl)
IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)), IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)),
IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl))); IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl)));
ptr = obstack_finish (&temporary_obstack); ptr = obstack_finish (&temporary_obstack);
return build_expr_wfl (get_identifier (ptr), EXPR_WFL_NODE (type_or_wfl) = get_identifier (ptr);
EXPR_WFL_FILENAME (type_or_wfl), return type_or_wfl;
EXPR_WFL_LINENO (type_or_wfl),
EXPR_WFL_COLNO (type_or_wfl));
} }
static void static void
...@@ -3303,7 +3301,8 @@ check_class_interface_creation (is_interface, flags, raw_name, qualified_name, d ...@@ -3303,7 +3301,8 @@ check_class_interface_creation (is_interface, flags, raw_name, qualified_name, d
- Can't be imported by a single type import - Can't be imported by a single type import
- Can't already exists in the package */ - Can't already exists in the package */
if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name) if (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (raw_name)
&& (node = find_name_in_single_imports (raw_name))) && (node = find_name_in_single_imports (raw_name))
&& !CPC_INNER_P ())
{ {
parse_error_context parse_error_context
(cl, "%s name `%s' clashes with imported type `%s'", (cl, "%s name `%s' clashes with imported type `%s'",
...@@ -4260,14 +4259,18 @@ method_header (flags, type, mdecl, throws) ...@@ -4260,14 +4259,18 @@ method_header (flags, type, mdecl, throws)
int flags; int flags;
tree type, mdecl, throws; tree type, mdecl, throws;
{ {
tree meth = TREE_VALUE (mdecl);
tree id = TREE_PURPOSE (mdecl);
tree type_wfl = NULL_TREE; tree type_wfl = NULL_TREE;
tree meth_name = NULL_TREE; tree meth_name = NULL_TREE;
tree current, orig_arg, this_class = NULL; tree current, orig_arg, this_class = NULL;
tree id, meth;
int saved_lineno; int saved_lineno;
int constructor_ok = 0, must_chain; int constructor_ok = 0, must_chain;
int count; int count;
if (mdecl == error_mark_node)
return error_mark_node;
meth = TREE_VALUE (mdecl);
id = TREE_PURPOSE (mdecl);
check_modifiers_consistency (flags); check_modifiers_consistency (flags);
...@@ -4665,6 +4668,9 @@ method_declarator (id, list) ...@@ -4665,6 +4668,9 @@ method_declarator (id, list)
patch_stage = JDEP_NO_PATCH; patch_stage = JDEP_NO_PATCH;
if (GET_CPC () == error_mark_node)
return error_mark_node;
/* If we're dealing with an inner class constructor, we hide the /* If we're dealing with an inner class constructor, we hide the
this$<n> decl in the name field of its parameter declaration. We this$<n> decl in the name field of its parameter declaration. We
also might have to hide the outer context local alias also might have to hide the outer context local alias
...@@ -5391,7 +5397,10 @@ resolve_class (enclosing, class_type, decl, cl) ...@@ -5391,7 +5397,10 @@ resolve_class (enclosing, class_type, decl, cl)
while (name[0] == '[') while (name[0] == '[')
name++; name++;
if (base != name) if (base != name)
TYPE_NAME (class_type) = get_identifier (name); {
TYPE_NAME (class_type) = get_identifier (name);
WFL_STRIP_BRACKET (cl, cl);
}
/* 2- Resolve the bare type */ /* 2- Resolve the bare type */
if (!(resolved_type_decl = do_resolve_class (enclosing, class_type, if (!(resolved_type_decl = do_resolve_class (enclosing, class_type,
...@@ -5562,7 +5571,7 @@ resolve_and_layout (something, cl) ...@@ -5562,7 +5571,7 @@ resolve_and_layout (something, cl)
tree something; tree something;
tree cl; tree cl;
{ {
tree decl; tree decl, decl_type;
/* Don't do that on the current class */ /* Don't do that on the current class */
if (something == current_class) if (something == current_class)
...@@ -5605,13 +5614,14 @@ resolve_and_layout (something, cl) ...@@ -5605,13 +5614,14 @@ resolve_and_layout (something, cl)
return NULL_TREE; return NULL_TREE;
/* Resolve and layout if necessary */ /* Resolve and layout if necessary */
layout_class_methods (TREE_TYPE (decl)); decl_type = TREE_TYPE (decl);
/* Check methods, but only once */ layout_class_methods (decl_type);
if (CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) /* Check methods */
&& !CLASS_LOADED_P (TREE_TYPE (decl))) if (CLASS_FROM_SOURCE_P (decl_type))
CHECK_METHODS (decl); java_check_methods (decl);
if (TREE_TYPE (decl) != current_class && !CLASS_LOADED_P (TREE_TYPE (decl))) /* Layout the type if necessary */
safe_layout_class (TREE_TYPE (decl)); if (decl_type != current_class && !CLASS_LOADED_P (decl_type))
safe_layout_class (decl_type);
return decl; return decl;
} }
...@@ -5957,6 +5967,23 @@ check_method_types_complete (decl) ...@@ -5957,6 +5967,23 @@ check_method_types_complete (decl)
return 1; return 1;
} }
/* Visible interface to check methods contained in CLASS_DECL */
void
java_check_methods (class_decl)
tree class_decl;
{
if (CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)))
return;
if (CLASS_INTERFACE (class_decl))
java_check_abstract_methods (class_decl);
else
java_check_regular_methods (class_decl);
CLASS_METHOD_CHECKED_P (TREE_TYPE (class_decl)) = 1;
}
/* Check all the methods of CLASS_DECL. Methods are first completed /* Check all the methods of CLASS_DECL. Methods are first completed
then checked according to regular method existance rules. If no then checked according to regular method existance rules. If no
constructor for CLASS_DECL were encountered, then build its constructor for CLASS_DECL were encountered, then build its
...@@ -7288,7 +7315,7 @@ java_layout_classes () ...@@ -7288,7 +7315,7 @@ java_layout_classes ()
/* Then check the methods of all parsed classes */ /* Then check the methods of all parsed classes */
for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current)) for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current))
if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current)))) if (CLASS_FROM_SOURCE_P (TREE_TYPE (TREE_VALUE (current))))
CHECK_METHODS (TREE_VALUE (current)); java_check_methods (TREE_VALUE (current));
java_parse_abort_on_error (); java_parse_abort_on_error ();
for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current)) for (current = ctxp->gclass_list; current; current = TREE_CHAIN (current))
...@@ -8951,8 +8978,10 @@ resolve_qualified_expression_name (wfl, found_decl, where_found, type_found) ...@@ -8951,8 +8978,10 @@ resolve_qualified_expression_name (wfl, found_decl, where_found, type_found)
instantiation using a primary qualified by a `new' */ instantiation using a primary qualified by a `new' */
RESTORE_THIS_AND_CURRENT_CLASS; RESTORE_THIS_AND_CURRENT_CLASS;
/* EH check */ /* EH check. No check on access$<n> functions */
if (location) if (location
&& !OUTER_FIELD_ACCESS_IDENTIFIER_P
(DECL_NAME (current_function_decl)))
check_thrown_exceptions (location, ret_decl); check_thrown_exceptions (location, ret_decl);
/* If the previous call was static and this one is too, /* If the previous call was static and this one is too,
...@@ -10988,6 +11017,8 @@ java_complete_lhs (node) ...@@ -10988,6 +11017,8 @@ java_complete_lhs (node)
/* Multiple instance of a case label bearing the same /* Multiple instance of a case label bearing the same
value is checked during code generation. The case value is checked during code generation. The case
expression is allright so far. */ expression is allright so far. */
if (TREE_CODE (cn) == VAR_DECL)
cn = DECL_INITIAL (cn);
TREE_OPERAND (node, 0) = cn; TREE_OPERAND (node, 0) = cn;
TREE_TYPE (node) = void_type_node; TREE_TYPE (node) = void_type_node;
CAN_COMPLETE_NORMALLY (node) = 1; CAN_COMPLETE_NORMALLY (node) = 1;
...@@ -12037,6 +12068,19 @@ patch_assignment (node, wfl_op1, wfl_op2) ...@@ -12037,6 +12068,19 @@ patch_assignment (node, wfl_op1, wfl_op2)
} }
} }
/* Final locals can be used as case values in switch
statement. Prepare them for this eventuality. */
if (TREE_CODE (lvalue) == VAR_DECL
&& LOCAL_FINAL (lvalue)
&& TREE_CONSTANT (new_rhs)
&& IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue))
&& JINTEGRAL_TYPE_P (TREE_TYPE (lvalue))
)
{
TREE_CONSTANT (lvalue) = 1;
DECL_INITIAL (lvalue) = new_rhs;
}
TREE_OPERAND (node, 0) = lvalue; TREE_OPERAND (node, 0) = lvalue;
TREE_OPERAND (node, 1) = new_rhs; TREE_OPERAND (node, 1) = new_rhs;
TREE_TYPE (node) = lhs_type; TREE_TYPE (node) = lhs_type;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment