public jvmtiError GetLineNumberTable(MethodId methodId, out LineNumberData[] lines) { lines = null; int entryCount; IntPtr table; jvmtiError error = RawInterface.GetLineNumberTable(this, (jmethodID)methodId, out entryCount, out table); if (error != jvmtiError.None) { return(error); } try { List <LineNumberData> lineData = new List <LineNumberData>(); unsafe { jvmtiLineNumberEntry *entryTable = (jvmtiLineNumberEntry *)table; for (int i = 0; i < entryCount; i++) { long lineCodeIndex = entryTable[i].StartLocation.Value; LineNumberData line = new LineNumberData(lineCodeIndex, entryTable[i].LineNumber); lineData.Add(line); } } lines = lineData.ToArray(); return(jvmtiError.None); } finally { Deallocate(table); } }
public jvmtiError GetLineNumberTable(JvmVirtualMachineRemoteHandle virtualMachine, JvmMethodRemoteHandle method, out JvmLineNumberEntry[] lineNumbers) { JavaVM machine = JavaVM.GetInstance(virtualMachine); List <JvmLineNumberEntry> lineNumbersList = new List <JvmLineNumberEntry>(); jvmtiError result = jvmtiError.Internal; machine.InvokeOnJvmThread( (environment) => { jvmtiInterface rawInterface = environment.RawInterface; IntPtr lineNumbersPtr = IntPtr.Zero; try { int entryCount; result = rawInterface.GetLineNumberTable(environment.Handle, (jmethodID)method, out entryCount, out lineNumbersPtr); unsafe { jvmtiLineNumberEntry *rawLineNumbers = (jvmtiLineNumberEntry *)lineNumbersPtr; for (int i = 0; i < entryCount; i++) { lineNumbersList.Add(new JvmLineNumberEntry(method, rawLineNumbers[i])); } } } finally { rawInterface.Deallocate(environment.Handle, lineNumbersPtr); } }); lineNumbers = lineNumbersList.ToArray(); return(result); }