* Java 1.5 support changes.
authortwisti <none@none>
Fri, 18 Nov 2005 00:57:20 +0000 (00:57 +0000)
committertwisti <none@none>
Fri, 18 Nov 2005 00:57:20 +0000 (00:57 +0000)
src/vm/jit/intrp/codegen.c
src/vm/jit/intrp/java.vmg

index 2b811939878776504bad2e770324dec6544694a4..09c01059c766afb8e2bd55833a389b19418c1685 100644 (file)
@@ -30,7 +30,7 @@
    Changes: Christian Thalinger
             Anton Ertl
 
-   $Id: codegen.c 3247 2005-09-21 14:59:57Z twisti $
+   $Id: codegen.c 3714 2005-11-18 00:57:20Z twisti $
 
 */
 
@@ -246,17 +246,6 @@ struct builtin_gen builtin_gen_table[] = {
     {BUILTIN_drem,                                       gen_DREM,            },
 };
 
-/*
-  The following ones cannot use the BUILTIN mechanism, because they
-  need the class as immediate arguments of the patcher
-
-       PATCHER_builtin_new,                 gen_PATCHER_NEW,    
-       PATCHER_builtin_newarray,            gen_PATCHER_NEWARRAY,       
-       PATCHER_builtin_arrayinstanceof, gen_PATCHER_ARRAYINSTANCEOF,
-*/
-
-
-
 
 /* codegen *********************************************************************
 
@@ -264,7 +253,7 @@ struct builtin_gen builtin_gen_table[] = {
 
 *******************************************************************************/
 
-void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
+bool codegen(methodinfo *m, codegendata *cd, registerdata *rd)
 {
        s4                  i, len, s1, s2, d;
        stackptr            src;
@@ -403,7 +392,10 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                case ICMD_ACONST:     /* ...  ==> ..., constant                       */
                                      /* op1 = 0, val.a = constant                    */
 
-                       gen_ACONST(((Inst **)cd), iptr->val.a);
+                       if ((iptr->target != NULL) && (iptr->val.a == NULL))
+                               gen_PATCHER_ACONST(((Inst **) cd), NULL, iptr->target);
+                       else
+                               gen_ACONST(((Inst **) cd), iptr->val.a);
                        break;
 
 
@@ -1643,22 +1635,15 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                case ICMD_BUILTIN:      /* ..., arg1, arg2, arg3 ==> ...              */
                                        /* op1 = arg count val.a = builtintable entry */
                        bte = iptr->val.a;
-                       if (bte->fp == PATCHER_builtin_new) {
-                               gen_PATCHER_NEW(((Inst **)cd), 0);
-                       } else if (bte->fp == PATCHER_builtin_newarray) {
-                               gen_PATCHER_NEWARRAY(((Inst **)cd), 0);
-                       } else if (bte->fp == PATCHER_builtin_arrayinstanceof) {
-                               gen_PATCHER_ARRAYINSTANCEOF(((Inst **)cd), 0);
-                       } else {
-                               for (i = 0; i < sizeof(builtin_gen_table)/sizeof(builtin_gen); i++) {
-                                       builtin_gen *bg = &builtin_gen_table[i];
-                                       if (bg->builtin == bte->fp) {
-                                               (bg->gen)(((Inst **)cd));
-                                               goto gen_builtin_end;
-                                       }
+
+                       for (i = 0; i < sizeof(builtin_gen_table)/sizeof(builtin_gen); i++) {
+                               builtin_gen *bg = &builtin_gen_table[i];
+                               if (bg->builtin == bte->fp) {
+                                       (bg->gen)(((Inst **)cd));
+                                       goto gen_builtin_end;
                                }
-                               assert(0);
                        }
+                       assert(0);
                gen_builtin_end:
                        break;
 
@@ -1738,22 +1723,16 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                      /* op1:   0 == array, 1 == class                */
                                      /* val.a: (classinfo *) superclass              */
 
-                       if (iptr->val.a == NULL) {
-                               gen_PATCHER_CHECKCAST(((Inst **)cd), 0, iptr->target);
-
+                       if (iptr->op1 == 1) {
+                               if (iptr->val.a == NULL)
+                                       gen_PATCHER_CHECKCAST(((Inst **) cd), NULL, iptr->target);
+                               else
+                                       gen_CHECKCAST(((Inst **) cd), iptr->val.a, NULL);
                        } else {
-                               gen_CHECKCAST(((Inst **)cd), iptr->val.a, iptr->target);
-                       }
-                       
-                       break;
-
-               case ICMD_ARRAYCHECKCAST: /* ..., objectref ==> ..., objectref        */
-                                         /* op1: 1... resolved, 0... not resolved    */
-
-                       if (iptr->op1 == 0) {
-                               gen_PATCHER_ARRAYCHECKCAST(((Inst **)cd), 0, iptr->target);
-                       } else {
-                               gen_ARRAYCHECKCAST(((Inst **)cd), iptr->target, 0);
+                               if (iptr->val.a == NULL)
+                                       gen_PATCHER_ARRAYCHECKCAST(((Inst **) cd), NULL, iptr->target);
+                               else
+                                       gen_ARRAYCHECKCAST(((Inst **) cd), iptr->val.a, NULL);
                        }
                        break;
 
@@ -1761,23 +1740,10 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                      /* op1:   0 == array, 1 == class                */
                                      /* val.a: (classinfo *) superclass              */
 
-                       if (iptr->val.a == NULL) {
-                               gen_PATCHER_INSTANCEOF(((Inst **)cd), 0, iptr->target);
-                       } else {
-                               gen_INSTANCEOF(((Inst **)cd), iptr->val.a, iptr->target);
-                       }
-                       
-                       break;
-
-
-               case ICMD_CHECKASIZE:  /* ..., size ==> ..., size                     */
-
-                       /* XXX remove me! */
-                       break;
-
-               case ICMD_CHECKEXCEPTION:    /* ..., objectref ==> ..., objectref     */
-
-                       gen_CHECKEXCEPTION(((Inst **)cd));
+                       if (iptr->val.a == NULL)
+                               gen_PATCHER_INSTANCEOF(((Inst **) cd), 0, iptr->target);
+                       else
+                               gen_INSTANCEOF(((Inst **) cd), iptr->val.a, iptr->target);
                        break;
 
                case ICMD_MULTIANEWARRAY:/* ..., cnt1, [cnt2, ...] ==> ..., arrayref  */
@@ -1791,8 +1757,8 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                        break;
 
                default:
-                       throw_cacao_exception_exit(string_java_lang_InternalError,
-                                                                          "Unknown ICMD %d", iptr->opc);
+                       *exceptionptr = new_internalerror("Unknown ICMD %d", iptr->opc);
+                       return false;
        } /* switch */
                
        } /* for instruction */
@@ -1818,6 +1784,10 @@ void codegen(methodinfo *m, codegendata *cd, registerdata *rd)
                                             ((u1 *)m->entrypoint) + bptr->mpc);
                }
        }
