diff options
author | apbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-10-14 15:11:04 +0000 |
---|---|---|
committer | apbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-10-14 15:11:04 +0000 |
commit | f757ce2bf3187ef2d898a4b91461c473121920c0 (patch) | |
tree | abdec231f9282d5f9096a1af817d6c94aeaa30b5 /gcc/java/parse.h | |
parent | 2f745c5c51c8a4c7f1cd36af12244cdcb4c3af78 (diff) | |
download | gcc-f757ce2bf3187ef2d898a4b91461c473121920c0.tar.gz |
Tue Oct 13 03:50:28 1998 Alexandre Petit-Bianco <apbianco@cygnus.com>
* decl.c (runtime_exception_type_node, error_exception_type_node):
New global variables.
(init_decl_processing): Initialized.
* expr.c (java_lang_expand_expr): Set caught exception type to
null if catch handler argument doesn't exit.
* java-tree.def (SYNCHRONIZED_EXPR, THROW_EXPR): New Java specific
tree codes.
* java-tree.h (runtime_exception_type_node,
error_exception_type_node): Global variables declared.
(DECL_FUNCTION_THROWS): New macro.
(DECL_FUNCTION_BODY): Modified comment.
(DECL_SPECIFIC_COUNT): Likewise.
(struct lang_decl): New field throws_list.
(IS_UNCHECKED_EXPRESSION_P): New macro.
* lex.c (java_lex): Generate location information for THROW_TK.
* parse.h (PUSH_EXCEPTIONS, POP_EXCEPTIONS, IN_TRY_BLOCK_P,
EXCEPTIONS_P): New macros.
(enum jdep_code): New value JDEP_EXCEPTION.
(BUILD_MONITOR_ENTER, BUILD_MONITOR_EXIT,
BUILD_ASSIGN_EXCEPTION_INFO, BUILD_THROW, SET_WFL_OPERATOR,
PATCH_METHOD_RETURN_ERROR): New macros.
(patch_method_invocation_stmt): Added new argument to prototype.
(patch_synchronized_statement, patch_throw_statement,
check_thrown_exceptions, check_thrown_exceptions_do,
purge_unchecked_exceptions, check_throws_clauses): New function
prototypes.
* parse.y Fixed typo in keyword section.
(throw:): Rule tagged <node>.
(THROW_TK): Keyword tagged <operator>.
(method_header:): Last argument to call to method_header passed
from throws: rule.
(throws:, class_type_list:, throw_statement:,
synchronized_statement:, synchronized:): Defined actions.
(method_header): New local variable current. Register exceptions
from throws clause.
(java_complete_tree): Complete and verify exceptions from throws
clause.
(complete_class_report_errors): Error message on exceptions not
found
(java_check_regular_methods): Fixed typo. Shortcut on private
overriding methods. Changed error message on method
redefinition. Check for throws clause compatibility.
(check_throws_clauses): New function.
(java_check_abstract_methods): Use DECL_NAME for wfl or current
method. Changed error message on method redefinition.
(currently_caught_type_list): New static variable.
(java_complete_expand_methods): Purge unchecked exceptions from
throws clause list. Call PUSH_EXCEPTIONS before walk and
POP_EXCEPTIONS after.
(resolve_qualified_expression_name): Pass new argument as NULL to
patch_method_invocation_stmt.
(patch_method_invocation_stmt): New argument ref_decl. Invoke
PATCH_METHOD_RETURN_ERROR when returning with error. Reverse
argument list when appropriate. Use new argument if non null to
store selected method decl.
(patch_invoke): Convert if necessary args of builtin types before
forming CALL_EXPR. Argument list no longer reversed here.
(invocation_mode): Treat final methods as static methods.
(java_complete_tree): New cases for THROW_EXPR: and
SYNCHRONIZED_EXPR:. Check thrown exceptions when completing
function call.
(complete_function_arguments): No more RECORD_TYPE
conversion. Function parameter nodes no longer saved.
(valid_ref_assignconv_cast_p): Avoid handling null type.
(patch_binop): Fixed null constant reference handling.
(build_try_statement): Use BUILD_ASSIGN_EXCEPTION_INFO and
BUILD_THROW macros.
(patch_try_statement): Fixed comments. Record caught types in
list, push the list, expand try block and pop the list.
(patch_synchronized_statement, patch_throw_statement,
check_thrown_exceptions, check_thrown_exceptions_do,
purge_unchecked_exceptions): New functions.
* typeck.c (lookup_argument_method): Allow WFL in place of method
DECL_NAME during method definition check
Implements the `synchronized' statement, the `throw' statements and
the `throws' clause. Fixes method invocation bugs.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23087 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java/parse.h')
-rw-r--r-- | gcc/java/parse.h | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/gcc/java/parse.h b/gcc/java/parse.h index 1e78e328ab8..09d25baa92e 100644 --- a/gcc/java/parse.h +++ b/gcc/java/parse.h @@ -262,6 +262,24 @@ extern tree stabilize_reference PROTO ((tree)); } #define POP_LOOP() ctxp->current_loop = TREE_CHAIN (ctxp->current_loop) +#define PUSH_EXCEPTIONS(E) \ + currently_caught_type_list = \ + tree_cons (NULL_TREE, (E), currently_caught_type_list); + +#define POP_EXCEPTIONS() \ + currently_caught_type_list = TREE_CHAIN (currently_caught_type_list) + +/* Check that we're inside a try block */ +#define IN_TRY_BLOCK_P() \ + (currently_caught_type_list \ + && ((TREE_VALUE (currently_caught_type_list) != \ + DECL_FUNCTION_THROWS (current_function_decl)) \ + || TREE_CHAIN (currently_caught_type_list))) + +/* Check that we have exceptions in E */ +#define EXCEPTIONS_P(E) ((E) ? TREE_VALUE (E) : NULL_TREE) + + /* Invocation modes, as returned by invocation_mode (). */ enum { INVOKE_STATIC, @@ -317,6 +335,7 @@ enum jdep_code { JDEP_TYPE, /* Patch a random tree node type, without the need for any specific actions */ + JDEP_EXCEPTION, /* Patch exceptions specified by `throws' */ }; typedef struct _jdep { @@ -431,6 +450,51 @@ static jdeplist *reverse_jdep_list (); build_new_invocation (wfl_string_buffer, \ (ARG ? build_tree_list (NULL, (ARG)) : NULL_TREE)) +/* For exception handling, build diverse function calls */ +#define BUILD_MONITOR_ENTER(WHERE, ARG) \ + { \ + (WHERE) = build (CALL_EXPR, int_type_node, \ + build_address_of (soft_monitorenter_node), \ + build_tree_list (NULL_TREE, (ARG))); \ + TREE_SIDE_EFFECTS (WHERE) = 1; \ + } + +#define BUILD_MONITOR_EXIT(WHERE, ARG) \ + { \ + (WHERE) = build (CALL_EXPR, int_type_node, \ + build_address_of (soft_monitorexit_node), \ + build_tree_list (NULL_TREE, (ARG))); \ + TREE_SIDE_EFFECTS (WHERE) = 1; \ + } + +#define BUILD_ASSIGN_EXCEPTION_INFO(WHERE, TO) \ + { \ + (WHERE) = build (MODIFY_EXPR, void_type_node, (TO), \ + soft_exceptioninfo_call_node); \ + TREE_SIDE_EFFECTS (WHERE) = 1; \ + } + +#define BUILD_THROW(WHERE, WHAT) \ + { \ + (WHERE) = build (CALL_EXPR, void_type_node, \ + build_address_of (throw_node), \ + build_tree_list (NULL_TREE, (WHAT)), NULL_TREE); \ + TREE_SIDE_EFFECTS ((WHERE)) = 1; \ + } + +/* Set wfl_operator for the most accurate error location */ +#define SET_WFL_OPERATOR(WHICH, NODE, WFL) \ + EXPR_WFL_LINECOL (WHICH) = \ + (TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \ + EXPR_WFL_LINECOL (WFL) : EXPR_WFL_LINECOL (NODE)) + +#define PATCH_METHOD_RETURN_ERROR() \ + { \ + if (ret_decl) \ + *ret_decl = NULL_TREE; \ + return error_mark_node; \ + } + /* Parser context data structure. */ struct parser_ctxt { @@ -527,7 +591,7 @@ static tree lookup_java_interface_method2 PROTO ((tree, tree)); static tree resolve_expression_name PROTO ((tree)); static tree maybe_create_class_interface_decl PROTO ((tree, tree, tree)); static int check_class_interface_creation PROTO ((int, int, tree, tree, tree, tree)); -static tree patch_method_invocation_stmt PROTO ((tree, tree, tree, int *)); +static tree patch_method_invocation_stmt PROTO ((tree, tree, tree, int *, tree *)); static int breakdown_qualified PROTO ((tree *, tree *, tree)); static tree resolve_and_layout PROTO ((tree, tree)); static tree resolve_no_layout PROTO ((tree, tree)); @@ -613,6 +677,12 @@ static tree patch_string PROTO ((tree)); static tree build_jump_to_finally PROTO ((tree, tree, tree, tree)); static tree build_try_statement PROTO ((int, tree, tree, tree)); static tree patch_try_statement PROTO ((tree)); +static tree patch_synchronized_statement PROTO ((tree, tree)); +static tree patch_throw_statement PROTO ((tree, tree)); +static void check_thrown_exceptions PROTO ((int, tree)); +static int check_thrown_exceptions_do PROTO ((int, tree)); +static void purge_unchecked_exceptions PROTO ((tree)); +static void check_throws_clauses PROTO ((tree, tree, tree)); void safe_layout_class PROTO ((tree)); void java_complete_class PROTO ((void)); |