You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by lv...@apache.org on 2008/03/13 08:20:51 UTC

svn commit: r636651 - in /harmony/enhanced/jdktools/branches/java6/modules/jpda: make/ src/main/native/jdwp/common/agent/commands/ src/main/native/jdwp/common/agent/core/ src/main/native/jdwp/common/generic/ src/test/java/org/apache/harmony/jpda/tests/...

Author: lvjing
Date: Thu Mar 13 00:20:42 2008
New Revision: 636651

URL: http://svn.apache.org/viewvc?rev=636651&view=rev
Log:
Apply patch for HARMONY-5596, [jdktools][jdwp6] Add new command ReferringObjects Command for Java 6

Added:
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee.java   (with props)
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsTest.java   (with props)
Modified:
    harmony/enhanced/jdktools/branches/java6/modules/jpda/make/exclude.common
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.cpp
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.h
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.cpp
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.h
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CommandDispatcher.cpp
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h
    harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/framework/jdwp/JDWPCommands.java

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/make/exclude.common
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/make/exclude.common?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/make/exclude.common (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/make/exclude.common Thu Mar 13 00:20:42 2008
@@ -6,11 +6,12 @@
 #5154
 org/apache/harmony/jpda/tests/jdwp/Events/ClassUnloadTest.java
 #5549
-org/apache/harmony/jpda/tests/jdwp/ReferenceType/ClassFileVersionDebuggee.java
 org/apache/harmony/jpda/tests/jdwp/ReferenceType/ClassFileVersionTest.java
 #5564
 org/apache/harmony/jpda/tests/jdwp/ReferenceType/InstancesTest.java
 #5587
-org/apache/harmony/jpda/tests/jdwp/ReferenceType/ConstantPoolTest
+org/apache/harmony/jpda/tests/jdwp/ReferenceType/ConstantPoolTest.java
 #5591
-org/apache/harmony/jpda/tests/jdwp/VirtualMachine/InstanceCountsTest
+org/apache/harmony/jpda/tests/jdwp/VirtualMachine/InstanceCountsTest.java
+#5596
+org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsTest.java

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.cpp?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.cpp Thu Mar 13 00:20:42 2008
@@ -23,9 +23,11 @@
 #include "ObjectReference.h"
 #include "PacketParser.h"
 #include "ObjectManager.h"
+#include "CallBacks.h"
 
 using namespace jdwp;
 using namespace ObjectReference;
+using namespace CallBacks;
 
 //------------------------------------------------------------------------------
 //ReferenceTypeHandler(1)-------------------------------------------------------
@@ -880,3 +882,89 @@
         }
     }
 }
