@@ -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;
12851287Var
12861288 NewCallDesc : TCallDesc;
12871289begin
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 ;
13071309end ;
13081310
13091311function 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;
15221525begin
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