6565{ $ENDIF}
6666
6767{ $IF defined(LINUX) or (defined(BSD) and not defined(DARWIN)) or defined(SOLARIS) or defined(HAIKU)}
68- { $define _so_files}
69- { $ENDIF}
68+ { $define _so_files}
69+ { $ENDIF}
7070
7171interface
7272
@@ -2190,14 +2190,18 @@ TPythonEngine = class(TPythonInterface)
21902190 procedure Finalize ;
21912191 procedure Lock ;
21922192 procedure Unlock ;
2193- procedure SetPythonHome (const PythonHome: string );
2194- procedure SetProgramName (const ProgramName: string );
2193+ procedure SetPythonHome (const PythonHome: UnicodeString );
2194+ procedure SetProgramName (const ProgramName: UnicodeString );
21952195 function IsType (ob: PPyObject; obt: PPyTypeObject): Boolean;
21962196 function GetAttrString (obj: PPyObject; AName: PAnsiChar):PAnsiChar;
21972197 function Run_CommandAsString (const command : AnsiString; mode : Integer) : string;
21982198 function Run_CommandAsObject (const command : AnsiString; mode : Integer) : PPyObject;
21992199 function Run_CommandAsObjectWithDict (const command : AnsiString; mode : Integer; locals, globals : PPyObject) : PPyObject;
2200- function EncodeString (const str: string): AnsiString;
2200+ function EncodeString (const str: UnicodeString): AnsiString; { $IFDEF FPC} overload;{ $ENDIF}
2201+ { $IFDEF FPC}
2202+ overload;
2203+ function EncodeString (const str: AnsiString): AnsiString; overload;
2204+ { $ENDIF}
22012205 function EncodeWindowsFilePath (const str: string): AnsiString;
22022206 procedure ExecString (const command : AnsiString); overload;
22032207 procedure ExecStrings ( strings : TStrings ); overload;
@@ -2353,7 +2357,7 @@ TEventDef = class(TCollectionItem)
23532357 FTmpDocString: AnsiString;
23542358 FOnExecute: TPythonEvent;
23552359 FDocString: TStringList;
2356- procedure SetDocString (const Value : TStringList);
2360+ procedure SetDocString (const Value : TStringList);
23572361 protected
23582362 function GetDisplayName : string; override;
23592363 procedure SetDisplayName (const Value : string); override;
@@ -3238,7 +3242,7 @@ procedure TPythonInputOutput.WriteLine( const str : IOString );
32383242
32393243procedure TPythonInputOutput.AddWrite ( const str : IOString );
32403244begin
3241- FQueue.Add( str );
3245+ FQueue.Add( string( str) );
32423246 if FQueue.Count > FMaxLines then
32433247 FQueue.Delete(0 )
32443248 else
@@ -3292,12 +3296,12 @@ function TPythonInputOutput.GetCurrentThreadSlotIdx : Integer;
32923296
32933297function TPythonInputOutput.GetCurrentThreadLine : IOString;
32943298begin
3295- Result := FLinesPerThread.Strings[ GetCurrentThreadSlotIdx ];
3299+ Result := IOString( FLinesPerThread.Strings[ GetCurrentThreadSlotIdx ]) ;
32963300end ;
32973301
32983302procedure TPythonInputOutput.UpdateCurrentThreadLine ;
32993303begin
3300- FLinesPerThread.Strings[ GetCurrentThreadSlotIdx ] := FLine_Buffer;
3304+ FLinesPerThread.Strings[ GetCurrentThreadSlotIdx ] := string( FLine_Buffer) ;
33013305end ;
33023306
33033307(* ******************************************************)
@@ -3311,12 +3315,18 @@ procedure TDynamicDll.DoOpenDll(const aDllName : string);
33113315 if not IsHandleValid then
33123316 begin
33133317 FDllName := aDllName;
3318+ { $IFDEF MSWINDOWS}
33143319 FDLLHandle := SafeLoadLibrary(
33153320 { $IFDEF FPC}
3316- PAnsiChar(AnsiString(GetDllPath+DllName))
3321+ PAnsiChar(AnsiString(GetDllPath+DllName))
33173322 { $ELSE}
3318- GetDllPath+DllName
3323+ GetDllPath+DllName
33193324 { $ENDIF}
3325+ { $ELSE}
3326+ // Linux: need here RTLD_GLOBAL, so Python can do "import ctypes"
3327+ FDLLHandle := THandle(dlopen(PAnsiChar(AnsiString(GetDllPath+DllName)),
3328+ RTLD_LAZY+RTLD_GLOBAL));
3329+ { $ENDIF}
33203330 );
33213331 end ;
33223332end ;
@@ -3469,11 +3479,7 @@ procedure TDynamicDll.Quit;
34693479 ExitProcess( 1 );
34703480{ $ELSE}
34713481 WriteLn(ErrOutput, GetQuitMessage);
3472- { $IFDEF FPC}
34733482 Halt( 1 );
3474- { $ELSE}
3475- __exit(1 );
3476- { $ENDIF}
34773483{ $ENDIF}
34783484 end ;
34793485end ;
@@ -4716,7 +4722,7 @@ procedure TPythonEngine.DoOpenDll(const aDllName : string);
47164722 for i:= Integer(COMPILED_FOR_PYTHON_VERSION_INDEX) downto 1 do
47174723 begin
47184724 RegVersion := PYTHON_KNOWN_VERSIONS[i].RegVersion;
4719- FDLLHandle := SafeLoadLibrary(GetDllPath+ PYTHON_KNOWN_VERSIONS[i].DllName);
4725+ inherited DoOpenDll( PYTHON_KNOWN_VERSIONS[i].DllName);
47204726 if IsHandleValid then
47214727 begin
47224728 DllName := PYTHON_KNOWN_VERSIONS[i].DllName;
@@ -4848,7 +4854,7 @@ procedure TPythonEngine.Initialize;
48484854 if Assigned(Py_SetProgramName3000) then
48494855 begin
48504856 if FProgramNameW = ' ' then
4851- FProgramNameW := ParamStr(0 );
4857+ FProgramNameW := UnicodeString( ParamStr(0 ) );
48524858 Py_SetProgramName3000(PWideChar(FProgramNameW));
48534859 end
48544860 end else begin
@@ -5050,7 +5056,7 @@ procedure TPythonEngine.SetProgramArgs;
50505056 // get the strings
50515057 // build the PAnsiChar array
50525058 for i := 0 to argc do begin
5053- WL[i] := ParamStr(i);
5059+ WL[i] := UnicodeString( ParamStr(i) );
50545060 wargv^[i] := PWideChar(WL[i]);
50555061 end ;
50565062 // set the argv list of the sys module with the application arguments
@@ -5123,13 +5129,13 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags);
51235129 end ; // of if
51245130end ;
51255131
5126- procedure TPythonEngine.SetPythonHome (const PythonHome: string );
5132+ procedure TPythonEngine.SetPythonHome (const PythonHome: UnicodeString );
51275133begin
51285134 FPythonHomeW := PythonHome;
51295135 FPythonHome := EncodeString(PythonHome);
51305136end ;
51315137
5132- procedure TPythonEngine.SetProgramName (const ProgramName: string );
5138+ procedure TPythonEngine.SetProgramName (const ProgramName: UnicodeString );
51335139begin
51345140 FProgramNameW := ProgramName;
51355141 FProgramName := EncodeString(ProgramName);
@@ -5287,12 +5293,12 @@ function TPythonEngine.Run_CommandAsObjectWithDict(const command : AnsiString; m
52875293
52885294procedure TPythonEngine.ExecStrings ( strings : TStrings );
52895295begin
5290- Py_XDecRef( Run_CommandAsObject( EncodeString(strings.Text) , file_input ) );
5296+ Py_XDecRef( Run_CommandAsObject( EncodeString(strings.Text) , file_input ) );
52915297end ;
52925298
52935299function TPythonEngine.EvalStrings ( strings : TStrings ) : PPyObject;
52945300begin
5295- Result := Run_CommandAsObject( EncodeString(strings.Text) , eval_input );
5301+ Result := Run_CommandAsObject( EncodeString(strings.Text) , eval_input );
52965302end ;
52975303
52985304procedure TPythonEngine.ExecString (const command : AnsiString; locals, globals : PPyObject );
@@ -5302,7 +5308,7 @@ procedure TPythonEngine.ExecString(const command : AnsiString; locals, globals :
53025308
53035309procedure TPythonEngine.ExecStrings ( strings : TStrings; locals, globals : PPyObject );
53045310begin
5305- Py_XDecRef( Run_CommandAsObjectWithDict( EncodeString(strings.Text), file_input, locals, globals ) );
5311+ Py_XDecRef( Run_CommandAsObjectWithDict( EncodeString(strings.Text), file_input, locals, globals ) );
53065312end ;
53075313
53085314function TPythonEngine.EvalString ( const command : AnsiString; locals, globals : PPyObject ) : PPyObject;
@@ -5312,12 +5318,12 @@ function TPythonEngine.EvalString( const command : AnsiString; locals, globals :
53125318
53135319function TPythonEngine.EvalStrings ( strings : TStrings; locals, globals : PPyObject ) : PPyObject;
53145320begin
5315- Result := Run_CommandAsObjectWithDict( EncodeString(strings.Text), eval_input, locals, globals );
5321+ Result := Run_CommandAsObjectWithDict( EncodeString(strings.Text), eval_input, locals, globals );
53165322end ;
53175323
53185324function TPythonEngine.EvalStringsAsStr ( strings : TStrings ) : string;
53195325begin
5320- Result := Run_CommandAsString( EncodeString(strings.Text), eval_input );
5326+ Result := Run_CommandAsString( EncodeString(strings.Text), eval_input );
53215327end ;
53225328
53235329function TPythonEngine.CheckEvalSyntax ( const str : AnsiString ) : Boolean;
@@ -5570,7 +5576,7 @@ function TPythonEngine.PyObjectAsString( obj : PPyObject ) : string;
55705576 if PyUnicode_Check(obj) then
55715577 begin
55725578 w := PyUnicode_AsWideString(obj);
5573- Result := w ;
5579+ Result := string(w) ;
55745580 Exit;
55755581 end ;
55765582 s := PyObject_Str( obj );
@@ -5656,14 +5662,21 @@ function TPythonEngine.FindClient( const aName : string ) : TEngineClient;
56565662 end ;
56575663end ;
56585664
5659- function TPythonEngine.EncodeString (const str: string ): AnsiString;
5665+ function TPythonEngine.EncodeString (const str: UnicodeString ): AnsiString; { $IFDEF FPC } overload; { $ENDIF }
56605666begin
56615667 if IsPython3000 then
56625668 Result := UTF8Encode(str)
56635669 else
56645670 Result := AnsiString(str);
56655671end ;
56665672
5673+ { $IFDEF FPC}
5674+ function TPythonEngine.EncodeString (const str: AnsiString): AnsiString; overload;
5675+ begin
5676+ Result := str;
5677+ end ;
5678+ { $ENDIF}
5679+
56675680function TPythonEngine.EncodeWindowsFilePath (const str: string): AnsiString;
56685681{ PEP 529}
56695682begin
@@ -6558,7 +6571,7 @@ function TPythonEngine.PyString_FromDelphiString(str: string): PPyObject;
65586571begin
65596572 if IsPython3000 then
65606573 begin
6561- Result := PyUnicode_FromWideString(str);
6574+ Result := PyUnicode_FromWideString(UnicodeString( str) );
65626575 end
65636576 else
65646577 Result := DLL_PyString_FromString(PAnsiChar(AnsiString(str)));
@@ -9526,7 +9539,7 @@ function pyio_write(self, args : PPyObject) : PPyObject;
95269539 IO.Write(PyUnicode_AsWideString(a1))
95279540 else
95289541 if PyString_Check(a1) then
9529- IO.Write(PyObjectAsString(a1));
9542+ IO.Write(IOString( PyObjectAsString(a1) ));
95309543 end ;
95319544 Result := ReturnNone;
95329545 end
@@ -9773,7 +9786,11 @@ function CleanString(const s : AnsiString; AppendLF : Boolean) : AnsiString;
97739786
97749787function CleanString (const s : UnicodeString; AppendLF : Boolean) : UnicodeString;
97759788begin
9789+ { $IFDEF FPC}
9790+ Result := UnicodeString(AdjustLineBreaks(AnsiString(s), tlbsLF));
9791+ { $ELSE}
97769792 Result := AdjustLineBreaks(s, tlbsLF);
9793+ { $ENDIF}
97779794 if AppendLF and (result[length(result)] <> LF) then
97789795 Result := Result + LF;
97799796end ;
0 commit comments