summaryrefslogtreecommitdiff
path: root/gcc/java/parse.h
diff options
context:
space:
mode:
authorapbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4>1998-10-14 15:11:04 +0000
committerapbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4>1998-10-14 15:11:04 +0000
commitf757ce2bf3187ef2d898a4b91461c473121920c0 (patch)
treeabdec231f9282d5f9096a1af817d6c94aeaa30b5 /gcc/java/parse.h
parent2f745c5c51c8a4c7f1cd36af12244cdcb4c3af78 (diff)
downloadgcc-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.h72
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));