--- old/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Thu Dec 10 01:42:38 2015 +++ new/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Thu Dec 10 01:42:38 2015 @@ -26,6 +26,7 @@ package com.sun.tools.jdi; import com.sun.jdi.*; +import com.sun.jdi.Module; import com.sun.jdi.connect.spi.Connection; import com.sun.jdi.request.EventRequestManager; import com.sun.jdi.request.EventRequest; @@ -48,6 +49,7 @@ public final int sizeofObjectRef; public final int sizeofClassRef; public final int sizeofFrameRef; + public final int sizeofModuleRef; final int sequenceNumber; @@ -75,6 +77,8 @@ private TreeSet typesBySignature; private boolean retrievedAllTypes = false; + private Map modulesByID; + // For other languages support private String defaultStratum = null; @@ -202,8 +206,9 @@ sizeofFieldRef = idSizes.fieldIDSize; sizeofMethodRef = idSizes.methodIDSize; sizeofObjectRef = idSizes.objectIDSize; - sizeofClassRef = idSizes.referenceTypeIDSize; + sizeofClassRef = idSizes.referenceTypeIDSize; sizeofFrameRef = idSizes.frameIDSize; + sizeofModuleRef = idSizes.objectIDSize; /** * Set up requests needed by internal event handler. @@ -265,6 +270,12 @@ return System.identityHashCode(this); } + public List allModules() { + validateVM(); + List modules = retrieveAllModules(); + return Collections.unmodifiableList(modules); + } + public List classesByName(String className) { validateVM(); String signature = JNITypeParser.typeNameToSignature(className); @@ -929,6 +940,60 @@ return capabilitiesNew; } + private synchronized ModuleImpl addModule(long id) { + if (modulesByID == null) { + modulesByID = new HashMap(20); + } + ModuleImpl module = new ModuleImpl(vm, id); + modulesByID.put(id, module); + if ((vm.traceFlags & VirtualMachine.TRACE_MODULES) != 0) { + vm.printTrace("Caching new Module, Id=" + id); + } + return module; + } + + ModuleImpl getModule(long id) { + if ((vm.traceFlags & VirtualMachine.TRACE_MODULES) != 0) { + vm.printTrace("get module=" + id); + } + if (id == 0) { + return null; + } else { + ModuleImpl module = null; + synchronized (this) { + if (modulesByID != null) { + module = modulesByID.get(id); + } + if (module == null) { + module = addModule(id); + } + } + return module; + } + } + + private synchronized List retrieveAllModules() { + if ((vm.traceFlags & VirtualMachine.TRACE_MODULES) != 0) { + vm.printTrace(description() + "Retrieving all Modules"); + } + ModuleImpl[] reqModules; + try { + reqModules = JDWP.VirtualMachine.AllModules.process(vm).modules; + } catch (JDWPException exc) { + throw exc.toJDIException(); + } + ArrayList modules = new ArrayList(); + for (int i = 0; i < reqModules.length; i++) { + long moduleRef = reqModules[i].ref(); + Module module = getModule(moduleRef); + modules.add(module); + if ((vm.traceFlags & VirtualMachine.TRACE_MODULES) != 0) { + vm.printTrace("retrieving module[" + i + "] = " + moduleRef); + } + } + return modules; + } + private List retrieveClassesBySignature(String signature) { if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) { vm.printTrace("Retrieving matching ReferenceTypes, sig=" + signature); @@ -1361,9 +1426,13 @@ ClassObjectReferenceImpl classObjectMirror(long id) { return (ClassObjectReferenceImpl)objectMirror(id, - JDWP.Tag.CLASS_OBJECT); + JDWP.Tag.CLASS_OBJECT); } + ModuleImpl moduleMirror(long id) { + return getModule(id); + } + /* * Implementation of PathSearchingVirtualMachine */