5252(* *************************************************************************)
5353
5454{ $I Definition.Inc}
55+ { $POINTERMATH ON}
5556
5657unit PythonEngine;
5758
@@ -389,19 +390,6 @@ TPythonVersionProp = record
389390
390391
391392
392- // #######################################################
393- // ## ##
394- // ## Global declarations, nothing Python specific ##
395- // ## ##
396- // #######################################################
397-
398- type
399- TPAnsiChar = array [0 ..16000 ] of PAnsiChar;
400- TPWideChar = array [0 ..16000 ] of PWideChar;
401- PPAnsiChar = ^TPAnsiChar;
402- PPWideChar = ^TPWideChar;
403-
404-
405393// #######################################################
406394// ## ##
407395// ## Python specific interface ##
@@ -2380,8 +2368,6 @@ TEngineClient = class(TComponent)
23802368// -- --
23812369// -------------------------------------------------------
23822370
2383- TMethodArray = array [ 0 .. 16000 ] of PyMethodDef;
2384- PMethodArray = ^TMethodArray;
23852371 TDelphiMethod = function ( self, args : PPyObject ) : PPyObject of object ; cdecl;
23862372 TDelphiMethodWithKW = function ( self, args, keywords : PPyObject ) : PPyObject of object ; cdecl;
23872373 TPythonEvent = procedure(Sender: TObject; PSelf, Args: PPyObject; var Result: PPyObject) of object ;
@@ -2488,9 +2474,6 @@ TMethodsContainer = class(TEngineClient)
24882474// -- --
24892475// ------------------------------------------------------------
24902476
2491- TMemberArray = array [ 0 .. 16000 ] of PyMemberDef;
2492- PMemberArray = ^TMemberArray;
2493-
24942477 // class TMembersContainer
24952478 TMembersContainer = class (TMethodsContainer)
24962479 protected
@@ -2533,9 +2516,6 @@ TMembersContainer = class(TMethodsContainer)
25332516// -- --
25342517// ------------------------------------------------------------
25352518
2536- TGetSetArray = array [ 0 .. 16000 ] of PyGetSetDef;
2537- PGetSetArray = ^TGetSetArray;
2538-
25392519 // class TGetSetContainer
25402520 TGetSetContainer = class (TMembersContainer)
25412521 private
@@ -5063,12 +5043,10 @@ procedure TPythonEngine.CheckRegistry;
50635043
50645044procedure TPythonEngine.SetProgramArgs ;
50655045var
5066- buff : PAnsiChar;
5067- argv : PPAnsiChar;
50685046 i, argc : Integer;
5047+ argv : array of PAnsiChar;
50695048 L : array of AnsiString;
5070- wargv : PPWideChar;
5071- wbuff : PWideChar;
5049+ wargv : array of PWideChar;
50725050 { $IFDEF POSIX}
50735051 UCS4L : array of UCS4String;
50745052 { $ELSE}
@@ -5080,44 +5058,34 @@ procedure TPythonEngine.SetProgramArgs;
50805058 argc := ParamCount;
50815059 if not IsPython3000 then begin
50825060 SetLength(L, argc+1 );
5083- GetMem( buff, sizeof(PAnsiChar)*(argc+1 ) );
5084- try
5085- argv := PPAnsiChar(buff);
5086- // get the strings
5087- // build the PAnsiChar array
5088- for i := 0 to argc do begin
5089- L[i] := AnsiString(ParamStr(i));
5090- argv^[i] := PAnsiChar(L[i]);
5091- end ;
5092- // set the argv list of the sys module with the application arguments
5093- PySys_SetArgv( argc+1 , argv );
5094- finally
5095- FreeMem( buff );
5061+ SetLength(argv, argc + 1 );
5062+ // get the strings
5063+ // build the PAnsiChar array
5064+ for i := 0 to argc do begin
5065+ L[i] := AnsiString(ParamStr(i));
5066+ argv[i] := PAnsiChar(L[i]);
50965067 end ;
5068+ // set the argv list of the sys module with the application arguments
5069+ PySys_SetArgv( argc+1 , PPAnsiChar(argv) );
50975070 end else begin
5098- GetMem(wbuff, sizeof(PWideChar)*(argc+1 ));
5099- try
5100- wargv := PPWideChar(wbuff);
5101- // build the PWideChar array
5102- { $IFDEF POSIX}
5103- // Note that Linux uses UCS4 strings, whereas it declares using UCS2 strings!!!
5104- SetLength(UCS4L, argc+1 );
5105- for i := 0 to argc do begin
5106- UCS4L[i] := WideStringToUCS4String(ParamStr(i));
5107- wargv^[i] := @UCS4L[i][0 ];
5108- end ;
5109- { $ELSE}
5110- SetLength(WL, argc+1 );
5111- for i := 0 to argc do begin
5112- WL[i] := UnicodeString(ParamStr(i));
5113- wargv^[i] := PWideChar(WL[i]);
5114- end ;
5115- { $ENDIF}
5116- // set the argv list of the sys module with the application arguments
5117- PySys_SetArgv3000( argc + 1 , wargv );
5118- finally
5119- FreeMem( wbuff );
5071+ SetLength(wargv, argc + 1 );
5072+ // build the PWideChar array
5073+ { $IFDEF POSIX}
5074+ // Note that Linux uses UCS4 strings, whereas it declares using UCS2 strings!!!
5075+ SetLength(UCS4L, argc+1 );
5076+ for i := 0 to argc do begin
5077+ UCS4L[i] := WideStringToUCS4String(ParamStr(i));
5078+ wargv[i] := @UCS4L[i][0 ];
51205079 end ;
5080+ { $ELSE}
5081+ SetLength(WL, argc+1 );
5082+ for i := 0 to argc do begin
5083+ WL[i] := UnicodeString(ParamStr(i));
5084+ wargv[i] := PWideChar(WL[i]);
5085+ end ;
5086+ { $ENDIF}
5087+ // set the argv list of the sys module with the application arguments
5088+ PySys_SetArgv3000( argc + 1 , PPWideChar(wargv) );
51215089 end ;
51225090end ;
51235091
@@ -6849,20 +6817,17 @@ procedure TMethodsContainer.FreeMethods;
68496817end ;
68506818
68516819procedure TMethodsContainer.ReallocMethods ;
6852- var
6853- MethodPtr : PPyMethodDef;
68546820begin
68556821 Inc( FAllocatedMethodCount, PYT_METHOD_BUFFER_INCREASE );
68566822 ReAllocMem( FMethods, SizeOf(PyMethodDef)*(FAllocatedMethodCount+1 ));
6857- MethodPtr :=@(PMethodArray(FMethods)^[MethodCount+1 ]);
6858- FillChar( MethodPtr^,SizeOf(PyMethodDef)*PYT_METHOD_BUFFER_INCREASE,0 );
6823+ FillChar( FMethods[MethodCount+1 ] ,SizeOf(PyMethodDef)*PYT_METHOD_BUFFER_INCREASE,0 );
68596824end ;
68606825
68616826function TMethodsContainer.GetMethods ( idx : Integer ) : PPyMethodDef;
68626827begin
68636828 if (idx < 0 ) or (idx > MethodCount) then
68646829 raise Exception.CreateFmt(' %s: Index %d out of range' , [ClassName, idx]);
6865- Result := @( PMethodArray( FMethods)^ [idx] );
6830+ Result := @( FMethods[idx] );
68666831end ;
68676832
68686833function TMethodsContainer.StoreEventDefs : Boolean;
@@ -7044,17 +7009,14 @@ function TMembersContainer.GetMembers(idx: Integer): PPyMemberDef;
70447009begin
70457010 if (idx < 0 ) or (idx > MemberCount) then
70467011 raise Exception.CreateFmt(' %s: Index %d out of range' , [ClassName, idx]);
7047- Result := @( PMemberArray( FMembers)^ [idx] );
7012+ Result := @( FMembers[idx] );
70487013end ;
70497014
70507015procedure TMembersContainer.ReallocMembers ;
7051- var
7052- MemberPtr : PPyMemberDef;
70537016begin
70547017 Inc( FAllocatedMemberCount, PYT_MEMBER_BUFFER_INCREASE );
70557018 ReAllocMem( FMembers, SizeOf(PyMemberDef)*(FAllocatedMemberCount+1 ));
7056- MemberPtr :=@(PMemberArray(FMembers)^[MemberCount+1 ]);
7057- FillChar( MemberPtr^,SizeOf(PyMemberDef)*PYT_MEMBER_BUFFER_INCREASE,0 );
7019+ FillChar( FMembers[MemberCount+1 ], SizeOf(PyMemberDef)*PYT_MEMBER_BUFFER_INCREASE,0 );
70587020end ;
70597021
70607022// //////////////////////////////////////
@@ -7124,17 +7086,14 @@ function TGetSetContainer.GetGetSet(idx: Integer): PPyGetSetDef;
71247086begin
71257087 if (idx < 0 ) or (idx > GetSetCount) then
71267088 raise Exception.CreateFmt(' %s: Index %d out of range' , [ClassName, idx]);
7127- Result := @( PGetSetArray( FGetSets)^ [idx] );
7089+ Result := @( FGetSets[idx] );
71287090end ;
71297091
71307092procedure TGetSetContainer.ReallocGetSets ;
7131- var
7132- GetSetPtr : PPyGetSetDef;
71337093begin
71347094 Inc( FAllocatedGetSetCount, PYT_GETSET_BUFFER_INCREASE );
71357095 ReAllocMem( FGetSets, SizeOf(PyGetSetDef)*(FAllocatedGetSetCount+1 ));
7136- GetSetPtr :=@(PGetSetArray(FGetSets)^[GetSetCount+1 ]);
7137- FillChar( GetSetPtr^,SizeOf(PyGetSetDef)*PYT_GETSET_BUFFER_INCREASE,0 );
7096+ FillChar( FGetSets[GetSetCount+1 ], SizeOf(PyGetSetDef)*PYT_GETSET_BUFFER_INCREASE,0 );
71387097end ;
71397098
71407099(* ******************************************************)
0 commit comments