| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | package com.android.tools.r8.debug; | 
 |  | 
 | 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.JDWPCommands.ReferenceTypeCommandSet; | 
 | import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants; | 
 | import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants.Error; | 
 | import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; | 
 | import org.apache.harmony.jpda.tests.framework.jdwp.VmMirror; | 
 |  | 
 | /** | 
 |  * Utils for JDWP mirror. | 
 |  */ | 
 | public abstract class VmMirrorUtils { | 
 |  | 
 |   private VmMirrorUtils() { | 
 |   } | 
 |  | 
 |   public static void checkReply(ReplyPacket replyPacket) { | 
 |     checkReply(replyPacket, Error.NONE); | 
 |   } | 
 |  | 
 |   public static void checkReply(ReplyPacket replyPacket, int expectedErrorCode) { | 
 |     if (replyPacket.getErrorCode() != expectedErrorCode) { | 
 |       throw new AssertionError( | 
 |           "Expected error code " + JDWPConstants.Error.getName(expectedErrorCode) + " (" | 
 |               + expectedErrorCode + ") but received " + JDWPConstants.Error | 
 |               .getName(expectedErrorCode) + " (" + expectedErrorCode + ")"); | 
 |     } | 
 |  | 
 |   } | 
 |  | 
 |   public static String getMethodName(VmMirror mirror, long classID, long methodID) { | 
 |     CommandPacket packet = new CommandPacket( | 
 |         JDWPCommands.ReferenceTypeCommandSet.CommandSetID, | 
 |         ReferenceTypeCommandSet.MethodsWithGenericCommand); | 
 |     packet.setNextValueAsReferenceTypeID(classID); | 
 |     ReplyPacket reply = mirror.performCommand(packet); | 
 |     checkReply(reply); | 
 |     int methodsCount = reply.getNextValueAsInt(); | 
 |     String result = null; | 
 |     for (int i = 0; i < methodsCount; i++) { | 
 |       long id = reply.getNextValueAsMethodID(); // skip method ID | 
 |       String methodName = reply.getNextValueAsString(); | 
 |       reply.getNextValueAsString(); // skip signature | 
 |       reply.getNextValueAsString(); // skip generic signature | 
 |       reply.getNextValueAsInt(); // skip modifiers | 
 |       if (id == methodID) { | 
 |         result = methodName; | 
 |       } | 
 |     } | 
 |     assert reply.isAllDataRead(); | 
 |     return result; | 
 |   } | 
 |  | 
 |   public static String getMethodSignature(VmMirror mirror, long classID, long methodID) { | 
 |     CommandPacket command = new CommandPacket( | 
 |         ReferenceTypeCommandSet.CommandSetID, | 
 |         ReferenceTypeCommandSet.MethodsWithGenericCommand); | 
 |     command.setNextValueAsReferenceTypeID(classID); | 
 |     ReplyPacket reply = mirror.performCommand(command); | 
 |     checkReply(reply); | 
 |  | 
 |     int methods = reply.getNextValueAsInt(); | 
 |     for (int i = 0; i < methods; i++) { | 
 |       long mID = reply.getNextValueAsMethodID(); | 
 |       reply.getNextValueAsString(); // skip method name | 
 |       String methodSign = reply.getNextValueAsString(); | 
 |       reply.getNextValueAsString(); // skip generic signature | 
 |       reply.getNextValueAsInt(); // skip modifiers | 
 |       if (mID == methodID) { | 
 |         String value = methodSign.replaceAll("/", "."); | 
 |         int lastRoundBracketIndex = value.lastIndexOf(")"); | 
 |         return value.substring(0, lastRoundBracketIndex + 1); | 
 |       } | 
 |     } | 
 |  | 
 |     assert reply.isAllDataRead(); | 
 |     return null; | 
 |   } | 
 |  | 
 | } |