objc: use compile-time macOS version checks

Use "modern" APIs for calling inherited messages when targeting Mac OS X 10.6
or later
This commit is contained in:
Jonas Maebe 2022-09-09 18:45:37 +02:00
parent b26703feaa
commit df3a0af7e0
2 changed files with 15 additions and 15 deletions

View File

@ -2764,10 +2764,10 @@ implementation
begin
if not(cnf_inherited in callnodeflags) then
msgsendname:='OBJC_MSGSEND_STRET'
{$if defined(onlymacosx10_6) or defined(arm) }
else if (target_info.system in systems_objc_nfabi) then
else if (target_info.system in systems_objc_nfabi) and
(not MacOSXVersionMin.isvalid or
(MacOSXVersionMin.relationto(10,6,0)>=0)) then
msgsendname:='OBJC_MSGSENDSUPER2_STRET'
{$endif onlymacosx10_6 or arm}
else
msgsendname:='OBJC_MSGSENDSUPER_STRET'
end
@ -2781,12 +2781,12 @@ implementation
{ default }
else
{$endif aarch64}
if not(cnf_inherited in callnodeflags) then
msgsendname:='OBJC_MSGSEND'
{$if defined(onlymacosx10_6) or defined(arm) or defined(aarch64)}
else if (target_info.system in systems_objc_nfabi) then
if not(cnf_inherited in callnodeflags) then
msgsendname:='OBJC_MSGSEND'
else if (target_info.system in systems_objc_nfabi) and
(not MacOSXVersionMin.isvalid or
(MacOSXVersionMin.relationto(10,6,0)>=0)) then
msgsendname:='OBJC_MSGSENDSUPER2'
{$endif onlymacosx10_6 or arm}
else
msgsendname:='OBJC_MSGSENDSUPER';

View File

@ -52,7 +52,7 @@ interface
implementation
uses
globtype,
globtype,globals,versioncmp,
cutils,
pass_1,
verbose,systems,
@ -153,13 +153,13 @@ end;
{ in case we are in a category method, we need the metaclass of the
superclass class extended by this category (= metaclass of superclass of superclass)
for the fragile abi, and the metaclass of the superclass for the non-fragile ABI }
{$if defined(onlymacosx10_6) or defined(arm) or defined(aarch64)}
{ NOTE: those send2 methods are only available on Mac OS X 10.6 and later!
(but also on all iPhone SDK revisions we support) }
if (target_info.system in systems_objc_nfabi) then
if (target_info.system in systems_objc_nfabi) and
(not MacOSXVersionMin.isvalid or
(MacOSXVersionMin.relationto(10,6,0)>=0)) then
result:=cloadvmtaddrnode.create(ctypenode.create(tobjectdef(tclassrefdef(def).pointeddef).childof))
else
{$endif onlymacosx10_6 or arm aarch64}
result:=cloadvmtaddrnode.create(ctypenode.create(tobjectdef(tclassrefdef(def).pointeddef).childof.childof));
tloadvmtaddrnode(result).forcall:=true;
result:=cloadvmtaddrnode.create(result);
@ -183,14 +183,14 @@ end;
tloadvmtaddrnode(result).forcall:=true;
end;
{$if defined(onlymacosx10_6) or defined(arm) or defined(aarch64)}
{ For the non-fragile ABI, the superclass send2 method itself loads the
superclass. For the fragile ABI, we have to do this ourselves.
NOTE: those send2 methods are only available on Mac OS X 10.6 and later!
(but also on all iPhone SDK revisions we support) }
if not(target_info.system in systems_objc_nfabi) then
{$endif onlymacosx10_6 or arm or aarch64}
if not(target_info.system in systems_objc_nfabi) or
(MacOSXVersionMin.isvalid and
(MacOSXVersionMin.relationto(10,6,0)<0)) then
result:=objcloadbasefield(result,'SUPERCLASS');
typecheckpass(result);
end;