From 48c626678442526589750899cf07ac06ec3f574d Mon Sep 17 00:00:00 2001 From: TinXie Date: Wed, 24 Apr 2019 17:11:46 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=89=E8=A3=9D=20Logo?= =?UTF-8?q?s=20=E8=AA=9E=E6=B3=95=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Logos-Xcode/src/AdditionalLanguages.plist | 37 +++++++++ Logos-Xcode/src/Logos.xc | 0 Logos-Xcode/src/Logos.xcspec | 15 ++++ Logos-Xcode/src/install.sh | 74 ++++++++++++++++++ Logos-Xcode/src/xclangspec_generator.py | 91 +++++++++++++++++++++++ bin/md-install | 14 ++++ 6 files changed, 231 insertions(+) create mode 100644 Logos-Xcode/src/AdditionalLanguages.plist create mode 100755 Logos-Xcode/src/Logos.xc create mode 100644 Logos-Xcode/src/Logos.xcspec create mode 100755 Logos-Xcode/src/install.sh create mode 100755 Logos-Xcode/src/xclangspec_generator.py diff --git a/Logos-Xcode/src/AdditionalLanguages.plist b/Logos-Xcode/src/AdditionalLanguages.plist new file mode 100644 index 0000000..e4eb2b9 --- /dev/null +++ b/Logos-Xcode/src/AdditionalLanguages.plist @@ -0,0 +1,37 @@ + + + + + Xcode.SourceCodeLanguage.Logos + + languageSpecification + xcode.lang.logos + fileDataType + + + identifier + com.apple.xcode.logos-source + + + id + Xcode.SourceCodeLanguage.Logos + point + Xcode.SourceCodeLanguage + languageName + Logos + version + 1.0 + documentationAbbreviation + logos + conformsTo + + + identifier + Xcode.SourceCodeLanguage.Generic + + + name + Logos Language + + + diff --git a/Logos-Xcode/src/Logos.xc b/Logos-Xcode/src/Logos.xc new file mode 100755 index 0000000..e69de29 diff --git a/Logos-Xcode/src/Logos.xcspec b/Logos-Xcode/src/Logos.xcspec new file mode 100644 index 0000000..afaf067 --- /dev/null +++ b/Logos-Xcode/src/Logos.xcspec @@ -0,0 +1,15 @@ +/* +* Logos.xcspec: Xcode file type for Logos +* +**/ + +( + { + Type = FileType; + Identifier = sourcecode.logos; + BasedOn = sourcecode; + Name = "Logos file"; + Extensions = ( xm ); + Language = "xcode.lang.logos"; + } +) \ No newline at end of file diff --git a/Logos-Xcode/src/install.sh b/Logos-Xcode/src/install.sh new file mode 100755 index 0000000..4db6c95 --- /dev/null +++ b/Logos-Xcode/src/install.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# +# pr0crustes version. +# Edited version of the work of Tiago Bastos and Alex Karahalios. +# Last edited 15/9/2018 +# + +set -e + +# Path were this script is located +Script_Path="/opt/MonkeyDev/Logos-Xcode/src" +# "$(dirname "$(realpath "$0")")" + +# Checks if has enought permission +echo "Checking Permissions..." +if [ $EUID -ne 0 ]; then + echo "$0 needs to be run as root." + echo " Check README for info." + echo " Aborting..." + exit 2 +fi + +# Assumes Xcode 4+. +echo "Checking Xcode..." +XCODE_MAJOR_VERSION=`xcodebuild -version | awk 'NR == 1 {print int($2)}'` +if [ "$XCODE_MAJOR_VERSION" -lt "4" ]; then + echo "Xcode 4+ not found." + exit 1 +fi + +# Check if Logos.xclangspec is present in the same folder +echo "Finding Logos.xclangspec..." +if [ ! -f $Script_Path/Logos.xclangspec ]; then + echo "Logos.xclangspec was not found." + echo "You probably forgot to run 'python(3) xclangspec_generator.py'" + exit 1 +fi + + +echo "It's highly recommended that, if you are installing for the first time, you make a backup of the folder /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources" +while true; do + read -p "Do you wish to continue? (Y)es, (N)o " yn + case $yn in + [Yy]*) + # This framework is found withing the Xcode.app package and is used when Xcode is a monolithic install (all contained in Xcode.app) + DVTFountain_Path="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/" + + # Backup + cp "$DVTFountain_Path/DVTFoundation.xcplugindata" "$DVTFountain_Path/DVTFoundation.xcplugindata.bak" + + # Now merge in the additonal languages to DVTFoundation.xcplugindata + echo "Merging..." + /usr/libexec/PlistBuddy "$DVTFountain_Path/DVTFoundation.xcplugindata" -c "Merge $Script_Path/AdditionalLanguages.plist plug-in:extensions" + + # Copy in the xclangspecs for the languages (assumes in same directory as this shell script) + cp "$Script_Path/Logos.xclangspec" "$DVTFountain_Path" + + # Remove any cached Xcode plugins + rm -rf /private/var/folders/*/*/*/com.apple.DeveloperTools/*/Xcode/PlugInCache.xcplugincache + + # Final message + echo "Sucessfully Installed." + echo "Syntax coloring must be manually selected from the Editor - Syntax Coloring menu in Xcode." + exit 0 + ;; + [Nn]*) + echo "Exiting..." + exit 1 + ;; + *) + ;; + esac +done diff --git a/Logos-Xcode/src/xclangspec_generator.py b/Logos-Xcode/src/xclangspec_generator.py new file mode 100755 index 0000000..12aeb07 --- /dev/null +++ b/Logos-Xcode/src/xclangspec_generator.py @@ -0,0 +1,91 @@ +''' +# +# Run with python3 +# Script that generates the Logos xclangspec +# +# xclangspec_generator is a script created by pr0crustes (https://github.com/pr0crustes) +# that is provided as it is, without any warranty. +# pr0crustes @ 2018 - all rights reserved. +# +''' +import os + +global_new_keywords = [ + "// Start Logos Keywords", + "%group", + "%hook", + "%new", + "%subclass", + "%property", + "%end", + "%config", + "%hookf", + "%ctor", + "%dtor", + "%init", + "%class", + "%c", + "%orig", + "%log", + "// End Logos Keywords", + "// Start Other Keywords", + "NSLog", + "NSString", + "NSInteger", + "NSObject", + "// End Other Keywords" +] + + +global_ident1 = "Words = (" +global_ident2 = "Chars = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\";" +global_ident3 = "StartChars = \"@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_\";" + + +class XClangGenerator(object): + + def __init__(self): + self.objc_spec_file = "/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/ObjectiveC.xclangspec" + self.objc_spec_content = [] + self.new_lines = [] + + def __get_loaded_file(self): + print("Reading File...") + for line in open(self.objc_spec_file, 'r'): + if line.strip() and not line.strip().startswith("/"): + self.objc_spec_content.append(line) + + def __get_parsed_file(self): + print("Parsing File...") + for i in range(len(self.objc_spec_content)): + line = self.objc_spec_content[i].replace("objc", "logos") + self.new_lines.append(line) + if global_ident1 in line and i > 3 and global_ident2 in self.objc_spec_content[i-1] and global_ident3 in self.objc_spec_content[i-2]: + print("Inserting Logos Keywords Into New File...") + for new_word in global_new_keywords: + if new_word.strip().startswith("//"): + self.new_lines.append("\t\t\t\t" + new_word + "\n") + else: + self.new_lines.append("\t\t\t\t\"" + new_word + "\",\n") + + def __save_file(self): + print("Saving New File...") + with open("Logos.xclangspec", "w") as file: + file.write("// Logos xclangspec was generated by spec_gen\n") + file.write("// Script made by pr0crustes\n") + for line in self.new_lines: + file.write(line) + + def execute(self): + self.__get_loaded_file() + self.__get_parsed_file() + self.__save_file() + print("XClangSpec Generator was successfully runned.") + + +if __name__ == '__main__': + + os.rename("/opt/MonkeyDev/Logos-Xcode/src/Logos.xc", "/opt/MonkeyDev/Logos-Xcode/src/Logos.xclangspec") + gen = XClangGenerator() + gen.execute() + diff --git a/bin/md-install b/bin/md-install index bfbb882..000bd27 100755 --- a/bin/md-install +++ b/bin/md-install @@ -295,6 +295,18 @@ function writeDictToSpecification(){ #args: filePath, content /usr/libexec/PlistBuddy -x -c "merge $tempfile 0" "$filePath" > /dev/null } +# 安裝Logos語法高亮 +function installXcode10LogosSupports(){ + + echo "install Xcode10 Logos Supports..." + chmod +x $MonkeyDevPath/Logos-Xcode/src/xclangspec_generator.py + python $MonkeyDevPath/Logos-Xcode/src/xclangspec_generator.py + chmod +x $MonkeyDevPath/Logos-Xcode/src/install.sh + sudo sh -x $MonkeyDevPath/Logos-Xcode/src/install.sh + +} + + # start it # 创建/opt/MonkeyDev mkdir -p "$MonkeyDevPath" || \ @@ -374,4 +386,6 @@ if [[ $hasProductTypeForCommandLineTool != "true" ]]; then writeDictToSpecification "$specificationFile" "$toolDict" fi +installXcode10LogosSupports + exit 0 From b338d0cacf0b89956ef6c6316941adae1fa7e00d Mon Sep 17 00:00:00 2001 From: anonymouz4 <32394757+anonymouz4@users.noreply.github.com> Date: Mon, 13 May 2019 01:01:01 +0200 Subject: [PATCH 2/4] Support for XMI File --- bin/md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/bin/md b/bin/md index 6a42535..1020fe6 100755 --- a/bin/md +++ b/bin/md @@ -16,6 +16,8 @@ export DefaultDeviceIP="localhost" #默认端口号 export DefaultDevicePort="22" + + export userName="${SUDO_USER-$USER}" export userGroup=`id -g $userName` export userHome=`eval echo ~$userName` @@ -652,6 +654,19 @@ function Processor() if [[ $currentDirectory =~ "Build/Products" ]] || [[ $currentDirectory =~ "Build/Intermediates" ]] || [[ $currentDirectory =~ "Index/DataStore" ]] || [[ $currentDirectory =~ "/LatestBuild/" ]]; then return fi + + if [[ -f "$currentDirectory" ]] || [[ "${currentDirectory#*.}" == "mmi" ]]; then + + specialDir="$(dirname "${currentDirectory}")" + specialFile="$(basename "${currentDirectory}")" + + # used for .xmi files + echo "Logos Processor: $specialFile -> ${specialFile%.*}.mm..." + logosStdErr=$(("$logosProcessor" "$currentDirectory" > "${currentDirectory%.*}.mm") 2>&1) || \ + panic $? "Failed Logos Processor: $logosStdErr" + + return + fi for file in `ls "$currentDirectory"`; do @@ -708,7 +723,48 @@ function xcodeBuildPhase_Logos() # no args # for each *.xm project file, use Logos Processor to generate *.mm file - Processor "$logosProcessor" "$PROJECT_DIR" + + if [[ "$MonkeyDevUseXMI" == "YES" ]]; then + + # Search for the .xmi file + pathToXMI=$(find "$PROJECT_DIR" -type f -name "*.xmi" | head -n 1) + if [[ "$pathToXMI" == "" ]]; then + panic 1 "MonkeyDevUseXMI Setting is enabled, but no .xmi file found." + fi + + #Preprocess .xmi and output to .mmi + specialDir="$(dirname "${pathToXMI}")" + specialFile="$(basename "${pathToXMI}")" + tempPathToMMI="$specialDir/${specialFile%.*}.mmi.temp" + pathToMMI="$specialDir/${specialFile%.*}.mmi" + + # Replace '#import' with '//#import' + mod1Err=$((sed -e 's/#import/\/\/#import/' "$pathToXMI" > "$tempPathToMMI") 2>&1) || \ + panic $? "Replacing '#import' with '//#import' failed: $mod1Err" + + + logosStdErr=$((g++ -E -CC -P -x objective-c "$tempPathToMMI"> "$pathToMMI") 2>&1) || \ + panic $? "Failed Preprocessing .xmi: $logosStdErr" + + # Delete Temp File + rm "$tempPathToMMI" + + # Replace '//#import' with '#import' + mod2Err=$((sed -i -e 's/\/\/#import/#import/' "$pathToMMI") 2>&1) || \ + panic $? "Replacing '//#import' with '#import' failed: $mod2Err" + + + Processor "$logosProcessor" "$pathToMMI" + + # Delete .MMI File + rm "$pathToMMI" + else + Processor "$logosProcessor" "$PROJECT_DIR" + fi + + + + echo "Note: If any *.xm or *.x file generated above by the Logos Processor (${projectXmFiles[@]}) is not being compiled below, then you must add it to the Xcode project to be compiled." @@ -849,7 +905,7 @@ function xcodeBuildPhase() # no args runFuncOnDevice "respring" "$MonkeyDevDeviceIP" "$MonkeyDevDevicePort" else echo "killall -9 $MonkeyDevkillProcessOnInstall" - runFuncOnDevice "killall -9 $MonkeyDevkillProcessOnInstall || echo skip" "$MonkeyDevDeviceIP" "$MonkeyDevDevicePort" + runFuncOnDevice "killall -9 $MonkeyDevkillProcessOnInstall || echo skip" "$MonkeyDevDeviceIP" "$MonkeyDevDevicePort" fi fi From 5b63ac662d53f9782cf0901f9f6fd43805dff17d Mon Sep 17 00:00:00 2001 From: anonymouz4 <32394757+anonymouz4@users.noreply.github.com> Date: Wed, 15 May 2019 00:05:20 +0200 Subject: [PATCH 3/4] Optimisation --- bin/md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/md b/bin/md index 1020fe6..4726962 100755 --- a/bin/md +++ b/bin/md @@ -739,25 +739,25 @@ function xcodeBuildPhase_Logos() # no args pathToMMI="$specialDir/${specialFile%.*}.mmi" # Replace '#import' with '//#import' - mod1Err=$((sed -e 's/#import/\/\/#import/' "$pathToXMI" > "$tempPathToMMI") 2>&1) || \ + mod1Err=$((sed -e 's/#import/\/\/#import/g' "$pathToXMI" > "$tempPathToMMI") 2>&1) || \ panic $? "Replacing '#import' with '//#import' failed: $mod1Err" - + # Preprocessing logosStdErr=$((g++ -E -CC -P -x objective-c "$tempPathToMMI"> "$pathToMMI") 2>&1) || \ panic $? "Failed Preprocessing .xmi: $logosStdErr" # Delete Temp File rm "$tempPathToMMI" - # Replace '//#import' with '#import' - mod2Err=$((sed -i -e 's/\/\/#import/#import/' "$pathToMMI") 2>&1) || \ + # Replace '//#import' with '#import' (using perl bc sed creates a backup file) + mod2Err=$((perl -pi -e 's/\/\/#import/#import/g' "$pathToMMI") 2>&1) || \ panic $? "Replacing '//#import' with '#import' failed: $mod2Err" - Processor "$logosProcessor" "$pathToMMI" - + # Delete .MMI File rm "$pathToMMI" + else Processor "$logosProcessor" "$PROJECT_DIR" fi From c7fe39ea14bfa17b6d39b88b6394aafade8aac75 Mon Sep 17 00:00:00 2001 From: drugiiebbyx <78960427+drugiiebbyx@users.noreply.github.com> Date: Sat, 13 Feb 2021 07:15:43 +0800 Subject: [PATCH 4/4] tweak --- Resource/TargetApp.app/AppIcon60x60@2x.png | Bin 16354 -> 0 bytes Resource/TargetApp.app/AppIcon60x60@3x.png | Bin 25609 -> 0 bytes Resource/TargetApp.app/Assets.car | Bin 33880 -> 0 bytes .../01J-lp-oVM-view-Ze5-6b-2t3.nib | Bin 1793 -> 0 bytes .../LaunchScreen.storyboardc/Info.plist | Bin 258 -> 0 bytes .../UIViewController-01J-lp-oVM.nib | Bin 832 -> 0 bytes .../BYZ-38-t0r-view-8bC-Xf-vdC.nib | Bin 5171 -> 0 bytes .../Base.lproj/Main.storyboardc/Info.plist | Bin 258 -> 0 bytes .../UIViewController-BYZ-38-t0r.nib | Bin 970 -> 0 bytes Resource/TargetApp.app/Info.plist | Bin 1246 -> 0 bytes Resource/TargetApp.app/PkgInfo | 1 - Resource/TargetApp.app/TargetApp | Bin 198096 -> 0 bytes include/CaptainHook/CaptainHook.h | 759 ------------------ 13 files changed, 760 deletions(-) delete mode 100644 Resource/TargetApp.app/AppIcon60x60@2x.png delete mode 100644 Resource/TargetApp.app/AppIcon60x60@3x.png delete mode 100644 Resource/TargetApp.app/Assets.car delete mode 100644 Resource/TargetApp.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib delete mode 100644 Resource/TargetApp.app/Base.lproj/LaunchScreen.storyboardc/Info.plist delete mode 100644 Resource/TargetApp.app/Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib delete mode 100644 Resource/TargetApp.app/Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib delete mode 100644 Resource/TargetApp.app/Base.lproj/Main.storyboardc/Info.plist delete mode 100644 Resource/TargetApp.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib delete mode 100644 Resource/TargetApp.app/Info.plist delete mode 100644 Resource/TargetApp.app/PkgInfo delete mode 100755 Resource/TargetApp.app/TargetApp delete mode 100755 include/CaptainHook/CaptainHook.h diff --git a/Resource/TargetApp.app/AppIcon60x60@2x.png b/Resource/TargetApp.app/AppIcon60x60@2x.png deleted file mode 100644 index 9270fe65d7e827b41d063e207cfbf209e0b8ea19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16354 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 diff --git a/Resource/TargetApp.app/AppIcon60x60@3x.png b/Resource/TargetApp.app/AppIcon60x60@3x.png deleted file mode 100644 index dc944c0dad0b65c82c5260420aa9feee50930a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25609 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 diff --git a/Resource/TargetApp.app/Assets.car b/Resource/TargetApp.app/Assets.car deleted file mode 100644 index 174c7a30f1d37153f9cf38bfe36135352a7956e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33880 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 NZh>(N{6A%Z{{t|TZD{}i diff --git a/Resource/TargetApp.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib b/Resource/TargetApp.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib deleted file mode 100644 index d7332ac3f424e891ee4474bb1181aefcc9d75c2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 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 diff --git a/Resource/TargetApp.app/Base.lproj/Main.storyboardc/Info.plist b/Resource/TargetApp.app/Base.lproj/Main.storyboardc/Info.plist deleted file mode 100644 index 9a41f2cb91b33c655127099449c0f7903f304b2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmYc)$jK}&F)+By$i&RT&Ji!58tNIAnOg3gpI1_ppOceXM6S{yH+73vvWl3!Grl%H6X;*wgNnVy$elA7WQ)K(dgpP5&J&=)TtjI1~eXi{c= z-bGfncmZj2+jN~GqjZfebW041D3KLl>b diff --git a/Resource/TargetApp.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib b/Resource/TargetApp.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib deleted file mode 100644 index 39be4de63edb8644b8a428ba879c694d058f3091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 970 zcmaJ=OHbQC5OyE5>Gu8l8AhmFxIzHQYLrlnf%Z^oZ4Y59$4=Ml1mCjRgd{*96bda; zxj>~#{Vn}Zon2aJd+1?4?|w78^Ucnb82SCskjnfmBBKe6eF6ZWm{dAr&m9f+g{>=aiYhl+;VmfT-fXgFvJ& zAwM$wGE12s!3vARq^arMvg^bViy>U5Q3mIpGq)jt$MpBnC5rL$314Q=EG0B#arMA+ zDx6g@VRR|x&|E(k2T2Hgu2vU0UVdiC=^%g<)3S((yqLsmteSD7RSWoNVsK&dFHpuc ziz%=Q431GgR;9Uq*&X+D0qJMsT;h}oS0tQPp~O;CeW-hf!6+DZD(S|&L-_wtCbPaBegl!CXevjA_P$p zJz^tr&mc~d)gw<4_sIi9NggBi$z4QL=sEvt+0mjSNGr`4_~zKa+&Lfxj31COgZlnq z;bi9Z8+&rf78BfVU_thjU$j@(>_%Ap-?6RqveIGUu$bYt_O}Lo`k6_j{|CLhX?D7} zHo1=2GIErWHf)vMS!UW!d2XGwJZCY(w$-4Li3r5iR9L&{(+$oq+G`E)s4Ffjj81~GhDRhBM0;MH{l=2y9YwRs-2rVC*H36%eW{K@=sJ2+M_U!Hmdu(iP znnj}Gf{LorUQpp0;DFR$fYg7`N(fF!Nae-hbP959R1=e`Iw>}D}H_a zL}~KWH{YI_w(<7qF7w=3;&d3Nb4K5@@vh3ubeFpx)#wuSg3zZtnWt?Qa2t>0x%11^ z=_aJ<(I4}W?gTtu2hm+o$Xbj>Hs13N#9M*JoJ4dZQE!1pvA8wz?Dxc{Vy)b*5$7st zQ?nO}=x81_Izg0Vl|~XV-d>;VhM`DPx8{+g6-2(+Xeh7Dihj_{O5lggOE(+R%pBT( z|CKd=b(`U}z*@bbeb+}{)=Y6tfpyJXbOM()GMkY(QZ?r3wJwWjtk*h0O0$jeEaS}Y z`g2Cs@rtDjvYA6?h|j#9jdxmlm2|n&F_IwaH3Jg4tK00b^jX6AT6ji0!^UHlo{e!= z8&yb1n#^Mfqk@6GmTu(4=sclOi#T*HVnQI2N+BQz-v{}bg~Y9^r3-3NEzVPZ*(6b$ zCgm`Ew)gY(qD9OX(x$)R`M&)J4%v7(=Rb|5`-*XReJp+2%E5+cl_E;Ya!ILYj`)sF z;LF4l)cFCwN_+CVxkgD=%yO+(HB?zy`ErqE1Yc5Zysuvsh8~s0t*><~d)|^SJ09U} zS+$h~^+ZKgCKp+l>Jr4Js>;Pi?xl{YOcfPts&ZUuZZ=NJ%7c?r7+~1Qq;VojxtYqb za@r!1zcl&q?76ay$1Qy$l565$Mua6c-oG)RO1K+4B&1c^5~u_3LCv#vCwX+Xl8&6% z7@Lo@!kD>K3x49#CaEmdrC7Qx{VDw={Ug1Q-hcv_0H?rtPzNn=9ozzcfP3H(cmnL88+ n6r&}yjIN_!&~NB>bQj%6PtdD@!GVI*KM<^1Ny}_z21@?}B!-rD diff --git a/Resource/TargetApp.app/PkgInfo b/Resource/TargetApp.app/PkgInfo deleted file mode 100644 index bd04210..0000000 --- a/Resource/TargetApp.app/PkgInfo +++ /dev/null @@ -1 +0,0 @@ -APPL???? \ No newline at end of file diff --git a/Resource/TargetApp.app/TargetApp b/Resource/TargetApp.app/TargetApp deleted file mode 100755 index 9010797fc5e04ab7ff2dd1e175f21a3dff33b950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198096 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 D>sP5( diff --git a/include/CaptainHook/CaptainHook.h b/include/CaptainHook/CaptainHook.h deleted file mode 100755 index 3d144cb..0000000 --- a/include/CaptainHook/CaptainHook.h +++ /dev/null @@ -1,759 +0,0 @@ -// Possible defines: -// CHDebug if defined, CHDebugLog is equivalent to CHLog; else, emits no code -// CHUseSubstrate if defined, uses MSMessageHookEx to hook methods, otherwise uses internal hooking routines. Warning! super call closures are only available on ARM platforms for recent releases of MobileSubstrate -// CHEnableProfiling if defined, enables calls to CHProfileScope() -// CHAppName should be set to the name of the application (if not, defaults to "CaptainHook"); used for logging and profiling - -#import -#import -#import -#import - -#ifndef CHAppName -#define CHAppName "CaptainHook" -#endif - -#ifdef __clang__ -#if __has_feature(objc_arc) -#define CHHasARC -#endif -#endif - -// Some Debugging/Logging Commands - -#define CHStringify_(x) #x -#define CHStringify(x) CHStringify_(x) -#define CHConcat_(a, b) a ## b -#define CHConcat(a, b) CHConcat_(a, b) - -#define CHNothing() do { } while(0) - -#define CHLocationInSource [NSString stringWithFormat:@CHStringify(__LINE__) " in %s", __FUNCTION__] - -#define CHLog(args...) NSLog(@CHAppName ": %@", [NSString stringWithFormat:args]) -#define CHLogSource(args...) NSLog(@CHAppName " @ " CHStringify(__LINE__) " in %s: %@", __FUNCTION__, [NSString stringWithFormat:args]) - -#ifdef CHDebug - #define CHDebugLog(args...) CHLog(args) - #define CHDebugLogSource(args...) CHLogSource(args) -#else - #define CHDebugLog(args...) CHNothing() - #define CHDebugLogSource(args...) CHNothing() -#endif - -// Constructor -#define CHConstructor static __attribute__((constructor)) void CHConcat(CHConstructor, __LINE__)() -#define CHInline inline __attribute__((always_inline)) - -// Cached Class Declaration (allows hooking methods, and fast lookup of classes) -struct CHClassDeclaration_ { - Class class_; - Class metaClass_; - Class superClass_; -}; -typedef struct CHClassDeclaration_ CHClassDeclaration_; -#define CHDeclareClass(name) \ - @class name; \ - static CHClassDeclaration_ name ## $; - -// Loading Cached Classes (use CHLoadClass when class is linkable, CHLoadLateClass when it isn't) -static inline Class CHLoadClass_(CHClassDeclaration_ *declaration, Class value) -{ - declaration->class_ = value; - declaration->metaClass_ = object_getClass(value); - declaration->superClass_ = class_getSuperclass(value); - return value; -} -#define CHLoadLateClass(name) CHLoadClass_(&name ## $, objc_getClass(#name)) -#define CHLoadClass(name) CHLoadClass_(&name ## $, [name class]) - -// Quick Lookup of cached classes, and common methods on them -#define CHClass(name) name ## $.class_ -#define CHMetaClass(name) name ## $.metaClass_ -#define CHSuperClass(name) name ## $.superClass_ -#define CHAlloc(name) ((name *)[CHClass(name) alloc]) -#define CHSharedInstance(name) ((name *)[CHClass(name) sharedInstance]) -#define CHIsClass(obj, name) [obj isKindOfClass:CHClass(name)] -#define CHRespondsTo(obj, sel) [obj respondsToSelector:@selector(sel)] - -// Replacement Method Definition -#define CHDeclareSig0_(return_type) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - char sig[return_len+2+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - sig[return_len+2] = '\0'; -#define CHDeclareSig1_(return_type, type1) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - char sig[return_len+2+type1_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - sig[return_len+type1_len+2] = '\0'; -#define CHDeclareSig2_(return_type, type1, type2) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - char sig[return_len+2+type1_len+type2_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - sig[return_len+type1_len+type2_len+2] = '\0'; -#define CHDeclareSig3_(return_type, type1, type2, type3) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - const char *type3_ = @encode(type3); \ - size_t type3_len = __builtin_strlen(type3_); \ - char sig[return_len+2+type1_len+type2_len+type3_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len], type3_, type3_len); \ - sig[return_len+type1_len+type2_len+type3_len+2] = '\0'; -#define CHDeclareSig4_(return_type, type1, type2, type3, type4) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - const char *type3_ = @encode(type3); \ - size_t type3_len = __builtin_strlen(type3_); \ - const char *type4_ = @encode(type4); \ - size_t type4_len = __builtin_strlen(type4_); \ - char sig[return_len+2+type1_len+type2_len+type3_len+type4_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len], type3_, type3_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len], type4_, type4_len); \ - sig[return_len+type1_len+type2_len+type3_len+type4_len+2] = '\0'; -#define CHDeclareSig5_(return_type, type1, type2, type3, type4, type5) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - const char *type3_ = @encode(type3); \ - size_t type3_len = __builtin_strlen(type3_); \ - const char *type4_ = @encode(type4); \ - size_t type4_len = __builtin_strlen(type4_); \ - const char *type5_ = @encode(type5); \ - size_t type5_len = __builtin_strlen(type5_); \ - char sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len], type3_, type3_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len], type4_, type4_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len], type5_, type5_len); \ - sig[return_len+type1_len+type2_len+type3_len+type4_len+type5_len+2] = '\0'; -#define CHDeclareSig6_(return_type, type1, type2, type3, type4, type5, type6) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - const char *type3_ = @encode(type3); \ - size_t type3_len = __builtin_strlen(type3_); \ - const char *type4_ = @encode(type4); \ - size_t type4_len = __builtin_strlen(type4_); \ - const char *type5_ = @encode(type5); \ - size_t type5_len = __builtin_strlen(type5_); \ - const char *type6_ = @encode(type6); \ - size_t type6_len = __builtin_strlen(type6_); \ - char sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len], type3_, type3_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len], type4_, type4_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len], type5_, type5_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len], type6_, type6_len); \ - sig[return_len+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+2] = '\0'; -#define CHDeclareSig7_(return_type, type1, type2, type3, type4, type5, type6, type7) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - const char *type3_ = @encode(type3); \ - size_t type3_len = __builtin_strlen(type3_); \ - const char *type4_ = @encode(type4); \ - size_t type4_len = __builtin_strlen(type4_); \ - const char *type5_ = @encode(type5); \ - size_t type5_len = __builtin_strlen(type5_); \ - const char *type6_ = @encode(type6); \ - size_t type6_len = __builtin_strlen(type6_); \ - const char *type7_ = @encode(type7); \ - size_t type7_len = __builtin_strlen(type7_); \ - char sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len], type3_, type3_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len], type4_, type4_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len], type5_, type5_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len], type6_, type6_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len], type7_, type7_len); \ - sig[return_len+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len+2] = '\0'; -#define CHDeclareSig8_(return_type, type1, type2, type3, type4, type5, type6, type7, type8) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - const char *type3_ = @encode(type3); \ - size_t type3_len = __builtin_strlen(type3_); \ - const char *type4_ = @encode(type4); \ - size_t type4_len = __builtin_strlen(type4_); \ - const char *type5_ = @encode(type5); \ - size_t type5_len = __builtin_strlen(type5_); \ - const char *type6_ = @encode(type6); \ - size_t type6_len = __builtin_strlen(type6_); \ - const char *type7_ = @encode(type7); \ - size_t type7_len = __builtin_strlen(type7_); \ - const char *type8_ = @encode(type8); \ - size_t type8_len = __builtin_strlen(type8_); \ - char sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len+type8_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len], type3_, type3_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len], type4_, type4_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len], type5_, type5_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len], type6_, type6_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len], type7_, type7_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len], type8_, type8_len); \ - sig[return_len+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len+type8_len+2] = '\0'; -#define CHDeclareSig9_(return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9) \ - const char *return_ = @encode(return_type); \ - size_t return_len = __builtin_strlen(return_); \ - const char *type1_ = @encode(type1); \ - size_t type1_len = __builtin_strlen(type1_); \ - const char *type2_ = @encode(type2); \ - size_t type2_len = __builtin_strlen(type2_); \ - const char *type3_ = @encode(type3); \ - size_t type3_len = __builtin_strlen(type3_); \ - const char *type4_ = @encode(type4); \ - size_t type4_len = __builtin_strlen(type4_); \ - const char *type5_ = @encode(type5); \ - size_t type5_len = __builtin_strlen(type5_); \ - const char *type6_ = @encode(type6); \ - size_t type6_len = __builtin_strlen(type6_); \ - const char *type7_ = @encode(type7); \ - size_t type7_len = __builtin_strlen(type7_); \ - const char *type8_ = @encode(type8); \ - size_t type8_len = __builtin_strlen(type8_); \ - const char *type9_ = @encode(type9); \ - size_t type9_len = __builtin_strlen(type9_); \ - char sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len+type8_len+type9_len+1]; \ - __builtin_memcpy(sig, return_, return_len); \ - sig[return_len] = _C_ID; \ - sig[return_len+1] = _C_SEL; \ - __builtin_memcpy(&sig[return_len+2], type1_, type1_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len], type2_, type2_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len], type3_, type3_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len], type4_, type4_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len], type5_, type5_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len], type6_, type6_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len], type7_, type7_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len], type8_, type8_len); \ - __builtin_memcpy(&sig[return_len+2+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len+type8_len], type9_, type9_len); \ - sig[return_len+type1_len+type2_len+type3_len+type4_len+type5_len+type6_len+type7_len+type8_len+type9_len+2] = '\0'; - -#ifdef CHUseSubstrate -#import -#define CHMethod_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type (*$ ## class_name ## _ ## name ## _super)(class_type self, SEL _cmd, ##args); \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - if (class_val) { \ - MSHookMessageEx(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, (IMP *)&$ ## class_name ## _ ## name ## _super); \ - if (!$ ## class_name ## _ ## name ## _super) { \ - sigdef; \ - class_addMethod(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, sig); \ - } \ - } \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#define CHMethod_new_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - sigdef; \ - class_addMethod(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, sig); \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#define CHMethod_super_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type (*$ ## class_name ## _ ## name ## _super)(class_type self, SEL _cmd, ##args); \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - if (class_val) { \ - MSHookMessageEx(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, (IMP *)&$ ## class_name ## _ ## name ## _super); \ - } \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#define CHMethod_self_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type (*$ ## class_name ## _ ## name ## _super)(class_type self, SEL _cmd, ##args); \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - if (class_val) { \ - MSHookMessageEx(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, (IMP *)&$ ## class_name ## _ ## name ## _super); \ - } \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#else -#define CHMethod_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type (*$ ## class_name ## _ ## name ## _super)(class_type self, SEL _cmd, ##args); \ - static return_type $ ## class_name ## _ ## name ## _closure(class_type self, SEL _cmd, ##args) { \ - typedef return_type (*supType)(class_type, SEL, ## args); \ - supType supFn = (supType)class_getMethodImplementation(super_class_val, _cmd); \ - return supFn supercall; \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - Method method = class_getInstanceMethod(class_val, @selector(sel)); \ - if (method) { \ - $ ## class_name ## _ ## name ## _super = (__typeof__($ ## class_name ## _ ## name ## _super))method_getImplementation(method); \ - if (class_addMethod(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, method_getTypeEncoding(method))) { \ - $ ## class_name ## _ ## name ## _super = &$ ## class_name ## _ ## name ## _closure; \ - } else { \ - method_setImplementation(method, (IMP)&$ ## class_name ## _ ## name ## _method); \ - } \ - } else { \ - sigdef; \ - class_addMethod(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, sig); \ - } \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#define CHMethod_new_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - sigdef; \ - class_addMethod(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, sig); \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#define CHMethod_super_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type (*$ ## class_name ## _ ## name ## _super)(class_type self, SEL _cmd, ##args); \ - static return_type $ ## class_name ## _ ## name ## _closure(class_type self, SEL _cmd, ##args) { \ - typedef return_type (*supType)(class_type, SEL, ## args); \ - supType supFn = (supType)class_getMethodImplementation(super_class_val, _cmd); \ - return supFn supercall; \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - Method method = class_getInstanceMethod(class_val, @selector(sel)); \ - if (method) { \ - $ ## class_name ## _ ## name ## _super = (__typeof__($ ## class_name ## _ ## name ## _super))method_getImplementation(method); \ - if (class_addMethod(class_val, @selector(sel), (IMP)&$ ## class_name ## _ ## name ## _method, method_getTypeEncoding(method))) { \ - $ ## class_name ## _ ## name ## _super = &$ ## class_name ## _ ## name ## _closure; \ - } else { \ - method_setImplementation(method, (IMP)&$ ## class_name ## _ ## name ## _method); \ - } \ - } \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#define CHMethod_self_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static return_type (*$ ## class_name ## _ ## name ## _super)(class_type self, SEL _cmd, ##args); \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args); \ - __attribute__((always_inline)) \ - static inline void $ ## class_name ## _ ## name ## _register() { \ - Method method = class_getInstanceMethod(class_val, @selector(sel)); \ - if (method) { \ - $ ## class_name ## _ ## name ## _super = (__typeof__($ ## class_name ## _ ## name ## _super))method_getImplementation(method); \ - method_setImplementation(method, (IMP)&$ ## class_name ## _ ## name ## _method); \ - } \ - } \ - static return_type $ ## class_name ## _ ## name ## _method(class_type self, SEL _cmd, ##args) -#endif -#define CHMethod(count, args...) \ - CHMethod ## count(args) -#define CHMethod0(return_type, class_type, name) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name, name, CHDeclareSig0_(return_type), (self, _cmd)) -#define CHMethod1(return_type, class_type, name1, type1, arg1) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $, name1:, CHDeclareSig1_(return_type, type1), (self, _cmd, arg1), type1 arg1) -#define CHMethod2(return_type, class_type, name1, type1, arg1, name2, type2, arg2) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $, name1:name2:, CHDeclareSig2_(return_type, type1, type2), (self, _cmd, arg1, arg2), type1 arg1, type2 arg2) -#define CHMethod3(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $, name1:name2:name3:, CHDeclareSig3_(return_type, type1, type2, type3), (self, _cmd, arg1, arg2, arg3), type1 arg1, type2 arg2, type3 arg3) -#define CHMethod4(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $, name1:name2:name3:name4:, CHDeclareSig4_(return_type, type1, type2, type3, type4), (self, _cmd, arg1, arg2, arg3, arg4), type1 arg1, type2 arg2, type3 arg3, type4 arg4) -#define CHMethod5(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $, name1:name2:name3:name4:name5:, CHDeclareSig5_(return_type, type1, type2, type3, type4, type5), (self, _cmd, arg1, arg2, arg3, arg4, arg5), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) -#define CHMethod6(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $, name1:name2:name3:name4:name5:name6:, CHDeclareSig6_(return_type, type1, type2, type3, type4, type5, type6), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) -#define CHMethod7(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $, name1:name2:name3:name4:name5:name6:name7:, CHDeclareSig7_(return_type, type1, type2, type3, type4, type5, type6, type7), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7) -#define CHMethod8(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $, name1:name2:name3:name4:name5:name6:name7:name8:, CHDeclareSig8_(return_type, type1, type2, type3, type4, type5, type6, type7, type8), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8) -#define CHMethod9(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8, name9, type9, arg9) \ - CHMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $, name1:name2:name3:name4:name5:name6:name7:name8:name9:, CHDeclareSig9_(return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8, type9 arg9) -#define CHClassMethod(count, args...) \ - CHClassMethod ## count(args) -#define CHClassMethod0(return_type, class_type, name) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name, name, CHDeclareSig0_(return_type), (self, _cmd)) -#define CHClassMethod1(return_type, class_type, name1, type1, arg1) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $, name1:, CHDeclareSig1_(return_type, type1), (self, _cmd, arg1), type1 arg1) -#define CHClassMethod2(return_type, class_type, name1, type1, arg1, name2, type2, arg2) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $, name1:name2:, CHDeclareSig2_(return_type, type1, type2), (self, _cmd, arg1, arg2), type1 arg1, type2 arg2) -#define CHClassMethod3(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $, name1:name2:name3:, CHDeclareSig3_(return_type, type1, type2, type3), (self, _cmd, arg1, arg2, arg3), type1 arg1, type2 arg2, type3 arg3) -#define CHClassMethod4(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $, name1:name2:name3:name4:, CHDeclareSig4_(return_type, type1, type2, type3, type4), (self, _cmd, arg1, arg2, arg3, arg4), type1 arg1, type2 arg2, type3 arg3, type4 arg4) -#define CHClassMethod5(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $, name1:name2:name3:name4:name5:, CHDeclareSig5_(return_type, type1, type2, type3, type4, type5), (self, _cmd, arg1, arg2, arg3, arg4, arg5), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) -#define CHClassMethod6(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $, name1:name2:name3:name4:name5:name6:, CHDeclareSig6_(return_type, type1, type2, type3, type4, type5, type6), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) -#define CHClassMethod7(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $, name1:name2:name3:name4:name5:name6:name7:, CHDeclareSig7_(return_type, type1, type2, type3, type4, type5, type6, type7), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7) -#define CHClassMethod8(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $, name1:name2:name3:name4:name5:name6:name7:name8:, CHDeclareSig8_(return_type, type1, type2, type3, type4, type5, type6, type7, type8), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8) -#define CHClassMethod9(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8, name9, type9, arg9) \ - CHMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $, name1:name2:name3:name4:name5:name6:name7:name8:name9:, CHDeclareSig9_(return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8, type9 arg9) -#define CHOptimizedMethod(count, args...) \ - CHOptimizedMethod ## count(args) -#define CHOptimizedMethod0(optimization, return_type, class_type, name) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name, name, CHDeclareSig0_(return_type), (self, _cmd)) -#define CHOptimizedMethod1(optimization, return_type, class_type, name1, type1, arg1) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $, name1:, CHDeclareSig1_(return_type, type1), (self, _cmd, arg1), type1 arg1) -#define CHOptimizedMethod2(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $, name1:name2:, CHDeclareSig2_(return_type, type1, type2), (self, _cmd, arg1, arg2), type1 arg1, type2 arg2) -#define CHOptimizedMethod3(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $, name1:name2:name3:, CHDeclareSig3_(return_type, type1, type2, type3), (self, _cmd, arg1, arg2, arg3), type1 arg1, type2 arg2, type3 arg3) -#define CHOptimizedMethod4(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $, name1:name2:name3:name4:, CHDeclareSig4_(return_type, type1, type2, type3, type4), (self, _cmd, arg1, arg2, arg3, arg4), type1 arg1, type2 arg2, type3 arg3, type4 arg4) -#define CHOptimizedMethod5(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $, name1:name2:name3:name4:name5:, CHDeclareSig5_(return_type, type1, type2, type3, type4, type5), (self, _cmd, arg1, arg2, arg3, arg4, arg5), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) -#define CHOptimizedMethod6(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $, name1:name2:name3:name4:name5:name6:, CHDeclareSig6_(return_type, type1, type2, type3, type4, type5, type6), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) -#define CHOptimizedMethod7(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $, name1:name2:name3:name4:name5:name6:name7:, CHDeclareSig7_(return_type, type1, type2, type3, type4, type5, type6, type7), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7) -#define CHOptimizedMethod8(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $, name1:name2:name3:name4:name5:name6:name7:name8:, CHDeclareSig8_(return_type, type1, type2, type3, type4, type5, type6, type7, type8), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8) -#define CHOptimizedMethod9(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8, name9, type9, arg9) \ - CHMethod_ ## optimization ## _(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $, name1:name2:name3:name4:name5:name6:name7:name8:name9:, CHDeclareSig9_(return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8, type9 arg9) -#define CHOptimizedClassMethod(count, args...) \ - CHOptimizedClassMethod ## count(args) -#define CHOptimizedClassMethod0(optimization, return_type, class_type, name) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name, name, CHDeclareSig0_(return_type), (self, _cmd)) -#define CHOptimizedClassMethod1(optimization, return_type, class_type, name1, type1, arg1) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $, name1:, CHDeclareSig1_(return_type, type1), (self, _cmd, arg1), type1 arg1) -#define CHOptimizedClassMethod2(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $, name1:name2:, CHDeclareSig2_(return_type, type1, type2), (self, _cmd, arg1, arg2), type1 arg1, type2 arg2) -#define CHOptimizedClassMethod3(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $, name1:name2:name3:, CHDeclareSig3_(return_type, type1, type2, type3), (self, _cmd, arg1, arg2, arg3), type1 arg1, type2 arg2, type3 arg3) -#define CHOptimizedClassMethod4(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $, name1:name2:name3:name4:, CHDeclareSig4_(return_type, type1, type2, type3, type4), (self, _cmd, arg1, arg2, arg3, arg4), type1 arg1, type2 arg2, type3 arg3, type4 arg4) -#define CHOptimizedClassMethod5(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $, name1:name2:name3:name4:name5:, CHDeclareSig5_(return_type, type1, type2, type3, type4, type5), (self, _cmd, arg1, arg2, arg3, arg4, arg5), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) -#define CHOptimizedClassMethod6(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $, name1:name2:name3:name4:name5:name6:, CHDeclareSig6_(return_type, type1, type2, type3, type4, type5, type6), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) -#define CHOptimizedClassMethod7(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $, name1:name2:name3:name4:name5:name6:name7:, CHDeclareSig7_(return_type, type1, type2, type3, type4, type5, type6, type7), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7) -#define CHOptimizedClassMethod8(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $, name1:name2:name3:name4:name5:name6:name7:name8:, CHDeclareSig8_(return_type, type1, type2, type3, type4, type5, type6, type7, type8), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8) -#define CHOptimizedClassMethod9(optimization, return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8, name9, type9, arg9) \ - CHMethod_ ## optimization ## _(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $, name1:name2:name3:name4:name5:name6:name7:name8:name9:, CHDeclareSig9_(return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8, type9 arg9) - -// Replacement Method Registration -#define CHHook_(class_name, name) \ - $ ## class_name ## _ ## name ## _register() -#define CHHook(count, args...) CHHook ## count(args) -#define CHHook0(class, name) CHHook_(class, name) -#define CHHook1(class, name1) CHHook_(class, name1 ## $) -#define CHHook2(class, name1, name2) CHHook_(class, name1 ## $ ## name2 ## $) -#define CHHook3(class, name1, name2, name3) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $) -#define CHHook4(class, name1, name2, name3, name4) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $) -#define CHHook5(class, name1, name2, name3, name4, name5) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $) -#define CHHook6(class, name1, name2, name3, name4, name5, name6) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $) -#define CHHook7(class, name1, name2, name3, name4, name5, name6, name7) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $) -#define CHHook8(class, name1, name2, name3, name4, name5, name6, name7, name8) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $) -#define CHHook9(class, name1, name2, name3, name4, name5, name6, name7, name8, name9) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $) -#define CHClassHook(count, args...) CHClassHook ## count(args) -#define CHClassHook0(class, name) CHHook_(class, name) -#define CHClassHook1(class, name1) CHHook_(class, name1 ## $) -#define CHClassHook2(class, name1, name2) CHHook_(class, name1 ## $ ## name2 ## $) -#define CHClassHook3(class, name1, name2, name3) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $) -#define CHClassHook4(class, name1, name2, name3, name4) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $) -#define CHClassHook5(class, name1, name2, name3, name4, name5) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $) -#define CHClassHook6(class, name1, name2, name3, name4, name5, name6) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $) -#define CHClassHook7(class, name1, name2, name3, name4, name5, name6, name7) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $) -#define CHClassHook8(class, name1, name2, name3, name4, name5, name6, name7, name8) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $) -#define CHClassHook9(class, name1, name2, name3, name4, name5, name6, name7, name8, name9) CHHook_(class, name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $) - -// Declarative style methods (automatically calls CHHook) -#define CHDeclareMethod_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, args...) \ - static inline void $ ## class_name ## _ ## name ## _register(); \ - __attribute__((constructor)) \ - static inline void $ ## class_name ## _ ## name ## _constructor() { \ - CHLoadLateClass(class_name); \ - $ ## class_name ## _ ## name ## _register(); \ - } \ - CHMethod_(return_type, class_type, class_name, class_val, super_class_val, name, sel, sigdef, supercall, ##args) -#define CHDeclareMethod(count, args...) \ - CHDeclareMethod ## count(args) -#define CHDeclareMethod0(return_type, class_type, name) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name, name, CHDeclareSig0_(return_type), (self, _cmd)) -#define CHDeclareMethod1(return_type, class_type, name1, type1, arg1) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $, name1:, CHDeclareSig1_(return_type, type1), (self, _cmd, arg1), type1 arg1) -#define CHDeclareMethod2(return_type, class_type, name1, type1, arg1, name2, type2, arg2) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $, name1:name2:, CHDeclareSig2_(return_type, type1, type2), (self, _cmd, arg1, arg2), type1 arg1, type2 arg2) -#define CHDeclareMethod3(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $, name1:name2:name3:, CHDeclareSig3_(return_type, type1, type2, type3), (self, _cmd, arg1, arg2, arg3), type1 arg1, type2 arg2, type3 arg3) -#define CHDeclareMethod4(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $, name1:name2:name3:name4:, CHDeclareSig4_(return_type, type1, type2, type3, type4), (self, _cmd, arg1, arg2, arg3, arg4), type1 arg1, type2 arg2, type3 arg3, type4 arg4) -#define CHDeclareMethod5(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## arg5 ## $, name1:name2:name3:name4:name5:, CHDeclareSig5_(return_type, type1, type2, type3, type4, type5), (self, _cmd, arg1, arg2, arg3, arg4, arg5), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) -#define CHDeclareMethod6(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $, name1:name2:name3:name4:name5:name6:, CHDeclareSig6_(return_type, type1, type2, type3, type4, type5, type6), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) -#define CHDeclareMethod7(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $, name1:name2:name3:name4:name5:name6:name7:, CHDeclareSig7_(return_type, type1, type2, type3, type4, type5, type6, type7), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7) -#define CHDeclareMethod8(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $, name1:name2:name3:name4:name5:name6:name7:name8:, CHDeclareSig8_(return_type, type1, type2, type3, type4, type5, type6, type7, type8), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8) -#define CHDeclareMethod9(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8, name9, type9, arg9) \ - CHDeclareMethod_(return_type, class_type *, class_type, CHClass(class_type), CHSuperClass(class_type), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $, name1:name2:name3:name4:name5:name6:name7:name8:name9:, CHDeclareSig9_(return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8, type9 arg9) -#define CHDeclareClassMethod(count, args...) \ - CHDeclareClassMethod ## count(args) -#define CHDeclareClassMethod0(return_type, class_type, name) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name, name, CHDeclareSig0_(return_type), (self, _cmd)) -#define CHDeclareClassMethod1(return_type, class_type, name1, type1, arg1) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $, name1:, CHDeclareSig1_(return_type, type1), (self, _cmd, arg1), type1 arg1) -#define CHDeclareClassMethod2(return_type, class_type, name1, type1, arg1, name2, type2, arg2) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $, name1:name2:, CHDeclareSig2_(return_type, type1, type2), (self, _cmd, arg1, arg2), type1 arg1, type2 arg2) -#define CHDeclareClassMethod3(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $, name1:name2:name3:, CHDeclareSig3_(return_type, type1, type2, type3), (self, _cmd, arg1, arg2, arg3), type1 arg1, type2 arg2, type3 arg3) -#define CHDeclareClassMethod4(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $, name1:name2:name3:name4:, CHDeclareSig4_(return_type, type1, type2, type3, type4), (self, _cmd, arg1, arg2, arg3, arg4), type1 arg1, type2 arg2, type3 arg3, type4 arg4) -#define CHDeclareClassMethod5(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $, name1:name2:name3:name4:name5:, CHDeclareSig5_(return_type, type1, type2, type3, type4, type5), (self, _cmd, arg1, arg2, arg3, arg4, arg5), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) -#define CHDeclareClassMethod6(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $, name1:name2:name3:name4:name5:name6:, CHDeclareSig6_(return_type, type1, type2, type3, type4, type5, type6), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) -#define CHDeclareClassMethod7(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $, name1:name2:name3:name4:name5:name6:name7:, CHDeclareSig7_(return_type, type1, type2, type3, type4, type5, type6, type7), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7) -#define CHDeclareClassMethod8(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $, name1:name2:name3:name4:name5:name6:name7:name8:, CHDeclareSig8_(return_type, type1, type2, type3, type4, type5, type6, type7, type8), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8) -#define CHDeclareClassMethod9(return_type, class_type, name1, type1, arg1, name2, type2, arg2, name3, type3, arg3, name4, type4, arg4, name5, type5, arg5, name6, type6, arg6, name7, type7, arg7, name8, type8, arg8, name9, type9, arg9) \ - CHDeclareMethod_(return_type, id, class_type, CHMetaClass(class_type), object_getClass(CHMetaClass(class_type)), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $, name1:name2:name3:name4:name5:name6:name7:name8:name9:, CHDeclareSig9_(return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9), (self, _cmd, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9), type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6, type7 arg7, type8 arg8, type9 arg9) - -// Calling super class (or the old method as the case may be) -#define CHSuper_(class_type, _cmd, name, args...) \ - $ ## class_type ## _ ## name ## _super(self, _cmd, ##args) -#define CHSuper(count, args...) \ - CHSuper ## count(args) -#define CHSuper0(class_type, name) \ - CHSuper_(class_type, @selector(name), name) -#define CHSuper1(class_type, name1, val1) \ - CHSuper_(class_type, @selector(name1:), name1 ## $, val1) -#define CHSuper2(class_type, name1, val1, name2, val2) \ - CHSuper_(class_type, @selector(name1:name2:), name1 ## $ ## name2 ## $, val1, val2) -#define CHSuper3(class_type, name1, val1, name2, val2, name3, val3) \ - CHSuper_(class_type, @selector(name1:name2:name3:), name1 ## $ ## name2 ## $ ## name3 ## $, val1, val2, val3) -#define CHSuper4(class_type, name1, val1, name2, val2, name3, val3, name4, val4) \ - CHSuper_(class_type, @selector(name1:name2:name3:name4:), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $, val1, val2, val3, val4) -#define CHSuper5(class_type, name1, val1, name2, val2, name3, val3, name4, val4, name5, val5) \ - CHSuper_(class_type, @selector(name1:name2:name3:name4:name5:), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $, val1, val2, val3, val4, val5) -#define CHSuper6(class_type, name1, val1, name2, val2, name3, val3, name4, val4, name5, val5, name6, val6) \ - CHSuper_(class_type, @selector(name1:name2:name3:name4:name5:name6:), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $, val1, val2, val3, val4, val5, val6) -#define CHSuper7(class_type, name1, val1, name2, val2, name3, val3, name4, val4, name5, val5, name6, val6, name7, val7) \ - CHSuper_(class_type, @selector(name1:name2:name3:name4:name5:name6:name7:), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $, val1, val2, val3, val4, val5, val6, val7) -#define CHSuper8(class_type, name1, val1, name2, val2, name3, val3, name4, val4, name5, val5, name6, val6, name7, val7, name8, val8) \ - CHSuper_(class_type, @selector(name1:name2:name3:name4:name5:name6:name7:name8:), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $, val1, val2, val3, val4, val5, val6, val7, val8) -#define CHSuper9(class_type, name1, val1, name2, val2, name3, val3, name4, val4, name5, val5, name6, val6, name7, val7, name8, val8, name9, val9) \ - CHSuper_(class_type, @selector(name1:name2:name3:name4:name5:name6:name7:name8:name9:), name1 ## $ ## name2 ## $ ## name3 ## $ ## name4 ## $ ## name5 ## $ ## name6 ## $ ## name7 ## $ ## name8 ## $ ## name9 ## $, val1, val2, val3, val4, val5, val6, val7, val8, val9) - -// Create Class at Runtime (useful for creating subclasses of classes that can't be linked) -#define CHRegisterClass(name, superName) for (int _tmp = ({ CHClass(name) = objc_allocateClassPair(CHClass(superName), #name, 0); CHMetaClass(name) = object_getClass(CHClass(name)); CHSuperClass(name) = class_getSuperclass(CHClass(name)); 1; }); _tmp; _tmp = ({ objc_registerClassPair(CHClass(name)), 0; })) -#define CHAlignmentForSize_(size) ({ \ - size_t s = size; \ - __builtin_constant_p(s) ? ( \ - (s) & (1 << 31) ? 31 : \ - (s) & (1 << 30) ? 30 : \ - (s) & (1 << 29) ? 29 : \ - (s) & (1 << 28) ? 28 : \ - (s) & (1 << 27) ? 27 : \ - (s) & (1 << 26) ? 26 : \ - (s) & (1 << 25) ? 25 : \ - (s) & (1 << 24) ? 24 : \ - (s) & (1 << 23) ? 23 : \ - (s) & (1 << 22) ? 22 : \ - (s) & (1 << 21) ? 21 : \ - (s) & (1 << 20) ? 20 : \ - (s) & (1 << 19) ? 19 : \ - (s) & (1 << 18) ? 18 : \ - (s) & (1 << 17) ? 17 : \ - (s) & (1 << 16) ? 16 : \ - (s) & (1 << 15) ? 15 : \ - (s) & (1 << 14) ? 14 : \ - (s) & (1 << 13) ? 13 : \ - (s) & (1 << 12) ? 12 : \ - (s) & (1 << 11) ? 11 : \ - (s) & (1 << 10) ? 10 : \ - (s) & (1 << 9) ? 9 : \ - (s) & (1 << 8) ? 8 : \ - (s) & (1 << 7) ? 7 : \ - (s) & (1 << 6) ? 6 : \ - (s) & (1 << 5) ? 5 : \ - (s) & (1 << 4) ? 4 : \ - (s) & (1 << 3) ? 3 : \ - (s) & (1 << 2) ? 2 : \ - (s) & (1 << 1) ? 1 : \ - (s) & (1 << 0) ? 0 : \ - 0 \ - ) : (uint32_t)log2f(s); \ -}) -#define CHAddIvar(targetClass, name, type) \ - class_addIvar(targetClass, #name, sizeof(type), CHAlignmentForSize_(sizeof(type)), @encode(type)) - -// Retrieve reference to an Ivar value (can read and assign) -__attribute__((unused)) CHInline -static void *CHIvar_(id object, const char *name) -{ - Ivar ivar = class_getInstanceVariable(object_getClass(object), name); - if (ivar) -#ifdef CHHasARC - return (void *)&((char *)(__bridge void *)object)[ivar_getOffset(ivar)]; -#else - return (void *)&((char *)object)[ivar_getOffset(ivar)]; -#endif - return NULL; -} -#define CHIvarRef(object, name, type) \ - ((type *)CHIvar_(object, #name)) -#define CHIvar(object, name, type) \ - (*CHIvarRef(object, name, type)) - // Warning: Dereferences NULL if object is nil or name isn't found. To avoid this save CHIvarRef(...) and test if != NULL - -#define CHDeclareProperty(class, name) static const char k ## class ## _ ## name = '\0'; -#define CHPropertyGetValue(class, name) objc_getAssociatedObject(self, &k ## class ## _ ## name ) -#define CHPropertySetValue(class, name, value, policy) objc_setAssociatedObject(self, &k ## class ## _ ## name , value, policy) - -#define CHPropertyGetter(class, getter, type) CHOptimizedMethod0(new, type, class, getter) -#define CHPropertySetter(class, setter, type, value) CHOptimizedMethod1(new, void, class, setter, type, value) - -// Obj-C dynamic property declaration (objects) -#define CHProperty(class, type, getter, setter, policy) \ - CHDeclareProperty(class, getter) \ - CHPropertyGetter(class, getter, type) { \ - return CHPropertyGetValue(class, getter); \ - } \ - CHPropertySetter(class, setter, type, getter) { \ - CHPropertySetValue(class, getter, getter, policy); \ - } -#define CHPropertyRetain(class, type, getter, setter) CHProperty(class, type, getter, setter, OBJC_ASSOCIATION_RETAIN) -#define CHPropertyRetainNonatomic(class, type, getter, setter) CHProperty(class, type, getter, setter, OBJC_ASSOCIATION_RETAIN_NONATOMIC) -#define CHPropertyCopy(class, type, getter, setter) CHProperty(class, type, getter, setter, OBJC_ASSOCIATION_COPY) -#define CHPropertyCopyNonatomic(class, type, getter, setter) CHProperty(class, type, getter, setter, OBJC_ASSOCIATION_COPY_NONATOMIC) -#define CHPropertyAssign(class, type, getter, setter) CHProperty(class, type, getter, setter, OBJC_ASSOCIATION_ASSIGN) - -#define CHPrimitivePropertyGetValue(class, name, type, val, default) \ - type val = default; \ - do { \ - NSNumber * objVal = CHPropertyGetValue(class, name); \ - [objVal getValue:& val ]; \ - } while(0) -#define CHPrimitivePropertySetValue(class, name, type, val) \ - do { \ - NSValue *objVal = [NSValue value:& val withObjCType:@encode( type )]; \ - CHPropertySetValue(class, name, objVal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); \ - } while(0) - -// Primitive property equivalent (ie. BOOL, int, structs) -#define CHPrimitiveProperty(class, type, getter, setter, default) \ - CHDeclareProperty(class, getter) \ - CHOptimizedMethod0(new, type, class, getter) { \ - CHPrimitivePropertyGetValue( class , getter , type , val , default ); \ - return val; \ - } \ - CHOptimizedMethod1(new, void, class, setter, type, getter) { \ - CHPrimitivePropertySetValue( class , getter, type , getter ); \ - } - -#define CHHookProperty(class, getter, setter) \ - do { \ - CHHook0(class, getter); \ - CHHook1(class, setter); \ - } while(0) - -#ifndef CHHasARC -// Scope Autorelease -__attribute__((unused)) CHInline -static void CHScopeReleased(id *sro) -{ - [*sro release]; -} -#define CHScopeReleased \ - __attribute__((cleanup(CHScopeReleased))) - -#define CHAutoreleasePoolForScope() \ - NSAutoreleasePool *CHAutoreleasePoolForScope __attribute__((unused)) CHScopeReleased = [[NSAutoreleasePool alloc] init] -#endif - -// Build Assertion -#define CHBuildAssert(condition) \ - ((void)sizeof(char[1 - 2*!!(condition)])) - -// Profiling -#ifdef CHEnableProfiling - #import - struct CHProfileData - { - NSString *message; - uint64_t startTime; - }; - __attribute__((unused)) CHInline - static void CHProfileCalculateDurationAndLog_(struct CHProfileData *profileData) - { - uint64_t duration = mach_absolute_time() - profileData->startTime; - mach_timebase_info_data_t info; - mach_timebase_info(&info); - duration = (duration * info.numer) / info.denom; - CHLog(@"Profile time: %lldns; %@", duration, profileData->message); - } - #define CHProfileScopeWithString(string) \ - struct CHProfileData _profileData __attribute__((cleanup(CHProfileCalculateDurationAndLog_))) = ({ struct CHProfileData _tmp; _tmp.message = (string); _tmp.startTime = mach_absolute_time(); _tmp; }) -#else - #define CHProfileScopeWithString(string) \ - CHNothing() -#endif -#define CHProfileScopeWithFormat(args...) \ - CHProfileScopeWithString(([NSString stringWithFormat:args])) -#define CHProfileScope() \ - CHProfileScopeWithFormat(@CHStringify(__LINE__) " in %s", __FUNCTION__)