我正在使用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来解决此问题。

10-07 19:09
查看更多