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/07/23 16:38:53 UTC

svn commit: r558746 - in /harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent: commands/VirtualMachine.cpp commands/VirtualMachine.h core/PacketParser.cpp core/PacketParser.h

Author: gshimansky
Date: Mon Jul 23 07:38:51 2007
New Revision: 558746

URL: http://svn.apache.org/viewvc?view=rev&rev=558746
Log:
Applied patch from HARMONY-4323
[jdktools][jpda] JDWP commands VirtualMachine.AllClasses returns not prepared classes


Modified:
    harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp
    harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h
    harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.cpp
    harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.h

Modified: harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp?view=diff&rev=558746&r1=558745&r2=558746
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp (original)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp Mon Jul 23 07:38:51 2007
@@ -117,15 +117,14 @@
             count++;
         }
     }
+    size_t classCountPos = m_cmdParser->reply.GetPosition();
     m_cmdParser->reply.WriteInt(count);
     JDWP_TRACE_DATA("ClassesBySignature: classes=" << count);
     
+    int notIncludedClasses = 0;
     for (i = 0; i < count; i++)
     {
         jdwpTypeTag refTypeTag = GetClassManager().GetJdwpTypeTag(classes[i]);
-        m_cmdParser->reply.WriteByte(refTypeTag);
-
-        m_cmdParser->reply.WriteReferenceTypeID(jni, classes[i]);
 
         jint status;
         JVMTI_TRACE(err, jvmti->GetClassStatus(classes[i], &status));
@@ -137,8 +136,16 @@
         } else {
             if ( status == JVMTI_CLASS_STATUS_PRIMITIVE ) {
                 status = 0;
+            } else {
+                if ( (status & JVMTI_CLASS_STATUS_PREPARED) == 0 ) {
+                    // Given class is not prepared - don't return such class
+                    notIncludedClasses++;
+                    continue;
+                }
             }
         }
+        m_cmdParser->reply.WriteByte(refTypeTag);
+        m_cmdParser->reply.WriteReferenceTypeID(jni, classes[i]);
         m_cmdParser->reply.WriteInt(status);
 #ifndef NDEBUG
         if (JDWP_TRACE_ENABLED(LOG_KIND_DATA)) {    
@@ -153,6 +160,15 @@
         }
 #endif
     }
+
+    if ( notIncludedClasses != 0 ) {
+        size_t currentPos = m_cmdParser->reply.GetPosition();
+        jint currentLength = m_cmdParser->reply.GetLength();
+        m_cmdParser->reply.SetPosition(classCountPos);
+        m_cmdParser->reply.WriteInt(count - notIncludedClasses);
+        m_cmdParser->reply.SetPosition(currentPos);
+        m_cmdParser->reply.SetLength(currentLength);
+    }
 }
 
 bool
@@ -191,25 +207,33 @@
         throw AgentException(err);
 
     JDWP_TRACE_DATA("AllClasses: classes=" << classCount);
+    size_t classCountPos = m_cmdParser->reply.GetPosition();
     m_cmdParser->reply.WriteInt(classCount);
 
     // don't trace signatures of all classes
+    int notIncludedClasses = 0;
     for (int i = 0; i < classCount; i++) {
-        Compose41Class(jni, jvmti, classes[i]);
+        notIncludedClasses += Compose41Class(jni, jvmti, classes[i]);
+    }
+
+    if (notIncludedClasses > 0) {
+        size_t currentPos = m_cmdParser->reply.GetPosition();
+        jint currentLength = m_cmdParser->reply.GetLength();
+        m_cmdParser->reply.SetPosition(classCountPos);
+        m_cmdParser->reply.WriteInt(classCount - notIncludedClasses);
+        m_cmdParser->reply.SetPosition(currentPos);
+        m_cmdParser->reply.SetLength(currentLength);
     }
 }
 
 //-----------------------------------------------------------------------------
 
