ソースを参照

Even more cleanup.

Martijn Laan 10 ヶ月 前
コミット
485ab27831
1 ファイル変更48 行追加38 行削除
  1. 48 38
      Projects/Src/Setup.ScriptFunc.pas

+ 48 - 38
Projects/Src/Setup.ScriptFunc.pas

@@ -119,36 +119,44 @@ end;
 type
   TPSStackHelper = class helper for TPSStack
   private
-    function GetArray(const ItemNo: Longint; out N: Integer): TPSVariantIFC;
-    function SetArray(const ItemNo: Longint; const N: Integer): TPSVariantIFC; overload;
+    function GetArray(const ItemNo, FieldNo: Longint; out N: Integer): TPSVariantIFC;
+    function SetArray(const ItemNo, FieldNo: Longint; const N: Integer): TPSVariantIFC; overload;
   public
     type
       TArrayOfInteger = array of Integer;
       TArrayOfString = array of String;
-    function GetIntArray(const ItemNo: Longint): TArrayOfInteger;
+    function GetIntArray(const ItemNo: Longint; const FieldNo: Longint = -1): TArrayOfInteger;
     function GetProc(const ItemNo: Longint; const Exec: TPSExec): TMethod;
-    function GetStringArray(const ItemNo: Longint): TArrayOfString;
-    procedure SetArray(const ItemNo: Longint; const Data: TArray<String>); overload;
+    function GetStringArray(const ItemNo: Longint; const FieldNo: Longint = -1): TArrayOfString;
+    procedure SetArray(const ItemNo: Longint; const Data: TArray<String>; const FieldNo: Longint = -1); overload;
+    procedure SetArray(const ItemNo: Longint; const Data: TStrings; const FieldNo: Longint = -1); overload;
+    procedure SetInt(const ItemNo: Longint; const Data: Integer; const FieldNo: Longint = -1);
   end;
 
-function TPSStackHelper.GetArray(const ItemNo: Longint;
+function TPSStackHelper.GetArray(const ItemNo, FieldNo: Longint;
   out N: Integer): TPSVariantIFC;
 begin
-  Result := NewTPSVariantIFC(Items[ItemNo], True);
+  if FieldNo >= 0 then
+    Result := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo)
+  else
+    Result := NewTPSVariantIFC(Items[ItemNo], True);
   N := PSDynArrayGetLength(Pointer(Result.Dta^), Result.aType);
 end;
 
-function TPSStackHelper.SetArray(const ItemNo: Longint;
+function TPSStackHelper.SetArray(const ItemNo, FieldNo: Longint;
   const N: Integer): TPSVariantIFC;
 begin
-  Result := NewTPSVariantIFC(Items[ItemNo], True);
+  if FieldNo >= 0 then
+    Result := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo)
+  else
+    Result := NewTPSVariantIFC(Items[ItemNo], True);
   PSDynArraySetLength(Pointer(Result.Dta^), Result.aType, N);
 end;
 
-function TPSStackHelper.GetIntArray(const ItemNo: Longint): TArrayOfInteger;
+function TPSStackHelper.GetIntArray(const ItemNo, FieldNo: Longint): TArrayOfInteger;
 begin
   var N: Integer;
-  var Arr := GetArray(ItemNo, N);
+  var Arr := GetArray(ItemNo, FieldNo, N);
   SetLength(Result, N);
   for var I := 0 to N-1 do
     Result[I] := VNGetInt(PSGetArrayField(Arr, I));
@@ -161,23 +169,42 @@ begin
   Result := Exec.GetProcAsMethod(P.ProcNo);
 end;
 
-function TPSStackHelper.GetStringArray(const ItemNo: Longint): TArrayOfString;
+function TPSStackHelper.GetStringArray(const ItemNo, FieldNo: Longint): TArrayOfString;
 begin
   var N: Integer;
-  var Arr := GetArray(ItemNo, N);
+  var Arr := GetArray(ItemNo, FieldNo, N);
   SetLength(Result, N);
   for var I := 0 to N-1 do
     Result[I] := VNGetString(PSGetArrayField(Arr, I));
 end;
 
-procedure TPSStackHelper.SetArray(const ItemNo: Longint; const Data: TArray<String>);
+procedure TPSStackHelper.SetArray(const ItemNo: Longint; const Data: TArray<String>; const FieldNo: Longint);
 begin
   var N := System.Length(Data);
-  var Arr := SetArray(ItemNo, N);
+  var Arr := SetArray(ItemNo, FieldNo, N);
+  for var I := 0 to N-1 do
+    VNSetString(PSGetArrayField(Arr, I), Data[I]);
+end;
+
+procedure TPSStackHelper.SetArray(const ItemNo: Longint; const Data: TStrings; const FieldNo: Longint);
+begin
+  var N := Data.Count;
+  var Arr := SetArray(ItemNo, FieldNo, N);
   for var I := 0 to N-1 do
     VNSetString(PSGetArrayField(Arr, I), Data[I]);
 end;
 
+procedure TPSStackHelper.SetInt(const ItemNo: Longint; const Data: Integer;
+  const FieldNo: Longint);
+begin
+  if FieldNo = -1 then
+    inherited SetInt(ItemNo, Data)
+  else begin
+    var PSVariantIFC := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo);
+    VNSetInt(PSVariantIFC, Data);
+  end;
+end;
+
 {---}
 
 function ScriptDlgProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
@@ -874,27 +901,6 @@ begin
   OnLog(S, Error, FirstLine);
 end;
 
-procedure ExecAndCaptureFinalize(StackData: Pointer; const OutputReader: TCreateProcessOutputReader);
-begin
-  { StdOut - 0 }
-  var Item := NewTPSVariantRecordIFC(StackData, 0);
-  var List := OutputReader.CaptureOutList;
-  PSDynArraySetLength(Pointer(Item.Dta^), Item.aType, List.Count);
-  for var I := 0 to List.Count - 1 do
-    VNSetString(PSGetArrayField(Item, I), List[I]);
-
-  { StdErr - 1 }
-  Item := NewTPSVariantRecordIFC(StackData, 1);
-  List := OutputReader.CaptureErrList;
-  PSDynArraySetLength(Pointer(Item.Dta^), Item.aType, List.Count);
-  for var I := 0 to List.Count - 1 do
-    VNSetString(PSGetArrayField(Item, I), List[I]);
-
-  { Error - 2 }
-  Item := NewTPSVariantRecordIFC(StackData, 2);
-  VNSetInt(Item, OutputReader.CaptureError.ToInteger);
-end;
-
 function InstFuncProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
 
   function GetMD5OfFile(const DisableFsRedir: Boolean; const Filename: String): TMD5Digest;
@@ -1074,8 +1080,12 @@ begin
           WindowDisabler.Free;
         end;
         Stack.SetInt(PStart-6, ResultCode);
-        if Proc.Name = 'EXECANDCAPTUREOUTPUT' then
-          ExecAndCaptureFinalize(Stack[PStart-7], OutputReader);
+        if Proc.Name = 'EXECANDCAPTUREOUTPUT' then begin
+          { Set the three TExecOutput fields }
+          Stack.SetArray(PStart-7, OutputReader.CaptureOutList, 0);
+          Stack.SetArray(PStart-7, OutputReader.CaptureErrList, 1);
+          Stack.SetInt(PStart-7, OutputReader.CaptureError.ToInteger, 2);
+        end;
       end else begin
         Stack.SetBool(PStart, False);
         Stack.SetInt(PStart-6, ERROR_ACCESS_DENIED);