예제 #1
0
		public void TryUpdateStackFrameInfo()
		{
			if (needsStackFrameInfoUpdate || ctxt == null) {
				string file;
				ulong eip;
				CodeLocation loc;

				BacktraceHelper.GetCurrentStackFrameInfo (out file, out eip, out loc);
				currentStackFrameSource = file;
				currentInstruction = eip;
				currentSourceLocation = loc;

				if (needsStackFrameInfoUpdate = string.IsNullOrWhiteSpace(file))
					return;

				needsStackFrameInfoUpdate |= loc.IsEmpty;

				var mod = GlobalParseCache.GetModule(file);
				if (ctxt == null)
				{
					var doc = Ide.IdeApp.Workbench.GetDocument(file);

					if (doc != null)
						ctxt = ResolutionContext.Create(MonoDevelop.D.Resolver.DResolverWrapper.CreateEditorData(doc), false);
					
					SymbolProvider = new DebugSymbolValueProvider(this, ctxt);

					if (doc == null)
						return;
				}

				if (SymbolProvider.ResolutionContext == null)
					SymbolProvider = new DebugSymbolValueProvider(this, ctxt);

				SymbolProvider.ResetCache();

				if (mod == null) {
					if (ctxt.CurrentContext != null)
						ctxt.CurrentContext.Set(loc);
				} else {
					var bn = D_Parser.Resolver.TypeResolution.DResolver.SearchBlockAt (mod, loc);
					if (ctxt.CurrentContext == null)
						ctxt.Push(bn, loc);
					else
						ctxt.CurrentContext.Set(bn, loc);
				}
			}
		}
예제 #2
0
        public void TryUpdateStackFrameInfo()
        {
            if (needsStackFrameInfoUpdate || ctxt == null)
            {
                string       file;
                ulong        eip;
                CodeLocation loc;

                BacktraceHelper.GetCurrentStackFrameInfo(out file, out eip, out loc);
                currentStackFrameSource = file;
                currentInstruction      = eip;
                currentSourceLocation   = loc;

                if (needsStackFrameInfoUpdate = string.IsNullOrWhiteSpace(file))
                {
                    return;
                }

                needsStackFrameInfoUpdate |= loc.IsEmpty;

                var mod = GlobalParseCache.GetModule(file);
                if (ctxt == null)
                {
                    var doc = Ide.IdeApp.Workbench.GetDocument(file);

                    if (doc != null)
                    {
                        ctxt = ResolutionContext.Create(MonoDevelop.D.Resolver.DResolverWrapper.CreateEditorData(doc), false);
                    }

                    SymbolProvider = new DebugSymbolValueProvider(this, ctxt);

                    if (doc == null)
                    {
                        return;
                    }
                }

                if (SymbolProvider.ResolutionContext == null)
                {
                    SymbolProvider = new DebugSymbolValueProvider(this, ctxt);
                }

                SymbolProvider.ResetCache();

                if (mod == null)
                {
                    if (ctxt.CurrentContext != null)
                    {
                        ctxt.CurrentContext.Set(loc);
                    }
                }
                else
                {
                    var bn = D_Parser.Resolver.TypeResolution.DResolver.SearchBlockAt(mod, loc);
                    if (ctxt.CurrentContext == null)
                    {
                        ctxt.Push(bn, loc);
                    }
                    else
                    {
                        ctxt.CurrentContext.Set(bn, loc);
                    }
                }
            }
        }