Non-call exceptions versus cse

Andrew Haley aph@redhat.com
Fri Dec 27 09:39:00 GMT 2002


This is the Java front end patch to copy the RHS of an assignment if
it's a reference.
As far as I know this is now correct on all the platforms for which we
support non-call exceptions. Of course, we may have more CSE problems
to contend with.
Andrew.
2002年12月27日 Andrew Haley <aph@redhat.com>
	* parse.y (patch_assignment): Copy the rhs of an assignment into a
	temporary if the RHS is a reference.
Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.408
diff -c -2 -p -r1.408 parse.y
*** parse.y	23 Dec 2002 19:42:09 -0000	1.408
--- parse.y	27 Dec 2002 17:36:23 -0000
*************** patch_assignment (node, wfl_op1)
*** 12865,12868 ****
--- 12865,12905 ----
 }
 
+ /* Copy the rhs if it's a reference. */
+ if (! flag_check_references && optimize > 0)
+ {
+ switch (TREE_CODE (new_rhs))
+ 	{
+ 	case ARRAY_REF:
+ 	case INDIRECT_REF:
+ 	case COMPONENT_REF:
+ 	 /* Transform a = foo.bar 
+ 	 into a = { int tmp; tmp = foo.bar; tmp; ). 	 
+ 	 We need to ensure that if a read from memory fails
+ 	 because of a NullPointerException, a destination variable
+ 	 will remain unchanged. An explicit temporary does what
+ 	 we need. 
+ 
+ 	 If flag_check_references is set, this is unnecessary
+ 	 because we'll check each reference before doing any
+ 	 reads. If optimize is not set the result will never be
+ 	 written to a stack slot that contains the LHS. */
+ 	 {
+ 	 tree tmp = build_decl (VAR_DECL, get_identifier ("<tmp>"), 
+ 				 TREE_TYPE (new_rhs));
+ 	 tree block = build (BLOCK, TREE_TYPE (new_rhs), NULL);
+ 	 tree assignment 
+ 	 = build (MODIFY_EXPR, TREE_TYPE (new_rhs), tmp, fold (new_rhs));
+ 	 BLOCK_VARS (block) = tmp;
+ 	 BLOCK_EXPR_BODY (block) 
+ 	 = build (COMPOUND_EXPR, TREE_TYPE (new_rhs), assignment, tmp);
+ 	 TREE_SIDE_EFFECTS (block) = 1;
+ 	 new_rhs = block;
+ 	 }
+ 	 break;
+ 	default:
+ 	 break;
+ 	}
+ }
+ 
 TREE_OPERAND (node, 0) = lvalue;
 TREE_OPERAND (node, 1) = new_rhs;


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /