Browse Source

* x86_64 Win64 callback implementation: fix building the argument array if the result is passed as a parameter

Sven/Sarah Barth 3 years ago
parent
commit
bc46d8f33a
1 changed files with 5 additions and 3 deletions
  1. 5 3
      packages/rtl-objpas/src/x86_64/invoke.inc

+ 5 - 3
packages/rtl-objpas/src/x86_64/invoke.inc

@@ -422,7 +422,7 @@ type
 function TSystemFunctionCallback.Handler(aStack, aFP: Pointer): PtrUInt;
 function TSystemFunctionCallback.Handler(aStack, aFP: Pointer): PtrUInt;
 var
 var
   args: specialize TArray<Pointer>;
   args: specialize TArray<Pointer>;
-  i, len: SizeInt;
+  i, len, argidx: SizeInt;
   val: PPtrUInt;
   val: PPtrUInt;
   resptr: Pointer;
   resptr: Pointer;
 begin
 begin
@@ -430,6 +430,7 @@ begin
   if fResultInParam then
   if fResultInParam then
     Dec(len);
     Dec(len);
   SetLength(args, len);
   SetLength(args, len);
+  argidx := 0;
   for i := 0 to High(fArgInfos) do begin
   for i := 0 to High(fArgInfos) do begin
     if i = fResultIdx then
     if i = fResultIdx then
       Continue;
       Continue;
@@ -441,9 +442,10 @@ begin
         val := @PPtrUInt(aFP)[fArgInfos[i].Offset];
         val := @PPtrUInt(aFP)[fArgInfos[i].Offset];
     end;
     end;
     if fArgInfos[i].Deref then
     if fArgInfos[i].Deref then
-      args[i] := PPtrUInt(val^)
+      args[argidx] := PPtrUInt(val^)
     else
     else
-      args[i] := val;
+      args[argidx] := val;
+    Inc(argidx);
   end;
   end;
 
 
   if fResultInParam then begin
   if fResultInParam then begin