+
+// New commands for Java 6
+//------------------------------------------------------------------------------
+//ReferringObjectsHandler(10)---------------------------------------------------
+
+void
+ObjectReference::ReferringObjectsHandler::Execute(JNIEnv *jni) throw (AgentException)
+{
+    // Get objectID
+    jobject jvmObject = m_cmdParser->command.ReadObjectID(jni);
+    // Can be: InternalErrorException, OutOfMemoryException, JDWP_ERROR_INVALID_OBJECT
+
+    // Get maximum number of referring objects to return.
+    int maxReferrers = m_cmdParser->command.ReadInt();
+    if(maxReferrers < 0) {
+        throw AgentException(JDWP_ERROR_ILLEGAL_ARGUMENT);
+    }
+
+    // Define tag for referree object
+    jlong targetObjTag = 0xefff;
+    // Set tag for target object
+     jvmtiError err;
+    JVMTI_TRACE(err, GetJvmtiEnv()->SetTag(jvmObject, targetObjTag));
+    if (err != JVMTI_ERROR_NONE) {
+        // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY,  JVMTI_ERROR_INVALID_OBJECT
+        throw AgentException(err);
+    }
+    
+    // Define tag for referrer object
+    jlong referrerObjTag = 0xdfff;
+    jlong tags[2] = {targetObjTag, referrerObjTag};
+
+    // Initial callbacks for jvmtiHeapCallbacks
+    jvmtiHeapCallbacks hcbs;
+    memset(&hcbs, 0, sizeof(hcbs));
+    hcbs.heap_iteration_callback = NULL;
+    hcbs.heap_reference_callback = &HeapReferenceCallback_ReferringObject;
+    hcbs.primitive_field_callback = NULL;
+    hcbs.array_primitive_value_callback = NULL;
+    hcbs.string_primitive_value_callback = NULL;
+
+    //It initiates a traversal over the objects that are directly and indirectly reachable from the heap roots.
+    JVMTI_TRACE(err, GetJvmtiEnv()->FollowReferences(0, NULL,  NULL,
+         &hcbs, tags));
+    if (err != JVMTI_ERROR_NONE) {
+        // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY, JVMTI_ERROR_INVALID_CLASS
+        // JVMTI_ERROR_INVALID_OBJECT, JVMTI_ERROR_NULL_POINTER 
+        throw AgentException(err);
+    }
+
+    const jlong referrerTags[1] = {referrerObjTag};
+    jint referringObjectsNum = 0;
+    jobject * pResultObjects = 0;
+    // Return the instances that have been marked expectd tag.
+    JVMTI_TRACE(err, GetJvmtiEnv()->GetObjectsWithTags(1, referrerTags, &referringObjectsNum,
+           &pResultObjects, NULL));
+    JvmtiAutoFree afResultObjects(pResultObjects);
+
+    if (err != JVMTI_ERROR_NONE) {
+        // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY, JVMTI_ERROR_ILLEGAL_ARGUMENT 
+        // JVMTI_ERROR_ILLEGAL_ARGUMENT, JVMTI_ERROR_NULL_POINTER  
+        throw AgentException(err);
+    }
+
+    jint returnReferringObjectsNum;
+    //If maxReferrers is zero, all instances are returned.
+    if(0 == maxReferrers) {
+        returnReferringObjectsNum = referringObjectsNum;
+    }
+    else if(maxReferrers < referringObjectsNum) {
+        returnReferringObjectsNum = maxReferrers;
+    }
+    else {
+        returnReferringObjectsNum = referringObjectsNum;
+    }
+
+    // Compose reply package
+    m_cmdParser->reply.WriteInt(returnReferringObjectsNum);
+    JDWP_TRACE_DATA("ReferringObject: return objects number:" << returnReferringObjectsNum );
+
+    for(int i = 0; i < returnReferringObjectsNum; i++) {
+        m_cmdParser->reply.WriteTaggedObjectID(jni, pResultObjects[i]);
+    }
+    JDWP_TRACE_DATA("ReferringObject: tagged-objectID returned.");
+
+} //ReferringObjectsHandler::Execute()

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.h?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ObjectReference.h Thu Mar 13 00:20:42 2008
@@ -212,6 +212,25 @@
 
         };//InvokeMethodHandler
 
+         //New commands for Java 6
+        // =========================================================================
+        /**
+         * The class implements the <code>ReferringObjects (10) </code>
+         * command from the <code>ObjectReference</code> command set.
+         */
+        class ReferringObjectsHandler : public SyncCommandHandler {
+        protected:
+
+            /**
+             * Executes the <code>ReferringObjects</code> JDWP command for the
+             * <code>ObjectReference</code> command set.
+             *
+             * @param jni - the JNI interface pointer
+             */
+            virtual void Execute(JNIEnv *jni) throw(AgentException);
+
+        }; // ReferringObjectsHandler class
+
     } // ObjectReference namespace
 
 } // jdwp namespace

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.cpp?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.cpp Thu Mar 13 00:20:42 2008
@@ -91,3 +91,33 @@
              *tag_ptr = tag_value;
              return JVMTI_VISIT_OBJECTS;
      }
