You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/01/31 14:41:11 UTC

svn commit: r501839 - in /harmony/enhanced/drlvm/trunk/vm/vmcore/src: init/parse_arguments.cpp verifier/Verifier.cpp verifier/ver_dataflow.cpp verifier/ver_utils.cpp

Author: gshimansky
Date: Wed Jan 31 05:41:10 2007
New Revision: 501839

URL: http://svn.apache.org/viewvc?view=rev&rev=501839
Log:
Applied HARMONY-2905 [drlvm][jvmti] java.lang.VerifyError is thrown for instrumented class

Tests passed on Ubuntu6 x86, Windows 2003 server x86 and SuSE9 x86_64


Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/parse_arguments.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/parse_arguments.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/parse_arguments.cpp?view=diff&rev=501839&r1=501838&r2=501839
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/parse_arguments.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/parse_arguments.cpp Wed Jan 31 05:41:10 2007
@@ -455,6 +455,10 @@
             p_env->verify_all = true;
             p_env->verify_strict = true;
         }
+        else if (strcmp(option, "-Xverify:strict") == 0) {
+            p_env->verify_all = true;
+            p_env->verify_strict = true;
+        }
         else if (strcmp(option, "-verify") == 0) {
             p_env->verify_all = true;
         }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp?view=diff&rev=501839&r1=501838&r2=501839
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp Wed Jan 31 05:41:10 2007
@@ -5496,7 +5496,7 @@
     *message = context.m_error;
 #if _VERIFY_DEBUG
     if( result != VER_OK ) {
-        VERIFY_DEBUG( "VerifyError: " << (context.m_error ? context.m_error : "NULL") );
+        TRACE2("verifier", "VerifyError: " << (context.m_error ? context.m_error : "NULL") );
     }
 #endif // _VERIFY_DEBUG
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp?view=diff&rev=501839&r1=501838&r2=501839
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp Wed Jan 31 05:41:10 2007
@@ -460,14 +460,20 @@
     // check initialization
     if( source->m_type == SM_UNINITIALIZED && target->m_type != SM_UNINITIALIZED) {
         if( (source->m_new == 0 && target->m_ctype == VF_CHECK_ACCESS_FIELD)
-            || (local_init == false && target->m_ctype == VF_CHECK_UNINITIALIZED_THIS) )
+            || (local_init == false && target->m_ctype == VF_CHECK_UNINITIALIZED_THIS)
+            || (!ctex->m_dump.m_verify && source->m_new == 0
+                    && target->m_ctype == VF_CHECK_UNINITIALIZED_THIS) )
         {
             // 1. In initialization method instance fields of this
             //    that are declared in the current class may be assigned
-            //    before calling any instance initialization method
+            //    before calling any instance initialization method.
             // 2. Uninitialized class instance can be stored in
             //    a local variable if no backward branch is taken or
             //    the code isn't protected by exception handler.
+            // 3. In default mode (without any verifier control options)
+            //    uninitiliazed class reference in initialization method
+            //    can be stored in a local variable if backward branch is
+            //    taken or the code is protected by exception handler.
         } else {
             VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) 
                 << ", method: " << method_get_name( ctex->m_method )
@@ -715,16 +721,16 @@
  * Function clears stack map vector.
  */
 static inline void
-vf_clear_stack( vf_MapVector_t *vector )    // stack map vector
+vf_clear_stack( vf_MapVector_t *vector )    // map vector
 {
-    unsigned short index;
     vf_MapEntry_t zero_entry = {0};
 
     // zero stack vector
-    for( index = 0; index < vector->m_deep; index++ ) {
+    for( unsigned index = 0; index < vector->m_deep; index++ ) {
         vector->m_stack[index] = zero_entry;
     }
     vector->m_deep = 0;
+
     return;
 } // vf_clear_stack
 
@@ -915,12 +921,7 @@
                                   instr->m_inlen, ctex );
         return VER_OK;
     } else if( vf_is_instruction_has_flags( instr, VF_FLAG_THROW ) ) {
-        // clear stack
-        unsigned deep = invector->m_deep;
-        vf_clear_stack( invector );
         // set result vector stack deep
-        invector->m_deep = (unsigned short)(deep + instr->m_stack);
-        // set out vector
         invector->m_stack->m_type = SM_TERMINATE;
         return VER_OK;
     }
@@ -1131,7 +1132,11 @@
     if( !memcmp( method_get_name( ctex->m_method ), "<init>", 7 )
         && ctex->m_vtype.m_class != ctex->m_vtype.m_object )
     {
-        if( invector->m_local->m_type == SM_UNINITIALIZED ) {
+        if( invector->m_local->m_type != SM_UNINITIALIZED
+            && invector->m_local->m_vtype == ctex->m_vtype.m_class)
+        {
+            // constructor returns initialized reference of a given class
+        } else {
             VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) 
                 << ", method: " << method_get_name( ctex->m_method )
                 << method_get_descriptor( ctex->m_method )

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp?view=diff&rev=501839&r1=501838&r2=501839
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp Wed Jan 31 05:41:10 2007
@@ -1292,7 +1292,7 @@
             return VER_OK;
         }
         if( method_is_protected( method ) ) {
-            if( instance_name[0] == '[' && !memcmp( method_get_name( method ), "clone", 7 ) ) {
+            if( instance_name[0] == '[' && !memcmp( method_get_name( method ), "clone", 6 ) ) {
                 // for arrays function clone is public
             } else {
                 need_check = true;