mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-24 16:41:37 +02:00
* temporarily turn off self and vmt checking after calling
AfterConstruction, since self may no longer be valid afterwards
(the instance may already have freed itself, e.g. in case of a
TThread with FreeOnTerminate=true)
git-svn-id: trunk@5689 -
This commit is contained in:
parent
e5a1d628eb
commit
d3ded54ae0
@ -362,11 +362,19 @@ implementation
|
||||
srsym : tsym;
|
||||
para : tcallparanode;
|
||||
newstatement : tstatementnode;
|
||||
oldlocalswitches: tlocalswitches;
|
||||
begin
|
||||
result:=internalstatements(newstatement);
|
||||
|
||||
if assigned(current_procinfo.procdef._class) then
|
||||
begin
|
||||
{ Don't test self and the vmt here. The reason is that }
|
||||
{ a constructor already checks whether these are valid }
|
||||
{ before. Further, in case of TThread the thread may }
|
||||
{ free the class instance right after AfterConstruction }
|
||||
{ has been called, so it may no longer be valid (JM) }
|
||||
oldlocalswitches:=current_settings.localswitches;
|
||||
current_settings.localswitches:=oldlocalswitches-[cs_check_object,cs_check_range];
|
||||
{ maybe call AfterConstruction for classes }
|
||||
if (current_procinfo.procdef.proctypeoption=potype_constructor) and
|
||||
is_class(current_procinfo.procdef._class) then
|
||||
@ -444,6 +452,7 @@ implementation
|
||||
else
|
||||
internalerror(200305105);
|
||||
end;
|
||||
current_settings.localswitches:=oldlocalswitches;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -452,6 +461,7 @@ implementation
|
||||
var
|
||||
pd : tprocdef;
|
||||
newstatement : tstatementnode;
|
||||
oldlocalswitches: tlocalswitches;
|
||||
begin
|
||||
generate_except_block:=internalstatements(newstatement);
|
||||
|
||||
@ -460,6 +470,10 @@ implementation
|
||||
if assigned(current_procinfo.procdef._class) and
|
||||
(current_procinfo.procdef.proctypeoption=potype_constructor) then
|
||||
begin
|
||||
{ Don't test self and the vmt here. See generate_bodyexit_block }
|
||||
{ why (JM) }
|
||||
oldlocalswitches:=current_settings.localswitches;
|
||||
current_settings.localswitches:=oldlocalswitches-[cs_check_object,cs_check_range];
|
||||
pd:=current_procinfo.procdef._class.Finddestructor;
|
||||
if assigned(pd) then
|
||||
begin
|
||||
@ -471,6 +485,7 @@ implementation
|
||||
ccallnode.create(nil,tprocsym(pd.procsym),pd.procsym.owner,load_self_node,[]),
|
||||
nil));
|
||||
end;
|
||||
current_settings.localswitches:=oldlocalswitches;
|
||||
end
|
||||
else
|
||||
begin
|
||||
|
||||
Loading…
Reference in New Issue
Block a user