+     
+//-----------------------------------------------------------------------------
+// Heap callbacks, used in ReferringObject command
+//-----------------------------------------------------------------------------
+
+     /**
+      * Describes a reference from an object or the VM (the referrer) 
+      * to another object (the referree) or a heap root to a referree. It 
+      * will be invoked by ReferringObject command.
+      */
+     jint JNICALL CallBacks::HeapReferenceCallback_ReferringObject
+        (jvmtiHeapReferenceKind reference_kind, 
+         const jvmtiHeapReferenceInfo* reference_info, 
+         jlong class_tag, 
+         jlong referrer_class_tag, 
+         jlong size, 
+         jlong* tag_ptr, 
+         jlong* referrer_tag_ptr, 
+         jint length, 
+         void* user_data) {
+             jlong targetObjTag = *(static_cast<jlong *>(user_data));
+             jlong *ptr = static_cast<jlong *>(user_data);
+             ptr++;
+             jlong referrerObjTag = *ptr;
+             if(*tag_ptr == targetObjTag && referrer_tag_ptr != NULL) {
+                *referrer_tag_ptr = referrerObjTag;
+             }
+            return JVMTI_VISIT_OBJECTS;
+     }
+ 

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.h?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CallBacks.h Thu Mar 13 00:20:42 2008
@@ -24,7 +24,7 @@
 
 namespace jdwp {
 
-     //-----------------------------------------------------------------------------
+   //-----------------------------------------------------------------------------
    // Heap callbacks, used in Instances, InstanceCounts command
    //-----------------------------------------------------------------------------
     namespace CallBacks {
@@ -78,6 +78,26 @@
          const jchar* value, 
          jint value_length, 
          void* user_data);
+         
+        //-----------------------------------------------------------------------------
+        // Heap callbacks, used in ReferringObject command
+        //-----------------------------------------------------------------------------
+        /**
+         * Describes a reference from an object or the VM (the referrer) 
+         * to another object (the referree) or a heap root to a referree. It 
+         * will be invoked by ReferringObject command.
+         */
+        jint JNICALL HeapReferenceCallback_ReferringObject
+        (jvmtiHeapReferenceKind reference_kind, 
+          const jvmtiHeapReferenceInfo* reference_info, 
+          jlong class_tag, 
+          jlong referrer_class_tag, 
+          jlong size, 
+          jlong* tag_ptr, 
+          jlong* referrer_tag_ptr, 
+          jint length, 
+          void* user_data);
+
     } //CallBacks namespace
 } // jdwp namesoace
 #endif//_CALL_BACKS_H_

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CommandDispatcher.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CommandDispatcher.cpp?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CommandDispatcher.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/CommandDispatcher.cpp Thu Mar 13 00:20:42 2008
@@ -311,6 +311,10 @@
         case JDWP_COMMAND_OR_IS_COLLECTED:
             return new ObjectReference::IsCollectedHandler();
 
+         // New commands for Java 6
+        case JDWP_COMMAND_OR_REFERRING_OBJECTS:
+            return new ObjectReference::ReferringObjectsHandler(); 
+
         }
         break;
 

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h Thu Mar 13 00:20:42 2008
@@ -132,6 +132,8 @@
     JDWP_COMMAND_OR_DISABLE_COLLECTION = 7,
     JDWP_COMMAND_OR_ENABLE_COLLECTION = 8,
     JDWP_COMMAND_OR_IS_COLLECTED = 9,
+    // New commands for Java 6
+    JDWP_COMMAND_OR_REFERRING_OBJECTS = 10,
 
     /* Commands StringReference */
     JDWP_COMMAND_SR_VALUE = 1,

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/framework/jdwp/JDWPCommands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/framework/jdwp/JDWPCommands.java?rev=636651&r1=636650&r2=636651&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/framework/jdwp/JDWPCommands.java (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/framework/jdwp/JDWPCommands.java Thu Mar 13 00:20:42 2008
@@ -78,6 +78,7 @@
 
         public static final byte AllClassesWithGenericCommand = 20;
         
+        //New commands for Java 6
         public static final byte InstanceCountsCommand = 21;
     }
 
@@ -207,6 +208,9 @@
         public static final byte EnableCollectionCommand = 8;
 
         public static final byte IsCollectedCommand = 9;
