Skip to content

Commit 2957db6

Browse files
committed
Multi-phase module initialization implemented.
DemoModule/uMain.pas and RttiModule/uMain.pas have been updated to showcase multi-phase initialization
1 parent 2f9efc3 commit 2957db6

File tree

4 files changed

+235
-126
lines changed

4 files changed

+235
-126
lines changed

Modules/DemoModule/uMain.pas

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ interface
77
function PyInit_DemoModule: PPyObject; cdecl;
88

99
implementation
10-
Uses
10+
uses
11+
Winapi.Windows,
1112
System.Math,
1213
WrapDelphi;
1314

1415
var
15-
gEngine : TPythonEngine;
16-
gModule : TPythonModule;
16+
gEngine : TPythonEngine = nil;
17+
gModule : TPythonModule = nil;
1718

1819
function IsPrime(x: Integer): Boolean;
1920
// Naive implementation. It is just a demo
@@ -46,6 +47,7 @@ function delphi_is_prime(self, args : PPyObject) : PPyObject; cdecl;
4647

4748
function PyInit_DemoModule: PPyObject;
4849
begin
50+
if not Assigned(gEngine) then
4951
try
5052
gEngine := TPythonEngine.Create(nil);
5153
gEngine.AutoFinalize := False;
@@ -56,12 +58,18 @@ function PyInit_DemoModule: PPyObject;
5658
gModule.ModuleName := 'DemoModule';
5759
gModule.AddMethod('is_prime', delphi_is_prime, 'is_prime(n) -> bool' );
5860

61+
// We need to set this so that the module is not created by Initialzize
62+
gModule.IsExtensionModule := True;
63+
gModule.MultInterpretersSupport := mmiPerInterpreterGIL;
64+
5965
gEngine.LoadDllInExtensionModule;
6066
except
67+
Exit(nil);
6168
end;
62-
Result := gModule.Module;
63-
end;
6469

70+
// The python import machinery will create the python module from ModuleDef
71+
Result := gEngine.PyModuleDef_Init(@gModule.ModuleDef);
72+
end;
6573

6674
initialization
6775
finalization

Modules/RttiModule/uMain.pas

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ implementation
1717
TDelphiFunctions = class
1818
public
1919
class function is_prime(const N: Integer): Boolean; static;
20+
class procedure AfterModuleInit(Sender: TObject);
2021
end;
2122

2223
var
@@ -25,39 +26,53 @@ TDelphiFunctions = class
2526
gDelphiWrapper : TPyDelphiWrapper;
2627
DelphiFunctions: TDelphiFunctions;
2728

28-
29-
3029
function PyInit_DemoModule: PPyObject;
31-
var
32-
Py : PPyObject;
3330
begin
31+
if not Assigned(gEngine) then
3432
try
3533
gEngine := TPythonEngine.Create(nil);
3634
gEngine.AutoFinalize := False;
3735
gEngine.UseLastKnownVersion := True;
3836

37+
gDelphiWrapper := TPyDelphiWrapper.Create(nil);
38+
gDelphiWrapper.Engine := gEngine;
39+
40+
// !!It is important that the extension module is the last
41+
// Engine client created
3942
gModule := TPythonModule.Create(nil);
4043
gModule.Engine := gEngine;
4144
gModule.ModuleName := 'DemoModule';
4245

43-
gDelphiWrapper := TPyDelphiWrapper.Create(nil);
44-
gDelphiWrapper.Engine := gEngine;
46+
// Set IsExtensionModule so that the module is not created by Initialzize
47+
gModule.IsExtensionModule := True;
48+
gModule.MultInterpretersSupport := mmiPerInterpreterGIL;
49+
gModule.OnAfterInitialization := TDelphiFunctions.AfterModuleInit;
50+
4551
gDelphiWrapper.Module := gModule;
4652

4753
gEngine.LoadDllInExtensionModule;
48-
Py := gDelphiWrapper.Wrap(DelphiFunctions, TObjectOwnership.soReference);
49-
gModule.SetVar('delphi_funcs', Py);
50-
gEngine.Py_DecRef(Py);
5154
except
55+
Exit(nil);
5256
end;
53-
Result := gModule.Module;
57+
58+
// The python import machinery will create the python module from ModuleDef
59+
Result := gEngine.PyModuleDef_Init(@gModule.ModuleDef);
5460
end;
5561

5662
{ TTestRttiAccess }
5763

5864

5965
{ TDelphiFunctions }
6066

67+
class procedure TDelphiFunctions.AfterModuleInit(Sender: TObject);
68+
var
69+
Py : PPyObject;
70+
begin
71+
Py := gDelphiWrapper.Wrap(DelphiFunctions, TObjectOwnership.soReference);
72+
gModule.SetVar('delphi_funcs', Py);
73+
gEngine.Py_DecRef(Py);
74+
end;
75+
6176
class function TDelphiFunctions.is_prime(const N: Integer): Boolean;
6277
// Naive implementation. It is just a demo...
6378
begin

0 commit comments

Comments
 (0)