OSDN Git Service

* g++.old-deja/g++.other/dwarf2-1.C: Move...
[pf3gnuchains/gcc-fork.git] / gcc / java / expr.c
index ecfabe5..fa2935f 100644 (file)
@@ -48,7 +48,7 @@ static tree pop_value PARAMS ((tree));
 static void java_stack_swap PARAMS ((void));
 static void java_stack_dup PARAMS ((int, int));
 static void build_java_athrow PARAMS ((tree));
-static void build_java_jsr PARAMS ((tree, tree));
+static void build_java_jsr PARAMS ((int, int));
 static void build_java_ret PARAMS ((tree));
 static void expand_java_multianewarray PARAMS ((tree, int));
 static void expand_java_arraystore PARAMS ((tree));
@@ -607,15 +607,18 @@ build_java_athrow (node)
 /* Implementation for jsr/ret */
 
 static void
-build_java_jsr (where, ret)
-    tree where;
-    tree ret;
+build_java_jsr (target_pc, return_pc)
+     int target_pc, return_pc;
 {
+  tree where =  lookup_label (target_pc);
+  tree ret = lookup_label (return_pc);
   tree ret_label = fold (build1 (ADDR_EXPR, return_address_type_node, ret));
   push_value (ret_label);
   flush_quick_stack ();
   emit_jump (label_rtx (where));
   expand_label (ret);
+  if (instruction_bits [return_pc] & BCODE_VERIFIED)
+    load_type_state (ret);
 }
 
 static void
@@ -808,7 +811,7 @@ build_java_arraystore_check (array, object)
    tree array; 
    tree object;
 {
-  tree check, element_type;
+  tree check, element_type, source;
   tree array_type_p = TREE_TYPE (array);
   tree object_type = TYPE_NAME (TREE_TYPE (TREE_TYPE (object)));
 
@@ -834,11 +837,17 @@ build_java_arraystore_check (array, object)
          || CLASS_FINAL (element_type)))
     return build1 (NOP_EXPR, array_type_p, array);
   
+  /* OBJECT might be wrapped by a SAVE_EXPR. */
+  if (TREE_CODE (object) == SAVE_EXPR)
+    source = TREE_OPERAND (object, 0);
+  else
+    source = object;
+  
   /* Avoid the check if OBJECT was just loaded from the same array. */
-  if (TREE_CODE (object) == ARRAY_REF)
+  if (TREE_CODE (source) == ARRAY_REF)
     {
       tree target;
-      tree source = TREE_OPERAND (object, 0); /* COMPONENT_REF. */
+      source = TREE_OPERAND (source, 0); /* COMPONENT_REF. */
       source = TREE_OPERAND (source, 0); /* INDIRECT_REF. */
       source = TREE_OPERAND (source, 0); /* Source array's DECL or SAVE_EXPR. */
       if (TREE_CODE (source) == SAVE_EXPR)
@@ -1099,11 +1108,7 @@ expand_java_pushc (ival, type)
   else if (type == float_type_node || type == double_type_node)
     {
       REAL_VALUE_TYPE x;
-#ifdef REAL_ARITHMETIC
       REAL_VALUE_FROM_INT (x, ival, 0, TYPE_MODE (type));
-#else
-      x = ival;
-#endif
       value = build_real (type, x);
     }
   else
@@ -2972,13 +2977,8 @@ process_jvm_instruction (PC, byte_ops, length)
     build_java_ret (find_local_variable (index, ptr_type_node, oldpc));        \
   }
 
-#define JSR(OPERAND_TYPE, OPERAND_VALUE)               \
-  {                                                    \
-    tree where = lookup_label (oldpc+OPERAND_VALUE);   \
-    tree ret   = lookup_label (PC);                    \
-    build_java_jsr (where, ret);                       \
-    load_type_state (ret);                             \
-  }
+#define JSR(OPERAND_TYPE, OPERAND_VALUE) \
+  build_java_jsr (oldpc+OPERAND_VALUE, PC);
 
 /* Push a constant onto the stack. */
 #define PUSHC(OPERAND_TYPE, OPERAND_VALUE) \