@@ -1026,7 +1026,8 @@ implementation
10261026  rs_ErrAttrGet = ' Error in getting property "%s".'  #$A' Error: %s'  ;
10271027  rs_UnknownAttribute = ' Unknown attribute'  ;
10281028  rs_ErrIterSupport = ' Wrapper %s does not support iterators'  ;
1029-   rs_ErrAttrSetr = ' Error in setting property %s'  #$A' Error: %s'  ;
1029+   rs_ErrAttrSet = ' Error in setting property %s'  #$A' Error: %s'  ;
1030+   rs_ErrObjectDestroyed = ' Trying to access a destroyed pascal object'  ;
10301031  rs_IncompatibleClasses = ' Incompatible classes'  ;
10311032  rs_IncompatibleRecords = ' Incompatible record types'  ;
10321033  rs_IncompatibleInterfaces = ' Incompatible interfaces'  ;
@@ -1550,7 +1551,7 @@ function TExposedGetSet.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer
15501551  if  Result <> 0  then 
15511552    with  GetPythonEngine do 
15521553      PyErr_SetObject (PyExc_AttributeError^,
1553-         PyUnicodeFromString(Format(rs_ErrAttrSetr , [FRttiMember.Name , ErrMsg])));
1554+         PyUnicodeFromString(Format(rs_ErrAttrSet , [FRttiMember.Name , ErrMsg])));
15541555end ;
15551556
15561557{  TExposedField } 
@@ -1646,7 +1647,7 @@ function TExposedEvent.SetterWrapper(AObj, AValue: PPyObject; AContext: Pointer)
16461647  if  Result <> 0  then 
16471648    with  GetPythonEngine do 
16481649      PyErr_SetObject (PyExc_AttributeError^,
1649-         PyUnicodeFromString(Format(rs_ErrAttrSetr , [FRttiMember.Name , ErrMsg])));
1650+         PyUnicodeFromString(Format(rs_ErrAttrSet , [FRttiMember.Name , ErrMsg])));
16501651end ;
16511652
16521653{  TExposedIndexedProperty } 
@@ -3434,7 +3435,7 @@ function TPyRttiObject.SetAttrO(key, value: PPyObject): Integer;
34343435  if  Result <> 0  then 
34353436    with  GetPythonEngine do 
34363437      PyErr_SetObject(PyExc_AttributeError^, PyUnicodeFromString(
3437-         Format(rs_ErrAttrSetr , [KeyName, ErrMsg])));
3438+         Format(rs_ErrAttrSet , [KeyName, ErrMsg])));
34383439end ;
34393440
34403441function  TPyRttiObject.SetProps (args, keywords: PPyObject): PPyObject;
@@ -3543,6 +3544,7 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject;
35433544var 
35443545  KeyName: string;
35453546  ErrMsg : string;
3547+   PyEngine: TPythonEngine;
35463548  { $IFNDEF EXTENDED_RTTI} 
35473549  { $IFNDEF FPC} 
35483550  Info: PMethodInfoHeader;
@@ -3554,16 +3556,24 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject;
35543556  RttiType: TRttiStructuredType;
35553557  { $ENDIF} 
35563558begin 
3557-   Result := inherited  GetAttrO(key) ;
3558-   if  GetPythonEngine.PyErr_Occurred =  nil   then  Exit;   //  We found what we wanted 
3559+   Result := nil ;
3560+   PyEngine := GetPythonEngine; 
35593561
3560-   //  should not happen
3561-   if  not  (Assigned(DelphiObject) and 
3562-      CheckStrAttribute(Key, ' GetAttrO key parameter'  , KeyName))
3563-   then 
3562+   //  If DelphiObject is nil Exit immediately with an error
3563+   if  not  Assigned(DelphiObject) then 
3564+   begin 
3565+     PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^,
3566+       PyEngine.PyUnicodeFromString(rs_ErrObjectDestroyed));
35643567    Exit;
3568+   end ;
3569+ 
3570+   if  not  CheckStrAttribute(Key, ' GetAttrO key parameter'  , KeyName) then 
3571+     Exit; //  should not happen
3572+ 
3573+   Result := inherited  GetAttrO(key);
3574+   if  PyEngine.PyErr_Occurred = nil  then  Exit;  //  We found what we wanted
35653575
3566-   GetPythonEngine .PyErr_Clear;
3576+   PyEngine .PyErr_Clear;
35673577{ $IFDEF EXTENDED_RTTI} 
35683578  //  Use RTTI
35693579  if  Assigned(DelphiObject) then  begin 
@@ -3620,17 +3630,17 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject;
36203630        { $ELSE FPC} 
36213631        if  GetTypeData(PropInfo^.PropType^)^.BaseType^ = TypeInfo(Boolean) then 
36223632        { $ENDIF FPC} 
3623-           Result := GetPythonEngine .VariantAsPyObject(Boolean(GetOrdProp(Self.DelphiObject, PropInfo)))
3633+           Result := PyEngine .VariantAsPyObject(Boolean(GetOrdProp(Self.DelphiObject, PropInfo)))
36243634        else 
36253635        { $IFDEF FPC} 
3626-           Result := GetPythonEngine .PyUnicodeFromString(GetEnumName(PropInfo^.PropType,
3636+           Result := PyEngine .PyUnicodeFromString(GetEnumName(PropInfo^.PropType,
36273637        { $ELSE FPC} 
3628-           Result := GetPythonEngine .PyUnicodeFromString(GetEnumName(PropInfo^.PropType^,
3638+           Result := PyEngine .PyUnicodeFromString(GetEnumName(PropInfo^.PropType^,
36293639        { $ENDIF FPC} 
36303640            GetOrdProp(Self.DelphiObject, PropInfo)));
36313641      end 
36323642      end  else 
3633-          Result := GetPythonEngine .VariantAsPyObject(GetPropValue(DelphiObject, PropInfo));
3643+          Result := PyEngine .VariantAsPyObject(GetPropValue(DelphiObject, PropInfo));
36343644    end ;
36353645  except 
36363646    on E: Exception do  begin 
@@ -3640,9 +3650,8 @@ function TPyDelphiObject.GetAttrO(key: PPyObject): PPyObject;
36403650  end ;
36413651{ $ENDIF} 
36423652  if  not  Assigned(Result) then 
3643-     with  GetPythonEngine do 
3644-       PyErr_SetObject (PyExc_AttributeError^,
3645-         PyUnicodeFromString(Format(rs_ErrAttrGet,[KeyName, ErrMsg])));
3653+     PyEngine.PyErr_SetObject (PyEngine.PyExc_AttributeError^,
3654+       PyEngine.PyUnicodeFromString(Format(rs_ErrAttrGet,[KeyName, ErrMsg])));
36463655end ;
36473656
36483657function  TPyDelphiObject.GetContainerAccess : TContainerAccess;
@@ -3944,11 +3953,16 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer;
39443953  Result := -1 ;
39453954  PyEngine := GetPythonEngine;
39463955
3947-   //  should not happen
3948-   if  not  (Assigned(DelphiObject) and 
3949-      CheckStrAttribute(Key, ' SetAttrO key parameter'  , KeyName))
3950-   then 
3956+   //  If DelphiObject is nil Exit immediately with an error
3957+   if  not  Assigned(DelphiObject) then 
3958+   begin 
3959+     PyEngine.PyErr_SetObject(PyEngine.PyExc_AttributeError^,
3960+       PyEngine.PyUnicodeFromString(rs_ErrObjectDestroyed));
39513961    Exit;
3962+   end ;
3963+ 
3964+   if  not  CheckStrAttribute(Key, ' SetAttrO key parameter'  , KeyName) then 
3965+     Exit; //  should not happen
39523966
39533967  //  Only call the inherited method at this stage if the attribute exists
39543968  PyObj := PyEngine.PyObject_GenericGetAttr(GetSelf, key);
@@ -3989,8 +4003,8 @@ function TPyDelphiObject.SetAttrO(key, value: PPyObject): Integer;
39894003    Result := inherited  SetAttrO(key, value );
39904004  if  Result <> 0  then 
39914005    with  PyEngine do 
3992-       PyErr_SetObject(PyEngine. PyExc_AttributeError^, PyUnicodeFromString(
3993-         Format(rs_ErrAttrSetr , [KeyName, ErrMsg])));
4006+       PyErr_SetObject(PyExc_AttributeError^, PyUnicodeFromString(
4007+         Format(rs_ErrAttrSet , [KeyName, ErrMsg])));
39944008end ;
39954009
39964010procedure  TPyDelphiObject.SetDelphiObject (const  Value : TObject);
0 commit comments