-void
+int
 VirtualMachine::AllClassesHandler::Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti,
         jclass klass) throw (AgentException)
 {
     jdwpTypeTag refTypeTag = GetClassManager().GetJdwpTypeTag(klass);
 
-    m_cmdParser->reply.WriteByte(refTypeTag);
-    m_cmdParser->reply.WriteReferenceTypeID(jni, klass);
-
     char* signature = 0;
 
     jvmtiError err;
@@ -220,25 +244,25 @@
     if (err != JVMTI_ERROR_NONE)
         throw AgentException(err);
 
-    m_cmdParser->reply.WriteString(signature);
-
     jint status;
     JVMTI_TRACE(err, jvmti->GetClassStatus(klass, &status));
     if (err != JVMTI_ERROR_NONE)
         throw AgentException(err);
 
     // According to JVMTI spec ClassStatus flag for arrays and primitive classes must be zero
-    if (status == JVMTI_CLASS_STATUS_ARRAY) {
+    if (status == JVMTI_CLASS_STATUS_ARRAY || status == JVMTI_CLASS_STATUS_PRIMITIVE) {
         status = 0;
-    } else {
-        if (status == JVMTI_CLASS_STATUS_PRIMITIVE) {
-            JDWP_INFO("WARNING: GetLoadedClasses() returned primitive type with signature: " 
-                << JDWP_CHECK_NULL(signature));
-            status = 0;
-        }
+    } else if ( (status & JVMTI_CLASS_STATUS_PREPARED) == 0 ) {
+        // Given class is not prepared - don't return such class
+        return 1;
     }
 
+    m_cmdParser->reply.WriteByte(refTypeTag);
+    m_cmdParser->reply.WriteReferenceTypeID(jni, klass);
+    m_cmdParser->reply.WriteString(signature);
     m_cmdParser->reply.WriteInt(status);
+
+    return 0;
 }
 
 //-----------------------------------------------------------------------------
@@ -687,15 +711,12 @@
 //-----------------------------------------------------------------------------
 //AllClassesWithGenericHandler-------------------------------------------------
 
-void
+int
 VirtualMachine::AllClassesWithGenericHandler::Compose41Class(JNIEnv *jni_env,
             jvmtiEnv* jvmti, jclass klass) throw (AgentException)
 {
     jdwpTypeTag refTypeTag = GetClassManager().GetJdwpTypeTag(klass);
 
-    m_cmdParser->reply.WriteByte(refTypeTag);
-    m_cmdParser->reply.WriteReferenceTypeID(jni_env, klass);
-
     char* signature = 0;
     char* generic = 0;
 
@@ -708,31 +729,34 @@
     if (err != JVMTI_ERROR_NONE)
         throw AgentException(err);
 
-    m_cmdParser->reply.WriteString(signature);
-
-    if (generic != 0)
-        m_cmdParser->reply.WriteString(generic);
-    else
-        m_cmdParser->reply.WriteString("");
-
     jint status;
     JVMTI_TRACE(err, jvmti->GetClassStatus(klass, &status));
     if (err != JVMTI_ERROR_NONE)
         throw AgentException(err);
 
     // According to JVMTI spec ClassStatus flag for arrays and primitive classes must be zero
-    if (status == JVMTI_CLASS_STATUS_ARRAY) {
+    if (status == JVMTI_CLASS_STATUS_ARRAY || status == JVMTI_CLASS_STATUS_PRIMITIVE) {
         status = 0;
-    } else {
-        if ( status == JVMTI_CLASS_STATUS_PRIMITIVE ) {
-            status = 0;
-        }
+    } else if ( (status & JVMTI_CLASS_STATUS_PREPARED) == 0 ) {
+        // Given class is not prepared - don't return such class
+        return 1;
     }
 
+    m_cmdParser->reply.WriteByte(refTypeTag);
+    m_cmdParser->reply.WriteReferenceTypeID(jni_env, klass);
+    m_cmdParser->reply.WriteString(signature);
+
+    if (generic != 0)
+        m_cmdParser->reply.WriteString(generic);
+    else
+        m_cmdParser->reply.WriteString("");
+
     m_cmdParser->reply.WriteInt(status);
     JDWP_TRACE_DATA("AllClassesWithGeneric: typeTag=" << refTypeTag << ", refTypeID="
          << klass << ", signature=" << JDWP_CHECK_NULL(signature) << ", generic=" 
          << JDWP_CHECK_NULL(generic) << ", status=" << status);
+
+    return 0;
 }
 
 //-----------------------------------------------------------------------------

Modified: harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h?view=diff&rev=558746&r1=558745&r2=558746
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h (original)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h Mon Jul 23 07:38:51 2007
@@ -95,14 +95,21 @@
             virtual void Execute(JNIEnv *jni) throw(AgentException);
 
             /**
-             * Writes class-type tag, reference ID, signature and status
-             * to the reply packet.
+             * If the passed class (klass parameter) has status
+             * JVMTI_CLASS_STATUS_PREPARED then writes class type tag,
+             * reference id, signature and status
+             * to the reply packet and reutrn 0 - success sign.
+             * Otherwise (class not prepared) doesn't write class info
+             * to the reply packet and reutrn 1 - unsuccess sign.
              *
              * @param jni   - the JNI interface pointer
              * @param jvmti - the JVMTI interface pointer
              * @param klass - the Java class
+             *
+             * @return 0 on success,
+             *         1 otherwise.
              */
-            virtual void Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass)
+            virtual int Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass)
                                             throw (AgentException);
 
         };//AllClassesHandler
