Skip to content

Commit 277676f

Browse files
committed
Fix lmbelo#90
1 parent ad8a1d3 commit 277676f

1 file changed

Lines changed: 34 additions & 75 deletions

File tree

Source/PythonEngine.pas

Lines changed: 34 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
(**************************************************************************)
5353

5454
{$I Definition.Inc}
55+
{$POINTERMATH ON}
5556

5657
unit 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

50645044
procedure TPythonEngine.SetProgramArgs;
50655045
var
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;
51225090
end;
51235091

@@ -6849,20 +6817,17 @@ procedure TMethodsContainer.FreeMethods;
68496817
end;
68506818

68516819
procedure TMethodsContainer.ReallocMethods;
6852-
var
6853-
MethodPtr : PPyMethodDef;
68546820
begin
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);
68596824
end;
68606825

68616826
function TMethodsContainer.GetMethods( idx : Integer ) : PPyMethodDef;
68626827
begin
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] );
68666831
end;
68676832

68686833
function TMethodsContainer.StoreEventDefs: Boolean;
@@ -7044,17 +7009,14 @@ function TMembersContainer.GetMembers(idx: Integer): PPyMemberDef;
70447009
begin
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] );
70487013
end;
70497014

70507015
procedure TMembersContainer.ReallocMembers;
7051-
var
7052-
MemberPtr : PPyMemberDef;
70537016
begin
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);
70587020
end;
70597021

70607022
////////////////////////////////////////
@@ -7124,17 +7086,14 @@ function TGetSetContainer.GetGetSet(idx: Integer): PPyGetSetDef;
71247086
begin
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] );
71287090
end;
71297091

71307092
procedure TGetSetContainer.ReallocGetSets;
7131-
var
7132-
GetSetPtr : PPyGetSetDef;
71337093
begin
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);
71387097
end;
71397098

71407099
(*******************************************************)

0 commit comments

Comments
 (0)