You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/06/07 14:25:54 UTC

svn commit: r545153 - in /harmony/enhanced/drlvm/trunk: src/test/regression/H3658/ src/test/regression/H3658/Test.java src/test/regression/H3658/run.test.xml vm/jitrino/src/jet/cg_obj.cpp vm/jitrino/src/optimizer/IRBuilder.cpp

Author: varlax
Date: Thu Jun  7 05:25:53 2007
New Revision: 545153

URL: http://svn.apache.org/viewvc?view=rev&rev=545153
Log:
Applied HARMONY-3658 [drlvm][jit] Incorrect class resolution / initialization order in JET and OPT compilers

Added:
    harmony/enhanced/drlvm/trunk/src/test/regression/H3658/
    harmony/enhanced/drlvm/trunk/src/test/regression/H3658/Test.java
    harmony/enhanced/drlvm/trunk/src/test/regression/H3658/run.test.xml
Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_obj.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3658/Test.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3658/Test.java?view=auto&rev=545153
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3658/Test.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3658/Test.java Thu Jun  7 05:25:53 2007
@@ -0,0 +1,29 @@
+package org.apache.harmony.drlvm.tests.regression.h3658;
+
+import junit.framework.TestCase;
+
+public class Test extends TestCase {
+
+    public void test() {
+        int x = 1;
+        try {
+            new Foo(x=0);
+        } catch (Error e) {}
+       assertEquals(1, x); 
+    } 
+}
+
+class Foo {
+    static {
+        exception();
+    }
+
+    static void exception() {
+        throw new RuntimeException();
+    }
+
+    Foo(int x) {
+        System.out.println("FAILED!");
+    }
+} 
+

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3658/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3658/run.test.xml?view=auto&rev=545153
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3658/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3658/run.test.xml Thu Jun  7 05:25:53 2007
@@ -0,0 +1,14 @@
+<project name="RUN HARMONY-3658 Regression Test">
+  <target name="run-test">
+    <run-junit-test 
+        test="org.apache.harmony.drlvm.tests.regression.h3658.Test"
+        vmarg="-Xem:opt">
+    </run-junit-test>
+
+    <run-junit-test 
+        test="org.apache.harmony.drlvm.tests.regression.h3658.Test"
+        vmarg="-Xem:jet">
+    </run-junit-test>
+
+  </target>
+</project>

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_obj.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_obj.cpp?view=diff&rev=545153&r1=545152&r2=545153
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_obj.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_obj.cpp Thu Jun  7 05:25:53 2007
@@ -172,6 +172,9 @@
         if (klass == NULL) {
             gen_call_throw(ci_helper_linkerr, rt_helper_throw_linking_exc, 0, enclClass, cpIndex, OPCODE_NEW);
         } else {
+            if ( klass!=enclClass && class_needs_initialization(klass)) {
+                gen_call_vm(ci_helper_o, rt_helper_init_class, 0, klass);
+            }
             unsigned size = class_get_boxed_data_size(klass);
             Allocation_Handle ah = class_get_allocation_handle(klass);
             static CallSig ci_new(CCONV_STDCALL, i32, jobj);
@@ -183,11 +186,9 @@
         gen_call_vm(ci_new_with_resolve, rt_helper_new_withresolve, 0, enclClass, cpIndex);
     }
     gen_save_ret(jobj);
-    // the returned can not be null, marking as such.
-    vstack(0).set(VA_NZ);
-    // allocation assumes GC invocation
-    
-    m_bbstate->seen_gcpt = true;
+    vstack(0).set(VA_NZ);// the returned can not be null, marking as such.
+    m_bbstate->seen_gcpt = true;// allocation assumes GC invocation
+
 }
 
 void CodeGen::gen_instanceof_cast(JavaByteCodes opcode, Class_Handle enclClass, unsigned short cpIdx)

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp?view=diff&rev=545153&r1=545152&r2=545153
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp Thu Jun  7 05:25:53 2007
@@ -1950,8 +1950,14 @@
 
 void
 IRBuilder::genInitType(NamedType* type) {
-    if (!type->needsInitialization())
+    if (!type->needsInitialization()) {
         return;
+    }
+    MethodDesc * m = irManager->getCompilationInterface().getMethodToCompile();
+    NamedType* classType = m->getParentType();
+    if (type == classType) {
+        return;
+    }
     Opnd* opnd = lookupHash(Op_InitType, type->getId());
     if (opnd) return; // no need to re-initialize
 
@@ -2871,8 +2877,11 @@
 
 Opnd*
 IRBuilder::genNewObj(Type* type) {
+    assert(type->isNamedType());
     Opnd* dst = createOpnd(type);
+    //FIXME class initialization must be done before allocating new object
     appendInst(instFactory->makeNewObj(dst, type));
+    genInitType(type->asNamedType());
     return dst;
 }