@@ -391,14 +398,21 @@
         protected:
 
             /**
-             * Writes a class-type tag, reference ID, signature, generic signature and status
-             * to the reply packet.
+             * If the passed class (klass parameter) has status
+             * JVMTI_CLASS_STATUS_PREPARED then writes class type tag,
+             * reference id, signature, generic signature and status
+             * to the reply packet and reutrn 0 - success sign.
+             * Otherwise (class not prepared) doesn't write class info
+             * to the reply packet and reutrn 1 - unsuccess sign.
              *
              * @param jni   - the JNI interface pointer
              * @param jvmti - the JVMTI interface pointer
              * @param klass - Java class
+             *
+             * @return 0 on success,
+             *         1 otherwise.
              */
-            virtual void Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass)
+            virtual int Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass)
                                             throw (AgentException);
 
         };//AllClassesWithGenericHandler

Modified: harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.cpp?view=diff&rev=558746&r1=558745&r2=558746
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.cpp (original)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.cpp Mon Jul 23 07:38:51 2007
@@ -500,6 +500,13 @@
     }
 }
 
+size_t OutputPacketComposer::GetPosition() {
+    return m_position;
+}
+
+void OutputPacketComposer::SetPosition(size_t newPosition) {
+    m_position = newPosition;
+}
 
 void OutputPacketComposer::WriteRawData(const void* data, int length) throw (OutOfMemoryException) {
     AllocateMemoryForData(length);

Modified: harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.h?view=diff&rev=558746&r1=558745&r2=558746
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.h (original)
+++ harmony/enhanced/jdktools/trunk/modules/jpda/src/main/native/jdwp/common/agent/core/PacketParser.h Mon Jul 23 07:38:51 2007
@@ -642,6 +642,52 @@
 
     public:
 
+        /** 
+         * Gets current position in reply packet,
+         * to which next data will be written.
+         * 
+         * @return the current position in reply packet.
+         */
+        size_t GetPosition();
+
+        /** 
+         * Sets current position in reply packet
+         * to the newPosition, passed as parameter.
+         * Next data will be written in reply packet
+         * starting with the newPosition.
+         * This function is intended to rewrite some written
+         * data with new value and should be used carefully.
+         * Exemplary scenario is the following:
+         * - currentPosition = GetPosition();
+         * - currentLength = GetLength();
+         * - SetPosition(newPosition);
+         * - Rewriting data to the newPosition;
+         * - SetPosition(currentPosition);
+         * - SetLength(currentLength);
+         * 
+         * @param newPosition - new position in reply packet.
+         */
+        void SetPosition(size_t newPosition);
+
+        /** 
+         * Sets current length of jdwp packet
+         * to the new value, passed as parameter.
+         * This function can be used to restore length 
+         * of reply packet to the right value after
+         * rewriting some data in packet and,
+         * in this case, it should be used carefully.
+         * Exemplary scenario is the following:
+         * - currentPosition = GetPosition();
+         * - currentLength = GetLength();
+         * - SetPosition(newPosition);
+         * - Rewriting data to the newPosition;
+         * - SetPosition(currentPosition);
+         * - SetLength(currentLength);
+         * 
+         * @param newLength - new length of reply packet.
+         */
+        void SetLength(jint newLength) { m_packet.type.cmd.len = newLength; }
+
         /**
          * Creates an empty instance of OutputPacketComposer .
          */
@@ -938,7 +984,6 @@
         void MoveData(JNIEnv *jni, OutputPacketComposer* to);
 
     protected:
-        void SetLength(jint length) { m_packet.type.cmd.len = length; }
         void SetId(jint id) { m_packet.type.cmd.id = id; }
         void SetFlags(jbyte flags) { m_packet.type.cmd.flags = flags; }
         void SetCommandSet(jdwpCommandSet cmdSet) { m_packet.type.cmd.cmdSet = cmdSet; }