|
@@ -610,13 +610,21 @@ implementation
|
|
|
|
|
|
block:=nil;
|
|
block:=nil;
|
|
stat:=nil;
|
|
stat:=nil;
|
|
|
|
+ self_temp:=nil;
|
|
if docheck then
|
|
if docheck then
|
|
begin
|
|
begin
|
|
{ check for nil self-pointer }
|
|
{ check for nil self-pointer }
|
|
block:=internalstatements(stat);
|
|
block:=internalstatements(stat);
|
|
- self_temp:=ctempcreatenode.create_value(
|
|
|
|
- self_resultdef,self_resultdef.size,tt_persistent,true,
|
|
|
|
- self_node);
|
|
|
|
|
|
+ if is_object(self_resultdef) then
|
|
|
|
+ begin
|
|
|
|
+ self_temp:=ctempcreatenode.create_value(
|
|
|
|
+ cpointerdef.getreusable(self_resultdef),cpointerdef.getreusable(self_resultdef).size,tt_persistent,true,
|
|
|
|
+ caddrnode.create(self_node));
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ self_temp:=ctempcreatenode.create_value(
|
|
|
|
+ self_resultdef,self_resultdef.size,tt_persistent,true,
|
|
|
|
+ self_node);
|
|
addstatement(stat,self_temp);
|
|
addstatement(stat,self_temp);
|
|
|
|
|
|
{ in case of an object, self can only be nil if it's a dereferenced
|
|
{ in case of an object, self can only be nil if it's a dereferenced
|
|
@@ -626,8 +634,6 @@ implementation
|
|
(actualtargetnode(@self_node)^.nodetype=derefn) then
|
|
(actualtargetnode(@self_node)^.nodetype=derefn) then
|
|
begin
|
|
begin
|
|
check_self:=ctemprefnode.create(self_temp);
|
|
check_self:=ctemprefnode.create(self_temp);
|
|
- if is_object(self_resultdef) then
|
|
|
|
- check_self:=caddrnode.create(check_self);
|
|
|
|
addstatement(stat,cifnode.create(
|
|
addstatement(stat,cifnode.create(
|
|
caddnode.create(equaln,
|
|
caddnode.create(equaln,
|
|
ctypeconvnode.create_explicit(
|
|
ctypeconvnode.create_explicit(
|
|
@@ -639,8 +645,10 @@ implementation
|
|
nil)
|
|
nil)
|
|
);
|
|
);
|
|
end;
|
|
end;
|
|
- addstatement(stat,ctempdeletenode.create_normal_temp(self_temp));
|
|
|
|
- self_node:=ctemprefnode.create(self_temp);
|
|
|
|
|
|
+ if is_object(self_resultdef) then
|
|
|
|
+ self_node:=cderefnode.create(ctemprefnode.create(self_temp))
|
|
|
|
+ else
|
|
|
|
+ self_node:=ctemprefnode.create(self_temp)
|
|
end;
|
|
end;
|
|
{ in case of a classref, the "instance" is a pointer
|
|
{ in case of a classref, the "instance" is a pointer
|
|
to pointer to a VMT and there is no vmt field }
|
|
to pointer to a VMT and there is no vmt field }
|
|
@@ -690,6 +698,7 @@ implementation
|
|
)
|
|
)
|
|
);
|
|
);
|
|
addstatement(stat,ctempdeletenode.create_normal_temp(vmt_temp));
|
|
addstatement(stat,ctempdeletenode.create_normal_temp(vmt_temp));
|
|
|
|
+ addstatement(stat,ctempdeletenode.create(self_temp));
|
|
addstatement(stat,ctemprefnode.create(vmt_temp));
|
|
addstatement(stat,ctemprefnode.create(vmt_temp));
|
|
result:=block;
|
|
result:=block;
|
|
end
|
|
end
|