From ab45646c4ec90373b5db6279ef1869bb00c44dcd Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Tue, 6 Apr 1999 14:28:39 +0000 Subject: [PATCH] expr.c (pop_type_0): New function. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit � * expr.c (pop_type_0): New function. (pop_type): Use pop_type_0. * java-tree.h (pop_type_0): New declaration. * verify.c (verify_jvm_instructions): Check return instructions. From-SVN: r26218 --- gcc/java/ChangeLog | 5 +++++ gcc/java/verify.c | 29 ++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 52893602d0d0..1f3708afedc0 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,5 +1,10 @@ 1999-04-06 Per Bothner + * expr.c (pop_type_0): New function. + (pop_type): Use pop_type_0. + * java-tree.h (pop_type_0): New declaration. + * verify.c (verify_jvm_instructions): Check return instructions. + * parse.y (patch_binop): Don't fold if non-constant and emiting class files. diff --git a/gcc/java/verify.c b/gcc/java/verify.c index 1a233a23030b..4b34c4717d30 100644 --- a/gcc/java/verify.c +++ b/gcc/java/verify.c @@ -340,6 +340,7 @@ verify_jvm_instructions (jcf, byte_ops, length) register unsigned char *p; struct eh_range *prev_eh_ranges = NULL_EH_RANGE; struct eh_range *eh_ranges; + tree return_type = TREE_TYPE (TREE_TYPE (current_function_decl)); jint int_value = -1; @@ -707,15 +708,33 @@ verify_jvm_instructions (jcf, byte_ops, length) VERIFICATION_ERROR ("invalid use of wide instruction"); } break; - case OPCODE_ireturn: type = int_type_node; goto ret; + case OPCODE_return: type = void_type_node; goto ret; + case OPCODE_ireturn: + if ((TREE_CODE (return_type) == BOOLEAN_TYPE + || TREE_CODE (return_type) == CHAR_TYPE + || TREE_CODE (return_type) == INTEGER_TYPE) + && TYPE_PRECISION (return_type) <= 32) + type = return_type; + else + type = NULL_TREE; + goto ret; case OPCODE_lreturn: type = long_type_node; goto ret; case OPCODE_freturn: type = float_type_node; goto ret; case OPCODE_dreturn: type = double_type_node; goto ret; - case OPCODE_areturn: type = ptr_type_node; goto ret; + case OPCODE_areturn: + if (TREE_CODE (return_type) == POINTER_TYPE) + type = return_type; + else + type = NULL_TREE; + goto ret; ret: - pop_type (type); - /* ... fall through ... */ - case OPCODE_return: + if (type != return_type) + VERIFICATION_ERROR ("incorrect ?return opcode"); + if (type != void_type_node) + { + if (pop_type_0 (type) == NULL_TREE) + VERIFICATION_ERROR ("return value has wrong type"); + } INVALIDATE_PC; break; case OPCODE_getstatic: is_putting = 0; is_static = 1; goto field; -- 2.47.2