我正在使用PascalScript innosetup安装程序,但看不到以下块的控制流向何处。
function Foo(): String;
begin
Result := 'foo';
RaiseException('...');
end;
procedure Test();
var
Z : String;
begin
Z := '';
try
Z := Foo();
except
Log(Z);
end
end;
我的安装程序似乎指示
Z
是通过Result
函数的Foo
设置的。我对“大多数”编程语言中的异常的了解告诉我,在发生异常的情况下不应发生赋值Z := Foo()
。Foo
函数升起时,是否仍应将Z
分配给? 最佳答案
它可能通过引用作为隐式第一个参数来处理结果值。但这可能会发生。可以将其视为某些代码生成/优化的合法方法,因为它是处理返回值的相当普遍的方式。
但是,在对象Pascal中确切定义的在测试Delphi所做的事情之外是模糊的领域,因为只有x86和x86_64实现。并且Delphi将以eax返回该值,因此,如果遵循该逻辑,则这是非法的。
稍后添加:
我用结构化类型测试了Delphi,当它传递引用时,它会在堆栈上创建一个副本来传递它。
但是,这可能很难优化具有结构化类型的代码,但是如果需要,可以使用修饰符/属性声明返回类型const来解决此问题。