+
+       /* everything's ok */
+
+       return true;
 }
 
 
index 69ce9a5ccada1437bc68f6888241b555b843fc39..19e39bd69eeeb37c43db366d7f901b2294273e3a 100644 (file)
@@ -124,6 +124,22 @@ LCONST ( #l -- l ) opt
 
 ACONST ( #aRef -- aRef ) opt
 
+ACONST1 ( #aRef #acrUnused -- aRef ) opt
+
+PATCHER_ACONST ( #aRef #acr -- )
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = patcher_aconst((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+  THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(ACONST1);
+SET_IP(IP - 3);
+
 ILOAD ( #vLocal -- vResult ) 0x15
 {
   vResult = access_local_int(vLocal);
@@ -223,7 +239,7 @@ AASTORE ( aArray iIndex aRef -- ) 0x53
   CHECK_NULL_PTR(aArray);
   CHECK_OUT_OF_BOUNDS(aArray, iIndex);
   if (!builtin_canstore((java_objectarray *)aArray, aRef))
-       THROW(arraystoreexception);
+      THROW(arraystoreexception);
   access_array_addr(aArray, iIndex) = aRef;
 }
 
@@ -961,58 +977,133 @@ INVOKEINTERFACE ( #iInterfaceOffset #vOffset #iNargs #aum -- acelloldfp ainstold
 
 NEW ( aClass -- aRef ) 0xbb
 {
-  /* fprintf(stderr,"new: class %lx, class-state=%d\n",(long)aClass,((Hjava_lang_Class*)aClass)->state); */
-  global_sp=sp;
-  aRef = builtin_new((classinfo *)aClass);
+  global_sp = sp;
+  aRef = builtin_new((classinfo *) aClass);
+  if (aRef == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
   CLEAR_global_sp;
 }
 
 \ !! use a macro
 
 NEWARRAY_BOOLEAN ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_boolean(iSize);
-CLEAR_global_sp;
-
-NEWARRAY_CHAR ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_char(iSize);
-CLEAR_global_sp;
-
-NEWARRAY_FLOAT ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_float(iSize);
-CLEAR_global_sp;
-
-NEWARRAY_DOUBLE ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_double(iSize);
-CLEAR_global_sp;
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_boolean(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
 
 NEWARRAY_BYTE ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_byte(iSize);
-CLEAR_global_sp;
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_byte(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
+
+NEWARRAY_CHAR ( iSize -- aArray )
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_char(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
 
 NEWARRAY_SHORT ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_short(iSize);
-CLEAR_global_sp;
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_short(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
 
 NEWARRAY_INT ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_int(iSize);
-CLEAR_global_sp;
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_int(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
 
 NEWARRAY_LONG ( iSize -- aArray )
-global_sp=sp;
-aArray = (java_arrayheader *)builtin_newarray_long(iSize);
-CLEAR_global_sp;
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_long(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
+
+NEWARRAY_FLOAT ( iSize -- aArray )
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_float(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
+
+NEWARRAY_DOUBLE ( iSize -- aArray )
+{
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray_double(iSize);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
+  CLEAR_global_sp;
+}
 
 NEWARRAY ( iSize avftbl -- aArray ) 0xbd
 {
-  global_sp=sp;
-  aArray = (java_arrayheader *)builtin_newarray(iSize, (vftbl_t *)avftbl);
+  global_sp = sp;
+  aArray = (java_arrayheader *) builtin_newarray(iSize, (vftbl_t *) avftbl);
+  if (aArray == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
   CLEAR_global_sp;
 }
 
@@ -1051,16 +1142,30 @@ athrow:
 
 CHECKCAST ( #aClass #acr aRef -- aRef ) 0xc0
 {
-  if (!builtin_checkcast((java_objectheader *)aRef, (classinfo *)aClass))
+  if (!builtin_checkcast((java_objectheader *) aRef, (classinfo *) aClass))
     THROW(classcastexception);
 }
 
-ARRAYCHECKCAST ( #avftbl #acr aRef -- aRef ) 0xc0
+ARRAYCHECKCAST ( #aClass #acr aRef -- aRef ) 0xc0
 {
-  if (!builtin_arraycheckcast(aRef, avftbl))
+  if (!builtin_arraycheckcast(aRef, aClass))
     THROW(classcastexception);
 }
 
+PATCHER_ARRAYCHECKCAST ( #avftbl #acr -- ) 0xc0
+stackframeinfo sfi;
+bool result;
+global_sp = sp;
+stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
+result = patcher_builtin_arraycheckcast((u1 *) (IP - 3));
+stacktrace_remove_stackframeinfo(&sfi);
+CLEAR_global_sp;
+if (!result)
+  THROW0;
+STORE_ORDER_BARRIER();
+IP[-3] = INST_ADDR(ARRAYCHECKCAST);
+SET_IP(IP - 3);
+
 INSTANCEOF ( #aClass #acr aRef  -- iResult ) 0xc1
 {
   iResult = builtin_instanceof(aRef, aClass);
@@ -1096,11 +1201,17 @@ MULTIANEWARRAY ( #avftbl #iSize #acr -- aRef ) 197
 {
   long dims[iSize];
   int i;
-  for (i=0; i<iSize; i++) {
-    dims[i]=(sp+1)[iSize-i-1]; /* sp+1 to counter decrement by vmgen */
+  for (i = 0; i < iSize; i++) {
+    dims[i] = (sp + 1)[iSize - i - 1]; /* sp+1 to counter decrement by vmgen */
   }
-  global_sp=sp+1;
+  global_sp = sp + 1;
   aRef = (java_objectheader *)builtin_multianewarray(iSize, avftbl, dims);
+  if (aRef == NULL) {
+    global_sp = sp;
+    *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
+    CLEAR_global_sp;
+    THROW0;
+  }
   CLEAR_global_sp;
   sp += iSize;
 }
@@ -1289,87 +1400,19 @@ STORE_ORDER_BARRIER();
 IP[-3] = INST_ADDR(PUTFIELD_CELL);
 SET_IP(IP-3);
 
-NEW1 ( #aClass acrUnused -- aRef ) 0xbb
-{
-  /* fprintf(stderr,"new: class %lx, class-state=%d\n",(long)aClass,((Hjava_lang_Class*)aClass)->state); */
-  global_sp=sp;
-  aRef = builtin_new((classinfo *)aClass);
-  CLEAR_global_sp;
-}
-
-PATCHER_NEW ( #aClass -- )
-/* the unresolved class is in the cell right before this VM instruction;
-   our code generator guarantees thus */
-stackframeinfo sfi;
-bool result;
-global_sp = sp;
-stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
-result = patcher_builtin_new((u1 *)(IP-2));
-stacktrace_remove_stackframeinfo(&sfi);
-CLEAR_global_sp;
-if (!result)
-  THROW0;
-STORE_ORDER_BARRIER();
-IP[-2] = INST_ADDR(NEW1);
-SET_IP(IP-2);
-
-NEWARRAY1 ( iSize #avftbl avftblUnused -- aRef ) 0xbd
-{
-  global_sp=sp;
-  aRef = (java_objectheader *)builtin_newarray(iSize, (vftbl_t *)avftbl);
-  CLEAR_global_sp;
-}
-
-PATCHER_NEWARRAY ( #avftbl -- )
-/* the unresolved class is in the cell right before this VM instruction;
-   our code generator guarantees thus */
-stackframeinfo sfi;
-bool result;
-global_sp = sp;
-stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
-result = patcher_builtin_newarray((u1 *)(IP-2));
-stacktrace_remove_stackframeinfo(&sfi);
-CLEAR_global_sp;
-if (!result)
-  THROW0;
-STORE_ORDER_BARRIER();
-IP[-2] = INST_ADDR(NEWARRAY1);
-SET_IP(IP-2);
-
-PATCHER_MULTIANEWARRAY ( #avftbl #iSize #acr -- )
+PATCHER_MULTIANEWARRAY ( #aClass #iSize #acr -- )
 stackframeinfo sfi;
 bool result;
 global_sp = sp;
 stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
-result = patcher_builtin_multianewarray((u1 *)(IP-4));
+result = patcher_builtin_multianewarray((u1 *)(IP - 4));
 stacktrace_remove_stackframeinfo(&sfi);
 CLEAR_global_sp;
 if (!result)
   THROW0;
 STORE_ORDER_BARRIER();
 IP[-4] = INST_ADDR(MULTIANEWARRAY);
-SET_IP(IP-4);
-
-ARRAYINSTANCEOF1 ( aRef #avftbl avftblUnused -- iResult ) 0xc1
-{
-  iResult = builtin_arrayinstanceof(aRef, avftbl);
-}
-
-PATCHER_ARRAYINSTANCEOF ( #avftbl -- )
-/* the unresolved class is in the cell right before this VM instruction;
-   our code generator guarantees thus */
-stackframeinfo sfi;
-bool result;
-global_sp = sp;
-stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
-result = patcher_builtin_newarray((u1 *)(IP-2));
-stacktrace_remove_stackframeinfo(&sfi);
-CLEAR_global_sp;
-if (!result)
-  THROW0;
-STORE_ORDER_BARRIER();
-IP[-2] = INST_ADDR(ARRAYINSTANCEOF1);
-SET_IP(IP-2);
+SET_IP(IP - 4);
 
 PATCHER_INVOKESTATIC ( #aaTarget #iNargs #aum -- ) 0xd8
 stackframeinfo sfi;
@@ -1441,20 +1484,6 @@ STORE_ORDER_BARRIER();
 IP[-3] = INST_ADDR(CHECKCAST);
 SET_IP(IP-3);
 
-PATCHER_ARRAYCHECKCAST ( #avftbl #acr -- ) 0xc0
-stackframeinfo sfi;
-bool result;
-global_sp = sp;
-stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
-result = patcher_builtin_arraycheckcast((u1 *)(IP-3));
-stacktrace_remove_stackframeinfo(&sfi);
-CLEAR_global_sp;
-if (!result)
-  THROW0;
-STORE_ORDER_BARRIER();
-IP[-3] = INST_ADDR(ARRAYCHECKCAST);
-SET_IP(IP-3);
-
 PATCHER_INSTANCEOF ( #aClass #acr -- ) 0xc1
 stackframeinfo sfi;
 bool result;
@@ -1469,17 +1498,6 @@ STORE_ORDER_BARRIER();
 IP[-3] = INST_ADDR(INSTANCEOF);
 SET_IP(IP-3);
 
-\ CHECKEXCEPTION could be integrated into NEW etc., but that's not as
-\ nice to maintain.
-
-CHECKEXCEPTION ( aRef -- aRef )
-if (aRef==NULL) {
-  global_sp = sp;
-  *exceptionptr = stacktrace_inline_fillInStackTrace(NULL, (u1 *) fp, (functionptr) IP, (functionptr) IP);
-  CLEAR_global_sp;
-  THROW0;
-}
-
 \ This is stub code for methods that we have not yet translated.
 \ Initially, the code for each method is set to this stub. The
 \ first time the method is called, the code in the stub runs, which
@@ -1536,14 +1554,14 @@ stackframeinfo sfi;
 bool result;
 global_sp = sp;
 stacktrace_create_stackframeinfo(&sfi, NULL, fp, (functionptr) IP);
-result = patcher_resolve_native((u1 *)(IP-4));
+result = patcher_resolve_native((u1 *) (IP - 4));
 stacktrace_remove_stackframeinfo(&sfi);
 CLEAR_global_sp;
 if (!result)
   THROW0;
 STORE_ORDER_BARRIER();
 IP[-4] = runverbose ? INST_ADDR(TRACENATIVECALL) : INST_ADDR(NATIVECALL);
-SET_IP(IP-4);
+SET_IP(IP - 4);
 #else
 assert(false);
 #endif