Skip to content

Commit 55bc997

Browse files
committed
1 parent a63eb17 commit 55bc997

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

Source/VarPyth.pas

+23-15
Original file line numberDiff line numberDiff line change
@@ -1271,9 +1271,11 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData;
12711271
LNamedArgStart : Integer; //arg position of 1st named argument (if any)
12721272
I : integer;
12731273
begin
1274+
SetLength(fNamedParams, CallDesc^.NamedArgCount);
1275+
if CallDesc^.NamedArgCount = 0 then
1276+
Exit;
12741277
LNamePtr := PAnsiChar(@CallDesc^.ArgTypes[CallDesc^.ArgCount]);
12751278
LNamedArgStart := CallDesc^.ArgCount - CallDesc^.NamedArgCount;
1276-
SetLength(fNamedParams, CallDesc^.NamedArgCount);
12771279
// Skip function Name
12781280
for I := 0 to CallDesc^.NamedArgCount - 1 do begin
12791281
LNamePtr := LNamePtr + Succ(Length(LNamePtr));
@@ -1285,25 +1287,25 @@ procedure TPythonVariantType.DispInvoke(Dest: PVarData;
12851287
Var
12861288
NewCallDesc : TCallDesc;
12871289
begin
1288-
if CallDesc^.NamedArgCount > 0 then GetNamedParams;
1289-
try
1290-
if (CallDesc^.CallType = CPropertyGet) and (CallDesc^.ArgCount = 1) then begin
1290+
if CallDesc^.CallType = CDoMethod then
1291+
GetNamedParams; // fNamedParams will be cleared in EvalPython
1292+
if (CallDesc^.CallType = CPropertyGet) and (CallDesc^.ArgCount = 1) then
1293+
begin
12911294
NewCallDesc := CallDesc^;
12921295
NewCallDesc.CallType := CDoMethod;
1293-
{$IFDEF PATCHEDSYSTEMDISPINVOKE}
1296+
SetLength(fNamedParams, 0);
1297+
{$IFDEF PATCHEDSYSTEMDISPINVOKE}
12941298
PatchedDispInvoke(Dest, Source, @NewCallDesc, Params);
1295-
{$ELSE PATCHEDSYSTEMDISPINVOKE}
1299+
{$ELSE PATCHEDSYSTEMDISPINVOKE}
12961300
inherited DispInvoke(Dest, Source, @NewCallDesc, Params);
1297-
{$ENDIF PATCHEDSYSTEMDISPINVOKE}
1298-
end else
1301+
{$ENDIF PATCHEDSYSTEMDISPINVOKE}
1302+
end
1303+
else
12991304
{$IFDEF PATCHEDSYSTEMDISPINVOKE}
13001305
PatchedDispInvoke(Dest, Source, CallDesc, Params);
13011306
{$ELSE PATCHEDSYSTEMDISPINVOKE}
13021307
inherited;
13031308
{$ENDIF PATCHEDSYSTEMDISPINVOKE}
1304-
finally
1305-
if CallDesc^.NamedArgCount > 0 then SetLength(fNamedParams, 0);
1306-
end;
13071309
end;
13081310

13091311
function TPythonVariantType.DoFunction(var Dest: TVarData;
@@ -1519,8 +1521,14 @@ function TPythonVariantType.EvalPython(const V: TVarData;
15191521
_Args : PPyObject;
15201522
_ArgLen : Integer;
15211523
_KW : PPyObject;
1524+
LNamedParams : TNamedParamArray;
15221525
begin
15231526
Result := nil;
1527+
1528+
// Store global fNamedParams and clear it ASAP
1529+
LNamedParams := System.Copy(fNamedParams);
1530+
SetLength(fNamedParams, 0);
1531+
15241532
with GetPythonEngine do
15251533
begin
15261534
// extract the associated Python object
@@ -1583,10 +1591,10 @@ function TPythonVariantType.EvalPython(const V: TVarData;
15831591
_ArgLen := 0
15841592
else
15851593
_ArgLen := Length(Arguments);
1586-
if Length(fNamedParams) > 0 then
1594+
if Length(LNamedParams) > 0 then
15871595
begin
15881596
_KW := PyDict_New;
1589-
_ArgLen := fNamedParams[0].Index;
1597+
_ArgLen := LNamedParams[0].Index;
15901598
end
15911599
else
15921600
_KW := nil;
@@ -1595,8 +1603,8 @@ function TPythonVariantType.EvalPython(const V: TVarData;
15951603
try
15961604
for i := 0 to _ArgLen-1 do
15971605
PyTuple_SetItem( _Args, i, ArgAsPythonObject(i) );
1598-
for i := 0 to Length(fNamedParams)-1 do
1599-
PyDict_SetItemString(_KW, fNamedParams[i].Name, ArgAsPythonObject(fNamedParams[i].Index));
1606+
for i := 0 to Length(LNamedParams)-1 do
1607+
PyDict_SetItemString(_KW, LNamedParams[i].Name, ArgAsPythonObject(LNamedParams[i].Index));
16001608

16011609
// call the func or method, with or without named parameters (KW)
16021610
Result := PyEval_CallObjectWithKeywords(_obj, _Args, _KW);

0 commit comments

Comments
 (0)