Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
        }