+        
+        //New commands for Java 6
+        public static final byte ReferringObjectsCommand = 10;
     }
 
     /**

Added: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee.java?rev=636651&view=auto
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee.java (added)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee.java Thu Mar 13 00:20:42 2008
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.harmony.jpda.tests.jdwp.ObjectReference;
+
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
+import org.apache.harmony.jpda.tests.share.SyncDebuggee;
+
+public class ReferringObjectsDebuggee extends SyncDebuggee {
+
+    static final int maxNum = 17;
+    
+    static int referringObjNum;
+    
+    static int nonreferringObjNum;
+    
+    static {
+        referringObjNum = new Random().nextInt(maxNum) + 2;
+        nonreferringObjNum = new Random().nextInt(maxNum) + 2;
+    }
+
+    @Override
+    public void run() {
+        ReferringObjectsReferree001 referree = new ReferringObjectsReferree001();
+        //Referrer objects which contain reference of referree object       
+        ArrayList<ReferringObjectsReferrer001> referringObjs = new ArrayList<ReferringObjectsReferrer001>();
+        
+        for(int i = 0; i < referringObjNum; i++) {
+            referringObjs.add(new ReferringObjectsReferrer001(referree));
+        }
+        
+        //Referrer objects which contain reference which is null 
+        ArrayList<ReferringObjectsReferrer001> nonreferringObjs = new ArrayList<ReferringObjectsReferrer001>();
+        
+        for(int i = 0; i < nonreferringObjNum; i++) {
+            nonreferringObjs.add(new ReferringObjectsReferrer001(null));
+        }
+        
+        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY);
+        logWriter.println("--> Debuggee: ReferringObjectsDebuggee...");
+        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
+    }
+
+    public static void main(String[] args) {
+        runDebuggee(ReferringObjectsDebuggee.class);
+    }
+
+}
+
+class ReferringObjectsReferree001 {
+    
+}
+
+class ReferringObjectsReferrer001 {
+    private boolean isReferrer;
+    private ReferringObjectsReferree001 reference;
+    
+    ReferringObjectsReferrer001(ReferringObjectsReferree001 reference) {
+        if(null != reference) {
+            isReferrer = true;
+        }
+        else {
+            isReferrer = false;
+        }
+        this.reference = reference;
+    }
+}
+
+

Propchange: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsTest.java?rev=636651&view=auto
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsTest.java (added)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsTest.java Thu Mar 13 00:20:42 2008
@@ -0,0 +1,260 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.harmony.jpda.tests.jdwp.ObjectReference;
+
+import java.util.Random;
+
+import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
+import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
+import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
+import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
+import org.apache.harmony.jpda.tests.framework.jdwp.Value;
+import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
+import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
+
+public class ReferringObjectsTest extends JDWPSyncTestCase {
+
+    static final int testStatusPassed = 0;
+
+    static final int testStatusFailed = -1;
+    
+    static int maxReferrers;
+
+    static final String thisCommandName = "ObjectReference.ReferringObjects command";
+
+    static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee;";
+   
+    static final String referreeObjSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsReferree001;";
+    
+    static final String referrerObjSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsReferrer001;";
+    
+    protected String getDebuggeeClassName() {
+        return "org.apache.harmony.jpda.tests.jdwp.ObjectReference.ReferringObjectsDebuggee";
+    }
+
+    // ReferringObjects need canGetInstanceInfo VM capability support
+    private boolean isCapability() {
+        // check capability, relevant for this test
+        logWriter.println("=> Check capability: canGetInstanceInfo");
+        debuggeeWrapper.vmMirror.capabilities();
+        boolean isCapability = debuggeeWrapper.vmMirror.targetVMCapabilities.canGetInstanceInfo;
+        return isCapability;
+    }
+    
+    /**
+     * This testcase exercises ObjectReference.ReferringObjects command.
+     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID, 
+     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects 
+     * command and checks that returned instances are equal to the expected referrer objects. Since maxReferrers
+     * equals zero, all instances are returned.
+     */
+    public void testReferringObjects_MaxReferrersIsZero() {
+        maxReferrers = 0;
+        DoTestReferringObjects();
+    }
+    
+    /**
+     * This testcase exercises ObjectReference.ReferringObjects command.
+     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID, 
+     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects 
+     * command and checks that returned instances are equal to the expected referrer objects. Since maxReferrers
+     * is more than the number of referrer objects, all instances are returned.
+     */
+    public void testReferringObjects_MaxReferrersIsLarge() {
+        maxReferrers = 20;
+        DoTestReferringObjects();
+    }
+    
+    /**
+     * This testcase exercises ObjectReference.ReferringObjects command.
+     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID, 
+     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects 
+     * command and checks that returned instances are equal to the expected referrer objects. Since maxReferrers
+     * is less than the number of referrer objects, the number of instances returned is equal to maxReferrers.
+     */
+    public void testReferringObjects_MaxReferrersIsSmall() {
+        maxReferrers = 1;
+        DoTestReferringObjects();
+    }
+    
+    /**
+     * This is the real body of the testcase which exercises ObjectReference.ReferringObjects command.
+     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID, 
+     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects 
+     * command and checks that returned instances are equal to the expected referrer objects.
+     */
+    public void DoTestReferringObjects() {
+        String thisTestName = "testReferringObjects_Normal";
+        
+        if (!isCapability()) {
+            logWriter.println("##WARNING: this VM dosn't possess capability: canGetInstanceInfo");
+            return;
+        }
+        
+        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
+        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
+
+        // Get the number of referrer objects in ReferringObjectsDebugee
+        long debuggeeRefTypeID = getClassIDBySignature(debuggeeSignature);
+        long referringObjNumID = debuggeeWrapper.vmMirror.getFieldID(
+                debuggeeRefTypeID, "referringObjNum");
+        long[] fieldIDs = new long[1];
+        fieldIDs[0] = referringObjNumID;
+        Value[] values = debuggeeWrapper.vmMirror.getReferenceTypeValues(
+                debuggeeRefTypeID, fieldIDs);
+        int expectedReferringObjNum = values[0].getIntValue();
+        
+        logWriter.println("=> ReferringObjNum in debuggee is: " + expectedReferringObjNum);
+
+        if(maxReferrers > 0) {
+            expectedReferringObjNum = (maxReferrers > expectedReferringObjNum) ? expectedReferringObjNum : maxReferrers;
+        }
+        
+        // Compose Instances command to get referree objectID
+        CommandPacket InstancesCommand = new CommandPacket(
+                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
+                JDWPCommands.ReferenceTypeCommandSet.InstancesCommand);
+        
+        long referreeObjTypeID = getClassIDBySignature(referreeObjSignature);
+        InstancesCommand.setNextValueAsReferenceTypeID(referreeObjTypeID);
+        InstancesCommand.setNextValueAsInt(1);
+        
+        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(InstancesCommand);
+        InstancesCommand = null;
+        
+        // Get the number of instances that returned. 
+        int objNum = checkedReply.getNextValueAsInt();
+        // Get the tagged-objectID
+        byte tag = checkedReply.getNextValueAsByte();
+        long objectID = checkedReply.getNextValueAsObjectID();
+        
+        // Compose ReferringObjects commnad
+        CommandPacket ReferringObjectsCommand = new CommandPacket(
+                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
+                JDWPCommands.ObjectReferenceCommandSet.ReferringObjectsCommand);
+        
+        ReferringObjectsCommand.setNextValueAsObjectID(objectID);
+        ReferringObjectsCommand.setNextValueAsInt(maxReferrers);
+        
+        // Perform ReferringObjects command and attain reply package
+        checkedReply = debuggeeWrapper.vmMirror
+                .performCommand(ReferringObjectsCommand);
+        ReferringObjectsCommand = null;
+        
+        // Get referrer objects numbers
+        int referringObjects = checkedReply.getNextValueAsInt();
+        assertEquals(thisCommandName + "returned instances number is wrong.", expectedReferringObjNum, referringObjects,null,null);
+   
+        long referrerTypeID = getClassIDBySignature(referrerObjSignature);
+        long referrerFieldID = debuggeeWrapper.vmMirror.getFieldID(
+                referrerTypeID, "isReferrer");
+        
+        // Check the returned objects are referrer objects
+        for (int i = 0; i < referringObjects; i++) {
+            //Get the tagged-objectID
+            tag = checkedReply.getNextValueAsByte();
+            assertEquals(thisCommandName
+                    + "returned object tag is invalid.", 'L', tag, null, null);
+            
+            objectID = checkedReply.getNextValueAsObjectID();
+            logWriter.println("=> ObjectID is: " + objectID);
+            values = debuggeeWrapper.vmMirror.getObjectReferenceValues(
+                    objectID, new long[] { referrerFieldID });
+            boolean isReferrer = values[0].getBooleanValue();
+            if (!isReferrer) {
+                printErrorAndFail(thisCommandName
+                        + "returned object is not a referrer which references this object.");
+            }
+        }
+        logWriter.println("=> CHECK: PASSED: expected instances are returned:");
+        logWriter.println("=> Returned referringObjects number is" + referringObjects);
+        
+        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
+        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH");
+        assertAllDataRead(checkedReply);
+    }
+    
+    /**
+     * This testcase exercises ObjectReference.ReferringObjects command. <BR>
+     * Compose a ReferringObjects command with negative maxReferrers
+     * The vm should throw a ILLEGAL_ARGUMENT exception.
+     */
+    public void testReferringObjects_IllegalArgument() {
+        String thisTestName = "testReferringObjects_IllegalArgument";
+        
+        if (!isCapability()) {
+            logWriter.println("##WARNING: this VM dosn't possess capability: canGetInstanceInfo");
+            return;
+        }
+        
+        int maxReferrers = -1;
+        
+        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
+        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
+
+        // Compose Instances command to get referree objectID
+        CommandPacket InstancesCommand = new CommandPacket(
+                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
+                JDWPCommands.ReferenceTypeCommandSet.InstancesCommand);
+        
+        long referreeObjTypeID = getClassIDBySignature(referreeObjSignature);
+        InstancesCommand.setNextValueAsReferenceTypeID(referreeObjTypeID);
+        InstancesCommand.setNextValueAsInt(1);
+        
+        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(InstancesCommand);
+        InstancesCommand = null;
+        
+        // Get the number of instances that returned. 
+        int objNum = checkedReply.getNextValueAsInt();
+        // Get the tagged-objectID
+        byte tag = checkedReply.getNextValueAsByte();
+        long objectID = checkedReply.getNextValueAsObjectID();
+        
+        // Compose ReferringObjects commnad
+        CommandPacket ReferringObjectsCommand = new CommandPacket(
+                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
+                JDWPCommands.ObjectReferenceCommandSet.ReferringObjectsCommand);
+        
+        ReferringObjectsCommand.setNextValueAsObjectID(objectID);
+        ReferringObjectsCommand.setNextValueAsInt(maxReferrers);
+        
+        // Perform ReferringObjects command and attain reply package
+        checkedReply = debuggeeWrapper.vmMirror
+                .performCommand(ReferringObjectsCommand);
+        ReferringObjectsCommand = null;
+
+        short errorCode = checkedReply.getErrorCode();
+        if (errorCode != JDWPConstants.Error.NONE) {
+            if (errorCode == JDWPConstants.Error.NOT_IMPLEMENTED) {
+                logWriter.println("=> CHECK PASSED: Expected error (NOT_IMPLEMENTED) is returned");
+                return;
+            }
+            else if(errorCode == JDWPConstants.Error.ILLEGAL_ARGUMENT) {
+                logWriter.println("=> CHECK PASSED: Expected error (ILLEGAL_ARGUMENT) is returned");
+                return;
+            }
+        }
+        printErrorAndFail(thisCommandName + " should throw ILLEGAL_ARGUMENT exception when maxReferrers is negative.");
+    }
+    
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(ReferringObjectsTest.class);
+    }
+
+}

Propchange: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/test/java/org/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native