我正在为DWScript编写一个IDE,并使用调试器逐步完成代码。我现在希望添加一个'局部变量'的显示(即范围内的变量)。有人能指点我这样做的方法吗?我可以获得所有符号的列表,但不了解如何获得当前范围的一部分。 感谢。
答案 0 :(得分:9)
将 IdwsProgramExecution 投射到 TdwsProgramExecution ,您将获得对“ CurrentProg ”属性的访问权限 TdwsProgram 是 TdwsMainProgram (如果你在主要的话)或 TdwsProcedure (如果你在proc / func /方法中)。那些将具有 Table 属性,该属性列出了本地符号,这是最直接的范围。 Table 将包含一个或多个 Parents ,它引用父作用域(按层次结构,就源代码范围而言)。
如果在 TdwsProcedure 中,您可能还想查看其 FuncSymbol 属性,该属性将包含一个参数表(如果您想直接隔离参数,则非常有用)来自本地其他地方)
答案 1 :(得分:2)
对于阅读此问题的任何其他人,我将展示一些有关获取符号值的补充信息。符号是由上面的Eric描述的,但很难弄清楚如何获得符号的实际值。下面的代码是每次调用时都使用局部变量填充TMemo(memLocalVariables)的过程。缺少某些功能,例如变量值的整齐格式化以及对调用参数的访问。我从调试器'dsDebugSuspended'状态调用它。不太直观的位是对堆栈上的符号数据的访问以及堆栈基指针的使用。学习编译器如何工作的好方法!但是,也许在某些我找不到的实用功能......?埃里克?
procedure DrawLocalVariables;
var
ProgramExecution : TdwsProgramExecution;
I : integer;
Sym : TSymbol;
V : variant;
Adr : integer;
SymbolTable : TSymbolTable;
begin
memLocalVariables.Lines.Clear;
ProgramExecution := TdwsProgramExecution( dwsDebugger1.Execution );
SymbolTable := ProgramExecution.CurrentProg.Table;
For I := 0 to SymbolTable.Count-1 do
begin
Sym := SymbolTable[I];
if Sym is TDataSymbol then
begin
Adr := TDataSymbol( Sym).StackAddr + ProgramExecution.Stack.BasePointer;
ProgramExecution.Stack.ReadValue( Adr, V );
memLocalVariables.Lines.Add( Format( '%s = %s', [ Sym.Name, VarToStr(V) ] ));
end;
end;
end;