Ejemplo n.º 1
0
        public VariableInfo[] EnumChildren(VariableReference parent, int threadId, int frameId, uint dwTimeout)
        {
            CSEnumChildren msg = new CSEnumChildren();

            msg.ThreadHashCode = threadId;
            msg.FrameIndex     = frameId;
            msg.Parent         = parent;
            SendEnumChildren(msg);

            bool aborted;
            var  res = AwaitRPCRequest <VariableInfo[]>(out aborted, (int)dwTimeout);

            if (aborted)
            {
                return new VariableInfo[] { VariableInfo.RequestTimeout }
            }
            ;
            return(res);
        }

        void SendEnumChildren(CSEnumChildren msg)
        {
            sendStream.Position = 0;
            bw.Write(msg.ThreadHashCode);
            bw.Write(msg.FrameIndex);
            WriteVariableReference(msg.Parent);
            socket.Send(DebugMessageType.CSEnumChildren, sendStream.GetBuffer(), (int)sendStream.Position);
        }

        void WriteVariableReference(VariableReference reference)
        {
            bw.Write(reference != null);
            if (reference != null)
            {
                bw.Write(reference.Address);

                bw.Write((byte)reference.Type);
                bw.Write(reference.Offset);
                bw.Write(reference.Name);
                WriteVariableReference(reference.Parent);
                if (reference.Parameters != null)
                {
                    bw.Write(reference.Parameters.Length);
                    foreach (var i in reference.Parameters)
                    {
                        WriteVariableReference(i);
                    }
                }
                else
                {
                    bw.Write(0);
                }
            }
        }
Ejemplo n.º 2
0
        public VariableInfo[] EnumChildren(VariableReference parent, int threadId, uint dwTimeout)
        {
            CSEnumChildren msg = new CSEnumChildren();

            msg.ThreadHashCode = threadId;
            msg.Parent         = parent;
            SendEnumChildren(msg);

            bool aborted;
            var  res = AwaitRPCRequest <VariableInfo[]>(out aborted, (int)dwTimeout);

            if (aborted)
            {
                return new VariableInfo[] { VariableInfo.RequestTimeout }
            }
            ;
            return(res);
        }

        void SendEnumChildren(CSEnumChildren msg)
        {
            sendStream.Position = 0;
            bw.Write(msg.ThreadHashCode);
            WriteVariableReference(msg.Parent);
            socket.Send(DebugMessageType.CSEnumChildren, sendStream.GetBuffer(), (int)sendStream.Position);
        }

        void WriteVariableReference(VariableReference reference)
        {
            bw.Write(reference != null);
            if (reference != null)
            {
                bw.Write(reference.Address);

                bw.Write((byte)reference.Type);
                bw.Write(reference.Offset);
                bw.Write(reference.Name);
                WriteVariableReference(reference.Parent);
                if (reference.Parameters != null)
                {
                    bw.Write(reference.Parameters.Length);
                    foreach (var i in reference.Parameters)
                    {
                        WriteVariableReference(i);
                    }
                }
                else
                {
                    bw.Write(0);
                }
            }
        }

        void OnReceiveSCBreakpointHit(SCBreakpointHit msg)
        {
            AD7PendingBreakPoint bp;
            AD7Thread            t, bpThread = null;

            if (breakpoints.TryGetValue(msg.BreakpointHashCode, out bp))
            {
                foreach (var i in msg.StackFrame)
                {
                    if (threads.TryGetValue(i.Key, out t))
                    {
                        t.StackFrames = i.Value;
                        if (i.Key == msg.ThreadHashCode)
                        {
                            bpThread = t;
                        }
                    }
                }
                if (bpThread != null)
                {
                    engine.Callback.BreakpointHit(bp, bpThread);
                }
            }
        }

        void OnReceiveSCStepComplete(SCStepComplete msg)
        {
            AD7Thread t, bpThread = null;

            foreach (var i in msg.StackFrame)
            {
                if (threads.TryGetValue(i.Key, out t))
                {
                    t.StackFrames = i.Value;
                    if (i.Key == msg.ThreadHashCode)
                    {
                        bpThread = t;
                    }
                }
            }
            if (bpThread != null)
            {
                engine.Callback.StepCompleted(bpThread);
            }
        }

        void OnReceiveSCThreadStarted(SCThreadStarted msg)
        {
            AD7Thread t = new AD7Thread(engine, msg.ThreadHashCode);

            threads[msg.ThreadHashCode] = t;
            engine.Callback.ThreadStarted(t);
        }

        void OnReceiveSCThreadEnded(SCThreadEnded msg)
        {
            AD7Thread t;

            if (threads.TryGetValue(msg.ThreadHashCode, out t))
            {
                engine.Callback.ThreadEnded(t);
                threads.Remove(msg.ThreadHashCode);
            }
        }
    }