Commit ab45646c by Per Bothner Committed by Per Bothner

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
parent ddcd8199
1999-04-06 Per Bothner <bothner@cygnus.com> 1999-04-06 Per Bothner <bothner@cygnus.com>
* 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 * parse.y (patch_binop): Don't fold if non-constant and emiting
class files. class files.
......
...@@ -340,6 +340,7 @@ verify_jvm_instructions (jcf, byte_ops, length) ...@@ -340,6 +340,7 @@ verify_jvm_instructions (jcf, byte_ops, length)
register unsigned char *p; register unsigned char *p;
struct eh_range *prev_eh_ranges = NULL_EH_RANGE; struct eh_range *prev_eh_ranges = NULL_EH_RANGE;
struct eh_range *eh_ranges; struct eh_range *eh_ranges;
tree return_type = TREE_TYPE (TREE_TYPE (current_function_decl));
jint int_value = -1; jint int_value = -1;
...@@ -707,15 +708,33 @@ verify_jvm_instructions (jcf, byte_ops, length) ...@@ -707,15 +708,33 @@ verify_jvm_instructions (jcf, byte_ops, length)
VERIFICATION_ERROR ("invalid use of wide instruction"); VERIFICATION_ERROR ("invalid use of wide instruction");
} }
break; 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_lreturn: type = long_type_node; goto ret;
case OPCODE_freturn: type = float_type_node; goto ret; case OPCODE_freturn: type = float_type_node; goto ret;
case OPCODE_dreturn: type = double_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: ret:
pop_type (type); if (type != return_type)
/* ... fall through ... */ VERIFICATION_ERROR ("incorrect ?return opcode");
case OPCODE_return: if (type != void_type_node)
{
if (pop_type_0 (type) == NULL_TREE)
VERIFICATION_ERROR ("return value has wrong type");
}
INVALIDATE_PC; INVALIDATE_PC;
break; break;
case OPCODE_getstatic: is_putting = 0; is_static = 1; goto field; case OPCODE_getstatic: is_putting = 0; is_static = 1; goto field;
......
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