private IEnumerable <CodeName> ExtractNames(CodeFrame codeFrame) { if (codeFrame.Symbols == null) { yield break; } var dr = new DebugReader(codeFrame.Symbols); if (dr.EnumerateVarSyms().Count() > 0) { foreach (var v in dr.FindVarSyms(Int32.MaxValue, dr.GetScopeSymByIndex(0))) { var flags = (ElaVariableFlags)v.Flags; if (!v.Name.StartsWith("$")) { var ln = dr.FindLineSym(v.Offset); yield return(new CodeName(v.Name, (Int32)flags, ln.Line, ln.Column)); } } } else { foreach (var v in codeFrame.GlobalScope.EnumerateNames()) { var sv = codeFrame.GlobalScope.GetVariable(v); if (!sv.VariableFlags.Set(ElaVariableFlags.Private) && !v.StartsWith("$")) { yield return(new CodeName(v, (Int32)sv.VariableFlags, 0, 0)); } } } }
internal void PrintSymTables(DebugReader gen) { var prev = false; if ((opt.ShowSymbols & SymTables.Lines) == SymTables.Lines) { Console.WriteLine("Lines:\r\n"); Console.Write(gen.PrintSymTables(SymTables.Lines)); prev = true; } if ((opt.ShowSymbols & SymTables.Scopes) == SymTables.Scopes) { Console.WriteLine((prev ? "\r\n" : String.Empty) + "Scopes:\r\n"); Console.Write(gen.PrintSymTables(SymTables.Scopes)); } if ((opt.ShowSymbols & SymTables.Vars) == SymTables.Vars) { Console.WriteLine((prev ? "\r\n" : String.Empty) + "Variables:\r\n"); Console.Write(gen.PrintSymTables(SymTables.Vars)); } if ((opt.ShowSymbols & SymTables.Functions) == SymTables.Functions) { Console.WriteLine((prev ? "\r\n" : String.Empty) + "Functions:\r\n"); Console.Write(gen.PrintSymTables(SymTables.Functions)); } }
private void ApplyCommandLineArguments() { //this.client.OnDebugOutput += new DebugOutputDel(this.DebugOutputHandler); //using (OutputLineReader lineRdr = new OutputLineReader(this.client)) using (DebugReader dbgRdr = new DebugReader(this.client)) { string dbgLine; //lineRdr.OnOutputLine += new LineReaderDeleg(this.DebugOutputHandler); if (this.imagePath != null) { this.symbols.SetImagePath(this.imagePath); } if (this.symbolsPath != null) { this.symbols.SetSymbolPath(this.symbolsPath); } if (this.dumpFile != null) { this.client.OpenDumpFile(this.dumpFile); while ((dbgLine = dbgRdr.ReadLine()) != null) { Console.Out.WriteLine(dbgLine); } } else { throw new DumpStkExcept(1, "No dump file specified"); } this.ctrl.EngineOptions |= EngineOptions.InitialBreak; this.client.ExceptionHit += new EventHandler <ExceptionEventArgs>(ExceptionHandler); if (this.ctrl.WaitForEvent() == false) { throw new DumpStkExcept(1, "WaitForEvent failed"); } while ((dbgLine = dbgRdr.ReadLine()) != null) { Console.Out.WriteLine(dbgLine); } } }
private IEnumerable <VarSym> LookVars(DebugReader dr, int offset, int scopeIndex) { var scope = dr.GetScopeSymByIndex(scopeIndex); var list = new List <VarSym>(); foreach (var vs in dr.FindVarSyms(offset, scope)) { list.Add(vs); } if (scope.Index != 0 && scope.ParentIndex != scope.Index) { list.AddRange(LookVars(dr, offset, scope.ParentIndex)); } return(list); }
public virtual string GetFunctionName() { var funName = DEF_NAME; if (vm != null) { var mod = vm.Assembly.GetModule(ModuleHandle); var syms = mod.Symbols; if (syms != null) { var dr = new DebugReader(syms); var fs = dr.GetFunSymByHandle(Handle); if (fs != null && fs.Name != null) { funName = fs.Name; } } else { foreach (var sv in mod.GlobalScope.Locals) { var v = vm.GetVariableByHandle(ModuleHandle, sv.Value.Address); if (v.TypeId == ElaMachine.FUN && ((ElaFunction)v.Ref).Handle == Handle) { funName = sv.Key; break; } } } } if (funName != DEF_NAME && Format.IsSymbolic(funName)) { funName = "(" + funName + ")"; } return(funName); }
private VarSym LookVar(DebugReader dr, int offset, int scopeIndex, string var) { var scope = dr.GetScopeSymByIndex(scopeIndex); foreach (var vs in dr.FindVarSyms(offset, scope)) { if (vs.Name == var) { return(vs); } } if (scope.Index != 0) { return(LookVar(dr, offset, scope.ParentIndex, var)); } else { return(null); } }
public CallStack BuildCallStack(int currentOffset, CodeFrame errModule, FileInfo moduleFile, Stack<StackPoint> callChain) { var syms = new DebugReader(errModule.Symbols); var frames = new List<CallFrame>(); var lp = syms.FindLineSym(currentOffset - 1); var retval = new CallStack( moduleFile, lp != null ? lp.Line : 0, lp != null ? lp.Column : 0, frames ); if (callChain == null || callChain.Count == 0) return retval; var mem = default(StackPoint); var first = true; var offset = 0; do { mem = callChain.Pop(); var mod = Assembly.GetModuleName(mem.ModuleHandle); syms = new DebugReader(Assembly.GetModule(mem.ModuleHandle).Symbols); offset = first ? currentOffset - 1 : mem.BreakAddress - 1; var glob = callChain.Count == 0 || offset < 0; var funSym = !glob ? syms.FindFunSym(offset) : null; var line = syms != null && offset > 0 ? syms.FindLineSym(offset) : null; frames.Add(new CallFrame(glob, mod, funSym != null ? funSym.Name != null ? funSym.Name : String.Format(FUNC_PARS, funSym.Parameters) : glob ? null : FUNC, offset, line)); first = false; } while (callChain.Count > 0 && offset > 0); return retval; }
private Location GetLocation(string name) { var sv = CodeFrame.GlobalScope.GetVariable(name); if (CodeFrame.Symbols != null) { var dr = new DebugReader(CodeFrame.Symbols); var sym = dr.FindVarSym(sv.VariableAddress, 0); if (sym != null) { var ln = dr.FindLineSym(sym.Offset); if (ln != null) { return(new Location(ln.Line, ln.Column)); } } } return(new Location(0, 0)); }
private VarSym GetNameInfo(int position, CodeDocument doc) { var word = sci.GetWordAt(position) ?? GetOperator(position, 0); var frame = doc != null ? doc.Unit : null; if (word != null && frame != null) { var dr = new DebugReader(((CompiledUnit)frame).CodeFrame.Symbols); var lineNum = sci.GetLineFromPosition(position); var colNum = sci.GetColumnFromPosition(position); var ln = dr.FindClosestLineSym(lineNum + 1, colNum + 1); var scope = default(ScopeSym); if (ln != null && (scope = (dr.FindScopeSym(lineNum + 1, colNum + 1) ?? dr.GetScopeSymByIndex(0))) != null) { return(LookVar(dr, ln.Offset, scope.Index, word)); } } return(null); }
public void DumpStack() { using (DebugReader dbgRdr = new DebugReader(this.client)) { uint count = 50; DebugStackTrace frames; Console.Out.WriteLine("First {0} frames of the call stack:", count); frames = this.ctrl.GetStackTrace(this.traceFrom[0], this.traceFrom[1], this.traceFrom[2], count); DebugSymbols sym = new DebugSymbols(this.client); foreach (DebugStackFrame f in frames) { string frameSym; ulong displace; sym.GetNameByOffset(f.InstructionOffset, out frameSym, out displace); } StackTraceOutput outputInfo = StackTraceOutput.SourceLine | StackTraceOutput.FrameAddresses | StackTraceOutput.ColumnNames | StackTraceOutput.FrameNumbers; this.ctrl.OutputStackTrace( OutputControl.ToAllClients, frames, outputInfo); string dbgLine; while ((dbgLine = dbgRdr.ReadLine()) != null) { Console.Out.WriteLine(dbgLine); } } }
public void DoComplete(int pos, CodeDocument doc) { if (doc == null) return; if (TestIfComments(pos, true) || TestIfComments(pos - 1, false)) return; if (sci.CurrentPosition > 0 && sci.CharAt(sci.CurrentPosition - 1) == '.') { ListModuleMembers(doc, pos - 2); return; } var names = default(List<AutocompleteSymbol>); if (doc.Unit != null) { var frame = ((CompiledUnit)doc.Unit).CodeFrame; var dr = new DebugReader(frame.Symbols); var col = sci.GetColumnFromPosition(sci.CurrentPosition); var ln = dr.FindClosestLineSym(sci.CurrentLine + 1, col + 1); var scope = col == 0 || col == 1 ? dr.GetScopeSymByIndex(0) : dr.FindScopeSym(sci.CurrentLine + 1, col + 1); if (scope == null) scope = dr.GetScopeSymByIndex(0); if (scope != null) { var vars = LookVars(dr, ln != null ? ln.Offset : scope.EndOffset, scope.Index); names = vars .Where(v => v.Name[0] != '$') .Select(v => { var f = (ElaVariableFlags)v.Flags; return new AutocompleteSymbol(v.Name, f.Set(ElaVariableFlags.Module) ? AutocompleteSymbolType.Module : f.Set(ElaVariableFlags.TypeFun) ? AutocompleteSymbolType.Type : f.Set(ElaVariableFlags.ClassFun) ? AutocompleteSymbolType.Member : AutocompleteSymbolType.Variable); }) .ToList(); } } var line = sci.GetLine(sci.CurrentLine).Text.Trim('\r', '\n', '\0'); var tl = line.Trim(); var keywords = new List<AutocompleteSymbol>(); keywords.Add(Snippet("if")); if (tl.Length == 0) { keywords.Add(Snippet("open")); keywords.Add(Snippet("let")); if (line.Length > 0) { keywords.Add(Snippet("et")); keywords.Add(Snippet("where")); } } else if (tl.EndsWith("=")) keywords.Add(Snippet("let")); else if (tl.EndsWith("let")) { keywords.Add(Snippet("private")); keywords.Add(Snippet("inline")); } if (names != null) keywords.AddRange(names); app.GetService<IAutocompleteService>().ShowAutocomplete(keywords); }
private VarSym LookVar(DebugReader dr, int offset, int scopeIndex, string var) { var scope = dr.GetScopeSymByIndex(scopeIndex); foreach (var vs in dr.FindVarSyms(offset, scope)) if (vs.Name == var) return vs; if (scope.Index != 0) return LookVar(dr, offset, scope.ParentIndex, var); else return null; }
private IEnumerable<VarSym> LookVars(DebugReader dr, int offset, int scopeIndex) { var scope = dr.GetScopeSymByIndex(scopeIndex); var list = new List<VarSym>(); foreach (var vs in dr.FindVarSyms(offset, scope)) list.Add(vs); if (scope.Index != 0 && scope.ParentIndex != scope.Index) list.AddRange(LookVars(dr, offset, scope.ParentIndex)); return list; }
public void DoComplete(int pos, CodeDocument doc) { if (doc == null) { return; } if (TestIfComments(pos, true) || TestIfComments(pos - 1, false)) { return; } if (sci.CurrentPosition > 0 && sci.CharAt(sci.CurrentPosition - 1) == '.') { ListModuleMembers(doc, pos - 2); return; } var names = default(List <AutocompleteSymbol>); if (doc.Unit != null) { var frame = ((CompiledUnit)doc.Unit).CodeFrame; var dr = new DebugReader(frame.Symbols); var col = sci.GetColumnFromPosition(sci.CurrentPosition); var ln = dr.FindClosestLineSym(sci.CurrentLine + 1, col + 1); var scope = col == 0 || col == 1 ? dr.GetScopeSymByIndex(0) : dr.FindScopeSym(sci.CurrentLine + 1, col + 1); if (scope == null) { scope = dr.GetScopeSymByIndex(0); } if (scope != null) { var vars = LookVars(dr, ln != null ? ln.Offset : scope.EndOffset, scope.Index); names = vars .Where(v => v.Name[0] != '$') .Select(v => { var f = (ElaVariableFlags)v.Flags; return(new AutocompleteSymbol(v.Name, f.Set(ElaVariableFlags.Module) ? AutocompleteSymbolType.Module : f.Set(ElaVariableFlags.TypeFun) ? AutocompleteSymbolType.Type : f.Set(ElaVariableFlags.ClassFun) ? AutocompleteSymbolType.Member : AutocompleteSymbolType.Variable)); }) .ToList(); } } var line = sci.GetLine(sci.CurrentLine).Text.Trim('\r', '\n', '\0'); var tl = line.Trim(); var keywords = new List <AutocompleteSymbol>(); keywords.Add(Snippet("if")); if (tl.StartsWith("if") && tl.Length > 2) { keywords.Add(Snippet("then")); } if (tl.Length == 0) { keywords.Add(Snippet("open")); keywords.Add(Snippet("let")); if (line.Length > 0) { keywords.Add(Snippet("where")); } } else if (tl.EndsWith("=")) { keywords.Add(Snippet("let")); } else { keywords.Add(Snippet("else")); } if (names != null) { keywords.AddRange(names); } app.GetService <IAutocompleteService>().ShowAutocomplete(keywords); }
private VarSym GetNameInfo(int position, CodeDocument doc) { var word = sci.GetWordAt(position) ?? GetOperator(position, 0); var frame = doc != null ? doc.Unit : null; if (word != null && frame != null) { var dr = new DebugReader(((CompiledUnit)frame).CodeFrame.Symbols); var lineNum = sci.GetLineFromPosition(position); var colNum = sci.GetColumnFromPosition(position); var ln = dr.FindClosestLineSym(lineNum + 1, colNum + 1); var scope = default(ScopeSym); if (ln != null && (scope = (dr.FindScopeSym(lineNum + 1, colNum + 1) ?? dr.GetScopeSymByIndex(0))) != null) return LookVar(dr, ln.Offset, scope.Index, word); } return null; }
public int SearchBlockIndex(byte[] input, int inputLen) { SpanReader sr = new SpanReader(BlockBuffer); sr.Position = 2; int indexEntryCount = sr.ReadInt16(); int realEntryCount = (((indexEntryCount - 1) / 2) - 1); ushort blockSize = ParentVolume.GetBlockSize(); if (indexEntryCount == 1) { // return the first sr.Position = blockSize - 4; return(sr.ReadInt32()); } // First sr.Position = blockSize - 0x08; short entryOffset = sr.ReadInt16(); short entryLength = sr.ReadInt16(); sr.Position = entryOffset; byte[] entryIndexer = sr.ReadBytes(entryLength); int diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff < 0) { // return the first block index sr.Position = (blockSize - 0x08) + 4; return(sr.ReadInt32()); } // Last sr.Position = blockSize - (realEntryCount * 0x08); entryOffset = sr.ReadInt16(); entryLength = sr.ReadInt16(); sr.Position = entryOffset; entryIndexer = sr.ReadBytes(entryLength); diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff > 0) { // return the last block index sr.Position = blockSize - (realEntryCount * 0x08) + 4; return(sr.ReadInt32()); } int min = 0; int max = realEntryCount; int mid = (min + max) / 2; while (min < max) { if (max - min < 8) { mid = min; int baseOffset = blockSize - (mid * 0x08); int entryitorOffset = baseOffset; if (max < min) { return(-1); } while (min <= max) { entryitorOffset -= 0x08; sr.Position = entryitorOffset; entryOffset = sr.ReadInt16(); int entryIndexOffset = (mid * 0x08 - blockSize) + baseOffset + entryitorOffset; sr.Position = entryIndexOffset + 2; entryLength = sr.ReadInt16(); sr.Position = entryOffset; entryIndexer = sr.ReadBytes(entryLength); diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff == 0) { sr.Position = entryIndexOffset - 4; return(sr.ReadInt32()); } else if (diff < 0) { sr.Position = entryIndexOffset + 4; return(sr.ReadInt32()); } min++; } return(-1); } sr.Position = blockSize - (mid * 0x08); entryOffset = sr.ReadInt16(); entryLength = sr.ReadInt16(); sr.Position = entryOffset; entryIndexer = sr.ReadBytes(entryLength); diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff == 0) { // return the matching index sr.Position = blockSize - (mid * 0x08) + 4; return(sr.ReadInt32()); } else if (diff > 0) { min = mid; } else { max = mid; } mid = (min + max) / 2; } throw new Exception("Failed to bsearch for the block entry."); }
public bool SearchEntry(byte[] input, int inputLen, out int result) { result = 0; SpanReader sr = new SpanReader(BlockBuffer); sr.Position = 2; int entryCount = sr.ReadInt16() / 2; ushort blockSize = ParentVolume.GetBlockSize(); // Check first sr.Position = blockSize - 0x08; short entryOffset = sr.ReadInt16(); short entryLength = sr.ReadInt16(); sr.Position = entryOffset; byte[] entryIndexer = sr.ReadBytes(entryLength); int diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff < 0) { result = 0; return(false); } // Check last sr.Position = blockSize - (entryCount * 0x08); entryOffset = sr.ReadInt16(); entryLength = sr.ReadInt16(); sr.Position = entryOffset; entryIndexer = sr.ReadBytes(entryLength); diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff > 0) { result = -entryCount; return(false); } int min = 0; int max = entryCount; int mid = (min + max) / 2; while (min < max) { if (max - min < 8) { mid = min; int baseOffset = blockSize - (mid * 0x08); int entryitorOffset = baseOffset; if (max < min) { return(false); } while (min <= max) { entryitorOffset -= 0x08; sr.Position = entryitorOffset; entryOffset = sr.ReadInt16(); sr.Position = (mid * 0x08 - blockSize) + baseOffset + entryitorOffset; sr.Position += 2; entryLength = sr.ReadInt16(); sr.Position = entryOffset; entryIndexer = sr.ReadBytes(entryLength); diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff < 1) { result = min; return(diff == 0); } min++; } return(false); } sr.Position = blockSize - (mid * 0x08); entryOffset = sr.ReadInt16(); entryLength = sr.ReadInt16(); sr.Position = entryOffset; entryIndexer = sr.ReadBytes(entryLength); diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength); if (diff == 0) { result = mid - 1; return(true); } else if (diff > 0) { min = mid; } else { max = mid; } mid = (min + max) / 2; } throw new Exception("Failed to bsearch the entry."); }
private IEnumerable<CodeName> ExtractNames(CodeFrame codeFrame) { if (codeFrame.Symbols == null) yield break; var dr = new DebugReader(codeFrame.Symbols); if (dr.EnumerateVarSyms().Count() > 0) { foreach (var v in dr.FindVarSyms(Int32.MaxValue, dr.GetScopeSymByIndex(0))) { var flags = (ElaVariableFlags)v.Flags; if (!v.Name.StartsWith("$")) { var ln = dr.FindLineSym(v.Offset); yield return new CodeName(v.Name, (Int32)flags, ln.Line, ln.Column); } } } else { foreach (var v in codeFrame.GlobalScope.EnumerateNames()) { var sv = codeFrame.GlobalScope.GetVariable(v); if (!sv.VariableFlags.Set(ElaVariableFlags.Private) && !v.StartsWith("$")) yield return new CodeName(v, (Int32)sv.VariableFlags, 0, 0); } } }
private static int Execute(CodeAssembly asm, bool interactive) { var mod = asm.GetRootModule(); if (opt.ShowEil) { var gen = new EilGenerator(mod); Console.WriteLine("EIL ({0}-{1}):", lastOffset, mod.Ops.Count - 1); Console.Write(gen.Generate(lastOffset)); lastOffset = mod.Ops.Count; } else if (opt.ShowSymbols != SymTables.None) { var gen = new DebugReader(mod.Symbols); helper.PrintSymTables(gen); lastOffset = mod.Ops.Count; } else { try { if (vm == null) vm = new ElaMachine(asm); else { vm.RefreshState(); vm.Recover(); } if (opt.ShowTime && !interactive) Warmup(asm); //GIT var os = lastOffset; lastOffset = mod.Ops.Count; var sw = new Stopwatch(); sw.Start(); var exer = vm.Run(os); sw.Stop(); if (opt.ShowTime && !interactive) Console.WriteLine("Execution time: {0}", sw.Elapsed); if (exer.ReturnValue.TypeCode != ElaTypeCode.None && exer.ReturnValue.TypeCode != ElaTypeCode.Unit) Console.WriteLine(vm.PrintValue(exer.ReturnValue)); } catch (ElaException ex) { helper.PrintError(ex.ToString()); return R_ERR; } } return R_OK; }
static void Main(string[] args) { ParseArguments(args); if (PdbFilePath == null) { Console.Error.WriteLine(@"PDBSharp.Dumper Usage: PDBSharp.Dumper <options> <file.pdb> [-dump] Save individual PDB Streams to files [-dump-modules] Verbose output for DBI Modules [-dump-leaves] Verbose output for TPI Leaves [-dump-syms] Verbose output for DBI Symbols [-print] Extract and print type definitions"); Environment.Exit(1); } #if PERF Console.WriteLine("Starting..."); Stopwatch sw = new Stopwatch(); sw.Start(); #endif PDBFile pdb = PDBFile.Open(PdbFilePath); IServiceContainer sc = pdb.Services; DBIReader dbi = sc.GetService <DBIReader>(); TPIReader tpi = sc.GetService <TPIReader>(); StreamTableReader streamTable = sc.GetService <StreamTableReader>(); if (OptPrintDecls) { var tree = new GraphBuilder(sc).Build(); CodeWriter cw = new CodeWriter(tree); #if !PERF cw.Write(Console.Out); #endif } if (OptDumpLeaves) { pdb.OnTpiInit += Pdb_OnTpiInit; } if (OptDumpModules || OptDumpSymbols) { pdb.OnDbiInit += Pdb_OnDbiInit; } if (OptDumpStreams) { DirectoryInfo dumpDir = Directory.CreateDirectory(Path.GetFileNameWithoutExtension(PdbFilePath)); for (int i = 1; i < streamTable.NumStreams; i++) { string dumpPath = Path.Combine(dumpDir.ToString(), $"stream{i}.bin"); byte[] stream = streamTable.GetStream(i); File.WriteAllBytes(dumpPath, stream); } } /* * foreach(var type in ctx.TpiReader.Types) { * //Console.WriteLine(type); * }*/ TPIHashReader tpiHash = sc.GetService <TPIHashReader>(); UdtNameTableReader udtNameTable = sc.GetService <UdtNameTableReader>(); TypeResolver resolver = sc.GetService <TypeResolver>(); if (tpiHash != null && udtNameTable != null) { foreach (var pair in tpiHash.NameIndexToTypeIndex) { string name = udtNameTable.GetString(pair.Key); ILeafContainer leaf = resolver.GetTypeByIndex(pair.Value); #if !PERF Console.WriteLine($"=> {name} [NI={pair.Key}] [TI={pair.Value}]"); Console.WriteLine(leaf.Data.GetType().Name); #endif } } foreach (var contrib in dbi.SectionContribs.SectionContribs) { #if !PERF ObjectDumper.Dump(contrib); #endif } DebugReader debug = dbi.DebugInfo; if (debug != null && debug.FPO != null) { foreach (var frame in debug.FPO.Frames) { #if !PERF ObjectDumper.Dump(frame); #endif } } foreach (var container in dbi.Modules) { #if !PERF Console.WriteLine($"[MODULE => {container.Info.ModuleName}]"); Console.WriteLine($"[OBJECT => {container.Info.ObjectFileName}]"); Console.WriteLine($"[SRC => {container.Info.SourceFileName}]"); if (container.Module != null) { Console.WriteLine($"[TYPE => {container.Module.GetType().Name}"); } Console.WriteLine(); #endif IModule mod = container.Module; if (mod != null) { foreach (var sym in mod.Symbols) { #if !PERF Console.WriteLine(sym); #endif } } } foreach (var type in tpi.Types) { #if !PERF Console.WriteLine(type); #endif } #if !PERF Console.WriteLine("Press Enter to continue..."); Console.ReadLine(); #else sw.Stop(); Console.WriteLine($"Finished in {sw.Elapsed.TotalSeconds} seconds"); #endif }
private static int Execute(CodeAssembly asm, bool interactive) { var mod = asm.GetRootModule(); if (opt.ShowEil) { var gen = new EilGenerator(mod); Console.WriteLine("EIL ({0}-{1}):", lastOffset, mod.Ops.Count - 1); Console.Write(gen.Generate(lastOffset)); lastOffset = mod.Ops.Count; } else if (opt.ShowSymbols != SymTables.None) { var gen = new DebugReader(mod.Symbols); helper.PrintSymTables(gen); lastOffset = mod.Ops.Count; } else { try { if (vm == null) { vm = new ElaMachine(asm); vm.AddTracePointListener(new TracePointListener()); } else { vm.RefreshState(); vm.Recover(); } if (opt.ShowTime != 0 && !interactive) { Warmup(asm); //GIT } var os = lastOffset; lastOffset = mod.Ops.Count; var sw = new Stopwatch(); sw.Start(); var exer = default(ExecutionResult); if (opt.ShowTime != 0) { for (var i = 0; i < opt.ShowTime; i++) { exer = vm.Run(os); } sw.Stop(); } else { exer = vm.Run(os); } if (opt.ShowTime != 0 && !interactive) { Console.WriteLine("Executed: {0} time(s). Execution time: {1}", opt.ShowTime, sw.Elapsed); } if (exer.ReturnValue.TypeCode != ElaTypeCode.None && exer.ReturnValue.TypeCode != ElaTypeCode.Unit) { Console.WriteLine(vm.PrintValue(exer.ReturnValue)); } } catch (ElaException ex) { helper.PrintError(ex.ToString()); return(R_ERR); } } return(R_OK); }
private Location GetLocation(string name) { var sv = CodeFrame.GlobalScope.GetVariable(name); if (CodeFrame.Symbols != null) { var dr = new DebugReader(CodeFrame.Symbols); var sym = dr.FindVarSym(sv.VariableAddress, 0); if (sym != null) { var ln = dr.FindLineSym(sym.Offset); if (ln != null) return new Location(ln.Line, ln.Column); } } return new Location(0, 0); }