diff options
author | Per Bothner <bothner@cygnus.com> | 1999-04-06 14:28:39 +0000 |
---|---|---|
committer | Per Bothner <bothner@gcc.gnu.org> | 1999-04-06 07:28:39 -0700 |
commit | ab45646c4ec90373b5db6279ef1869bb00c44dcd (patch) | |
tree | 2fc92b2fe38c1015a881fc6144ab600f9aa2737d /gcc/java/verify.c | |
parent | ddcd8199a816e1d7d6dba84ab77105ff423b4188 (diff) | |
download | gcc-ab45646c4ec90373b5db6279ef1869bb00c44dcd.zip gcc-ab45646c4ec90373b5db6279ef1869bb00c44dcd.tar.gz gcc-ab45646c4ec90373b5db6279ef1869bb00c44dcd.tar.bz2 |
expr.c (pop_type_0): New function.
�
* 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
Diffstat (limited to 'gcc/java/verify.c')
-rw-r--r-- | gcc/java/verify.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gcc/java/verify.c b/gcc/java/verify.c index 1a233a2..4b34c47 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; |